Commit 343e87c1 by kk

存储

parent 1c5344bf
# 多数据源配置说明
## 配置概述
原有数据源配置保持不变,新增第二个MySQL数据源。两个数据库的表结构相同,只是数据库IP不同。
## 数据源配置位置
配置文件:`src/main/resources/application.yml`
### 原有数据源(保持不变)
- 使用 Spring Boot 自动配置
- Mapper扫描包:`cn.kk.spring_simple_operation.mapper`
- 默认连接:rm-wz9m4k931n87m9721oo.mysql.rds.aliyuncs.com:3306/visual
### 新增的第二数据源
- 配置前缀:`spring.datasource-secondary`
- Mapper扫描包:`cn.kk.spring_simple_operation.mapper.secondary`
- 配置类:`SecondaryDataSourceConfig`
- 当前连接:120.77.232.73:3306/java_visual
## 如何使用新增的第二数据源
### 1. 修改第二数据源配置(如需要)
编辑 `application.yml`,找到 `spring.datasource-secondary` 部分,修改为你的第二数据库信息:
```yaml
spring:
datasource-secondary:
url: jdbc:mysql://你的IP:端口/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=true
username: 你的用户名
password: 你的密码
```
### 2. 创建第二数据源的Mapper接口
`cn.kk.spring_simple_operation.mapper.secondary` 包下创建Mapper接口:
```java
package cn.kk.spring_simple_operation.mapper.secondary;
import cn.kk.spring_simple_operation.entity.YourEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface YourEntityMapperSecondary extends BaseMapper<YourEntity> {
// 自定义查询方法
}
```
**注意**:为了避免与原有Mapper冲突,建议在第二数据源的Mapper名称后加上 `Secondary` 后缀。
### 3. 在Service或Controller中使用
```java
@Service
public class YourService {
@Autowired
private YourEntityMapper originalMapper; // 操作原有数据源
@Autowired
private YourEntityMapperSecondary secondaryMapper; // 操作新增的第二数据源
public void operateBothDataSources() {
// 查询原有数据源
List<YourEntity> originalData = originalMapper.selectList(null);
// 查询新增的第二数据源
List<YourEntity> secondaryData = secondaryMapper.selectList(null);
// 插入到原有数据源
YourEntity entity1 = new YourEntity();
originalMapper.insert(entity1);
// 插入到新增的第二数据源
YourEntity entity2 = new YourEntity();
secondaryMapper.insert(entity2);
}
}
```
## 原有代码不受影响
- 原有的 Mapper 接口位置不变:`cn.kk.spring_simple_operation.mapper`
- 原有的 Service、Controller 代码无需修改
- 原有数据源的配置和连接方式保持不变
## 示例代码
参考 `MultiDataSourceController` 类,它展示了如何同时操作原有数据源和新增的第二数据源进行增删改查。
访问接口测试:
- `/multi-datasource/original/list` - 查询原有数据源
- `/multi-datasource/secondary/list` - 查询新增的第二数据源
- `/multi-datasource/original/insert` - 插入原有数据源
- `/multi-datasource/secondary/insert` - 插入新增的第二数据源
## 注意事项
1. 两个数据源的事务是独立的,不能跨数据源使用事务
2. 新增第二数据源的Mapper必须放在 `cn.kk.spring_simple_operation.mapper.secondary` 包下
3. Entity类可以共用,不需要重复创建
4. 如果需要自定义XML,需要在 `resources/mapper/secondary` 目录下创建
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-05-11
*/
@RestController
@RequestMapping("/spring_simple_operation/plane-design-developer-dept")
public class PlaneDesignDeveloperDeptController {
}
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-05-08
*/
@RestController
@RequestMapping("/spring_simple_operation/visual-communication-design-view")
public class VisualCommunicationDesignViewController {
}
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.TableLogic;
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-05-11
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("plane_design_developer_dept")
@ApiModel(value = "PlaneDesignDeveloperDept对象", description = "平面设计-开发分配任务组别对照表")
public class PlaneDesignDeveloperDept implements Serializable {
private static final long serialVersionUID = 1L;
//@ApiModelProperty("id")
//@TableId(value = "id", type = IdType.AUTO)
//private Integer id;
@ApiModelProperty("平面设计组别")
@TableField("plane_design_group")
private String planeDesignGroup;
@ApiModelProperty("开发组别")
@TableField("developer_group")
private String developerGroup;
@ApiModelProperty("推送人员")
@TableField("push_msg_to_user")
private String pushMsgToUser;
@ApiModelProperty("是否删除0-否1-是")
@TableField("is_delete")
@TableLogic
private Integer isDelete;
}
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-05-08
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("visual_communication_design_view")
@ApiModel(value = "VisualCommunicationDesignView对象", description = "传达设计附属字段视图表-用于查询")
public class VisualCommunicationDesignView implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("A+产品(品牌故事)等的id")
@TableField("a_plus_product_id")
private Long aPlusProductId;
@ApiModelProperty("A+策划的id")
@TableField("plan_id")
private Long planId;
@ApiModelProperty("摄影的id")
@TableField("photographer_id")
private Long photographerId;
@ApiModelProperty("传达设计的id")
@TableField("communication_id")
private Long communicationId;
@ApiModelProperty("传达设计组编号")
@TableField("group_number")
private String groupNumber;
@ApiModelProperty("样品到货时间")
@TableField("sample_delivery_time")
private Integer sampleDeliveryTime;
@ApiModelProperty("策划")
@TableField("a_plus_plan_name")
private String aPlusPlanName;
@ApiModelProperty("策划编号")
@TableField("a_plus_plan_number")
private String aPlusPlanNumber;
@ApiModelProperty("sku")
@TableField("sku")
private String sku;
@ApiModelProperty("A+产品(品牌故事)等的sku")
@TableField("product_sku")
private String productSku;
@ApiModelProperty("A+产品(品牌故事)等的站点")
@TableField("site")
private String site;
@ApiModelProperty("首个发起申请的sku")
@TableField("apply_sku")
private String applySku;
@ApiModelProperty("策划标题")
@TableField("plan_title")
private String planTitle;
@ApiModelProperty("是否到样品,0-否,1-是")
@TableField("is_have_sample")
private Integer isHaveSample;
@ApiModelProperty("是否需要摄影,0-否,1-是,2-P图")
@TableField("is_need_photographer")
private Integer isNeedPhotographer;
@ApiModelProperty("策划标签id")
@TableField("plan_tag_id")
private Long planTagId;
@ApiModelProperty("是否走流程,0-否,1-是")
@TableField("follow_the_process")
private Integer followTheProcess;
@ApiModelProperty("策划完成时间")
@TableField("finish_time")
private Integer finishTime;
@ApiModelProperty("样品全部到货时间")
@TableField("sample_arrive_time")
private Integer sampleArriveTime;
@ApiModelProperty("A+优先等级")
@TableField("a_plus_level")
private String aPlusLevel;
@ApiModelProperty("创建人类型,0-系统,1-销售,2-策划")
@TableField("create_type")
private Integer createType;
@ApiModelProperty("节气")
@TableField("solar_term")
private Integer solarTerm;
@ApiModelProperty("产品开发人员")
@TableField("developer_num")
private String developerNum;
@ApiModelProperty("us一级类目")
@TableField("us_root_type")
private String usRootType;
@ApiModelProperty("销售状态")
@TableField("sale_status")
private String saleStatus;
@ApiModelProperty("是否鼓励政策")
@TableField("is_cheer_policy")
private Integer isCheerPolicy;
@ApiModelProperty("是否潜力产品,0-否,1-是")
@TableField("maintain_level")
private Integer maintainLevel;
@ApiModelProperty("摄影师编号")
@TableField("photographer_number")
private String photographerNumber;
@ApiModelProperty("摄影师")
@TableField("photographer_name")
private String photographerName;
@ApiModelProperty("摄影完成状态,0-未完成,1-进行中,2-完成,3-不需要处理")
@TableField("photographer_status")
private Integer photographerStatus;
}
package cn.kk.spring_simple_operation.mapper;
import cn.kk.spring_simple_operation.entity.PlaneDesignDeveloperDept;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 平面设计-开发分配任务组别对照表 Mapper 接口
* </p>
*
* @author guokunkun
* @since 2026-05-11
*/
@Mapper
public interface PlaneDesignDeveloperDeptMapper extends BaseMapper<PlaneDesignDeveloperDept> {
}
package cn.kk.spring_simple_operation.mapper;
import cn.kk.spring_simple_operation.entity.VisualCommunicationDesignView;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 传达设计附属字段视图表-用于查询 Mapper 接口
* </p>
*
* @author guokunkun
* @since 2026-05-08
*/
@Mapper
public interface VisualCommunicationDesignViewMapper extends BaseMapper<VisualCommunicationDesignView> {
}
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/5/11
*/
@Data
public class ImportExcelDto {
@Excel(name = "设计组别")
@ApiModelProperty("平面设计组别")
private String planeDesignGroup;
@Excel(name = "开发部门")
@ApiModelProperty("开发组别")
private String developerGroup;
@Excel(name = "推送人员")
@ApiModelProperty("推送人员")
private String pushMsgToUser;
}
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/6/4
*/
@Data
public class SkuImageDesignDTO {
@Excel(name = "审核列表id")
@ApiModelProperty("审核列表id")
private Integer productId;
@Excel(name = "sku")
@ApiModelProperty("sku")
private String sku;
@Excel(name = "开发部门")
@ApiModelProperty("开发部门")
private String devDepartment;
@Excel(name = "开发大组")
@ApiModelProperty("开发大组")
private String devGroup;
@Excel(name = "开发编号")
@ApiModelProperty("开发编号")
private String devCode;
@Excel(name = "开发编号名称")
@ApiModelProperty("开发编号名称")
private String devCodeName;
@Excel(name = "销售大组")
@ApiModelProperty("销售大组")
private String saleGroup;
@Excel(name = "销售小组")
@ApiModelProperty("销售小组")
private String saleSubGroup;
@Excel(name = "销售编号")
@ApiModelProperty("销售编号")
private String saleCode;
@Excel(name = "销售编号名称")
@ApiModelProperty("销售编号名称")
private String saleCodeName;
@Excel(name = "产品类型")
@ApiModelProperty("产品类型")
private String productType;
@Excel(name = "开售日期")
@ApiModelProperty("开售日期")
private String saleDate;
@Excel(name = "母体SKU")
@ApiModelProperty("母体SKU")
private String parentSku;
@Excel(name = "母体开售时间")
@ApiModelProperty("母体开售时间")
private String parentSaleDate;
@Excel(name = "是否有潜力标签")
@ApiModelProperty("是否有潜力标签")
private String potentialLabel;
@Excel(name = "图需审核", readConverterExp = "0=销售未传图需,1=等待开发审核,2=审核通过,3=审核不通过,4=非销售作图")
@ApiModelProperty("图需审核")
private Integer projectSaleFileStatus;
}
package cn.kk.spring_simple_operation.service;
import cn.kk.spring_simple_operation.entity.PlaneDesignDeveloperDept;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 平面设计-开发分配任务组别对照表 服务类
* </p>
*
* @author guokunkun
* @since 2026-05-11
*/
public interface PlaneDesignDeveloperDeptService extends IService<PlaneDesignDeveloperDept> {
}
package cn.kk.spring_simple_operation.service;
import cn.kk.spring_simple_operation.entity.VisualCommunicationDesignView;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 传达设计附属字段视图表-用于查询 服务类
* </p>
*
* @author guokunkun
* @since 2026-05-08
*/
public interface VisualCommunicationDesignViewService extends IService<VisualCommunicationDesignView> {
}
package cn.kk.spring_simple_operation.service.impl;
import cn.kk.spring_simple_operation.entity.PlaneDesignDeveloperDept;
import cn.kk.spring_simple_operation.mapper.PlaneDesignDeveloperDeptMapper;
import cn.kk.spring_simple_operation.service.PlaneDesignDeveloperDeptService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 平面设计-开发分配任务组别对照表 服务实现类
* </p>
*
* @author guokunkun
* @since 2026-05-11
*/
@Service
public class PlaneDesignDeveloperDeptServiceImpl extends ServiceImpl<PlaneDesignDeveloperDeptMapper, PlaneDesignDeveloperDept> implements PlaneDesignDeveloperDeptService {
}
package cn.kk.spring_simple_operation.service.impl;
import cn.kk.spring_simple_operation.entity.VisualCommunicationDesignView;
import cn.kk.spring_simple_operation.mapper.VisualCommunicationDesignViewMapper;
import cn.kk.spring_simple_operation.service.VisualCommunicationDesignViewService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 传达设计附属字段视图表-用于查询 服务实现类
* </p>
*
* @author guokunkun
* @since 2026-05-08
*/
@Service
public class VisualCommunicationDesignViewServiceImpl extends ServiceImpl<VisualCommunicationDesignViewMapper, VisualCommunicationDesignView> implements VisualCommunicationDesignViewService {
}
<?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.PlaneDesignDeveloperDeptMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kk.spring_simple_operation.mapper.VisualCommunicationDesignViewMapper">
</mapper>
......@@ -2,13 +2,13 @@ package cn.kk.spring_simple_operation;
import cn.kk.spring_simple_operation.entity.*;
import cn.kk.spring_simple_operation.mapper.*;
import cn.kk.spring_simple_operation.model.vo.BrandRecordStatisticsVo;
import cn.kk.spring_simple_operation.model.dto.ImportExcelDto;
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;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -37,6 +37,7 @@ public class MyTest2 {
@Resource
private VisualCommunicationDesignSecondMapper visualCommunicationDesignSecondMapper;
@Autowired
@Resource
private VideoProductMapper videoProductMapper;
......@@ -49,6 +50,12 @@ public class MyTest2 {
@Resource
private VisualTaskWeightMapper visualTaskWeightMapper;
@Resource
private DeptGroupMapper deptGroupMapper;
@Resource
private PhotoProgressMapper photoProgressMapper;
@Test
public void dealSimpleAPlusPlanTime() {
......@@ -127,4 +134,80 @@ public class MyTest2 {
util.exportExcelFile(list, "21716-珠宝首饰产品前台图片、A+和视频导出-.xlsx");
}
@Test
public void test() throws Exception {
Map<String, List<DeptGroup>> listMap = deptGroupMapper.selectList(Wrappers.<DeptGroup>lambdaQuery()
.in(DeptGroup::getModule, "wal_develop", "plan_design")
.notLike(DeptGroup::getFullName, "研发二部")
.select(DeptGroup::getModule, DeptGroup::getGroupNum)
).stream().collect(Collectors.groupingBy(DeptGroup::getModule));
List<String> walDevelop = listMap.get("wal_develop").stream().map(t -> t.getGroupNum().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
List<String> planDesign = listMap.get("plan_design").stream().map(t -> t.getGroupNum().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
ExcelUtil<ImportExcelDto> util = new ExcelUtil<>(ImportExcelDto.class);
List<ImportExcelDto> list = util.importExcel(Files.newInputStream(new File("2026-04-30_vzdi_推送对接表.xlsx").toPath()));
List<PlaneDesignDeveloperDept> collect = list.stream().map(t -> {
List<String> developerGroupList = walDevelop.stream().filter(group -> group.endsWith(t.getDeveloperGroup().toLowerCase(Locale.ROOT))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(developerGroupList)) {
log.warn("developerGroupList.isEmpty(), {}", t.getDeveloperGroup());
return null;
}
if (developerGroupList.size() > 1) {
//log.warn("developerGroupList.size() > 1, {}", t.getDeveloperGroup());
//return null;
}
List<String> planDesignGroupList = planDesign.stream().filter(group -> group.endsWith(t.getPlaneDesignGroup().toLowerCase(Locale.ROOT))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(planDesignGroupList)) {
log.warn("planDesignGroupList.isEmpty(), {}", t.getPlaneDesignGroup());
return null;
}
if (planDesignGroupList.size() > 1) {
//log.warn("planDesignGroupList.size() > 1, {}", t.getPlaneDesignGroup());
//return null;
}
PlaneDesignDeveloperDept planeDesignDeveloperDept = new PlaneDesignDeveloperDept();
planeDesignDeveloperDept.setPlaneDesignGroup(planDesignGroupList.get(0).toUpperCase(Locale.ROOT));
planeDesignDeveloperDept.setDeveloperGroup(developerGroupList.get(0).toUpperCase(Locale.ROOT));
planeDesignDeveloperDept.setPushMsgToUser(t.getPushMsgToUser());
return planeDesignDeveloperDept;
}).filter(Objects::nonNull).collect(Collectors.toList());
for (PlaneDesignDeveloperDept planeDesignDeveloperDept : collect) {
String insertSql = SqlGenerator.generateInsertSql(planeDesignDeveloperDept);
System.out.println(insertSql);
}
}
@Test
public void exportSkuIsMakePic() throws Exception {
ExcelUtil<SkuImageDesignDTO> util = new ExcelUtil<>(SkuImageDesignDTO.class);
List<SkuImageDesignDTO> list = util.importExcel(Files.newInputStream(new File("sku-是否作图.xlsx").toPath()));
List<Integer> productIds = list.stream().map(SkuImageDesignDTO::getProductId).collect(Collectors.toList());
Map<Integer, Integer> idMap = new HashMap<>(productIds.size());
Lists.partition(productIds, 200).forEach(productIdList -> {
Map<Integer, Integer> map = photoProgressMapper.selectList(Wrappers.<PhotoProgress>lambdaQuery().in(PhotoProgress::getProductId, productIdList).select(PhotoProgress::getProductId, PhotoProgress::getProjectSaleFileStatus))
.stream()
.collect(Collectors.toMap(PhotoProgress::getProductId, PhotoProgress::getProjectSaleFileStatus));
idMap.putAll(map);
});
list.forEach(item -> {
item.setProjectSaleFileStatus(idMap.get(item.getProductId()));
});
util = new ExcelUtil<SkuImageDesignDTO>(SkuImageDesignDTO.class);
util.exportExcelFile(list, "sku-是否作图2.xlsx");
}
}
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