提交 cd80199c authored 作者: zjm2's avatar zjm2

Initial commit

上级
流水线 #2 已失败 于阶段
# dir files
/target/
/log/*
/file
/files
# Compiled class file
*.class
# Log file
*.log
.log
**/.log
# publisher file
schemes.json
# BlueJ files
*.ctxt
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# other files
!.mvn/wrapper/maven-wrapper.jar
*#
*.iml
*.ipr
*.iws
*.jar
*.sw?
*~
.#*
.*.md.html
.DS_Store
.classpath
.factorypath
.gradle
.idea
.metadata
.project
.recommenders
.settings
.springBeans
/build
/code
MANIFEST.MF
_site/
activemq-data
bin
build
build.log
dependency-reduced-pom.xml
dump.rdb
interpolated*.xml
lib/
manifest.yml
overridedb.*
settings.xml
target
transaction-logs
.flattened-pom.xml
secrets.yml
.gradletasknamecache
.sts4-cache
\ No newline at end of file
stages:
- build
- test
- deploy
- manual_build
cache:
paths:
- /notes-union/target/*.jar
auto_build:
stage: build
only:
- master
tags:
- MCJ-Runner
script:
- mvn clean package -Dskiptests=true
auto_test:
stage: test
only:
- master
tags:
- MCJ-Runner
script:
- echo "test skiped."
auto_deploy:
stage: deploy
only:
- master
tags:
- MCJ-Runner
script:
#登录159服务器远程执行命令
- java -jar /notes-union/target/*.jar > dev/null/ &
manual_build:
stage: manual_build
only:
- master
tags:
- MCJ-Runner
script:
- mvn clean package -Dskiptests=true
when: manual
artifacts:
when: on_success
expire_in: 1 days
paths:
- /notes-union/target/*.jar
\ No newline at end of file
# 工作薄项目介绍
本项目分成5个功能点,分别是用户管理系统、工作本、工作记录、统计分析、考评统计。
具体参考资料见doc
## 第一阶段计划
第一阶段只完成用户管理系统、工作本、工作记录三个点。对此三个功能点按模块进行开发,具体分工如下:
| 模块名称 | 模块简称 | 负责人 | 补充说明 |
| ------------ | ------------------------------ | ------ | -------- |
| 人员权限模块 | pas(personnel access system) | mcj| |
| 工作记录模块 | job | hct、zjm、ljj | |
| 搜索模块 | search | ljj | |
| 文件存储模块 | fs(file store) | ljj | |
| 状态管理模块 | sms(state management system) | zjm | |
| 通用工具类模块 | misc | | |
| 综合模块 | union | | |
|redis模块|redis|mcj|redis|
|周报模块|weekly|ljj| |
## 版本说明
v1.0.1
1.修复websocket不支持https
2.新增功能 支持https
3.新增功能redis数据同步到es 仅限后台使用
4.修复工作台提交任务,完结任务操作历史记录显示bug
5.修复工作台,不同状态数量计算错误bug
6.新增周报模块(未启用)
7.新建任务可以自己给自己发任务
\ No newline at end of file
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<!-- 检查文件是否以一个空行结束 -->
<module name="NewlineAtEndOfFile"/>
<!-- 文件长度不超过1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<!-- 每个java文件一个语法树 -->
<module name="TreeWalker">
<!-- import检查-->
<!-- 检查是否从非法的包中导入了类 -->
<module name="IllegalImport"/>
<!-- 检查是否导入了多余的包 -->
<module name="RedundantImport"/>
<!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 -->
<module name="UnusedImports" />
<!-- 注释检查 -->
<!-- 检查构造函数的javadoc -->
<module name="JavadocType">
<property name="allowUnknownTags" value="true"/>
<message key="javadoc.missing" value="类注释:缺少Javadoc注释。"/>
</module>
<!-- 命名检查 -->
<!-- 局部的final变量,包括catch中的参数的检查 -->
<module name="LocalFinalVariableName" />
<!-- 局部的非final型的变量,包括catch中的参数的检查 -->
<module name="LocalVariableName" />
<!-- 包名的检查(只允许小写字母),默认^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
<message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 仅仅是static型的变量(不包括static final型)的检查 -->
<module name="StaticVariableName" />
<!-- Class或Interface名检查,默认^[A-Z][a-zA-Z0-9]*$-->
<module name="TypeName">
<property name="severity" value="warning"/>
<message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 非static型变量的检查 -->
<module name="MemberName" />
<!-- 方法名的检查 -->
<module name="MethodName" />
<!-- 方法的参数名 -->
<module name="ParameterName " />
<!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
<module name="ConstantName" />
<!-- 定义检查 -->
<!-- 检查数组类型定义的样式 -->
<module name="ArrayTypeStyle"/>
<!-- 检查long型定义是否有大写的“L” -->
<module name="UpperEll"/>
<!-- 长度检查 -->
<!-- 每行不超过140个字符 -->
<module name="LineLength">
<property name="max" value="140" />
</module>
<!-- 方法不超过50行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="50" />
</module>
<!-- 方法的参数个数不超过5个。 并且不对构造方法进行检查-->
<module name="ParameterNumber">
<property name="max" value="5" />
<property name="ignoreOverriddenMethods" value="true"/>
<property name="tokens" value="METHOD_DEF" />
</module>
<!-- 空格检查-->
<!-- 方法名后跟左圆括号"(" -->
<module name="MethodParamPad" />
<!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
<module name="TypecastParenPad" />
<!-- 检查在某个特定关键字之后应保留空格 -->
<module name="NoWhitespaceAfter"/>
<!-- 检查在某个特定关键字之前应保留空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 操作符换行策略检查 -->
<module name="OperatorWrap"/>
<!-- 圆括号空白 -->
<module name="ParenPad"/>
<!-- 检查分隔符是否在空白之后 -->
<module name="WhitespaceAfter"/>
<!-- 检查分隔符周围是否有空白 -->
<module name="WhitespaceAround"/>
<!-- 修饰符检查 -->
<!-- 检查修饰符的顺序是否遵照java语言规范,默认public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 检查接口和annotation中是否有多余修饰符,如接口方法不必使用public -->
<module name="RedundantModifier"/>
<!-- 代码块检查 -->
<!-- 检查是否有嵌套代码块 -->
<module name="AvoidNestedBlocks"/>
<!-- 检查是否有空代码块 -->
<module name="EmptyBlock"/>
<!-- 检查左大括号位置 -->
<module name="LeftCurly"/>
<!-- 检查代码块是否缺失{} -->
<module name="NeedBraces"/>
<!-- 检查右大括号位置 -->
<module name="RightCurly"/>
<!-- 代码检查 -->
<!-- 检查空的代码段 -->
<module name="EmptyStatement"/>
<!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
<module name="EqualsHashCode"/>
<!-- 检查局部变量或参数是否隐藏了类中的变量 -->
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
</module>
<!-- 检查子表达式中是否有赋值操作 -->
<module name="InnerAssignment"/>
<!-- 检查switch语句是否有default -->
<module name="MissingSwitchDefault"/>
<!-- 检查是否有过度复杂的布尔表达式 -->
<module name="SimplifyBooleanExpression"/>
<!-- 检查是否有过于复杂的布尔返回代码段 -->
<module name="SimplifyBooleanReturn"/>
<!-- 类设计检查 -->
<!-- 检查类是否为扩展设计l -->
<!-- 检查只有private构造函数的类是否声明为final -->
<module name="FinalClass"/>
<!-- 检查接口是否仅定义类型 -->
<module name="InterfaceIsType"/>
<!-- 检查类成员的可见度 检查类成员的可见性。只有static final 成员是public的
除非在本检查的protectedAllowed和packagedAllowed属性中进行了设置-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>
<!-- 语法 -->
<!-- String的比较不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- 限制for循环最多嵌套2层 -->
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<!-- if最多嵌套3层 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!-- 检查未被注释的main方法,排除以Application结尾命名的类 -->
<module name="UncommentedMain">
<property name="excludedClasses" value=".*[Application,Test]$"/>
</module>
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="illegalPattern" value="true"/>
</module>
<!-- return个数 3个-->
<module name="ReturnCount">
<property name="max" value="3"/>
</module>
<!--try catch 异常处理数量 3-->
<module name="NestedTryDepth ">
<property name="max" value="3"/>
</module>
<!-- clone方法必须调用了super.clone() -->
<module name="SuperClone" />
<!-- finalize 必须调用了super.finalize() -->
<module name="SuperFinalize" />
</module>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tynotes</artifactId>
<groupId>com.zjty.tynotes</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>notes-fs</artifactId>
<dependencies>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-misc</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-fs</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mongodb dev-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.zjty.tynotes.fs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author LJJ
* on 2019-04-25
*/
@EnableSwagger2
@SpringBootApplication
public class FsApplication {
public static void main(String[] args) {
SpringApplication.run(FsApplication.class, args);
}
}
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen### Linux template
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen### Linux template
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
package com.zjty.tynotes.fs.config;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
/**
* @author zjm
*/
@Configuration
public class MongoConf {
@Autowired
private MongoDbFactory mongoDbFactory;
@Autowired
private GridFSBucket gridFSBucket;
@Bean
public GridFSBucket getGridFSBucket() {
MongoDatabase db = mongoDbFactory.getDb();
return GridFSBuckets.create(db);
}
}
package com.zjty.tynotes.fs.subject.controller;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.mongodb.client.gridfs.model.GridFSUploadOptions;
import com.zjty.tynotes.fs.subject.entity.FsResponse;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-29
*/
@RestController
@RequestMapping("/files")
@AutoDocument
@Slf4j
@Api(tags = "文件下载下载接口", value = "文件上传下载文件的接口")
public class FileController {
@Autowired
private MongoDbFactory mongoDbFactory;
@Autowired
private GridFsTemplate gridFsTemplate;
/**
* 上传文件
*
* @param file 文件
* @return 文件名和文件存储的fileId键值对的Map
*/
@ApiOperation(value = "上传文件的接口")
@PostMapping("/upload")
public ResponseEntity<FsResponse> upload(@RequestParam(value = "file") MultipartFile file) {
GridFSBucket gridFSBucket = GridFSBuckets.create(mongoDbFactory.getDb());
Map<String, ObjectId> map = new HashMap<>();
try {
InputStream streamToUploadFrom = file.getInputStream();
Document document = new Document();
//自定义数据,放入文件真正名和文件类型
document.append("fileTrueName", file.getOriginalFilename());
document.append("contentType", file.getContentType());
//设置chunks长度为358400字节,如果文件过大则创建新的分块
// 自定义的数据放在metadata里
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(358400)
.metadata(document);
ObjectId fileId = gridFSBucket.uploadFromStream(UUID.randomUUID().toString(), streamToUploadFrom, options);
log.info("上传成功," + "文件名:" + file.getOriginalFilename() + "文件ID:" + fileId);
map.put(file.getOriginalFilename(), fileId);
return ResponseEntity.ok(new FsResponse(fileId.toString()));
} catch (Exception e) {
log.error("[fs] 文件上传失败");
return ResponseEntity.ok(new FsResponse("上传失败"));
}
}
/**
* 通过文件fileId下载文件
*
* @param fileId 文件fileId
* @param response 文件输出流
*/
@ApiOperation(value = "下载文件的接口")
@RequestMapping(value = "/download")
public void downLoadByFileId(@RequestParam(value = "fileId") ObjectId fileId
, HttpServletRequest request, HttpServletResponse response) {
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
try {
//获取回复的输出流
OutputStream sos = response.getOutputStream();
//设置编码格式
response.setCharacterEncoding("UTF-8");
// response.setHeader("Access-Control-Allow-Origin", "*");
//设置文件返回类型,为上传文件时获取的文件类型
// response.setContentType(gridFSFile.getMetadata().get("contentType").toString());
String fileName = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId))).getMetadata().get("fileTrueName").toString();
response.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName,"UTF-8") + "\"");
response.setContentType("application/octet-stream;charset=UTF-8");
// response.setHeader("Access-Control-Allow-Origin", request.getHeader("*"));
// response.setHeader("Access-Control-Allow-Credentials", "true");
// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE");
// response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
GridFSBucket bucket = GridFSBuckets.create(mongoDbFactory.getDb());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 获取Mongodb中文件的缓存输出流
bucket.downloadToStream(gridFSFile.getId(), sos);
//将查询到的数据放入到输出流sos中
sos.flush();
sos.close();
} catch (Exception e) {
log.error("下载文件失败,失败原因:{}", e.getMessage());
}
}
}
package com.zjty.tynotes.fs.subject.entity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author ljj
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "上传文件返回的id", description = "上传文件返回的id")
public class FsResponse {
@ApiModelProperty(value = "文件id", name = "id", example = "asdafsqwewqe1qe")
private String id;
}
package com.zjty.tynotes.fs.subject.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author LJJ
* on 2019-04-23
*/
public interface FsUtil {
/**
* 存文件,返回一个默认id
* 根据文件路径上传文件
*
* @param path 路径
* @return 返回文件的id
*/
String save(String path);
/**
* 存文件,返回一个默认id
* 通过http servlet request获取文件进行保存
*
* @param httpServletRequest http servlet request
* @return 文件的id
*/
String save(HttpServletRequest httpServletRequest);
/**
* 根据id下载文件
*
* @param id id
* @param request request
* @param response response
*/
void download(String id, HttpServletRequest request, HttpServletResponse response);
/**
* 根据文件id删除文件
*
* @param id 文件id
*/
void delete(String id);
}
package com.zjty.tynotes.fs.subject.service.impl;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.zjty.tynotes.fs.subject.service.FsUtil;
import lombok.extern.slf4j.Slf4j;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-04-28
*/
@Slf4j
@Service
public class FsUtilImpl implements FsUtil {
@Autowired
private MongoDbFactory mongoDbFactory;
@Autowired
private GridFsTemplate gridFsTemplate;
@Override
public String save(String path) {
try {
InputStream inputStream = new FileInputStream(path);
String fileName = new Date().toString();
ObjectId id = gridFsTemplate.store(inputStream, fileName);
return id.toString();
} catch (FileNotFoundException e) {
log.error("[fs] the err msg is : {}", e.getMessage());
return "";
}
}
@Override
public String save(HttpServletRequest httpServletRequest) {
try {
Part part = httpServletRequest.getPart("file");
InputStream inputStream = part.getInputStream();
String fileName = new Date().toString();
ObjectId id = gridFsTemplate.store(inputStream, fileName);
return id.toString();
} catch (IOException | ServletException e) {
log.error("[fs] the err msg is: {}", e.getMessage());
return "";
}
}
@Override
public void download(String id, HttpServletRequest request, HttpServletResponse response) {
GridFSBucket bucket = GridFSBuckets.create(mongoDbFactory.getDb());
// 重置响应对象
response.reset();
// 当前日期,用于导出文件名称
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateStr = "filename" + sdf.format(new Date()) + ".zip";
// 指定下载的文件名--设置响应头
response.addHeader("Content-Disposition", "attachment;filename=" + dateStr);
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
// 写出数据输出流到页面
try {
OutputStream output = response.getOutputStream();
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
bucket.downloadToStream(new ObjectId(id), bufferedOutPut);
bufferedOutPut.flush();
bufferedOutPut.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void delete(String id) {
gridFsTemplate.delete(new Query(Criteria.where("_id").is(id)));
}
}
# port
server.port=8088
# mongodb configuration
spring.data.mongodb.uri=mongodb://localhost:27017/tynotes
# servlet configuration
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB
\ No newline at end of file
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen### Linux template
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tynotes</artifactId>
<groupId>com.zjty.tynotes</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>notes-job</artifactId>
<dependencies>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-misc</artifactId>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-job</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-pas</artifactId>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-job</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-sms</artifactId>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-job</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-search</artifactId>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-job</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-redis</artifactId>
<exclusions>
<exclusion>
<groupId>com.zjty.tynotes</groupId>
<artifactId>notes-job</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.zjty.tynotes.job;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @author LJJ
* on 2019-04-11
*/
@SpringBootApplication
@ComponentScan(basePackages = {
"com.zjty.tynotes.misc",
"com.zjty.tynotes.pas",
"com.zjty.tynotes.job",
"com.zjty.tynotes.search",
"com.zjty.tynotes.redis",
"com.zjty.tynotes.sms"
})
@EnableCaching
@EnableScheduling
public class JobApplication {
public static void main(String[] args) {
SpringApplication.run(JobApplication.class, args);
}
}
package com.zjty.tynotes.job.basic.controller;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.job.basic.entity.response.JobResponse;
import com.zjty.tynotes.job.basic.service.AttachmentService;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import static org.springframework.http.ResponseEntity.ok;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/5 10:08
* <p>@author : C
*/
@AutoDocument
@Api(tags = "工作记录相关接口", description = "工作记录模块")
@RestController
@RequestMapping("/job/attachment")
public class AttachmentController {
private final
AttachmentService attachmentService;
@Autowired
public AttachmentController(AttachmentService attachmentService) {
this.attachmentService = attachmentService;
}
@PostMapping("/{workId}")
@ApiOperation(value = "新增附件并将其添加到所属工作中.", notes = "新增不可在数据中附带id.需要在路径中指定所属工作的id.成功时返回新增数据保存的id.")
public ResponseEntity<JobResponse> add(@RequestBody Attachment attachment, @PathVariable String workId) {
String saveId = attachmentService.add(attachment, workId);
return ok(new JobResponse(saveId));
}
@PutMapping()
@ApiOperation(value = "修改附件.", notes = "修改必须在数据中附带id.")
public ResponseEntity<JobResponse> modify(@RequestBody Attachment attachment) {
String saveId = attachmentService.modify(attachment);
return ok(new JobResponse(saveId));
}
@DeleteMapping("/{attachmentId}")
@ApiOperation(value = "根据id删除附件.")
public ResponseEntity<JobResponse> delete(@PathVariable String attachmentId) {
return ok(new JobResponse());
}
}
package com.zjty.tynotes.job.basic.controller;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.job.basic.entity.response.JobResponse;
import com.zjty.tynotes.job.basic.service.CommentService;
import com.zjty.tynotes.job.status.service.BusinessTreeManagement;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import static org.springframework.http.ResponseEntity.ok;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/4/28 10:28
* <p>@author : C
*/
@AutoDocument
@Api(tags = "工作记录相关接口", description = "工作记录模块")
@RestController
@RequestMapping("/job/comment")
public class CommentController {
private final
CommentService commentService;
@Autowired
private BusinessTreeManagement businessTreeManagement;
@Autowired
public CommentController(CommentService commentService) {
this.commentService = commentService;
}
@PostMapping(value = "/{workId}")
@ApiOperation(value = "新增留言并将其添加到所属工作中.", notes = "新增不可在数据中附带id.需要在路径中指定所属工作的id.成功时返回新增数据保存的id.")
public ResponseEntity<JobResponse> add(@RequestBody Comment comment, @PathVariable String workId) {
String saveId = commentService.add(comment, workId);
businessTreeManagement.saveAction(comment.getCommentator(),workId,7,new Date(),"");
return ok(new JobResponse(saveId));
}
@PutMapping()
@ApiOperation(value = "修改留言.", notes = "修改必须在数据中附带id.")
public ResponseEntity<JobResponse> modify(@RequestBody Comment comment) {
String saveId = commentService.modify(comment);
return ok(new JobResponse(saveId));
}
@DeleteMapping("/{commentId}")
@ApiOperation(value = "根据id删除留言.")
public ResponseEntity<JobResponse> delete(@PathVariable String commentId) {
return ok(new JobResponse(commentId));
}
}
package com.zjty.tynotes.job.basic.controller;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.entity.request.UserRo;
import com.zjty.tynotes.job.basic.entity.request.WorkRo;
import com.zjty.tynotes.job.basic.entity.response.JobResponse;
import com.zjty.tynotes.job.basic.entity.response.WorkVo;
import com.zjty.tynotes.job.basic.service.TransHelper;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.business.service.AlterTaskService;
import com.zjty.tynotes.job.business.service.NoteMessageService;
import com.zjty.tynotes.job.common.Action;
import com.zjty.tynotes.job.status.service.BusinessTreeManagement;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static com.zjty.tynotes.job.common.Action.PUBLISH_WORK;
import static java.util.Objects.nonNull;
import static org.springframework.http.ResponseEntity.ok;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/22 15:02
* <p>@author : C
*/
@AutoDocument
@Api(tags = "工作记录相关接口", description = "工作记录模块")
@RestController
@RequestMapping("/job/work")
@Slf4j
public class WorkController {
private final
WorkService workService;
private final
TransHelper transHelper;
private final
NoteMessageService noteMessageService;
@Autowired
private AlterTaskService alterTaskService;
@Autowired
private BusinessTreeManagement businessTreeManagement;
@Autowired
public WorkController(WorkService workService, TransHelper transHelper, NoteMessageService noteMessageService) {
this.workService = workService;
this.transHelper = transHelper;
this.noteMessageService = noteMessageService;
}
@GetMapping(value = "/")
@ApiOperation(value = "查询所有工作.")
public ResponseEntity<List<WorkVo>> findAll() {
List<WorkVo> workVoList = workService.findAll().stream()
.map(transHelper::transToVo)
.collect(Collectors.toList());
return ok(workVoList);
}
@GetMapping(value = "/{workId}")
@ApiOperation(value = "根据id查询工作.", notes = "在路径中指定要查询的工作id.")
public ResponseEntity<WorkVo> findById(@PathVariable String workId) {
WorkVo workVo = transHelper.transToVo(workService.findById(workId));
return ok(workVo);
}
@PostMapping(value = "/")
@ApiOperation(value = "新增工作.", notes = "新增不可在数据中附带id.成功时返回新增数据保存的id.")
public ResponseEntity<JobResponse> add(@RequestBody WorkRo workRo) {
String userId = workRo.getUserId();
String remarks = workRo.getRemarks();
Work work = workRo.getWork();
String workId = workService.add(work);
Boolean isFormal = work.getIsFormal();
if (nonNull(isFormal) && isFormal) {
noteMessageService.saveNoteMessage(userId, workId, PUBLISH_WORK, remarks);
}
return ok(new JobResponse(workId));
}
@PutMapping(value = "/")
@ApiOperation(value = "更新工作.", notes = "修改必须在数据中附带id.")
public ResponseEntity<JobResponse> modify(@RequestBody WorkRo workRo) {
String userId = workRo.getUserId();
String remarks = workRo.getRemarks();
Work newWork = workRo.getWork();
Work oldWork = workService.findById(newWork.getId());
String workId = workService.modify(newWork);
noteMessageService.saveNoteMessage(userId, workId, newWork, oldWork, remarks);
return ok(new JobResponse(workId));
}
@GetMapping(value = "/draft/{userId}")
@ApiOperation(value = "根据当前用户id查询其拥有的草稿.")
public ResponseEntity<List<WorkVo>> add(@PathVariable String userId) {
return ok(workService.findAll().stream()
.filter(work1 -> !work1.getIsFormal())
.filter(work -> work.getPublisher().equals(userId))
.map(transHelper::transToVo)
.collect(Collectors.toList()));
}
@DeleteMapping(value = "/{workId}")
@ApiOperation(value = "根据id删除工作.", notes = "在路径中指定要删除的工作id.")
public ResponseEntity<JobResponse> delete(@PathVariable String workId) {
workService.delete(workId);
return ok(new JobResponse(workId));
}
@PutMapping(value = "/status")
@ApiOperation(value = "修改工作状态")
public ResponseEntity alterTaskStatus(@RequestParam String taskId,
@RequestParam String userId,
@RequestParam String status,
@RequestParam String msg) {
switch (status) {
case "underway":
alterTaskService.alterTaskStatus(taskId, status);
businessTreeManagement.saveAction(userId, taskId, Action.BACK_WORK, new Date(), msg);
break;
case "finished":
alterTaskService.alterTaskStatus(taskId, status);
businessTreeManagement.saveAction(userId, taskId, Action.FINISH_WORK, new Date(), msg);
break;
case "committed":
alterTaskService.alterTaskStatus(taskId, status);
businessTreeManagement.saveAction(userId, taskId, Action.COMMIT_WORK, new Date(), msg);
break;
default:
log.warn("[job] 修改任务状态传入的参数有误,传入值为:{}", status);
break;
}
return ok("success");
}
@PostMapping(value = "/updateChecker")
@ApiOperation(value = "修改审核者")
public ResponseEntity updateChecker(@RequestBody UserRo userRo) {
alterTaskService.updateChecker(userRo);
businessTreeManagement.saveAction(userRo.getOperatorId(), userRo.getWorkId(), Action.ALTER_CHECKER,
new Date(), "");
return ok("success");
}
@PostMapping(value = "/updateFlower")
@ApiOperation(value = "修改关注者")
public ResponseEntity updateFlower(@RequestBody UserRo userRo) {
alterTaskService.updateFlower(userRo);
businessTreeManagement.saveAction(userRo.getOperatorId(), userRo.getWorkId(), Action.ALTER_FOLLOWER,
new Date(), "");
return ok("success");
}
}
package com.zjty.tynotes.job.basic.entity.database;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/22 15:32
* <p>@author : C
* 附件
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "附件", description = "附件对象")
public class Attachment {
/**
* id
*/
@Id
@ApiModelProperty(value = "id", example = "id", notes = "若新增数据则不可附带id.更新已有数据则必须附带id.")
private String id;
@ApiModelProperty(value = "文件名", example = "test file")
private String name;
@ApiModelProperty(value = "文件后缀", example = "doc")
private String suffix;
/**
* 上传者id
*/
@NotNull
@ApiModelProperty(value = "id", example = "user id")
private String uploader;
/**
* 附件类型
*/
@ApiModelProperty(value = "附件类型:init(初始)、work(工作)、comment(交流)", example = "init")
private String type;
/**
* 上传时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "上传时间", example = "yyyy-MM-dd HH:mm:ss")
private Date time;
/**
* url资源
*/
@NotNull
@ApiModelProperty(value = "文件id.使用文件id调用文件系统的api可以获取文件.", example = "file id")
private String fileId;
}
package com.zjty.tynotes.job.basic.entity.database;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/22 15:17
* <p>@author : C
* 留言(评论)
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "留言", description = "留言对象")
public class Comment {
/**
* id
*/
@Id
@ApiModelProperty(value = "id", example = "id", notes = "若新增数据则不可附带id.更新已有数据则必须附带id")
private String id;
/**
* 评论者id
*/
@NotNull
@ApiModelProperty(value = "评论者id", example = "user id")
private String commentator;
/**
* 评论时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "评论创建时间", example = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 评论时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "评论更新时间", example = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 内容
*/
@NotNull
@ApiModelProperty(value = "内容", example = "some content")
private String content;
}
package com.zjty.tynotes.job.basic.entity.database;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/22 14:58
* <p>@author : C
* 工作记录
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "工作", description = "工作对象")
public class Work {
/**
* id
*/
@Id
@ApiModelProperty(value = "id.若新增数据则不可附带id.更新已有数据则必须附带id.", example = "id", notes = "若新增数据则不可附带id.更新已有数据则必须附带id")
private String id;
/**
* 标题
*/
@NotNull
@ApiModelProperty(value = "标题", example = "请输入标题")
private String title;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "创建时间", example = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 预计完成时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "预计完成时间", example = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "更新时间", example = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/*相关用户 同一个人不能同时担任多种职位*/
/**
* 发布者id
*/
@NotNull
@ApiModelProperty(value = "发布者的用户id.", example = "id")
private String publisher;
/**
* 执行者id
*/
@NotNull
@ApiModelProperty(value = "执行者的用户id.", example = "id")
private String executor;
/**
* 审核者id集合
*/
@NotNull
@ApiModelProperty(value = "审核者的用户id集合.", example = "[\"id\",\"id\"]")
private List<String> checker;
/**
* 关注者id集合
*/
@NotNull
@ApiModelProperty(value = "关注者的用户id集合.", example = "[\"id\",\"id\"]")
private List<String> follower;
/**
* 附件id
*/
@NotNull
@ApiModelProperty(value = "附件的id集合.", example = "[\"id\",\"id\"]")
private List<String> attachment;
/**
* 留言id
*/
@NotNull
@ApiModelProperty(value = "留言的id集合.", example = "[\"id\",\"id\"]")
private List<String> comment;
/*工作内容*/
/**
* 内容
* 内容字数有上限3000个字,上限可设置。
*/
@NotNull
@ApiModelProperty(value = "内容", example = "内容...............", notes = "内容字数有上限3000个字,上限可设置.")
private String content;
/**
* 是否为正式的
* 正式的是在工作簿页面上显示的
* 非正式的是不在工作簿页面上显示的 目前就是草稿
* <p>
* 申请任务时只能指定审核者和关注者
* 申请的任务转正后发布者为审核者 执行者为申请者
*/
@NotNull
@ApiModelProperty(value = "是否为正式的.正式的是在工作簿页面上显示的.非正式的目前就是草稿.", example = "true")
private Boolean isFormal;
/**
* 工作状态
* 目前有:进行中、已提交、已完结
*/
@NotEmpty
@NotNull
@ApiModelProperty(value = "状态.进行中:underway、已提交:committed、已完结:finished", example = "finished")
private String status;
}
package com.zjty.tynotes.job.basic.entity.request;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "修改审核人、关注人RO", description = "修改审核人、关注人")
@AutoDocument
public class UserRo {
@ApiModelProperty(value = "操作人id", example = "id")
private String operatorId;
@ApiModelProperty(value = "工作id", example = "id")
private String workId;
@ApiModelProperty(value = "人员id", example = "id")
private List<String> users;
}
package com.zjty.tynotes.job.basic.entity.request;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/13 15:53
* <p>@author : C
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "工作RO", description = "工作记录模块的请求数据对象")
public class WorkRo {
/**
* 当前用户id
*/
@ApiModelProperty(value = "当前用户id", example = "id")
private String userId;
/**
* 备注信息
*/
@ApiModelProperty(value = "备注信息", example = "some remarks")
private String remarks;
/**
* 工作对象
*/
@ApiModelProperty(value = "工作对象")
private Work work;
}
package com.zjty.tynotes.job.basic.entity.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjty.tynotes.misc.config.AutoDocument;
import com.zjty.tynotes.pas.entity.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/6/5 11:01
* <p>@author : C
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "留言VO")
public class CommentVo {
/**
* id
*/
@Id
@ApiModelProperty(value = "id", example = "id", notes = "若新增数据则不可附带id.更新已有数据则必须附带id")
private String id;
/**
* 评论者id
*/
@NotNull
@ApiModelProperty(value = "评论者")
private User commentator;
/**
* 评论时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "评论创建时间", example = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 评论时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "评论更新时间", example = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 内容
*/
@NotNull
@ApiModelProperty(value = "内容", example = "some content")
private String content;
}
package com.zjty.tynotes.job.basic.entity.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/17 14:21
* <p>@author : C
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobResponse {
private String id;
}
package com.zjty.tynotes.job.basic.entity.response;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.misc.config.AutoDocument;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.pas.entity.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* <p>Description : note
* <p>Date : 2019/4/23 11:21
* <p>@author : C
*/
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "工作VO", description = "工作记录模块的返回数据对象")
public class WorkVo {
/**
* id
*/
@ApiModelProperty(value = "id", example = "id")
private String id;
/**
* 标题
*/
@ApiModelProperty(value = "标题", example = "请输入标题")
private String title;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 预计完成时间
*/
@ApiModelProperty(value = "预计完成时间")
private Date completeTime;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/*相关用户 同一个人不能同时担任多种职位*/
/**
* 发布者
*
* @see User
*/
@ApiModelProperty(value = "发布者")
private User publisher;
/**
* 执行者
*
* @see User
*/
@ApiModelProperty(value = "执行者")
private User executor;
/**
* 审核者
*
* @see User
*/
@ApiModelProperty(value = "审核者")
private List<User> checker;
/**
* 关注者
*
* @see User
*/
@ApiModelProperty(value = "关注者")
private List<User> follower;
/**
* 附件
* 该任务中的附件
* 分3种类型:初始附件、工作附件、交流附件
* 由Attachment类中的type属性区分附件类型
*
* @see Attachment
*/
@ApiModelProperty(value = "附件.该任务中的附件,分3种类型:初始附件、工作附件、交流附件,由Attachment模型中的type属性区分附件类型.")
private List<Attachment> attachment;
/**
* 留言
*
* @see CommentVo
*/
@ApiModelProperty(value = "留言")
private List<CommentVo> comment;
/*工作内容*/
/**
* 内容
* 内容字数有上限3000个字,上限可设置。
*/
@ApiModelProperty(value = "内容", example = "若是内容过多,将显示滚动条,同时,内容字数有上限3000个字,上限可设置,若是内容超出,请附件。")
private String content;
/**
* 是否为正式的
* 正式的是在工作簿页面上显示的
* 非正式的是不在工作簿页面上显示的 目前就是草稿
* <p>
* 申请任务时只能指定审核者和关注者
* 申请的任务转正后发布者为审核者 执行者为申请者
*/
@ApiModelProperty(value = "是否为正式.正式的是在工作簿页面上显示的;非正式的是草稿.", example = "true", notes = "正式的是在工作簿页面上显示的;非正式的是草稿")
private Boolean isFormal;
/**
* Job状态
* 目前有:进行中、已提交、已完结
*/
@ApiModelProperty(value = "状态.进行中:underway、已提交:committed、已完结:finished.", example = "finished")
private String status;
}
package com.zjty.tynotes.job.basic.repository;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/**
* <p>Description : note
* <p>Date : 2019/4/24 16:38
* <p>@author : C
*/
@Repository
public interface AttachmentRepository extends MongoRepository<Attachment, String> {
}
package com.zjty.tynotes.job.basic.repository;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/**
* <p>Description : note
* <p>Date : 2019/4/25 11:28
* <p>@author : C
*/
@Repository
public interface CommentRepository extends MongoRepository<Comment, String> {
}
package com.zjty.tynotes.job.basic.repository;
import com.zjty.tynotes.job.basic.entity.database.Work;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* <p>Description : note
* <p>Date : 2019/4/23 9:45
* <p>@author : C
*/
@Repository
public interface WorkRepository extends MongoRepository<Work, String> {
}
package com.zjty.tynotes.job.basic.runner;
import com.google.common.collect.Lists;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.service.AttachmentService;
import com.zjty.tynotes.job.basic.service.CommentService;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.common.constant.AttachmentType;
import com.zjty.tynotes.pas.entity.User;
import com.zjty.tynotes.pas.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import static com.zjty.tynotes.job.common.constant.WorkStatus.UNDERWAY;
/**
* <p>Description : note
* <p>Date : 2019/4/24 16:42
* <p>@author : C
* 在项目启动时运行的一些内容.
*/
@SuppressWarnings("SpringAutowiredFieldsWarningInspection")
@Slf4j
@Component
public class JobRunner implements CommandLineRunner {
@Autowired
IUserService userService;
@Autowired
AttachmentService attachmentService;
@Autowired
CommentService commentService;
@Autowired
WorkService workService;
@Override
public void run(String... args) throws Exception {
log.info("工作记录模块:启动完毕.");
// initData();
}
private void initData() {
log.info("工作记录模块:开始初始化模拟数据");
attachmentService.deleteAll();
commentService.deleteAll();
workService.deleteAll();
Integer minSize = 4;
if (userService.findAll().size() < minSize) {
userService.registerUser(new User().createUser());
userService.registerUser(new User().createUser());
userService.registerUser(new User().createUser());
userService.registerUser(new User().createUser());
}
List<User> users = userService.findAll();
Boolean condition = (users.size() >= minSize);
if (condition) {
String publisher = users.get(0).getId();
String executor = users.get(1).getId();
List<String> checker = Lists.newArrayList(users.get(2).getId());
List<String> follower = Lists.newArrayList(users.get(3).getId());
Attachment attachment = new Attachment(null, "test file", "doc", publisher, AttachmentType.INIT, new Date(), "abcd");
Comment comment = new Comment(null, follower.get(0), new Date(), new Date(), "some contents");
Work work = new Work(
null,
"test",
new Date(),
new Date(),
new Date(),
publisher,
executor,
checker,
follower,
null,
null,
"some contents",
true,
UNDERWAY
);
String workId = workService.add(work);
attachmentService.add(attachment, workId);
commentService.add(comment, workId);
log.info("工作记录模块:生成模拟数据完毕.");
} else {
log.info("工作记录模块:用户模块的数据数量不足(需要至少4个).无法生成模拟工作记录模拟数据.");
}
}
}
package com.zjty.tynotes.job.basic.service;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.job.basic.service.impl.AttachmentServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>Description : note
* <p>Date : 2019/4/23 14:49
* <p>@author : C
* 实现类见↓
*
* @see AttachmentServiceImpl
*/
@Service
public interface AttachmentService {
/**
* 添加Attachment
* 不可附带id
*
* @param attachment Attachment对象
* @return 新保存对象的id
*/
String add(Attachment attachment);
/**
* 根据workId新增Attachment并与所属Work建立关系
* 不可附带id
*
* @param attachment Attachment对象
* @param workId 所属工作id
* @return Attachment对象的id
*/
String add(Attachment attachment, String workId);
/**
* 修改Attachment
* 必须附带id
*
* @param attachment Attachment对象
* @return 更新对象的id
*/
String modify(Attachment attachment);
/**
* 查询所有
*
* @return 对象集合
*/
List<Attachment> findAll();
/**
* 根据id集合查询所有
*
* @param ids id集合
* @return 对象集合
*/
List<Attachment> findAll(List<String> ids);
/**
* 根据id删除
*
* @param id 指定id
*/
void delete(String id);
/**
* 删除所有数据
*/
void deleteAll();
}
package com.zjty.tynotes.job.basic.service;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.job.basic.service.impl.CommentServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>Description : note
* <p>Date : 2019/4/23 14:43
* <p>@author : C
* 实现类见↓
*
* @see CommentServiceImpl
*/
@Service
public interface CommentService {
/**
* 新增Comment
* 不可附带id
*
* @param comment Comment对象
* @return 新增对象的id
*/
String add(Comment comment);
/**
* 根据workId新增Comment并与所属Work建立关系
* 不可附带id
*
* @param comment Comment对象
* @param workId 所属工作Id
* @return Comment对象的id
*/
String add(Comment comment, String workId);
/**
* 修改Comment
* 必须附带id
*
* @param comment Comment对象
* @return 更新对象的id
*/
String modify(Comment comment);
/**
* 查询所有
*
* @return 对象集合
*/
List<Comment> findAll();
/**
* 根据id集合查询所有
*
* @param ids id集合
* @return 对象集合
*/
List<Comment> findAll(List<String> ids);
/**
* 根据id删除
*
* @param id 指定id
*/
void delete(String id);
/**
* 删除所有数据
*/
void deleteAll();
}
package com.zjty.tynotes.job.basic.service;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.entity.response.WorkVo;
import com.zjty.tynotes.job.basic.service.impl.TransHelperImpl;
import org.springframework.stereotype.Service;
/**
* <p>Description : note
* <p>Date : 2019/4/23 11:33
* <p>@author : C
* 实现类见↓
*
* @see TransHelperImpl
*/
@Service
public interface TransHelper {
/**
* 把DataBase类型对象转换成Vo类型对象(DataBase类型用于存储 Vo类型用于跟前端交互)
*
* @param work Work对象
* @return WorkVo对象
*/
WorkVo transToVo(Work work);
/**
* 把Vo类型对象转换成DataBase类型对象(DataBase类型用于存储 Vo类型用于跟前端交互)
*
* @param workVo WorkVo对象
* @return Work
*/
Work transToDataBase(WorkVo workVo);
}
package com.zjty.tynotes.job.basic.service;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.service.impl.WorkServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>Description : note
* <p>Date : 2019/4/23 9:54
* <p>@author : C
* 实现类见↓
*
* @see WorkServiceImpl
*/
@SuppressWarnings("SpringAutowiredFieldsWarningInspection")
@Service
public interface WorkService {
/**
* 新增工作
* 不可附带id
*
* @param work Work对象
* @return 新增对象的id
*/
String add(Work work);
/**
* 修改工作
* 必须附带id
*
* @param work Work对象
* @return 更新对象的id
*/
String modify(Work work);
/**
* 指定id的Work是否存在
*
* @param workId 指定id
* @return 是否存在
*/
Boolean idExists(String workId);
/**
* 查询所有工作
*
* @return 对象集合
*/
List<Work> findAll();
/**
* 根据id集合查询所有
*
* @param ids id集合
* @return 对象集合
*/
List<Work> findAll(List<String> ids);
/**
* 查找指定id的Work
*
* @param workId 指定id
* @return Work对象
*/
Work findById(String workId);
/**
* 根据id删除
*
* @param id 指定id
*/
void delete(String id);
/**
* 删除所有数据
*/
void deleteAll();
// /**
// * 查看正在进行中的任务
// */
// List<Work> selectTimeWork();
}
package com.zjty.tynotes.job.basic.service.impl;
import com.google.common.collect.Lists;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.repository.AttachmentRepository;
import com.zjty.tynotes.job.basic.service.AttachmentService;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.common.exception.BadRequestException;
import com.zjty.tynotes.job.common.exception.NotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* <p>Description : note
* <p>Date : 2019/4/24 14:11
* <p>@author : C
* 接口定义说明见↓
*
* @see AttachmentService
*/
@Slf4j
@Service
public class AttachmentServiceImpl implements AttachmentService {
private final
AttachmentRepository attachmentRepository;
private final
WorkService workService;
@Autowired
public AttachmentServiceImpl(AttachmentRepository attachmentRepository, WorkService workService) {
this.attachmentRepository = attachmentRepository;
this.workService = workService;
}
@Override
public String add(Attachment attachment) {
String msg;
//新增数据不可附带id.
Boolean idMustNull = isNull(attachment.getId());
if (idMustNull) {
//更新时间
attachment.setTime(new Date());
String saveId = attachmentRepository.save(attachment).getId();
msg = String.format("[job] 新增了id为 %s 的数据.", saveId);
log.info(msg);
return saveId;
} else {
msg = "[job] 新增数据不可附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public String add(Attachment attachment, String workId) {
//新增数据不可附带id.
Boolean idMustNull = isNull(attachment.getId());
if (idMustNull) {
Boolean workMustExist = workService.idExists(workId);
if (workMustExist) {
String saveId = attachmentRepository.save(attachment).getId();
Work work = workService.findById(workId);
if (isNull(work.getAttachment())) {
work.setAttachment(Lists.newArrayList());
}
work.getAttachment().add(saveId);
workService.modify(work);
log.info(String.format("[job] id为 %s 的附件已添加到id为 %s 的所属工作中.", saveId, workId));
return saveId;
} else {
String msg = "[job] 指定id的所属工作不存在.";
log.error(msg);
throw new NotFoundException(msg);
}
} else {
String msg = "[job] 新增数据不可附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public String modify(Attachment attachment) {
Boolean idExist = nonNull(attachment.getId());
if (idExist) {
if (attachmentRepository.existsById(attachment.getId())) {
attachment.setTime(new Date());
String modifyId = attachmentRepository.save(attachment).getId();
log.info(String.format("[job] 修改了id为 %s 的数据.", modifyId));
return modifyId;
} else {
String msg = "[job] 指定id的数据不存在.";
log.error(msg);
throw new NotFoundException(msg);
}
} else {
String msg = "[job] 修改必须在数据中附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public List<Attachment> findAll() {
return attachmentRepository.findAll();
}
@Override
public List<Attachment> findAll(List<String> ids) {
return Lists.newArrayList(attachmentRepository.findAllById(ids));
}
@Override
public void delete(String id) {
}
@Override
public void deleteAll() {
attachmentRepository.deleteAll();
}
}
package com.zjty.tynotes.job.basic.service.impl;
import com.google.common.collect.Lists;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.repository.CommentRepository;
import com.zjty.tynotes.job.basic.service.CommentService;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.common.exception.BadRequestException;
import com.zjty.tynotes.job.common.exception.NotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* <p>Description : note
* <p>Date : 2019/4/24 14:25
* <p>@author : C
* 接口定义说明见↓
*
* @see CommentService
*/
@Slf4j
@Service
public class CommentServiceImpl implements CommentService {
private final
CommentRepository commentRepository;
private final
WorkService workService;
@Autowired
public CommentServiceImpl(CommentRepository commentRepository, WorkService workService) {
this.commentRepository = commentRepository;
this.workService = workService;
}
@Override
public String add(Comment comment) {
//新增数据不可附带id
Boolean idMustNull = isNull(comment.getId());
if (idMustNull) {
//更新时间
comment.setCreateTime(new Date());
comment.setUpdateTime(new Date());
String saveId = commentRepository.save(comment).getId();
log.info(String.format("[job] 新增了id为 %s 的数据.", saveId));
return saveId;
} else {
String msg = "[job] 新增数据不可附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public String add(Comment comment, String workId) {
Boolean idMustNull = isNull(comment.getId());
if (idMustNull) {
Boolean workMustExist = workService.idExists(workId);
if (workMustExist) {
String saveId = commentRepository.save(comment).getId();
Work work = workService.findById(workId);
if (isNull(work.getComment())) {
work.setComment(Lists.newArrayList());
}
work.getComment().add(saveId);
workService.modify(work);
log.info(String.format("[job] id为 %s 的留言已添加到id为 %s 的所属工作中.", saveId, workId));
return saveId;
} else {
String msg = "[job] 指定id的所属工作不存在.";
log.error(msg);
throw new NotFoundException(msg);
}
} else {
String msg = "[job] 新增数据不可附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public String modify(Comment comment) {
Boolean idMustExist = nonNull(comment.getId());
if (idMustExist) {
if (commentRepository.existsById(comment.getId())) {
comment.setUpdateTime(new Date());
String modifyId = commentRepository.save(comment).getId();
log.info(String.format("[job] 修改了id为 %s 的数据.", modifyId));
return modifyId;
} else {
String msg = "[job] 指定id的数据不存在.";
log.error(msg);
throw new NotFoundException(msg);
}
} else {
String msg = "[job] 修改必须在数据中附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public List<Comment> findAll() {
return commentRepository.findAll();
}
@Override
public List<Comment> findAll(List<String> ids) {
return Lists.newArrayList(commentRepository.findAllById(ids));
}
@Override
public void delete(String id) {
}
@Override
public void deleteAll() {
commentRepository.deleteAll();
}
}
package com.zjty.tynotes.job.basic.service.impl;
import com.zjty.tynotes.job.basic.entity.database.Attachment;
import com.zjty.tynotes.job.basic.entity.database.Comment;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.entity.response.CommentVo;
import com.zjty.tynotes.job.basic.entity.response.WorkVo;
import com.zjty.tynotes.job.basic.service.AttachmentService;
import com.zjty.tynotes.job.basic.service.CommentService;
import com.zjty.tynotes.job.basic.service.TransHelper;
import com.zjty.tynotes.pas.entity.User;
import com.zjty.tynotes.pas.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>Description : note
* <p>Date : 2019/4/24 17:05
* <p>@author : C
*/
@Service
@Slf4j
public class TransHelperImpl implements TransHelper {
private final
IUserService userService;
private final
AttachmentService attachmentService;
private final
CommentService commentService;
@Autowired
public TransHelperImpl(IUserService userService, AttachmentService attachmentService, CommentService commentService) {
this.userService = userService;
this.attachmentService = attachmentService;
this.commentService = commentService;
}
@Override
public WorkVo transToVo(Work work) {
User publisher = userService.findUserById(work.getPublisher());
User executor = userService.findUserById(work.getExecutor());
List<User> checkerList = userService.findUserByIds(work.getChecker());
List<User> followerList = userService.findUserByIds(work.getFollower());
List<Attachment> attachmentList = attachmentService.findAll(work.getAttachment());
List<Comment> commentList = commentService.findAll(work.getComment());
List<CommentVo> commentVoList = commentList.stream().map(this::toCommentVo).collect(Collectors.toList());
return new WorkVo(
work.getId(),
work.getTitle(),
work.getCreateTime(),
work.getCompleteTime(),
work.getUpdateTime(),
publisher,
executor,
checkerList,
followerList,
attachmentList,
commentVoList,
work.getContent(),
work.getIsFormal(),
work.getStatus()
);
}
@Override
public Work transToDataBase(WorkVo workVo) {
return new Work(
workVo.getId(),
workVo.getTitle(),
workVo.getCreateTime(),
workVo.getCompleteTime(),
workVo.getUpdateTime(),
workVo.getPublisher().getId(),
workVo.getExecutor().getId(),
getUserIds(workVo.getChecker()),
getUserIds(workVo.getFollower()),
getAttachmentIds(workVo.getAttachment()),
getCommentIds(workVo.getComment()),
workVo.getContent(),
workVo.getIsFormal(),
workVo.getStatus()
);
}
private List<String> getUserIds(List<User> userList) {
return userList.stream()
.map(User::getId)
.collect(Collectors.toList());
}
private List<String> getAttachmentIds(List<Attachment> attachmentList) {
return attachmentList.stream()
.map(Attachment::getId)
.collect(Collectors.toList());
}
private List<String> getCommentIds(List<CommentVo> commentVoList) {
return commentVoList.stream()
.map(CommentVo::getId)
.collect(Collectors.toList());
}
private CommentVo toCommentVo(Comment comment) {
return new CommentVo(
comment.getId(),
userService.findUserById(comment.getCommentator()),
comment.getCreateTime(),
comment.getUpdateTime(),
comment.getContent()
);
}
}
package com.zjty.tynotes.job.basic.service.impl;
import com.google.common.collect.Lists;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.repository.WorkRepository;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.common.exception.BadRequestException;
import com.zjty.tynotes.job.common.exception.NotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* <p>Description : note
* <p>Date : 2019/4/23 11:32
* <p>@author : C
* 接口定义说明见↓
*
* @see WorkService
*/
@Slf4j
@Service
public class WorkServiceImpl implements WorkService {
private final
WorkRepository workRepository;
@Autowired
public WorkServiceImpl(WorkRepository workRepository) {
this.workRepository = workRepository;
}
@Override
public String add(Work work) {
//新增数据不可附带id.
Boolean idMustNull = isNull(work.getId());
if (idMustNull) {
work.setCreateTime(new Date());
work.setUpdateTime(new Date());
String saveId = workRepository.save(work).getId();
log.info(String.format("[job] 新增了id为 %s 的数据.", saveId));
return saveId;
} else {
String msg = "[job] %s: 新增数据不可附带id.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public String modify(Work work) {
//更新数据必须指定id且指定id的数据存在.
Boolean idMustExist = (nonNull(work.getId())) && (workRepository.existsById(work.getId()));
if (idMustExist) {
String modifyId = workRepository.save(work).getId();
log.info(String.format("[job] 更新了id为 %s 的数据.", modifyId));
return modifyId;
} else {
String msg = "[job] 更新数据必须指定id且指定id的数据存在.";
log.error(msg);
throw new BadRequestException(msg);
}
}
@Override
public List<Work> findAll() {
return workRepository.findAll();
}
@Override
public List<Work> findAll(List<String> ids) {
return Lists.newArrayList(workRepository.findAllById(ids));
}
@Override
public Boolean idExists(String workId) {
return workRepository.existsById(workId);
}
@Override
public Work findById(String workId) {
Optional<Work> workOptional = workRepository.findById(workId);
return workOptional.orElseThrow(() -> new BadRequestException(String.format("[job] id为 %s 的数据不存在.", workId)));
}
@Override
public void delete(String workId) {
if (workRepository.existsById(workId)) {
workRepository.deleteById(workId);
} else {
throw new NotFoundException(String.format("[job] id为 %s 的工作不存在.", workId));
}
}
@Override
public void deleteAll() {
}
// @Override
// public List<Work> selectTimeWork() {
//// LocalDateTime minTime = LocalDateTime.now().with(LocalTime.MIN).atZone(ZoneOffset.ofHours(8)).ge;
// workRepository.findByCompleteTimeGreaterThan(new Date());
// return null;
// }
}
package com.zjty.tynotes.job.business.service;
import com.zjty.tynotes.job.basic.entity.request.UserRo;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-22
*/
public interface AlterTaskService {
void alterTaskStatus(String taskId, String status);
void updateFlower(UserRo userRo);
void updateChecker(UserRo userRo);
}
package com.zjty.tynotes.job.business.service;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.business.service.impl.NoteMessageServiceImpl;
import com.zjty.tynotes.job.common.Action;
import org.springframework.stereotype.Service;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/13 10:25
* <p>@author : C
* 接口实现见
*
* @see NoteMessageServiceImpl
*/
@Service
public interface NoteMessageService {
/**
* 发生使工作变化的相关操作时(新增、修改)
* 需要记录下来
* 保存操作记录(已知操作编号的情况下)
*
* @param userId 执行该次操作的用户的id
* @param workId 该次操作涉及的工作的id
* @param action 操作编号
* @param remarks 备注内容
* 操作编号详细见↓
* @see Action
*/
void saveNoteMessage(String userId, String workId, Integer action, String remarks);
/**
* 同上
* 保存操作记录(未知操作编号的情况下)
* (先对比新旧Work对象 判断出操作编号 再保存)
*
* @param userId 执行该次操作的用户的id
* @param workId 该次操作涉及的工作的id
* @param newWork 操作后的Work对象
* @param oldWork 原Work对象
* @param remarks 备注内容
* 操作编号详细见↓
* @see Action
*/
void saveNoteMessage(String userId, String workId, Work newWork, Work oldWork, String remarks);
}
package com.zjty.tynotes.job.business.service.impl;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.entity.request.UserRo;
import com.zjty.tynotes.job.basic.repository.WorkRepository;
import com.zjty.tynotes.job.business.service.AlterTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.management.Query;
import java.util.Optional;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-22
*/
@Service
public class AlterTaskStatusImpl implements AlterTaskService {
@Autowired
private WorkRepository workRepository;
@Override
public void alterTaskStatus(String taskId, String status) {
Work ob = workRepository.findById(taskId).get();
ob.setStatus(status);
workRepository.save(ob);
}
@Override
public void updateFlower(UserRo userRo) {
Work ob = workRepository.findById(userRo.getWorkId()).get();
ob.setFollower(userRo.getUsers());
workRepository.save(ob);
}
@Override
public void updateChecker(UserRo userRo) {
Work ob = workRepository.findById(userRo.getWorkId()).get();
ob.setChecker(userRo.getUsers());
workRepository.save(ob);
}
}
package com.zjty.tynotes.job.business.service.impl;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.business.service.NoteMessageService;
import com.zjty.tynotes.job.common.constant.WorkStatus;
import com.zjty.tynotes.job.status.service.BusinessTreeManagement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects;
import static com.zjty.tynotes.job.common.Action.*;
import static com.zjty.tynotes.job.common.constant.WorkStatus.COMMITTED;
import static com.zjty.tynotes.job.common.constant.WorkStatus.FINISHED;
import static com.zjty.tynotes.job.common.constant.WorkStatus.UNDERWAY;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/13 13:37
* <p>@author : C
* 接口定义见
*
* @see NoteMessageService
*/
@Service
public class NoteMessageServiceImpl implements NoteMessageService {
private final
BusinessTreeManagement businessTreeManagement;
@Autowired
public NoteMessageServiceImpl(BusinessTreeManagement businessTreeManagement) {
this.businessTreeManagement = businessTreeManagement;
}
@Override
public void saveNoteMessage(String userId, String workId, Integer action, String remarks) {
Boolean remarksRequired = action.equals(COMMIT_WORK) || action.equals(BACK_WORK) || action.equals(FINISH_WORK);
Boolean remarksExist = Objects.nonNull(remarks);
if (remarksRequired && remarksExist) {
businessTreeManagement.saveAction(userId, workId, action, new Date(), remarks);
} else {
businessTreeManagement.saveAction(userId, workId, action, new Date(), "");
}
}
@Override
public void saveNoteMessage(String userId, String workId, Work newWork, Work oldWork, String remarks) {
Integer action = 0;
Boolean publishWork = Objects.equals(oldWork.getIsFormal(), false) && Objects.equals(newWork.getIsFormal(), true);
Boolean commitWork = Objects.equals(oldWork.getStatus(), UNDERWAY) && Objects.equals(newWork.getStatus(), WorkStatus.COMMITTED);
Boolean backWork = Objects.equals(oldWork.getStatus(), COMMITTED) && Objects.equals(newWork.getStatus(), UNDERWAY);
Boolean finishWork = Objects.equals(oldWork.getStatus(), COMMITTED) && Objects.equals(newWork.getStatus(), FINISHED);
Boolean alterChecker = !Objects.equals(oldWork.getChecker(), newWork.getChecker());
Boolean alterFollower = !Objects.equals(oldWork.getFollower(), newWork.getFollower());
Boolean comment = !Objects.equals(oldWork.getComment(), newWork.getComment());
if (publishWork) {
action = PUBLISH_WORK;
} else if (commitWork) {
action = COMMIT_WORK;
} else if (backWork) {
action = BACK_WORK;
} else if (finishWork) {
action = FINISH_WORK;
} else if (alterChecker) {
action = ALTER_CHECKER;
} else if (alterFollower) {
action = ALTER_FOLLOWER;
} else if (comment) {
action = COMMENT;
}
saveNoteMessage(userId, workId, action, remarks);
}
}
package com.zjty.tynotes.job.common;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-09
*/
public interface Action {
/**
* 发布者发布工作
*/
int PUBLISH_WORK = 1;
/**
* 执行者提交工作
*/
int COMMIT_WORK = 2;
/**
* 审核者退回工作
*/
int BACK_WORK = 3;
/**
* 审核者完结工作
*/
int FINISH_WORK = 4;
/**
* 修改审核者
*/
int ALTER_CHECKER = 5;
/**
* 修改关注者
*/
int ALTER_FOLLOWER = 6;
/**
* 留言
*/
int COMMENT = 7;
}
package com.zjty.tynotes.job.common;
import org.springframework.beans.factory.annotation.Value;
/**
* 公用类
*
* @author zjm
*/
public class Constants {
private static String prefix="note_";
/**
* 事件数据存储到redis List的key抬头
*/
public static final String REDIS_EVENT = prefix;
/**
* 事件数据存储到redis string的key抬头
*/
public static final String REDIS_EVENT_COUNT = "event_v";
/**
* 消息通知 存储到redis的key抬头
*/
public static final String REDIS_NOTICE = "notice";
}
package com.zjty.tynotes.job.common.constant;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/24 14:41
* <p>@author : C
* 附件类型
*/
public final class AttachmentType {
/**
* 初始附件
*/
public static final String INIT = "init";
/**
* 工作附件
*/
public static final String WORK = "work";
/**
* 交流附件
*/
public static final String COMMENT = "comment";
}
package com.zjty.tynotes.job.common.constant;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/23 15:30
* <p>@author : C
* 用户在Job中的身份
*/
public final class UserPosition {
/**
* 发布者
*/
public static final String PUBLISHER = "publisher";
/**
* 执行者
*/
public static final String EXECUTOR = "executor";
/**
* 审核者
*/
public static final String CHECKER = "checker";
/**
* 关注者
*/
public static final String FOLLOWER = "follower";
}
package com.zjty.tynotes.job.common.constant;
/**
* <p>Description : tynotes
* <p>Date : 2019/4/23 15:49
* <p>@author : C
* 工作记录的几种状态
*/
public final class WorkStatus {
/**
* 进行中
*/
public static final String UNDERWAY = "underway";
/**
* 已提交
*/
public static final String COMMITTED = "committed";
/**
* 已完结
*/
public static final String FINISHED = "finished";
}
package com.zjty.tynotes.job.common.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/4/28 11:07
* <p>@author : C
*/
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class BadRequestException extends RuntimeException{
public BadRequestException(String msg) {
super(msg);
}
}
package com.zjty.tynotes.job.common.exception;
import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/4/28 11:08
* <p>@author : C
*/
@Slf4j
@RestControllerAdvice
public class JobExceptionHandle {
@ExceptionHandler(value = BadRequestException.class)
public ResponseEntity noteBadRequestExceptionHandler(Exception e) {
log.error("[note] 出现异常");
return new ResponseEntity<>(
ImmutableMap.of("message", e.getMessage()),
HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(value = NotFoundException.class)
public ResponseEntity noteNotFoundExceptionHandler(Exception e) {
log.error("[note] 出现异常");
return new ResponseEntity<>(
ImmutableMap.of("message", e.getMessage()),
HttpStatus.NOT_FOUND);
}
}
package com.zjty.tynotes.job.common.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>Description : ty-note-backend
* <p>Date : 2019/5/5 15:31
* <p>@author : C
*/
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class NotFoundException extends RuntimeException {
public NotFoundException(String msg) {
super(msg);
}
}
package com.zjty.tynotes.job.status.controller;
import com.zjty.tynotes.job.status.entity.ActionHistory;
import com.zjty.tynotes.job.status.service.ActionHistoryService;
import com.zjty.tynotes.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
@RestController
@AutoDocument
@Api(tags = "查看操作历史记录", value = "查看历史操作记录")
public class ActionHistoryController {
@Autowired
private ActionHistoryService actionHistoryService;
@GetMapping("/history")
@ApiOperation(value = "事件操作历史")
@ApiImplicitParams(
@ApiImplicitParam(name = "id", value = "事件id", dataType = "String",
example = "5cd92cb738693323e8ee3ba9", required = true)
)
public ResponseEntity<List<ActionHistory>> getActionHistory(@RequestParam(value = "id") String id) {
return ResponseEntity.ok(actionHistoryService.findHistory(id));
}
}
package com.zjty.tynotes.job.status.controller;
import com.zjty.tynotes.job.common.constant.WorkStatus;
import com.zjty.tynotes.job.status.service.EventService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
/**
* @author zjm
*/
@RequestMapping("/read")
@RestController
@Slf4j
public class TaskController {
@Autowired
EventService eventService;
@GetMapping("/task/{id}/{id1}/{id2}/{id3}")
public void task(@PathVariable("id") String id, @PathVariable("id1") String id1, @PathVariable("id2") String id2, @PathVariable("id3") String id3){
log.info("开始");
Map<Integer,List<String>> map =new HashMap<>();
List<String> s=new ArrayList<>();
List<String> f1=new ArrayList<>();
f1.add(id);
List<String> z=new ArrayList<>();
z.add(id1);
s.add(id2);
List<String> g=new ArrayList<>();
g.add(id3);
map.put(1,s);
map.put(0,g);
Map<String,List<String>> map1=new HashMap<>();
map1.put("inspector",s);
map1.put("viewer",g);
map1.put("executor",z);
map1.put("publisher",f1);
eventService.saveTakePushEvent("test1","第一次",id,id1,map,new Date(),WorkStatus.UNDERWAY,map1,"添加新的事件");
eventService.saveTakePushEvent("test2","第2次",id,id1,map,new Date(),WorkStatus.UNDERWAY,map1,"添加新的事件");
eventService.saveTakePushEvent("test3","第3次",id,id1,map,new Date(),WorkStatus.UNDERWAY,map1,"添加新的事件");
eventService.saveTakePushEvent("test4","第4次",id,id1,map,new Date(),WorkStatus.UNDERWAY,map1,"添加新的事件");
}
@GetMapping("/task1")
public void task1(){
eventService.readsStatus("z","test1",1);
eventService.readsStatus("z","test2",1);
eventService.readsStatus("f","test1",1);
eventService.readsStatus("f","test2",1);
}
@GetMapping("/task2")
public void task2(){
Set<String> s=new HashSet<>();
s.add("s1");
s.add("s2");
s.add("g1");
s.add("g2");
s.add("z");
eventService.addMessage("f","test1",s,new Date(),1,"f对test1时间留言");
eventService.addMessage("f","test2",s,new Date(),1,"f对test2时间留言");
}
@GetMapping("/task3")
public void task3(){
Set<String> s=new HashSet<>();
s.add("s1");
s.add("s2");
s.add("g1");
s.add("g2");
s.add("z");
eventService.upDateStateEvent("test1","f",s,new Date(),WorkStatus.UNDERWAY,"f修改了事件状态");
eventService.upDateStateEvent("test2","f",s,new Date(),WorkStatus.UNDERWAY,"f修改了事件状态");
}
@GetMapping("/task4")
public void task4(){
List<String> s=new ArrayList<>();
List<String> f1=new ArrayList<>();
f1.add("f");
List<String> z=new ArrayList<>();
z.add("z");
s.add("s1");
s.add("s3");
List<String> g=new ArrayList<>();
g.add("g1");
g.add("g3");
Map<String,List<String>> map1=new HashMap<>();
map1.put("inspector",s);
map1.put("viewer",g);
map1.put("executor",z);
map1.put("publisher",f1);
Set<String> s1=new HashSet<>();
s1.add("s1");
s1.add("s2");
s1.add("g1");
s1.add("g2");
s1.add("z");
eventService.addFollowersEvent("f","test1",s1,"第一次",new Date(),1,WorkStatus.UNDERWAY,map1,"修改事件");
//eventService.addFollowersEvent("test2","第2次",new Date(),1,"q",0,1);
}
}
package com.zjty.tynotes.job.status.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "操作历史对象", description = "操作历史的一条记录")
public class ActionHistory {
@ApiModelProperty(value = "任务id", name = "taskId", example = "qwer1234")
private String taskId;
@ApiModelProperty(value = "操作日期", name = "date", example = "2018-01-01 12:00:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
@ApiModelProperty(value = "备注", name = "msg", example = "这是备注信息...")
private String msg;
@ApiModelProperty(value = "操作人名字", name = "actionName", example = "张三")
private String actionName;
@ApiModelProperty(value = "操作信息", name = "actionMsg", example = "张三发布了任务")
private String actionMsg;
}
package com.zjty.tynotes.job.status.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @author zjm
*/
@ApiModel(value = "弹框的消息对象", description = "操作成功与否的消息")
public class BouncedMessage {
@ApiModelProperty(value = "消息", name = "msg", example = "收藏成功")
private String msg;
public BouncedMessage(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public BouncedMessage() {
}
public void setMsg(String msg) {
this.msg = msg;
}
}
package com.zjty.tynotes.job.status.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
/**
* @author zjm
*/
@ApiModel(value = "EsListSum对象",description="提供数据列表和总数")
public class EsListSum {
@ApiModelProperty(value = "总数", name = "count", example = "0L")
private Long count;
@ApiModelProperty(value = "数据列表", name = "eventTitles")
private List<EventTitle> eventTitles;
public EsListSum(Long count, List<EventTitle> eventTitles) {
this.count = count;
this.eventTitles = eventTitles;
}
public EsListSum() {
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public List<EventTitle> getEventTitles() {
return eventTitles;
}
public void setEventTitles(List<EventTitle> eventTitles) {
this.eventTitles = eventTitles;
}
}
package com.zjty.tynotes.job.status.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import java.util.List;
/**
* @author zjm
* 提供前端阅读页面的事件集合
*/
@ApiModel(value = "EventTitle对象",description="提供阅读页面的事件列表")
public class EventTitle {
//事件标题
@ApiModelProperty(value = "事件标题",name = "title",example = "这是一个事件的标题")
private String title;
//留言条数
@ApiModelProperty(value = "留言条数",name = "messageCount")
private int messageCount;
//更新时间
@ApiModelProperty(value = "更新时间(毫秒)",name = "updateTime")
private Long updateTime;
//事件状态 (进行中)假设1进行中 2.已提交 3.已完结
@ApiModelProperty(value = "事件状态(进行中)",name = "state",example = "underway")
private String state;
//是否已读(0已读,1未读)
@ApiModelProperty(value = "是否已读(0已读,1未读)",name = "readState",example = "1")
private int readState;
//事件id
@ApiModelProperty(value = "事件id",name = "id")
private String id;
//是否收藏(0否,1是)
@ApiModelProperty(value = "是否收藏(0否,1是)",name = "collection",example = "0")
private int collection;
//在这个事件担任的角色(身份)
@ApiModelProperty(value = "担任的角色(身份)",name = "identity",hidden = true)
private int identity;
//是否是发布者(0,不是,1是)
@ApiModelProperty(value = "是否是发布者",name = "release",hidden = true)
private int release;
//执行人名称
@ApiModelProperty(value = "执行人名称",name = "executor",example = "mcj1")
private String executor;
//审核人名称
@ApiModelProperty(value = "审核人名称",name = "inspector",example = "[\"id\",\"id\"]")
private List<String> inspector;
//最近一次的操作
@ApiModelProperty(value = "最近一次的操作",name = "latestNews",example = "root留言")
private String latestNews;
//发布者
@ApiModelProperty(value = "发布者",name = "publisher",example = "root")
private String publisher;
//关注者
@ApiModelProperty(value = "关注者",name = "viewer",example = "[\"id\",\"id\"]")
private List<String> viewer;
/*get --------------------------------- set*/
public int getRelease() {
return release;
}
public void setRelease(int release) {
this.release = release;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Long updateTime) {
this.updateTime = updateTime;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public int getReadState() {
return readState;
}
public void setReadState(int readState) {
this.readState = readState;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getCollection() {
return collection;
}
public void setCollection(int collection) {
this.collection = collection;
}
public int getIdentity() {
return identity;
}
public void setIdentity(int identity) {
this.identity = identity;
}
public int getMessageCount() {
return messageCount;
}
public void setMessageCount(int messageCount) {
this.messageCount = messageCount;
}
public String getExecutor() {
return executor;
}
public void setExecutor(String executor) {
this.executor = executor;
}
public List<String> getInspector() {
return inspector;
}
public void setInspector(List<String> inspector) {
this.inspector = inspector;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public List<String> getViewer() {
return viewer;
}
public void setViewer(List<String> viewer) {
this.viewer = viewer;
}
public String getLatestNews() {
return latestNews;
}
public void setLatestNews(String latestNews) {
this.latestNews = latestNews;
}
/*构造方法*/
public EventTitle(String title, int messageCount, Long updateTime, String state, int readState, String id, int collection, int identity) {
this.title = title;
this.messageCount = messageCount;
this.updateTime = updateTime;
this.state = state;
this.readState = readState;
this.id = id;
this.collection = collection;
this.identity = identity;
}
public EventTitle() { }
public EventTitle(String title, int messageCount, Long updateTime, String state, int readState, String id, int collection, int identity, int release, String executor, List<String> inspector, String latestNews, String publisher, List<String> viewer) {
this.title = title;
this.messageCount = messageCount;
this.updateTime = updateTime;
this.state = state;
this.readState = readState;
this.id = id;
this.collection = collection;
this.identity = identity;
this.release = release;
this.executor = executor;
this.inspector = inspector;
this.latestNews = latestNews;
this.publisher = publisher;
this.viewer = viewer;
}
}
package com.zjty.tynotes.job.status.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-04-30
*/
@Data
@AllArgsConstructor
@NotEmpty
public class NoteResource {
private String id;
private String taskId;
private int action;
private Date date;
}
package com.zjty.tynotes.job.status.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zjm
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RoleSum {
/**
* 代办 是否有未读 0 否 1有
*/
private int commissionUnread;
/**
* 代办 条数
*/
private int commissionCount;
/**
* 提交 是否有未读 0 否 1有
*/
private int submitUnread;
/**
* 提交 条数
*/
private int submitCount;
/**
* 其他 是否有未读 0 否 1有
*/
private int otherUnread;
/**
* 其他 条数
*/
private int otherCount;
}
package com.zjty.tynotes.job.status.repository;
import com.zjty.tynotes.job.status.entity.ActionHistory;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
@Repository
public interface ActionHistoryRepository extends MongoRepository<ActionHistory,String> {
}
package com.zjty.tynotes.job.status.service;
import com.zjty.tynotes.job.status.entity.ActionHistory;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
public interface ActionHistoryService {
/**
* 根据事件id查询操作历史
*
* @param id 事件id
* @return 操作记录
*/
List<ActionHistory> findHistory(String id);
}
package com.zjty.tynotes.job.status.service;
import com.zjty.tynotes.job.status.entity.NoteResource;
import java.util.Date;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
public interface BusinessTreeManagement {
/**
* 任务操作后将记录发送给kafka中
*
* @param id 操作人id
* @param taskId 事件id
* @param action 操作动作说明,action: 使用Action.方法
* 1 -> 执行人发布任务
* 2 -> 执行人提交任务
* 3 -> 审核人退回已提交任务
* 4 -> 审核人完结任务
* 5 -> 修改审核人
* 6 -> 修改关注人
* 7 -> 对事件留言
* @param date 操作时间
* @param msg 备注内容
*/
void saveAction(String id, String taskId, int action, Date date, String msg);
/**
* 根据不同的操作保存数据
*
* @param noteResource 传入对象
* @param msg 备注信息
*/
void dealActionMsg(NoteResource noteResource, String msg);
}
package com.zjty.tynotes.job.status.service;
import com.zjty.tynotes.job.status.entity.BouncedMessage;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author zjm
*/
public interface EventService {
/**
* 添加数据到redis(分别安人员id来进行) ->取出数据->推送数据
* @param eventId 事件id
* @param eventTitle 事件标题
* @param id 发布者
* @param map 3种角色的id集合
* @param updateTime 更新时间
* @param state 事件状态
* @param executorId 执行人id
* @param mapName 执行人名称
* @param latestNews 对任务的操作
*
*/
void saveTakePushEvent(String eventId, String eventTitle, String id, String executorId, Map<Integer, List<String>> map, Date updateTime, String state, Map<String, List<String>> mapName,String latestNews);
/**
*新留言
* @param id 留言人的Id
* @param eventId 事件id
* @param ids 推送人员的id(相关人员id)
* @param updateTime 更新时间
* @param messageCount 留言条数
* @param latestNews 对任务的操作
*/
void addMessage(String id, String eventId, Set<String> ids, Date updateTime, int messageCount, String latestNews);
/**
* 更新事件的状态
* @param eventId 事件id
* @param id 操作者id
* @param ids 推送人员的id(相关人员id)
* @param updateTime 更新时间
* @param state 事件状态
* @param latestNews 对任务的操作
*/
void upDateStateEvent(String eventId, String id, Set<String> ids, Date updateTime, String state, String latestNews);
/**
*  添加审核 - 关注者
* @param operationId 操作者id
* @param eventId 事件id
* @param ids 事件相关人员id
* @param eventTitle 事件标题
* @param updateTime 更新时间
* @param messageCount 留言条数
* @param state 事件的状态
* @param mapName 执行人名称
* @param latestNews 最近的一次对任务的操作
*/
void addFollowersEvent(String operationId, String eventId, Set<String> ids, String eventTitle, Date updateTime, int messageCount, String state, Map<String, List<String>> mapName, String latestNews);
/**
* 设置收藏 和取消收藏
* @param eventId 事件id
* @param id 人员id
* @param collection 是否收藏 
* @return 操作状态
*/
BouncedMessage placedCollection(String eventId, String id, int collection);
/**
* 查看事件的时候
* @param id 人员id
* @param eventId 事件id
* @param readState 是否阅读过 判读是否阅读过 否修改 阅读状态
*/
void readsStatus(String id, String eventId, int readState);
}
package com.zjty.tynotes.job.status.service;
import com.zjty.tynotes.job.status.entity.EsListSum;
import com.zjty.tynotes.job.status.entity.EventTitle;
import java.util.List;
/**
* @author zjm
*/
public interface PrivateService {
/**
* 代办事件查询
*
* @param id  人员id
* @param page  页码
* @param size  每页显示的条数
* @return 事件对象集合
*/
EsListSum selectCommission(String id, int page, int size);
/**
* 已提交事件查询
*
* @param id  人员id
* @param page  页码
* @param size  每页显示的条数
* @return 事件对象集合
*/
EsListSum selectSubmit(String id, int page, int size);
/**
* 其他事件查询
*
* @param id  人员id
* @param page  页码
* @param size  每页显示的条数
* @return 事件对象集合
*/
EsListSum selectOther(String id, int page, int size);
/**
* 收藏事件
*
* @param id  人员id
* @param page  页码
* @param size  每页显示的条数
* @return 给前端对象集合 和条数
*/
EsListSum selectCollection(String id, int page, int size);
/**
* 标题查询
*
* @param id  人员id
* @param page  页码
* @param size  每页显示的条数
* @param title 事件的标题
* @return 给前端对象集合 和条数
*/
EsListSum titleSelect(String id, int page, int size, String title);
/**
* 人员登入 第一次的数据 接口触发
* @param id 人员id
*/
void loginFirstOneManualPush(String id);
}
package com.zjty.tynotes.job.status.service;
import com.zjty.tynotes.job.common.constant.WorkStatus;
import com.zjty.tynotes.job.status.entity.RoleSum;
import com.zjty.tynotes.job.status.utils.JacksonUtil;
import com.zjty.tynotes.sms.service.MessageTemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.*;
/**
* @author zjm
*/
@Service
@Slf4j
public class Take {
@Autowired
MessageTemplateService messageTemplateService;
@Autowired
EventService eventService;
// @Scheduled(cron = "40 * * * * ? ")
public void task(){
Random random=new Random();
RoleSum roleSum=new RoleSum(random.ints(0,2).findFirst().getAsInt(),
random.ints(1,10).findFirst().getAsInt(),
random.ints(0,2).findFirst().getAsInt(),
random.ints(1,10).findFirst().getAsInt(),
random.ints(0,2).findFirst().getAsInt(),
random.ints(1,10).findFirst().getAsInt());
messageTemplateService.beingPushed("root","/topic/event",JacksonUtil.toJSon(roleSum));
}
}
package com.zjty.tynotes.job.status.service.impl;
import com.zjty.tynotes.job.status.entity.ActionHistory;
import com.zjty.tynotes.job.status.service.ActionHistoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
@Service
@Slf4j
public class ActionHistoryServiceImpl implements ActionHistoryService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<ActionHistory> findHistory(String id) {
Criteria criteria = new Criteria();
criteria.and("taskId").is(id);
Query query = new Query(criteria);
query.with(new Sort(Sort.Direction.DESC, "date"));
return mongoTemplate.find(query, ActionHistory.class);
}
}
package com.zjty.tynotes.job.status.service.impl;
import com.zjty.tynotes.job.basic.entity.database.Work;
import com.zjty.tynotes.job.basic.service.WorkService;
import com.zjty.tynotes.job.status.entity.ActionHistory;
import com.zjty.tynotes.job.status.entity.NoteResource;
import com.zjty.tynotes.job.status.repository.ActionHistoryRepository;
import com.zjty.tynotes.job.status.service.BusinessTreeManagement;
import com.zjty.tynotes.job.status.service.EventService;
import com.zjty.tynotes.pas.service.IUserService;
import com.zjty.tynotes.pas.service.impl.UserServiceImpl;
import com.zjty.tynotes.search.subject.service.EsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @author LJJ cnljj1995@gmail.com
* on 2019-05-13
*/
@Service
@Slf4j
public class BusinessTreeManagementImpl implements BusinessTreeManagement {
@Autowired
private WorkService workService;
@Autowired
private EventService eventService;
@Autowired
private IUserService iUserService;
@Autowired
private ActionHistoryRepository actionHistoryRepository;
@Override
public void saveAction(String id, String taskId, int action, Date date, String msg) {
log.info("[TREE] 获取action,参数为id:{},taskID:{},action:{}", id, taskId, action);
NoteResource noteResource = new NoteResource(id, taskId, action, date);
dealActionMsg(noteResource, msg);
}
@Override
public void dealActionMsg(NoteResource noteResource, String msg) {
Work work = workService.findById(noteResource.getTaskId());
String status = work.getStatus();
String name = iUserService.findUserById(noteResource.getId()).getName();
List<String> publisher = new ArrayList<>();
publisher.add(work.getPublisher());
List<String> executor = new ArrayList<>();
executor.add(work.getExecutor());
Map<String,List<String>> nameMap = new HashMap<>(4);
nameMap.put("publisher", publisher);
nameMap.put("executor", executor);
nameMap.put("inspector", work.getChecker());
nameMap.put("viewer", work.getFollower());
Set<String> setRs = new HashSet<>();
setRs.add(work.getPublisher());
setRs.add(work.getExecutor());
setRs.addAll(work.getFollower());
setRs.addAll(work.getChecker());
setRs.remove(noteResource.getId());
ActionHistory actionHistory = new ActionHistory();
actionHistory.setActionName(name);
actionHistory.setDate(noteResource.getDate());
actionHistory.setMsg(msg);
actionHistory.setTaskId(noteResource.getTaskId());
// * 1 -> 执行人发布任务
// * 2 -> 执行人提交任务
// * 3 -> 审核人退回已提交任务
// * 4 -> 审核人完结任务
// * 5 -> 修改审核人
// * 6 -> 修改关注人
// * 7 -> 对事件留言
switch (noteResource.getAction()) {
case 1:
Map<Integer, List<String>> map = new HashMap<>(2);
map.put(1, work.getChecker());
map.put(0, work.getFollower());
eventService.saveTakePushEvent(work.getId(), work.getTitle(),
work.getPublisher(), work.getExecutor(), map,work.getUpdateTime(),
status, nameMap, name + "新建了任务");
actionHistory.setActionMsg(name + "新建了任务");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}新建任务,执行人id是{}", name, work.getPublisher());
break;
case 2:
eventService.upDateStateEvent(work.getId(),
noteResource.getId(),
setRs,
work.getUpdateTime()
,status,
name + "提交了任务");
actionHistory.setActionMsg(name + "提交了任务");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}提交了任务", name);
break;
case 3:
eventService.upDateStateEvent(work.getId(),
noteResource.getId(),
setRs,
noteResource.getDate(),
status,
name + "退回了提交事件");
actionHistory.setActionMsg(name + "退回了提交事件");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}退回了任务", name);
break;
case 4:
eventService.upDateStateEvent(work.getId(),
noteResource.getId(),
setRs,
noteResource.getDate(),
status,
name + "完结了任务");
actionHistory.setActionMsg(name + "完结了任务");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}完结了任务", name);
break;
case 5:
eventService.addFollowersEvent(noteResource.getId(),
work.getId(),
setRs,
work.getTitle(),
noteResource.getDate(),
work.getComment().size(),
status,
nameMap,
name + "修改了审核人");
actionHistory.setActionMsg(name + "修改了审核人");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}修改了审核人", name);
break;
case 6:
eventService.addFollowersEvent(noteResource.getId(),
work.getId(),
setRs,
work.getTitle(),
noteResource.getDate(),
work.getComment().size(),
status,
nameMap,
name + "修改了关注人");
actionHistory.setActionMsg(name + "修改了关注人");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}修改了关注者", name);
break;
case 7:
eventService.addMessage(noteResource.getId(),
work.getId(),
setRs,
noteResource.getDate(),
work.getComment().size(), name + "对任务留言了");
actionHistory.setActionMsg(name + "对任务留言了");
actionHistoryRepository.save(actionHistory);
log.info("[TREE] {}对任务留言了", name);
break;
default:
log.warn("[es] 状态处理模块传入参数有误");
break;
}
}
}
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论