提交 42effad8 authored 作者: 吕本才's avatar 吕本才 提交者: Coding

Accept Merge Request #115: (qa -> master)

Merge Request: 修改成本为0的数据问题 Created By: @吕本才 Accepted By: @吕本才 URL: https://g-pkkp8204.coding.net/p/wangxiaolu-sfa/d/wangxiaolu-sfa-module-job/git/merge/115?initial=true
......@@ -2,6 +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.FinanceOrderDetailUpdateDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import lombok.extern.slf4j.Slf4j;
......@@ -30,19 +31,17 @@ public class FinanceOrderDetailSyncController extends BaseController {
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集
SyncOrderDetailDto detailDto = syncService.syncWdtOrder(startTime, endTime, 1);
log.info("接口结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
detailDto.getOrderCount(), detailDto.getOrderDetailCount(), detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()), DateUtil.formatDateTime(detailDto.getEndTime()));
return detailDto;
}
@GetMapping("/updateZbjType")
public SyncOrderDetailDto updateZbjType(Date startTime, Date endTime) {
log.info("接口开始同步-旺店通订单明细api接口数据");
@GetMapping("/updateCost")
public FinanceOrderDetailUpdateDto updateCost(Date startTime, Date endTime) {
log.info("修改旺店通订单明细数据开始");
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集
SyncOrderDetailDto detailDto = syncService.updateZbjType(startTime, endTime);
log.info("接口结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
FinanceOrderDetailUpdateDto detailDto = syncService.updateCost(startTime, endTime);
log.info("修改旺店通订单明细结束-旺店通订单明细api接口数据, 共修改订单数{}条数据", detailDto.getTotalCount());
return detailDto;
}
......@@ -52,8 +51,8 @@ public class FinanceOrderDetailSyncController extends BaseController {
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集
SyncOrderDetailDto detailDto = syncService.syncWdtRefundOrder(startTime, endTime, 1);
log.info("结束接口同步-旺店通退换订单明细api接口数据, 共同步退换货订单{}条数据,退换货订单明细{}条,退换货同步批次号:{},订单的开始时间{}和结束时间{},数量:{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()),detailDto.getRemark() );
detailDto.getOrderCount(), detailDto.getOrderDetailCount(), detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()), DateUtil.formatDateTime(detailDto.getEndTime()), detailDto.getRemark());
return detailDto;
}
......
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
import com.sfa.job.pojo.response.FinanceOrderDetailListDto;
import java.util.Date;
import java.util.List;
public interface FinanceOrderDetailDao {
void saveOrUpdateBatch(List<FinanceOrderDetail> mergeList);
List<FinanceOrderDetailListDto> selectErrorCost(Date startTime, Date endTime);
void updateCost(FinanceOrderCostWq financeOrderCostWq);
}
......@@ -2,9 +2,12 @@ package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.FinanceBaseProduct;
import java.util.List;
import java.util.Map;
public interface FinianceBaseProductDao {
Map<String, FinanceBaseProduct> selectBaseProduct();
Map<String, FinanceBaseProduct> selectBaseProductCost(List<String> goodNos);
}
package com.sfa.job.domain.order.dao.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sfa.job.domain.order.dao.FinianceBaseProductDao;
......@@ -22,10 +23,21 @@ public class FinianceBaseProductDaoImpl implements FinianceBaseProductDao {
@Override
public Map<String, FinanceBaseProduct> selectBaseProduct() {
// 查询所有商品
List<FinanceBaseProduct> list = mapper.selectList(new LambdaQueryWrapper<>()) ;
List<FinanceBaseProduct> list = mapper.selectList(new LambdaQueryWrapper<>());
// 以料号为key,商品对象为value,放入map中
Map<String, FinanceBaseProduct> map = list.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getPrdCode(), v), HashMap::putAll);
return map;
}
@Override
public Map<String, FinanceBaseProduct> selectBaseProductCost(List<String> goodNos) {
List<FinanceBaseProduct> prdInfos = mapper.selectList(
new LambdaQueryWrapper<FinanceBaseProduct>()
.in(ObjectUtil.isNotEmpty(goodNos), FinanceBaseProduct::getPrdCode, goodNos));
Map<String, FinanceBaseProduct> map = prdInfos.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getPrdCode(), v), HashMap::putAll);
return map;
}
}
......@@ -4,9 +4,12 @@ import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.FinanceOrderDetailDao;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import com.sfa.job.domain.order.mapper.FinanceOrderDetailMapper;
import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
import com.sfa.job.pojo.response.FinanceOrderDetailListDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@DS("bi")
......@@ -25,4 +28,14 @@ public class FinianceOrderDetailDaoImpl implements FinanceOrderDetailDao {
financeOrderDetailMapper.saveOrUpdateBatch(batchLists);
}
}
@Override
public void updateCost(FinanceOrderCostWq wq) {
financeOrderDetailMapper.updateCost(wq);
}
@Override
public List<FinanceOrderDetailListDto> selectErrorCost(Date startTime, Date endTime) {
return financeOrderDetailMapper.selectErrorCost(startTime, endTime);
}
}
......@@ -3,13 +3,22 @@ package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
import com.sfa.job.pojo.response.FinanceOrderDetailListDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
@Mapper
public interface FinanceOrderDetailMapper extends BaseMapper<FinanceOrderDetail> {
void saveOrUpdateBatch(@Param(value = "list") List<FinanceOrderDetail> mergeList);
void updateCost(FinanceOrderCostWq wq);
List<FinanceOrderDetailListDto> selectErrorCost(@Param(value = "startTime")Date startTime, @Param(value = "endTime")Date endTime);
}
package com.sfa.job.domain.order.wq;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class FinanceOrderCostWq {
private String goodsNo;
private BigDecimal actualCost;
private BigDecimal standardCost;
private Date startTime;
private Date endTime;
}
package com.sfa.job.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* finance_base_product 表对应的 料号基本信息表。
* 主要字段实际成本、标准成本、规格、口味
* @author lvbencai
* @date 2025年01月07日10:04:25
*/
@Data
public class FinanceBaseProductDto {
// 唯一标识主键
private Integer fbpId;
// 料号
private String prdCode;
// 品名
private String prdName;
// 规格
private String prdBarCode;
// 实际成本
private BigDecimal actualCost;
// 标准成本
private BigDecimal standardCost;
// 一级分类
private String firstCategory;
// 二级分类
private String secondCategory;
// 规格
private String spec;
// 口味
private String flavor;
// 系列
private String series;
// 产品分类编码
private String productClassificationCode;
// 产品分类
private String productClassification;
// 主分群码(重复字段,可根据实际需求调整)
private String mainGroupCode;
// 主分群码名称
private String mainGroupName;
// 料件类别(重复字段,可根据实际需求调整)
private String materialType;
// 料件类别描述
private String materialTypeName;
// 基础单位
private String basicUnit;
// 生命周期状态
private String lifeCycleStatus;
// 生命周期
private String lifeCycle;
}
package com.sfa.job.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 财务聚合后查看的详情信息,来自订单明细DTO
* @date : 2025-01-15 17:01:00
* @author : lvbencai
*/
@Data
public class FinanceOrderDetailListDto {
// 订单编号
private String tradeNo;
// 店铺名称
private String shopName;
// 原始单号
private String srcTid;
// 原始子单号
private String srcOid;
// 订单状态
private String tradeStatus;
// 交易时间
private String tradeTime;
// 付款时间
private Date payTime;
// 发货时间
private Date consignTime;
// 省市县(收货地区)
private String receiverArea;
// 备注
private String remark;
// 应收金额
private BigDecimal receivable;
// 货品编号
private String goodsNo;
// 货品名称
private String goodsName;
// 规格名称
private String specName;
// 分类(货品类型)
private Integer goodsType;
// 数量
private BigDecimal num;
// 优惠
private BigDecimal discount;
// 分摊后总价
private BigDecimal shareAmount;
// 组合装编码
private String suiteNo;
// 组合装名称
private String suiteName;
// 组合装数量
private BigDecimal suiteNum;
// 赠品方式
private Integer giftType;
// 分销商名称
private String fenxiaoName;
// 分销商编号
private String fenxiaoId;
// 平台货品名称
private String apiGoodsName;
}
package com.sfa.job.pojo.response;
import lombok.Data;
import java.util.List;
/**
* 财务同步旺店通修改结果
*
* @author : lvbencai
* @date : 2025-03-25
*/
@Data
public class FinanceOrderDetailUpdateDto {
private List<String> errorList;
private List<FinanceOrderDetailListDto> errorDetailList;
private int totalCount;
}
package com.sfa.job.service.order;
import com.sfa.job.pojo.response.FinanceOrderDetailUpdateDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import java.util.Date;
......@@ -10,5 +11,5 @@ public interface FinanceOrderSyncService {
SyncOrderDetailDto syncWdtRefundOrder(Date startTime, Date endTime, Integer syncType);
SyncOrderDetailDto updateZbjType(Date startTime, Date endTime);
FinanceOrderDetailUpdateDto updateCost(Date startTime, Date endTime);
}
......@@ -11,11 +11,10 @@ import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.DateUtils;
import com.sfa.job.domain.order.dao.*;
import com.sfa.job.domain.order.entity.*;
import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
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.SyncOrderDetailDto;
import com.sfa.job.pojo.response.WangdiantongQueryDto;
import com.sfa.job.pojo.response.*;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.sfa.job.util.WangdiantongUtil;
import lombok.extern.slf4j.Slf4j;
......@@ -26,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 旺店通订单Service业务层处理
......@@ -326,11 +326,42 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
* @return
*/
@Override
public SyncOrderDetailDto updateZbjType(Date startTime, Date endTime) {
// 循环查询订单
return null;
public FinanceOrderDetailUpdateDto updateCost(Date startTime, Date endTime) {
// 查询有问题的goods_no
List<FinanceOrderDetailListDto> errorCostDetails = orderDetailDao.selectErrorCost(startTime, endTime);
List<String > errorGoodsNos = new ArrayList<>();
if(ObjectUtil.isNotEmpty(errorCostDetails)){
List<String> goodNos = errorCostDetails.stream().map(FinanceOrderDetailListDto::getGoodsNo).collect(Collectors.toList());
// 有问题的料号数据,查询产品基础信息表
Map<String, FinanceBaseProduct> productMap = baseProductDao.selectBaseProductCost(goodNos);
// 查询当前的成本数据
for (int i = 0; i < goodNos.size(); i++) {
String goodsNo = goodNos.get(i);
FinanceBaseProduct financeBaseProduct = productMap.get(goodsNo);
if(ObjectUtil.isNotEmpty(financeBaseProduct) && financeBaseProduct.getActualCost().compareTo(new BigDecimal("0"))>0){
// 循环修改数据
BigDecimal actualCost = financeBaseProduct.getActualCost();
BigDecimal standardCost = financeBaseProduct.getStandardCost();
FinanceOrderCostWq financeOrderCostWq = new FinanceOrderCostWq();
financeOrderCostWq.setGoodsNo(goodsNo);
financeOrderCostWq.setActualCost(actualCost);
financeOrderCostWq.setStandardCost(standardCost);
financeOrderCostWq.setStartTime(startTime);
financeOrderCostWq.setEndTime(endTime);
orderDetailDao.updateCost(financeOrderCostWq);
}else{
log.error("料号{}没有查询到数据",goodsNo);
errorGoodsNos.add(goodsNo);
}
}
}
FinanceOrderDetailUpdateDto updateDto = new FinanceOrderDetailUpdateDto();
updateDto.setErrorList(errorGoodsNos);
updateDto.setTotalCount(errorCostDetails.size());
updateDto.setErrorDetailList(errorCostDetails);
return updateDto;
}
/**
......@@ -377,11 +408,7 @@ public class FinanceOrderSyncServiceImpl implements FinanceOrderSyncService {
private boolean validateStartTime(SyncOrderDetailDto detailDto) {
Date currentLatest = DateUtils.addHours(new Date(), -2);
if (currentLatest.compareTo(detailDto.getEndTime()) < 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(detailDto.getEndTime()), DateUtil.formatDateTime(currentLatest));
detailDto.setMessage(message);
log.warn(message);
......
......@@ -4,6 +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.FinanceOrderDetailUpdateDto;
import com.sfa.job.pojo.response.SyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.xxl.job.core.context.XxlJobContext;
......@@ -13,6 +14,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author : 吕本才
* @date : 2025-01-15 13:03:51
......@@ -54,7 +57,7 @@ public class FinanceOrderTask {
return detailDto;
}
/**
* 同步部门数据
* 同步退换货数据
*/
@XxlJob("syncWdtRefundOrder")
public SyncOrderDetailDto syncWdtRefundOrder() {
......@@ -83,4 +86,30 @@ public class FinanceOrderTask {
}
return detailDto;
}
/**
* 定时修改成本为0的订单数据
*/
@XxlJob("syncUpdateCost")
public FinanceOrderDetailUpdateDto syncUpdateCost() {
// 暂不考虑分片
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接口数据");
// 定时任务不设定开始时间和结束时间
Date startTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(),-1));
Date endTime = DateUtil.endOfDay(DateUtil.offsetDay(new Date(),-1));
FinanceOrderDetailUpdateDto detailDto = financeOrderSyncService.updateCost(startTime,endTime);
XxlJobHelper.log("修改旺店通订单明细结束-旺店通订单明细api接口数据, 共修改订单数{}条数据", detailDto.getTotalCount());
XxlJobHelper.handleSuccess(JSONObject.toJSONString(detailDto));
return detailDto;
}
}
......@@ -27,7 +27,7 @@
#{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}
#{item.series}, #{item.delFlag}
)
</foreach>
......@@ -127,7 +127,8 @@
<!-- 根据 rec_id 查询单条记录 -->
<select id="selectByRecId" resultMap="BaseResultMap">
select <include refid="Base_Column_List"></include>
select
<include refid="Base_Column_List"></include>
from finance_order_detail
where rec_id = #{recId}
</select>
......@@ -142,7 +143,8 @@
<sql id="Base_Column_List">
trade_id, rec_id, platform_id, src_oid, src_tid, pay_status, refund_status, platform_status, delivery_term,
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,
......@@ -248,4 +250,27 @@
<result column="sum_actual_cost" property="sumActualCost" jdbcType="DECIMAL"/>
<result column="sum_standard_cost" property="sumStandardCost" jdbcType="DECIMAL"/>
</resultMap>
<update id="updateCost" parameterType="com.sfa.job.domain.order.wq.FinanceOrderCostWq">
update finance_order_detail fod
set fod.actual_cost =#{actualCost},
fod.standard_cost =#{standardCost},
fod.sum_actual_cost = #{actualCost} * num,
fod.sum_standard_cost = #{standardCost} * num
where shop_no IN ('016', '070', '091')
and fod.consign_time between #{startTime} and #{endTime}
and refund_status != 5 and fod.actual_cost =0
AND fod.goods_no =#{goodsNo}
</update>
<!-- 查询成本为0的订单详情-->
<select id="selectErrorCost" resultType="com.sfa.job.pojo.response.FinanceOrderDetailListDto">
select distinct fod.goods_no as goodsNo,
fod.goods_name as goodsName
from finance_order_detail fod
where shop_no IN ('016', '070', '091')
and fod.consign_time between #{startTime} and #{endTime}
and refund_status!= 5 and fod.actual_cost =0
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论