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

1、增加退换货代码

2、优化调整部分代码
上级 5d9c9c8c
package com.sfa.job.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "wangdiantong")
public class WangdiantongConfig {
private String url;
private String sid;
private String key;
private String salt;
private String appsecret;
}
......@@ -2,7 +2,7 @@ package com.sfa.job.controller.finance;
import cn.hutool.core.date.DateUtil;
import com.sfa.common.core.web.controller.BaseController;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -24,16 +24,27 @@ public class FinanceOrderDetailSyncController extends BaseController {
@Autowired
private FinanceOrderSyncService syncService;
@GetMapping("/syncWangdiantongOrderDetail")
public FinanceSyncOrderDetailDto syncWangdiantongOrderDetail(Date startTime, Date endTime) {
@GetMapping("/syncWdtOrderDetail")
public SyncOrderDetailDto syncWangdiantongOrderDetail(Date startTime, Date endTime) {
log.info("接口开始同步-旺店通订单明细api接口数据");
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集
FinanceSyncOrderDetailDto detailDto = syncService.syncWangdiantongOrder(startTime, endTime, 1);
SyncOrderDetailDto detailDto = syncService.syncWdtOrder(startTime, endTime, 1);
log.info("接口结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
return detailDto;
}
@GetMapping("/syncWdtRefundOrder")
public SyncOrderDetailDto syncWdtRefundOrder(Date startTime, Date endTime) {
log.info("接口开始同步-旺店通退换订单明细api接口数据");
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集
SyncOrderDetailDto detailDto = syncService.syncWdtRefundOrder(startTime, endTime, 1);
log.info("接口结束同步-旺店通退换订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
return detailDto;
}
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtRefundOrder;
import java.util.List;
public interface WdtRefundOrderDao {
void saveOrUpdateBatch(List<WdtRefundOrder> mergeList);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtRefundOrderDetail;
import java.util.List;
public interface WdtRefundOrderDetailDao {
void saveOrUpdateBatch(List<WdtRefundOrderDetail> mergeList);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtSwapOrder;
import java.util.List;
public interface WdtSwapOrderDao {
void saveOrUpdateBatch(List<WdtSwapOrder> mergeList);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.WdtSwapOrderDetail;
import java.util.List;
public interface WdtSwapOrderDetailDao {
void saveOrUpdateBatch(List<WdtSwapOrderDetail> mergeList);
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtRefundOrderDao;
import com.sfa.job.domain.order.entity.WdtRefundOrder;
import com.sfa.job.domain.order.mapper.WdtRefundOrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("Bi")
@Repository
public class WdtRefundOrderDaoImpl implements WdtRefundOrderDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtRefundOrderMapper wdtRefundOrderMapper;
@Override
public void saveOrUpdateBatch(List<WdtRefundOrder> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtRefundOrder> batchLists = mergeList.subList(i, toIndex);
wdtRefundOrderMapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtRefundOrderDetailDao;
import com.sfa.job.domain.order.entity.WdtRefundOrderDetail;
import com.sfa.job.domain.order.mapper.WdtRefundOrderDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("Bi")
@Repository
public class WdtRefundOrderDetailDaoImpl implements WdtRefundOrderDetailDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtRefundOrderDetailMapper wdtRefundOrderDetailMapper;
@Override
public void saveOrUpdateBatch(List<WdtRefundOrderDetail> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtRefundOrderDetail> batchLists = mergeList.subList(i, toIndex);
wdtRefundOrderDetailMapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtSwapOrderDao;
import com.sfa.job.domain.order.entity.WdtSwapOrder;
import com.sfa.job.domain.order.mapper.WdtSwapOrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("Bi")
@Repository
public class WdtSwapOrderDaoImpl implements WdtSwapOrderDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtSwapOrderMapper swapOrderMapper;
@Override
public void saveOrUpdateBatch(List<WdtSwapOrder> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtSwapOrder> batchLists = mergeList.subList(i, toIndex);
swapOrderMapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.WdtSwapOrderDetailDao;
import com.sfa.job.domain.order.entity.WdtSwapOrderDetail;
import com.sfa.job.domain.order.mapper.WdtSwapOrderDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@DS("Bi")
@Repository
public class WdtSwapOrderDetailDaoImpl implements WdtSwapOrderDetailDao {
private static final int BATCH_SIZE = 1000;
@Autowired
private WdtSwapOrderDetailMapper swapOrderDetailMapper;
@Override
public void saveOrUpdateBatch(List<WdtSwapOrderDetail> mergeList) {
for (int i = 0; i < mergeList.size(); i += BATCH_SIZE) {
int toIndex = Math.min(i + BATCH_SIZE, mergeList.size());
List<WdtSwapOrderDetail> batchLists = mergeList.subList(i, toIndex);
swapOrderDetailMapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
* 退换货订单数据
* @author lvbencai
* @date 2025-02-28 12:26:29
*/
@Data
@TableName(value = "wdt_refund_amount_detail")
public class WdtRefundAmountDetail {
private Integer recId; // 金额明细记录id
private Integer refundId; // 退换单id
private Integer refundType; // 退换类型 1:货款 2:邮费 99:返现
private Integer isReturn; // 金额流向 0:商家->买家 1:买家->商家
private BigDecimal refundAmount; // 退款金额
private BigDecimal receiveAmount; // 收款金额
private Boolean isGuarantee; // 是否担保支付
private Integer accountId; // 支付账户
private String payAccount; // 买家账号(仅自有平台及线下平台返回)
private String accountName; // 买家开户人姓名
private String accountBank; // 开户银行
private Boolean isAuto; // 是否系统自动生成
private String remark; // 备注
// getters & setters
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 退换货订单数据
* @author lvbencai
* @date 2025-02-28 12:26:29
*/
@Data
@TableName(value = "wdt_refund_order")
public class WdtRefundOrder {
private Integer refundId; // 退换单id
private String srcTids; // 原始单号(关联的销售单平台订单号)
private String refundNo; // 退换单号
private String remark; // 备注
private Integer type; // 退换单类型 1:售前退款;2:退货;3:换货;4:退款不退货;6:保价退款
private Integer stockinStatus; // 入库状态 0:无需入库;1:待入库;2:部分入库;3:全部入库;4:终止入库
private String flagName; // 标记名称
private BigDecimal returnGoodsCount; // 退回货品数量
private String receiverTelno; // 退款订单中收件人电话(仅自有平台及线下平台返回)
private String receiverName; // 退款订单中收件人姓名(仅自有平台及线下平台返回)
private String modified; // 修改时间
private Integer noteCount; // 便签数量
private String shopNo; // 店铺编号
private Integer fromType; // 建单方式 0:API抓单;1:手工建单;2:Excel导入;3:分销商推送
private String created; // 建单时间
private String settleTime; // 结算时间
private String checkTime; // 审核时间
private String returnLogisticsNo; // 退货物流单号
private String tradeNoList; // 系统订单号列表
private BigDecimal guaranteeRefundAmount; // 平台退款金额(担保退款金额)
private BigDecimal returnGoodsAmount; // 退货金额
private String returnLogisticsName; // 物流公司名称
private String reasonName; // 退换说明
private String refundReason; // 退款原因
private String buyerNick; // 客户网名(仅自有平台及线下平台返回)
private String operatorName; // 建单者
private BigDecimal actualRefundAmount; // 实际退款金额
private String revertReasonName; // 驳回原因
private String returnWarehouseNo; // 退回仓库编号
private BigDecimal directRefundAmount; // 线下退款金额(非担保退款金额)
private BigDecimal receiveAmount; // 收款金额
private String customerName; // 客户姓名(仅自有平台及线下平台返回)
private String fenxiaoNickName; // 分销商昵称
private Integer status; // 退换单状态 10:已取消;20:待审核;30:已审核...
private Integer shopId; // 店铺id
private Integer tradeId; // 订单id
private String rawRefundNos; // 原始退换单号
private String payId; // 支付订单号
private String providerRefundNo; // 分销退换单号
private Integer shopPlatformId; // 店铺平台id
private String tidList; // 原始单号
private Integer subPlatformId; // 子平台id
private Integer returnWarehouseId; // 退回仓库id
private Integer platformId; // 平台id
private String wmsOwnerNo; // 奇门货主编号
private Integer warehouseType; // 退回仓库类型
private Integer badReason; // 拦截原因
private String modifiedDate; // 最后修改时间
private String returnMaskInfo; // 退换信息
private Integer processStatus; // 处理状态
private Integer reasonId; // 退款原因id
private Integer revertReason; // 驳回原因id
private Integer customerId; // 客户id
private Integer consignMode; // 发货方式
private String refundTime; // 退款创建时间
private String fenxiaoTid; // 分销原始单号
private String fenxiaoNickNo; // 分销商编码
private String wmsCode; // wms单号
private Integer rrStatus; // 平台状态
private String currentPhaseTimeout; // 退款成功时间
private List<WdtRefundOrderDetail> detailList; // 退换单详情
private List<WdtRefundAmountDetail> amountDetailList; // 金额明细
private WdtSwapOrder swapOrder; // 换出订单
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
* 退换货订单明细数据
* @author lvbencai
* @date 2025-02-28 12:26:23
*/
@Data
@TableName(value = "wdt_refund_order_detail")
public class WdtRefundOrderDetail {
private Integer recId; // 退换单明细Id
private Integer refundId; // 退换单id
private String oid; // 原始子单号
private Integer tradeOrderId; // 订单明细id
private Integer platformId; // 平台id
private String tid; // 原始单号
private String tradeNo; // 系统订单编号
private BigDecimal num; // 数量
private BigDecimal price; // 价格
private BigDecimal originalPrice; // 原价
private BigDecimal checkedCostPrice; // 成本价
private BigDecimal refundNum; // 退款数量
private BigDecimal totalAmount; // 退款总额
private BigDecimal refundAmount; // 已退款金额
private Boolean isGuarantee; // 是否担保退款
private String goodsNo; // 货品编号
private String goodsName; // 货品名称
private String specName; // 规格名
private String specNo; // 商家编码
private String goodsId; // 平台货品id
private String specId; // 平台规格id
private Integer sysGoodsId; // 系统货品id
private Integer sysSpecId; // 系统规格id
private String specCode; // 规格码
private String barcode; // 条码
private BigDecimal stockinNum; // 入库数量
private String remark; // 备注
private String apiSpecName; // 平台规格名称
private String apiGoodsName; // 平台货品名称
private String modified; // 最后修改时间
private String suiteNo; // 组合装编号
private String suiteName; // 组合装名称
private String rawRefundNos; // 原始退款单号
private String rawRefundNo; // 原始退款单号
private Integer salesTradeId; // 订单id
private BigDecimal discount; // 总折扣金额
private BigDecimal paid; // 已支付金额
private Integer suiteId; // 组合装id
private BigDecimal suiteNum; // 组合装数量
private String created; // 创建时间
private String modifiedDate; // 最后修改时间
private Integer giftType; // 赠品类型
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 退换货订单数据
* @author lvbencai
* @date 2025-02-28 12:26:29
*/
@Data
@TableName(value = "wdt_swap_order")
public class WdtSwapOrder {
private String tid; // 换出订单原始单号
private String shopNo; // 店铺编号
private String shopName; // 店铺名称
private String warehouseNo; // 仓库名称
private Integer shopId; // 店铺id
private Integer warehouseId; // 仓库id
private Integer swapProvince; // 省份id
private Integer swapCity; // 城市id
private String swapArea; // 地区
private Integer swapDistrict; // 地区id
private Integer swapLogisticsId; // 换货新订单物流公司id
private BigDecimal postAmount; // 换货邮费
private BigDecimal otherAmount; // 其他金额
private List<WdtSwapOrderDetail> swapOrderDetailList; // 换出订单明细
// getters & setters
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
* 退换货订单数据
* @author lvbencai
* @date 2025-02-28 12:26:29
*/
@Data
@TableName(value = "wdt_swap_order_detail")
public class WdtSwapOrderDetail {
private String oid; // 原始子单号
private Byte targetType; // 货品类型(1 单品,2 组合装)
private Integer targetId; // 换出货品id
private Boolean defect; // 是否残次品
private String goodsName; // 货品名称
private String goodsNo; // 货品编号
private String specName; // 规格名称
private String specCode; // 规格码
private String merchantNo; // 商家编码
private BigDecimal price; // 零售价
private BigDecimal totalAmount; // 总价
private BigDecimal num; // 数量
private String remark; // 备注
// getters & setters
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtRefundOrderDetail;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface WdtRefundOrderDetailMapper extends BaseMapper<WdtRefundOrderDetail> {
void saveOrUpdateBatch(@Param(value = "list") List<WdtRefundOrderDetail> mergeList);
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtRefundOrder;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface WdtRefundOrderMapper extends BaseMapper<WdtRefundOrder> {
void saveOrUpdateBatch(List<WdtRefundOrder> batchLists);
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtSwapOrderDetail;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface WdtSwapOrderDetailMapper extends BaseMapper<WdtSwapOrderDetail> {
void saveOrUpdateBatch(@Param(value = "list") List<WdtSwapOrderDetail> mergeList);
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.WdtSwapOrder;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface WdtSwapOrderMapper extends BaseMapper<WdtSwapOrder> {
void saveOrUpdateBatch(List<WdtSwapOrder> batchLists);
}
......@@ -8,7 +8,7 @@ import lombok.Data;
* @Description: 旺店通查询订单请求参数,可以按照旺店通的来定义
*/
@Data
public class WangdiantongQueryVO {
public class WdtOrderQueryVO {
private String start_time;
private String end_time;
}
package com.sfa.job.pojo.request;
import lombok.Data;
/**
* @author lvbencai
* @date 2025-01-22 21:15:39
* @Description: 旺店通查询订单请求参数,可以按照旺店通的来定义
*/
@Data
public class WdtRefundQueryVO {
private String settle_from;
private String settle_to;
}
package com.sfa.job.pojo.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* 财务同步旺店通接口-返回数据Dto
*/
@Data
public class FinanceSyncRefundOrderDetailDto {
/**
* 订单数量
*/
private Integer orderCount;
private Integer orderDetailCount;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
private Integer syncType;
private String batchNo;
private Integer pageNo;
private Integer totalCount;
/**
* 错误信息
*/
private String message;
private Integer code = 200;
}
......@@ -9,7 +9,7 @@ import java.util.Date;
* 财务同步旺店通接口-返回数据Dto
*/
@Data
public class FinanceSyncOrderDetailDto {
public class SyncOrderDetailDto {
/**
* 订单数量
*/
......
package com.sfa.job.service.order;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import java.util.Date;
public interface FinanceOrderSyncService {
FinanceSyncOrderDetailDto syncWangdiantongOrder(Date startTime, Date endTime, Integer syncType);
SyncOrderDetailDto syncWdtOrder(Date startTime, Date endTime, Integer syncType);
SyncOrderDetailDto syncWdtRefundOrder(Date startTime, Date endTime, Integer syncType);
}
package com.sfa.job.service.order.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
......@@ -11,9 +12,10 @@ import com.sfa.common.core.utils.DateUtils;
import com.sfa.job.constants.Constants;
import com.sfa.job.domain.order.dao.*;
import com.sfa.job.domain.order.entity.*;
import com.sfa.job.pojo.request.WangdiantongQueryVO;
import com.sfa.job.pojo.request.WdtOrderQueryVO;
import com.sfa.job.pojo.request.WdtRefundQueryVO;
import com.sfa.job.pojo.response.CollectOrderLogDto;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.pojo.response.WangdiantongQueryDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.sfa.job.util.WangdiantongUtil;
......@@ -45,6 +47,10 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
@Autowired
FinanceOrderDao orderDao;
@Autowired
WdtRefundOrderDao wdtRefundOrderDao;
@Autowired
WdtRefundOrderDetailDao wdtRefundOrderDetailDao;
@Autowired
FinianceBaseProductDao baseProductDao;
@Autowired
FinanceBaseZbjTypeDao baseZbjTypeDao;
......@@ -63,41 +69,22 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
*/
@Transactional(rollbackFor = Exception.class)
@Override
public FinanceSyncOrderDetailDto syncWangdiantongOrder(Date startTime, Date endTime, Integer syncType) {
FinanceSyncOrderDetailDto detailDto = new FinanceSyncOrderDetailDto();
public SyncOrderDetailDto syncWdtOrder(Date startTime, Date endTime, Integer syncType) {
SyncOrderDetailDto detailDto = new SyncOrderDetailDto();
String batchNo = syncType + DateUtils.dateTimeNow() + Thread.currentThread().getId();
AtomicInteger beginPageNo = new AtomicInteger(0);
// 继续下一页的标识 pageNo =-1 标识终止分页 pageNo >0 标识继续分页
Boolean nextPageFlag = true;
try {
// startTime 为空,默认是定时任务调用
if (ObjectUtils.isEmpty(startTime)) {
Date latestTime = null;
// 查询最新的采集时间
CollectOrderLogDto collectOrderLog = orderLogInfoDao.selectOrderSyncLatest(syncType);
if (ObjectUtils.isNotEmpty(collectOrderLog)) {
latestTime = collectOrderLog.getLatestTime();
Integer pageNoExist = collectOrderLog.getPageNo();
beginPageNo.set(ObjectUtil.isNotEmpty(pageNoExist) && pageNoExist > 0 ? collectOrderLog.getPageNo() : 0);
nextPageFlag = beginPageNo.get() > 0;
} else {
// 默认上个月的第一天 00:00:00
startTime = DateUtil.beginOfDay(DateUtil.beginOfMonth(DateUtil.lastMonth()));
}
if (nextPageFlag) {
startTime = DateUtils.addMinutes(latestTime, -60);
} else {
// 调用查询旺店通接口api 获取最新日期前的一个小时
startTime = DateUtils.addMinutes(latestTime, -3);
}
try {
// 调用新方法设置时间范围
Date[] startTimeArray = {startTime};
Date[] endTimeArray = {endTime};
setupTimeRange(startTimeArray, endTimeArray, syncType, beginPageNo);
startTime = startTimeArray[0];
endTime = endTimeArray[0];
}
if (ObjectUtils.isEmpty(endTime)) {
endTime = DateUtils.addMinutes(startTime, 60);
}
// 调用查询旺店通接口api 获取最新日期前的2小时
Date currentLatest = DateUtils.addHours(new Date(), -2);
if (currentLatest.compareTo(startTime) < 0) {
detailDto.setTotalCount(0);
detailDto.setBatchNo(batchNo);
......@@ -107,16 +94,21 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
log.warn(String.format("开始时间%s不能大于当前时间%s", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(currentLatest)));
return detailDto;
}
if (!validateStartTime(startTime,endTime,batchNo)) {
return detailDto;
}
log.info("查询订单参数:开始时间{},结束时间{},当前页:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), beginPageNo.get());
WangdiantongQueryVO wangdiantongQueryVO = new WangdiantongQueryVO();
wangdiantongQueryVO.setStart_time(com.alibaba.fastjson2.util.DateUtils.format(startTime));
wangdiantongQueryVO.setEnd_time(com.alibaba.fastjson2.util.DateUtils.format(endTime));
WdtOrderQueryVO wdtOrderQueryVO = new WdtOrderQueryVO();
wdtOrderQueryVO.setStart_time(com.alibaba.fastjson2.util.DateUtils.format(startTime));
wdtOrderQueryVO.setEnd_time(com.alibaba.fastjson2.util.DateUtils.format(endTime));
HashMap<String, Object> params = new HashMap<>();
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(wdtOrderQueryVO);
params.putAll(stringObjectMap);
// 旺店通入参 和其他入参分开传入 旺店通入参bean转map
WangdiantongQueryDto wangdiantongQueryDto = wangdiantongUtil.queryWithDetail(wangdiantongQueryVO, beginPageNo);
String method = "sales.TradeQuery.queryWithDetail";
WangdiantongQueryDto wangdiantongQueryDto = wangdiantongUtil.queryWithDetail(params, beginPageNo, method);
JSONArray orderAllArray = wangdiantongQueryDto.getResult();
if (ObjectUtils.isEmpty(orderAllArray)) {
throw new ServiceException("旺店通没有查询到订单数据");
......@@ -150,7 +142,7 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
List<FinanceOrderDetail> mergeList = new ArrayList<>();
// 用于同一个订单号,来赋值直播间信息
Map<String, FinanceOrderDetail> orderZbj = new HashMap<>();
Map<String, FinanceOrderDetail> orderZbjMap = new HashMap<>();
// 入库订单明细表
for (FinanceOrder order : orders) {
List<FinanceOrderDetail> orderDetails = order.getDetailList();
......@@ -174,7 +166,7 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
orderDetail.setEndTime(finalEndTime);
orderDetail.setSyncType(syncType);
// 如果存在相同的
FinanceOrderDetail sameDetail = orderZbj.get(orderDetail.getSrcTid());
FinanceOrderDetail sameDetail = orderZbjMap.get(orderDetail.getSrcTid());
orderDetail.setZbjName(orderDetail.getFenxiaoName(), orderDetail.getRemark(), sameDetail);
orderDetail.setZbjId(orderDetail.getRemark(), sameDetail);
......@@ -182,24 +174,31 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
orderDetail.setZbjSaleType(orderDetail.getRemark(), sameDetail);
// 确定分销商类型
orderDetail.setZbjQdType(orderDetail.getFenxiaoId(), orderDetail.getZbjZbId(), baseZbjType);
// 同一个订单id的,设置直播间类型信息也相同
if (ObjectUtils.isNotEmpty(orderDetail.getZbjName())) {
orderZbj.put(orderDetail.getSrcTid(), orderDetail);
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() : "");
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()));
// 将退款成功的数据分摊后总价置为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);
......@@ -248,4 +247,139 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
return detailDto;
}
/**
* 同步退换货数据
* @param startTime
* @param endTime
* @param syncType
* @return
*/
@Override
public SyncOrderDetailDto syncWdtRefundOrder(Date startTime, Date endTime, Integer syncType) {
SyncOrderDetailDto detailDto = new SyncOrderDetailDto();
String batchNo = syncType + DateUtils.dateTimeNow() + Thread.currentThread().getId();
AtomicInteger beginPageNo = new AtomicInteger(0);
try {
// 调用新方法设置时间范围
Date[] startTimeArray = {startTime};
Date[] endTimeArray = {endTime};
setupTimeRange(startTimeArray, endTimeArray, syncType, beginPageNo);
startTime = startTimeArray[0];
endTime = endTimeArray[0];
if (!validateStartTime(startTime,endTime,batchNo)) {
return detailDto;
}
log.info("查询订单参数:开始时间{},结束时间{},当前页:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), beginPageNo.get());
// 旺店通入参 和其他入参分开传入 旺店通入参bean转map
WdtRefundQueryVO wdtOrderQueryVO = new WdtRefundQueryVO();
wdtOrderQueryVO.setSettle_from(com.alibaba.fastjson2.util.DateUtils.format(startTime));
wdtOrderQueryVO.setSettle_to(com.alibaba.fastjson2.util.DateUtils.format(endTime));
HashMap<String, Object> params = new HashMap<>();
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(wdtOrderQueryVO);
params.putAll(stringObjectMap);
// https://open.wangdian.cn/qjb/open/apidoc/doc?path=aftersales.refund.Refund.search 1.4 时间跨度:请求时间最大跨度为30天。
// 退换单查询
String method = "aftersales.refund.Refund.search";
WangdiantongQueryDto wangdiantongQueryDto = wangdiantongUtil.queryWithDetail(params, beginPageNo, method);
JSONArray orderAllArray = wangdiantongQueryDto.getResult();
if (ObjectUtils.isEmpty(orderAllArray)) {
throw new ServiceException("旺店通没有查询到订单数据");
}
// 保存数据
List<WdtRefundOrder> orders = JSONArray.parseArray(orderAllArray.toString(), WdtRefundOrder.class, JSONReader.Feature.SupportSmartMatch);
wdtRefundOrderDao.saveOrUpdateBatch(orders);
List<WdtRefundOrderDetail> mergeList = new ArrayList<>();
orders.forEach(order -> {
mergeList.addAll(order.getDetailList());
});
wdtRefundOrderDetailDao.saveOrUpdateBatch(mergeList);
log.info("插入订单和订单详情完成,批次{}开始时间{},结束时间{},订单数量:{},详情数量:{},下一次开始页数:{}", batchNo, DateUtil.formatDateTime(startTime),
DateUtil.formatDateTime(endTime), orders.size(), mergeList.size(), beginPageNo.get());
CollectOrderLog collectOrderLog = new CollectOrderLog();
collectOrderLog.setSyncType(syncType);
collectOrderLog.setOrderCount(orders.size());
collectOrderLog.setOrderDetailCount(mergeList.size());
collectOrderLog.setBatchNo(batchNo);
collectOrderLog.setLatestTime(endTime);
collectOrderLog.setPageNo(beginPageNo.get());
collectOrderLog.setTotalCount(wangdiantongQueryDto.getTotalCount());
orderLogInfoDao.insert(collectOrderLog);
// 接口测试使用
detailDto.setOrderCount(orders.size());
detailDto.setOrderDetailCount(mergeList.size());
detailDto.setStartTime(startTime);
detailDto.setPageNo(beginPageNo.get());
detailDto.setEndTime(endTime);
detailDto.setTotalCount(wangdiantongQueryDto.getTotalCount());
detailDto.setBatchNo(batchNo);
}catch (Exception e){
log.error(e.getMessage(), e);
// 记录错误日志表 collect_error_info
CollectErrorLog errorInfo = new CollectErrorLog();
errorInfo.setBatchNo(batchNo);
errorInfo.setType(Constants.SYNC_TYPE_XXL_JOB);
errorInfo.setErrorMsg(e.getMessage());
errorInfo.setEndTime(endTime);
errorInfo.setStartTime(startTime);
errorInfo.setCollectTime(new Date());
errorInfoDao.insert(errorInfo);
detailDto.setCode(HttpStatus.HTTP_INTERNAL_ERROR);
detailDto.setMessage(e.toString());
}finally {
}
return null;
}
private void setupTimeRange(Date[] startTime, Date[] endTime, Integer syncType, AtomicInteger beginPageNo) {
// startTime 为空,默认是定时任务调用
if (ObjectUtils.isEmpty(startTime[0])) {
// 继续下一页的标识 pageNo =-1 标识终止分页 pageNo >0 标识继续分页
boolean nextPageFlag = true;
Date latestTime = null;
// 查询最新的采集时间
CollectOrderLogDto collectOrderLog = orderLogInfoDao.selectOrderSyncLatest(syncType);
if (ObjectUtils.isNotEmpty(collectOrderLog)) {
latestTime = collectOrderLog.getLatestTime();
Integer pageNoExist = collectOrderLog.getPageNo();
beginPageNo.set(ObjectUtil.isNotEmpty(pageNoExist) && pageNoExist > 0 ? collectOrderLog.getPageNo() : 0);
nextPageFlag = beginPageNo.get() > 0;
} else {
// 默认上个月的第一天 00:00:00
startTime[0] = DateUtil.beginOfDay(DateUtil.beginOfMonth(DateUtil.lastMonth()));
}
if (nextPageFlag) {
startTime[0] = DateUtils.addMinutes(latestTime, -60);
} else {
// 调用查询旺店通接口api 获取最新日期前的一个小时
startTime[0] = DateUtils.addMinutes(latestTime, -3);
}
}
if (ObjectUtils.isEmpty(endTime[0])) {
endTime[0] = DateUtils.addMinutes(startTime[0], 60);
}
}
private boolean validateStartTime(Date startTime, Date endTime, String batchNo) {
Date currentLatest = DateUtils.addHours(new Date(), -2);
if (currentLatest.compareTo(startTime) < 0) {
SyncOrderDetailDto detailDto = new SyncOrderDetailDto();
detailDto.setTotalCount(0);
detailDto.setBatchNo(batchNo);
detailDto.setStartTime(startTime);
detailDto.setEndTime(endTime);
String message = String.format("开始时间%s不能大于当前时间%s", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(currentLatest));
detailDto.setMessage(message);
log.warn(message);
return false;
}
return true;
}
}
package com.sfa.job.util;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.lark.oapi.okhttp.*;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.job.pojo.request.WangdiantongQueryVO;
import com.sfa.job.config.WangdiantongConfig;
import com.sfa.job.pojo.response.WangdiantongQueryDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
@Component
public class WangdiantongUtil {
// @Value("${wangdiantong.url}")
// private String url;
// @Value("${wangdiantong.sid}")
// private String sid ;
// @Value("${wangdiantong.key}")
// private String key ;
// @Value("${wangdiantong.salt}")
// private String salt ;
// @Value("${wangdiantong.appsecret}")
// private String appsecret;
private final WangdiantongConfig wangdiantongConfig;
@Autowired
public WangdiantongUtil(WangdiantongConfig wangdiantongConfig) {
this.wangdiantongConfig = wangdiantongConfig;
}
/**
* 卖家账号/接口账号/盐/接口名称
*/
public WangdiantongQueryDto queryWithDetail(WangdiantongQueryVO wangdiantongQuery, AtomicInteger beginPageNo) {
public WangdiantongQueryDto queryWithDetail(HashMap<String, Object> params, AtomicInteger beginPageNo,String method) {
WangdiantongQueryDto wangdiantongQueryDto = new WangdiantongQueryDto();
JSONArray allArray = new JSONArray();
Integer totalCount = 0;
......@@ -35,27 +51,16 @@ public class WangdiantongUtil {
int size = 0;
int pageNo = beginPageNo.get();
// 出现了查询的分页数量不足的情况
int maxPage = 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 url = wangdiantongConfig.getUrl();
String sid = wangdiantongConfig.getSid();
String key = wangdiantongConfig.getKey();
String salt = wangdiantongConfig.getSalt();
String appsecret = wangdiantongConfig.getAppsecret();
String v = "1.0";
HashMap<String, Object> params = new HashMap<>();
// params.put("start_time", wangdiantongQuery.getStart_time());
// params.put("end_time", wangdiantongQuery.getEnd_time());
// bean 转map
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(wangdiantongQuery);
params.putAll(stringObjectMap);
List<HashMap<String, Object>> paramsList = Arrays.asList(params);
String signParams = appsecret + "body" + JSONObject.toJSONString(paramsList) + "calc_total1" + "key" + key
+ "method" + method + "page_no" + pageNo + "page_size200" + "salt" + salt + "sid" + sid +
"timestamp" + (System.currentTimeMillis() / 1000 - 1325347200) + "v" + v + appsecret;
......@@ -89,13 +94,13 @@ public class WangdiantongUtil {
throw new ServiceException("访问旺店通接口错误" + messageJson.toString());
}
totalCount = dataR.getInteger("total_count");
maxPage = (totalCount+199)/200;
maxPage = (totalCount + 199) / 200;
JSONArray orderJsonArray = dataR.getJSONArray("order");
allArray.addAll(orderJsonArray);
size = allArray.size();
log.info("当前时间段{}-{},查询返回的order条数:{},总条数totalCount:{},page_no:{}", wangdiantongQuery.getStart_time(), wangdiantongQuery.getEnd_time(), orderJsonArray.size(), totalCount, pageNo);
log.info("当前入参{},查询返回的order条数:{},总条数totalCount:{},page_no:{}", JSONObject.toJSONString(params), orderJsonArray.size(), totalCount, pageNo);
// 计算下一次分页的页码
pageNo++;
} while (size < maxDealCount && pageNo <= maxPage);
......
......@@ -4,7 +4,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson2.JSONObject;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.context.XxlJobHelper;
......@@ -29,7 +29,7 @@ public class FinanceOrderTask {
* 同步部门数据
*/
@XxlJob("syncWangdiantongOrderDetail")
public FinanceSyncOrderDetailDto syncWangdiantongOrderDetail() {
public SyncOrderDetailDto syncWangdiantongOrderDetail() {
Long st = System.currentTimeMillis();
// 暂不考虑分片
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
......@@ -42,7 +42,7 @@ public class FinanceOrderTask {
XxlJobHelper.log("xxl-job开始同步-旺店通订单明细api接口数据");
// 定时任务不设定开始时间和结束时间
FinanceSyncOrderDetailDto detailDto = financeOrderSyncService.syncWangdiantongOrder(null, null,0);
SyncOrderDetailDto detailDto = financeOrderSyncService.syncWdtOrder(null, null,0);
XxlJobHelper.log("xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
......@@ -53,5 +53,34 @@ public class FinanceOrderTask {
}
return detailDto;
}
/**
* 同步部门数据
*/
@XxlJob("syncWdtRefundOrder")
public SyncOrderDetailDto syncWdtRefundOrder() {
Long startTime = System.currentTimeMillis();
// 暂不考虑分片
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
int shardingTotalCount = xxlJobContext.getShardTotal();
int shardingItem = xxlJobContext.getShardIndex();
XxlJobHelper.log(">>>>>>>>>>syncWangdiantongOrderDetail Job start<<<<<<<<<<");
// 简单模拟分片处理,这里输出每个分片的信息
XxlJobHelper.log("分片总数: " + shardingTotalCount + ", 当前分片: " + shardingItem);
XxlJobHelper.log("xxl-job开始同步-旺店通订单明细api接口数据");
// 定时任务不设定开始时间和结束时间
SyncOrderDetailDto detailDto = financeOrderSyncService.syncWdtRefundOrder(null, null,0);
Long endTime = System.currentTimeMillis();
XxlJobHelper.log("xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{},时长:{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()),
endTime-startTime);
if(ObjectUtil.equals(HttpStatus.HTTP_OK,detailDto.getCode()) ){
XxlJobHelper.handleSuccess(JSONObject.toJSONString(detailDto));
}else{
XxlJobHelper.handleFail(detailDto.getMessage());
}
return detailDto;
}
}
<!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.WdtRefundOrderDetailMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
INSERT INTO wdt_refund_order_detail (
rec_id, refund_id, oid, trade_order_id, platform_id, tid, trade_no,
num, price, original_price, checked_cost_price, refund_num, total_amount,
refund_amount, is_guarantee, goods_no, goods_name, spec_name, spec_no,
goods_id, spec_id, sys_goods_id, sys_spec_id, spec_code, barcode,
stockin_num, remark, api_spec_name, api_goods_name, modified, suite_no,
suite_name, raw_refund_nos, raw_refund_no, sales_trade_id, discount, paid,
suite_id, suite_num, created, modified_date, gift_type
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.recId},
#{item.refundId},
#{item.oid},
#{item.tradeOrderId},
#{item.platformId},
#{item.tid},
#{item.tradeNo},
#{item.num},
#{item.price},
#{item.originalPrice},
#{item.checkedCostPrice},
#{item.refundNum},
#{item.totalAmount},
#{item.refundAmount},
#{item.isGuarantee},
#{item.goodsNo},
#{item.goodsName},
#{item.specName},
#{item.specNo},
#{item.goodsId},
#{item.specId},
#{item.sysGoodsId},
#{item.sysSpecId},
#{item.specCode},
#{item.barcode},
#{item.stockinNum},
#{item.remark},
#{item.apiSpecName},
#{item.apiGoodsName},
#{item.modified},
#{item.suiteNo},
#{item.suiteName},
#{item.rawRefundNos},
#{item.rawRefundNo},
#{item.salesTradeId},
#{item.discount},
#{item.paid},
#{item.suiteId},
#{item.suiteNum},
#{item.created},
#{item.modifiedDate},
#{item.giftType}
)
</foreach>
ON DUPLICATE KEY UPDATE
refund_id = VALUES(refund_id),
oid = VALUES(oid),
trade_order_id = VALUES(trade_order_id),
platform_id = VALUES(platform_id),
tid = VALUES(tid),
trade_no = VALUES(trade_no),
num = VALUES(num),
price = VALUES(price),
original_price = VALUES(original_price),
checked_cost_price = VALUES(checked_cost_price),
refund_num = VALUES(refund_num),
total_amount = VALUES(total_amount),
refund_amount = VALUES(refund_amount),
is_guarantee = VALUES(is_guarantee),
goods_no = VALUES(goods_no),
goods_name = VALUES(goods_name),
spec_name = VALUES(spec_name),
spec_no = VALUES(spec_no),
goods_id = VALUES(goods_id),
spec_id = VALUES(spec_id),
sys_goods_id = VALUES(sys_goods_id),
sys_spec_id = VALUES(sys_spec_id),
spec_code = VALUES(spec_code),
barcode = VALUES(barcode),
stockin_num = VALUES(stockin_num),
remark = VALUES(remark),
api_spec_name = VALUES(api_spec_name),
api_goods_name = VALUES(api_goods_name),
modified = VALUES(modified),
suite_no = VALUES(suite_no),
suite_name = VALUES(suite_name),
raw_refund_nos = VALUES(raw_refund_nos),
raw_refund_no = VALUES(raw_refund_no),
sales_trade_id = VALUES(sales_trade_id),
discount = VALUES(discount),
paid = VALUES(paid),
suite_id = VALUES(suite_id),
suite_num = VALUES(suite_num),
created = VALUES(created),
modified_date = VALUES(modified_date),
gift_type = VALUES(gift_type)
</insert>
</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.WdtRefundOrderMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
INSERT INTO wdt_refund_order (
refund_id, src_tids, refund_no, remark, type,
stockin_status, flag_name, return_goods_count,
receiver_telno, receiver_name, modified, note_count,
shop_no, from_type, created, settle_time, check_time,
return_logistics_no, trade_no_list, guarantee_refund_amount,
return_goods_amount, return_logistics_name, reason_name,
refund_reason, buyer_nick, operator_name, actual_refund_amount,
revert_reason_name, return_warehouse_no, direct_refund_amount,
receive_amount, customer_name, fenxiao_nick_name, status,
shop_id, trade_id, raw_refund_nos, pay_id, provider_refund_no,
shop_platform_id, tid_list, sub_platform_id, return_warehouse_id,
platform_id, wms_owner_no, warehouse_type, bad_reason, modified_date,
return_mask_info, process_status, reason_id, revert_reason_id,
customer_id, consign_mode, refund_time, fenxiao_tid, fenxiao_nick_no,
wms_code, rr_status, current_phase_timeout
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.refundId},
#{item.srcTids},
#{item.refundNo},
#{item.remark},
#{item.type},
#{item.stockinStatus},
#{item.flagName},
#{item.returnGoodsCount},
#{item.receiverTelno},
#{item.receiverName},
#{item.modified},
#{item.noteCount},
#{item.shopNo},
#{item.fromType},
#{item.created},
#{item.settleTime},
#{item.checkTime},
#{item.returnLogisticsNo},
#{item.tradeNoList},
#{item.guaranteeRefundAmount},
#{item.returnGoodsAmount},
#{item.returnLogisticsName},
#{item.reasonName},
#{item.refundReason},
#{item.buyerNick},
#{item.operatorName},
#{item.actualRefundAmount},
#{item.revertReasonName},
#{item.returnWarehouseNo},
#{item.directRefundAmount},
#{item.receiveAmount},
#{item.customerName},
#{item.fenxiaoNickName},
#{item.status},
#{item.shopId},
#{item.tradeId},
#{item.rawRefundNos},
#{item.payId},
#{item.providerRefundNo},
#{item.shopPlatformId},
#{item.tidList},
#{item.subPlatformId},
#{item.returnWarehouseId},
#{item.platformId},
#{item.wmsOwnerNo},
#{item.warehouseType},
#{item.badReason},
#{item.modifiedDate},
#{item.returnMaskInfo},
#{item.processStatus},
#{item.reasonId},
#{item.revertReasonId},
#{item.customerId},
#{item.consignMode},
#{item.refundTime},
#{item.fenxiaoTid},
#{item.fenxiaoNickNo},
#{item.wmsCode},
#{item.rrStatus},
#{item.currentPhaseTimeout}
)
</foreach>
ON DUPLICATE KEY UPDATE
src_tids = VALUES(src_tids),
refund_no = VALUES(refund_no),
remark = VALUES(remark),
type = VALUES(type),
stockin_status = VALUES(stockin_status),
flag_name = VALUES(flag_name),
return_goods_count = VALUES(return_goods_count),
receiver_telno = VALUES(receiver_telno),
receiver_name = VALUES(receiver_name),
modified = VALUES(modified),
note_count = VALUES(note_count),
shop_no = VALUES(shop_no),
from_type = VALUES(from_type),
created = VALUES(created),
settle_time = VALUES(settle_time),
check_time = VALUES(check_time),
return_logistics_no = VALUES(return_logistics_no),
trade_no_list = VALUES(trade_no_list),
guarantee_refund_amount = VALUES(guarantee_refund_amount),
return_goods_amount = VALUES(return_goods_amount),
return_logistics_name = VALUES(return_logistics_name),
reason_name = VALUES(reason_name),
refund_reason = VALUES(refund_reason),
buyer_nick = VALUES(buyer_nick),
operator_name = VALUES(operator_name),
actual_refund_amount = VALUES(actual_refund_amount),
revert_reason_name = VALUES(revert_reason_name),
return_warehouse_no = VALUES(return_warehouse_no),
direct_refund_amount = VALUES(direct_refund_amount),
receive_amount = VALUES(receive_amount),
customer_name = VALUES(customer_name),
fenxiao_nick_name = VALUES(fenxiao_nick_name),
status = VALUES(status),
shop_id = VALUES(shop_id),
trade_id = VALUES(trade_id),
raw_refund_nos = VALUES(raw_refund_nos),
pay_id = VALUES(pay_id),
provider_refund_no = VALUES(provider_refund_no),
shop_platform_id = VALUES(shop_platform_id),
tid_list = VALUES(tid_list),
sub_platform_id = VALUES(sub_platform_id),
return_warehouse_id = VALUES(return_warehouse_id),
platform_id = VALUES(platform_id),
wms_owner_no = VALUES(wms_owner_no),
warehouse_type = VALUES(warehouse_type),
bad_reason = VALUES(bad_reason),
modified_date = VALUES(modified_date),
return_mask_info = VALUES(return_mask_info),
process_status = VALUES(process_status),
reason_id = VALUES(reason_id),
revert_reason_id = VALUES(revert_reason_id),
customer_id = VALUES(customer_id),
consign_mode = VALUES(consign_mode),
refund_time = VALUES(refund_time),
fenxiao_tid = VALUES(fenxiao_tid),
fenxiao_nick_no = VALUES(fenxiao_nick_no),
wms_code = VALUES(wms_code),
rr_status = VALUES(rr_status),
current_phase_timeout = VALUES(current_phase_timeout)
</insert>
</mapper>
<!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.WdtRefundOrderDetailMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
INSERT INTO wdt_swap_order_detail (
oid, swap_order_tid, target_type, target_id, defect, goods_name, goods_no,
spec_name, spec_code, merchant_no, price, total_amount, num, remark
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.oid},
#{item.swapOrderTid},
#{item.targetType},
#{item.targetId},
#{item.defect},
#{item.goodsName},
#{item.goodsNo},
#{item.specName},
#{item.specCode},
#{item.merchantNo},
#{item.price},
#{item.totalAmount},
#{item.num},
#{item.remark}
)
</foreach>
ON DUPLICATE KEY UPDATE
target_type = VALUES(target_type),
target_id = VALUES(target_id),
defect = VALUES(defect),
goods_name = VALUES(goods_name),
goods_no = VALUES(goods_no),
spec_name = VALUES(spec_name),
spec_code = VALUES(spec_code),
merchant_no = VALUES(merchant_no),
price = VALUES(price),
total_amount = VALUES(total_amount),
num = VALUES(num),
remark = VALUES(remark)
</insert>
</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.WdtSwapOrderMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
INSERT INTO wdt_swap_order (
tid, refund_id, shop_no, shop_name, warehouse_no, shop_id, warehouse_id,
swap_province, swap_city, swap_area, swap_district, swap_logistics_id,
post_amount, other_amount
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.tid},
#{item.refundId},
#{item.shopNo},
#{item.shopName},
#{item.warehouseNo},
#{item.shopId},
#{item.warehouseId},
#{item.swapProvince},
#{item.swapCity},
#{item.swapArea},
#{item.swapDistrict},
#{item.swapLogisticsId},
#{item.postAmount},
#{item.otherAmount}
)
</foreach>
ON DUPLICATE KEY UPDATE
shop_no = VALUES(shop_no),
shop_name = VALUES(shop_name),
warehouse_no = VALUES(warehouse_no),
shop_id = VALUES(shop_id),
warehouse_id = VALUES(warehouse_id),
swap_province = VALUES(swap_province),
swap_city = VALUES(swap_city),
swap_area = VALUES(swap_area),
swap_district = VALUES(swap_district),
swap_logistics_id = VALUES(swap_logistics_id),
post_amount = VALUES(post_amount),
other_amount = VALUES(other_amount)
</insert>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论