日报月报
This commit is contained in:
@ -1,17 +1,49 @@
|
|||||||
package com.sa.zentao;
|
package com.sa.zentao;
|
||||||
|
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.ExcelWriter;
|
||||||
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||||
|
import com.tencentcloudapi.ses.v20201002.models.EmailSender;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.DateUtil;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFCell;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
//,exclude = DataSourceAutoConfiguration.class
|
//,exclude = DataSourceAutoConfiguration.class
|
||||||
@SpringBootApplication(scanBasePackages = {"com.sa.zentao"})
|
@SpringBootApplication(scanBasePackages = {"com.sa.zentao"})
|
||||||
@MapperScan({"com.sa.zentao.mapper","com.sa.**.mapper"})
|
@MapperScan({"com.sa.zentao.mapper","com.sa.**.mapper"})
|
||||||
@EnableScheduling
|
@EnableScheduling
|
||||||
public class ZentaoApplication {
|
public class ZentaoApplication {
|
||||||
|
//
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
|
||||||
@ -19,4 +51,39 @@ public class ZentaoApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// // 定义数据
|
||||||
|
// Map<String, String> dataMap = new HashMap<>();
|
||||||
|
// dataMap.put("name", "张三");
|
||||||
|
// dataMap.put("age", "28");
|
||||||
|
//
|
||||||
|
// // 读取模板
|
||||||
|
// try (FileInputStream templateFile =(FileInputStream)ZentaoApplication.class.getClassLoader().getResourceAsStream("templates/scope测试.xlsx")) {
|
||||||
|
// Workbook workbook = WorkbookFactory.create(templateFile);
|
||||||
|
// Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
//
|
||||||
|
// // 替换占位符
|
||||||
|
// for (Row row : sheet) {
|
||||||
|
// for (Cell cell : row) {
|
||||||
|
// if (cell.getCellType() == CellType.STRING) {
|
||||||
|
// String cellValue = cell.getStringCellValue();
|
||||||
|
// for (Map.Entry<String, String> entry : dataMap.entrySet()) {
|
||||||
|
// cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
|
||||||
|
// }
|
||||||
|
// cell.setCellValue(cellValue);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 生成新文件
|
||||||
|
// try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
|
||||||
|
// workbook.write(outputStream);
|
||||||
|
// }
|
||||||
|
// workbook.close();
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,9 +29,6 @@ import java.util.Objects;
|
|||||||
public class JwtAuthenticationFilter implements jakarta.servlet.Filter {
|
public class JwtAuthenticationFilter implements jakarta.servlet.Filter {
|
||||||
|
|
||||||
|
|
||||||
public void init(FilterConfig filterConfig) throws ServletException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse servletResponse
|
public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse servletResponse
|
||||||
@ -69,6 +66,8 @@ public class JwtAuthenticationFilter implements jakarta.servlet.Filter {
|
|||||||
RiskUserThreadLocal.set(u);
|
RiskUserThreadLocal.set(u);
|
||||||
RiskUserThreadLocal.risk.set(u);
|
RiskUserThreadLocal.risk.set(u);
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
RiskUserThreadLocal.risk.set(null);
|
||||||
}
|
}
|
||||||
filterChain.doFilter(request,servletResponse);
|
filterChain.doFilter(request,servletResponse);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.sa.zentao.controller;
|
package com.sa.zentao.controller;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.sa.zentao.ZentaoApplication;
|
||||||
import com.sa.zentao.conf.RiskUserThreadLocal;
|
import com.sa.zentao.conf.RiskUserThreadLocal;
|
||||||
import com.sa.zentao.dao.BusinessException;
|
import com.sa.zentao.dao.BusinessException;
|
||||||
import com.sa.zentao.dao.Code;
|
import com.sa.zentao.dao.Code;
|
||||||
@ -14,6 +15,7 @@ import com.sa.zentao.utils.UploadUtil;
|
|||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@ -134,9 +136,14 @@ public class CommonsController {
|
|||||||
|
|
||||||
@GetMapping("/test")
|
@GetMapping("/test")
|
||||||
public Result<String> upload(){
|
public Result<String> upload(){
|
||||||
downLoad("http://192.168.1.161:8088/file-download-1.html");
|
// downLoad("http://192.168.1.161:8088/file-download-1.html");
|
||||||
|
|
||||||
|
// vxxervice.sendMessageToVx("GuoQiBing","测试消息",new Date());
|
||||||
|
// 定义数据
|
||||||
|
|
||||||
|
// 定义数据
|
||||||
|
|
||||||
|
|
||||||
vxxervice.sendMessageToVx("GuoQiBing","测试消息",new Date());
|
|
||||||
|
|
||||||
return Result.success();
|
return Result.success();
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ public class ZtBugController {
|
|||||||
return Result.success();
|
return Result.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//批量新增bug
|
||||||
@RequestMapping(value = "/batchAddBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/batchAddBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result batchAddBug(@RequestBody ZtBugDTO dto){
|
public Result batchAddBug(@RequestBody ZtBugDTO dto){
|
||||||
bugService.batchAddBug(dto);
|
bugService.batchAddBug(dto);
|
||||||
@ -99,7 +100,7 @@ public class ZtBugController {
|
|||||||
return Result.success(ztBugDTO);
|
return Result.success(ztBugDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
//完成
|
//完成
|
||||||
@RequestMapping(value = "/resolved", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/resolved", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result resolved(@RequestBody ZtBugDTO dto){
|
public Result resolved(@RequestBody ZtBugDTO dto){
|
||||||
bugService.resolved(dto);
|
bugService.resolved(dto);
|
||||||
|
@ -15,6 +15,7 @@ import com.sa.zentao.service.IZtStoryService;
|
|||||||
import com.sa.zentao.service.IZtTaskService;
|
import com.sa.zentao.service.IZtTaskService;
|
||||||
import com.sa.zentao.service.impl.IZtCountService;
|
import com.sa.zentao.service.impl.IZtCountService;
|
||||||
import com.sa.zentao.utils.DateUtils;
|
import com.sa.zentao.utils.DateUtils;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@ -22,8 +23,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -98,7 +97,14 @@ public class ZtCountController {
|
|||||||
public void exportProjectCount(@RequestBody ZtCountQo qo, jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response){
|
public void exportProjectCount(@RequestBody ZtCountQo qo, jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response){
|
||||||
countService.exportProjectCount(qo,request,response) ;
|
countService.exportProjectCount(qo,request,response) ;
|
||||||
}
|
}
|
||||||
//
|
|
||||||
|
//导出员工绩效
|
||||||
|
@RequestMapping(value = "/exportScope", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public void exportScope(@RequestBody ZtCountQo qo, jakarta.servlet.ServletRequest request, HttpServletResponse response){
|
||||||
|
countService.exportScope(qo,request,response) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping(value = "/projectList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/projectList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result projectList(@RequestBody ZtCaseDTO dto){
|
public Result projectList(@RequestBody ZtCaseDTO dto){
|
||||||
@ -112,7 +118,10 @@ public class ZtCountController {
|
|||||||
@RequestMapping(value = "/projectListAsc", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/projectListAsc", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result projectListAsc(@RequestBody ZtCaseDTO dto){
|
public Result projectListAsc(@RequestBody ZtCaseDTO dto){
|
||||||
|
|
||||||
|
List<Integer> authList = this.projectService.authList();
|
||||||
|
|
||||||
List<ZtProject> project = projectService.list(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getType, "program")
|
List<ZtProject> project = projectService.list(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getType, "program")
|
||||||
|
.in(ZtProject::getId,authList)
|
||||||
.eq(ZtProject::getStatus,"doing")
|
.eq(ZtProject::getStatus,"doing")
|
||||||
.eq(ZtProject::getDeleted,"0")
|
.eq(ZtProject::getDeleted,"0")
|
||||||
.orderByAsc(ZtProject::getId)
|
.orderByAsc(ZtProject::getId)
|
||||||
|
@ -227,9 +227,14 @@ public class ZtProjectController {
|
|||||||
//执行列表
|
//执行列表
|
||||||
@RequestMapping(value = "/implementPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/implementPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result<PageInfo<ZtProjectDTO>> implementPageList(@RequestBody ZtProjectQo qo){
|
public Result<PageInfo<ZtProjectDTO>> implementPageList(@RequestBody ZtProjectQo qo){
|
||||||
|
|
||||||
return Result.success(ztProjectService.implementPageList(qo));
|
return Result.success(ztProjectService.implementPageList(qo));
|
||||||
}
|
}
|
||||||
|
//执行下拉列表 包含本人且 未完成的迭代
|
||||||
|
@RequestMapping(value = "/myProgressImplementPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public Result<PageInfo<ZtProjectDTO>> myProgressImplementPageList(@RequestBody ZtProjectQo qo){
|
||||||
|
return Result.success(ztProjectService.myProgressImplementPageList(qo));
|
||||||
|
}
|
||||||
|
|
||||||
//执行下拉
|
//执行下拉
|
||||||
@RequestMapping(value = "/implementList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/implementList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result<List<ZtProjectDTO>> implementList(@RequestBody ZtProjectQo qo){
|
public Result<List<ZtProjectDTO>> implementList(@RequestBody ZtProjectQo qo){
|
||||||
@ -314,6 +319,25 @@ public class ZtProjectController {
|
|||||||
return Result.success(this.ztProjectService.projectTeamTimeWork(qo));
|
return Result.success(this.ztProjectService.projectTeamTimeWork(qo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//产品集工时项目工时 每个人 按月份 工时统计 日报
|
||||||
|
@RequestMapping(value = "/pageDaysTimeWorkCount", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public Result pageDaysTimeWorkCount(@RequestBody ZtProjectQo qo){
|
||||||
|
return Result.success(this.ztProjectService.pageDaysTimeWorkCount(qo));
|
||||||
|
}
|
||||||
|
|
||||||
|
//迭代工时 每个人
|
||||||
|
@RequestMapping(value = "/execWorkCount", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public Result execWorkCount(@RequestBody ZtProjectQo qo){
|
||||||
|
return Result.success(this.ztProjectService.execWorkCount(qo));
|
||||||
|
}
|
||||||
|
|
||||||
|
//项目统计 每个人 按月份 工时统计 月报
|
||||||
|
@RequestMapping(value = "/pageMonthReport", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public Result pageMonthReport(@RequestBody ZtProjectQo qo){
|
||||||
|
return Result.success(this.ztProjectService.pageMonthReport(qo));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//迭代列表根据项目
|
//迭代列表根据项目
|
||||||
@RequestMapping(value = "/executionByProject", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
@RequestMapping(value = "/executionByProject", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
public Result executionByProject(@RequestBody ZtProjectQo qo){
|
public Result executionByProject(@RequestBody ZtProjectQo qo){
|
||||||
|
@ -11,6 +11,7 @@ import com.sa.zentao.qo.StoryQo;
|
|||||||
import com.sa.zentao.qo.ZtProjectQo;
|
import com.sa.zentao.qo.ZtProjectQo;
|
||||||
import com.sa.zentao.service.IZtStoryUserService;
|
import com.sa.zentao.service.IZtStoryUserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
@ -104,4 +105,12 @@ public class ZtStoryUserController {
|
|||||||
storyUserService.addRemark(dto);
|
storyUserService.addRemark(dto);
|
||||||
return Result.success();
|
return Result.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/myWaitYsStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
|
||||||
|
public Result myWaitYsStory(@RequestBody ZtStoryDTO dto){
|
||||||
|
List list = storyUserService.myWaitYsStory(dto);
|
||||||
|
return Result.success(CollectionUtils.isEmpty(list)?list:list.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import com.sa.zentao.service.IZtActionService;
|
|||||||
import com.sa.zentao.service.IZtTeamService;
|
import com.sa.zentao.service.IZtTeamService;
|
||||||
import com.sa.zentao.service.IZtUserService;
|
import com.sa.zentao.service.IZtUserService;
|
||||||
import com.sa.zentao.utils.ChineseUtil;
|
import com.sa.zentao.utils.ChineseUtil;
|
||||||
|
import com.sa.zentao.utils.CryptoUtils;
|
||||||
import com.sa.zentao.utils.JwtUtil;
|
import com.sa.zentao.utils.JwtUtil;
|
||||||
import com.tencentcloudapi.common.Credential;
|
import com.tencentcloudapi.common.Credential;
|
||||||
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
||||||
@ -149,6 +150,9 @@ public class ZtUserController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
|
ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
|
||||||
|
if(!StringUtils.isEmpty(ztUser.getVx())){
|
||||||
|
ztUser.setVx(CryptoUtils.aesEncryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES));
|
||||||
|
}
|
||||||
|
|
||||||
this.userService.save(ztUser);
|
this.userService.save(ztUser);
|
||||||
this.actionService.addAction(ActionType.USER, ActionStatus.XJ,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount());
|
this.actionService.addAction(ActionType.USER, ActionStatus.XJ,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount());
|
||||||
@ -194,6 +198,11 @@ public class ZtUserController {
|
|||||||
if(!ztUser.getNickname().equals(user.getNickname())){
|
if(!ztUser.getNickname().equals(user.getNickname())){
|
||||||
ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
|
ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!StringUtils.isEmpty(user.getVx())){
|
||||||
|
ztUser.setVx(CryptoUtils.aesEncryptForFront(user.getVx(), CryptoUtils.KEY_DES));
|
||||||
|
}
|
||||||
|
|
||||||
ztUser.setAccount(user.getAccount());
|
ztUser.setAccount(user.getAccount());
|
||||||
|
|
||||||
ztUser.setPassword(user.getPassword());
|
ztUser.setPassword(user.getPassword());
|
||||||
|
22
src/main/java/com/sa/zentao/dao/DkInfo.java
Normal file
22
src/main/java/com/sa/zentao/dao/DkInfo.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package com.sa.zentao.dao;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class DkInfo implements Serializable {
|
||||||
|
|
||||||
|
private String account;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String dateStr;
|
||||||
|
|
||||||
|
private Date startDate;
|
||||||
|
|
||||||
|
private Date endDate;
|
||||||
|
}
|
22
src/main/java/com/sa/zentao/dao/ItApproval.java
Normal file
22
src/main/java/com/sa/zentao/dao/ItApproval.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package com.sa.zentao.dao;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class ItApproval implements Serializable {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Integer applyDays;
|
||||||
|
|
||||||
|
private Date applyTimeStart;
|
||||||
|
|
||||||
|
private Date applyTimeEnd;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package com.sa.zentao.dao;
|
package com.sa.zentao.dao;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@ -19,6 +20,9 @@ public class PerformanceDTO implements Serializable {
|
|||||||
//需求总工时
|
//需求总工时
|
||||||
@ExcelProperty(value = "天数",index =2)
|
@ExcelProperty(value = "天数",index =2)
|
||||||
private BigDecimal days;
|
private BigDecimal days;
|
||||||
|
// 小时
|
||||||
|
@ExcelIgnore
|
||||||
|
private BigDecimal approvalDays;
|
||||||
//实际产出工时
|
//实际产出工时
|
||||||
@ExcelProperty(value = "可用工时",index =3)
|
@ExcelProperty(value = "可用工时",index =3)
|
||||||
private BigDecimal totalTime;
|
private BigDecimal totalTime;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.sa.zentao.dao;
|
package com.sa.zentao.dao;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@ -16,6 +17,12 @@ public class WorkDetailsDTO implements Serializable {
|
|||||||
//任务总量
|
//任务总量
|
||||||
@ExcelProperty(value = "任务总量",index =1)
|
@ExcelProperty(value = "任务总量",index =1)
|
||||||
private BigDecimal taskCount;
|
private BigDecimal taskCount;
|
||||||
|
//任务延期
|
||||||
|
@ExcelIgnore
|
||||||
|
private BigDecimal taskDelayCount;
|
||||||
|
//任务准时完成率
|
||||||
|
@ExcelIgnore
|
||||||
|
private BigDecimal taskFinishOnTimeRate;
|
||||||
//需求总工时
|
//需求总工时
|
||||||
@ExcelProperty(value = "需求总工时",index =2)
|
@ExcelProperty(value = "需求总工时",index =2)
|
||||||
private BigDecimal storyTotalTime;
|
private BigDecimal storyTotalTime;
|
||||||
|
@ -7,6 +7,7 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -187,8 +188,15 @@ public class ZtTaskDTO implements Serializable {
|
|||||||
|
|
||||||
//0 否 1 是
|
//0 否 1 是
|
||||||
private Integer finishedFlag=0;
|
private Integer finishedFlag=0;
|
||||||
|
//0 否 1 是
|
||||||
|
private Integer draftFlag;
|
||||||
|
|
||||||
private String implementName;
|
private String implementName;
|
||||||
private Integer implementId;
|
private Integer implementId;
|
||||||
private Integer product;
|
private Integer product;
|
||||||
private String productName;
|
private String productName;
|
||||||
|
|
||||||
|
private Date applyDate;
|
||||||
|
|
||||||
|
private BigDecimal useTime;
|
||||||
}
|
}
|
||||||
|
@ -136,4 +136,9 @@ public class ZtUserDTO implements Serializable {
|
|||||||
|
|
||||||
private String color;
|
private String color;
|
||||||
|
|
||||||
|
private String vx;
|
||||||
|
|
||||||
|
private Date startDate;
|
||||||
|
|
||||||
|
private Date endDate;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.sa.zentao.entity;
|
package com.sa.zentao.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@ -75,7 +77,7 @@ public class ZtTask implements Serializable {
|
|||||||
//deadline 预计完成 estStarted预计开始
|
//deadline 预计完成 estStarted预计开始
|
||||||
private Date deadline;
|
private Date deadline;
|
||||||
|
|
||||||
//pause 暂停 cancel取消 closed 关闭 done 完成 wait reviewing待评审 doing
|
//pause 暂停 cancel取消 closed 关闭 done 完成 wait reviewing待评审 doing 草稿 draft
|
||||||
@TableField("`status`")
|
@TableField("`status`")
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
@ -93,13 +95,19 @@ public class ZtTask implements Serializable {
|
|||||||
|
|
||||||
@TableField("openedBy")
|
@TableField("openedBy")
|
||||||
private String openedby;
|
private String openedby;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String openedbyAccount;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String openedbyName;
|
||||||
@TableField("openedDate")
|
@TableField("openedDate")
|
||||||
private Date openeddate;
|
private Date openeddate;
|
||||||
|
|
||||||
@TableField("assignedTo")
|
@TableField("assignedTo")
|
||||||
private String assignedTo;
|
private String assignedTo;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String assignedToAccount;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String assignedToName;
|
||||||
@TableField("assignedDate")
|
@TableField("assignedDate")
|
||||||
private Date assignedDate;
|
private Date assignedDate;
|
||||||
//预计开始
|
//预计开始
|
||||||
@ -111,7 +119,7 @@ public class ZtTask implements Serializable {
|
|||||||
|
|
||||||
@TableField("finishedBy")
|
@TableField("finishedBy")
|
||||||
private String finishedby;
|
private String finishedby;
|
||||||
//完成日期
|
//真实完成日期
|
||||||
@TableField("finishedDate")
|
@TableField("finishedDate")
|
||||||
private Date finishedDate;
|
private Date finishedDate;
|
||||||
|
|
||||||
@ -175,4 +183,11 @@ public class ZtTask implements Serializable {
|
|||||||
private Long deadlineTime;
|
private Long deadlineTime;
|
||||||
|
|
||||||
private Integer product;
|
private Integer product;
|
||||||
|
// 0否 1.是
|
||||||
|
// @TableField(exist = false)
|
||||||
|
private Integer finishedFlag;
|
||||||
|
// @TableField(exist = false)
|
||||||
|
private Date applyDate;
|
||||||
|
// @TableField(exist = false)
|
||||||
|
private BigDecimal useTime;
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ public interface ZtProjectMapper extends BaseMapper<ZtProject> {
|
|||||||
|
|
||||||
List<ZtProjectDTO> implementPageList(@Param("qo")ZtProjectQo qo);
|
List<ZtProjectDTO> implementPageList(@Param("qo")ZtProjectQo qo);
|
||||||
|
|
||||||
|
|
||||||
List<ZtProject> getProjectByProduct(@Param("qo") ZtProjectQo qo);
|
List<ZtProject> getProjectByProduct(@Param("qo") ZtProjectQo qo);
|
||||||
|
|
||||||
List<ZtProject> executionListByProduct(@Param("qo")ZtProjectQo qo);
|
List<ZtProject> executionListByProduct(@Param("qo")ZtProjectQo qo);
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package com.sa.zentao.mapper;
|
package com.sa.zentao.mapper;
|
||||||
|
|
||||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
|
import com.sa.zentao.dao.ItApproval;
|
||||||
import com.sa.zentao.dao.ZtTaskDTO;
|
import com.sa.zentao.dao.ZtTaskDTO;
|
||||||
import com.sa.zentao.entity.ZtTask;
|
import com.sa.zentao.entity.ZtTask;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.sa.zentao.qo.ZtProjectQo;
|
import com.sa.zentao.qo.ZtProjectQo;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,4 +25,6 @@ public interface ZtTaskMapper extends BaseMapper<ZtTask> {
|
|||||||
|
|
||||||
@DS("slave")
|
@DS("slave")
|
||||||
List<ZtTaskDTO> taskListPrd(@Param("id") Integer id);
|
List<ZtTaskDTO> taskListPrd(@Param("id") Integer id);
|
||||||
|
|
||||||
|
List<ItApproval> itApprovalByUserName(@Param("name") String name,@Param("startDate") Date firstDayOfMonth, @Param("endDate") Date lastDayOfMonth);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.sa.zentao.mapper;
|
package com.sa.zentao.mapper;
|
||||||
|
|
||||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
|
import com.sa.zentao.dao.DkInfo;
|
||||||
import com.sa.zentao.dao.ZtUserDTO;
|
import com.sa.zentao.dao.ZtUserDTO;
|
||||||
import com.sa.zentao.entity.ZtUser;
|
import com.sa.zentao.entity.ZtUser;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
@ -8,6 +9,7 @@ import com.sa.zentao.qo.ZtUserQo;
|
|||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.apache.ibatis.annotations.Select;
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -22,6 +24,7 @@ public interface ZtUserMapper extends BaseMapper<ZtUser> {
|
|||||||
|
|
||||||
List<ZtUser> pageList(@Param("qo") ZtUserQo qo);
|
List<ZtUser> pageList(@Param("qo") ZtUserQo qo);
|
||||||
|
|
||||||
|
List<DkInfo> dkList(@Param("ids") List<String> account, @Param("startDate") Date startDate, @Param("endDate")Date endDate);
|
||||||
|
|
||||||
@DS("slave")
|
@DS("slave")
|
||||||
@Select("select * from zt_user")
|
@Select("select * from zt_user")
|
||||||
@ -30,4 +33,6 @@ public interface ZtUserMapper extends BaseMapper<ZtUser> {
|
|||||||
@DS("slave")
|
@DS("slave")
|
||||||
ZtUser selectPrdByName(@Param("name")String userName);
|
ZtUser selectPrdByName(@Param("name")String userName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ public interface IZtProjectService extends IService<ZtProject> {
|
|||||||
void executionSyncStory(ZtProjectDTO dto);
|
void executionSyncStory(ZtProjectDTO dto);
|
||||||
|
|
||||||
|
|
||||||
//产品集权限
|
//产品权限
|
||||||
List<Integer> authProductList();
|
List<Integer> authProductList();
|
||||||
//产品集权限
|
//产品集权限
|
||||||
List<Integer> authList();
|
List<Integer> authList();
|
||||||
@ -113,4 +113,13 @@ public interface IZtProjectService extends IService<ZtProject> {
|
|||||||
List<PerformanceDTO> performanceCount(Date startDate, Date endDate);
|
List<PerformanceDTO> performanceCount(Date startDate, Date endDate);
|
||||||
|
|
||||||
ZtProjectDTO projectProductByExecution(String execution);
|
ZtProjectDTO projectProductByExecution(String execution);
|
||||||
|
|
||||||
|
PageInfo< Map<String, Object>> pageDaysTimeWorkCount(ZtProjectQo qo);
|
||||||
|
|
||||||
|
|
||||||
|
PageInfo pageMonthReport(ZtProjectQo qo);
|
||||||
|
|
||||||
|
List<Map<String, Object>> execWorkCount(ZtProjectQo qo);
|
||||||
|
|
||||||
|
PageInfo<ZtProjectDTO> myProgressImplementPageList(ZtProjectQo qo);
|
||||||
}
|
}
|
||||||
|
@ -38,4 +38,7 @@ public interface IZtStoryUserService extends IService<ZtStoryUser> {
|
|||||||
void addRemark(ZtStoryDTO dto);
|
void addRemark(ZtStoryDTO dto);
|
||||||
|
|
||||||
void closedStory(ZtStoryUserDTO dto);
|
void closedStory(ZtStoryUserDTO dto);
|
||||||
|
|
||||||
|
List myWaitYsStory(ZtStoryDTO dto);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.sa.zentao.service;
|
package com.sa.zentao.service;
|
||||||
|
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.sa.zentao.dao.ItApproval;
|
||||||
import com.sa.zentao.dao.ZtProjectDTO;
|
import com.sa.zentao.dao.ZtProjectDTO;
|
||||||
import com.sa.zentao.dao.ZtTaskDTO;
|
import com.sa.zentao.dao.ZtTaskDTO;
|
||||||
import com.sa.zentao.dao.ZtYwTaskDTO;
|
import com.sa.zentao.dao.ZtYwTaskDTO;
|
||||||
@ -8,6 +9,7 @@ import com.sa.zentao.entity.ZtTask;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.sa.zentao.qo.ZtProjectQo;
|
import com.sa.zentao.qo.ZtProjectQo;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,4 +55,7 @@ public interface IZtTaskService extends IService<ZtTask> {
|
|||||||
ZtTaskDTO getTaskById(Integer id);
|
ZtTaskDTO getTaskById(Integer id);
|
||||||
|
|
||||||
List<ZtTaskDTO> taskListPrd(Integer id);
|
List<ZtTaskDTO> taskListPrd(Integer id);
|
||||||
|
|
||||||
|
List<ItApproval> itApprovalByUserName(String s, Date firstDayOfMonth, Date lastDayOfMonth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
package com.sa.zentao.service;
|
package com.sa.zentao.service;
|
||||||
|
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.sa.zentao.dao.DkInfo;
|
||||||
import com.sa.zentao.dao.ZtProjectDTO;
|
import com.sa.zentao.dao.ZtProjectDTO;
|
||||||
import com.sa.zentao.dao.ZtUserDTO;
|
import com.sa.zentao.dao.ZtUserDTO;
|
||||||
import com.sa.zentao.entity.ZtUser;
|
import com.sa.zentao.entity.ZtUser;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.sa.zentao.qo.ZtUserQo;
|
import com.sa.zentao.qo.ZtUserQo;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -29,6 +32,8 @@ public interface IZtUserService extends IService<ZtUser> {
|
|||||||
|
|
||||||
Map<String, ZtUser> userMapByIds(List<String> accounts);
|
Map<String, ZtUser> userMapByIds(List<String> accounts);
|
||||||
|
|
||||||
|
Map<String, ZtUser> userMapByIdsOrderByType(List<String> accounts);
|
||||||
|
|
||||||
void sendCode(ZtUser user);
|
void sendCode(ZtUser user);
|
||||||
|
|
||||||
ZtUser login(ZtUser user);
|
ZtUser login(ZtUser user);
|
||||||
@ -36,4 +41,6 @@ public interface IZtUserService extends IService<ZtUser> {
|
|||||||
ZtUser selectPrdByName(String userName);
|
ZtUser selectPrdByName(String userName);
|
||||||
|
|
||||||
ZtUser getbyVxId(String vx);
|
ZtUser getbyVxId(String vx);
|
||||||
|
|
||||||
|
List<DkInfo> dkList(@Param("ids") List<String> account, @Param("startDate") Date startDate, @Param("endDate")Date endDate);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package com.sa.zentao.service.impl;
|
|||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
import com.alibaba.excel.ExcelWriter;
|
import com.alibaba.excel.ExcelWriter;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
import com.alibaba.excel.read.listener.PageReadListener;
|
||||||
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
||||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||||
import com.alibaba.excel.write.metadata.WriteTable;
|
import com.alibaba.excel.write.metadata.WriteTable;
|
||||||
@ -11,6 +12,7 @@ import com.alibaba.fastjson.JSONObject;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.mysql.cj.x.protobuf.MysqlxCrud;
|
||||||
import com.sa.zentao.conf.LoginRiskUser;
|
import com.sa.zentao.conf.LoginRiskUser;
|
||||||
import com.sa.zentao.conf.RiskUserThreadLocal;
|
import com.sa.zentao.conf.RiskUserThreadLocal;
|
||||||
import com.sa.zentao.dao.*;
|
import com.sa.zentao.dao.*;
|
||||||
@ -24,16 +26,19 @@ import com.sa.zentao.qo.ZtProjectQo;
|
|||||||
import com.sa.zentao.qo.ZtUserQo;
|
import com.sa.zentao.qo.ZtUserQo;
|
||||||
import com.sa.zentao.service.*;
|
import com.sa.zentao.service.*;
|
||||||
import com.sa.zentao.utils.DateUtils;
|
import com.sa.zentao.utils.DateUtils;
|
||||||
|
import com.sa.zentao.utils.ExcelUtil;
|
||||||
import jakarta.servlet.ServletOutputStream;
|
import jakarta.servlet.ServletOutputStream;
|
||||||
|
import jakarta.servlet.ServletRequest;
|
||||||
|
import jakarta.servlet.ServletResponse;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import java.io.*;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -355,13 +360,15 @@ public class IZtCountService {
|
|||||||
.filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(",")));
|
.filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(",")));
|
||||||
|
|
||||||
result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
||||||
.filter(o -> o.getStage().equals("developing")) .map(o->o.getId()+"").collect(Collectors.joining(",")));
|
.filter(o -> Arrays.asList("tested","testing","developed","developing").contains(o.getStage())
|
||||||
|
) .map(o->o.getId()+"").collect(Collectors.joining(",")));
|
||||||
|
|
||||||
result.setCswbCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
result.setCswbCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
||||||
.filter(o -> o.getStage().equals("tested"))
|
.filter(o -> o.getStage().equals("tested"))
|
||||||
.map(o->o.getId()+"").collect(Collectors.joining(",")));
|
.map(o->o.getId()+"").collect(Collectors.joining(",")));
|
||||||
result.setDysCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
result.setDysCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
||||||
.filter(o -> o.getStage().equals("released"))
|
.filter(o -> o.getStage().equals("released"))
|
||||||
|
.filter(o->o.getYsUser().equals(RiskUserThreadLocal.get().getName()))
|
||||||
.map(o->o.getId()+"").collect(Collectors.joining(",")));
|
.map(o->o.getId()+"").collect(Collectors.joining(",")));
|
||||||
result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
|
||||||
.filter(o -> o.getStage().equals("verified"))
|
.filter(o -> o.getStage().equals("verified"))
|
||||||
@ -520,24 +527,97 @@ public class IZtCountService {
|
|||||||
// @Autowired
|
// @Autowired
|
||||||
// private IZtBugService bugService;
|
// private IZtBugService bugService;
|
||||||
|
|
||||||
|
public void exportScope(ZtCountQo qo, ServletRequest request, HttpServletResponse response) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
List<PerformanceDTO> perList =performanceCount(qo);
|
||||||
|
if(CollectionUtils.isEmpty(perList)){
|
||||||
|
throw new BusinessException("未查询到数据");
|
||||||
|
}
|
||||||
|
|
||||||
|
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
|
||||||
|
|
||||||
|
|
||||||
|
Map<String, ZtUser> userMap = userService.userMapByIds(null);
|
||||||
|
|
||||||
|
|
||||||
|
//生成模板
|
||||||
|
for (int i = 0; i < perList.size(); i++) {
|
||||||
|
PerformanceDTO performanceDTO = perList.get(i);
|
||||||
|
ZtUser ztUser = userMap.get(performanceDTO.getAccount());
|
||||||
|
|
||||||
|
if(ztUser.getUserType()==UserType.CS){
|
||||||
|
generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
|
||||||
|
}else if(ztUser.getUserType()==UserType.KFZ){
|
||||||
|
generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
|
||||||
|
}else if(ztUser.getUserType()==UserType.XMGLY){
|
||||||
|
}else{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//生成多sheetexcel
|
||||||
|
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
for (int i = 0; i < perList.size(); i++) {
|
||||||
|
PerformanceDTO performanceDTO = perList.get(i);
|
||||||
|
ZtUser ztUser = userMap.get(performanceDTO.getAccount());
|
||||||
|
|
||||||
|
|
||||||
|
if(ztUser.getUserType()==UserType.CS){
|
||||||
|
list.add(performanceDTO.getUserName()+"测试.xlsx");
|
||||||
|
|
||||||
|
generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
|
||||||
|
}else if(ztUser.getUserType()==UserType.KFZ){
|
||||||
|
list.add(performanceDTO.getUserName()+"开发.xlsx");
|
||||||
|
generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String excelName=DateUtils.formatDate(qo.getDate(),"yyyy-MM-dd")+"绩效"+".xlsx";
|
||||||
|
String dir=System.getProperty("user.dir")+"/";
|
||||||
|
ExcelUtil.mergexcel(list,excelName, dir);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
File f = new File(dir+excelName);
|
||||||
|
InputStream fis = new BufferedInputStream(new FileInputStream(f));
|
||||||
|
// InputStream fis = new BufferedInputStream(new FileInputStream("D:\\1.bmp"));
|
||||||
|
byte[] buffer = new byte[fis.available()];
|
||||||
|
|
||||||
|
fis.read(buffer);
|
||||||
|
fis.close();
|
||||||
|
// 清空response
|
||||||
|
response.reset();
|
||||||
|
// 设置response的Header
|
||||||
|
response.addHeader("Content-Disposition", "attachment;filename=" + new String("1.xlsx"));
|
||||||
|
response.addHeader("Content-Length", "" + f.length());
|
||||||
|
|
||||||
|
|
||||||
|
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
|
||||||
|
response.setContentType("application/octet-stream");
|
||||||
|
toClient.write(buffer);
|
||||||
|
toClient.flush();
|
||||||
|
toClient.close();
|
||||||
|
// ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
|
||||||
|
// . registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||||
|
// .needHead(Boolean.TRUE).build();
|
||||||
|
// excelWriter.finish();
|
||||||
|
response.getOutputStream().close();
|
||||||
|
response.flushBuffer();
|
||||||
|
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error("",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void exportProjectCount(ZtCountQo qo,jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response) {
|
public void exportProjectCount(ZtCountQo qo,jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
List<ProjectWorkDetailsDTO> workDetailsDTOS = projectWorkCount(qo,request,response);
|
List<ProjectWorkDetailsDTO> workDetailsDTOS = projectWorkCount(qo,request,response);
|
||||||
|
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
// ExcelWriter excelWriter = EasyExcel.write(os).build();
|
|
||||||
|
|
||||||
// WriteSheet 统计 = EasyExcel.writerSheet("统计").
|
|
||||||
// registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
|
||||||
// .needHead(Boolean.TRUE)
|
|
||||||
// .build();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<WorkDetailsDTO> workDetailsDTOS1 = workDetailsCount(qo);
|
List<WorkDetailsDTO> workDetailsDTOS1 = workDetailsCount(qo);
|
||||||
|
|
||||||
@ -545,17 +625,9 @@ public class IZtCountService {
|
|||||||
|
|
||||||
|
|
||||||
List<PerformanceDTO> perList =performanceCount(qo);
|
List<PerformanceDTO> perList =performanceCount(qo);
|
||||||
// excelWriter.write(workDetailsDTOS, 统计, accountInfo);
|
|
||||||
// excelWriter.write(workDetailsDTOS1, 统计, tweetInfo);
|
|
||||||
|
|
||||||
// EasyExcel.write(os, ProjectWorkDetailsDTO.class)
|
|
||||||
// .sheet("统计").doWrite(workDetailsDTOS);
|
|
||||||
|
|
||||||
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
|
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
|
||||||
// response.("Access-Control-Expose-Headers","Content-Disposition");//不设置该参数前端(vue)接收不到文件名
|
|
||||||
// response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
|
||||||
|
|
||||||
ServletOutputStream outputStream = response.getOutputStream();
|
|
||||||
|
|
||||||
|
|
||||||
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
|
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
|
||||||
@ -594,10 +666,6 @@ public class IZtCountService {
|
|||||||
excelWriter.finish();
|
excelWriter.finish();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
response.getOutputStream().close();
|
response.getOutputStream().close();
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
|
|
||||||
@ -630,15 +698,237 @@ public class IZtCountService {
|
|||||||
if (CollectionUtils.isEmpty(projectproducts)) {
|
if (CollectionUtils.isEmpty(projectproducts)) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
List<ZtExecutionproject> list = executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
|
List<ZtExecutionproject> execList = executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
|
||||||
.in(ZtExecutionproject::getProject, projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList())));
|
.in(ZtExecutionproject::getProject, projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList())));
|
||||||
if (CollectionUtils.isEmpty(list)) {
|
if (CollectionUtils.isEmpty(execList)) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
List<ZtTask> taskList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
|
||||||
|
.and(o->o.between(ZtTask::getDeadline, firstDayOfMonth,lastDayOfMonth)
|
||||||
|
.or()
|
||||||
|
.between(ZtTask::getFinishedDate, firstDayOfMonth,lastDayOfMonth)
|
||||||
|
)
|
||||||
|
.in(ZtTask::getExecution, execList.stream().map(o -> o.getExecution())
|
||||||
|
.collect(Collectors.toList())));
|
||||||
|
if (CollectionUtils.isEmpty(taskList)) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
List<ZtProject> ztProjects = this.projectService.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
|
||||||
|
|
||||||
// this.teamService.list(new QueryWrapper<>().lambda().eq());
|
List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")
|
||||||
|
.in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())));
|
||||||
|
|
||||||
return this.projectService.performanceCount(firstDayOfMonth,lastDayOfMonth);
|
List<String> accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
|
||||||
|
if (CollectionUtils.isEmpty(accountIds)) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
//accountIds 成员
|
||||||
|
|
||||||
|
List<ZtUser> ztUsers = this.userService.list(new QueryWrapper<ZtUser>().lambda().in(ZtUser::getAccount,accountIds));
|
||||||
|
|
||||||
|
|
||||||
|
List<PerformanceDTO> result =new ArrayList<>();
|
||||||
|
|
||||||
|
for (ZtUser u:ztUsers) {
|
||||||
|
|
||||||
|
List<ItApproval> approvalList = this.taskService.itApprovalByUserName(u.getNickname(),firstDayOfMonth, lastDayOfMonth);
|
||||||
|
|
||||||
|
if(u.getUserType()==UserType.CS){
|
||||||
|
|
||||||
|
}else if(u.getUserType()==UserType.KFZ){
|
||||||
|
|
||||||
|
}else if(u.getUserType()==UserType.XMGLY){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PerformanceDTO dto=new PerformanceDTO();
|
||||||
|
dto.setUserName(u.getNickname());
|
||||||
|
dto.setAccount(u.getAccount());
|
||||||
|
//本月天数
|
||||||
|
int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
|
||||||
|
//获取本月请假
|
||||||
|
Integer applyTime=0;
|
||||||
|
if(!CollectionUtils.isEmpty(approvalList)){
|
||||||
|
for (ItApproval a:approvalList) {
|
||||||
|
//分钟
|
||||||
|
applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//本月天数
|
||||||
|
dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
|
||||||
|
//本月天数 请假天数
|
||||||
|
dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
|
||||||
|
//可用工时 6小时算
|
||||||
|
dto.setTotalTime(
|
||||||
|
dto.getApprovalDays().intValue()==0?dto.getDays().multiply(BigDecimal.valueOf(8)).setScale(2,BigDecimal.ROUND_HALF_UP)
|
||||||
|
:dto.getDays().multiply(BigDecimal.valueOf(8)).subtract(dto.getApprovalDays()).setScale(2,BigDecimal.ROUND_HALF_UP));
|
||||||
|
//达标工时
|
||||||
|
dto.setExamineTime(dto.getTotalTime().multiply(BigDecimal.valueOf(0.75)));
|
||||||
|
//产出工时 算task
|
||||||
|
List<Float> taskTimeList = taskList.stream().filter(o->o.getFinishedDate()!=null&&
|
||||||
|
o.getFinishedDate().getTime()<=lastDayOfMonth.getTime() &&firstDayOfMonth.getTime()<=o.getFinishedDate().getTime()
|
||||||
|
).map(o -> o.getConsumed()).collect(Collectors.toList());
|
||||||
|
|
||||||
|
//分配总工时
|
||||||
|
taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getEstimate()).collect(Collectors.toList());
|
||||||
|
dto.setAllocationTime(floatBatchAdd(taskTimeList));
|
||||||
|
|
||||||
|
dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList())));
|
||||||
|
|
||||||
|
//工作饱和度
|
||||||
|
dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP));
|
||||||
|
float saturation = dto.getSaturation().floatValue();
|
||||||
|
//完成准时率 TODO 延期 / 总完成
|
||||||
|
List<ZtTask> delayTaskList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
|
||||||
|
&& DateUtils.getDayLast(o.getFinishedDate()).getTime() > DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
|
||||||
|
dto.setFinishTask(BigDecimal.valueOf(taskTimeList.size()));
|
||||||
|
dto.setDelayTask(BigDecimal.valueOf(delayTaskList.size()));
|
||||||
|
//准时完成率
|
||||||
|
dto.setFinishPunctuality(taskTimeList.size()==0?BigDecimal.valueOf(0):
|
||||||
|
CollectionUtils.isEmpty(delayTaskList)?BigDecimal.valueOf(1):
|
||||||
|
BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(delayTaskList.size())
|
||||||
|
.divide(BigDecimal.valueOf(taskTimeList.size()),2,BigDecimal.ROUND_HALF_UP)));
|
||||||
|
//工作饱和度
|
||||||
|
if(saturation<0.7){
|
||||||
|
// = 0
|
||||||
|
dto.setSaturationScore(BigDecimal.ZERO);
|
||||||
|
}else{
|
||||||
|
if(saturation<0.9){
|
||||||
|
dto.setSaturationScore(BigDecimal.valueOf(40 - ( 0.9 - saturation ) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
|
||||||
|
}else{
|
||||||
|
dto.setSaturationScore(BigDecimal.valueOf(40));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BigDecimal finishPunctuality = dto.getFinishPunctuality();
|
||||||
|
// 准时率得分 ( `完成准时率` < 1 , 25 - (1 - `完成准时率`) * 100 * 1, 25 )) `准时率得分`,
|
||||||
|
if(finishPunctuality.floatValue()<1){
|
||||||
|
//TODO 完成准时率 0.8
|
||||||
|
if(finishPunctuality.floatValue()<0.8){
|
||||||
|
dto.setPunctualityScore(BigDecimal.ZERO);
|
||||||
|
}else{
|
||||||
|
dto.setPunctualityScore(BigDecimal.valueOf(25 - (1 - finishPunctuality.floatValue()) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
|
||||||
|
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//饱和率得分
|
||||||
|
dto.setPunctualityScore(BigDecimal.valueOf(25));
|
||||||
|
}
|
||||||
|
List<ZtBug> bugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
|
||||||
|
.in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount()));
|
||||||
|
|
||||||
|
|
||||||
|
if(CollectionUtils.isEmpty(bugList)){
|
||||||
|
dto.setSeriousBug(BigDecimal.ZERO);
|
||||||
|
dto.setSlightBug(BigDecimal.ZERO);
|
||||||
|
dto.setBugScore(BigDecimal.valueOf(10));
|
||||||
|
}else{
|
||||||
|
Long seriousBug = bugList.stream().filter(o -> o.getSeverity() == 1).count();
|
||||||
|
dto.setSeriousBug(BigDecimal.valueOf(seriousBug));
|
||||||
|
Long slightBug = bugList.stream().filter(o -> o.getSeverity() == 1).count();
|
||||||
|
dto.setSlightBug(BigDecimal.valueOf(slightBug));
|
||||||
|
|
||||||
|
|
||||||
|
//测试 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 20, 20 - `线上严重bug` * 20 - `线上普通bug` * 5 )
|
||||||
|
if(u.getUserType()==UserType.CS){
|
||||||
|
dto.setBugScore(
|
||||||
|
(seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(20):BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(5)))))
|
||||||
|
);
|
||||||
|
}else{
|
||||||
|
dto.setBugScore((seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(10):BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(3))))));
|
||||||
|
}
|
||||||
|
//其余 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 10, 10 - `线上严重bug` * 10 - `线上普通bug` * 3 )
|
||||||
|
}
|
||||||
|
if(u.getUserType()==UserType.CS){
|
||||||
|
//算绩效 `线上bug得分` + `准时率得分` + 50,
|
||||||
|
dto.setScore(dto.getBugScore() .add(dto.getPunctualityScore()).add(BigDecimal.valueOf(50)) );
|
||||||
|
}else{
|
||||||
|
//`饱和率得分`+ `线上bug得分` + `准时率得分` + 25
|
||||||
|
dto.setScore(dto.getSaturationScore() .add(dto.getBugScore()).add(dto.getPunctualityScore()).add(BigDecimal.valueOf(25)));
|
||||||
|
}
|
||||||
|
|
||||||
|
result.add(dto);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return result;
|
||||||
|
// return this.projectService.performanceCount(firstDayOfMonth,lastDayOfMonth);
|
||||||
|
}
|
||||||
|
|
||||||
|
//分钟 请假
|
||||||
|
private Integer getApprovalTime(List<ItApproval> approvalList,Date d) {
|
||||||
|
String dFormat = DateUtils.formatDate(d, "yyyyMM");
|
||||||
|
Integer value=0;
|
||||||
|
for (ItApproval approval:approvalList) {
|
||||||
|
|
||||||
|
Date applyTimeEnd = approval.getApplyTimeEnd();
|
||||||
|
Date applyTimeStart = approval.getApplyTimeStart();
|
||||||
|
String startStr = DateUtils.formatDate(applyTimeEnd, "yyyyMM");
|
||||||
|
String endStr = DateUtils.formatDate(applyTimeStart, "yyyyMM");
|
||||||
|
|
||||||
|
int intStart = Integer.valueOf(DateUtils.formatDate(applyTimeEnd, "yyyyMMdd"));
|
||||||
|
int intEnd = Integer.valueOf(DateUtils.formatDate(applyTimeStart, "yyyyMMdd"));
|
||||||
|
if((intEnd-intStart)==0){
|
||||||
|
value+=approval.getApplyDays();
|
||||||
|
}else{
|
||||||
|
// 情况 1 1月27 -2 2
|
||||||
|
//情况2 2.月28 -3.1
|
||||||
|
int days = DateUtils.daysBetween(applyTimeStart, applyTimeEnd)+1;
|
||||||
|
for (int i =0;i<days ;i++) {
|
||||||
|
Date date = DateUtils.dateAddDay(applyTimeStart, i);
|
||||||
|
if(date.getMonth()!=d.getMonth()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(DateUtils.isWork(date)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i!=0){
|
||||||
|
date.setHours(9);
|
||||||
|
date.setSeconds(0);
|
||||||
|
date.setMinutes(0);
|
||||||
|
}
|
||||||
|
if(dFormat.equals(DateUtils.formatDate(date,"yyyyMM"))){
|
||||||
|
//请假在范围
|
||||||
|
Integer mStart = Integer.valueOf(DateUtils.formatDate(date, "HHmm"));
|
||||||
|
// 8个半小时
|
||||||
|
Date thisDay = new Date();
|
||||||
|
thisDay.setDate(date.getDate());
|
||||||
|
thisDay.setHours(17);
|
||||||
|
thisDay.setMinutes(30);
|
||||||
|
thisDay.setSeconds(0);
|
||||||
|
if(mStart<=1300){
|
||||||
|
//早上请假
|
||||||
|
if(thisDay.getTime()<applyTimeEnd.getTime()){
|
||||||
|
value+=(int)((thisDay.getTime()-date.getTime())/1000-(30*60));
|
||||||
|
}else{
|
||||||
|
value+=(int)((applyTimeEnd.getTime()-date.getTime())/1000-(30*60));
|
||||||
|
}
|
||||||
|
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
if(thisDay.getTime()<applyTimeEnd.getTime()){
|
||||||
|
value+= (int)(thisDay.getTime()-date.getTime())/1000;
|
||||||
|
}else{
|
||||||
|
value+= (int)(applyTimeEnd.getTime()-date.getTime())/1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
//下午请假
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value/60;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Date thisDay = new Date();
|
||||||
|
thisDay.setHours(17);
|
||||||
|
thisDay.setMinutes(30);
|
||||||
|
thisDay.setSeconds(0);
|
||||||
|
System.out.print(thisDay);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ProjectWorkTaskDTO> workTaskCounts(ZtCountQo qo) {
|
private List<ProjectWorkTaskDTO> workTaskCounts(ZtCountQo qo) {
|
||||||
@ -871,12 +1161,12 @@ public class IZtCountService {
|
|||||||
if(size==0){
|
if(size==0){
|
||||||
dto.setYsYesRate(BigDecimal.ZERO);
|
dto.setYsYesRate(BigDecimal.ZERO);
|
||||||
}else{
|
}else{
|
||||||
dto.setYsYesRate(BigDecimal.valueOf(size).divide(BigDecimal.valueOf(ysVerified.size()),2,BigDecimal.ROUND_HALF_UP));
|
dto.setYsYesRate(BigDecimal.valueOf(size).divide(BigDecimal.valueOf(ysVerified.size()),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)));
|
||||||
}
|
}
|
||||||
if(CollectionUtils.isEmpty(ysVerified)){
|
if(CollectionUtils.isEmpty(ysVerified)){
|
||||||
dto.setYsNoRate(BigDecimal.ZERO);
|
dto.setYsNoRate(BigDecimal.ZERO);
|
||||||
}else{
|
}else{
|
||||||
dto.setYsNoRate(BigDecimal.valueOf(1).subtract(dto.getYsYesRate()));
|
dto.setYsNoRate(BigDecimal.valueOf(ysVerified.stream().filter(o -> o.getStage().equals("verified")&&o.getYsFlag()==2).collect(Collectors.toList()).size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1018,9 +1308,15 @@ public class IZtCountService {
|
|||||||
// return zeroMap(map,objMap);
|
// return zeroMap(map,objMap);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
List<ZtRelease> releases = this.releaseService.list(new QueryWrapper<ZtRelease>().lambda()
|
List<ZtRelease> releases =null;
|
||||||
.eq(ZtRelease::getStatus,"released")
|
if(CollectionUtils.isEmpty(projectList)){
|
||||||
.in(ZtRelease::getProject, projectList.stream().map(o -> o.getProject()).collect(Collectors.toList())));
|
releases=new ArrayList<>();
|
||||||
|
}else{
|
||||||
|
releases=this.releaseService.list(new QueryWrapper<ZtRelease>().lambda()
|
||||||
|
.eq(ZtRelease::getStatus,"released")
|
||||||
|
.in(ZtRelease::getProject, projectList.stream().map(o -> o.getProject()).collect(Collectors.toList())));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1090,6 +1386,7 @@ public class IZtCountService {
|
|||||||
if(!CollectionUtils.isEmpty(releases)){
|
if(!CollectionUtils.isEmpty(releases)){
|
||||||
long relaese= this.releaseDetailsService.count(new QueryWrapper<ZtReleaseDetails>().lambda()
|
long relaese= this.releaseDetailsService.count(new QueryWrapper<ZtReleaseDetails>().lambda()
|
||||||
.in(ZtReleaseDetails::getReleaseId, releases.stream().map(o -> o.getId()).collect(Collectors.toList()))
|
.in(ZtReleaseDetails::getReleaseId, releases.stream().map(o -> o.getId()).collect(Collectors.toList()))
|
||||||
|
.ne(ZtReleaseDetails::getStatus,"closed")
|
||||||
.eq(ZtReleaseDetails::getObjectType, "story"));
|
.eq(ZtReleaseDetails::getObjectType, "story"));
|
||||||
objMap.put("online",relaese);
|
objMap.put("online",relaese);
|
||||||
}else{
|
}else{
|
||||||
@ -1234,5 +1531,118 @@ public class IZtCountService {
|
|||||||
return cronDevopsService.pageList(dto).getList();
|
return cronDevopsService.pageList(dto).getList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generatorDevlopExcel(String name,PerformanceDTO performanceDTO,Date d){
|
||||||
|
try (FileInputStream templateFile =new FileInputStream("scope开发.xlsx")) {
|
||||||
|
Map<String, String> dataMap = new HashMap<>();
|
||||||
|
dataMap.put("name", name);
|
||||||
|
dataMap.put("date", DateUtils.formatDate(new Date(),"yyyy-MM"));
|
||||||
|
dataMap.put("准时率得分", performanceDTO.getPunctualityScore().toString());
|
||||||
|
dataMap.put("代码质量", "10");
|
||||||
|
dataMap.put("文档质量", "10");
|
||||||
|
dataMap.put("饱和度得分", performanceDTO.getSaturationScore().toString());
|
||||||
|
dataMap.put("线上bug得分", performanceDTO.getBugScore().toString());
|
||||||
|
dataMap.put("工作态度", "5");
|
||||||
|
dataMap.put("创新贡献", "0");
|
||||||
|
dataMap.put("总分", devlopTotal(
|
||||||
|
dataMap.get("准时率得分"),
|
||||||
|
dataMap.get("线上bug得分"),
|
||||||
|
dataMap.get("代码质量"),
|
||||||
|
dataMap.get("文档质量"),
|
||||||
|
dataMap.get("饱和度得分"),
|
||||||
|
dataMap.get("工作态度")
|
||||||
|
));
|
||||||
|
//测试方案
|
||||||
|
// 读取模板
|
||||||
|
|
||||||
|
Workbook workbook = WorkbookFactory.create(templateFile);
|
||||||
|
workbook.setSheetName(0,name);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
// 替换占位符
|
||||||
|
for (Row row : sheet) {
|
||||||
|
for (Cell cell : row) {
|
||||||
|
if (cell.getCellType() == CellType.STRING) {
|
||||||
|
String cellValue = cell.getStringCellValue();
|
||||||
|
for (Map.Entry<String, String> entry : dataMap.entrySet()) {
|
||||||
|
cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
|
||||||
|
}
|
||||||
|
cell.setCellValue(cellValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成新文件
|
||||||
|
try (FileOutputStream outputStream = new FileOutputStream(name+"开发.xlsx")) {
|
||||||
|
workbook.write(outputStream);
|
||||||
|
}
|
||||||
|
workbook.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String devlopTotal(String ...args){
|
||||||
|
int i =0;
|
||||||
|
for (String s:args) {
|
||||||
|
try {
|
||||||
|
i+=new BigDecimal(s).intValue();
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error("",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return i+"";
|
||||||
|
}
|
||||||
|
void generatorTestExcel(String name,PerformanceDTO performanceDTO,Date d){
|
||||||
|
try (FileInputStream templateFile =new FileInputStream("scope测试.xlsx")) {
|
||||||
|
Map<String, String> dataMap = new HashMap<>();
|
||||||
|
dataMap.put("name", name);
|
||||||
|
dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
|
||||||
|
dataMap.put("准时率得分",performanceDTO.getPunctualityScore().toString());
|
||||||
|
dataMap.put("测试方案", "20");
|
||||||
|
dataMap.put("缺陷管理", "10");
|
||||||
|
|
||||||
|
dataMap.put("线上bug得分", performanceDTO.getBugScore().toString());
|
||||||
|
dataMap.put("测试报告编写", "10");
|
||||||
|
dataMap.put("测试技能", "5");
|
||||||
|
dataMap.put("态度", "5");
|
||||||
|
dataMap.put("创新贡献", "0");
|
||||||
|
dataMap.put("总分", devlopTotal(dataMap.get("准时率得分")
|
||||||
|
,dataMap.get("缺陷管理")
|
||||||
|
,dataMap.get("线上bug得分")
|
||||||
|
,dataMap.get("线上bug得分")
|
||||||
|
,dataMap.get("测试技能")
|
||||||
|
,dataMap.get("态度")
|
||||||
|
,dataMap.get("创新贡献") ));
|
||||||
|
//测试方案
|
||||||
|
// 读取模板
|
||||||
|
|
||||||
|
Workbook workbook = WorkbookFactory.create(templateFile);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
workbook.setSheetName(0,name);
|
||||||
|
// 替换占位符
|
||||||
|
for (Row row : sheet) {
|
||||||
|
for (Cell cell : row) {
|
||||||
|
if (cell.getCellType() == CellType.STRING) {
|
||||||
|
String cellValue = cell.getStringCellValue();
|
||||||
|
for (Map.Entry<String, String> entry : dataMap.entrySet()) {
|
||||||
|
cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
|
||||||
|
}
|
||||||
|
cell.setCellValue(cellValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成新文件
|
||||||
|
try (FileOutputStream outputStream = new FileOutputStream(name+"测试.xlsx")) {
|
||||||
|
workbook.write(outputStream);
|
||||||
|
}
|
||||||
|
workbook.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -224,10 +224,28 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void assignedTo(ZtBugQo qo) {
|
public void assignedTo(ZtBugQo qo) {
|
||||||
|
|
||||||
|
LoginRiskUser loginRiskUser = RiskUserThreadLocal.get();
|
||||||
|
if(loginRiskUser==null){
|
||||||
|
throw new BusinessException("未查询到数据");
|
||||||
|
}
|
||||||
ZtBug ztBug = this.baseMapper.selectById(qo.getId());
|
ZtBug ztBug = this.baseMapper.selectById(qo.getId());
|
||||||
|
|
||||||
|
if(!ztBug.getOpenedby().equals(loginRiskUser.getName())){
|
||||||
|
if(!ztBug.getAssignedTo().equals(loginRiskUser.getName())){
|
||||||
|
if(loginRiskUser.getUserType()!=UserType.XMGLY||loginRiskUser.getUserType()!=UserType.GSGC){
|
||||||
|
throw new BusinessException("当前无法指派请联系管理员");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(ztBug==null){
|
if(ztBug==null){
|
||||||
throw new BusinessException("未查询到");
|
throw new BusinessException("未查询到");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ztBug.setAssignedTo(qo.getAssignedTo());
|
ztBug.setAssignedTo(qo.getAssignedTo());
|
||||||
ztBug.setLasteditedby(RiskUserThreadLocal.get().getName());
|
ztBug.setLasteditedby(RiskUserThreadLocal.get().getName());
|
||||||
ztBug.setLastediteddate(new Date());
|
ztBug.setLastediteddate(new Date());
|
||||||
|
@ -205,6 +205,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl<ZtMeetingMapper, ZtMeeting
|
|||||||
|
|
||||||
String pfdStr="<h1 style=\"line-height: 70px;font-size: 41px\">{meetType}记录 {titleDate} </h1>\n" +
|
String pfdStr="<h1 style=\"line-height: 70px;font-size: 41px\">{meetType}记录 {titleDate} </h1>\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
|
"<div style=\"line-height: 50px;font-family: 宋体;\">会议名称: {name} </div>\n" +
|
||||||
"<div style=\"line-height: 50px;font-family: 宋体;\">会议时间: {meetingDate} </div>\n" +
|
"<div style=\"line-height: 50px;font-family: 宋体;\">会议时间: {meetingDate} </div>\n" +
|
||||||
"<div style=\"line-height: 50px;font-family: 宋体\">会议地点: {address} </div>\n" +
|
"<div style=\"line-height: 50px;font-family: 宋体\">会议地点: {address} </div>\n" +
|
||||||
"<div style=\"line-height: 50px;font-family: 宋体\">参会人员: {usersName} </div>\n" +
|
"<div style=\"line-height: 50px;font-family: 宋体\">参会人员: {usersName} </div>\n" +
|
||||||
@ -214,14 +215,14 @@ public class ZtMeetingServiceImpl extends ServiceImpl<ZtMeetingMapper, ZtMeeting
|
|||||||
|
|
||||||
// 替换内容集合
|
// 替换内容集合
|
||||||
Map<String, String> textMap = new LinkedHashMap<>();
|
Map<String, String> textMap = new LinkedHashMap<>();
|
||||||
textMap.put("titleDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY-MM-DD"));
|
textMap.put("titleDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd"));
|
||||||
|
textMap.put("name", ztMeeting.getName());
|
||||||
|
|
||||||
pfdStr=pfdStr.replace("{meetType}",ztMeeting.getType().getValue());
|
pfdStr=pfdStr.replace("{meetType}",ztMeeting.getType().getValue());
|
||||||
pfdStr=pfdStr.replace("{titleDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY-MM-DD "));
|
pfdStr=pfdStr.replace("{titleDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd "));
|
||||||
|
|
||||||
textMap.put("meetingDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY/MM/DD"));
|
textMap.put("meetingDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy/MM/dd"));
|
||||||
pfdStr= pfdStr.replace("{meetingDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY/MM/DD HH:mm"));
|
pfdStr= pfdStr.replace("{meetingDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy/MM/dd HH:mm"));
|
||||||
textMap.put("address",ztMeeting.getAddress());
|
textMap.put("address",ztMeeting.getAddress());
|
||||||
pfdStr= pfdStr.replace("{address}",ztMeeting.getAddress());
|
pfdStr= pfdStr.replace("{address}",ztMeeting.getAddress());
|
||||||
StringBuilder b=new StringBuilder();
|
StringBuilder b=new StringBuilder();
|
||||||
@ -252,6 +253,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl<ZtMeetingMapper, ZtMeeting
|
|||||||
// textMap.put("remark", ztMeeting.getRemark());
|
// textMap.put("remark", ztMeeting.getRemark());
|
||||||
}
|
}
|
||||||
pfdStr= pfdStr.replace("{remark}",ztMeeting.getRemark());
|
pfdStr= pfdStr.replace("{remark}",ztMeeting.getRemark());
|
||||||
|
pfdStr= pfdStr.replace("{name}",ztMeeting.getName());
|
||||||
// 调用工具类,registerTemplatePath 模板路径,textMap 文字内容
|
// 调用工具类,registerTemplatePath 模板路径,textMap 文字内容
|
||||||
// 调用工具类,registerTemplatePath 模板路径,textMap 文字内容
|
// 调用工具类,registerTemplatePath 模板路径,textMap 文字内容
|
||||||
try {
|
try {
|
||||||
|
@ -210,9 +210,14 @@ public class ZtProductServiceImpl extends ServiceImpl<ZtProductMapper, ZtProduct
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ZtProductDTO> productList(ZtProjectQo qo) {
|
public List<ZtProductDTO> productList(ZtProjectQo qo) {
|
||||||
|
List<Integer> pIds = this.ztProjectService.authProductList();
|
||||||
|
if(CollectionUtils.isEmpty(pIds)){
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
List<ZtProduct> ztProducts = this.baseMapper.selectList(new QueryWrapper<ZtProduct>()
|
List<ZtProduct> ztProducts = this.baseMapper.selectList(new QueryWrapper<ZtProduct>()
|
||||||
.lambda().eq(ZtProduct::getDeleted,"0")
|
.lambda().eq(ZtProduct::getDeleted,"0")
|
||||||
.notIn(ZtProduct::getStatus, Arrays.asList("closed"))
|
.notIn(ZtProduct::getStatus, Arrays.asList("closed")).in(ZtProduct::getId,pIds)
|
||||||
);
|
);
|
||||||
if(CollectionUtils.isEmpty(ztProducts)){
|
if(CollectionUtils.isEmpty(ztProducts)){
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -63,6 +63,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
|
|||||||
private IZtStoryService storyService;
|
private IZtStoryService storyService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional
|
||||||
public void addRelease(ZtReleaseDTO dto) {
|
public void addRelease(ZtReleaseDTO dto) {
|
||||||
Integer project = dto.getProject();
|
Integer project = dto.getProject();
|
||||||
|
|
||||||
@ -101,6 +102,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
|
|||||||
.eq(ZtStory::getStage, StoryStageEnums.tested.getValue()));
|
.eq(ZtStory::getStage, StoryStageEnums.tested.getValue()));
|
||||||
if(!CollectionUtils.isEmpty(sList)){
|
if(!CollectionUtils.isEmpty(sList)){
|
||||||
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
|
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
|
||||||
|
.ne(ZtReleaseDetails::getStatus,"closed")
|
||||||
.in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList())));
|
.in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList())));
|
||||||
List<Integer> sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList());
|
List<Integer> sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList());
|
||||||
|
|
||||||
@ -116,7 +118,12 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
|
|||||||
saveBatch.add(e);
|
saveBatch.add(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(CollectionUtils.isEmpty(saveBatch)){
|
||||||
|
throw new BusinessException("当前没有符合发布的需求,请检查");
|
||||||
|
}
|
||||||
releaseDetailsService.saveBatch(saveBatch);
|
releaseDetailsService.saveBatch(saveBatch);
|
||||||
|
}else{
|
||||||
|
throw new BusinessException("当前没有符合发布的需求,请检查");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +316,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
|
|||||||
notice.setFlag(0);
|
notice.setFlag(0);
|
||||||
noticeService.save(notice);
|
noticeService.save(notice);
|
||||||
}
|
}
|
||||||
List<ZtReleaseDetails> details = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()).eq(ZtReleaseDetails::getObjectType, "story"));
|
List<ZtReleaseDetails> details = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()).ne(ZtReleaseDetails::getStatus,"closed").eq(ZtReleaseDetails::getObjectType, "story"));
|
||||||
|
|
||||||
List<Integer> storyList=new ArrayList<Integer>();
|
List<Integer> storyList=new ArrayList<Integer>();
|
||||||
for (ZtReleaseDetails d:details ) {
|
for (ZtReleaseDetails d:details ) {
|
||||||
|
@ -112,7 +112,8 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
|
|||||||
if(loginRiskUser!=null){
|
if(loginRiskUser!=null){
|
||||||
name=loginRiskUser.getName();
|
name=loginRiskUser.getName();
|
||||||
}
|
}
|
||||||
ZtUser user= this.userService.getbyVxId(dto.getVx());
|
ZtUser user= this.userService.getbyVxId(org.apache.commons.lang3.StringUtils.isEmpty(dto.getVx())?
|
||||||
|
dto.getWeixin():dto.getVx());
|
||||||
if(user!=null){
|
if(user!=null){
|
||||||
name=user.getAccount();
|
name=user.getAccount();
|
||||||
}
|
}
|
||||||
|
@ -399,11 +399,11 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
|
|
||||||
BeanUtils.copyProperties(dto, ztStory,"stage");
|
BeanUtils.copyProperties(dto, ztStory,"stage");
|
||||||
if("draft".equalsIgnoreCase(ztStory.getStatus())){
|
if("draft".equalsIgnoreCase(ztStory.getStatus())){
|
||||||
ztStory.setStatus("reviewing");
|
ztStory.setStatus("active");
|
||||||
if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) {
|
if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) {
|
||||||
ZtProduct product = productService.getById(ztStory.getProduct());
|
ZtProduct product = productService.getById(ztStory.getProduct());
|
||||||
product.setDraftStories(product.getDraftStories() - 1);
|
product.setDraftStories(product.getDraftStories() - 1);
|
||||||
product.setReviewingStories(product.getReviewingStories() + 1);
|
product.setActiveStories(product.getReviewingStories() + 1);
|
||||||
this.productService.updateById(product);
|
this.productService.updateById(product);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -423,7 +423,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
spec.setSpec(dto.getSpec());
|
spec.setSpec(dto.getSpec());
|
||||||
spec.setVerify(dto.getVerify());
|
spec.setVerify(dto.getVerify());
|
||||||
spec.setFiles(dto.getFileUrl());
|
spec.setFiles(dto.getFileUrl());
|
||||||
storyspecService.update(new UpdateWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory,id).set(ZtStoryspec::getFiles,dto.getFileUrl())
|
storyspecService.update(new UpdateWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory,id)
|
||||||
|
.set(ZtStoryspec::getSpec,dto.getSpec())
|
||||||
|
.set(ZtStoryspec::getVerify,dto.getVerify())
|
||||||
|
.set(ZtStoryspec::getFiles,dto.getFileUrl())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,6 +782,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
}
|
}
|
||||||
LambdaQueryWrapper<ZtStory> lambda = new QueryWrapper<ZtStory>().lambda();
|
LambdaQueryWrapper<ZtStory> lambda = new QueryWrapper<ZtStory>().lambda();
|
||||||
lambda.eq(ZtStory::getStatus, "active");
|
lambda.eq(ZtStory::getStatus, "active");
|
||||||
|
lambda.notIn(ZtStory::getStage,"released","verified");
|
||||||
lambda.in(ZtStory::getId,resultIds);
|
lambda.in(ZtStory::getId,resultIds);
|
||||||
List<ZtStory> ztStories = this.baseMapper.selectList(lambda);
|
List<ZtStory> ztStories = this.baseMapper.selectList(lambda);
|
||||||
if (CollectionUtils.isEmpty(ztStories)) {
|
if (CollectionUtils.isEmpty(ztStories)) {
|
||||||
@ -917,6 +921,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
ztStory.setStage("developed");
|
ztStory.setStage("developed");
|
||||||
|
if(ztStory.getStartDate()==null){
|
||||||
|
ztStory.setStartDate(new Date());
|
||||||
|
}
|
||||||
this.baseMapper.updateById(ztStory);
|
this.baseMapper.updateById(ztStory);
|
||||||
List<Integer> executionId = this.getExecutionId(ztStory);
|
List<Integer> executionId = this.getExecutionId(ztStory);
|
||||||
for (Integer execution:executionId ) {
|
for (Integer execution:executionId ) {
|
||||||
@ -974,6 +981,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
actionService.addAction(ActionType.XQ, ActionStatus.CSWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
|
actionService.addAction(ActionType.XQ, ActionStatus.CSWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
|
||||||
RiskUserThreadLocal.get().getName(), null, "");
|
RiskUserThreadLocal.get().getName(), null, "");
|
||||||
}
|
}
|
||||||
|
if(ztStory.getStartDate()==null){
|
||||||
|
ztStory.setStartDate(new Date());
|
||||||
|
}
|
||||||
|
ztStory.setEndDate(new Date());
|
||||||
this.baseMapper.updateById(ztStory);
|
this.baseMapper.updateById(ztStory);
|
||||||
|
|
||||||
for (Integer execId : execIds) {
|
for (Integer execId : execIds) {
|
||||||
@ -1037,6 +1048,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
String newStatus ="released";
|
String newStatus ="released";
|
||||||
|
|
||||||
ztStory.setStage(newStatus);
|
ztStory.setStage(newStatus);
|
||||||
|
if(ztStory.getEndDate()==null){
|
||||||
|
ztStory.setEndDate(new Date());
|
||||||
|
}
|
||||||
this.baseMapper.updateById(ztStory);
|
this.baseMapper.updateById(ztStory);
|
||||||
|
|
||||||
for (Integer execId : execIds) {
|
for (Integer execId : execIds) {
|
||||||
@ -1095,6 +1109,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
actionService.addAction(ActionType.XQ, ActionStatus.KSCE, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
|
actionService.addAction(ActionType.XQ, ActionStatus.KSCE, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
|
||||||
RiskUserThreadLocal.get().getName(), null, "");
|
RiskUserThreadLocal.get().getName(), null, "");
|
||||||
}
|
}
|
||||||
|
if(ztStory.getStartDate()==null){
|
||||||
|
ztStory.setStartDate(new Date());
|
||||||
|
}
|
||||||
this.baseMapper.updateById(ztStory);
|
this.baseMapper.updateById(ztStory);
|
||||||
|
|
||||||
for (Integer execId : execIds) {
|
for (Integer execId : execIds) {
|
||||||
@ -1604,9 +1621,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
List<String> userIds = new ArrayList<>();
|
|
||||||
userIds.add(ztStory.getAssignedTo());
|
|
||||||
userIds.add(ztStory.getOpenedby());
|
|
||||||
|
|
||||||
Map<String, ZtUser> userMap = this.userService.userMapByIds(null);
|
Map<String, ZtUser> userMap = this.userService.userMapByIds(null);
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|||||||
import com.github.pagehelper.Page;
|
import com.github.pagehelper.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.sa.zentao.conf.LoginRiskUser;
|
||||||
import com.sa.zentao.conf.RiskUserThreadLocal;
|
import com.sa.zentao.conf.RiskUserThreadLocal;
|
||||||
import com.sa.zentao.dao.*;
|
import com.sa.zentao.dao.*;
|
||||||
import com.sa.zentao.entity.*;
|
import com.sa.zentao.entity.*;
|
||||||
@ -427,6 +428,24 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List myWaitYsStory(ZtStoryDTO dto) {
|
||||||
|
LoginRiskUser loginRiskUser = RiskUserThreadLocal.get();
|
||||||
|
if(loginRiskUser==null||dto.getProductId()==null){
|
||||||
|
throw new BusinessException("请检查");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ZtStory> released = this.storyService.list(new QueryWrapper<ZtStory>().lambda()
|
||||||
|
.eq(ZtStory::getProduct, dto.getProductId())
|
||||||
|
.eq(ZtStory::getYsUser, loginRiskUser.getName())
|
||||||
|
.eq(ZtStory::getStage, "released")
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return released;
|
||||||
|
}
|
||||||
|
|
||||||
private Map<Integer, List<ZtStory>> getStoryUserMap(List<ZtStoryUserDTO> list) {
|
private Map<Integer, List<ZtStory>> getStoryUserMap(List<ZtStoryUserDTO> list) {
|
||||||
List<Integer> ids = list.stream().map(o -> o.getId()).collect(Collectors.toList());
|
List<Integer> ids = list.stream().map(o -> o.getId()).collect(Collectors.toList());
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|||||||
import com.github.pagehelper.Page;
|
import com.github.pagehelper.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.sa.zentao.dao.BusinessException;
|
import com.sa.zentao.dao.*;
|
||||||
import com.sa.zentao.dao.ZtProjectDTO;
|
|
||||||
import com.sa.zentao.dao.ZtStoryDTO;
|
|
||||||
import com.sa.zentao.dao.ZtUserDTO;
|
|
||||||
import com.sa.zentao.entity.VerificationCode;
|
import com.sa.zentao.entity.VerificationCode;
|
||||||
import com.sa.zentao.entity.ZtProduct;
|
import com.sa.zentao.entity.ZtProduct;
|
||||||
import com.sa.zentao.entity.ZtProject;
|
import com.sa.zentao.entity.ZtProject;
|
||||||
@ -18,6 +15,7 @@ import com.sa.zentao.qo.ZtUserQo;
|
|||||||
import com.sa.zentao.service.*;
|
import com.sa.zentao.service.*;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.sa.zentao.utils.BeanCopyUtil;
|
import com.sa.zentao.utils.BeanCopyUtil;
|
||||||
|
import com.sa.zentao.utils.CryptoUtils;
|
||||||
import com.tencentcloudapi.common.Credential;
|
import com.tencentcloudapi.common.Credential;
|
||||||
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
||||||
import com.tencentcloudapi.sms.v20190711.SmsClient;
|
import com.tencentcloudapi.sms.v20190711.SmsClient;
|
||||||
@ -74,6 +72,10 @@ public class ZtUserServiceImpl extends ServiceImpl<ZtUserMapper, ZtUser> impleme
|
|||||||
PageInfo<ZtUserDTO> ztUserDTOPageInfo = new PageInfo<>(ztUserDTOS);
|
PageInfo<ZtUserDTO> ztUserDTOPageInfo = new PageInfo<>(ztUserDTOS);
|
||||||
ztUserDTOPageInfo.setTotal(page.getTotal());
|
ztUserDTOPageInfo.setTotal(page.getTotal());
|
||||||
for (ZtUserDTO dto:ztUserDTOS) {
|
for (ZtUserDTO dto:ztUserDTOS) {
|
||||||
|
if(!StringUtils.isEmpty(dto.getVx())){
|
||||||
|
dto.setVx(CryptoUtils.aesDecryptForFront(dto.getVx(), CryptoUtils.KEY_DES));
|
||||||
|
}
|
||||||
|
|
||||||
if(dto.getUserType()!=null){
|
if(dto.getUserType()!=null){
|
||||||
dto.setUserTypeValue(dto.getUserType().getValue());
|
dto.setUserTypeValue(dto.getUserType().getValue());
|
||||||
}
|
}
|
||||||
@ -133,6 +135,20 @@ public class ZtUserServiceImpl extends ServiceImpl<ZtUserMapper, ZtUser> impleme
|
|||||||
return ztUsers.stream().collect(Collectors.toMap(ZtUser::getAccount,o->o));
|
return ztUsers.stream().collect(Collectors.toMap(ZtUser::getAccount,o->o));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public Map<String, ZtUser> userMapByIdsOrderByType(List<String> accounts) {
|
||||||
|
List<ZtUser> ztUsers =null;
|
||||||
|
if(CollectionUtils.isEmpty(accounts)){
|
||||||
|
ztUsers = this.baseMapper.selectList(new QueryWrapper<ZtUser>().lambda().orderByDesc(ZtUser::getUserType));
|
||||||
|
}else{
|
||||||
|
ztUsers = this.baseMapper.selectList(new QueryWrapper<ZtUser>().lambda().in(ZtUser::getAccount, accounts).orderByDesc(ZtUser::getUserType));
|
||||||
|
}
|
||||||
|
if(CollectionUtils.isEmpty(ztUsers)){
|
||||||
|
return new HashMap<>();
|
||||||
|
}else{
|
||||||
|
return ztUsers.stream().collect(Collectors.toMap(ZtUser::getAccount,o->o));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -210,13 +226,19 @@ public class ZtUserServiceImpl extends ServiceImpl<ZtUserMapper, ZtUser> impleme
|
|||||||
if(StringUtils.isEmpty(vx)){
|
if(StringUtils.isEmpty(vx)){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<ZtUser> ztUsers = this.baseMapper.selectList(new QueryWrapper<ZtUser>().lambda().eq(ZtUser::getVx, vx));
|
List<ZtUser> ztUsers = this.baseMapper.selectList(new QueryWrapper<ZtUser>().lambda().eq(ZtUser::getVx, CryptoUtils.aesEncryptForFront(vx,CryptoUtils.KEY_DES)));
|
||||||
if(CollectionUtils.isEmpty(ztUsers)){
|
if(CollectionUtils.isEmpty(ztUsers)){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return ztUsers.get(0);
|
return ztUsers.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DkInfo> dkList(List<String> account, Date startDate, Date endDate) {
|
||||||
|
|
||||||
|
return this.baseMapper.dkList(account,startDate,endDate);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean sendSms(String phoneNumber, String verificationCode) {
|
public boolean sendSms(String phoneNumber, String verificationCode) {
|
||||||
try {
|
try {
|
||||||
// 初始化腾讯云短信服务客户端
|
// 初始化腾讯云短信服务客户端
|
||||||
|
130
src/main/java/com/sa/zentao/utils/CryptoUtils.java
Normal file
130
src/main/java/com/sa/zentao/utils/CryptoUtils.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
package com.sa.zentao.utils;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public class CryptoUtils {
|
||||||
|
|
||||||
|
//这个密钥需要是16位
|
||||||
|
public static final String KEY_DES = "aaaaaaaabbbbbbbb";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
String old = "12345678";
|
||||||
|
String target ="hy+A8P/oEYPdOpwfRVpgwg=="; // 加密后的字符串
|
||||||
|
|
||||||
|
//解密
|
||||||
|
System.out.println(CryptoUtils.aesDecryptForFront(target, CryptoUtils.KEY_DES));
|
||||||
|
|
||||||
|
//加密
|
||||||
|
System.out.println(CryptoUtils.aesEncryptForFront(old, CryptoUtils.KEY_DES));
|
||||||
|
|
||||||
|
File file = new File("C:\\111.txt");
|
||||||
|
// 以 byte 的形式读取,不改变文件数据的编码格式
|
||||||
|
byte[] bytes = Files.readAllBytes(file.toPath());
|
||||||
|
|
||||||
|
byte[] outFile = CryptoUtils.aesEncryptForFront(bytes, CryptoUtils.KEY_DES);
|
||||||
|
OutputStream out = new BufferedOutputStream(new FileOutputStream("C:\\model1.zm"));
|
||||||
|
out.write(outFile);
|
||||||
|
|
||||||
|
// // 这里生成加密后的文件后缀可以自定义
|
||||||
|
// File file = new File("C:\\\\model.zm");
|
||||||
|
// // 以 byte 的形式读取,不改变文件数据的编码格式
|
||||||
|
// byte[] bytes = Files.readAllBytes(file.toPath());
|
||||||
|
// byte[] outFile = CryptoUtils.aesDecryptForFront(bytes, CryptoUtils.KEY_DES);
|
||||||
|
// OutputStream out = new BufferedOutputStream(new FileOutputStream("C:\\model2.glb"));
|
||||||
|
// out.write(outFile);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AES解密
|
||||||
|
* @param encryptStr 密文
|
||||||
|
* @param decryptKey 秘钥,必须为16个字符组成
|
||||||
|
* @return 明文
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String aesDecryptForFront(String encryptStr, String decryptKey) {
|
||||||
|
if (StringUtils.isEmpty(encryptStr) || StringUtils.isEmpty(decryptKey)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
byte[] encryptByte = Base64.getDecoder().decode(encryptStr);
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
|
||||||
|
byte[] decryptBytes = cipher.doFinal(encryptByte);
|
||||||
|
return new String(decryptBytes);
|
||||||
|
|
||||||
|
} catch (Exception var3) {
|
||||||
|
var3.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// AES解密文件
|
||||||
|
public static byte[] aesDecryptForFront(byte[] bytes, String decryptKey) {
|
||||||
|
if (StringUtils.isEmpty(bytes) || StringUtils.isEmpty(decryptKey)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
|
||||||
|
return cipher.doFinal(bytes);
|
||||||
|
|
||||||
|
} catch (Exception var3) {
|
||||||
|
var3.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* AES加密文本
|
||||||
|
* @param content 明文
|
||||||
|
* @param encryptKey 秘钥,必须为16个字符组成
|
||||||
|
* @return 密文
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String aesEncryptForFront(String content, String encryptKey) {
|
||||||
|
if (StringUtils.isEmpty(content) || StringUtils.isEmpty(encryptKey)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
|
||||||
|
|
||||||
|
byte[] encryptStr = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
|
||||||
|
return Base64.getEncoder().encodeToString(encryptStr);
|
||||||
|
|
||||||
|
} catch (Exception var3) {
|
||||||
|
var3.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// AES加密文件
|
||||||
|
public static byte[] aesEncryptForFront(byte[] bytes, String encryptKey) {
|
||||||
|
if (StringUtils.isEmpty(bytes) || StringUtils.isEmpty(encryptKey)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
|
||||||
|
|
||||||
|
byte[] encryptStr = cipher.doFinal(bytes);
|
||||||
|
return encryptStr;
|
||||||
|
|
||||||
|
} catch (Exception var3) {
|
||||||
|
var3.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -114,7 +114,8 @@ public class DateUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String formatDate(Date smdate) {
|
public static String formatDate(Date smdate) {
|
||||||
return smdate == null ? null : sdf.format(smdate);
|
//todo s Index 14 out of bounds for length 13
|
||||||
|
return smdate == null ? "" : sdf.format(smdate);
|
||||||
}
|
}
|
||||||
public static Date parseDate(String smdate, String f) {
|
public static Date parseDate(String smdate, String f) {
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat(f);
|
SimpleDateFormat sdf = new SimpleDateFormat(f);
|
||||||
|
182
src/main/java/com/sa/zentao/utils/ExcelUtil.java
Normal file
182
src/main/java/com/sa/zentao/utils/ExcelUtil.java
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
package com.sa.zentao.utils;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.poi.ss.usermodel.CellType;
|
||||||
|
import org.apache.poi.ss.usermodel.DateUtil;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xssf.usermodel.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description: 多个Excel合并Sheet
|
||||||
|
* @author: wyj
|
||||||
|
* @time: 2020/9/18 15:28
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class ExcelUtil {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String currentDir = System.getProperty("user.dir");
|
||||||
|
System.out.println("Current Directory: " + currentDir);
|
||||||
|
List<String> list = Arrays.asList(
|
||||||
|
new File("scope测试.xlsx").toString(),
|
||||||
|
new File("scope开发.xlsx").toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
mergexcel(list,"杨洪-家庭贷-20190908(报告).xlsx", System.getProperty("user.dir")+"\\");
|
||||||
|
System.out.println("OJBK");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 合并多个ExcelSheet
|
||||||
|
*
|
||||||
|
* @param files 文件字符串(file.toString)集合,按顺序进行合并,合并的Excel中Sheet名称不可重复
|
||||||
|
* @param excelName 合并后Excel名称(包含后缀.xslx)
|
||||||
|
* @param dirPath 存储目录
|
||||||
|
* @return
|
||||||
|
* @Date: 2020/9/18 15:31
|
||||||
|
*/
|
||||||
|
public static void mergexcel(List<String> files, String excelName, String dirPath) {
|
||||||
|
XSSFWorkbook newExcelCreat = new XSSFWorkbook();
|
||||||
|
// 遍历每个源excel文件,TmpList为源文件的名称集合
|
||||||
|
for (String fromExcelName : files) {
|
||||||
|
try (InputStream in = new FileInputStream(fromExcelName)) {
|
||||||
|
XSSFWorkbook fromExcel = new XSSFWorkbook(in);
|
||||||
|
int length = fromExcel.getNumberOfSheets();
|
||||||
|
if (length <= 1) { //长度为1时
|
||||||
|
XSSFSheet oldSheet = fromExcel.getSheetAt(0);
|
||||||
|
// XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName());
|
||||||
|
XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName());
|
||||||
|
copySheet(newExcelCreat, oldSheet, newSheet);
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < length; i++) {// 遍历每个sheet
|
||||||
|
XSSFSheet oldSheet = fromExcel.getSheetAt(i);
|
||||||
|
XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName());
|
||||||
|
copySheet(newExcelCreat, oldSheet, newSheet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 定义新生成的xlxs表格文件
|
||||||
|
String allFileName = dirPath + File.separator + excelName;
|
||||||
|
try (FileOutputStream fileOut = new FileOutputStream(allFileName)) {
|
||||||
|
newExcelCreat.write(fileOut);
|
||||||
|
fileOut.flush();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
newExcelCreat.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并单元格
|
||||||
|
*
|
||||||
|
* @param fromSheet
|
||||||
|
* @param toSheet
|
||||||
|
*/
|
||||||
|
private static void mergeSheetAllRegion(XSSFSheet fromSheet, XSSFSheet toSheet) {
|
||||||
|
int num = fromSheet.getNumMergedRegions();
|
||||||
|
CellRangeAddress cellR = null;
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
cellR = fromSheet.getMergedRegion(i);
|
||||||
|
toSheet.addMergedRegion(cellR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制单元格
|
||||||
|
*
|
||||||
|
* @param wb
|
||||||
|
* @param fromCell
|
||||||
|
* @param toCell
|
||||||
|
*/
|
||||||
|
private static void copyCell(XSSFWorkbook wb, XSSFCell fromCell, XSSFCell toCell) {
|
||||||
|
XSSFCellStyle newstyle = wb.createCellStyle();
|
||||||
|
// 复制单元格样式
|
||||||
|
try {
|
||||||
|
newstyle.cloneStyleFrom(fromCell.getCellStyle());
|
||||||
|
}catch (Exception e){
|
||||||
|
System.out.print(""+e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 样式
|
||||||
|
toCell.setCellStyle(newstyle);
|
||||||
|
if (fromCell.getCellComment() != null) {
|
||||||
|
toCell.setCellComment(fromCell.getCellComment());
|
||||||
|
}
|
||||||
|
// 不同数据类型处理
|
||||||
|
CellType fromCellType = fromCell.getCellType();
|
||||||
|
toCell.setCellType(fromCellType);
|
||||||
|
if (fromCellType == CellType.NUMERIC) {
|
||||||
|
if (DateUtil.isCellDateFormatted(fromCell)) {
|
||||||
|
toCell.setCellValue(fromCell.getDateCellValue());
|
||||||
|
} else {
|
||||||
|
toCell.setCellValue(fromCell.getNumericCellValue());
|
||||||
|
}
|
||||||
|
} else if (fromCellType == CellType.STRING) {
|
||||||
|
toCell.setCellValue(fromCell.getRichStringCellValue());
|
||||||
|
} else if (fromCellType == CellType.BLANK) {
|
||||||
|
// nothing21
|
||||||
|
} else if (fromCellType == CellType.BOOLEAN) {
|
||||||
|
toCell.setCellValue(fromCell.getBooleanCellValue());
|
||||||
|
} else if (fromCellType == CellType.ERROR) {
|
||||||
|
toCell.setCellErrorValue(fromCell.getErrorCellValue());
|
||||||
|
} else if (fromCellType == CellType.FORMULA) {
|
||||||
|
toCell.setCellFormula(fromCell.getCellFormula());
|
||||||
|
} else {
|
||||||
|
// nothing29
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 行复制功能
|
||||||
|
*
|
||||||
|
* @param wb
|
||||||
|
* @param oldRow
|
||||||
|
* @param toRow
|
||||||
|
*/
|
||||||
|
private static void copyRow(XSSFWorkbook wb, XSSFRow oldRow, XSSFRow toRow) {
|
||||||
|
toRow.setHeight(oldRow.getHeight());
|
||||||
|
for (Iterator cellIt = oldRow.cellIterator(); cellIt.hasNext(); ) {
|
||||||
|
XSSFCell tmpCell = (XSSFCell) cellIt.next();
|
||||||
|
XSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex());
|
||||||
|
copyCell(wb, tmpCell, newCell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sheet复制
|
||||||
|
*
|
||||||
|
* @param wb
|
||||||
|
* @param fromSheet
|
||||||
|
* @param toSheet
|
||||||
|
*/
|
||||||
|
private static void copySheet(XSSFWorkbook wb, XSSFSheet fromSheet, XSSFSheet toSheet) {
|
||||||
|
mergeSheetAllRegion(fromSheet, toSheet);
|
||||||
|
// 设置列宽
|
||||||
|
int length =0;
|
||||||
|
try {
|
||||||
|
length = fromSheet.getRow(fromSheet.getFirstRowNum()).getLastCellNum();
|
||||||
|
}catch (Exception e){
|
||||||
|
length=10;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i <= length; i++) {
|
||||||
|
toSheet.setColumnWidth(i, fromSheet.getColumnWidth(i));
|
||||||
|
}
|
||||||
|
for (Iterator rowIt = fromSheet.rowIterator(); rowIt.hasNext(); ) {
|
||||||
|
XSSFRow oldRow = (XSSFRow) rowIt.next();
|
||||||
|
XSSFRow newRow = toSheet.createRow(oldRow.getRowNum());
|
||||||
|
copyRow(wb, oldRow, newRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,6 +17,12 @@
|
|||||||
SELECT * from zt_story_feedback s WHERE 1 = 1
|
SELECT * from zt_story_feedback s WHERE 1 = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<if test="qo.productId != null and qo.productId != ''">
|
||||||
|
and s.product = #{qo.productId}
|
||||||
|
</if>
|
||||||
|
|
||||||
<if test="qo.searchVal == 'ALL' ">
|
<if test="qo.searchVal == 'ALL' ">
|
||||||
|
|
||||||
</if>
|
</if>
|
||||||
|
@ -70,6 +70,7 @@
|
|||||||
where 1=1
|
where 1=1
|
||||||
and product = #{qo.productId}
|
and product = #{qo.productId}
|
||||||
|
|
||||||
|
|
||||||
<if test="qo.searchVal == 'ALL' ">
|
<if test="qo.searchVal == 'ALL' ">
|
||||||
|
|
||||||
</if>
|
</if>
|
||||||
|
@ -2,227 +2,223 @@
|
|||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.sa.zentao.mapper.ZtTaskMapper">
|
<mapper namespace="com.sa.zentao.mapper.ZtTaskMapper">
|
||||||
<resultMap id="BaseResultMap" type="com.sa.zentao.entity.ZtTask">
|
<resultMap id="BaseResultMap" type="com.sa.zentao.entity.ZtTask">
|
||||||
<result column="id" property="id" />
|
<result column="id" property="id"/>
|
||||||
<result column="project" property="project" />
|
<result column="project" property="project"/>
|
||||||
<result column="parent" property="parent" />
|
<result column="parent" property="parent"/>
|
||||||
<result column="execution" property="execution" />
|
<result column="execution" property="execution"/>
|
||||||
<result column="module" property="module" />
|
<result column="module" property="module"/>
|
||||||
<result column="design" property="design" />
|
<result column="design" property="design"/>
|
||||||
<result column="story" property="story" />
|
<result column="story" property="story"/>
|
||||||
<result column="storyVersion" property="storyversion" />
|
<result column="storyVersion" property="storyversion"/>
|
||||||
<result column="designVersion" property="designversion" />
|
<result column="designVersion" property="designversion"/>
|
||||||
<result column="fromBug" property="frombug" />
|
<result column="fromBug" property="frombug"/>
|
||||||
<result column="feedback" property="feedback" />
|
<result column="feedback" property="feedback"/>
|
||||||
<result column="fromIssue" property="fromissue" />
|
<result column="fromIssue" property="fromissue"/>
|
||||||
<result column="name" property="name" />
|
<result column="name" property="name"/>
|
||||||
<result column="type" property="type" />
|
<result column="type" property="type"/>
|
||||||
<result column="mode" property="mode" />
|
<result column="mode" property="mode"/>
|
||||||
<result column="pri" property="pri" />
|
<result column="pri" property="pri"/>
|
||||||
<result column="estimate" property="estimate" />
|
<result column="estimate" property="estimate"/>
|
||||||
<result column="consumed" property="consumed" />
|
<result column="consumed" property="consumed"/>
|
||||||
<result column="left" property="left" />
|
<result column="left" property="left"/>
|
||||||
<result column="deadline" property="deadline" />
|
<result column="deadline" property="deadline"/>
|
||||||
<result column="status" property="status" />
|
<result column="status" property="status"/>
|
||||||
<result column="subStatus" property="substatus" />
|
<result column="subStatus" property="substatus"/>
|
||||||
<result column="color" property="color" />
|
<result column="color" property="color"/>
|
||||||
<result column="mailto" property="mailto" />
|
<result column="mailto" property="mailto"/>
|
||||||
<result column="desc" property="desc" />
|
<result column="desc" property="desc"/>
|
||||||
<result column="version" property="version" />
|
<result column="version" property="version"/>
|
||||||
<result column="openedBy" property="openedby" />
|
<result column="openedBy" property="openedby"/>
|
||||||
<result column="openedDate" property="openeddate" />
|
<result column="openedDate" property="openeddate"/>
|
||||||
<result column="assignedTo" property="assignedto" />
|
<result column="assignedTo" property="assignedto"/>
|
||||||
<result column="assignedDate" property="assigneddate" />
|
<result column="assignedDate" property="assigneddate"/>
|
||||||
<result column="estStarted" property="eststarted" />
|
<result column="estStarted" property="eststarted"/>
|
||||||
<result column="realStarted" property="realstarted" />
|
<result column="realStarted" property="realstarted"/>
|
||||||
<result column="finishedBy" property="finishedby" />
|
<result column="finishedBy" property="finishedby"/>
|
||||||
<result column="finishedDate" property="finisheddate" />
|
<result column="finishedDate" property="finisheddate"/>
|
||||||
<result column="finishedList" property="finishedlist" />
|
<result column="finishedList" property="finishedlist"/>
|
||||||
<result column="canceledBy" property="canceledby" />
|
<result column="canceledBy" property="canceledby"/>
|
||||||
<result column="canceledDate" property="canceleddate" />
|
<result column="canceledDate" property="canceleddate"/>
|
||||||
<result column="closedBy" property="closedby" />
|
<result column="closedBy" property="closedby"/>
|
||||||
<result column="closedDate" property="closeddate" />
|
<result column="closedDate" property="closeddate"/>
|
||||||
<result column="planDuration" property="planduration" />
|
<result column="planDuration" property="planduration"/>
|
||||||
<result column="realDuration" property="realduration" />
|
<result column="realDuration" property="realduration"/>
|
||||||
<result column="closedReason" property="closedreason" />
|
<result column="closedReason" property="closedreason"/>
|
||||||
<result column="lastEditedBy" property="lasteditedby" />
|
<result column="lastEditedBy" property="lasteditedby"/>
|
||||||
<result column="lastEditedDate" property="lastediteddate" />
|
<result column="lastEditedDate" property="lastediteddate"/>
|
||||||
<result column="activatedDate" property="activateddate" />
|
<result column="activatedDate" property="activateddate"/>
|
||||||
<result column="order" property="order" />
|
<result column="order" property="order"/>
|
||||||
<result column="repo" property="repo" />
|
<result column="repo" property="repo"/>
|
||||||
<result column="mr" property="mr" />
|
<result column="mr" property="mr"/>
|
||||||
<result column="entry" property="entry" />
|
<result column="entry" property="entry"/>
|
||||||
<result column="lines" property="lines" />
|
<result column="lines" property="lines"/>
|
||||||
<result column="v1" property="v1" />
|
<result column="v1" property="v1"/>
|
||||||
<result column="v2" property="v2" />
|
<result column="v2" property="v2"/>
|
||||||
<result column="deleted" property="deleted" />
|
<result column="deleted" property="deleted"/>
|
||||||
<result column="vision" property="vision" />
|
<result column="vision" property="vision"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<select id="taskPageList" resultType="com.sa.zentao.dao.ZtTaskDTO">
|
<select id="taskPageList" resultType="com.sa.zentao.dao.ZtTaskDTO">
|
||||||
|
|
||||||
select s.*,pt.name productName from zt_task s left join zt_project project on s.project = project.id
|
select s.*,pt.name productName from zt_task s left join zt_project project on s.project = project.id
|
||||||
left join zt_product pt on s.product = pt.id
|
left join zt_product pt on s.product = pt.id
|
||||||
where 1= 1
|
where 1= 1
|
||||||
|
|
||||||
<if test="qo.startDate !=null">
|
<if test="qo.startDate !=null">
|
||||||
and s.openedDate <![CDATA[>=]]> #{qo.startDate}
|
and s.openedDate <![CDATA[>=]]> #{qo.startDate}
|
||||||
|
</if>
|
||||||
|
<if test="qo.endDate !=null">
|
||||||
|
and s.openedDate <![CDATA[<=]]> #{qo.endDate}
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.projectList != null and qo.projectList.size() > 0">
|
||||||
|
and s.project in
|
||||||
|
<foreach collection="qo.projectList" item="id" index="index"
|
||||||
|
open="(" close=")" separator=",">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</if>
|
||||||
|
|
||||||
|
|
||||||
|
<if test="qo.objIds != null and qo.objIds.size() > 0">
|
||||||
|
and s.id in
|
||||||
|
<foreach collection="qo.objIds" item="id" index="index"
|
||||||
|
open="(" close=")" separator=",">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'ALL' ">
|
||||||
|
|
||||||
|
</if>
|
||||||
|
<if test="qo.searchVal == 'WGB' ">
|
||||||
|
and s.status != 'closed'
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'DPS' ">
|
||||||
|
and s.status = 'reviewing'
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'ZPGW' ">
|
||||||
|
and s.assignedTo= #{qo.userName}
|
||||||
|
</if>
|
||||||
|
<if test="qo.searchVal == 'YWCY' ">
|
||||||
|
and s.mailto like concat('%', #{qo.userName}, '%')
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'YWCJ' ">
|
||||||
|
and s.openedBy like concat('%', #{qo.userName}, '%')
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'YWZP' ">
|
||||||
|
and s.lastEditedBy = #{qo.userName}
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.searchVal == 'RJXQBG' ">
|
||||||
|
and s.status != 'active'
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="qo.execution != '' and qo.execution != null ">
|
||||||
|
and s.execution =#{qo.execution}
|
||||||
|
</if>
|
||||||
|
|
||||||
|
|
||||||
|
<if test="qo.projectIds != null and qo.projectIds.size() > 0">
|
||||||
|
and s.execution in
|
||||||
|
<foreach collection="qo.projectIds" item="id" index="index"
|
||||||
|
open="(" close=")" separator=",">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</if>
|
||||||
|
|
||||||
|
|
||||||
|
<if test="qo.searchCode != null and qo.searchCode != '' ">
|
||||||
|
|
||||||
|
-- //任务名称
|
||||||
|
<if test="qo.searchCode=='rwmc' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
|
and s.name like concat('%', #{qo.searchValue}, '%')
|
||||||
</if>
|
</if>
|
||||||
<if test="qo.endDate !=null">
|
-- 项目id
|
||||||
and s.openedDate <![CDATA[<=]]> #{qo.endDate}
|
<if test="qo.searchCode=='bh' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
|
and s.id =#{qo.searchValue}
|
||||||
|
</if>
|
||||||
|
-- 状态
|
||||||
|
<if test="qo.searchCode=='zt' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
|
and s.status =#{qo.searchValue}
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<if test="qo.projectList != null and qo.projectList.size() > 0">
|
-- 指派给
|
||||||
and s.project in
|
<if test="qo.searchCode=='zpg' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
<foreach collection="qo.projectList" item="id" index="index"
|
and s.assignedTo =#{qo.searchValue}
|
||||||
open="(" close=")" separator=",">
|
|
||||||
#{id}
|
|
||||||
</foreach>
|
|
||||||
|
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
|
-- 负责人
|
||||||
|
<if test="qo.searchCode=='yscj' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
<if test="qo.objIds != null and qo.objIds.size() > 0">
|
and s.openedBy = #{qo.searchValue}
|
||||||
and s.id in
|
|
||||||
<foreach collection="qo.objIds" item="id" index="index"
|
|
||||||
open="(" close=")" separator=",">
|
|
||||||
#{id}
|
|
||||||
</foreach>
|
|
||||||
|
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<if test="qo.searchVal == 'ALL' ">
|
<if test="qo.searchCode=='ysgb' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
|
and s.closedBy = #{qo.searchValue}
|
||||||
</if>
|
|
||||||
<if test="qo.searchVal == 'WGB' ">
|
|
||||||
and s.status != 'closed'
|
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<if test="qo.searchVal == 'DPS' ">
|
<if test="qo.searchCode=='ysqx' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
and s.status = 'reviewing'
|
and s.canceledBy = #{qo.searchValue}
|
||||||
|
</if>
|
||||||
|
<if test="qo.searchCode=='zhxg' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
|
and s.lastEditedBy = #{qo.searchValue}
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<if test="qo.searchVal == 'ZPGW' ">
|
<if test="qo.searchCode=='cjrq' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
and s.assignedTo= #{qo.userName}
|
and s.openedDate ${qo.searchValue}
|
||||||
</if>
|
|
||||||
<if test="qo.searchVal == 'YWCY' ">
|
|
||||||
and s.mailto like concat('%', #{qo.userName}, '%')
|
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<if test="qo.searchVal == 'YWCJ' ">
|
<if test="qo.searchCode=='jzrq' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
and s.openedBy like concat('%', #{qo.userName}, '%')
|
and s.deadline ${qo.searchValue}
|
||||||
</if>
|
</if>
|
||||||
|
<if test="qo.searchCode=='yjks' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
<if test="qo.searchVal == 'YWZP' ">
|
and s.estStarted ${qo.searchValue}
|
||||||
and s.lastEditedBy = #{qo.userName}
|
|
||||||
</if>
|
</if>
|
||||||
|
<if test="qo.searchCode=='sjks' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
<if test="qo.searchVal == 'RJXQBG' ">
|
and s.realstarted ${qo.searchValue}
|
||||||
and s.status != 'active'
|
|
||||||
</if>
|
</if>
|
||||||
|
<if test="qo.searchCode=='sjwc' and qo.searchValue != null and qo.searchValue != '' ">
|
||||||
<if test="qo.execution != '' and qo.execution != null ">
|
and s.lastEditedBy ${qo.searchValue}
|
||||||
and s.execution =#{qo.execution}
|
|
||||||
</if>
|
</if>
|
||||||
|
<!-- <if test="qo.searchCode=='sjwc' and qo.searchValue != null and qo.searchValue != '' ">-->
|
||||||
|
<!-- and s.end_date <![CDATA[>=]]> #{qo.searchValue}-->
|
||||||
|
<!-- </if>-->
|
||||||
|
<!-- <if test="qo.searchCode=='yscj' and qo.searchValue != null and qo.searchValue != '' ">-->
|
||||||
|
<!-- and s.openedBy = #{qo.searchValue}-->
|
||||||
|
<!-- </if>-->
|
||||||
|
<!-- <if test="qo.searchCode=='ysgb' and qo.searchValue != null and qo.searchValue != '' ">-->
|
||||||
|
<!-- and s.closedBy = #{qo.searchValue}-->
|
||||||
|
<!-- </if>-->
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<choose>
|
||||||
<if test="qo.projectIds != null and qo.projectIds.size() > 0">
|
<when test="qo.orderName != '' and qo.orderName != null ">
|
||||||
and s.execution in
|
<choose>
|
||||||
<foreach collection="qo.projectIds" item="id" index="index"
|
<when test="qo.orderSort != '' and qo.orderSort != null ">
|
||||||
open="(" close=")" separator=",">
|
order by s.${qo.orderName} ${qo.orderSort}
|
||||||
#{id}
|
|
||||||
</foreach>
|
|
||||||
|
|
||||||
</if>
|
|
||||||
|
|
||||||
|
|
||||||
<if test="qo.searchCode != null and qo.searchCode != '' ">
|
|
||||||
|
|
||||||
-- //任务名称
|
|
||||||
<if test="qo.searchCode=='rwmc' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.name like concat('%', #{qo.searchValue}, '%')
|
|
||||||
</if>
|
|
||||||
-- 项目id
|
|
||||||
<if test="qo.searchCode=='bh' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.id =#{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
-- 状态
|
|
||||||
<if test="qo.searchCode=='zt' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.status =#{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
-- 指派给
|
|
||||||
<if test="qo.searchCode=='zpg' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.assignedTo =#{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
-- 负责人
|
|
||||||
<if test="qo.searchCode=='yscj' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.openedBy = #{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<if test="qo.searchCode=='ysgb' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.closedBy = #{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<if test="qo.searchCode=='ysqx' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.canceledBy = #{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
<if test="qo.searchCode=='zhxg' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.lastEditedBy = #{qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<if test="qo.searchCode=='cjrq' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.openedDate ${qo.searchValue}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<if test="qo.searchCode=='jzrq' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.deadline ${qo.searchValue}
|
|
||||||
</if>
|
|
||||||
<if test="qo.searchCode=='yjks' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.estStarted ${qo.searchValue}
|
|
||||||
</if>
|
|
||||||
<if test="qo.searchCode=='sjks' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.realstarted ${qo.searchValue}
|
|
||||||
</if>
|
|
||||||
<if test="qo.searchCode=='sjwc' and qo.searchValue != null and qo.searchValue != '' ">
|
|
||||||
and s.lastEditedBy ${qo.searchValue}
|
|
||||||
</if>
|
|
||||||
<!-- <if test="qo.searchCode=='sjwc' and qo.searchValue != null and qo.searchValue != '' ">-->
|
|
||||||
<!-- and s.end_date <![CDATA[>=]]> #{qo.searchValue}-->
|
|
||||||
<!-- </if>-->
|
|
||||||
<!-- <if test="qo.searchCode=='yscj' and qo.searchValue != null and qo.searchValue != '' ">-->
|
|
||||||
<!-- and s.openedBy = #{qo.searchValue}-->
|
|
||||||
<!-- </if>-->
|
|
||||||
<!-- <if test="qo.searchCode=='ysgb' and qo.searchValue != null and qo.searchValue != '' ">-->
|
|
||||||
<!-- and s.closedBy = #{qo.searchValue}-->
|
|
||||||
<!-- </if>-->
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<choose>
|
|
||||||
<when test="qo.orderName != '' and qo.orderName != null ">
|
|
||||||
<choose>
|
<choose>
|
||||||
<when test="qo.orderSort != '' and qo.orderSort != null ">
|
<when test="qo.orderName == 'deadline' ">
|
||||||
order by s.${qo.orderName} ${qo.orderSort}
|
,id ${qo.orderSort}
|
||||||
<choose>
|
</when>
|
||||||
<when test="qo.orderName == 'deadline' ">
|
|
||||||
,id ${qo.orderSort}
|
|
||||||
</when>
|
|
||||||
</choose>
|
|
||||||
|
|
||||||
|
|
||||||
</when>
|
|
||||||
<otherwise>
|
|
||||||
order by s.id desc
|
|
||||||
</otherwise>
|
|
||||||
</choose>
|
</choose>
|
||||||
|
|
||||||
|
|
||||||
</when>
|
</when>
|
||||||
<otherwise>
|
<otherwise>
|
||||||
order by s.id desc
|
order by s.id desc
|
||||||
</otherwise>
|
</otherwise>
|
||||||
</choose>
|
</choose>
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
order by s.id desc
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
@ -230,6 +226,19 @@
|
|||||||
|
|
||||||
select * from zt_task where execution = #{id}
|
select * from zt_task where execution = #{id}
|
||||||
|
|
||||||
|
</select>
|
||||||
|
<select id="itApprovalByUserName" resultType="com.sa.zentao.dao.ItApproval">
|
||||||
|
SELECT * from os_system.it_approval a WHERE 1=1
|
||||||
|
and a.name = #{name}
|
||||||
|
and
|
||||||
|
(
|
||||||
|
(date(apply_time_start) BETWEEN date( #{startDate}) and date(#{endDate}))
|
||||||
|
or(
|
||||||
|
date(apply_time_end) BETWEEN date(#{startDate}) and date(#{endDate}))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
@ -65,5 +65,22 @@
|
|||||||
<select id="selectPrdByName" resultType="com.sa.zentao.entity.ZtUser">
|
<select id="selectPrdByName" resultType="com.sa.zentao.entity.ZtUser">
|
||||||
SELECT * from zt_user WHERE 1=1 and account=#{name}
|
SELECT * from zt_user WHERE 1=1 and account=#{name}
|
||||||
</select>
|
</select>
|
||||||
|
<select id="dkList" resultType="com.sa.zentao.dao.DkInfo">
|
||||||
|
SELECT u.account,dk.date_str,staff.`name` ,min(dk_time) startDate,max(dk_time) endDate from os_system.new_dk_data dk LEFT JOIN os_system.base_staff staff on dk.staff_id = staff.id
|
||||||
|
LEFT JOIN zentao_dev.zt_user u on staff.vx_id = u.vx
|
||||||
|
WHERE 1=1 and dk.dk_time <![CDATA[>=]]> #{startDate} and dk.dk_time <![CDATA[<=]]> #{endDate}
|
||||||
|
|
||||||
|
|
||||||
|
<if test="ids != null and ids.size() > 0">
|
||||||
|
and u.account in
|
||||||
|
<foreach collection="ids" item="id" index="index"
|
||||||
|
open="(" close=")" separator=",">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</if>
|
||||||
|
GROUP BY date_str,u.account
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Reference in New Issue
Block a user