Commit ba2e76fe by kk

25517

parent c33b7602
......@@ -54,7 +54,7 @@ public class CodeGenerator {
.strategyConfig(builder -> {
builder
// 设置需要生成的表名
.addInclude("visual_task_weight")
.addInclude("sync_account_statistics")
//entity策略配置
.entityBuilder()
......
package cn.kk.spring_simple_operation.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author guokunkun
* @since 2026-06-25
*/
@RestController
@RequestMapping("/spring_simple_operation/sync-account-statistics")
public class SyncAccountStatisticsController {
}
package cn.kk.spring_simple_operation.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 java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author guokunkun
* @since 2026-06-25
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("sync_account_statistics")
@ApiModel(value = "SyncAccountStatistics对象", description = "")
public class SyncAccountStatistics implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("账号编号")
@TableField("account_num")
private String accountNum;
@ApiModelProperty("账号")
@TableField("`account`")
private String account;
@ApiModelProperty("账号缩写")
@TableField("short_name")
private String shortName;
@ApiModelProperty("轻小命名")
@TableField("small_name")
private String smallName;
@ApiModelProperty("账号地点")
@TableField("place")
private String place;
@ApiModelProperty("品牌")
@TableField("brand")
private String brand;
@ApiModelProperty("上传产品类别")
@TableField("product_type")
private String productType;
@ApiModelProperty("用途")
@TableField("used")
private String used;
@ApiModelProperty("绑定开发者")
@TableField("developer")
private String developer;
@ApiModelProperty("上新安排 1.全站暂停上新,只建老产品变体 2.全站只建老产品变体及扩展同类产品 3.全站可上新品 4.US可上新品")
@TableField("new_plan")
private String newPlan;
@ApiModelProperty("备注")
@TableField("remark")
private String remark;
@ApiModelProperty("us开售时间")
@TableField("us_fuldate")
private Integer usFuldate;
@ApiModelProperty("uk开售时间")
@TableField("uk_fuldate")
private Integer ukFuldate;
@ApiModelProperty("系统创建时间")
@TableField("created_at")
private Integer createdAt;
@ApiModelProperty("美国站fba库存数(inb+ful+res)")
@TableField("us_fba_amount")
private Integer usFbaAmount;
@ApiModelProperty("英国站fba库存数(inb+ful+res)")
@TableField("uk_fba_amount")
private Integer ukFbaAmount;
@ApiModelProperty("欧洲站fba库存数(inb+ful+res)")
@TableField("eu_fba_amount")
private Integer euFbaAmount;
@ApiModelProperty("是否B2B账号")
@TableField("is_b2b_account")
private Integer isB2bAccount;
@ApiModelProperty("开发部门")
@TableField("developer_dept")
private String developerDept;
@ApiModelProperty("是否B2B账号更新时间")
@TableField("b2b_update_time")
private Integer b2bUpdateTime;
}
package cn.kk.spring_simple_operation.mapper;
import cn.kk.spring_simple_operation.entity.SyncAccountStatistics;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author guokunkun
* @since 2026-06-25
*/
@Mapper
public interface SyncAccountStatisticsMapper extends BaseMapper<SyncAccountStatistics> {
}
......@@ -22,7 +22,7 @@ public interface VideoProductMapper extends BaseMapper<VideoProduct> {
List<String> selectHaveTask(@Param("skus") List<String> skus);
List<VideoProduct> getListBySkuAndSite(@Param("list") List<SkuSiteDTO> list);
List<VideoProduct> getListBySkuAndSite(@Param("list") List<SkuSiteDTO> list, @Param("optimizeType") Integer optimizeType);
List<VideoProductExportVo> selectVideoProductList();
}
package cn.kk.spring_simple_operation.model.dto;
import cn.kk.spring_simple_operation.utils.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 精细视频系统已上传后台无视频数据
*
* @author kk
* @date 2026/9/24
*/
@Data
public class FineVideoUploadedNoVideoDTO {
@Excel(name = "账号简称")
@ApiModelProperty("账号简称")
private String accountShortName;
@Excel(name = "账号管理")
@ApiModelProperty("账号管理")
private String accountManager;
@Excel(name = "SKU")
@ApiModelProperty("SKU")
private String sku;
@Excel(name = "站点")
@ApiModelProperty("站点")
private String site;
@Excel(name = "销售状态")
@ApiModelProperty("销售状态")
private String saleStatus;
@Excel(name = "侵权排查系统最新处理意见")
@ApiModelProperty("侵权排查系统最新处理意见")
private String latestOpinion;
@Excel(name = "是否共享视频")
@ApiModelProperty("是否共享视频")
private String shareVideo;
@Excel(name = "前台是否有视频")
@ApiModelProperty("前台是否有视频")
private String frontVideoExist;
@Excel(name = "视频上传后台状态")
@ApiModelProperty("视频上传后台状态")
private String videoUploadStatus;
}
package cn.kk.spring_simple_operation.model.dto;
import cn.kk.spring_simple_operation.utils.Excel;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author kk
* @date 2026/6/15
*/
@Data
public class RiskCheckAreaExportDTO {
@Excel(name = "sku")
@ApiModelProperty("sku")
private String sku;
@Excel(name = "站点")
@ApiModelProperty("站点")
private String site;
@Excel(name = "优化类型:0=原始任务(默认),1=优化任务", readConverterExp = "0=A+产品,1=A+优化")
@ApiModelProperty("优化类型:0-原始任务(默认),1-优化任务")
private Integer optimizeType;
@Excel(name = "风险检测")
@ApiModelProperty("风险检测")
private String riskCheckArea;
@Excel(name = "命中关键词")
@ApiModelProperty("命中关键词")
private String keywords;
}
package cn.kk.spring_simple_operation.model.dto;
import cn.kk.spring_simple_operation.utils.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 简易视频系统为已上传数据
*
* @author kk
* @date 2026/9/24
*/
@Data
public class SimpleVideoUploadedDTO {
@Excel(name = "账号简称")
@ApiModelProperty("账号简称")
private String accountShortName;
@Excel(name = "账管姓名")
@ApiModelProperty("账管姓名")
private String accountManager;
@Excel(name = "sku")
@ApiModelProperty("sku")
private String sku;
@Excel(name = "站点")
@ApiModelProperty("站点")
private String site;
@Excel(name = "销售状态")
@ApiModelProperty("销售状态")
private String saleStatus;
@Excel(name = "侵权排查系统最新处理意见")
@ApiModelProperty("侵权排查系统最新处理意见")
private String latestOpinion;
@Excel(name = "前台是否有视频")
@ApiModelProperty("前台是否有视频")
private String frontVideoExist;
@Excel(name = "视频上传后台状态")
@ApiModelProperty("视频上传后台状态")
private String videoUploadStatus;
}
package cn.kk.spring_simple_operation.model.dto;
import cn.kk.spring_simple_operation.utils.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 视频优化系统为已上传后台无视频数据 / AI视频后台无视频系统为已上传数据(两个sheet表头结构一致,共用此DTO)
*
* @author kk
* @date 2026/9/24
*/
@Data
public class VideoUploadedNoVideoDTO {
@Excel(name = "账号简称")
@ApiModelProperty("账号简称")
private String accountShortName;
@Excel(name = "账管姓名")
@ApiModelProperty("账管姓名")
private String accountManager;
@Excel(name = "sku")
@ApiModelProperty("sku")
private String sku;
@Excel(name = "站点")
@ApiModelProperty("站点")
private String site;
@Excel(name = "销售状态")
@ApiModelProperty("销售状态")
private String saleStatus;
@Excel(name = "侵权排查系统最新处理意见")
@ApiModelProperty("侵权排查系统最新处理意见")
private String latestOpinion;
@Excel(name = "是否共享视频")
@ApiModelProperty("是否共享视频")
private String shareVideo;
@Excel(name = "前台是否有视频")
@ApiModelProperty("前台是否有视频")
private String frontVideoExist;
@Excel(name = "视频上传后台状态")
@ApiModelProperty("视频上传后台状态")
private String videoUploadStatus;
@Excel(name = "视频页面")
@ApiModelProperty("视频页面")
private String videoPage;
}
package cn.kk.spring_simple_operation.service;
import cn.kk.spring_simple_operation.entity.SyncAccountStatistics;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author guokunkun
* @since 2026-06-25
*/
public interface SyncAccountStatisticsService extends IService<SyncAccountStatistics> {
}
package cn.kk.spring_simple_operation.service.impl;
import cn.kk.spring_simple_operation.entity.SyncAccountStatistics;
import cn.kk.spring_simple_operation.mapper.SyncAccountStatisticsMapper;
import cn.kk.spring_simple_operation.service.SyncAccountStatisticsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author guokunkun
* @since 2026-06-25
*/
@Service
public class SyncAccountStatisticsServiceImpl extends ServiceImpl<SyncAccountStatisticsMapper, SyncAccountStatistics> implements SyncAccountStatisticsService {
}
<?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="cn.kk.spring_simple_operation.mapper.SyncAccountStatisticsMapper">
</mapper>
......@@ -22,6 +22,7 @@
select id, video_is_upload_backstage
from video_product
where is_delete = 0
and optimize_type = #{optimizeType}
and (sku, site) in
<foreach collection="list" item="item" open="(" separator="," close=")">
(#{item.sku}, #{item.site})
......
package cn.kk.spring_simple_operation;
import cn.kk.spring_simple_operation.entity.VideoProduct;
import cn.kk.spring_simple_operation.entity.VisualDesignLog;
import cn.kk.spring_simple_operation.mapper.VideoProductMapper;
import cn.kk.spring_simple_operation.model.dto.FineVideoUploadedNoVideoDTO;
import cn.kk.spring_simple_operation.model.dto.SimpleVideoUploadedDTO;
import cn.kk.spring_simple_operation.model.dto.SkuSiteDTO;
import cn.kk.spring_simple_operation.model.dto.VideoUploadedNoVideoDTO;
import cn.kk.spring_simple_operation.utils.DateUtils;
import cn.kk.spring_simple_operation.utils.ExcelUtil;
import cn.kk.spring_simple_operation.utils.SqlGenerator;
import com.google.common.collect.Lists;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 解析 2026-09-21_viib_数据1一侵权排查系统处理意见与后台不一致.xlsx 的4个sheet
*
* @author kk
* @date 2026/9/24
*/
@SpringBootTest
public class InfringementCheckDataTest {
private static final Logger log = LoggerFactory.getLogger(InfringementCheckDataTest.class);
private static final Path INPUT_PATH = Paths.get("2026-09-21_viib_数据1一侵权排查系统处理意见与后台不一致.xlsx");
@Resource
private VideoProductMapper videoProductMapper;
@Test
public void readAllSheets() throws Exception {
List<FineVideoUploadedNoVideoDTO> fineVideoList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
fineVideoList = new ExcelUtil<>(FineVideoUploadedNoVideoDTO.class)
.importExcel("精细视频系统已上传后台无视频数据", is);
}
List<VideoUploadedNoVideoDTO> videoOptimizeList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
videoOptimizeList = new ExcelUtil<>(VideoUploadedNoVideoDTO.class)
.importExcel("视频优化系统为已上传后台无视频数据", is);
}
List<VideoUploadedNoVideoDTO> aiVideoList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
aiVideoList = new ExcelUtil<>(VideoUploadedNoVideoDTO.class)
.importExcel("AI视频后台无视频系统为已上传数据", is);
}
List<SimpleVideoUploadedDTO> simpleVideoList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
simpleVideoList = new ExcelUtil<>(SimpleVideoUploadedDTO.class)
.importExcel("简易视频系统为已上传数据", is);
}
log.info("精细视频系统已上传后台无视频数据: {} 条, 示例: {}", fineVideoList.size(), fineVideoList.isEmpty() ? null : fineVideoList.get(0));
log.info("视频优化系统为已上传后台无视频数据: {} 条, 示例: {}", videoOptimizeList.size(), videoOptimizeList.isEmpty() ? null : videoOptimizeList.get(0));
log.info("AI视频后台无视频系统为已上传数据: {} 条, 示例: {}", aiVideoList.size(), aiVideoList.isEmpty() ? null : aiVideoList.get(0));
log.info("简易视频系统为已上传数据: {} 条, 示例: {}", simpleVideoList.size(), simpleVideoList.isEmpty() ? null : simpleVideoList.get(0));
}
/**
* 精细视频(optimize_type=0)、视频优化(optimize_type=1)、AI视频(optimize_type=2)
* 三类数据在video_product表中video_is_upload_backstage设为5(已删除),
* 数据库只读,改为生成update+日志insert的sql文件,由DBA执行。
*/
@Test
public void generateVideoIsUploadBackstageDeletedSql() throws Exception {
List<FineVideoUploadedNoVideoDTO> fineVideoList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
fineVideoList = new ExcelUtil<>(FineVideoUploadedNoVideoDTO.class)
.importExcel("精细视频系统已上传后台无视频数据", is);
}
List<VideoUploadedNoVideoDTO> videoOptimizeList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
videoOptimizeList = new ExcelUtil<>(VideoUploadedNoVideoDTO.class)
.importExcel("视频优化系统为已上传后台无视频数据", is);
}
List<VideoUploadedNoVideoDTO> aiVideoList;
try (InputStream is = Files.newInputStream(INPUT_PATH)) {
aiVideoList = new ExcelUtil<>(VideoUploadedNoVideoDTO.class)
.importExcel("AI视频后台无视频系统为已上传数据", is);
}
int currentTime = DateUtils.getCurrentTimeSecond();
List<String> sqlList = new ArrayList<>();
sqlList.addAll(buildUpdateSqlList(
toSkuSiteList(fineVideoList, FineVideoUploadedNoVideoDTO::getSku, FineVideoUploadedNoVideoDTO::getSite),
"需求:25517,精细视频系统已上传但后台无视频,设置视频上传后台状态为已删除",
currentTime, 0));
sqlList.addAll(buildUpdateSqlList(
toSkuSiteList(videoOptimizeList, VideoUploadedNoVideoDTO::getSku, VideoUploadedNoVideoDTO::getSite),
"需求:25517,视频优化系统已上传但后台无视频,设置视频上传后台状态为已删除",
currentTime, 1));
sqlList.addAll(buildUpdateSqlList(
toSkuSiteList(aiVideoList, VideoUploadedNoVideoDTO::getSku, VideoUploadedNoVideoDTO::getSite),
"需求:25517,AI视频系统已上传但后台无视频,设置视频上传后台状态为已删除",
currentTime, 2));
Path outputPath = Paths.get("video_is_upload_backstage_deleted.sql");
try (BufferedWriter writer = Files.newBufferedWriter(outputPath)) {
for (String sql : sqlList) {
writer.write(sql);
writer.write("\n");
}
}
log.info("共生成 {} 条sql, 输出文件: {}", sqlList.size(), outputPath.toAbsolutePath());
}
/**
* 按(sku,site)分批查询video_product中对应的记录((sku,site) in (...)),
* 对video_is_upload_backstage != 5 的记录生成update sql,并配套生成一条visual_design_log的insert sql。
*/
private List<String> buildUpdateSqlList(List<SkuSiteDTO> skuSiteList, String operationContent, int currentTime, Integer optimizeType) {
List<String> sqlList = new ArrayList<>();
if (CollectionUtils.isEmpty(skuSiteList)) {
return sqlList;
}
Lists.partition(skuSiteList, 500).forEach(partition -> {
List<VideoProduct> products = videoProductMapper.getListBySkuAndSite(partition, optimizeType);
for (VideoProduct product : products) {
if (Objects.equals(product.getVideoIsUploadBackstage(), 5)) {
continue;
}
VideoProduct update = new VideoProduct();
update.setId(product.getId());
update.setVideoIsUploadBackstage(5);
VisualDesignLog designLog = new VisualDesignLog();
designLog.setOperationKey("video_product")
.setCreateId(0)
.setCreateTime(currentTime)
.setCreateName("系统")
.setOperationContent(operationContent)
.setRelationId(update.getId())
.setFileUrl("")
.setOperationType("job");
sqlList.add(SqlGenerator.generateUpdateSql(update));
sqlList.add(SqlGenerator.generateInsertSql(designLog));
}
});
return sqlList;
}
private <T> List<SkuSiteDTO> toSkuSiteList(List<T> list, Function<T, String> skuGetter, Function<T, String> siteGetter) {
return list.stream()
.filter(item -> !StringUtils.isEmpty(skuGetter.apply(item)) && !StringUtils.isEmpty(siteGetter.apply(item)))
.map(item -> {
SkuSiteDTO dto = new SkuSiteDTO();
dto.setSku(skuGetter.apply(item));
dto.setSite(siteGetter.apply(item));
return dto;
})
.distinct()
.collect(Collectors.toList());
}
}
......@@ -6,6 +6,7 @@ import cn.kk.spring_simple_operation.model.dto.ImportExcelDto;
import cn.kk.spring_simple_operation.model.dto.RiskCheckAreaExportDTO;
import cn.kk.spring_simple_operation.model.dto.SkuImageDesignDTO;
import cn.kk.spring_simple_operation.model.vo.SkuAPlusImageAndVideoVO;
import cn.kk.spring_simple_operation.utils.DateUtils;
import cn.kk.spring_simple_operation.utils.ExcelUtil;
import cn.kk.spring_simple_operation.utils.SqlGenerator;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
......@@ -69,6 +70,90 @@ public class MyTest2 {
@Resource
private PhotoProgressMapper photoProgressMapper;
@Resource
private BrandRecordToolMapper brandRecordToolMapper;
@Resource
private SyncAccountStatisticsMapper syncAccountStatisticsMapper;
@Test
public void printResearchSecondDeptCommunicationDesignIds() {
List<VisualCommunicationDesign> designList = visualCommunicationDesignSecondMapper.selectList(Wrappers.<VisualCommunicationDesign>lambdaQuery()
.eq(VisualCommunicationDesign::getStatus, 3)
.eq(VisualCommunicationDesign::getIsBoutiqueProduct, 0)
.in(VisualCommunicationDesign::getVdtId, 21L, 40L, 41L)
.select(VisualCommunicationDesign::getId, VisualCommunicationDesign::getVdtId));
if (CollectionUtils.isEmpty(designList)) {
System.out.println("no VisualCommunicationDesign data");
return;
}
Map<Long, Set<Long>> vdtIdDesignIdsMap = designList.stream()
.collect(Collectors.groupingBy(VisualCommunicationDesign::getVdtId, Collectors.mapping(VisualCommunicationDesign::getId, Collectors.toSet())));
Map<String, Set<Long>> accountDesignIdsMap = new HashMap<>();
Lists.partition(new ArrayList<>(vdtIdDesignIdsMap.getOrDefault(21L, Collections.emptySet())), 500).forEach(designIdList -> {
List<BrandRecordTool> brandRecordTools = brandRecordToolMapper.selectList(Wrappers.<BrandRecordTool>lambdaQuery()
.in(BrandRecordTool::getCommunicationId, designIdList)
.select(BrandRecordTool::getAccount, BrandRecordTool::getCommunicationId));
for (BrandRecordTool brandRecordTool : brandRecordTools) {
if (!StringUtils.isEmpty(brandRecordTool.getAccount()) && Objects.nonNull(brandRecordTool.getCommunicationId())) {
accountDesignIdsMap.computeIfAbsent(brandRecordTool.getAccount(), k -> new HashSet<>()).add(brandRecordTool.getCommunicationId());
}
}
});
Lists.partition(new ArrayList<>(vdtIdDesignIdsMap.getOrDefault(40L, Collections.emptySet())), 500).forEach(designIdList -> {
List<BrandRecordTool> brandRecordTools = brandRecordToolMapper.selectList(Wrappers.<BrandRecordTool>lambdaQuery()
.in(BrandRecordTool::getCommunicationOfficialId, designIdList)
.select(BrandRecordTool::getAccount, BrandRecordTool::getCommunicationOfficialId));
for (BrandRecordTool brandRecordTool : brandRecordTools) {
if (!StringUtils.isEmpty(brandRecordTool.getAccount()) && Objects.nonNull(brandRecordTool.getCommunicationOfficialId())) {
accountDesignIdsMap.computeIfAbsent(brandRecordTool.getAccount(), k -> new HashSet<>()).add(brandRecordTool.getCommunicationOfficialId());
}
}
});
Lists.partition(new ArrayList<>(vdtIdDesignIdsMap.getOrDefault(41L, Collections.emptySet())), 500).forEach(designIdList -> {
List<BrandRecordTool> brandRecordTools = brandRecordToolMapper.selectList(Wrappers.<BrandRecordTool>lambdaQuery()
.in(BrandRecordTool::getCommunicationFlagshipId, designIdList)
.select(BrandRecordTool::getAccount, BrandRecordTool::getCommunicationFlagshipId));
for (BrandRecordTool brandRecordTool : brandRecordTools) {
if (!StringUtils.isEmpty(brandRecordTool.getAccount()) && Objects.nonNull(brandRecordTool.getCommunicationFlagshipId())) {
accountDesignIdsMap.computeIfAbsent(brandRecordTool.getAccount(), k -> new HashSet<>()).add(brandRecordTool.getCommunicationFlagshipId());
}
}
});
if (accountDesignIdsMap.isEmpty()) {
System.out.println("no BrandRecordTool account data");
return;
}
Set<String> researchSecondDeptAccounts = new HashSet<>();
Lists.partition(new ArrayList<>(accountDesignIdsMap.keySet()), 500).forEach(accountList -> {
List<SyncAccountStatistics> statisticsList = syncAccountStatisticsMapper.selectList(Wrappers.<SyncAccountStatistics>lambdaQuery()
.in(SyncAccountStatistics::getShortName, accountList)
.eq(SyncAccountStatistics::getDeveloperDept, "研发二部")
.select(SyncAccountStatistics::getShortName, SyncAccountStatistics::getDeveloperDept));
statisticsList.stream()
.map(SyncAccountStatistics::getShortName)
.filter(account -> !StringUtils.isEmpty(account))
.forEach(researchSecondDeptAccounts::add);
});
List<Long> resultIds = researchSecondDeptAccounts.stream()
.map(accountDesignIdsMap::get)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.distinct()
.sorted()
.collect(Collectors.toList());
System.out.println("developerDept=研发二部 VisualCommunicationDesign id: " + resultIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
}
@Test
public void exportSkuHasAPlus() throws Exception {
......@@ -521,4 +606,15 @@ public class MyTest2 {
targetCell.setCellStyle(cellStyle);
}
@Test
public void timeTest() {
Integer time = DateUtils.getCurrentTimeSecond();
int endTime = DateUtils.getStartOfDay(time, 0) - 1;
int startTime = endTime - 365 * 3600 * 30 + 10;
System.out.println(startTime);
}
}
package cn.kk.spring_simple_operation;
import cn.kk.spring_simple_operation.utils.DateUtils;
/**
*
* @author kk
* @date 2026/7/7
*/
public class TimeTest {
public static void main(String[] args) {
Integer time = DateUtils.getCurrentTimeSecond();
int endTime = DateUtils.getStartMonthOffset(time, 0) - 1;
int startTime = endTime - 365 * 3600 * 24 + 10;
System.out.println(DateUtils.formatTimeSecond(startTime, DateUtils.YYYY_MM_DD_HH_MM_SS));
System.out.println(DateUtils.formatTimeSecond(endTime, DateUtils.YYYY_MM_DD_HH_MM_SS));
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment