提交 2aa711b2 authored 作者: 任建彩's avatar 任建彩
......@@ -64,7 +64,11 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-context</artifactId>-->
......
package com.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.zrqx.olive.ttask.vo.TaskVo;
public class ExportExcelTemplate {
public static final String DEFAULT_TEMPLATE_PATH = File.separator + "template" + File.separator + "temp.xls";
/**
* @throws Exception
*
* 根据模板导出excel, 这种方法是 通过给模板中指定的位置赋值,然后重新生成excel,来导出excel的,
* 而且不会修改模板本身。 感觉不太合适去导出有大量数据的excel。 POIFSFileSystem: poi里面的类,
* 可以把Excel文件作为数据流来进行传入传出。这里介绍下POIFSFileSystem类,这个类是专门用来读取excel表格的。
*
*
* 模板文件路径:项目内,src/main/resource/template/xxx.xls
*/
public static void exportXls(Class clz, String path, List<TaskVo> list, Integer sheetNum,
Integer startRow, Integer startCellNum, HttpServletResponse response, HttpServletRequest request)
throws Exception {
// 项目模板路径
String tempPath = path;
// 模板文件
File file = new File(tempPath);
String filename = file.getName();
// 读取项目模板文件
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(file);
HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
HSSFSheet sheet = workbook.getSheetAt(sheetNum);
if (sheet == null) {
sheet = workbook.createSheet();
}
// 赋值单元格
for (int i = 0; i < list.size(); i++) {
HSSFRow row = sheet.getRow(startRow + i);
if (row == null) {
row = sheet.createRow(startRow + i);
}
TaskVo vo = list.get(i);
int cellNum = 0;
// 取第一个值放到第一个单元格 依此类推
HSSFCell cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getId());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getPriority());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getTaskTypeName());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getTaskStatusName());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getWorkingHours().toString());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getEndTime());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getCreateTime());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getUserName());
cellNum++;
cell = row.getCell(startCellNum + cellNum);
if (cell == null) {
cell = row.createCell(startCellNum + cellNum);
}
cell.setCellValue(vo.getCompleteTime());
continue;
}
response.setContentType("application/octet-stream");
// 设置response参数,可以打开下载页面
response.reset();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + HttpUtils.transCharacter(request, filename));
OutputStream os = new BufferedOutputStream(response.getOutputStream());
workbook.write(os);// 输出文件
os.flush();
os.close();
// FileOutputStream out = new FileOutputStream("E:"+File.separator+"export.xls");
// workbook.write(out);
// out.close();
// ServletOutputStream os = response.getOutputStream();
// HashMap<String, String> map = new HashMap<String, String>();
// ExcelUtil.getInstance().exportObj2ExcelByTemplate(map, tempPath, os, list,clz, true);
}
public void exportXls() throws Exception {
String path = this.getClass().getClassLoader().getResource("").getPath();
File file = new File(path + File.separator + "template" + File.separator + "temp.xls");
System.out.println(file.exists());
// 读取项目根目录中的模板
InputStream in = this.getClass().getResourceAsStream(path + "/template/temp.xls");
System.out.println(in);
// File file = new File("E:\\template.xls"); 电脑硬盘上的模板,,一般模板都在项目里
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(file);
HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
HSSFSheet sheet = workbook.getSheetAt(0);
sheet.setForceFormulaRecalculation(true);
HSSFRow row = null;
row = sheet.getRow(3);
if (row == null) {
row = sheet.createRow(3);
}
// 根据模板中表达式位置, 修改对应单元格的值
HSSFCell cell = row.getCell(0);// 第3行 第1列, 下标是0开始的
if (cell == null) {
cell = row.createCell(0);
}
cell.setCellValue("张三");
cell = row.getCell(1);
if (cell == null) {
cell = row.createCell(1);
}
cell.setCellValue(23);
// row.getCell(2).setCellValue("180cm");
// row.getCell(3).setCellValue("未婚");
// row.getCell(4).setCellValue("男");
// 修改模板内容导出新模板
// '/' 分隔符 采用 File.separator 统一表示
FileOutputStream out = new FileOutputStream("E:" + File.separator + "export.xls");
workbook.write(out);
out.close();
}
public static void printClass(T t) throws Exception {
Class<? extends T> clazz = null;
clazz = t.getClass();
Field[] fields = clazz.getFields();
for (Field f : fields) {
f.get(t);
}
}
/**
* 打印类的信息,包括类的成员函数,成员变量
*
* @param obj 该对象所属类的信息
*/
public static void printClassMessage(Object obj) {
// 要获取类的信息,首先要获取类的类类型
Class c = obj.getClass();// 传递的是哪个子类的对象,c就是该子类的类类型
// 获取类的名称
System.out.println("类的名称是:" + c.getName());
/*
* Method类,方法的对象 一个成员方法就是一个Method对象 getMethods()方法获取的是所有的public的函数,包括父类继承而来的
* getDeclaredMethods()获取的是多有该类自己声明的方法,不问访问权限
*/
Method[] ms = c.getMethods();// c.getDeclaredMethods();
for (int i = 0; i < ms.length; i++) {
// 得到方法的返回值类型的类类型
Class retrunType = ms[i].getReturnType();
System.out.print(retrunType.getName() + " ");
// 得到方法的名称
System.out.print(ms[i].getName() + "(");
// 获取的参数类型--->得到的是参数列表的类型的类类型
Class[] paraTypes = ms[i].getParameterTypes();
for (Class class1 : paraTypes) {
System.out.print(class1.getName() + ",");
}
System.out.println(")");
}
}
}
package com.utils;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;
public class HttpUtils {
private final static Logger log = LoggerFactory.getLogger(HttpUtils.class);
private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
// 超时时间,单位 ms
private static int TIME_OUT = 10000;
private static CloseableHttpClient httpClient;
private static RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(TIME_OUT)
.setConnectTimeout(TIME_OUT)
.setConnectionRequestTimeout(TIME_OUT).build();
static {
// httpClient链接池
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(200);
httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig).build();
}
public static String execute(HttpRequestBase requestBase) {
try {
CloseableHttpResponse response = httpClient.execute(requestBase);
HttpEntity entity = response.getEntity();
return EntityUtils.toString(entity, "UTF-8");
} catch (IOException e) {
log.error("HttpUtils请求失败", e);
}
return "";
}
public static String fmtUrl(String url) {
if (url.lastIndexOf("?") == (url.length() -1)) {
return url;
}
return url + "?";
}
public static String buildParam(Map<String, ?> params) {
if (params == null) return "";
final StringBuilder str = new StringBuilder("");
params.forEach((k,v) -> {
str.append(k + "=" + v + "&");
});
return str.deleteCharAt(str.length()-1).toString();
}
public static boolean isMSBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal))
return true;
}
return false;
}
/**
* 根据不同的浏览器转字符编码
*
* @param request
* @param fileName
* @return
* @throws Exception
*/
public static String transCharacter(HttpServletRequest request, String fileName) throws Exception {
boolean isMSIE = isMSBrowser(request);
if (isMSIE) {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
return new String(fileName.getBytes("UTF-8"), "ISO8859-1");
}
}
\ No newline at end of file
package com.utils.excelutil;
public class BaseException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
private int code = ResponseCodeEnum.BASE_EXCEPTION.getCode();
private Object data = null;
// 无参构造方法
public BaseException() {
super();
}
// 有参的构造方法
public BaseException(String message) {
super(message);
}
public BaseException(int code, String message) {
super(message);
this.code = code;
}
public BaseException(int code, String message, Object data) {
super(message);
this.code = code;
this.data = data;
}
public BaseException(ResponseCodeEnum res) {
super(res.getMsg());
this.code = res.getCode();
}
// 用指定的详细信息和原因构造一个新的异常
public BaseException(String message, Throwable cause) {
super(message, cause);
}
// 用指定原因构造一个新的异常
public BaseException(Throwable cause) {
super(cause);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
\ No newline at end of file
package com.utils.excelutil;
public class ExcelHeader implements Comparable<ExcelHeader>{
/**
* excel的标题名称
*/
private String title;
/**
* 每一个标题的顺序
*/
private int order;
/**
* 说对应方法名称
*/
private String methodName;
/**
* date格式
*/
private String dateFmt;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getDateFmt() {
return dateFmt;
}
public void setDateFmt(String dateFmt) {
this.dateFmt = dateFmt;
}
public int compareTo(ExcelHeader o) {
return order>o.order?1:(order<o.order?-1:0);
}
public ExcelHeader(String title, int order, String methodName, String dateFmt) {
super();
this.title = title;
this.order = order;
this.methodName = methodName;
this.dateFmt = dateFmt;
}
}
\ No newline at end of file
package com.utils.excelutil;
public class ExcelParseMode
{
/** Excel 97-2003 */
public static final String XLS = "xls";
/** Excel 2007- */
public static final String XLSX = "xlsx";
}
package com.utils.excelutil;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 用来在对象的 成员变量、对象、属性(包括enum实例)上加入的annotation,通过该annotation说明某个属性所对应的标题
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelResources {
/**
* 属性的标题名称
* @return
*/
String title();
/**
* 在excel的顺序
* @return
*/
int order() default 9999;
/**
* date格式
* default fmt yyyy-MM-dd HH:mm:ss
*/
String dateFmt() default "yyyy-MM-dd HH:mm:ss";
}
\ No newline at end of file
package com.utils.excelutil;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 解析Excel时实体所要取数据的工作簿设置
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ExcelSheetParams
{
/** 工作簿名称 */
public String sheetName() default "";
/** 起始行数 */
public int startRow() default 0;
/** 结束行数,如果小于0,表示忽略 */
public int endRow() default -1;
/** 是否遇到一个空行后结束读取,如果为true,则在遇到空行时会停止读取,这时会忽略endRow的设置 */
public boolean breakByEmptyRow() default false;
}
package com.utils.excelutil;
import lombok.Data;
/**
* 所有导入方法的结果类
*
*/
@Data
public class ImportResult {
/** 成功了多少条 */
private int success;
/** 失败了多少条 */
private int error;
/** 错误文件标识 */
private String errorFileId;
}
package com.utils.excelutil;
/**
* 响应编码
* @ClassName ReponseCodeEnum
* @Description:
* @author lpf
* @date 2018年5月9日下午4:27:58
*
*/
public enum ResponseCodeEnum {
/** 200 ,操作成功" */
OK(0,"操作成功"),
/** -1,操作失败" */
FAIL(-1,"操作失败"),
/** 500,服务器异常" */
EXCEPTION(500,"服务器异常"),
/** 600, BaseException */
BASE_EXCEPTION(600, "BaseException"),
/** -2,验证不通过" */
VALIDATE(-2,"验证不通过"),
/** -3资源不存在*/
NOT_EXIST(-3,"资源不存在"),
/** -4 接口调用 参数类型转换异常*/
BIND_EXCEPTION(-4,"参数不合法"),
/** -5 接口调用缺少必填参数 */
MISS_EXCEPTION(-5,"缺少必填参数"),
/** -6 登录过期或未登录 */
NO_LOGIN(-6,"请重新登录");
private final int code;
private final String msg;
private ResponseCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
package com.utils.excelutil;
import lombok.Data;
@Data
public class Student {
private String name;
private String author;
}
package com.utils.excelutil;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.springframework.util.ResourceUtils;
public class TemplateFileUtil {
public static FileInputStream getTemplates(String tempName) throws FileNotFoundException {
return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/"+tempName));
}
}
\ No newline at end of file
......@@ -30,19 +30,50 @@ import com.zrqx.olive.ttask.vo.TaskVo;
public interface TaskDao extends BaseMapper<Task> {
@Select("<script>"
+ " SELECT *,(select account from eb_system_admin c where a.user_id = c.id) userName "
+ " select tt.* from (SELECT a.*,(select account from eb_system_admin c where a.user_id = c.id) userName, "
+ " (case when task_type = 1 then '项目任务' when task_type = 2 then 'BUG任务' when task_type = 3 then '部门任务' else '' end) taskTypeName,"
+ " (case when task_status = 0 then '关闭' when task_status = 1 then '未完成' when task_status = 2 then '已完成' end) taskStatusName, "
+ " (select account from t_task_record e LEFT JOIN eb_system_admin f on e.user_id = f.id where e.type = 3 and e.task_id = a.id) completeName"
+ " FROM t_task a INNER JOIN t_statistics_project b on a.project_id = b.id where 1 = 1 "
+ "<if test = 'request.moduleId!=null'> "
+ "AND moduleId = #{request.moduleId} "
+ " AND moduleId = #{request.moduleId} "
+ "</if>"
+ "<if test = 'request.taskName!=null'> "
+ "AND taskName = #{request.taskName} "
+ " AND taskName = #{request.taskName} "
+ "</if>"
+ "<if test = 'request.taskType!=null'> "
+ "AND taskType = #{request.taskType} "
+ " AND taskType = #{request.taskType} "
+ "</if>"
+ "<if test = 'request.taskStatus!=null'> "
+ "AND taskStatus = #{request.taskStatus} "
+ " AND taskStatus = #{request.taskStatus} "
+ "</if>"
+ "<if test = 'request.id!=null'> "
+ " AND id = #{request.id} "
+ "</if>"
+ "<if test = 'request.projectId!=null'> "
+ " AND projectId = #{request.projectId} "
+ "</if>"
+ "<if test = 'request.taskStatus == 3'> "
+ " AND taskStatus != 0 "
+ "</if>"
+ "<if test = 'request.endTime == 1'> "
+ " AND now() &gt; #{request.endTime} "
+ "</if>"
+ "<if test = 'request.userId!=null'> "
+ " AND userId = #{request.userId} "
+ "</if>"
+ "<if test = 'request.taskDescription!=null'> "
+ " AND taskDescription like concat('%',#{request.taskDescription},'%') "
+ "</if>"
+ "<if test='request.ids != null and request.ids.size > 0'>"
+ "and a.id in "
+ " <foreach collection=\"request.ids\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">"
+ "#{id}"
+ "</foreach>"
+ "</if>"
+ " ) tt"
+ "<if test = 'request.userName!=null'> "
+ " AND tt.userName = like concat('%',#{request.userName},'%') "
+ "</if>"
+ "</script>")
List<TaskVo> page(@Param("request")TaskRequest request);
......
package com.zrqx.olive.ttask.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.article.model.Article;
import com.zrqx.olive.project.model.Customer;
import com.zrqx.olive.project.request.QueryCustomerRequest;
import com.zrqx.olive.ttask.model.Task;
import com.zrqx.olive.ttask.model.TaskRecord;
import com.zrqx.olive.ttask.request.TaskRequest;
import com.zrqx.olive.ttask.vo.TaskVo;
/**
* 任务历史记录管理表 Mapper 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Mapper
public interface TaskRecordDao extends BaseMapper<TaskRecord> {
}
......@@ -16,7 +16,7 @@ import java.util.Date;
import org.springframework.data.annotation.Id;
/**
* 文章管理表
* 任务管理表
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
......@@ -37,9 +37,9 @@ public class Task implements Serializable {
private static final long serialVersionUID=1L;
@Id
@TableId(value = "id", type = IdType.ASSIGN_UUID)
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty("id,新增时不需要填写")
private String id;
private Integer id;
@ApiModelProperty(value = "可选值:1:项目任务 2:BUG任务 3:部门任务")
private Integer taskType;
......@@ -83,7 +83,7 @@ public class Task implements Serializable {
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "创建时间")
@ApiModelProperty(value = "修改时间")
private Date updateTime;
......
package com.zrqx.olive.ttask.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import org.springframework.data.annotation.Id;
/**
* 任务历史记录管理
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_task_record")
@ApiModel(value="taskrecord对象", description="任务历史记录管理")
public class TaskRecord implements Serializable {
private static final long serialVersionUID=1L;
@Id
@TableId(value = "id", type = IdType.ASSIGN_UUID)
@ApiModelProperty("id,新增时不需要填写")
private Integer id;
@ApiModelProperty(value = "任务ID")
private Integer taskId;
@ApiModelProperty(value = "用户ID")
private Integer userId;
@ApiModelProperty(value = "用户名")
private String assignUserId;
@ApiModelProperty(value = "描述")
private String describes;
@ApiModelProperty(value = "修改时间")
private Date uploadTime;
@ApiModelProperty(value = "0:关闭 1:确认 2:完成 3:指派 4:编辑")
private Integer type;
}
......@@ -15,6 +15,7 @@ import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 任务管理 Request
......@@ -37,7 +38,7 @@ public class TaskRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id,新增时不需要填写")
private String id;
private Integer id;
@ApiModelProperty(value = "可选值:1:项目任务 2:BUG任务 3:部门任务")
private Integer taskType;
......@@ -50,6 +51,9 @@ public class TaskRequest implements Serializable {
@ApiModelProperty(value = "指派给成员id")
private Integer userId;
@ApiModelProperty(value = "指派给成员名称")
private Integer userName;
@ApiModelProperty(value = "优先级 可选值:1、2、3、4 仅支持单选,默认值为1。")
private Integer priority;
......@@ -63,7 +67,7 @@ public class TaskRequest implements Serializable {
@ApiModelProperty(value = "开始日期")
private Date startTime;
@ApiModelProperty(value = "开始日期")
@ApiModelProperty(value = "结束日期")
private Date endTime;
@ApiModelProperty(value = "任务状态 0:关闭 1:未完成 2:已完成")
......@@ -83,4 +87,7 @@ public class TaskRequest implements Serializable {
@ApiModelProperty(value = "创建时间")
private Date updateTime;
@ApiModelProperty(value = "导出ids")
private List<Integer> ids;
}
package com.zrqx.olive.ttask.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo;
import com.zrqx.olive.article.model.Article;
import com.zrqx.olive.article.request.ArticleSearchRequest;
import com.zrqx.olive.article.vo.ArticleVo;
import com.zrqx.olive.ttask.model.Task;
import com.zrqx.olive.ttask.model.TaskRecord;
import com.zrqx.olive.ttask.request.TaskRequest;
import com.zrqx.olive.ttask.vo.TaskVo;
/**
* TaskRecordService 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface TaskRecordService extends IService<TaskRecord> {
}
package com.zrqx.olive.ttask.service;
import java.io.IOException;
import java.util.List;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo;
import com.utils.excelutil.BaseException;
import com.zrqx.olive.article.model.Article;
import com.zrqx.olive.article.request.ArticleSearchRequest;
import com.zrqx.olive.article.vo.ArticleVo;
......@@ -25,5 +33,9 @@ import com.zrqx.olive.ttask.vo.TaskVo;
public interface TaskService extends IService<Task> {
PageInfo<TaskVo> getpage(TaskRequest request, PageParamRequest pageParamRequest);
List<TaskVo> getList(TaskRequest request);
Integer imporTask(MultipartFile file, TaskRequest taskRequest) throws BaseException, IOException;
}
package com.zrqx.olive.ttask.service.imp;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage;
import com.common.PageParamRequest;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zrqx.olive.ttask.dao.TaskRecordDao;
import com.zrqx.olive.ttask.model.TaskRecord;
import com.zrqx.olive.ttask.request.TaskRequest;
import com.zrqx.olive.ttask.service.TaskRecordService;
import com.zrqx.olive.ttask.service.TaskService;
import com.zrqx.olive.ttask.vo.TaskVo;
/**
* TaskRecordServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordDao, TaskRecord> implements TaskRecordService {
@Resource
private TaskRecordDao dao;
}
......@@ -3,15 +3,20 @@ package com.zrqx.olive.ttask.service.imp;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.exception.CrmebException;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.utils.CrmebUtil;
import com.utils.ImportExcelUtil;
import com.utils.UUIDUtil;
import com.utils.excelutil.BaseException;
import com.zrqx.olive.article.dao.ArticleDao;
import com.zrqx.olive.article.model.Article;
import com.zrqx.olive.article.request.ArticleSearchRequest;
......@@ -19,58 +24,186 @@ import com.zrqx.olive.article.service.ArticleService;
import com.zrqx.olive.article.vo.ArticleVo;
import com.zrqx.olive.category.model.Category;
import com.zrqx.olive.category.service.CategoryService;
import com.zrqx.olive.project.model.DiyType;
import com.zrqx.olive.project.service.DiyTypeService;
import com.zrqx.olive.system.service.SystemConfigService;
import com.zrqx.olive.ttask.dao.TaskDao;
import com.zrqx.olive.ttask.model.Task;
import com.zrqx.olive.ttask.request.TaskRequest;
import com.zrqx.olive.ttask.service.TaskService;
import com.zrqx.olive.ttask.vo.ExcelTaskVo;
import com.zrqx.olive.ttask.vo.TaskVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import static com.constants.Constants.ARTICLE_BANNER_LIMIT;
/**
* TaskServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
* TaskServiceImpl 接口实现
* +---------------------------------------------------------------------- |
* CRMEB [ CRMEB赋能开发者,助力企业发展 ]
* +---------------------------------------------------------------------- |
* Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +---------------------------------------------------------------------- |
* Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
* +---------------------------------------------------------------------- |
* Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class TaskServiceImpl extends ServiceImpl<TaskDao, Task> implements TaskService {
@Resource
private TaskDao dao;
@Resource
private TaskDao dao;
/**
* 列表
* @param request ArticleSearchRequest 请求参数
* @param pageParamRequest 分页类参数
* @author Mr.Ren
* @since 2021-08-04
* @return List<Article>
*/
@Override
public PageInfo<TaskVo> getpage(TaskRequest request, PageParamRequest pageParamRequest) {
Page<Task> taskPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit(),pageParamRequest.getOrderBy());
List<TaskVo> taskVo = dao.page(request);
return CommonPage.copyPageInfo(taskPage, taskVo);
}
@Autowired
private DiyTypeService service;
}
/**
* 列表
*
* @param request ArticleSearchRequest 请求参数
* @param pageParamRequest 分页类参数
* @author Mr.Ren
* @since 2021-08-04
* @return List<Article>
*/
@Override
public PageInfo<TaskVo> getpage(TaskRequest request, PageParamRequest pageParamRequest) {
Page<Task> taskPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit(),
pageParamRequest.getOrderBy());
List<TaskVo> taskVo = dao.page(request);
return CommonPage.copyPageInfo(taskPage, taskVo);
}
@Override
public List<TaskVo> getList(TaskRequest request) {
List<TaskVo> taskVo = dao.page(request);
return taskVo;
}
@Override
public Integer imporTask(MultipartFile file, TaskRequest taskRequest) throws BaseException, IOException {
List<ExcelTaskVo> list = ImportExcelUtil.importExcel(file.getInputStream(), ExcelTaskVo.class,
file.getOriginalFilename());
for (ExcelTaskVo excelTaskVo : list) {
Task task = new Task();
BeanUtils.copyProperties(excelTaskVo, task);
task.setUpdateTime(new Date());
task.setCreateTime(new Date());
// 可选值:1:项目任务 2:BUG任务 3:部门任务"
if (excelTaskVo.getTaskTypeName().equals("项目任务")) {
task.setTaskType(1);
}
if (excelTaskVo.getTaskTypeName().equals("BUG任务")) {
task.setTaskType(2);
}
if (excelTaskVo.getTaskTypeName().equals("部门任务")) {
task.setTaskType(3);
}
task.setProjectId(taskRequest.getProjectId());
// 所属模块
DiyType type = new DiyType();
QueryWrapper<DiyType> qw = new QueryWrapper<>();
qw.eq("type_name", excelTaskVo.getModuleName());
qw.eq("project_id", taskRequest.getProjectId());
// 查询一级模块是否存在
List<DiyType> listDiy = service.list(qw);
if (listDiy.size() > 0) {
// 二级模块是否为空
if (StringUtils.isNotBlank(excelTaskVo.getTwoModuleName())) {
qw.eq("type_name", excelTaskVo.getTwoModuleName());
qw.eq("project_id", taskRequest.getProjectId());
// 查询二级模块是否存在
List<DiyType> listTwoDiy = service.list(qw);
if (listTwoDiy.size() > 0) {
// 二级模块存在赋值模块id
task.setModuleId(listTwoDiy.get(0).getId());
} else {
// 二级模块不为空,不存在创建新二级模块
QueryWrapper<DiyType> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", listDiy.get(0).getId());
queryWrapper.orderByDesc("code");
List<DiyType> list1 = service.list(queryWrapper);
type.setShowName(excelTaskVo.getTwoModuleName());
type.setTypeName(excelTaskVo.getTwoModuleName());
type.setCreateTime(new Date());
if (list1 != null && list1.size() > 0) {
// 查询到子分类,获取最大code生成新的code
String code = list1.get(0).getCode();
try {
type.setCode(UUIDUtil.newCode(code));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
// 没有查询到子分类,获取父类code 拼接 01
type.setCode(listDiy.get(0).getCode() + "01");
}
service.save(type);
}
} else {
// 二级模块为空取以一级模块id
task.setModuleId(listDiy.get(0).getId());
}
} else {
// 创建一级二级
QueryWrapper<DiyType> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", 0);
queryWrapper.orderByDesc("code");
List<DiyType> list1 = service.list(queryWrapper);
// 查询到子分类,获取最大code生成新的code
String code = list1.get(0).getCode();
type.setParentId("0");
try {
type.setCode(UUIDUtil.newCode(code));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
type.setShowName(excelTaskVo.getModuleName());
type.setTypeName(excelTaskVo.getModuleName());
type.setCreateTime(new Date());
service.save(type);
if (StringUtils.isNotBlank(excelTaskVo.getTwoModuleName())) {
// 二级分类创建
DiyType type2 = new DiyType();
type2.setCode(type.getCode() + "01");
type2.setParentId(type.getParentId());
type2.setShowName(excelTaskVo.getTwoModuleName());
type2.setTypeName(excelTaskVo.getTwoModuleName());
service.save(type2);
task.setModuleId(type2.getId());
}else {
task.setModuleId(type.getId());
}
}
//增加后端工时
task.setTaskName("bg"+excelTaskVo.getTaskName());
task.setWorkingHours(new BigDecimal(excelTaskVo.getBackHours()));
this.save(task);
//增加前端工时
task.setId(null);
task.setTaskName("fg"+excelTaskVo.getTaskName());
task.setWorkingHours(new BigDecimal(excelTaskVo.getFrontHours()));
this.save(task);
}
return null;
}
}
package com.zrqx.olive.ttask.vo;
import com.utils.excelutil.ExcelResources;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ExcelTaskVo",description="导入任务信息")
public class ExcelTaskVo {
@ExcelResources(title = "模块名称")
private String moduleName;
@ExcelResources(title = "二级菜单")
private String twoModuleName;
@ExcelResources(title = "任务")
private String taskName;
@ExcelResources(title = "任务类型")
private String taskTypeName;
@ExcelResources(title = "备注")
private String taskDescription;
@ExcelResources(title = "后端")
private String backHours;
@ExcelResources(title = "前端")
private String frontHours;
}
......@@ -38,10 +38,13 @@ public class TaskVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id,新增时不需要填写")
private String id;
private Integer id;
@ApiModelProperty(value = "可选值:1:项目任务 2:BUG任务 3:部门任务")
private Integer taskType;
@ApiModelProperty(value = "任务类型名")
private String taskTypeName;
@ApiModelProperty(value = "所属模块")
private String moduleId;
......@@ -52,7 +55,7 @@ public class TaskVo implements Serializable {
@ApiModelProperty(value = "指派给成员id")
private Integer userId;
@ApiModelProperty(value = "指派给成员id")
@ApiModelProperty(value = "指派给成员")
private String userName;
@ApiModelProperty(value = "优先级 可选值:1、2、3、4 仅支持单选,默认值为1。")
......@@ -72,9 +75,15 @@ public class TaskVo implements Serializable {
@ApiModelProperty(value = "任务状态 0:关闭 1:未完成 2:已完成")
private Integer taskStatus;
@ApiModelProperty(value = "任务状态名")
private String taskStatusName;
@ApiModelProperty(value = "完成时间")
private Date completeTime;
@ApiModelProperty(value = "完成人")
private String completeName;
@ApiModelProperty(value = "项目id")
private String projectId;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论