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

增加Sharding分表,并且分表配置从nacos读取

上级 16ac5365
...@@ -93,6 +93,13 @@ ...@@ -93,6 +93,13 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<!-- 排除低版本 snakeyaml -->
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
...@@ -126,7 +133,7 @@ ...@@ -126,7 +133,7 @@
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.kyexpress</groupId> <groupId>com.kyexpress</groupId>
<artifactId>kye-openapi-sdk</artifactId> <artifactId>kye-openapi-sdk</artifactId>
</dependency> </dependency>
...@@ -140,6 +147,24 @@ ...@@ -140,6 +147,24 @@
<groupId>com.taobao</groupId> <groupId>com.taobao</groupId>
<artifactId>taobao-sdk-java</artifactId> <artifactId>taobao-sdk-java</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-sharding-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<!-- 显式指定高版本 snakeyaml(确保与 ShardingSphere 兼容) -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
...@@ -156,7 +181,7 @@ ...@@ -156,7 +181,7 @@
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<excludes> <excludes>
<exclude> <exclude>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
......
package com.sfa.job.config;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import java.time.LocalDateTime;
import java.util.*;
/**
* ShardingSphere 5.4.1 按 pay_time 年份分表算法
*/
public class PayTimeYearShardingAlgorithm implements StandardShardingAlgorithm<LocalDateTime> {
/**
* 精确分片(处理 = 条件)
* 例:pay_time = '2023-05-01 10:00:00' → 路由到 t_order_2023
*/
/**
* 范围分片(处理 >、<、BETWEEN 等条件)
* 例:pay_time BETWEEN '2023-01-01' AND '2024-12-31' → 路由到 t_order_2023、t_order_2024
*/
// 初始化方法(可留空)
@Override
public void init(Properties props) {
StandardShardingAlgorithm.super.init(props);
}
// 获取分片算法类型(自定义名称)
@Override
public String getType() {
return "PAY_TIME_YEAR";
}
@Override
public Collection<Object> getTypeAliases() {
return StandardShardingAlgorithm.super.getTypeAliases();
}
@Override
public boolean isDefault() {
return StandardShardingAlgorithm.super.isDefault();
}
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<LocalDateTime> preciseShardingValue) {
// 获取精确查询的时间值
LocalDateTime payTime = preciseShardingValue.getValue();
int year = payTime.getYear();
// 生成目标表名(逻辑表名_年份)
String targetTable = preciseShardingValue.getLogicTableName() + "_" + year;
// 校验表是否存在
if (collection.contains(targetTable)) {
return targetTable;
}
throw new IllegalArgumentException("未找到匹配的表:" + targetTable);
}
@Override
public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<LocalDateTime> shardingValue) {
Set<String> result = new HashSet<>();
// 遍历所有分片条件(通常只有一个)
// for (RangeShardingValue<LocalDateTime> shardingValue : 、) {
String logicTableName = shardingValue.getLogicTableName();
// 获取范围查询的上下限
LocalDateTime lower = shardingValue.getValueRange().lowerEndpoint();
LocalDateTime upper = shardingValue.getValueRange().upperEndpoint();
int startYear = lower.getYear();
int endYear = upper.getYear();
// 生成所有符合条件的表名
for (int year = startYear; year <= endYear; year++) {
String targetTable = logicTableName + "_" + year;
if (collection.contains(targetTable)) {
result.add(targetTable);
}
}
// }
return result;
}
@Override
public Optional<String> getAlgorithmStructure(String dataNodePrefix, String shardingColumn) {
return StandardShardingAlgorithm.super.getAlgorithmStructure(dataNodePrefix, shardingColumn);
}
}
package com.sfa.job.config;
import com.alibaba.cloud.nacos.NacosConfigAutoConfiguration;
import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.sfa.job.util.NacosConfigiServiceUtils;
import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
import org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DataSourceProperties.class})
@ConditionalOnClass(NacosConfigAutoConfiguration.class)
public class ShardingConfiguration {
@Resource
private DynamicDataSourceProperties properties;
@Resource
private NacosConfigProperties nacosConfigProperties;
@Value("${spring.shardindsphereUrl}")
private String shardingsphereUrl;
@Bean
@Primary
public DynamicDataSourceProvider dynamicDataSourceProvider() {
NacosConfigiServiceUtils.init(nacosConfigProperties);
Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
return new AbstractDataSourceProvider() {
@Override
public Map<String, DataSource> loadDataSources() {
Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
//SPI机制
Collection<ShardingSphereURLProvider> provider = ShardingSphereServiceLoader.getServiceInstances(ShardingSphereURLProvider.class);
provider.forEach(item -> {
if (item.accept(shardingsphereUrl)) {
try {
DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(item.getContent(shardingsphereUrl,"jdbc:shardingsphere:"));
dataSourceMap.put("sharding", dataSource);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
return dataSourceMap;
}
};
}
}
package com.sfa.job.controller.order;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.IWdtQimenOrderPayTimeSyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
* @author : liqiulin
* @date : 2025-07-08 13
* @describe : 订单 - 发货单物流查询
*/
@RestController
@RequestMapping("/order/qimen/")
public class WdtQimenOrderPayTimeController {
@Autowired
private IWdtQimenOrderPayTimeSyncService orderQimenSyncService;
@GetMapping("/syncByPayTime")
public Object sync(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime,
@RequestParam(value = "pageSize", required = false, defaultValue = "200") Long pageSize
) {
SyncOrderDetailDto syncOrderDetailDto = orderQimenSyncService.syncWdtQimenOrder(startTime, endTime, 1, pageSize);
return syncOrderDetailDto;
}
@GetMapping("/payTime/syncByTradeNo")
public Object syncByTradeNo(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime,
@RequestParam(value = "tradeNo", required = false) String tradeNo,
@RequestParam(value = "pageNo", required = false, defaultValue = "1") Long pageNo,
@RequestParam(value = "pageSize", required = false, defaultValue = "200") Long pageSize
) {
SyncOrderDetailDto syncOrderDetailDto = orderQimenSyncService.syncWdtQimenOrderByTradeNo(startTime, endTime, 1, tradeNo, pageNo, pageSize);
return syncOrderDetailDto;
}
@GetMapping("/payTime/test")
public Object syncByPayTime(@RequestParam(value = "year", required = false) Integer year) {
SyncOrderDetailDto syncOrderDetailDto = orderQimenSyncService.test(year);
return syncOrderDetailDto;
}
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtQimenOrderDetailPayTime;
import java.util.List;
public interface WdtQimenOrderDetailPayTimeDao {
void saveOrUpdateBatch(List<WdtQimenOrderDetailPayTime> mergeList);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import java.util.List;
public interface WdtQimenOrderPayTimeDao {
void saveOrUpdateBatch(List<WdtQimenOrderPayTime> mergeList);
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtQimenOrderDetailPayTimeDao;
import com.sfa.job.domain.order.entity.WdtQimenOrderDetailPayTime;
import com.sfa.job.domain.order.mapper.WdtQimenOrderDetailPayTimeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("sharding")
@Repository
public class WdtQimenOrderDetailPayTimeDaoImpl implements WdtQimenOrderDetailPayTimeDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtQimenOrderDetailPayTimeMapper wdtQimenOrderDetailMapper;
@Override
public void saveOrUpdateBatch(List<WdtQimenOrderDetailPayTime> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtQimenOrderDetailPayTime> batchLists = mergeList.subList(i, toIndex);
wdtQimenOrderDetailMapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtQimenOrderPayTimeDao;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import com.sfa.job.domain.order.mapper.WdtQimenOrderPayTimeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("sharding")
@Repository
public class WdtQimenOrderPayTimeDaoImpl implements WdtQimenOrderPayTimeDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtQimenOrderPayTimeMapper wdtQimenOrderPayTimeMapper;
@DS("sharding")
@Override
public void saveOrUpdateBatch(List<WdtQimenOrderPayTime> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtQimenOrderPayTime> batchLists = mergeList.subList(i, toIndex);
wdtQimenOrderPayTimeMapper.saveOrUpdateBatch(batchLists);
}
}
}
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 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
* order_pay_time 字段分表
*/
@TableName(value = "wdt_qimen_order_detail_pay_time")
@Data
public class WdtQimenOrderDetailPayTime 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;
// 订单支付时间,DateTime格式,取自原始订单支付时间
private Date orderPayTime;
// 货品简称
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;
// 系列
private String series;
// 实际成本*num 实际总成本
private BigDecimal sumActualCost;
// 标准成本*num 标准总成本
private BigDecimal sumStandardCost;
/**
* 是否删除标志0未删除1已删除
*/
private String delFlag;
public String getFenxiaoId(WdtQimenOrderPayTime 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(WdtQimenOrderPayTime order, Long tradeId) {
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(order.getFenxiaoNick())) {
String id = extractDistributorName(order.getFenxiaoNick());
return id;
}
return "";
}
public String getFenxiaoNick(WdtQimenOrder 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 void setZbjName(String fenxiaoName, String remark, WdtQimenOrderDetailPayTime sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjName())) {
this.zbjName = sameDetail.getZbjName();
return;
}
if (ObjectUtils.isNotEmpty(fenxiaoName)) {
this.zbjName = fenxiaoName;
return;
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播")) {
this.zbjName = extractByRegex(remark, "“【直播】”([^;;]*)");
this.fenxiaoName = this.zbjName;
}
}
public void setZbjId(String remark, WdtQimenOrderDetailPayTime sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjId())) {
this.zbjId = sameDetail.getZbjId();
return;
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播间id")) {
this.zbjId = extractByRegex(remark, "直播间id:([^;;]\\d+)");
}
}
/**
* 根据分销商和remark备注信息获取主播Id
*
* @param fenxiaoId
* @param remark
* @param sameDetail
* @return
*/
public void setZbjZbId(String fenxiaoId, String remark, WdtQimenOrderDetailPayTime sameDetail) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
this.zbjZbId = fenxiaoId;
return;
}
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjZbId())) {
this.zbjZbId = sameDetail.getZbjZbId();
return;
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("主播id")) {
this.zbjZbId = extractByRegex(remark, "主播id:([^;;]\\d+)");
this.fenxiaoId = this.zbjZbId;
return;
}
}
public void setZbjSaleType(String remark, WdtQimenOrderDetailPayTime sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjSaleType())) {
this.zbjSaleType = sameDetail.getZbjSaleType();
return;
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("销售类型:")) {
this.zbjSaleType = extractByRegex(remark, "销售类型:([^;;]*);");
}
}
public void setZbjQdType(String fenxiaoId, String zbjZbId, Map<String, String> baseZbjType) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
zbjZbId = fenxiaoId;
}
this.zbjQdType = baseZbjType.get(zbjZbId);
if (ObjectUtils.isNotEmpty(zbjZbId) && ObjectUtils.isEmpty(this.zbjQdType)) {
this.zbjQdType = baseZbjType.get("其他分销名称");
}
}
}
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.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
* 财务-订单数据实体类,对应数据库中的 finance_order 表
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "wdt_qimen_order_pay_time")
public class WdtQimenOrderPayTime {
/**
* 订单唯一键
*/
@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 LocalDateTime 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;
/**
* 递交时间 例如:2020 - 10 - 19 00:00:00
*/
private Date createdDate;
/**
* 审核时间
*/
private String checkTime;
/**
* 证件类别
*/
private Integer idCardType;
/**
* 店铺编号
*/
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;
/**
* 是否删除标志 0 未删除 1 已删除
*/
private Integer delFlag;
/**
* 创建者
*/
private String createBy;
/**
* 创建人 UserID
*/
private Long createUserId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 修改人 UserID
*/
private Long updateUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 采集批次
*/
private String batchNo;
/**
* 本批次采集开始时间,例如:2020 - 10 - 19 00:00:00
*/
private Date startTime;
/**
* 本批批次采集结束时间,例如:2020 - 10 - 19 00:00:00
*/
private Date endTime;
/**
* 同步类型 ,接口为 1 手动同步,0 xxljob 自动同步
*/
private Integer syncType;
// 订单明细
@TableField(exist = false)
private List<WdtQimenOrderDetailPayTime> detailList;
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtQimenOrderDetailPayTime;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface WdtQimenOrderDetailPayTimeMapper extends BaseMapper<WdtQimenOrderDetailPayTime> {
void saveOrUpdateBatch(@Param(value = "list") List<WdtQimenOrderDetailPayTime> mergeList);
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface WdtQimenOrderPayTimeMapper extends BaseMapper<WdtQimenOrderPayTime> {
void saveOrUpdateBatch(List<WdtQimenOrderPayTime> batchLists);
}
package com.sfa.job.pojo.order.response;
import lombok.Data;
@Data
public class WdtQimenOrderPayTimeBodyDto {
private static final long serialVersionUID = 4632382792982436956L;
private WdtQimenOrderPayTimeResponseDto response;
private String message;
private Integer status;
}
package com.sfa.job.pojo.order.response;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import lombok.Data;
import java.util.List;
@Data
public class WdtQimenOrderPayTimeDto {
private static final long serialVersionUID = 4632382792982436956L;
private List<WdtQimenOrderPayTime> order;
private Integer totalCount;
}
package com.sfa.job.pojo.order.response;
import lombok.Data;
@Data
public class WdtQimenOrderPayTimeResponseDto {
private static final long serialVersionUID = 4632382792982436956L;
private WdtQimenOrderPayTimeDto data;
private String message;
private Integer status;
}
package com.sfa.job.service.order;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import java.util.Date;
public interface IWdtQimenOrderPayTimeSyncService {
SyncOrderDetailDto syncWdtQimenOrder(Date startTime, Date endTime, Integer syncType, Long pageSize);
SyncOrderDetailDto syncWdtQimenOrderByTradeNo(Date startTime, Date endTime, Integer syncType, String tradeNo, Long pageNo, Long pageSize);
SyncOrderDetailDto test(int year);
}
package com.sfa.job.service.order.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.qimencloud.api.DefaultQimenCloudClient;
import com.qimencloud.api.QimenCloudClient;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.DateUtils;
import com.sfa.job.config.WdtQimenConfig;
import com.sfa.job.domain.order.dao.*;
import com.sfa.job.domain.order.entity.FinanceBaseProduct;
import com.sfa.job.domain.order.entity.WdtQimenOrderDetailPayTime;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import com.sfa.job.pojo.order.request.WdtSalesTradeQueryQueryWithDetailVo;
import com.sfa.job.pojo.order.response.*;
import com.sfa.job.pojo.response.CollectOrderLogDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.IWdtQimenOrderPayTimeSyncService;
import com.sfa.job.util.WdtQimenUtil;
import com.taobao.api.ApiException;
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("sharding")
@Slf4j
@Service
public class WdtQimenOrderPayTimeSyncServiceImpl implements IWdtQimenOrderPayTimeSyncService {
@Autowired
WdtQimenOrderDetailPayTimeDao orderDetailDao;
@Autowired
WdtQimenOrderPayTimeDao orderDao;
@Autowired
FinianceBaseProductDao baseProductDao;
@Autowired
FinanceBaseZbjTypeDao baseZbjTypeDao;
@Autowired
CollectOrderLogDao orderLogInfoDao;
@Autowired
CollectErrorLogDao errorInfoDao;
@Autowired
IProductDao productDao;
@Autowired
WdtQimenConfig wdtQimenConfig;
@Transactional(rollbackFor = Exception.class)
@Override
public SyncOrderDetailDto syncWdtQimenOrderByTradeNo(Date startTime, Date endTime, Integer syncType, String tradeNo, Long pageNo, Long pageSize) {
WdtSalesTradeQueryQueryWithDetailVo request = new WdtSalesTradeQueryQueryWithDetailVo();
String method = request.getApiMethodName();
String serverUrl = wdtQimenConfig.getServerUrl();
String appKey = wdtQimenConfig.getAppKey();
String appSecret = wdtQimenConfig.getAppSecret();
String wdtAppSecret = wdtQimenConfig.getWdtAppSecret();
String wdtSalt = wdtAppSecret.split(":")[1];
String wdtSecret = wdtAppSecret.split(":")[0];
String wdtAppKey = wdtQimenConfig.getWdtAppKey();
String targetAppSecret = wdtQimenConfig.getTargetAppSecret();
String wdtSid = wdtQimenConfig.getWdtSid();
Long totalPage = 1L;
Integer totalCount = 1;
// 查询只到数据查询完毕
QimenCloudClient client = new DefaultQimenCloudClient(serverUrl, appKey, appSecret);
WdtSalesTradeQueryQueryWithDetailVo.Params params = new WdtSalesTradeQueryQueryWithDetailVo.Params();
params.setStartTime(DateUtil.formatDateTime(startTime));
params.setEndime(DateUtil.formatDateTime(endTime));
// 旺店通的页码从0开始,奇门从1开始 时间类型 1:修改时间 2:付款时间 默认1
params.setTimeType(2);
params.setTradeNo(tradeNo);
request.setParams(params);
WdtSalesTradeQueryQueryWithDetailVo.Pager pager = new WdtSalesTradeQueryQueryWithDetailVo.Pager();
pager.setPageNo(pageNo);
pager.setPageSize(pageSize);
request.setPager(pager);
// 查询数据
String dateTime = DateUtil.formatDateTime(new Date());
request.setDatetime(dateTime);
request.putOtherTextParam("wdt3_customer_id", wdtSid);
request.setTargetAppKey(targetAppSecret);
request.setWdtAppkey(wdtAppKey);
request.setWdtSalt(wdtSalt);
request.setWdtSign(WdtQimenUtil.getQimenCustomWdtSign(request, wdtSecret));
WdtSalesTradeQueryQueryWithDetailDto response = null;
try {
response = client.execute(request);
log.info(response.getBody());
} catch (ApiException e) {
throw new RuntimeException(e);
}
if (ObjectUtils.isNotEmpty(response) && response.getFlag().equals("failure")) {
log.error("奇门加载数据异常:" + response.getMessage() + response.getSubMessage() + URLUtil.decode(response.getRequestUrl()));
throw new ServiceException("奇门加载数据异常:" + response.getMessage() + response.getSubMessage());
}
// 转换返回的json字符串结果
String body = response.getBody();
WdtQimenBodyDto wdtQimenBodyDto = JSONUtil.toBean(body, WdtQimenBodyDto.class);
WdtQimenResponseDto wdtQimenResponseDto = wdtQimenBodyDto.getResponse();
SyncOrderDetailDto detailDto = new SyncOrderDetailDto();
detailDto.setMethod(method);
return detailDto;
}
/**
* 多线程调用此方法
*
* @param startTime
* @param endTime
*/
@Transactional(rollbackFor = Exception.class)
@Override
public SyncOrderDetailDto syncWdtQimenOrder(Date startTime, Date endTime, Integer syncType, Long pageSize) {
SyncOrderDetailDto detailDto = new SyncOrderDetailDto();
String batchNo = syncType + DateUtils.dateTimeNow() + Thread.currentThread().getId();
WdtSalesTradeQueryQueryWithDetailVo request = new WdtSalesTradeQueryQueryWithDetailVo();
String method = request.getApiMethodName();
List<WdtQimenOrderPayTime> orderResult = new ArrayList<>();
try {
detailDto.setBatchNo(batchNo);
detailDto.setStartTime(startTime);
detailDto.setEndTime(endTime);
detailDto.setPageNo(-1);
CollectOrderLogDto collectOrderLog = orderLogInfoDao.selectOrderSyncLatest(syncType, method);
// 调用新方法设置时间范围
detailDto.setupTimeRange(60, collectOrderLog);
startTime = detailDto.getStartTime();
endTime = detailDto.getEndTime();
// 调用查询旺店通接口api 获取最新日期前的2小时
Date currentLatest = DateUtils.addHours(new Date(), -2);
if (currentLatest.compareTo(startTime) < 0) {
detailDto.setMessage(String.format("开始时间%s不能大于当前时间%s", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(currentLatest)));
log.debug(String.format("开始时间%s不能大于当前时间%s", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(currentLatest)));
return detailDto;
}
if (!detailDto.validateStartTime()) {
return detailDto;
}
log.info("查询订单参数:开始时间{},结束时间{},当前页:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), detailDto.getPageNo());
String serverUrl = wdtQimenConfig.getServerUrl();
String appKey = wdtQimenConfig.getAppKey();
String appSecret = wdtQimenConfig.getAppSecret();
String wdtAppSecret = wdtQimenConfig.getWdtAppSecret();
String wdtSalt = wdtAppSecret.split(":")[1];
String wdtSecret = wdtAppSecret.split(":")[0];
String wdtAppKey = wdtQimenConfig.getWdtAppKey();
String targetAppSecret = wdtQimenConfig.getTargetAppSecret();
String wdtSid = wdtQimenConfig.getWdtSid();
Long pageNo = 1L;
Long totalPage = 1L;
Integer totalCount = 1;
do {
// 查询只到数据查询完毕
QimenCloudClient client = new DefaultQimenCloudClient(serverUrl, appKey, appSecret);
WdtSalesTradeQueryQueryWithDetailVo.Params params = new WdtSalesTradeQueryQueryWithDetailVo.Params();
params.setStartTime(DateUtil.formatDateTime(startTime));
params.setEndime(DateUtil.formatDateTime(endTime));
// 旺店通的页码从0开始,奇门从1开始
params.setTimeType(1);
request.setParams(params);
WdtSalesTradeQueryQueryWithDetailVo.Pager pager = new WdtSalesTradeQueryQueryWithDetailVo.Pager();
pager.setPageNo(pageNo);
pager.setPageSize(pageSize);
request.setPager(pager);
// 查询数据
String dateTime = DateUtil.formatDateTime(new Date());
request.setDatetime(dateTime);
request.putOtherTextParam("wdt3_customer_id", wdtSid);
request.setTargetAppKey(targetAppSecret);
request.setWdtAppkey(wdtAppKey);
request.setWdtSalt(wdtSalt);
request.setWdtSign(WdtQimenUtil.getQimenCustomWdtSign(request, wdtSecret));
WdtSalesTradeQueryQueryWithDetailDto response = client.execute(request);
if (ObjectUtils.isNotEmpty(response) && response.getFlag().equals("failure")) {
log.error("奇门加载数据异常:" + response.getMessage() + response.getSubMessage() + URLUtil.decode(response.getRequestUrl()));
throw new ServiceException("奇门加载数据异常:" + response.getMessage() + response.getSubMessage());
}
// 转换返回的json字符串结果
String body = response.getBody();
WdtQimenOrderPayTimeBodyDto wdtQimenBodyDto = JSONUtil.toBean(body, WdtQimenOrderPayTimeBodyDto.class);
WdtQimenOrderPayTimeResponseDto wdtQimenResponseDto = wdtQimenBodyDto.getResponse();
WdtQimenOrderPayTimeDto wdtQimenDataDto = wdtQimenResponseDto.getData();
totalCount = wdtQimenDataDto.getTotalCount();
totalPage = totalCount / pager.getPageSize() + 1;
List<WdtQimenOrderPayTime> orderSubResult = wdtQimenDataDto.getOrder();
if (ObjectUtils.isEmpty(orderSubResult)) {
log.warn("当前查询没有数据,奇门加载数据异常:" + response.getMessage() + response.getSubMessage() + URLUtil.decode(response.getRequestUrl()));
// throw new ServiceException("旺店通没有查询到订单数据");
}
orderResult.addAll(orderSubResult);
pageNo++;
} while (pageNo <= totalPage);
// 基础数据 直播间分类数据+成本、规格、口味
Map<String, FinanceBaseProduct> baseProductMap = baseProductDao.selectBaseProduct();
Map<String, String> baseZbjType = baseZbjTypeDao.selectBaseZbjType();
// 系列
Map<String, String> prodSeriesMap = productDao.selectProdSeries();
// 入库订单表
log.info("开始插入订单数据,数量:{}", orderResult.size());
Date finalStartTime = startTime;
Date finalEndTime = endTime;
orderResult.forEach(order -> {
order.setDelFlag(0);
order.setBatchNo(batchNo);
order.setStartTime(finalStartTime);
order.setEndTime(finalEndTime);
order.setSyncType(syncType);
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
order.setCreatedDate(new Date(Long.valueOf(order.getCreated())));
});
orderDao.saveOrUpdateBatch(orderResult);
List<WdtQimenOrderDetailPayTime> mergeList = new ArrayList<>();
// 用于同一个订单号,来赋值直播间信息
Map<String, WdtQimenOrderDetailPayTime> orderZbjMap = new HashMap<>();
// 入库订单明细表
for (WdtQimenOrderPayTime order : orderResult) {
List<WdtQimenOrderDetailPayTime> orderDetails = order.getDetailList();
for (WdtQimenOrderDetailPayTime orderDetail : orderDetails) {
orderDetail.setSeries(prodSeriesMap.get(orderDetail.getGoodsNo()));
orderDetail.setTradeStatus(order.getTradeStatus());
orderDetail.setShopNo(order.getShopNo());
orderDetail.setShopName(order.getShopName());
orderDetail.setShopRemark(order.getShopRemark());
orderDetail.setReceivable(order.getReceivable());
orderDetail.setReceiverArea(order.getReceiverArea());
orderDetail.setConsignTime(order.getConsignTime());
orderDetail.setTradeTime(order.getTradeTime());
orderDetail.setBatchNo(batchNo);
orderDetail.setTradeNo(order.getTradeNo());
if (ObjectUtils.isEmpty(orderDetail.getPayTime())) {
// orderDetail.setPayTime(order.getPayTime());
}
// orderDetail.setOrderPayTime(order.getPayTime());
// 计算分销信息
orderDetail.setFenxiaoNick(order.getFenxiaoNick());
orderDetail.setFenxiaoId(orderDetail.getFenxiaoId(order, orderDetail.getTradeId()));
orderDetail.setFenxiaoName(orderDetail.getFenxiaoName(order, orderDetail.getTradeId()));
orderDetail.setStartTime(finalStartTime);
orderDetail.setEndTime(finalEndTime);
orderDetail.setSyncType(syncType);
// 如果存在相同的
WdtQimenOrderDetailPayTime sameDetail = orderZbjMap.get(orderDetail.getSrcTid());
orderDetail.setZbjName(orderDetail.getFenxiaoName(), orderDetail.getRemark(), sameDetail);
orderDetail.setZbjId(orderDetail.getRemark(), sameDetail);
orderDetail.setZbjZbId(orderDetail.getFenxiaoId(), orderDetail.getRemark(), sameDetail);
orderDetail.setZbjSaleType(orderDetail.getRemark(), sameDetail);
// 确定分销商类型
orderDetail.setZbjQdType(orderDetail.getFenxiaoId(), orderDetail.getZbjZbId(), baseZbjType);
// 同一个订单id的,设置直播间类型信息也相同
if (ObjectUtils.isNotEmpty(orderDetail.getZbjName())) {
orderZbjMap.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() : "");
// 将退款成功的数据分摊后总价置为0 2025年02月06日16:25:30
if (ObjectUtils.isNotEmpty(orderDetail.getRefundStatus()) && orderDetail.getRefundStatus().equals(5)) {
orderDetail.setShareAmount(new BigDecimal(0));
orderDetail.setActualCost(new BigDecimal(0));
orderDetail.setStandardCost(new BigDecimal(0));
orderDetail.setSumActualCost(new BigDecimal(0));
orderDetail.setSumStandardCost(new BigDecimal(0));
} else {
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.setSumActualCost(orderDetail.getActualCost().multiply(orderDetail.getNum()));
orderDetail.setSumStandardCost(orderDetail.getStandardCost().multiply(orderDetail.getNum()));
}
}
mergeList.addAll(orderDetails);
}
log.info("开始插入订单详情数据,数量:{}", mergeList.size());
// 批量插入
orderDetailDao.saveOrUpdateBatch(mergeList);
String remark = String.format("订单数量:%s,详情数量:%s", orderResult.size(), mergeList.size());
log.info("插入订单和订单详情完成,批次{}开始时间{},结束时间{},订单数量:{},详情数量:{},下一次开始页数:{}", batchNo, DateUtil.formatDateTime(startTime),
DateUtil.formatDateTime(endTime), orderResult.size(), mergeList.size(), detailDto.getPageNo());
detailDto.setDetailInfo(method, remark, syncType, orderResult.size(), mergeList.size(), totalCount, batchNo, endTime, startTime);
orderLogInfoDao.insert(detailDto);
} catch (Exception e) {
detailDto.setCode(HttpStatus.HTTP_INTERNAL_ERROR);
detailDto.setMessage(e.toString());
log.error(e.getMessage(), e);
// 记录错误日志表 collect_error_info
errorInfoDao.insert(detailDto);
}
return detailDto;
}
@Override
public SyncOrderDetailDto test( int year) {
WdtQimenOrderPayTime order = new WdtQimenOrderPayTime();
// 设置基本字段
order.setTradeId(System.currentTimeMillis());
order.setTradeNo("TEST_" + year + "_" + new Random().nextInt(10000));
order.setShopId(1);
order.setShopNo("SHOP001");
order.setPlatformId(11);
order.setShopName("测试店铺");
order.setTradeStatus(10); // 未付款状态
order.setTradeType(1); // 网店销售
// order.setPayTime(LocalDateTimeUtil.now());
order.setCreated(String.valueOf(System.currentTimeMillis()));
order.setCreatedDate(new Date());
order.setDelFlag(0);
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
order.setDeliveryTerm(1);
order.setRefundStatus(1);
order.setFenxiaoType(11);
order.setBadReason(1);
order.setGoodsTypeCount(new BigDecimal(1));
order.setGoodsCount(new BigDecimal(1));
order.setGoodsAmount(new BigDecimal(1));
order.setPostAmount(new BigDecimal(1));
order.setOtherAmount(new BigDecimal(1));
order.setDiscount(new BigDecimal(1));
order.setDiscount(new BigDecimal(1));
order.setReceivable(new BigDecimal(1));
order.setCodAmount(new BigDecimal(1));
order.setExtCodFee(new BigDecimal(1));
order.setGoodsCost(new BigDecimal(1));
order.setPostCost(new BigDecimal(1));
order.setWeight(new BigDecimal(1));
order.setProfit(new BigDecimal(1));
order.setTax(new BigDecimal(1));
order.setTaxRate(new BigDecimal(1));
order.setCommission(new BigDecimal(1));
order.setInvoiceType(1);
order.setTradeFrom(1);
order.setRawGoodsCount(new BigDecimal(1));
order.setRawGoodsTypeCount(1);
order.setCurrency("CNY");
order.setCreated("1");
order.setCreatedDate(new Date());
order.setTradeMask(1);
order.setPackageCost(new BigDecimal(1));
order.setPaid(new BigDecimal(1));
order.setLargeType(1);
order.setGiftMask(1);
order.setOtherCost(new BigDecimal(1));
order.setIsSealed(true);
order.setCustomerType(1);
order.setDelFlag(1);
order.setUpdateTime(new Date());
order.setBatchNo("TEST_" + year);
// 设置不同年份的支付时间,这是分片的关键字段
Calendar calendar = Calendar.getInstance();
calendar.set(year, 0, 1, 0, 0, 0);
order.setPayTime(LocalDateTimeUtil.of(calendar.getTime()));
log.info("插入" + year + "年订单,payTime: " + order.getPayTime());
// 由于是测试环境,这里可能需要特殊处理批量保存
// 注意:实际环境中应该使用业务层方法进行保存
orderDao.saveOrUpdateBatch(java.util.Collections.singletonList(order));
return null;
}
}
package com.sfa.job.spi;
import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.shaded.com.google.common.base.Preconditions;
import com.sfa.common.core.utils.StringUtils;
import com.sfa.job.util.NacosConfigiServiceUtils;
import lombok.SneakyThrows;
import org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider;
import java.nio.charset.StandardCharsets;
public final class ShardingJdbcNacosURLProvider implements ShardingSphereURLProvider {
private static final String CLASSPATH_TYPE = "nacos:";
private static final String URL_PREFIX = "jdbc:shardingsphere:";
@Override
public boolean accept(String url) {
return StringUtils.isNotEmpty(url) && url.contains(CLASSPATH_TYPE);
}
@SneakyThrows
@Override
public byte[] getContent(String url, String urlPrefix) {
String dataId = url.substring(CLASSPATH_TYPE.length() + URL_PREFIX.length());
Preconditions.checkArgument(!dataId.isEmpty(), "Nacos namespace is required in ShardingSphere dataId.");
NacosConfigProperties nacosConfigProperties = NacosConfigiServiceUtils.getNacosConfigProperties();
ConfigService configService = nacosConfigProperties.configServiceInstance();
String content = configService.getConfig(dataId, nacosConfigProperties.getGroup(), nacosConfigProperties.getTimeout());
return content.getBytes(StandardCharsets.UTF_8);
}
}
package com.sfa.job.util;
import com.alibaba.cloud.nacos.NacosConfigProperties;
public class NacosConfigiServiceUtils {
private static NacosConfigProperties nacosConfigProperties;
public static void init(NacosConfigProperties properties){
nacosConfigProperties = properties;
}
public static NacosConfigProperties getNacosConfigProperties() {
return nacosConfigProperties;
}
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfa.job.domain.order.mapper.WdtQimenOrderDetailPayTimeMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
insert into wdt_qimen_order_detail_pay_time( <include refid="Base_Column_List"></include>)
values
<foreach collection="list" item="item" separator=",">
(
#{item.tradeId}, #{item.recId}, #{item.platformId}, #{item.srcOid}, #{item.srcTid},
#{item.payStatus}, #{item.refundStatus}, #{item.platformStatus}, #{item.deliveryTerm},
#{item.num}, #{item.price}, #{item.refundNum}, #{item.orderPrice}, #{item.sharePrice},
#{item.adjust}, #{item.discount}, #{item.shareAmount}, #{item.taxRate}, #{item.goodsName},
#{item.goodsNo}, #{item.specName}, #{item.specNo}, #{item.specCode}, #{item.suiteNo},
#{item.suiteName}, #{item.suiteNum}, #{item.suiteAmount}, #{item.suiteDiscount},
#{item.apiGoodsName}, #{item.apiSpecName}, #{item.apiGoodsId}, #{item.apiSpecId},
#{item.goodsId}, #{item.specId}, #{item.commission}, #{item.goodsType}, #{item.fromMask},
#{item.remark}, #{item.modified}, #{item.created}, #{item.prop1}, #{item.prop2},
#{item.weight}, #{item.imgUrl}, #{item.actualNum}, #{item.barcode}, #{item.paid},
#{item.suiteId}, #{item.bindOid}, #{item.printSuiteMode}, #{item.flag}, #{item.stockState},
#{item.isConsigned}, #{item.isReceived}, #{item.cid}, #{item.modifiedDate}, #{item.createdDate},
#{item.sharePostPrice}, #{item.invoiceContent}, #{item.payTime}, #{item.shortName},
#{item.fenxiaoNick}, #{item.fenxiaoId}, #{item.fenxiaoName}, #{item.batchNo},
#{item.startTime}, #{item.endTime}, #{item.tradeNo}, #{item.shopNo}, #{item.shopName},
#{item.shopRemark}, #{item.tradeStatus}, #{item.tradeTime}, #{item.consignTime},
#{item.receiverArea}, #{item.zbjName}, #{item.zbjId}, #{item.zbjZbId}, #{item.zbjSaleType},
#{item.zbjQdType}, #{item.receivable}, #{item.specNameErp}, #{item.flavorErp},
#{item.syncType}, #{item.actualCost}, #{item.standardCost}, #{item.sumActualCost}, #{item.sumStandardCost},
#{item.series}, #{item.delFlag}
)
</foreach>
ON DUPLICATE KEY UPDATE
trade_id = VALUES(trade_id),
platform_id = VALUES(platform_id),
src_oid = VALUES(src_oid),
src_tid = VALUES(src_tid),
pay_status = VALUES(pay_status),
refund_status = VALUES(refund_status),
platform_status = VALUES(platform_status),
delivery_term = VALUES(delivery_term),
num = VALUES(num),
price = VALUES(price),
refund_num = VALUES(refund_num),
order_price = VALUES(order_price),
share_price = VALUES(share_price),
adjust = VALUES(adjust),
discount = VALUES(discount),
share_amount = VALUES(share_amount),
tax_rate = VALUES(tax_rate),
goods_name = VALUES(goods_name),
goods_no = VALUES(goods_no),
spec_name = VALUES(spec_name),
spec_no = VALUES(spec_no),
spec_code = VALUES(spec_code),
suite_no = VALUES(suite_no),
suite_name = VALUES(suite_name),
suite_num = VALUES(suite_num),
suite_amount = VALUES(suite_amount),
suite_discount = VALUES(suite_discount),
api_goods_name = VALUES(api_goods_name),
api_spec_name = VALUES(api_spec_name),
api_goods_id = VALUES(api_goods_id),
api_spec_id = VALUES(api_spec_id),
goods_id = VALUES(goods_id),
spec_id = VALUES(spec_id),
commission = VALUES(commission),
goods_type = VALUES(goods_type),
from_mask = VALUES(from_mask),
remark = VALUES(remark),
modified = VALUES(modified),
created = VALUES(created),
prop1 = VALUES(prop1),
prop2 = VALUES(prop2),
weight = VALUES(weight),
img_url = VALUES(img_url),
actual_num = VALUES(actual_num),
barcode = VALUES(barcode),
paid = VALUES(paid),
suite_id = VALUES(suite_id),
bind_oid = VALUES(bind_oid),
print_suite_mode = VALUES(print_suite_mode),
flag = VALUES(flag),
stock_state = VALUES(stock_state),
is_consigned = VALUES(is_consigned),
is_received = VALUES(is_received),
cid = VALUES(cid),
modified_date = VALUES(modified_date),
created_date = VALUES(created_date),
share_post_price = VALUES(share_post_price),
invoice_content = VALUES(invoice_content),
pay_time = VALUES(pay_time),
short_name = VALUES(short_name),
fenxiao_nick = VALUES(fenxiao_nick),
fenxiao_id = VALUES(fenxiao_id),
fenxiao_name = VALUES(fenxiao_name),
batch_no = VALUES(batch_no),
start_time = VALUES(start_time),
end_time = VALUES(end_time),
trade_no = VALUES(trade_no),
shop_no = VALUES(shop_no),
shop_name = VALUES(shop_name),
shop_remark = VALUES(shop_remark),
trade_status = VALUES(trade_status),
trade_time = VALUES(trade_time),
consign_time = VALUES(consign_time),
receiver_area = VALUES(receiver_area),
zbj_name = VALUES(zbj_name),
zbj_id = VALUES(zbj_id),
zbj_zb_id = VALUES(zbj_zb_id),
zbj_sale_type = VALUES(zbj_sale_type),
zbj_qd_type = VALUES(zbj_qd_type),
receivable = VALUES(receivable),
spec_name_erp = VALUES(spec_name_erp),
flavor_erp = VALUES(flavor_erp),
sync_type = VALUES(sync_type),
actual_cost = VALUES(actual_cost),
standard_cost = VALUES(standard_cost),
sum_actual_cost = VALUES(sum_actual_cost),
sum_standard_cost = VALUES(sum_standard_cost),
series = VALUES(series),
del_flag = VALUES(del_flag)
</insert>
<!-- 根据 rec_id 查询单条记录 -->
<select id="selectByRecId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from wdt_qimen_order_detail_pay_time
where rec_id = #{recId}
</select>
<!-- 根据 rec_id 删除记录 -->
<delete id="deleteByRecId" parameterType="java.lang.Long">
delete
from wdt_qimen_order_detail_pay_time
where rec_id = #{recId}
</delete>
<sql id="Base_Column_List">
trade_id
, rec_id, platform_id, src_oid, src_tid, pay_status, refund_status, 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, start_time, end_time, trade_no, 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, sum_actual_cost, sum_standard_cost, series, del_flag
</sql>
<!-- 通用查询结果映射 -->
<resultMap id="BaseResultMap" type="com.sfa.job.domain.order.entity.WdtQimenOrderDetailPayTime">
<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="pay_status" property="payStatus" jdbcType="INTEGER"/>
<result column="refund_status" property="refundStatus" 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_time" property="createTime" jdbcType="TIMESTAMP"/>
<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="sum_actual_cost" property="sumActualCost" jdbcType="DECIMAL"/>
<result column="sum_standard_cost" property="sumStandardCost" jdbcType="DECIMAL"/>
</resultMap>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfa.job.domain.order.mapper.WdtQimenOrderPayTimeMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
insert into wdt_qimen_order_pay_time ( <include refid="Order_Base_Column_List"></include>)
values
<foreach collection="list" item="item" separator=",">
(
#{item.tradeId}, #{item.tradeNo}, #{item.platformId}, #{item.warehouseType}, #{item.srcTids}, #{item.payAccount}, #{item.tradeStatus}, #{item.tradeType},
#{item.deliveryTerm}, #{item.receiverRing}, #{item.freezeReason}, #{item.refundStatus}, #{item.fenxiaoType}, #{item.fenxiaoNick}, #{item.tradeTime},
#{item.payTime}, #{item.consignTime}, #{item.buyerNick}, #{item.receiverName}, #{item.receiverProvince}, #{item.receiverCity}, #{item.receiverDistrict},
#{item.receiverAddress}, #{item.receiverMobile}, #{item.receiverTelno}, #{item.receiverZip}, #{item.receiverArea}, #{item.receiverDtb}, #{item.badReason},
#{item.logisticsNo}, #{item.buyerMessage}, #{item.csRemark}, #{item.remarkFlag}, #{item.printRemark}, #{item.goodsTypeCount}, #{item.goodsCount},
#{item.goodsAmount}, #{item.postAmount}, #{item.otherAmount}, #{item.discount}, #{item.receivable}, #{item.codAmount}, #{item.extCodFee}, #{item.goodsCost},
#{item.postCost}, #{item.weight}, #{item.profit}, #{item.tax}, #{item.taxRate}, #{item.commission}, #{item.invoiceType}, #{item.invoiceTitle}, #{item.invoiceContent},
#{item.salesmanName}, #{item.checkerName}, #{item.fcheckerName}, #{item.checkouterName}, #{item.stockoutNo}, #{item.flagName}, #{item.tradeFrom},
#{item.singleSpecNo}, #{item.rawGoodsCount}, #{item.rawGoodsTypeCount}, #{item.currency}, #{item.invoiceId}, #{item.versionId}, #{item.modified},
#{item.created}, #{item.checkTime}, #{item.idCardType}, #{item.shopNo}, #{item.shopName}, #{item.shopRemark}, #{item.warehouseNo}, #{item.customerName},
#{item.customerNo}, #{item.logisticsName}, #{item.logisticsCode}, #{item.logisticsTypeName}, #{item.toDeliverTime}, #{item.delayToTime},
#{item.estimateConsignTime}, #{item.shopId}, #{item.warehouseId}, #{item.volume}, #{item.tradeLabel}, #{item.tradeMask}, #{item.shopPlatformId},
#{item.subPlatformId}, #{item.packageName}, #{item.packageId}, #{item.packageCost}, #{item.paid}, #{item.largeType}, #{item.giftMask}, #{item.customerId},
#{item.otherCost}, #{item.isSealed}, #{item.customerType}, #{item.logisticsId}, #{item.cancelReason}, #{item.revertReason}, #{item.newTradeLabel},
#{item.fenxiaoTid}, #{item.delFlag}, #{item.createBy}, #{item.createUserId}, #{item.createTime}, #{item.updateBy}, #{item.updateUserId}, #{item.updateTime},
#{item.batchNo}, #{item.startTime}, #{item.endTime}, #{item.syncType}, #{item.createdDate}
)
</foreach>
ON DUPLICATE KEY UPDATE
trade_id = VALUES(trade_id),
trade_no = VALUES(trade_no),
platform_id = VALUES(platform_id),
warehouse_type = VALUES(warehouse_type),
src_tids = VALUES(src_tids),
pay_account = VALUES(pay_account),
trade_status = VALUES(trade_status),
trade_type = VALUES(trade_type),
delivery_term = VALUES(delivery_term),
receiver_ring = VALUES(receiver_ring),
freeze_reason = VALUES(freeze_reason),
refund_status = VALUES(refund_status),
fenxiao_type = VALUES(fenxiao_type),
fenxiao_nick = VALUES(fenxiao_nick),
trade_time = VALUES(trade_time),
pay_time = VALUES(pay_time),
consign_time = VALUES(consign_time),
buyer_nick = VALUES(buyer_nick),
receiver_name = VALUES(receiver_name),
receiver_province = VALUES(receiver_province),
receiver_city = VALUES(receiver_city),
receiver_district = VALUES(receiver_district),
receiver_address = VALUES(receiver_address),
receiver_mobile = VALUES(receiver_mobile),
receiver_telno = VALUES(receiver_telno),
receiver_zip = VALUES(receiver_zip),
receiver_area = VALUES(receiver_area),
receiver_dtb = VALUES(receiver_dtb),
bad_reason = VALUES(bad_reason),
logistics_no = VALUES(logistics_no),
buyer_message = VALUES(buyer_message),
cs_remark = VALUES(cs_remark),
remark_flag = VALUES(remark_flag),
print_remark = VALUES(print_remark),
goods_type_count = VALUES(goods_type_count),
goods_count = VALUES(goods_count),
goods_amount = VALUES(goods_amount),
post_amount = VALUES(post_amount),
other_amount = VALUES(other_amount),
discount = VALUES(discount),
receivable = VALUES(receivable),
cod_amount = VALUES(cod_amount),
ext_cod_fee = VALUES(ext_cod_fee),
goods_cost = VALUES(goods_cost),
post_cost = VALUES(post_cost),
weight = VALUES(weight),
profit = VALUES(profit),
tax = VALUES(tax),
tax_rate = VALUES(tax_rate),
commission = VALUES(commission),
invoice_type = VALUES(invoice_type),
invoice_title = VALUES(invoice_title),
invoice_content = VALUES(invoice_content),
salesman_name = VALUES(salesman_name),
checker_name = VALUES(checker_name),
fchecker_name = VALUES(fchecker_name),
checkouter_name = VALUES(checkouter_name),
stockout_no = VALUES(stockout_no),
flag_name = VALUES(flag_name),
trade_from = VALUES(trade_from),
single_spec_no = VALUES(single_spec_no),
raw_goods_count = VALUES(raw_goods_count),
raw_goods_type_count = VALUES(raw_goods_type_count),
currency = VALUES(currency),
invoice_id = VALUES(invoice_id),
version_id = VALUES(version_id),
modified = VALUES(modified),
created = VALUES(created),
check_time = VALUES(check_time),
id_card_type = VALUES(id_card_type),
shop_no = VALUES(shop_no),
shop_name = VALUES(shop_name),
shop_remark = VALUES(shop_remark),
warehouse_no = VALUES(warehouse_no),
customer_name = VALUES(customer_name),
customer_no = VALUES(customer_no),
logistics_name = VALUES(logistics_name),
logistics_code = VALUES(logistics_code),
logistics_type_name = VALUES(logistics_type_name),
to_deliver_time = VALUES(to_deliver_time),
delay_to_time = VALUES(delay_to_time),
estimate_consign_time = VALUES(estimate_consign_time),
shop_id = VALUES(shop_id),
warehouse_id = VALUES(warehouse_id),
volume = VALUES(volume),
trade_label = VALUES(trade_label),
trade_mask = VALUES(trade_mask),
shop_platform_id = VALUES(shop_platform_id),
sub_platform_id = VALUES(sub_platform_id),
package_name = VALUES(package_name),
package_id = VALUES(package_id),
package_cost = VALUES(package_cost),
paid = VALUES(paid),
large_type = VALUES(large_type),
gift_mask = VALUES(gift_mask),
customer_id = VALUES(customer_id),
other_cost = VALUES(other_cost),
is_sealed = VALUES(is_sealed),
customer_type = VALUES(customer_type),
logistics_id = VALUES(logistics_id),
cancel_reason = VALUES(cancel_reason),
revert_reason = VALUES(revert_reason),
new_trade_label = VALUES(new_trade_label),
fenxiao_tid = VALUES(fenxiao_tid),
del_flag = VALUES(del_flag),
create_by = VALUES(create_by),
create_user_id = VALUES(create_user_id),
create_time = VALUES(create_time),
update_by = VALUES(update_by),
update_user_id = VALUES(update_user_id),
update_time = VALUES(update_time),
batch_no = VALUES(batch_no),
start_time = VALUES(start_time),
end_time = VALUES(end_time),
sync_type = VALUES(sync_type),
created_date = VALUES(created_date)
</insert>
<!-- 定义 FinanceOrder 表的字段 -->
<sql id="Order_Base_Column_List">
trade_id, trade_no, platform_id, warehouse_type, src_tids, pay_account, trade_status, trade_type,
delivery_term, receiver_ring, freeze_reason, refund_status, fenxiao_type, fenxiao_nick, trade_time,
pay_time, consign_time, buyer_nick, receiver_name, receiver_province, receiver_city, receiver_district,
receiver_address, receiver_mobile, receiver_telno, receiver_zip, receiver_area, receiver_dtb, bad_reason,
logistics_no, buyer_message, cs_remark, remark_flag, print_remark, goods_type_count, goods_count,
goods_amount, post_amount, other_amount, discount, receivable, cod_amount, ext_cod_fee, goods_cost,
post_cost, weight, profit, tax, tax_rate, commission, invoice_type, invoice_title, invoice_content,
salesman_name, checker_name, fchecker_name, checkouter_name, stockout_no, flag_name, trade_from,
single_spec_no, raw_goods_count, raw_goods_type_count, currency, invoice_id, version_id, modified,
created, check_time, id_card_type, shop_no, shop_name, shop_remark, warehouse_no, customer_name,
customer_no, logistics_name, logistics_code, logistics_type_name, to_deliver_time, delay_to_time,
estimate_consign_time, shop_id, warehouse_id, volume, trade_label, trade_mask, shop_platform_id,
sub_platform_id, package_name, package_id, package_cost, paid, large_type, gift_mask, customer_id,
other_cost, is_sealed, customer_type, logistics_id, cancel_reason, revert_reason, new_trade_label,
fenxiao_tid, del_flag, create_by, create_user_id, create_time, update_by, update_user_id, update_time,
batch_no, start_time, end_time, sync_type,created_date
</sql>
<!-- 根据 trade_id 查询订单 -->
<select id="selectFinanceOrderById" resultType="com.sfa.job.domain.order.entity.WdtQimenOrderPayTime">
SELECT
<include refid="Order_Base_Column_List"/>
FROM
wdt_qimen_order_pay_time
WHERE
trade_id = #{tradeId}
</select>
<!-- 查询所有订单 -->
<select id="selectAllFinanceOrders" resultType="com.sfa.job.domain.order.entity.WdtQimenOrderPayTime">
SELECT
<include refid="Order_Base_Column_List"/>
FROM
wdt_qimen_order_pay_time
</select>
<!-- 插入订单 -->
<insert id="insertFinanceOrder" parameterType="com.sfa.job.domain.order.entity.WdtQimenOrderPayTime">
INSERT INTO wdt_qimen_order_pay_time (
trade_id, trade_no, platform_id, warehouse_type, src_tids, pay_account, trade_status, trade_type,
delivery_term, receiver_ring, freeze_reason, refund_status, fenxiao_type, fenxiao_nick, trade_time,
pay_time,consign_time, buyer_nick, receiver_name, receiver_province, receiver_city, receiver_district,
receiver_address, receiver_mobile, receiver_telno, receiver_zip, receiver_area, receiver_dtb, bad_reason,
logistics_no, buyer_message, cs_remark, remark_flag, print_remark, goods_type_count, goods_count,
goods_amount, post_amount, other_amount, discount, receivable, cod_amount, ext_cod_fee, goods_cost,
post_cost, weight, profit, tax, tax_rate, commission, invoice_type, invoice_title, invoice_content,
salesman_name, checker_name, fchecker_name, checkouter_name, stockout_no, flag_name, trade_from,
single_spec_no, raw_goods_count, raw_goods_type_count, currency, invoice_id, version_id, modified,
created, check_time, id_card_type, shop_no, shop_name, shop_remark, warehouse_no, customer_name,
customer_no, logistics_name, logistics_code, logistics_type_name, to_deliver_time, delay_to_time,
estimate_consign_time, shop_id, warehouse_id, volume, trade_label, trade_mask, shop_platform_id,
sub_platform_id, package_name, package_id, package_cost, paid, large_type, gift_mask, customer_id,
other_cost, is_sealed, customer_type, logistics_id, cancel_reason, revert_reason, new_trade_label,
fenxiao_tid, del_flag, create_by, create_user_id, create_time, update_by, update_user_id, update_time,
batch_no, start_time, end_time, sync_type,created_date
) VALUES (
#{tradeId}, #{tradeNo}, #{platformId}, #{warehouseType}, #{srcTids}, #{payAccount}, #{tradeStatus}, #{tradeType},
#{deliveryTerm}, #{receiverRing}, #{freezeReason}, #{refundStatus}, #{fenxiaoType}, #{fenxiaoNick}, #{tradeTime},
#{payTime}, #{consignTime}, #{buyerNick}, #{receiverName}, #{receiverProvince}, #{receiverCity}, #{receiverDistrict},
#{receiverAddress}, #{receiverMobile}, #{receiverTelno}, #{receiverZip}, #{receiverArea}, #{receiverDtb}, #{badReason},
#{logisticsNo}, #{buyerMessage}, #{csRemark}, #{remarkFlag}, #{printRemark}, #{goodsTypeCount}, #{goodsCount},
#{goodsAmount}, #{postAmount}, #{otherAmount}, #{discount}, #{receivable}, #{codAmount}, #{extCodFee}, #{goodsCost},
#{postCost}, #{weight}, #{profit}, #{tax}, #{taxRate}, #{commission}, #{invoiceType}, #{invoiceTitle}, #{invoiceContent},
#{salesmanName}, #{checkerName}, #{fcheckerName}, #{checkouterName}, #{stockoutNo}, #{flagName}, #{tradeFrom},
#{singleSpecNo}, #{rawGoodsCount}, #{rawGoodsTypeCount}, #{currency}, #{invoiceId}, #{versionId}, #{modified},
#{created}, #{checkTime}, #{idCardType}, #{shopNo}, #{shopName}, #{shopRemark}, #{warehouseNo}, #{customerName},
#{customerNo}, #{logisticsName}, #{logisticsCode}, #{logisticsTypeName}, #{toDeliverTime}, #{delayToTime},
#{estimateConsignTime}, #{shopId}, #{warehouseId}, #{volume}, #{tradeLabel}, #{tradeMask}, #{shopPlatformId},
#{subPlatformId}, #{packageName}, #{packageId}, #{packageCost}, #{paid}, #{largeType}, #{giftMask}, #{customerId},
#{otherCost}, #{isSealed}, #{customerType}, #{logisticsId}, #{cancelReason}, #{revertReason}, #{newTradeLabel},
#{fenxiaoTid}, #{delFlag}, #{createBy}, #{createUserId}, #{createTime}, #{updateBy}, #{updateUserId}, #{updateTime},
#{batchNo}, #{startTime}, #{endTime}, #{syncType},#{createdDate}
)
</insert>
<!-- 根据 trade_id 更新订单 -->
<update id="updateFinanceOrderById" parameterType="com.sfa.job.domain.order.entity.WdtQimenOrderPayTime">
UPDATE wdt_qimen_order_pay_time
SET
trade_no = #{tradeNo},
platform_id = #{platformId},
warehouse_type = #{warehouseType},
src_tids = #{srcTids},
pay_account = #{payAccount},
trade_status = #{tradeStatus},
trade_type = #{tradeType},
delivery_term = #{deliveryTerm},
receiver_ring = #{receiverRing},
freeze_reason = #{freezeReason},
refund_status = #{refundStatus},
fenxiao_type = #{fenxiaoType},
fenxiao_nick = #{fenxiaoNick},
trade_time = #{tradeTime},
pay_time = #{payTime},
consign_time = #{consignTime},
buyer_nick = #{buyerNick},
receiver_name = #{receiverName},
receiver_province = #{receiverProvince},
receiver_city = #{receiverCity},
receiver_district = #{receiverDistrict},
receiver_address = #{receiverAddress},
receiver_mobile = #{receiverMobile},
receiver_telno = #{receiverTelno},
receiver_zip = #{receiverZip},
receiver_area = #{receiverArea},
receiver_dtb = #{receiverDtb},
bad_reason = #{badReason},
logistics_no = #{logisticsNo},
buyer_message = #{buyerMessage},
cs_remark = #{csRemark},
remark_flag = #{remarkFlag},
print_remark = #{printRemark},
goods_type_count = #{goodsTypeCount},
goods_count = #{goodsCount},
goods_amount = #{goodsAmount},
post_amount = #{postAmount},
other_amount = #{otherAmount},
discount = #{discount},
receivable = #{receivable},
cod_amount = #{codAmount},
ext_cod_fee = #{extCodFee},
goods_cost = #{goodsCost},
post_cost = #{postCost},
weight = #{weight},
profit = #{profit},
tax = #{tax},
tax_rate = #{taxRate},
commission = #{commission},
invoice_type = #{invoiceType},
invoice_title = #{invoiceTitle},
invoice_content = #{invoiceContent},
salesman_name = #{salesmanName},
checker_name = #{checkerName},
fchecker_name = #{fcheckerName},
checkouter_name = #{checkouterName},
stockout_no = #{stockoutNo},
flag_name = #{flagName},
trade_from = #{tradeFrom},
single_spec_no = #{singleSpecNo},
raw_goods_count = #{rawGoodsCount},
raw_goods_type_count = #{rawGoodsTypeCount},
currency = #{currency},
invoice_id = #{invoiceId},
version_id = #{versionId},
modified = #{modified},
created = #{created},
check_time = #{checkTime},
id_card_type = #{idCardType},
shop_no = #{shopNo},
shop_name = #{shopName},
shop_remark = #{shopRemark},
warehouse_no = #{warehouseNo},
customer_name = #{customerName},
customer_no = #{customerNo},
logistics_name = #{logisticsName},
logistics_code = #{logisticsCode},
logistics_type_name = #{logisticsTypeName},
to_deliver_time = #{toDeliverTime},
delay_to_time = #{delayToTime},
estimate_consign_time = #{estimateConsignTime},
shop_id = #{shopId},
warehouse_id = #{warehouseId},
volume = #{volume},
trade_label = #{tradeLabel},
trade_mask = #{tradeMask},
shop_platform_id = #{shopPlatformId},
sub_platform_id = #{subPlatformId},
package_name = #{packageName},
package_id = #{packageId},
package_cost = #{packageCost},
paid = #{paid},
large_type = #{largeType},
gift_mask = #{giftMask},
customer_id = #{customerId},
other_cost = #{otherCost},
is_sealed = #{isSealed},
customer_type = #{customerType},
logistics_id = #{logisticsId},
cancel_reason = #{cancelReason},
revert_reason = #{revertReason},
new_trade_label = #{newTradeLabel},
fenxiao_tid = #{fenxiaoTid},
del_flag = #{delFlag},
create_by = #{createBy},
create_user_id = #{createUserId},
create_time = #{createTime},
update_by = #{updateBy},
update_user_id = #{updateUserId},
update_time = #{updateTime},
batch_no = #{batchNo},
start_time = #{startTime},
end_time = #{endTime},
sync_type = #{syncType},
created_date = #{createdDate}
WHERE
trade_id = #{tradeId}
</update>
<!-- 根据 trade_id 删除订单 -->
<delete id="deleteFinanceOrderById" parameterType="java.lang.Long">
DELETE FROM wdt_qimen_order_pay_time
WHERE
trade_id = #{tradeId}
</delete>
</mapper>
package com.sfa.job.config;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.sfa.job.domain.order.dao.WdtQimenOrderPayTimeDao;
import com.sfa.job.domain.order.entity.WdtQimenOrderPayTime;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
/**
* ShardingSphere分表功能测试类
* 用于验证YearBasedShardingAlgorithm分片算法是否正确工作
*/
@ExtendWith(SpringExtension.class)
@SpringBootTest
// 关键注解:指定profile为test
@ActiveProfiles("test")
@Slf4j
public class ShardingTableTest {
@Autowired
private WdtQimenOrderPayTimeDao wdtQimenOrderPayTimeDao;
/**
* 测试插入不同年份的数据是否能正确路由到对应的分表
*/
@Test
public void testShardingInsert() {
log.info("开始测试分表插入功能...");
// 创建并插入2023年的订单
insertOrderWithSpecificYear(2023);
// 创建并插入2024年的订单
insertOrderWithSpecificYear(2024);
// 创建并插入2025年的订单
insertOrderWithSpecificYear(2025);
System.out.println("分表插入测试完成,请检查各年份表数据!");
}
/**
* 创建并插入指定年份的订单数据
* @param year 年份
*/
private void insertOrderWithSpecificYear(int year) {
WdtQimenOrderPayTime order = new WdtQimenOrderPayTime();
// 设置基本字段
order.setTradeId(System.currentTimeMillis());
order.setTradeNo("TEST_" + year + "_" + new Random().nextInt(10000));
order.setShopId(1);
order.setShopNo("SHOP001");
order.setPlatformId(11);
order.setShopName("测试店铺");
order.setTradeStatus(10); // 未付款状态
order.setTradeType(1); // 网店销售
// order.setPayTime(LocalDateTimeUtil.now());
order.setCreated(String.valueOf(System.currentTimeMillis()));
order.setCreatedDate(new Date());
order.setDelFlag(0);
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
order.setDeliveryTerm(1);
order.setRefundStatus(1);
order.setFenxiaoType(11);
order.setBadReason(1);
order.setGoodsTypeCount(new BigDecimal(1));
order.setGoodsCount(new BigDecimal(1));
order.setGoodsAmount(new BigDecimal(1));
order.setPostAmount(new BigDecimal(1));
order.setOtherAmount(new BigDecimal(1));
order.setDiscount(new BigDecimal(1));
order.setDiscount(new BigDecimal(1));
order.setReceivable(new BigDecimal(1));
order.setCodAmount(new BigDecimal(1));
order.setExtCodFee(new BigDecimal(1));
order.setGoodsCost(new BigDecimal(1));
order.setPostCost(new BigDecimal(1));
order.setWeight(new BigDecimal(1));
order.setProfit(new BigDecimal(1));
order.setTax(new BigDecimal(1));
order.setTaxRate(new BigDecimal(1));
order.setCommission(new BigDecimal(1));
order.setInvoiceType(1);
order.setTradeFrom(1);
order.setRawGoodsCount(new BigDecimal(1));
order.setRawGoodsTypeCount(1);
order.setCurrency("CNY");
order.setCreated("1");
order.setCreatedDate(new Date());
order.setTradeMask(1);
order.setPackageCost(new BigDecimal(1));
order.setPaid(new BigDecimal(1));
order.setLargeType(1);
order.setGiftMask(1);
order.setOtherCost(new BigDecimal(1));
order.setIsSealed(true);
order.setCustomerType(1);
order.setDelFlag(1);
order.setUpdateTime(new Date());
order.setBatchNo("TEST_" + year);
// 设置不同年份的支付时间,这是分片的关键字段
Calendar calendar = Calendar.getInstance();
calendar.set(year, 0, 1, 0, 0, 0);
order.setPayTime(LocalDateTimeUtil.of(calendar.getTime()));
log.info("插入" + year + "年订单,payTime: " + order.getPayTime());
// 由于是测试环境,这里可能需要特殊处理批量保存
// 注意:实际环境中应该使用业务层方法进行保存
wdtQimenOrderPayTimeDao.saveOrUpdateBatch(java.util.Collections.singletonList(order));
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论