From 33fea8cb7804ba9ee45a1c832907cbde5f336444 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期二, 20 五月 2025 09:43:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TResultWorkEvaluateController.java | 405 +++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 332 insertions(+), 73 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TResultWorkEvaluateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TResultWorkEvaluateController.java
index 5fba2d1..43cd077 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TResultWorkEvaluateController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TResultWorkEvaluateController.java
@@ -713,10 +713,7 @@
List<TResultWorkEvaluateDetailUserVO> tResultWorkEvaluateDetailUserVOS = new ArrayList<>();
TResultWorkEvaluate resultWorkEvaluate = tResultWorkEvaluateService.getById(id);
TProjectTeam projectTeam = projectTeamService.getById(resultWorkEvaluate.getTeamId());
- TProjectTeamStaff one = projectTeamStaffService.lambdaQuery().eq(TProjectTeamStaff::getTeamId, resultWorkEvaluate.getTeamId()).eq(TProjectTeamStaff::getRoleType, 3).last("limit 1")
- .one();
tResultWorkEvaluateDetailVO.setStartTime(projectTeam.getCreateTime());
-
List<Long> role5 = projectTeamStaffService.lambdaQuery()
.eq(TProjectTeamStaff::getRoleType, 5).eq(TProjectTeamStaff::getTeamId, resultWorkEvaluate.getTeamId()).list()
.stream().map(TProjectTeamStaff::getUserId).collect(Collectors.toList());
@@ -745,6 +742,7 @@
// 开发阶段
List<TResultWorkEvaluate> list1 = tResultWorkEvaluateService.lambdaQuery()
.eq(TResultWorkEvaluate::getEvaluateType,2)
+ .eq(TResultWorkEvaluate::getStatus,1)
.eq(TResultWorkEvaluate::getUserId,sysUser.getUserId())
.eq(TResultWorkEvaluate::getTeamId, resultWorkEvaluate.getTeamId()).list();
// 调度ids
@@ -769,17 +767,17 @@
List<TProjectProposal> list2 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
.notIn(TProjectProposal::getAuditStatus, status).list();
List<String> collect5 = list2.stream().filter(e -> e.getProjectStage().equals(1)).map(TProjectProposal::getId).collect(Collectors.toList());
-
- if (collect6.isEmpty()){
- collect6.add("0");
+ if (collect5.isEmpty()){
+ collect5.add("0");
}
- List<Integer> status1 = new ArrayList<>();
- status1.add(-1);
- status1.add(1);
- status1.add(2);
- status1.add(4);
+ // 开发阶段调度ids
+ List<String> collect1 = experimentDispatchService.lambdaQuery().in(TExperimentDispatch::getProposalId, collect5).list().stream().map(TExperimentDispatch::getId).collect(Collectors.toList());
+ if (collect1.isEmpty()){
+ collect1.add("0");
+ }
+ List<TResultWorkEvaluate> collect2 = list1.stream().filter(e -> collect1.contains(e.getDispatchId())).collect(Collectors.toList());
int tempDetail2 = 0;
- for (TResultWorkEvaluate tResultWorkEvaluate : list1) {
+ for (TResultWorkEvaluate tResultWorkEvaluate : collect2) {
Integer evaluateOne = tResultWorkEvaluate.getEvaluateOne();
switch (evaluateOne){
case 1:
@@ -849,7 +847,9 @@
// 中试试验阶段
TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO3 = new TResultWorkEvaluateDetailEngineerVO();
- List<String> collect7 = list2.stream().filter(e -> e.getProjectStage().equals(2)).map(TProjectProposal::getId).collect(Collectors.toList());
+ List<String> collect7 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
+ .eq(TProjectProposal::getProjectStage,2)
+ .notIn(TProjectProposal::getAuditStatus, status).list().stream().map(TProjectProposal::getId).collect(Collectors.toList());
if (collect7.isEmpty()){
collect7.add("0");
}
@@ -859,12 +859,8 @@
if (collect8.isEmpty()){
collect8.add("0");
}
- List<Integer> status2 = new ArrayList<>();
- status2.add(-1);
- status2.add(1);
- status2.add(2);
- status2.add(4);
- List<TResultWorkEvaluate> list3 = tResultWorkEvaluateService.lambdaQuery().in(TResultWorkEvaluate::getDispatchId, collect8).list();
+ List<TResultWorkEvaluate> list3 = tResultWorkEvaluateService.lambdaQuery()
+ .eq(TResultWorkEvaluate::getStatus,1).in(TResultWorkEvaluate::getDispatchId, collect8).list();
int tempDetail3 = 0;
for (TResultWorkEvaluate tResultWorkEvaluate : list3) {
Integer evaluateOne = tResultWorkEvaluate.getEvaluateOne();
@@ -936,7 +932,9 @@
// 验证试验阶段
TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO4 = new TResultWorkEvaluateDetailEngineerVO();
- List<String> collect10 = list2.stream().filter(e -> e.getProjectStage().equals(2)).map(TProjectProposal::getId).collect(Collectors.toList());
+ List<String> collect10 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
+ .eq(TProjectProposal::getProjectStage,2)
+ .notIn(TProjectProposal::getAuditStatus, status).list().stream().map(TProjectProposal::getId).collect(Collectors.toList());
if (collect10.isEmpty()){
collect10.add("0");
}
@@ -1016,63 +1014,324 @@
tResultWorkEvaluateDetailEngineerVO4.setIntegral(tempDetail4);
tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO4);
// 工艺开发工具
- TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO5 = new TResultWorkEvaluateDetailEngineerVO();
- List<TFeasibilityStudyReport> collect12 = total.stream().filter(e -> e.getReportType().equals(3)).collect(Collectors.toList());
- int tempDetail15= 0 ;
- for (TFeasibilityStudyReport tFeasibilityStudyReport : collect12) {
- if (StringUtils.hasLength(tFeasibilityStudyReport.getEvaluateScore())){
- for (String s : tFeasibilityStudyReport.getEvaluateScore().split(",")) {
- tempDetail15+=Integer.parseInt(s);
- }
- }
- }
- tResultWorkEvaluateDetailEngineerVO5.setCount(collect12.size());
- tResultWorkEvaluateDetailEngineerVO5.setIntegral(tempDetail15);
- if (!collect12.isEmpty()){
- tResultWorkEvaluateDetailEngineerVO5.setStartTime(collect12.get(0).getEvaluateTime());
- tResultWorkEvaluateDetailEngineerVO5.setEndTime(collect12.get(collect12.size()-1).getEvaluateTime());
- }
- tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO5);
- // 验证与发布
- TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO6 = new TResultWorkEvaluateDetailEngineerVO();
- List<TFeasibilityStudyReport> collect13 = total.stream().filter(e -> e.getReportType().equals(3)).collect(Collectors.toList());
- int tempDetail16= 0 ;
- for (TFeasibilityStudyReport tFeasibilityStudyReport : collect13) {
- if (StringUtils.hasLength(tFeasibilityStudyReport.getEvaluateScore())){
- for (String s : tFeasibilityStudyReport.getEvaluateScore().split(",")) {
- tempDetail16+=Integer.parseInt(s);
- }
- }
- }
- tResultWorkEvaluateDetailEngineerVO6.setCount(collect13.size());
- tResultWorkEvaluateDetailEngineerVO6.setIntegral(tempDetail16);
- if (!collect13.isEmpty()){
- tResultWorkEvaluateDetailEngineerVO6.setStartTime(collect13.get(0).getEvaluateTime());
- tResultWorkEvaluateDetailEngineerVO6.setEndTime(collect13.get(collect13.size()-1).getEvaluateTime());
- }
- tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO6);
- // 立项报告
- List<TProjectApprovalReport> list5 = projectApprovalReportService.lambdaQuery().orderByDesc(BaseModel::getCreateTime).eq(TProjectApprovalReport::getTeamId, projectTeam.getId()).eq(TProjectApprovalReport::getStatus, 2).list();
- TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO7 = new TResultWorkEvaluateDetailEngineerVO();
- tResultWorkEvaluateDetailEngineerVO7.setCount(list5.size());
- if (!list5.isEmpty()){
- tResultWorkEvaluateDetailEngineerVO7.setEndTime(list5.get(list5.size()-1).getAuditTime());
- }
- tResultWorkEvaluateDetailEngineerVO7.setStartTime(projectTeam.getCreateTime());
- tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO7);
- // todo 临床试验积分
- List<TClinicalTrialPoints> list6 = clinicalTrialPointsService.lambdaQuery().eq(TClinicalTrialPoints::getTeamId, projectTeam.getId()).list();
- TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO8 = new TResultWorkEvaluateDetailEngineerVO();
- tResultWorkEvaluateDetailEngineerVO8.setCount(list6.size());
- if (!list6.isEmpty()){
- tResultWorkEvaluateDetailEngineerVO8.setEndTime(list6.get(list6.size()-1).getCreateTime());
- }
- tResultWorkEvaluateDetailEngineerVO8.setStartTime(projectTeam.getCreateTime());
- tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO8);
+
+
tResultWorkEvaluateDetailUserVO.setList(tResultWorkEvaluateDetailEngineerVOS);
tResultWorkEvaluateDetailUserVOS.add(tResultWorkEvaluateDetailUserVO);
}
+ tResultWorkEvaluateDetailVO.setChemistList(tResultWorkEvaluateDetailUserVOS);
+ return R.ok(tResultWorkEvaluateDetailVO);
+ }
+ @ApiOperation(value = "查看详情-左侧数据-实验员工作内容评定")
+ @GetMapping(value = "/open/t-result-work-evaluate/getDetailByIdLeftThree")
+ public R<TResultWorkEvaluateDetailVO> getDetailByIdLeftThree(@RequestParam String id) {
+ TResultWorkEvaluateDetailVO tResultWorkEvaluateDetailVO = new TResultWorkEvaluateDetailVO();
+ List<TResultWorkEvaluateDetailUserVO> tResultWorkEvaluateDetailUserVOS = new ArrayList<>();
+ TResultWorkEvaluate resultWorkEvaluate = tResultWorkEvaluateService.getById(id);
+ TProjectTeam projectTeam = projectTeamService.getById(resultWorkEvaluate.getTeamId());
+ tResultWorkEvaluateDetailVO.setStartTime(projectTeam.getCreateTime());
+ List<Long> role5 = projectTeamStaffService.lambdaQuery()
+ .eq(TProjectTeamStaff::getRoleType, 4).eq(TProjectTeamStaff::getTeamId, resultWorkEvaluate.getTeamId()).list()
+ .stream().map(TProjectTeamStaff::getUserId).collect(Collectors.toList());
+ List<SysUser> user5 = new ArrayList<>();
+ SysUser sysUser1 = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
+ if (sysUser1.getRoleType()==4||sysUser1.getRoleType()==5){
+ //只能查看自己的
+ user5.add(sysUser1);
+ }else{
+ for (Long l : role5) {
+ SysUser sysUser = sysUserService.selectUserById(l);
+ if (sysUser != null) {
+ user5.add(sysUser);
+ }
+ }
+ }
+ List<TResultWorkEvaluateDetailEngineerVO> tResultWorkEvaluateDetailEngineerVOS = new ArrayList<>();
+ for (SysUser sysUser : user5) {
+ TResultWorkEvaluateDetailUserVO tResultWorkEvaluateDetailUserVO = new TResultWorkEvaluateDetailUserVO();
+ tResultWorkEvaluateDetailUserVO.setUserName(sysUser.getNickName());
+ // 开发阶段
+ List<TResultWorkEvaluate> list1 = tResultWorkEvaluateService.lambdaQuery()
+ .eq(TResultWorkEvaluate::getEvaluateType,3)
+ .eq(TResultWorkEvaluate::getStatus,1)
+ .eq(TResultWorkEvaluate::getUserId,sysUser.getUserId())
+ .eq(TResultWorkEvaluate::getTeamId, resultWorkEvaluate.getTeamId()).list();
+ // 调度ids
+ List<String> collect = list1.stream().map(TResultWorkEvaluate::getDispatchId).collect(Collectors.toList());
+ if (collect.isEmpty()){
+ collect.add("0");
+ }
+ TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO2 = new TResultWorkEvaluateDetailEngineerVO();
+ List<Integer> status = new ArrayList<>();
+ status.add(-1);
+ status.add(1);
+ status.add(3);
+ status.add(4);
+ status.add(5);
+ // 课题方案ids
+ List<String> collect6 = experimentDispatchService.lambdaQuery().in(TExperimentDispatch::getId, collect)
+ .ne(TExperimentDispatch::getStatus, -1)
+ .ne(TExperimentDispatch::getStatus, 1).list().stream().map(TExperimentDispatch::getProposalId).collect(Collectors.toList());
+ if (collect6.isEmpty()){
+ collect6.add("0");
+ }
+ List<TProjectProposal> list2 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
+ .notIn(TProjectProposal::getAuditStatus, status).list();
+ List<String> collect5 = list2.stream().filter(e -> e.getProjectStage().equals(1)).map(TProjectProposal::getId).collect(Collectors.toList());
+ if (collect5.isEmpty()){
+ collect5.add("0");
+ }
+ // 开发阶段调度ids
+ List<String> collect1 = experimentDispatchService.lambdaQuery().in(TExperimentDispatch::getProposalId, collect5).list().stream().map(TExperimentDispatch::getId).collect(Collectors.toList());
+ if (collect1.isEmpty()){
+ collect1.add("0");
+ }
+ List<TResultWorkEvaluate> collect2 = list1.stream().filter(e -> collect1.contains(e.getDispatchId())).collect(Collectors.toList());
+ int tempDetail2 = 0;
+ for (TResultWorkEvaluate tResultWorkEvaluate : collect2) {
+ Integer evaluateOne = tResultWorkEvaluate.getEvaluateOne();
+ switch (evaluateOne){
+ case 1:
+
+ tempDetail2+=2;
+ break;
+ case 2:
+ tempDetail2+=1;
+
+ break;
+
+ }
+ Integer evaluateTwo = tResultWorkEvaluate.getEvaluateTwo();
+ switch (evaluateTwo){
+ case 1:
+ tempDetail2+=2;
+ break;
+ case 2:
+ tempDetail2+=1;
+
+ break;
+ }
+ Integer evaluateThree = tResultWorkEvaluate.getEvaluateThree();
+ switch (evaluateThree){
+ case 1:
+ tempDetail2+=2;
+
+ break;
+ case 2:
+ tempDetail2+=1;
+ break;
+ }
+ Integer evaluateFour = tResultWorkEvaluate.getEvaluateFour();
+ switch (evaluateFour){
+ case 1:
+ tempDetail2+=2;
+
+ break;
+ case 2:
+ tempDetail2+=1;
+ break;
+ }
+ Integer evaluateFive = tResultWorkEvaluate.getEvaluateFive();
+ switch (evaluateFive){
+ case 1:
+ tempDetail2+=2;
+
+ break;
+ case 2:
+ tempDetail2+=1;
+ break;
+ }
+ Integer evaluateSix = tResultWorkEvaluate.getEvaluateSix();
+ switch (evaluateSix){
+ case 1:
+ tempDetail2-=3;
+ break;
+ }
+ }
+ if (!list1.isEmpty()){
+ tResultWorkEvaluateDetailEngineerVO2.setEndTime(list1.get(list1.size()-1).getEvaluateTime());
+ }
+ tResultWorkEvaluateDetailEngineerVO2.setStartTime(projectTeam.getCreateTime());
+ tResultWorkEvaluateDetailEngineerVO2.setCount(collect5.size());
+ tResultWorkEvaluateDetailEngineerVO2.setIntegral(tempDetail2);
+ tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO2);
+
+ // 中试试验阶段
+ TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO3 = new TResultWorkEvaluateDetailEngineerVO();
+ List<String> collect7 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
+ .eq(TProjectProposal::getProjectStage,2)
+ .notIn(TProjectProposal::getAuditStatus, status).list().stream().map(TProjectProposal::getId).collect(Collectors.toList());
+ if (collect7.isEmpty()){
+ collect7.add("0");
+ }
+ List<String> collect8 = experimentDispatchService.lambdaQuery().in(TExperimentDispatch::getProposalId, collect7)
+ .ne(TExperimentDispatch::getStatus, -1)
+ .ne(TExperimentDispatch::getStatus, 1).list().stream().map(TExperimentDispatch::getId).collect(Collectors.toList());
+ if (collect8.isEmpty()){
+ collect8.add("0");
+ }
+ List<TResultWorkEvaluate> list3 = tResultWorkEvaluateService.lambdaQuery()
+ .eq(TResultWorkEvaluate::getStatus,1).in(TResultWorkEvaluate::getDispatchId, collect8).list();
+ int tempDetail3 = 0;
+ for (TResultWorkEvaluate tResultWorkEvaluate : list3) {
+ Integer evaluateOne = tResultWorkEvaluate.getEvaluateOne();
+ switch (evaluateOne){
+ case 1:
+
+ tempDetail3+=2;
+ break;
+ case 2:
+ tempDetail3+=1;
+
+ break;
+
+ }
+ Integer evaluateTwo = tResultWorkEvaluate.getEvaluateTwo();
+ switch (evaluateTwo){
+ case 1:
+ tempDetail3+=2;
+ break;
+ case 2:
+ tempDetail3+=1;
+
+ break;
+ }
+ Integer evaluateThree = tResultWorkEvaluate.getEvaluateThree();
+ switch (evaluateThree){
+ case 1:
+ tempDetail3+=2;
+
+ break;
+ case 2:
+ tempDetail3+=1;
+ break;
+ }
+ Integer evaluateFour = tResultWorkEvaluate.getEvaluateFour();
+ switch (evaluateFour){
+ case 1:
+ tempDetail3+=2;
+
+ break;
+ case 2:
+ tempDetail3+=1;
+ break;
+ }
+ Integer evaluateFive = tResultWorkEvaluate.getEvaluateFive();
+ switch (evaluateFive){
+ case 1:
+ tempDetail3+=2;
+
+ break;
+ case 2:
+ tempDetail3+=1;
+ break;
+ }
+ Integer evaluateSix = tResultWorkEvaluate.getEvaluateSix();
+ switch (evaluateSix){
+ case 1:
+ tempDetail3-=3;
+ break;
+ }
+ }
+ if (!list3.isEmpty()){
+ tResultWorkEvaluateDetailEngineerVO3.setStartTime(list3.get(0).getEvaluateTime());
+ tResultWorkEvaluateDetailEngineerVO3.setEndTime(list3.get(list3.size()-1).getEvaluateTime());
+ }
+ tResultWorkEvaluateDetailEngineerVO3.setCount(list3.size());
+ tResultWorkEvaluateDetailEngineerVO3.setIntegral(tempDetail3);
+ tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO3);
+ // 验证试验阶段
+ TResultWorkEvaluateDetailEngineerVO tResultWorkEvaluateDetailEngineerVO4 = new TResultWorkEvaluateDetailEngineerVO();
+
+ List<String> collect10 = projectProposalService.lambdaQuery().in(TProjectProposal::getId, collect6)
+ .eq(TProjectProposal::getProjectStage,2)
+ .notIn(TProjectProposal::getAuditStatus, status).list().stream().map(TProjectProposal::getId).collect(Collectors.toList());
+ if (collect10.isEmpty()){
+ collect10.add("0");
+ }
+ List<String> collect11 = experimentDispatchService.lambdaQuery().in(TExperimentDispatch::getProposalId, collect10)
+ .ne(TExperimentDispatch::getStatus, -1)
+ .ne(TExperimentDispatch::getStatus, 1).list().stream().map(TExperimentDispatch::getId).collect(Collectors.toList());
+ if (collect11.isEmpty()){
+ collect11.add("0");
+ }
+ List<TResultWorkEvaluate> list4 = tResultWorkEvaluateService.lambdaQuery().in(TResultWorkEvaluate::getDispatchId, collect11).list();
+ int tempDetail4 = 0;
+ for (TResultWorkEvaluate tResultWorkEvaluate : list4) {
+ Integer evaluateOne = tResultWorkEvaluate.getEvaluateOne();
+ switch (evaluateOne){
+ case 1:
+
+ tempDetail4+=2;
+ break;
+ case 2:
+ tempDetail4+=1;
+
+ break;
+
+ }
+ Integer evaluateTwo = tResultWorkEvaluate.getEvaluateTwo();
+ switch (evaluateTwo){
+ case 1:
+ tempDetail4+=2;
+ break;
+ case 2:
+ tempDetail4+=1;
+
+ break;
+ }
+ Integer evaluateThree = tResultWorkEvaluate.getEvaluateThree();
+ switch (evaluateThree){
+ case 1:
+ tempDetail4+=2;
+
+ break;
+ case 2:
+ tempDetail4+=1;
+ break;
+ }
+ Integer evaluateFour = tResultWorkEvaluate.getEvaluateFour();
+ switch (evaluateFour){
+ case 1:
+ tempDetail4+=2;
+
+ break;
+ case 2:
+ tempDetail4+=1;
+ break;
+ }
+ Integer evaluateFive = tResultWorkEvaluate.getEvaluateFive();
+ switch (evaluateFive){
+ case 1:
+ tempDetail4+=2;
+
+ break;
+ case 2:
+ tempDetail4+=1;
+ break;
+ }
+ Integer evaluateSix = tResultWorkEvaluate.getEvaluateSix();
+ switch (evaluateSix){
+ case 1:
+ tempDetail4-=3;
+ break;
+ }
+ }
+ if (!list4.isEmpty()){
+ tResultWorkEvaluateDetailEngineerVO4.setStartTime(list4.get(0).getEvaluateTime());
+ tResultWorkEvaluateDetailEngineerVO4.setEndTime(list4.get(list4.size()-1).getEvaluateTime());
+ }
+ tResultWorkEvaluateDetailEngineerVO4.setCount(list4.size());
+ tResultWorkEvaluateDetailEngineerVO4.setIntegral(tempDetail4);
+ tResultWorkEvaluateDetailEngineerVOS.add(tResultWorkEvaluateDetailEngineerVO4);
+ // 工艺开发工具
+
+
+ tResultWorkEvaluateDetailUserVO.setList(tResultWorkEvaluateDetailEngineerVOS);
+ tResultWorkEvaluateDetailUserVOS.add(tResultWorkEvaluateDetailUserVO);
+ }
+ tResultWorkEvaluateDetailVO.setChemistList(tResultWorkEvaluateDetailUserVOS);
return R.ok(tResultWorkEvaluateDetailVO);
}
}
--
Gitblit v1.7.1