提交 cdac5cb8 authored 作者: 李秋林's avatar 李秋林

1、导出促销员上报数据;2、dockerfile文件

上级 cbe92da0
FROM openjdk:8
WORKDIR /promotion
ADD ./target/wangxiaolu-export.jar /promotion/app.jar
#设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 定义容器启动命令ENTRYPOINT 和 CMD指令类似,都可以用于增加启动参数
ENTRYPOINT ["nohup","java", "-jar", "/promotion/app.jar"]
CMD ["--spring.profiles.active=live"]
EXPOSE 8012
...@@ -2,34 +2,186 @@ ...@@ -2,34 +2,186 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<!-- 当前pom依赖在项目进行拆分时,拆到parent项目中,此项目做为promotion业务子模块-->
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>com.wangxiaolu</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>wangxiaolu-promotion-parent</artifactId>
<version>3.3.0</version> <version>0.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.wangxiaolu</groupId> <groupId>com.wangxiaolu</groupId>
<artifactId>wangxiaolu-export</artifactId> <artifactId>wangxiaolu-export</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1</version>
<name>wangxiaolu-export</name> <name>wangxiaolu-export</name>
<description>wangxiaolu-export</description> <description>wangxiaolu-export</description>
<properties>
<java.version>22</java.version>
</properties>
<dependencies> <dependencies>
<dependency>
<groupId>com.wangxiaolu</groupId>
<artifactId>wangxiaolu-promotion-common</artifactId>
<version>0.0.1</version>
<exclusions>
<exclusion>
<artifactId>spring-cloud-gateway-server</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Web 场景启动器) 来为 Web 开发予以支持。spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖,并为 Spring MVC 提供了大量自动配置,可以适用于大多数 Web 开发场景。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.7</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<!-- POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </dependencies>
<build> <build>
<finalName>wangxiaolu-export</finalName>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
......
package com.wangxiaolu.export.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author sunnyzyq
* @date 2021/12/17
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelExport {
/**
* 字段名称
*/
String value();
/**
* 导出排序先后: 数字越小越靠前(默认按Java类字段顺序导出)
*/
int sort() default 0;
/**
* 导出映射,格式如:0-未知;1-男;2-女
*/
String kv() default "";
/**
* 导出模板示例值(有值的话,直接取该值,不做映射)
*/
String example() default "";
}
\ No newline at end of file
package com.wangxiaolu.export.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author sunnyzyq
* @date 2021/12/17
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelImport {
/**
* 字段名称
*/
String value();
/**
* 导出映射,格式如:0-未知;1-男;2-女
*/
String kv() default "";
/**
* 是否为必填字段(默认为非必填)
*/
boolean required() default false;
/**
* 最大长度(默认255)
*/
int maxLength() default 255;
/**
* 导入唯一性验证(多个字段则取联合验证)
*/
boolean unique() default false;
}
package com.wangxiaolu.export.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityClockDO;
import com.wangxiaolu.export.pojo.ActivityVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author a02200059
* @description 针对表【temporary_activity_clock】的数据库操作Mapper
* @createDate 2024-04-23 17:10:46
* @Entity com.wangxiaolu.promotion.domain.activity.mapper.entity.TemporaryActivityClockDO
*/
@Mapper
@Repository
public interface TemporaryActivityClockMapper extends BaseMapper<TemporaryActivityClockDO> {
List<TemporaryActivityClockDO> findClockPhotoList(@Param("params") ActivityVo activityVo);
}
package com.wangxiaolu.export.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityPhotoDO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author a02200059
* @description 针对表【temporary_activity_photo】的数据库操作Mapper
* @createDate 2024-05-09 11:22:33
* @Entity com.wangxiaolu.promotion.domain.activity.mapper.entity.TemporaryActivityPhoto
*/
@Mapper
@Repository
public interface TemporaryActivityPhotoMapper extends BaseMapper<TemporaryActivityPhotoDO> {
List<TemporaryActivityPhotoDO> findActivityPhotos(List<Long> activityId);
}
package com.wangxiaolu.export.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityReportedDO;
import com.wangxiaolu.export.pojo.ActivityVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* @author a02200059
* @description 针对表【temporary_activity_reported】的数据库操作Mapper
* @createDate 2024-04-18 10:38:42
* @Entity generator.domain.TemporaryActivityReported
*/
@Mapper
@Repository
public interface TemporaryActivityReportedMapper extends BaseMapper<TemporaryActivityReportedDO> {
List<TemporaryActivityReportedDO> findList(@Param("params") ActivityVo activityVo);
}
package com.wangxiaolu.export.mapper.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
*
* @TableName temporary_activity_clock
*/
@TableName(value ="temporary_activity_clock")
@Data
public class TemporaryActivityClockDO implements Serializable {
private Long temporaryId;
private String createDate;
private List<TemporaryActivityPhotoDO> photoList;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.wangxiaolu.export.mapper.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
*
* @TableName temporary_activity_photo
*/
@TableName(value ="temporary_activity_photo")
@Data
@Accessors(chain = true)
public class TemporaryActivityPhotoDO implements Serializable {
/**
* 活动上报ID,关联表temporary_activity_reported表主键id
*/
private Long reportedId;
/**
* 促销员上班打卡记录ID,关联temporary_activity_clock表主键ID
*/
private Long clockId;
/**
* 图片所属类别:1:推广试吃;2……
*/
private Integer type;
/**
* 图片http地址
*/
private String photoUrl;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.wangxiaolu.export.mapper.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
*
* @TableName temporary_activity_reported
*/
@TableName(value ="temporary_activity_reported")
@Data
public class TemporaryActivityReportedDO implements Serializable {
@TableId
private Long id;
private Integer temporaryId;
@TableField(exist = false)
private String activityPattern;
@TableField(exist = false)
private String storeName;
@TableField(exist = false)
private String city;
@TableField(exist = false)
private String approveName;
@TableField(exist = false)
private String createDate;
@TableField(exist = false)
private String lineName;
@TableField(exist = false)
private String orgName;
@TableField(exist = false)
private String month;
@TableField(exist = false)
private String date;
}
\ No newline at end of file
package com.wangxiaolu.export.pojo;
import cn.hutool.core.date.DateTime;
import lombok.Data;
import java.util.Date;
/**
* @author : liqiulin
* @date : 2024-07-03 10
* @describe :
*/
@Data
public class ActivityVo {
String createDateStart;
String createDateEnd;
}
package com.wangxiaolu.export.service;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityClockDO;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityPhotoDO;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityReportedDO;
import com.wangxiaolu.export.pojo.ActivityVo;
import java.util.List;
import java.util.Map;
/**
* @author : liqiulin
* @date : 2024-06-14 15
* @describe :
*/
public interface PromotionActivityService {
/**
* 查询上报记录
*/
List<TemporaryActivityReportedDO> findActivityList(ActivityVo activityVo);
/**
* 查询打卡记录
*/
List<TemporaryActivityClockDO> findClockPhoto(ActivityVo activityVo);
Map<Long, List<TemporaryActivityPhotoDO>> findActivityPhotos(List<Long> activityId);
}
package com.wangxiaolu.export.service.impl;
import com.wangxiaolu.export.mapper.TemporaryActivityClockMapper;
import com.wangxiaolu.export.mapper.TemporaryActivityPhotoMapper;
import com.wangxiaolu.export.mapper.TemporaryActivityReportedMapper;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityClockDO;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityPhotoDO;
import com.wangxiaolu.export.mapper.entity.TemporaryActivityReportedDO;
import com.wangxiaolu.export.pojo.ActivityVo;
import com.wangxiaolu.export.service.PromotionActivityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author : liqiulin
* @date : 2024-06-14 15
* @describe :
*/
@Service
public class PromotionActivityServiceImpl implements PromotionActivityService {
@Autowired
TemporaryActivityReportedMapper temporaryActivityReportedMapper;
@Autowired
TemporaryActivityClockMapper temporaryActivityClockMapper;
@Autowired
TemporaryActivityPhotoMapper temporaryActivityPhotoMapper;
/**
* 查询上报记录
*/
@Override
public List<TemporaryActivityReportedDO> findActivityList(ActivityVo activityVo) {
List<TemporaryActivityReportedDO> dos = temporaryActivityReportedMapper.findList(activityVo);
return dos;
}
/**
* 查询打卡记录
*/
@Override
public List<TemporaryActivityClockDO> findClockPhoto(ActivityVo activityVo) {
List<TemporaryActivityClockDO> clockPhotoList = temporaryActivityClockMapper.findClockPhotoList(activityVo);
return clockPhotoList;
}
/**
* 根据活动记录id、打卡记录id,查询所有图片
*/
@Override
public Map<Long, List<TemporaryActivityPhotoDO>> findActivityPhotos(List<Long> activityId) {
List<TemporaryActivityPhotoDO> activityPhotoDOS = temporaryActivityPhotoMapper.findActivityPhotos(activityId);
Map<Long, List<TemporaryActivityPhotoDO>> activityPhotoMap = activityPhotoDOS.stream().collect(Collectors.groupingBy(TemporaryActivityPhotoDO::getReportedId));
return activityPhotoMap;
}
}
package com.wangxiaolu.export.util;
import java.util.LinkedHashMap;
/**
* @author sunnyzyq
* @date 2021/12/17
*/
public class ExcelClassField {
/**
* 字段名称
*/
private String fieldName;
/**
* 表头名称
*/
private String name;
/**
* 映射关系
*/
private LinkedHashMap<String, String> kvMap;
/**
* 示例值
*/
private Object example;
/**
* 排序
*/
private int sort;
/**
* 是否为注解字段:0-否,1-是
*/
private int hasAnnotation;
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LinkedHashMap<String, String> getKvMap() {
return kvMap;
}
public void setKvMap(LinkedHashMap<String, String> kvMap) {
this.kvMap = kvMap;
}
public Object getExample() {
return example;
}
public void setExample(Object example) {
this.example = example;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
public int getHasAnnotation() {
return hasAnnotation;
}
public void setHasAnnotation(int hasAnnotation) {
this.hasAnnotation = hasAnnotation;
}
}
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://bj-cdb-j8ppdy86.sql.tencentcdb.com:63569/promotion_dev?autoReconnect=true
username: LnNDBM
password: fd0%bhD4@oO(%
# redis:
# port: 21101
# host: bj-crs-oyzhz3c6.sql.tencentcdb.com
# database: 0
# password: u)R3jrHk(qwt~mv$Tg=U
cloud:
nacos:
discovery:
server-addr: 42.193.103.153:8848
namespace: dd681f3c-0d21-42e5-a96e-14863a7cdcdb
group: promotion
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.0.18:3306/promotion?autoReconnect=true
username: NvqGbJXH
password: D9Y@FR,84B*$MD^A36&m
# redis:
# port: 21101
# host: bj-crs-oyzhz3c6.sql.tencentcdb.com
# database: 0
# password: u)R3jrHk(qwt~mv$Tg=U
cloud:
nacos:
discovery:
server-addr: 192.168.0.2:8848
namespace: 5a4d4bfc-5297-4c6f-b475-0a6ae838d8d9
group: promotion
spring.application.name=wangxiaolu-export
server:
port: 8012
spring:
application:
name: wangxiaolu-export
profiles:
active: dev
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxiaolu.export.mapper.TemporaryActivityClockMapper">
<resultMap id="clockMap" type="com.wangxiaolu.export.mapper.entity.TemporaryActivityClockDO">
<result property="temporaryId" column="temporary_id" jdbcType="BIGINT"/>
<result property="createDate" column="create_date" jdbcType="VARCHAR"/>
<collection property="photoList" ofType="com.wangxiaolu.export.mapper.entity.TemporaryActivityPhotoDO">
<result property="type" column="type" jdbcType="INTEGER"/>
<result property="photoUrl" column="photo_url" jdbcType="VARCHAR"/>
</collection>
</resultMap>
<select id="findClockPhotoList" resultMap="clockMap">
select ar.temporary_id temporary_id,
ar.create_date create_date,
ap.type type,
ap.photo_url photo_url
from temporary_activity_reported ar
inner join temporary_activity_clock ac
on ar.temporary_id = ac.temporary_id and ar.create_date = ac.create_date
inner join temporary_activity_photo ap on ac.id = ap.clock_id
where (ar.create_time between #{params.createDateStart} and #{params.createDateEnd})
and ap.is_delete = 1;
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxiaolu.export.mapper.TemporaryActivityPhotoMapper">
<resultMap id="BaseResultMap"
type="com.wangxiaolu.export.mapper.entity.TemporaryActivityPhotoDO">
<result property="reportedId" column="reported_id" jdbcType="BIGINT"/>
<result property="clockId" column="clock_id" jdbcType="BIGINT"/>
<result property="type" column="type" jdbcType="INTEGER"/>
<result property="photoUrl" column="photo_url" jdbcType="VARCHAR"/>
</resultMap>
<select id="findActivityPhotos" resultMap="BaseResultMap">
select reported_id, type, photo_url
from temporary_activity_photo
where is_delete = 1
and reported_id in (45, 46, 47);
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxiaolu.export.mapper.TemporaryActivityReportedMapper">
<resultMap id="BaseResultMap"
type="com.wangxiaolu.export.mapper.entity.TemporaryActivityReportedDO">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="temporaryId" column="temporary_id" jdbcType="INTEGER"/>
<result property="activityPattern" column="activity_pattern" jdbcType="VARCHAR"/>
<result property="storeName" column="store_name" jdbcType="VARCHAR"/>
<result property="city" column="city" jdbcType="VARCHAR"/>
<result property="approveName" column="approve_name" jdbcType="VARCHAR"/>
<result property="createDate" column="create_date" jdbcType="CHAR"/>
<result property="lineName" column="line_name" jdbcType="VARCHAR"/>
<result property="orgName" column="org_name" jdbcType="VARCHAR"/>
</resultMap>
<select id="findList" resultMap="BaseResultMap">
select ar.id,
ar.temporary_id,
ar.approver_id,
ar.approve_name,
ar.city,
ar.create_date,
ar.store_id,
ar.store_name,
ar.activity_pattern,
ps.line_name,
qd.org_name
from temporary_activity_reported ar
left join promotion_store ps on ar.store_id = ps.id
left join qince_employee qe on ar.approver_id = qe.qc_id
left join qince_department qd on qe.waiqin365_org_id = qd.qc_id
where (ar.create_time between #{params.createDateStart} and #{params.createDateEnd})
and (qd.org_name like '%战区' or qd.org_name = '重客运营部');
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论