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

Accept Merge Request #103: (qa -> main)

Merge Request: 上线财务成本统计需求 Created By: @吕本才 Accepted By: @吕本才 URL: https://g-pkkp8204.coding.net/p/wangxiaolu-sfa/d/wangxiaolu-link-module-bi/git/merge/103?initial=true
......@@ -87,10 +87,7 @@
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
......
package com.link.bi.config;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Data
@Configuration
public class ThreadPoolConfig {
private int maxPoolSize = 20;
private int corePoolSize = 5;
private int queueCapacity = 20;
@Bean
public Executor customThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("CustomThreadPool-");
executor.initialize();
return executor;
}
}
package com.link.bi.config.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.link.bi.pojo.response.FinanceBaseZbjTypeImportDto;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* 直播间分类导入监听
* @author lvbcai
* @date 2025年01月07日10:04:25
*/
@Data
@Slf4j
public class FinanceBaseZbjTypeListener extends AnalysisEventListener<FinanceBaseZbjTypeImportDto> {
// 存储解析后的数据
private List<FinanceBaseZbjTypeImportDto> dataList = new ArrayList<>();
@Override
public void invoke(FinanceBaseZbjTypeImportDto data, AnalysisContext context) {
// 每解析一行数据就会调用该方法
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 解析完所有数据后调用该方法
}
public List<FinanceBaseZbjTypeImportDto> getDataList() {
return dataList;
}
}
package com.link.bi.controller.query;
import com.link.bi.pojo.request.FinanceBaseZbjTypeListVo;
import com.link.bi.pojo.response.FinanceZbjTypeListDto;
import com.link.bi.service.FinanceBaseZbjTypeService;
import com.sfa.common.core.web.controller.BaseController;
import com.sfa.common.security.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 财务分析-直播间分类基础数据
*
* @author admin
* @date 2024-12-19
*/
@RestController
@RequestMapping("/finance/baseZbjType")
public class FinanceBaseZbjTypeController extends BaseController {
@Autowired
private FinanceBaseZbjTypeService baseZbjTypeService;
/**
* 直播间分类的页面查询
* @param zbjTypeListVo
* @return
*/
@RequiresPermissions("bi:livecate:list")
@GetMapping("/list")
public List<FinanceZbjTypeListDto> baseZbjTypeAllList(FinanceBaseZbjTypeListVo zbjTypeListVo) {
return baseZbjTypeService.baseZbjTypeAllList(zbjTypeListVo);
}
@RequiresPermissions("bi:livecate:list")
@PostMapping("/import")
public String importData(@RequestParam("file") MultipartFile file) {
return baseZbjTypeService.importData(file);
}
}
package com.link.bi.controller.query;
import com.github.pagehelper.PageInfo;
import com.link.bi.pojo.request.FinanceCostVo;
import com.link.bi.pojo.request.FinanceSelectCommonVo;
import com.link.bi.pojo.response.FinanceBaseProductListDto;
import com.link.bi.pojo.response.FinanceZbjTypeListDto;
import com.link.bi.service.FinanceBaseProductService;
import com.link.bi.service.FinanceBaseZbjTypeService;
import com.link.bi.service.FinanceOrderDetailService;
import com.sfa.common.core.web.controller.BaseController;
import com.sfa.common.security.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 财务bi分析
*
* @author admin
* @date 2024-12-19
*/
@RestController
@RequestMapping("/finance")
public class FinanceOrderQueryController extends BaseController {
@Autowired
private FinanceOrderDetailService detailService;
@Autowired
private FinanceBaseZbjTypeService baseZbjTypeService;
@Autowired
private FinanceBaseProductService baseProductService;
/**
* 财务成本聚合列表
*/
@RequiresPermissions("bi:finance:list")
@PostMapping("/cost/list")
public PageInfo selectBiFinanceCostList(@RequestBody FinanceCostVo financeCostVo) {
return detailService.selectBiFinanceCostList(financeCostVo);
}
/**
* 财务成本聚合详情查询
*/
@RequiresPermissions("bi:finance:list")
@PostMapping("/cost/detail/list")
public PageInfo selectBiFinanceCostDetailList(@RequestBody FinanceCostVo financeCostVo) {
return detailService.selectBiFinanceCostDetailPage(financeCostVo);
}
// 直播间类型下拉列表用
@RequiresPermissions("bi:finance:list")
@GetMapping("/zbjType/list")
public List<FinanceZbjTypeListDto> baseZbjTypeList(FinanceSelectCommonVo commonVo) {
return baseZbjTypeService.baseZbjTypeList(commonVo);
}
// 口味
@RequiresPermissions("bi:finance:list")
@GetMapping("/flavor/list")
public List<FinanceBaseProductListDto> flavorList(FinanceSelectCommonVo commonVo) {
return baseProductService.flavorList(commonVo);
}
// 规格
@RequiresPermissions("bi:finance:list")
@GetMapping("/spec/list")
public List<FinanceBaseProductListDto> specList(FinanceSelectCommonVo commonVo) {
return baseProductService.specList(commonVo);
}
// 系列
@RequiresPermissions("bi:finance:list")
@GetMapping("/series/list")
public List<FinanceBaseProductListDto> seriesList(FinanceSelectCommonVo commonVo) {
return baseProductService.seriesList(commonVo);
}
// 商品名称
@RequiresPermissions("bi:finance:list")
@GetMapping("/productName/list")
public List<FinanceBaseProductListDto> productNameList(FinanceSelectCommonVo commonVo) {
return baseProductService.productNameList(commonVo);
}
@RequiresPermissions("bi:finance:list")
@PostMapping("/cost/subList")
public PageInfo selectBiFinanceCostSubList(@RequestBody FinanceCostVo financeCostVo) {
return detailService.selectBiFinanceCostList(financeCostVo);
}
@RequiresPermissions("bi:finance:list")
@PostMapping("/cost/export")
public void exportBiFinanceCostList(@RequestBody FinanceCostVo financeCostVo, HttpServletResponse response) {
detailService.exportBiFinanceCostList(financeCostVo,response);
}
}
package com.link.bi.domain.dao;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.link.bi.domain.entity.CollectOrderLog;
import java.util.Date;
import java.util.List;
public interface CollectOrderLogDao {
// 插入一条记录
void insert(CollectOrderLog collectOrderLog);
Date selectOrderSyncLatest(Integer syncType);
List<CollectOrderLog> list(Wrapper<CollectOrderLog> queryWrapper);
}
package com.link.bi.domain.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.bi.domain.entity.FinanceBaseProduct;
import com.link.bi.pojo.response.FinanceBaseProductDto;
import java.util.List;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单DAO
*/
public interface IFinanceBaseProductDao {
List<FinanceBaseProductDto> list(LambdaQueryWrapper<FinanceBaseProduct> queryWrapper);
}
package com.link.bi.domain.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import java.util.List;
/**
* @author : lvbencai
* @date : 2025年01月14日
* @describe : 财务抖音直播间类型DAO
*/
public interface IFinanceBaseZbjTypeDao {
List<FinanceBaseZbjType> list(LambdaQueryWrapper<FinanceBaseZbjType> queryWrapper);
Page<FinanceBaseZbjType> page(Page<FinanceBaseZbjType> pageI, QueryWrapper<FinanceBaseZbjType> queryWrapper);
void removeByIds(List<Long> idsToDelete);
void saveBatch(List<FinanceBaseZbjType> recordsToSave);
void updateBatchById(List<FinanceBaseZbjType> recordsToUpdate);
void saveOrUpdateBatch(List<FinanceBaseZbjType> dataList);
}
package com.link.bi.domain.dao;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单DAO
*/
public interface IFinanceOrderDao {
}
package com.link.bi.domain.dao;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.wq.FinanceCostWq;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单明细DAO
*/
public interface IFinanceOrderDetailDao {
PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq wq);
PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq wq);
}
package com.link.bi.domain.dao;
import com.link.bi.domain.entity.PrdInfo;
import com.link.bi.domain.wq.ProductWq;
import com.link.bi.pojo.response.PrdInfoDto;
import com.sfa.common.core.web.domain.PageInfo;
......@@ -20,4 +21,6 @@ public interface IProductDao {
List<PrdInfoDto> selectListByIds(List<Integer> ids);
List<PrdInfoDto> selectListByCodes(List<String> prdCodes);
List<PrdInfo> selectProdSeries();
}
package com.link.bi.domain.dao.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.bi.domain.dao.CollectOrderLogDao;
import com.link.bi.domain.entity.CollectOrderLog;
import com.link.bi.domain.mapper.CollectOrderLogMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Repository
public class CollectOrderLogDaoImpl implements CollectOrderLogDao {
@Autowired
private CollectOrderLogMapper logInfoMapper;
@Override
public void insert(CollectOrderLog collectOrderLog) {
logInfoMapper.insert(collectOrderLog);
}
@Override
public Date selectOrderSyncLatest(Integer syncType) {
// 查询最新发货日期
List<CollectOrderLog> orderList = logInfoMapper.selectList(
new LambdaQueryWrapper<CollectOrderLog>()
// 默认查询xxljob自动同步时间
.eq(CollectOrderLog::getSyncType,syncType)
.eq(CollectOrderLog::getDelFlag,0)
.orderByDesc(CollectOrderLog::getUpdateTime)
.last("LIMIT 1"));
if(ObjectUtils.isNotEmpty(orderList)){
// 最新的数据日期
return orderList.get(0).getLatestTime();
}
return null;
}
@Override
public List<CollectOrderLog> list(Wrapper<CollectOrderLog> queryWrapper) {
return logInfoMapper.selectList(queryWrapper);
}
}
package com.link.bi.domain.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.bi.domain.dao.IFinanceBaseProductDao;
import com.link.bi.domain.entity.FinanceBaseProduct;
import com.link.bi.domain.mapper.FinanceBaseProductMapper;
import com.link.bi.pojo.response.FinanceBaseProductDto;
import com.sfa.common.core.utils.bean.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : lvbencai
* @date : 2025-01-14 17:00:00
* @describe :财务抖音订单数据 商品的信息DAO
*/
@Slf4j
@Service
public class FinanceBaseProductDaoImpl implements IFinanceBaseProductDao {
@Autowired
private FinanceBaseProductMapper mapper;
@Override
public List<FinanceBaseProductDto> list(LambdaQueryWrapper<FinanceBaseProduct> queryWrapper) {
List<FinanceBaseProduct> financeBaseProducts = mapper.selectList(queryWrapper);
return BeanUtils.transitionDtos(financeBaseProducts,FinanceBaseProductDto.class);
}
}
package com.link.bi.domain.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.link.bi.domain.dao.IFinanceBaseZbjTypeDao;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import com.link.bi.domain.mapper.FinanceBaseZbjTypeMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : lvbencai
* @date : 2025-01-14 17:30:00
* @describe : 财务抖音订单明细中,直播间类型
*/
@Slf4j
@Service
public class FinanceBaseZbjTypeDaoImpl implements IFinanceBaseZbjTypeDao {
@Autowired
private FinanceBaseZbjTypeMapper mapper;
@Override
public List<FinanceBaseZbjType> list(LambdaQueryWrapper<FinanceBaseZbjType> queryWrapper) {
return mapper.selectList(new LambdaQueryWrapper<>());
}
@Override
public Page<FinanceBaseZbjType> page(Page<FinanceBaseZbjType> page, QueryWrapper<FinanceBaseZbjType> queryWrapper) {
return mapper.selectPage(page, queryWrapper);
}
@Override
public void removeByIds(List<Long> idsToDelete) {
mapper.deleteBatchIds(idsToDelete);
}
@Override
public void saveBatch(List<FinanceBaseZbjType> dataList) {
for (FinanceBaseZbjType data : dataList) {
mapper.insert(data);
}
}
@Override
public void updateBatchById(List<FinanceBaseZbjType> dataList) {
for (FinanceBaseZbjType data : dataList) {
mapper.updateById(data);
}
}
@Override
public void saveOrUpdateBatch(List<FinanceBaseZbjType> dataList) {
for (int i = 0; i < dataList.size(); i += 100) {
int toIndex = Math.min(i + 100, dataList.size());
List<FinanceBaseZbjType> batchLists = dataList.subList(i, toIndex);
mapper.saveOrUpdateBatch(batchLists);
}
}
}
package com.link.bi.domain.dao.impl;
import com.link.bi.domain.dao.IFinanceOrderDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author : lvbencai
* @date : 2025-01-14 17:31:05
* @describe : 财务抖音订单数据
*/
@Slf4j
@Service
public class FinanceOrderDaoImpl implements IFinanceOrderDao {
}
package com.link.bi.domain.dao.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.dao.IFinanceOrderDetailDao;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.mapper.FinanceOrderDetailMapper;
import com.link.bi.domain.wq.FinanceCostWq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : lvbencai
* @date : 2024-12-10 16
* @describe : 旺店通订单明细
*/
@Slf4j
@Service
public class FinanceOrderDetailDaoImpl implements IFinanceOrderDetailDao {
@Autowired
FinanceOrderDetailMapper detailMapper;
/**
* 查询分页数据
* @param wq
* @return
*/
@Override
public PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq wq) {
// 查询分页数据
PageHelper.startPage(wq.getPageNum(), wq.getPageSize());
List<FinanceOrderDetail> financeOrderDetails = detailMapper.selectBiFinanceCostList( wq);
PageInfo<FinanceOrderDetail> pageInfo = new PageInfo<>(financeOrderDetails);
return pageInfo;
}
@Override
public PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq wq) {
// 查询分页数据
PageHelper.startPage(wq.getPageNum(), wq.getPageSize());
List<FinanceOrderDetail> financeOrderDetails = detailMapper.selectBiFinanceCostDetailList( wq);
PageInfo<FinanceOrderDetail> pageInfo = new PageInfo<>(financeOrderDetails);
return pageInfo;
}
}
......@@ -42,14 +42,14 @@ public class ProductDaoImpl implements IProductDao {
@Override
public PageInfo productPage(ProductWq pqw) {
LambdaQueryWrapper<PrdInfo> qw = new LambdaQueryWrapper<>();
if (Objects.nonNull(pqw.getSeriesId())){
qw.eq(PrdInfo::getSeriesId,pqw.getSeriesId());
if (Objects.nonNull(pqw.getSeriesId())) {
qw.eq(PrdInfo::getSeriesId, pqw.getSeriesId());
}
if (StringUtils.isNotBlank(pqw.getPrdCode())){
qw.eq(PrdInfo::getPrdCode,pqw.getPrdCode());
if (StringUtils.isNotBlank(pqw.getPrdCode())) {
qw.eq(PrdInfo::getPrdCode, pqw.getPrdCode());
}
if (StringUtils.isNotBlank(pqw.getPrdNameLike())){
qw.like(PrdInfo::getPrdName,pqw.getPrdNameLike());
if (StringUtils.isNotBlank(pqw.getPrdNameLike())) {
qw.like(PrdInfo::getPrdName, pqw.getPrdNameLike());
}
Page<PrdInfo> page = prdInfoMapper.selectPage(TableSupport.pageI(), qw);
......@@ -64,7 +64,17 @@ public class ProductDaoImpl implements IProductDao {
@Override
public List<PrdInfoDto> selectListByCodes(List<String> prdCodes) {
List<PrdInfo> prdInfos = prdInfoMapper.selectList(new LambdaQueryWrapper<PrdInfo>().in(ObjectUtil.isNotEmpty(prdCodes),PrdInfo::getPrdCode, prdCodes));
List<PrdInfo> prdInfos = prdInfoMapper.selectList(new LambdaQueryWrapper<PrdInfo>().in(ObjectUtil.isNotEmpty(prdCodes), PrdInfo::getPrdCode, prdCodes));
return BeanUtils.transitionDtos(prdInfos, PrdInfoDto.class);
}
@Override
public List<PrdInfo> selectProdSeries() {
List<PrdInfo> prdInfos = prdInfoMapper.selectList(
new LambdaQueryWrapper<PrdInfo>()
.select(PrdInfo::getSeries, PrdInfo::getPrdCode, PrdInfo::getPrdName)
.groupBy(PrdInfo::getSeries, PrdInfo::getPrdCode, PrdInfo::getPrdName));
return prdInfos;
}
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
/**
* CollectErrorInfo 类表示采集错误记录,与数据库表 market_bi.collect_error_info 相对应。
* 包含了采集错误记录的各种信息,如唯一键、入参信息、类型、采集时间、删除标志、创建和更新的用户及时间等。
*/
@TableName(value ="collect_error_log")
@Data
public class CollectErrorLog {
/**
* 唯一键,自动递增
*/
@TableId(type = IdType.AUTO)
private Long ceiId;
/**
* 入参信息,存储为 JSON 格式
*/
private Map<String, Object> param;
/**
* 类型,如 xxljob、影刀等
*/
private String type;
/**
* 采集时间
*/
private Date collectTime;
/**
* 是否删除标志,'0' 表示未删除,'1' 表示已删除
*/
private char delFlag;
/**
* 创建者
*/
private String createBy;
/**
* 创建人 UserID
*/
private Long createUserId;
/**
* 创建时间,默认为当前时间
*/
private LocalDateTime createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 修改人 UserID
*/
private Long updateUserId;
/**
* 更新时间,自动更新为当前时间
*/
private LocalDateTime updateTime;
/**
* 采集批次
*/
private String batchNo;
/**
* 本批次采集开始时间
*/
private Date startTime;
/**
* 本批次采集结束时间
*/
private Date endTime;
/**
* 错误信息
*/
private String errorMsg;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 采集订单日志信息
*
* @TableName collect_order_log_info
* @author lvbencai
* @date 2025-01-16 22:58:38
* @description
*/
@Data
@TableName("collect_order_log")
public class CollectOrderLog implements Serializable {
/**
* 唯一键,用于唯一标识采集订单日志信息记录
*/
@TableId(value = "cli_id",type= IdType.AUTO)
private Long cliId;
private String method;
/**
* 采集订单的数量,存储为字符串,长度不超过 20 个字符
*/
private Integer orderCount;
/**
* 采集订单的详细数量,存储为字符串,长度不超过 20 个字符
*/
private Integer orderDetailCount;
/**
* 采集批次信息,可存储长度不超过 30 个字符,使用 utf8mb4 字符集和 utf8mb4_0900_ai_ci 校对规则
*/
private String batchNo;
/**
* 采集的最新时间,代表上一次采集的结束时间,存储为日期时间类型
*/
private Date latestTime;
/**
* 是否删除的标志,'0' 表示未删除,'1' 表示已删除,使用 utf8mb3 字符集和 utf8mb3_general_ci 校对规则
*/
private String delFlag;
/**
* 创建者信息,存储为长度不超过 20 个字符的字符串
*/
private String createBy;
/**
* 创建人的用户 ID,存储为长整型
*/
private Long createUserId;
/**
* 创建时间,存储为日期时间类型,使用数据库的当前时间作为默认值
*/
private Date createTime;
/**
* 更新者信息,存储为长度不超过 20 个字符的字符串
*/
private String updateBy;
/**
* 修改人的用户 ID,存储为长整型
*/
private Long updateUserId;
/**
* 更新时间,存储为日期时间类型,更新时自动更新为当前时间
*/
private Date updateTime;
private Integer syncType;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sfa.common.core.annotation.Excel;
......@@ -24,6 +26,7 @@ public class EcBaStoreDailyData extends BaseDo
private static final long serialVersionUID = 1L;
/** id标识 */
@TableId(type = IdType.AUTO)
private Long ebtId;
/** 年份 */
......
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
* finance_base_product 表对应的 料号基本信息表。
* 主要字段实际成本、标准成本、规格、口味
* @author lvbencai
* @date 2025年01月07日10:04:25
*/
@TableName(value = "finance_base_product")
@Data
public class FinanceBaseProduct {
// 唯一标识主键
@TableId(type = IdType.AUTO)
private Integer fbpId;
// 料号
private String prdCode;
// 品名
private String prdName;
// 规格
private String prdBarCode;
// 实际成本
private BigDecimal actualCost;
// 标准成本
private BigDecimal standardCost;
// 一级分类
private String firstCategory;
// 二级分类
private String secondCategory;
// 规格
private String spec;
// 口味
private String flavor;
// 系列
private String series;
// 产品分类编码
private String productClassificationCode;
// 产品分类
private String productClassification;
// 主分群码(重复字段,可根据实际需求调整)
private String mainGroupCode;
// 主分群码名称
private String mainGroupName;
// 料件类别(重复字段,可根据实际需求调整)
private String materialType;
// 料件类别描述
private String materialTypeName;
// 基础单位
private String basicUnit;
// 生命周期状态
private String lifeCycleStatus;
// 生命周期
private String lifeCycle;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* finance_base_zbj_type 表对应的直播间分类细腻系表。
* 主要字段直播间渠道类型、分销商名称
* @author lvbcai
* @date 2025年01月07日10:04:25
*/
@TableName(value = "finance_base_zbj_type")
@Data
public class FinanceBaseZbjType {
// 唯一键
@TableId(type = IdType.AUTO)
private Long fbztId;
// 分销商名称
private String fenxiaoName;
// 直播间渠道类型 有分销商id,不是以上几类的,统一为达人 没有分销商id的,默认为商城
private String zbjQdType;
// 采集批次
private String batchNo;
// 备注
private String remark;
// 是否删除标志 0 未删除 1 已删除
private Integer delFlag;
// 创建者
private String createBy;
// 创建人 UserID
private Long createUserId;
// 创建时间
private LocalDateTime createTime;
// 更新者
private String updateBy;
// 修改人 UserID
private Long updateUserId;
// 更新时间
private LocalDateTime updateTime;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 旺店通订单明细表 wangdiantong_order_detail
*/
@TableName(value = "finance_order_detail")
@Data
public class FinanceOrderDetail {
// 订单唯一键
private Long tradeId;
// 订单明细唯一键
@TableId(type = IdType.NONE)
private Long recId;
// 平台ID
private Integer platformId;
// 原始子单号
private String srcOid;
// 原始单号
private String srcTid;
// 赠品方式 0、非赠品
// 1、自动赠送 2、手工赠送 4、周期购赠送 8、平台赠送 32、阶梯满赠 64、CRM追加赠送 128 主品
private Integer giftType;
// 0:未付款 1:部分付款 2:已付款(原始订单的支付状态)
private Integer payStatus;
// 退款状态:
// 0、无退款
// 1、取消退款
// 2、申请退款
// 3、待退款
// 4、待还原
// 5、退款成功
// 6、已退(未付款关闭,未付款的取消了)
private Integer refundStatus;
// 退款模式:
// 1、担保
// 2、非担保
// 3、在线非担保
private Integer guaranteeMode;
// 如果没有对应的原始单明细,则返回0.
// 平台状态:
// 10、未确认
// 20、待尾款
// 30、待发货
// 40、部分发货
// 50、已发货
// 60、已签收
// 70、已完成
// 80、已退款
// 90、已关闭
private Integer platformStatus;
// 发货条件:1、款到发货 2、货到付款(包含部分货到付款)
// 3、分期付款
private Integer deliveryTerm;
// 数量
private BigDecimal num;
// 标价,手工新建时使用货品属性中的“零售价”
private BigDecimal price;
// 售后退款数量
private BigDecimal refundNum;
// 成交价,原始单折扣及分摊之后的价格
private BigDecimal orderPrice;
// 分摊后价格,进入ERP后再次调整的价格,默认值与order_price一致
private BigDecimal sharePrice;
// 手工调整价,正数为加价,负数为减价,暂未处理
private BigDecimal adjust;
// 优惠
private BigDecimal discount;
// 分摊后总价=share_price*num
private BigDecimal shareAmount;
// 税率
private BigDecimal taxRate;
// 货品名称
private String goodsName;
// 货品编号
private String goodsNo;
// 规格名称
private String specName;
// 商家编码
private String specNo;
// 规格码
private String specCode;
// 组合装编码
private String suiteNo;
// 如果是组合装拆分的,此为组合装名称
private String suiteName;
// 组合装数量,不受拆分合并影响
private BigDecimal suiteNum;
// 组合装分摊后总价
private BigDecimal suiteAmount;
// 组合装优惠
private BigDecimal suiteDiscount;
// 平台货品名称
private String apiGoodsName;
// 平台规格名称
private String apiSpecName;
// 平台货品id
private String apiGoodsId;
// 平台规格id
private String apiSpecId;
// 货品id(系统货品主键)
private Integer goodsId;
// 单品id(系统单品主键)
private Integer specId;
// 佣金
private BigDecimal commission;
// 货品类型
// 1销售商品
// 2原材料
// 3包装
// 4周转材料
// 5虚拟商品
// 6固定资产
// 0其它
private Integer goodsType;
// 订单内部来源:
// 0:无来源
// 1:手机
// 2:聚划算
// 32:开具电子发票
// 2048:当日达
// 4096:次日达
// 8192:承诺时效
// 2097152:区域零售
// 4194304:拼多多厂家代打
// 8388608:周期购
// 1048576:预售单
// 33554432:前N有礼
// 524288:天猫物流升级
// 64:按需配送
// 256:承诺结构化/QIC
// 16384:商仓鸟配
private Integer fromMask;
// 子单备注
private String remark;
// 修改时间(毫秒级时间戳,例如:1631861379000)
private String modified;
// 创建时间(毫秒级时间戳,例如:1631861379000)
private String created;
// 自定义属性1
private String prop1;
// 自定义属性2
private String prop2;
// 货品重量(子单预估货品总重量)
private BigDecimal weight;
// 图片路径
private String imgUrl;
// 实发数量(此数量为发货数量,删除操作等于将此值设置为0)
private BigDecimal actualNum;
// 条码
private String barcode;
// 已付
private BigDecimal paid;
// 组合装id
private Integer suiteId;
// bind_oid
private String bindOid;
// 打印组合装
// 0:组合装明细
// 1:组合装及明细
// 2:组合装
private Integer printSuiteMode;
// 1:天猫物流升级-顺丰配送
// 2:需要回传
// 4:天猫物流升级-按需配送
// 8:天猫物流升级-承诺发货时效
// 16:天猫物流升级-承诺达时效
// 32:天猫物流升级-预售下沉
// 64:天猫物流升级-预计到货时效
// 128:天猫物流升级-配送线路异常
// 1024:定金链接
// 2048:补款链接
// 4096:确认收货
// (mask类型值. 在判断的时候使用&运算)
private Integer flag;
// 库存保留情况
// 0:未保留(取消的订单或完成)
// 1:无库存记录
// 2:未付款
// 3:已保留待审核
// 4:待发货
// 5:预订单库存
private Integer stockState;
// 平台已发货
private boolean isConsigned;
// 是否付款
private Integer isReceived;
// 平台类目主键
private Integer cid;
// 最后更新时间,DateTime格式
private Date modifiedDate;
// 创建时间,DateTime格式
private String createdDate;
// 分摊邮费
private BigDecimal sharePostPrice;
// 发票内容
private String invoiceContent;
// 支付时间,DateTime格式,取自原始订单支付时间
private Date payTime;
// 货品简称
private String shortName;
// 分销商昵称
private String fenxiaoNick;
// 分销商id
private String fenxiaoId;
// 分销商name
private String fenxiaoName;
// 批次号
private String batchNo;
// 采集开始时间
private Date startTime;
// 采集结束时间
private Date endTime;
// 2025年01月13日新增字段
private String tradeNo;
// 店铺编号
private String shopNo;
// 店铺名称
private String shopName;
// 店铺备注
private String shopRemark;
// 交易状态
private String 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;
/**
* 以下字段用于查询出来的聚合数据
*/
// 分摊后总价sum
@TableField(exist = false)
private BigDecimal shareAmountSum;
//实际总成本sum
@TableField(exist = false)
private BigDecimal sumActualCostSum;
//标准总成本sum
@TableField(exist = false)
private BigDecimal sumStandardCostSum;
@TableField(exist = false)
private String queryType;
/**
* 是否删除标志0未删除1已删除
*/
private String delFlag;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sfa.common.core.annotation.Excel;
......@@ -25,6 +27,7 @@ public class OppoCmm implements Serializable {
/**
* id标识
*/
@TableId(type = IdType.AUTO)
private Long cmmId;
/**
......
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sfa.common.core.annotation.Excel;
......@@ -24,6 +26,7 @@ public class OppoSycm implements Serializable {
/**
* id标识
*/
@TableId(type = IdType.AUTO)
private Long sycmId;
/**
......
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sfa.common.core.annotation.Excel;
......@@ -25,6 +27,7 @@ public class OppoSycmStore extends BaseDo implements Serializable {
/**
* id标识
*/
@TableId(type = IdType.AUTO)
private Long sycmsId;
/**
......
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.CollectOrderLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CollectOrderLogMapper extends BaseMapper<CollectOrderLog> {
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceBaseProduct;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceBaseProductMapper extends BaseMapper<FinanceBaseProduct> {
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface FinanceBaseZbjTypeMapper extends BaseMapper<FinanceBaseZbjType> {
void saveOrUpdateBatch(List<FinanceBaseZbjType> batchLists);
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.wq.FinanceCostWq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface FinanceOrderDetailMapper extends BaseMapper<FinanceOrderDetail> {
List<FinanceOrderDetail> selectBiFinanceCostList(@Param(value = "wq") FinanceCostWq wq);
List<FinanceOrderDetail> selectBiFinanceCostDetailList(@Param(value = "wq") FinanceCostWq wq);
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceOrder;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceOrderMapper extends BaseMapper<FinanceOrder> {
}
package com.link.bi.domain.mapper;
import com.link.bi.domain.entity.PrdInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.PrdInfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
......@@ -14,7 +14,6 @@ import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface PrdInfoMapper extends BaseMapper<PrdInfo> {
}
......
package com.link.bi.domain.wq;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @author : liqiulin
* @date : 2024-11-22 17
* @describe :
*/
@Data
public class FinanceCostWq {
// 入参 时间开始时间
private Date startDate;
// 入参 时间结束时间
private Date endDate;
private List<String> zbjQdType;
private List<String> flavor;
private List<String> specName;
private List<String> series;
private List<String> goodsName;
private Integer pageNum;
private Integer pageSize;
// 可以按照直播间类型和系列展开 null 不是展开查询 0 直播间类 1 系列
private Integer subType;
// 聚合的维度
// 直播间类型
private Boolean zbjQdTypeAll;
// 入参 口味
private Boolean flavorAll;
// 入参 规格
private Boolean specNameAll;
// 入参 系列
private Boolean seriesAll;
// 入参 商品名称
private Boolean goodsNameAll;
// 查询详情时 过滤数据
private String fenxiaoId;
}
package com.link.bi.pojo.request;
import lombok.Data;
/**
* 财务成本页面下拉选择框搜索的通用vo
*/
@Data
public class FinanceBaseZbjTypeListVo {
private String zbjQdType;
}
package com.link.bi.pojo.request;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class FinanceBaseZbjTypeVo {
// 入参 分页当前页
private Integer pageNum = 1;
// 入参 分页大小
private Integer pageSize =10;
// 入参 时间开始时间
private Date startDate;
// 入参 时间结束时间
private Date endDate;
// 直播间类型
private List<String> zbjQdType;
// 入参 口味
private List<String> flavor;
// 入参 规格
private List<String> specName;
// 入参 系列
private List<String> series;
// 入参 商品名称
private List<String> goodsName;
// 聚合的维度
// 直播间类型
private Boolean zbjQdTypeAll;
// 入参 口味
private Boolean flavorAll;
// 入参 规格
private Boolean specNameAll;
// 入参 系列
private Boolean seriesAll;
// 入参 商品名称
private Boolean goodsNameAll;
// 可以按照直播间类型和系列展开 null 不是展开查询 0 直播间类 1 系列
private Integer subType;
// 查询详情时 过滤数据
private String fenxiaoId;
// 下载类型 1 达人子分类 2、分销商分类 3、订单详情
private String type;
private String typeName;
}
package com.link.bi.pojo.request;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class FinanceCostVo {
// 平台id
private String platformId;
// 商铺
private List<String> shopNo;
// 入参 分页当前页
private Integer pageNum = 1;
// 入参 分页大小
private Integer pageSize =10;
// 入参 时间开始时间
private Date startDate;
// 入参 时间结束时间
private Date endDate;
// 直播间类型
private List<String> zbjQdType;
// 入参 口味
private List<String> flavor;
// 入参 规格
private List<String> specName;
// 入参 系列
private List<String> series;
// 入参 商品名称
private List<String> goodsName;
// 聚合的维度
// 直播间类型
private Boolean zbjQdTypeAll;
// 入参 口味
private Boolean flavorAll;
// 入参 规格
private Boolean specNameAll;
// 入参 系列
private Boolean seriesAll;
// 入参 商品名称
private Boolean goodsNameAll;
// 可以按照直播间类型和系列展开 null 不是展开查询 0 直播间类 1 系列
private Integer subType;
// 查询详情时 过滤数据
private String fenxiaoId;
// 下载类型 1 达人子分类 2、分销商分类 3、订单详情
private String type;
private String typeName;
}
package com.link.bi.pojo.request;
import lombok.Data;
/**
* 财务成本页面下拉选择框搜索的通用vo
*/
@Data
public class FinanceSelectCommonVo {
private String keyword;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 采集订单日志信息
*
* @author lvbencai
* @date a
* @description
*/
@Data
public class CollectOrderLogListDto implements Serializable {
/**
* 唯一键,用于唯一标识采集订单日志信息记录
*/
private Long cliId;
/**
* 采集订单的数量,存储为字符串,长度不超过 20 个字符
*/
private Integer orderCount;
/**
* 采集订单的详细数量,存储为字符串,长度不超过 20 个字符
*/
private Integer orderDetailCount;
/**
* 采集批次信息,可存储长度不超过 30 个字符,使用 utf8mb4 字符集和 utf8mb4_0900_ai_ci 校对规则
*/
private String batchNo;
/**
* 采集的最新时间,代表上一次采集的结束时间,存储为日期时间类型
*/
private Date latestTime;
/**
* 是否删除的标志,'0' 表示未删除,'1' 表示已删除,使用 utf8mb3 字符集和 utf8mb3_general_ci 校对规则
*/
private String delFlag;
/**
* 创建者信息,存储为长度不超过 20 个字符的字符串
*/
private String createBy;
/**
* 创建人的用户 ID,存储为长整型
*/
private Long createUserId;
/**
* 创建时间,存储为日期时间类型,使用数据库的当前时间作为默认值
*/
private Date createTime;
/**
* 更新者信息,存储为长度不超过 20 个字符的字符串
*/
private String updateBy;
/**
* 修改人的用户 ID,存储为长整型
*/
private Long updateUserId;
/**
* 更新时间,存储为日期时间类型,更新时自动更新为当前时间
*/
private Date updateTime;
private Integer syncType;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* 旺店通订单
*
* @author lvbencai
* @date 2025年02月26日17:21:01
*/
@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.link.bi.pojo.response;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* 财务成本计算基础产品信息列表DTO
* @date : 2025-01-15 17:01:00
* @author : lvbencai
*/
@Data
public class FinanceBaseProductListDto {
@JsonInclude(JsonInclude.Include.NON_NULL)
private Integer fbpId;
// 料号
@JsonInclude(JsonInclude.Include.NON_NULL)
private String prdCode;
// 品名
@JsonInclude(JsonInclude.Include.NON_NULL)
private String prdName;
// 规格
@JsonInclude(JsonInclude.Include.NON_NULL)
private String spec;
// 口味
@JsonInclude(JsonInclude.Include.NON_NULL)
private String flavor;
@JsonInclude(JsonInclude.Include.NON_NULL)
private String series;
}
package com.link.bi.pojo.response;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 财务订单明细聚合查询DTO
* @date : 2025-01-15 15:30:05
* @author : lvbencai
*/
@Data
public class FinanceBaseZbjTypeImportDto {
// 分销商名称
@ExcelProperty("分销商名称")
private String fenxiaoName;
// 直播间渠道类型 有分销商id,不是以上几类的,统一为达人 没有分销商id的,默认为商城
@ExcelProperty("渠道整理")
private String zbjQdType;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* 财务订单明细聚合查询DTO
* @date : 2025-01-15 15:30:05
* @author : lvbencai
*/
@Data
public class FinanceBiListDto {
// 前端展示用
private String uid;
// 主播渠道类型--来自备注字段
private String zbjQdType;
// 分销商id
private String fenxiaoId;
// 分销商name
private String fenxiaoName;
// 货品名称
private String goodsName;
// 货品编号
private String goodsNo;
// ERP规格名称 --来自T100的定义
private String specNameErp;
// ERP口味 --来自T100的定义
private String flavorErp;
// 分摊后总价
private BigDecimal shareAmountSum;
// 实际成本
private BigDecimal actualCostSum;
// 标准成本
private BigDecimal standardCostSum;
// 实际成本毛利
private BigDecimal actualCostGrossProfitSum;
// 标准成本毛利
private BigDecimal standardCostGrossProfitSum;
}
package com.link.bi.pojo.response;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 财务订单明细聚合查询DTO
* @date : 2025-01-15 15:30:05
* @author : lvbencai
*/
@Data
public class FinanceExportBiListDto {
// 前端展示用
@ExcelProperty(value = "唯一值")
private String uid;
// 主播渠道类型--来自备注字段
@ExcelProperty("主播间分类")
private String zbjQdType;
// 分销商id
@ExcelProperty("分销商id")
private String fenxiaoId;
// 分销商name
@ExcelProperty("分销商名称")
private String fenxiaoName;
// 货品名称
@ExcelProperty("商品名称")
private String goodsName;
// 货品编号
@ExcelProperty("商品编号")
private String goodsNo;
// ERP规格名称 --来自T100的定义
@ExcelProperty("规格")
private String specNameErp;
// ERP口味 --来自T100的定义
@ExcelProperty("口味")
private String flavorErp;
// 分摊后总价
@ExcelProperty("分摊后总价")
private BigDecimal shareAmountSum;
// 实际成本
@ExcelProperty("实际成本")
private BigDecimal actualCostSum;
// 标准成本
@ExcelProperty("标准成本")
private BigDecimal standardCostSum;
// 实际成本毛利
@ExcelProperty("实际成本毛利")
private BigDecimal actualCostGrossProfitSum;
// 标准成本毛利
@ExcelProperty("标准成本毛利")
private BigDecimal standardCostGrossProfitSum;
}
package com.link.bi.pojo.response;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 财务聚合后查看的详情信息,来自订单明细DTO
* @author : lvbencai
* @date : 2025-01-15 17:01:00
*/
@Data
public class FinanceExportOrderDetailListDto {
/**
* 订单编号
*/
@ExcelProperty("订单编号")
private String tradeNo;
/**
* 店铺名称
*/
@ExcelProperty("店铺名称")
private String shopName;
/**
* 原始单号
*/
@ExcelProperty("原始单号")
private String srcTid;
/**
* 原始子单号
*/
@ExcelProperty("原始子单号")
private String srcOid;
/**
* 订单状态
*/
@ExcelProperty("订单状态")
private String tradeStatus;
/**
* 交易时间
*/
@ExcelProperty("交易时间")
private String tradeTime;
/**
* 付款时间
*/
@ExcelProperty("付款时间")
private Date payTime;
/**
* 发货时间
*/
@ExcelProperty("发货时间")
private Date consignTime;
/**
* 省市县(收货地区)
*/
@ExcelProperty("收货地区(省市县)")
private String receiverArea;
/**
* 备注
*/
@ExcelProperty("备注")
private String remark;
/**
* 应收金额
*/
@ExcelProperty("应收金额")
private BigDecimal receivable;
/**
* 货品编号
*/
@ExcelProperty("货品编号")
private String goodsNo;
/**
* 货品名称
*/
@ExcelProperty("货品名称")
private String goodsName;
/**
* 规格名称
*/
@ExcelProperty("规格名称")
private String specName;
/**
* 分类(货品类型)
*/
@ExcelProperty("货品类型")
private Integer goodsType;
/**
* 数量
*/
@ExcelProperty("数量")
private BigDecimal num;
/**
* 优惠
*/
@ExcelProperty("优惠金额")
private BigDecimal discount;
/**
* 分摊后总价
*/
@ExcelProperty("分摊后总价")
private BigDecimal shareAmount;
/**
* 组合装编码
*/
@ExcelProperty("组合装编码")
private String suiteNo;
/**
* 组合装名称
*/
@ExcelProperty("组合装名称")
private String suiteName;
/**
* 组合装数量
*/
@ExcelProperty("组合装数量")
private BigDecimal suiteNum;
/**
* 赠品方式
*/
@ExcelProperty("赠品方式")
private Integer giftType;
/**
* 分销商名称
*/
@ExcelProperty("分销商名称")
private String fenxiaoName;
/**
* 分销商编号
*/
@ExcelProperty("分销商编号")
private String fenxiaoId;
/**
* 平台货品名称
*/
@ExcelProperty("平台货品名称")
private String apiGoodsName;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 财务聚合后查看的详情信息,来自订单明细DTO
* @date : 2025-01-15 17:01:00
* @author : lvbencai
*/
@Data
public class FinanceOrderDetailListDto {
// 订单编号
private String tradeNo;
// 店铺名称
private String shopName;
// 原始单号
private String srcTid;
// 原始子单号
private String srcOid;
// 订单状态
private 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.link.bi.pojo.response;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* 财务订单明细对应的直播间类型
* @date : 2025-01-15 17:01:00
* @author : lvbencai
*/
@Data
public class FinanceZbjTypeListDto {
// 分销商名称
@JsonInclude(JsonInclude.Include.NON_NULL)
private Long fbztId;
// 分销商名称
@JsonInclude(JsonInclude.Include.NON_NULL)
private String fenxiaoName;
// 直播间渠道类型 有分销商id,不是以上几类的,统一为达人 没有分销商id的,默认为商城
private String zbjQdType;
}
package com.link.bi.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.link.bi.domain.entity.CollectOrderLog;
import java.util.Date;
import java.util.List;
public interface CollectOrderLogInfoService {
List<CollectOrderLog> list(Wrapper<CollectOrderLog> queryWrapper);
Date selectOrderSyncLatest(Integer syncType);
}
package com.link.bi.service;
import com.link.bi.pojo.request.FinanceSelectCommonVo;
import com.link.bi.pojo.response.FinanceBaseProductDto;
import com.link.bi.pojo.response.FinanceBaseProductListDto;
import java.util.List;
import java.util.Map;
public interface FinanceBaseProductService {
Map<String, FinanceBaseProductDto> selectBaseProduct();
List<FinanceBaseProductListDto> flavorList(FinanceSelectCommonVo commonVo);
List<FinanceBaseProductListDto> specList(FinanceSelectCommonVo commonVo);
List<FinanceBaseProductListDto> productNameList(FinanceSelectCommonVo commonVo);
List<FinanceBaseProductListDto> seriesList(FinanceSelectCommonVo commonVo);
}
package com.link.bi.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.link.bi.pojo.request.FinanceBaseZbjTypeListVo;
import com.link.bi.pojo.request.FinanceSelectCommonVo;
import com.link.bi.pojo.response.FinanceZbjTypeListDto;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
public interface FinanceBaseZbjTypeService {
Map<String, String> selectBaseZbjType();
IPage<FinanceZbjTypeListDto> pageFinanceBaseZbjType(String keyword);
List<FinanceZbjTypeListDto> baseZbjTypeList(FinanceSelectCommonVo commonVo);
List<FinanceZbjTypeListDto> baseZbjTypeAllList(FinanceBaseZbjTypeListVo commonVo);
String importData(MultipartFile file);
}
package com.link.bi.service;
import com.github.pagehelper.PageInfo;
import com.link.bi.pojo.request.FinanceCostVo;
import com.link.bi.pojo.response.FinanceBiListDto;
import com.link.bi.pojo.response.FinanceOrderDetailListDto;
import javax.servlet.http.HttpServletResponse;
public interface FinanceOrderDetailService {
PageInfo<FinanceBiListDto> selectBiFinanceCostList(FinanceCostVo financeCostVo);
PageInfo<FinanceOrderDetailListDto> selectBiFinanceCostDetailPage(FinanceCostVo financeCostVo);
void exportBiFinanceCostList(FinanceCostVo financeCostVo, HttpServletResponse response);
}
package com.link.bi.service;
public interface FinanceOrderService {
}
package com.link.bi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.link.bi.domain.entity.EcGoodsSupplyDemand;
import com.link.bi.domain.wq.MarketDetailWq;
import org.springframework.web.multipart.MultipartFile;
......@@ -15,7 +14,7 @@ import java.util.Map;
* @author admin
* @date 2024-12-05
*/
public interface IEcGoodsSupplyDemandService extends IService<EcGoodsSupplyDemand> {
public interface IEcGoodsSupplyDemandService {
List<EcGoodsSupplyDemand> importData(MultipartFile ecGoodsSupplyDemand, Integer year);
......
......@@ -5,6 +5,7 @@ import com.link.bi.pojo.response.PrdInfoDto;
import com.sfa.common.core.web.domain.PageInfo;
import java.util.List;
import java.util.Map;
/**
* @author : liqiulin
......@@ -18,4 +19,6 @@ public interface IProductService {
PageInfo productPage(ProductVo productVo);
List<PrdInfoDto> selectListByCodes(List<String> codeLists);
Map<String, String> selectProdSeries();
}
package com.link.bi.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.link.bi.domain.dao.CollectOrderLogDao;
import com.link.bi.domain.entity.CollectOrderLog;
import com.link.bi.service.CollectOrderLogInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class CollectOrderLogInfoServiceImpl implements CollectOrderLogInfoService {
@Autowired
private CollectOrderLogDao dao;
@Override
public List<CollectOrderLog> list(Wrapper<CollectOrderLog> queryWrapper) {
return dao.list(queryWrapper);
}
/**
* 查询最新修改日期
* @return
*/
@Override
public Date selectOrderSyncLatest(Integer syncType) {
// 查询最新发货日期
Date date = dao.selectOrderSyncLatest(syncType);
return date;
}
}
......@@ -3,11 +3,9 @@ package com.link.bi.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.link.bi.config.listener.EcGoodsSupplyDemandListener;
import com.link.bi.domain.dao.IEcGoodsSupplyDemandDao;
import com.link.bi.domain.entity.EcGoodsSupplyDemand;
import com.link.bi.domain.mapper.EcGoodsSupplyDemandMapper;
import com.link.bi.domain.wq.MarketDetailWq;
import com.link.bi.pojo.response.PrdInfoDto;
import com.link.bi.service.IEcGoodsSupplyDemandService;
......@@ -31,7 +29,7 @@ import java.util.Map;
*/
@Service
@Slf4j
public class EcGoodsSupplyDemandServiceImpl extends ServiceImpl<EcGoodsSupplyDemandMapper, EcGoodsSupplyDemand> implements IEcGoodsSupplyDemandService {
public class EcGoodsSupplyDemandServiceImpl implements IEcGoodsSupplyDemandService {
@Autowired
IEcGoodsSupplyDemandDao demandDao;
......
package com.link.bi.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.bi.domain.dao.IFinanceBaseProductDao;
import com.link.bi.domain.entity.FinanceBaseProduct;
import com.link.bi.pojo.request.FinanceSelectCommonVo;
import com.link.bi.pojo.response.FinanceBaseProductDto;
import com.link.bi.pojo.response.FinanceBaseProductListDto;
import com.link.bi.service.FinanceBaseProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
@DS("bi")
@Slf4j
@Service
public class FinanceBaseProductServiceImpl implements FinanceBaseProductService {
@Autowired
private IFinanceBaseProductDao dao;
@Override
public Map<String, FinanceBaseProductDto> selectBaseProduct() {
// 查询所有商品
List<FinanceBaseProductDto> list = dao.list(new LambdaQueryWrapper<>());
// 以料号为key,商品对象为value,放入map中
Map<String, FinanceBaseProductDto> map = list.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getPrdCode(), v), HashMap::putAll);
return map;
}
@Override
public List<FinanceBaseProductListDto> flavorList(FinanceSelectCommonVo commonVo) {
LambdaQueryWrapper<FinanceBaseProduct> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(FinanceBaseProduct::getFlavor);
queryWrapper.like(commonVo.getKeyword() != null && !commonVo.getKeyword().isEmpty(), FinanceBaseProduct::getFlavor, commonVo.getKeyword());
queryWrapper.groupBy(FinanceBaseProduct::getFlavor);
queryWrapper.orderByDesc(FinanceBaseProduct::getFlavor);
List<FinanceBaseProductDto> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceBaseProductListDto> collect = list.stream()
.filter(Objects::nonNull)
.map(item -> {
FinanceBaseProductListDto dto = new FinanceBaseProductListDto();
dto.setFbpId(item.getFbpId());
dto.setPrdCode(item.getPrdCode());
dto.setPrdName(item.getPrdName());
dto.setFlavor(item.getFlavor());
return dto;
}).collect(Collectors.toList());
return collect;
}
@Override
public List<FinanceBaseProductListDto> specList(FinanceSelectCommonVo commonVo) {
LambdaQueryWrapper<FinanceBaseProduct> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(FinanceBaseProduct::getSpec);
queryWrapper.like(commonVo.getKeyword() != null && !commonVo.getKeyword().isEmpty(), FinanceBaseProduct::getSpec, commonVo.getKeyword());
queryWrapper.groupBy(FinanceBaseProduct::getSpec);
queryWrapper.orderByDesc(FinanceBaseProduct::getSpec);
List<FinanceBaseProductDto> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceBaseProductListDto> collect = list.stream()
.filter(Objects::nonNull)
.map(item -> {
FinanceBaseProductListDto dto = new FinanceBaseProductListDto();
BeanUtils.copyProperties(item, dto);
return dto;
}).collect(Collectors.toList());
return collect;
}
@Override
public List<FinanceBaseProductListDto> productNameList(FinanceSelectCommonVo commonVo) {
LambdaQueryWrapper<FinanceBaseProduct> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(FinanceBaseProduct::getPrdName);
queryWrapper.like(commonVo.getKeyword() != null && !commonVo.getKeyword().isEmpty(), FinanceBaseProduct::getPrdName, commonVo.getKeyword());
queryWrapper.groupBy(FinanceBaseProduct::getPrdName);
queryWrapper.orderByDesc(FinanceBaseProduct::getPrdName);
List<FinanceBaseProductDto> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceBaseProductListDto> collect = list.stream().map(item -> {
FinanceBaseProductListDto dto = new FinanceBaseProductListDto();
dto.setFbpId(item.getFbpId());
dto.setPrdCode(item.getPrdCode());
dto.setPrdName(item.getPrdName());
dto.setFlavor(item.getFlavor());
return dto;
}).collect(Collectors.toList());
return collect;
}
@Override
public List<FinanceBaseProductListDto> seriesList(FinanceSelectCommonVo commonVo) {
LambdaQueryWrapper<FinanceBaseProduct> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(FinanceBaseProduct::getSeries);
queryWrapper.like(commonVo.getKeyword() != null && !commonVo.getKeyword().isEmpty(), FinanceBaseProduct::getSeries, commonVo.getKeyword());
queryWrapper.groupBy(FinanceBaseProduct::getSeries);
queryWrapper.orderByDesc(FinanceBaseProduct::getSeries);
List<FinanceBaseProductDto> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceBaseProductListDto> collect = list.stream()
.filter(Objects::nonNull)
.map(item -> {
FinanceBaseProductListDto dto = new FinanceBaseProductListDto();
dto.setFbpId(item.getFbpId());
dto.setPrdCode(item.getPrdCode());
dto.setPrdName(item.getPrdName());
dto.setFlavor(item.getFlavor());
dto.setSeries(item.getSeries());
return dto;
}).collect(Collectors.toList());
return collect;
}
}
package com.link.bi.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.link.bi.config.listener.FinanceBaseZbjTypeListener;
import com.link.bi.domain.dao.IFinanceBaseZbjTypeDao;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import com.link.bi.pojo.request.FinanceBaseZbjTypeListVo;
import com.link.bi.pojo.request.FinanceSelectCommonVo;
import com.link.bi.pojo.response.FinanceBaseZbjTypeImportDto;
import com.link.bi.pojo.response.FinanceZbjTypeListDto;
import com.link.bi.service.FinanceBaseZbjTypeService;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.common.core.web.page.TableSupport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
//@DS("bi")
@Service
@Slf4j
public class FinanceBaseZbjTypeServiceImpl implements FinanceBaseZbjTypeService {
@Autowired
private IFinanceBaseZbjTypeDao dao;
@Override
public Map<String, String> selectBaseZbjType() {
List<FinanceBaseZbjType> list = dao.list(new LambdaQueryWrapper<>());
// 以fenxiaoName为key,直播间渠道类型为value,放入map中
Map<String, String> map = list.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getFenxiaoName(), v.getZbjQdType()), HashMap::putAll);
return map;
}
/**
* 分页查询
*
* @param keyword
* @return
*/
@Override
public IPage<FinanceZbjTypeListDto> pageFinanceBaseZbjType(String keyword) {
QueryWrapper<FinanceBaseZbjType> queryWrapper = new QueryWrapper<>();
if (keyword != null && !keyword.isEmpty()) {
queryWrapper.like("zbj_qd_type", keyword);
}
Page<FinanceBaseZbjType> page = dao.page(TableSupport.pageI(), queryWrapper);
Page<FinanceZbjTypeListDto> result = new Page<>();
BeanUtils.copyProperties(page, result);
result.setRecords(page.getRecords().stream().map(item -> {
FinanceZbjTypeListDto dto = new FinanceZbjTypeListDto();
BeanUtils.copyProperties(item, dto);
return dto;
}).collect(Collectors.toList()));
result.setTotal(page.getTotal());
result.setPages(page.getPages());
result.setCurrent(page.getCurrent());
return result;
}
/**
* 成本分析页面-查询下拉列表数据
*
* @param commonVo
* @return
*/
@Override
public List<FinanceZbjTypeListDto> baseZbjTypeList(FinanceSelectCommonVo commonVo) {
LambdaQueryWrapper<FinanceBaseZbjType> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(FinanceBaseZbjType::getZbjQdType);
queryWrapper.like(commonVo.getKeyword() != null && !commonVo.getKeyword().isEmpty(), FinanceBaseZbjType::getZbjQdType, commonVo.getKeyword());
queryWrapper.groupBy(FinanceBaseZbjType::getZbjQdType);
List<FinanceBaseZbjType> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceZbjTypeListDto> result = new ArrayList<>();
list.forEach(item -> {
FinanceZbjTypeListDto dto = new FinanceZbjTypeListDto();
BeanUtils.copyProperties(item, dto);
result.add(dto);
});
return result;
}
/**
* 直播间分类页面-查询列表数据
*
* @param zbjTypeListVo
* @return
*/
@Override
public List<FinanceZbjTypeListDto> baseZbjTypeAllList(FinanceBaseZbjTypeListVo zbjTypeListVo) {
LambdaQueryWrapper<FinanceBaseZbjType> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(zbjTypeListVo.getZbjQdType() != null && !zbjTypeListVo.getZbjQdType().isEmpty(), FinanceBaseZbjType::getZbjQdType, zbjTypeListVo.getZbjQdType());
List<FinanceBaseZbjType> list = dao.list(queryWrapper);
// 转化成List<FinanceZbjTypeListDto>
List<FinanceZbjTypeListDto> result = new ArrayList<>();
list.forEach(item -> {
FinanceZbjTypeListDto dto = new FinanceZbjTypeListDto();
BeanUtils.copyProperties(item, dto);
// 如果fenxiaoName为空,设置为- 2025年02月07日10:35:25
if (ObjectUtil.isEmpty(dto.getFenxiaoName())) {
dto.setFenxiaoName("-");
}
result.add(dto);
});
return result;
}
/**
* 执行Excel数据全量同步
*
* @param file 上传的Excel文件
*/
@Transactional(rollbackFor = Exception.class)
@Override
public String importData(MultipartFile file) {
if (file.isEmpty()) {
return "文件为空,请选择有效的 Excel 文件上传。";
}
try (InputStream inputStream = file.getInputStream()) {
FinanceBaseZbjTypeListener listener = new FinanceBaseZbjTypeListener();
EasyExcel.read(inputStream, FinanceBaseZbjTypeImportDto.class, listener).sheet().doRead();
List<FinanceBaseZbjTypeImportDto> importData = listener.getDataList();
// 1. 解析Excel文件,将数据转换为FinanceBaseZbjType对象
List<FinanceBaseZbjType> dataList = importData.stream().map(item -> {
FinanceBaseZbjType zbjType = new FinanceBaseZbjType();
BeanUtils.copyProperties(item, zbjType);
zbjType.setBatchNo(DateUtil.format(new Date(), "yyyyMMddHHmmss"));
return zbjType;
}).collect(Collectors.toList());
// 2. 删除数据库中不存在于Excel的数据
deleteAbsentProducts(dataList);
// 4. 批量保存或更新数据
batchUpsertProducts(dataList);
return "文件解析并更新数据成功。";
} catch (IOException e) {
log.error(e.getMessage(), e);
return "文件解析失败,请检查文件格式或内容。";
}
}
public void deleteAbsentProducts(List<FinanceBaseZbjType> dataList) {
// datalist 按照key为zbjQdType转成HashMap
Map<String, FinanceBaseZbjType> dataMap = dataList.stream().collect(Collectors.toMap(FinanceBaseZbjType::getFenxiaoName, item -> item));
// 查询数据库中所有数据
List<FinanceBaseZbjType> allDbRecords = dao.list(new LambdaQueryWrapper<>());
// 找出数据库中存在但 Excel 中不存在的记录的 fbztId
List<Long> idsToDelete = new ArrayList<>();
for (FinanceBaseZbjType dbRecord : allDbRecords) {
// 判断 是否匹配ZbjQdType
FinanceBaseZbjType financeBaseZbjType = dataMap.get(dbRecord.getFenxiaoName());
if (ObjectUtil.isEmpty(financeBaseZbjType) || !dbRecord.getZbjQdType().equals(financeBaseZbjType.getZbjQdType())) {
idsToDelete.add(dbRecord.getFbztId());
}
}
// 删除这些记录
if (!idsToDelete.isEmpty()) {
dao.removeByIds(idsToDelete);
}
}
public void batchUpsertProducts(List<FinanceBaseZbjType> dataList) {
// 查询数据库中所有数据
List<FinanceBaseZbjType> allDbRecords = dao.list(new LambdaQueryWrapper<>());
// FbztId匹配到的更新,否则进行保存
List<FinanceBaseZbjType> recordsToSave = new ArrayList<>();
List<FinanceBaseZbjType> recordsToUpdate = new ArrayList<>();
dataList.forEach(data -> {
FinanceBaseZbjType existingRecord = allDbRecords.stream()
.filter(record -> checkRecord(record, data))
.findFirst()
.orElse(null);
if (existingRecord != null) {
// 更新
BeanUtils.copyProperties(data, existingRecord);
recordsToUpdate.add(existingRecord);
} else {
// 保存
recordsToSave.add(data);
}
});
// 批量保存
if (!recordsToSave.isEmpty()) {
dao.saveBatch(recordsToSave);
}
// 批量更新
if (!recordsToUpdate.isEmpty()) {
dao.updateBatchById(recordsToUpdate);
}
// dao.saveOrUpdateBatch(dataList);
}
private boolean checkRecord(FinanceBaseZbjType record, FinanceBaseZbjType data) {
if (ObjectUtil.isNotEmpty(record.getFenxiaoName())) {
return record.getFenxiaoName().equals(data.getFenxiaoName())
&& record.getZbjQdType().equals(data.getZbjQdType());
} else {
return ObjectUtil.isEmpty(data.getFenxiaoName()) && record.getZbjQdType().equals(data.getZbjQdType());
}
}
}
package com.link.bi.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.link.bi.service.FinanceOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
@DS("bi")
@Slf4j
@Service
public class FinanceOrderServiceImpl implements FinanceOrderService {
}
package com.link.bi.service.impl;
import com.link.bi.domain.dao.IProductDao;
import com.link.bi.domain.entity.PrdInfo;
import com.link.bi.domain.wq.ProductWq;
import com.link.bi.pojo.request.ProductVo;
import com.link.bi.pojo.response.PrdInfoDto;
......@@ -10,7 +11,9 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : liqiulin
......@@ -41,4 +44,16 @@ public class ProductServiceImpl implements IProductService {
List<PrdInfoDto> prdInfos = productDao.selectListByCodes(prdCodes);
return prdInfos;
}
@Override
public Map<String, String> selectProdSeries() {
List<PrdInfo> prdInfos = productDao.selectProdSeries();
// 转换成map
Map<String, String> map = new HashMap<>();
prdInfos.stream().forEach(prdInfo -> {
map.put(prdInfo.getPrdCode(), prdInfo.getPrdName());
});
return map;
}
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.link.bi.domain.mapper.FinanceBaseZbjTypeMapper">
<insert id="saveOrUpdateBatch" parameterType="java.util.List">
insert into finance_base_zbj_type ( <include refid="Base_Column_List"></include>)
values
<foreach collection="list" item="item" separator=",">
(
#{item.fbztId},#{item.fenxiaoName},#{item.zbjQdType},#{item.batchNo},#{item.remark},#{item.delFlag},#{item.createBy},#{item.createUserId},#{item.createTime},#{item.updateBy},#{item.updateUserId},#{item.updateTime}
)
</foreach>
ON DUPLICATE KEY UPDATE
fbzt_id = VALUES(fbzt_id),
fenxiao_name = VALUES(fenxiao_name),
zbj_qd_type = VALUES(zbj_qd_type),
batch_no = VALUES(batch_no),
remark = VALUES(remark),
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);
</insert>
<!-- 定义 Base_Column_List -->
<sql id="Base_Column_List">
fbzt_id,
fenxiao_name,
zbj_qd_type,
batch_no,
remark,
del_flag,
create_by,
create_user_id,
create_time,
update_by,
update_user_id,
update_time
</sql>
<!-- 定义结果映射 -->
<resultMap id="FinanceBaseZbjTypeResultMap" type="com.link.bi.domain.entity.FinanceBaseZbjType">
<id property="fbztId" column="fbzt_id"/>
<result property="fenxiaoName" column="fenxiao_name"/>
<result property="zbjQdType" column="zbj_qd_type"/>
<result property="batchNo" column="batch_no"/>
<result property="remark" column="remark"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createUserId" column="create_user_id"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateUserId" column="update_user_id"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论