From 62ecc7d5306d40eb301b59d8ff7a940e23f7e5e4 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期五, 27 九月 2024 10:53:12 +0800
Subject: [PATCH] ll
---
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java | 185 +++++++++++++++++++++++++++++++++++++++------
1 files changed, 158 insertions(+), 27 deletions(-)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
index 11d0117..cd03e09 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -4,6 +4,13 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.CarChargeAddRequest;
+import com.doumee.core.haikang.model.param.request.ParkReservationAddRequest;
+import com.doumee.core.haikang.model.param.request.ParkReservationDelRequest;
+import com.doumee.core.haikang.model.param.respose.ParkReservationAddResponse;
+import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
@@ -83,6 +90,12 @@
@Autowired
private PlatformShowParamMapper platformShowParamMapper;
+ @Autowired
+ private ParksMapper parksMapper;
+
+ @Autowired
+ private VisitParkMapper visitParkMapper;
+
@Override
public Integer create(PlatformJob platformJob) {
@@ -161,7 +174,8 @@
.selectAs(PlatformGroup::getName,PlatformJob::getPlatformGroupName)
.selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
.selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
- .selectAs(SystemUser::getUsername,PlatformJob::getOutUserName)
+ .selectAs(PlatformWmsJob::getIoCreatedate,PlatformJob::getIoCreatedate)
+ .selectAs(SystemUser::getRealname,PlatformJob::getOutUserName)
.leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
.leftJoin(PlatformGroup.class,PlatformGroup::getId,Platform::getGroupId)
.leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
@@ -189,6 +203,7 @@
.eq(pageWrap.getModel().getSingType() != null, PlatformJob::getSingType, pageWrap.getModel().getSingType())
.eq(pageWrap.getModel().getSignDistance() != null, PlatformJob::getSignDistance, pageWrap.getModel().getSignDistance())
.eq(pageWrap.getModel().getPlatformNames() != null, PlatformJob::getPlatformNames, pageWrap.getModel().getPlatformNames())
+ .like(pageWrap.getModel().getPlatformName() != null, Platform::getName, pageWrap.getModel().getPlatformName())
.eq(pageWrap.getModel().getPlatforms() != null, PlatformJob::getPlatforms, pageWrap.getModel().getPlatforms())
.eq(pageWrap.getModel().getPlatformId() != null, PlatformJob::getPlatformId, pageWrap.getModel().getPlatformId())
.ge(pageWrap.getModel().getInwaitDate() != null, PlatformJob::getInwaitDate, Utils.Date.getStart(pageWrap.getModel().getInwaitDate()))
@@ -244,8 +259,8 @@
.ge(pageWrap.getModel().getBeginWorkDateStart() != null, PlatformJob::getStartDate, Utils.Date.getStart(pageWrap.getModel().getBeginWorkDateStart()))
.le(pageWrap.getModel().getBeginWorkDateEnd() != null, PlatformJob::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getBeginWorkDateEnd()))
- .ge(pageWrap.getModel().getCreateDateStart() != null, PlatformJob::getStartDate, Utils.Date.getStart(pageWrap.getModel().getCreateDateStart()))
- .le(pageWrap.getModel().getCreateDateEnd() != null, PlatformJob::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDateEnd()))
+ .ge(pageWrap.getModel().getCreateDateStart() != null, PlatformWmsJob::getIoCreatedate, Utils.Date.getStart(pageWrap.getModel().getCreateDateStart()))
+ .le(pageWrap.getModel().getCreateDateEnd() != null, PlatformWmsJob::getIoCreatedate, Utils.Date.getEnd(pageWrap.getModel().getCreateDateEnd()))
.eq(pageWrap.getModel().getJobType() != null && Constants.equalsInteger(Constants.ONE,pageWrap.getModel().getJobType()), PlatformJob::getType, Constants.platformJobType.sgscxh)
.ne(pageWrap.getModel().getJobType() != null && Constants.equalsInteger(Constants.ZERO,pageWrap.getModel().getJobType()), PlatformJob::getType, Constants.platformJobType.sgscxh)
;
@@ -282,10 +297,6 @@
.leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
.eq(pageWrap.getModel().getPlatformGroupId() != null, PlatformJob::getPlatformGroupId, pageWrap.getModel().getPlatformGroupId())
.like(pageWrap.getModel().getCarCodeFront() != null, PlatformJob::getCarCodeFront, pageWrap.getModel().getCarCodeFront())
-// .eq(Objects.nonNull(pageWrap.getModel().getCallType())
-// &&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.ONE),
-// PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()
-// )
.apply(Objects.nonNull(pageWrap.getModel().getCallType())
&&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.ONE),
@@ -311,7 +322,7 @@
&&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.THREE),
i->i.eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()).or()
.eq(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey()).or()
- .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey()).or()
+// .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey()).or()
.apply(" ( t.status = "+Constants.PlatformJobStatus.TRANSFERING.getKey()+" and t.PLATFORM_GROUP_ID = "+pageWrap.getModel().getPlatformGroupId()+" ) ")
)
// .like(PlatformJob::getArriveDate,DateUtil.dateTypeToString(new Date(),"yyyy-MM-dd"))
@@ -536,6 +547,16 @@
}else{
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"绛惧埌绫诲瀷閿欒");
}
+ //鏌ヨ鏈堝彴缁勬暟鎹�
+ PlatformGroup platformGroup = platformGroupMapper.selectById(platformJob.getPlatformGroupId());
+ if(Objects.isNull(platformGroup)){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈煡璇㈠埌鏈堝彴缁勪俊鎭�");
+ }
+ if(System.currentTimeMillis() > DateUtil.getDateByString(DateUtil.getCurrDate() + " " + platformGroup.getEndTime() + ":59" ).getTime()
+ || System.currentTimeMillis() < DateUtil.getDateByString(DateUtil.getCurrDate() + " " + platformGroup.getStartTime() + ":00" ).getTime()){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈湪宸ヤ綔鏃堕棿["+platformGroup.getStartTime() + "-" + platformGroup.getEndTime() +"]锛屾棤娉曡繘琛岀鍒�");
+ }
+
platformJob.setSignDate(new Date());
platformJob.setSingType(signInDTO.getSignType());
platformJob.setStatus(Constants.PlatformJobStatus.WAIT_CALL.getKey());
@@ -603,13 +624,16 @@
){
//鏌ヨ鍓嶆柟鎺掗槦鏁伴噺
this.queryWaitNum(platformJob);
+ Platform platform = platformJoinMapper.selectById(platformJob.getPlatformId());
+ if(Objects.nonNull(platform)){
+ platformJob.setPlatformName(platform.getName());
+ }
}else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
//浣滀笟鏈堝彴淇℃伅
Platform platform = platformJoinMapper.selectById(platformJob.getPlatformId());
if(Objects.nonNull(platform)){
platformJob.setPlatformName(platform.getName());
}
-
}
platformJob.dealTime();
this.getWorkTime(platformJob);
@@ -664,7 +688,7 @@
.leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
.eq(PlatformJob::getIsdeleted,Constants.ZERO)
.eq(PlatformJob::getPlatformGroupId,platformGroup.getId())
- .ge(Objects.nonNull(platformJob),PlatformJob::getSignDate,DateUtil.dateTypeToString(platformJob.getSignDate(),"yyyy-MM-dd HH:mm:ss"))
+ .le(Objects.nonNull(platformJob),PlatformJob::getSignDate,DateUtil.dateTypeToString(platformJob.getSignDate(),"yyyy-MM-dd HH:mm:ss"))
.in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey(),
Constants.PlatformJobStatus.IN_WAIT.getKey(),
Constants.PlatformJobStatus.CALLED.getKey())
@@ -728,7 +752,7 @@
*/
@Override
@Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void platformInPark(JobOperateDTO jobOperateDTO){
+ public PlatformJob platformInPark(JobOperateDTO jobOperateDTO){
if(Objects.isNull(jobOperateDTO)
|| Objects.isNull(jobOperateDTO.getJobId())
|| Objects.isNull(jobOperateDTO.getPlatformId())){
@@ -767,17 +791,110 @@
platformJob.setEditDate(new Date());
platformJobMapper.updateById(platformJob);
- if(Constants.equalsInteger(platformJob.getType(),Constants.TWO)
- || Constants.equalsInteger(platformJob.getType(),Constants.THREE)
- || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
- //TODO 涓嬪彂鍏ュ洯鏉冮檺
-
-
- }
//瀛樺偍鎿嶄綔鏃ュ織
savePlatformLog(Constants.PlatformJobLogType.IN_WAIT.getKey(),oldPlatformJob,platformJob,
Constants.PlatformJobLogType.IN_WAIT.getInfo());
+ return platformJob;
+ }
+
+
+ @Override
+ public void sendInPark(PlatformJob platformJob){
+ if(Constants.equalsInteger(platformJob.getType(),Constants.TWO)
+ || Constants.equalsInteger(platformJob.getType(),Constants.THREE)
+ || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
+ //鏌ヨ褰撳墠鍚敤鐨勫仠杞﹀満
+ List<Parks> parksList = parksMapper.selectList(new QueryWrapper<Parks>()
+ .lambda()
+ .isNotNull(Parks::getHkId)
+ .eq(Parks::getIsdeleted,Constants.ZERO));
+ List<VisitPark> visitParkList = new ArrayList<>();
+ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(parksList)){
+ Boolean sendStatus = true;
+ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(parksList)){
+ for (Parks parks:parksList) {
+ VisitPark visitPark = new VisitPark();
+ visitPark.setIsdeleted(Constants.ZERO);
+ visitPark.setCreateDate(new Date());
+ visitPark.setVisitApplyId(platformJob.getId().toString());
+ visitPark.setCarCode(platformJob.getCarCodeFront());
+ visitPark.setParkId(parks.getId().toString());
+ visitPark.setStartTime(new Date());
+ visitPark.setEndTime(DateUtil.getXMinuteAfterDate(visitPark.getStartTime(),Integer.valueOf(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.POWER_MINUTE).getCode())));
+ visitPark.setParkHkId(parks.getHkId());
+ visitPark.setObjType(Constants.ONE);
+
+ ParkReservationAddRequest request = new ParkReservationAddRequest();
+ request.setPlateNo(visitPark.getCarCode());
+ request.setParkSyscode(visitPark.getParkHkId());
+ request.setPhoneNo(platformJob.getDrivierPhone());
+ request.setOwner(platformJob.getDriverName());
+ request.setAllowTimes(Constants.ONE+"");
+ request.setIsCharge(Constants.ONE+"");
+ request.setStartTime(Objects.isNull(visitPark.getStartTime())?DateUtil.getISO8601Timestamp2(new Date()):DateUtil.getISO8601Timestamp2(visitPark.getStartTime()));
+ request.setEndTime(Objects.isNull(visitPark.getEndTime())?"2999-12-31T00:00:00+08:00":DateUtil.getISO8601Timestamp2(visitPark.getEndTime()));
+ BaseResponse response = HKService.parkReservationAddition(request);
+
+ visitPark.setHkDate(new Date());
+ if(response!=null
+ && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+ ParkReservationAddResponse parkReservationAddResponse = (ParkReservationAddResponse) response.getData();
+ visitPark.setHkId(parkReservationAddResponse.getReserveOrderNo());
+ visitPark.setHkStatus(Constants.ONE);
+ visitPark.setRemark("鍖呮湡鎴愬姛");
+ }else{
+ visitPark.setHkStatus(Constants.TWO);
+ visitPark.setRemark("鍖呮湡澶辫触~");
+ //涓嬪彂澶辫触 鏍囪涓讳笟鍔$姸鎬佷负涓嬪彂澶辫触
+ sendStatus = false;
+ }
+ visitParkList.add(visitPark);
+
+ }
+ visitParkMapper.insert(visitParkList);
+ platformJob.setInHkdate(new Date());
+ if(sendStatus){
+ platformJob.setInHkstatus(Constants.TWO);
+ }else{
+ platformJob.setInHkstatus(Constants.THREE);
+ }
+ platformJobMapper.updateById(platformJob);
+ }
+
+ }
+ }
+ }
+
+
+ @Override
+ public void cancelInPark(PlatformJob platformJob){
+ if(Constants.equalsInteger(platformJob.getType(),Constants.TWO)
+ || Constants.equalsInteger(platformJob.getType(),Constants.THREE)
+ || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
+
+ List<VisitPark> visitParkList = visitParkMapper.selectList(new QueryWrapper<VisitPark>().lambda()
+ .eq(VisitPark::getVisitApplyId,platformJob.getId())
+ .eq(VisitPark::getObjType,Constants.ONE)
+ .eq(VisitPark::getHkStatus,Constants.ONE)
+ .isNotNull(VisitPark::getHkId)
+ .apply(" END_TIME > now() ")
+ );
+ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(visitParkList)){
+ for (VisitPark visitPark:visitParkList) {
+ ParkReservationDelRequest param = new ParkReservationDelRequest();
+ param.setReserveOrderNo(visitPark.getHkId());
+ BaseResponse response = HKService.parkReservationDeletion(param);
+ if(response!=null
+ && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+ visitPark.setHkStatus(Constants.THREE);
+ visitPark.setIsdeleted(Constants.ONE);
+ visitPark.setEditDate(new Date());
+ visitParkMapper.updateById(visitPark);
+ }
+ }
+ }
+ }
}
/**
@@ -785,7 +902,7 @@
*/
@Override
@Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void platformCallNumber(JobOperateDTO jobOperateDTO){
+ public PlatformJob platformCallNumber(JobOperateDTO jobOperateDTO){
if(Objects.isNull(jobOperateDTO)
|| Objects.isNull(jobOperateDTO.getJobId())){
throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -810,7 +927,7 @@
if(platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
.eq(PlatformJob::getPlatformId,platform.getId())
.in(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey(),Constants.PlatformJobStatus.WORKING.getKey())
- )>platform.getWorkingNum()){
+ )>=platform.getWorkingNum()){
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瓒呭嚭鏈堝彴鍙悓鏃朵綔涓氭暟閲廩"+platform.getWorkingNum()+"杈哴");
};
@@ -836,6 +953,7 @@
//瀛樺偍鎿嶄綔鏃ュ織
savePlatformLog(Constants.PlatformJobLogType.CALLED.getKey(),oldPlatformJob,platformJob,
Constants.PlatformJobLogType.CALLED.getInfo().replace("{data}",platform.getName()));
+ return platformJob;
}
@@ -958,7 +1076,7 @@
*/
@Override
@Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void beginWork(JobOperateDTO jobOperateDTO){
+ public PlatformJob beginWork(JobOperateDTO jobOperateDTO){
if(Objects.isNull(jobOperateDTO)
|| Objects.isNull(jobOperateDTO.getJobId())){
throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -989,6 +1107,8 @@
//瀛樺偍鎿嶄綔鏃ュ織
savePlatformLog(Constants.PlatformJobLogType.WORKING.getKey(),oldPlatformJob,platformJob,
Constants.PlatformJobLogType.WORKING.getInfo().replace("{data}",platform.getName()));
+
+ return platformJob;
}
@@ -997,7 +1117,7 @@
*/
@Override
@Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void finishWork(JobOperateDTO jobOperateDTO){
+ public PlatformJob finishWork(JobOperateDTO jobOperateDTO){
if(Objects.isNull(jobOperateDTO)
|| Objects.isNull(jobOperateDTO.getJobId())){
throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -1006,7 +1126,8 @@
if(Objects.isNull(platformJob)){
throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- if(!Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
+ if(! (Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())
+ ||Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.EXCEPTION.getKey()) )){
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧�,涓氬姟鐘舵�佸凡娴佽浆锛�");
}
PlatformJob oldPlatformJob = new PlatformJob();
@@ -1024,9 +1145,10 @@
//TODO 澶栧崗杞﹁璐� 鏌ヨTMS 鐢靛瓙閿佹儏鍐�
}else if(Constants.equalsInteger(platformJob.getType(),Constants.ONE) || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
- //TODO 澶栧崗杞﹀嵏璐� 鎴栬�� 甯傚叕鍙歌溅鍗歌揣 鍒欐牴鎹换鍔℃儏鍐佃繘琛屼笅鍙戠鍥潈闄�
+ //TODO 澶栧崗杞﹀嵏璐� 鎴栬�� 甯傚叕鍙歌溅鍗歌揣 鍒欐牴鎹换鍔℃儏鍐�
}
+ return platformJob;
}
@@ -1035,7 +1157,7 @@
*/
@Override
@Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void powerLevel(JobOperateDTO jobOperateDTO){
+ public PlatformJob powerLevel(JobOperateDTO jobOperateDTO){
if(Objects.isNull(jobOperateDTO)
|| Objects.isNull(jobOperateDTO.getJobId())){
throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -1053,11 +1175,16 @@
platformJob.setOutHkdate(new Date());
platformJob.setStatus(Constants.PlatformJobStatus.AUTHED_LEAVE.getKey());
platformJob.setEditDate(new Date());
+ platformJob.setRemark(jobOperateDTO.getRemark());
platformJobMapper.updateById(platformJob);
//瀛樺偍鎿嶄綔鏃ュ織
savePlatformLog(Constants.PlatformJobLogType.AUTHED_LEAVE.getKey(),oldPlatformJob,platformJob ,
Constants.PlatformJobLogType.AUTHED_LEAVE.getInfo());
- //TODO 鎺堟潈杞﹁締绂诲満鏉冮檺
+ return platformJob;
+
+
+
+
}
@@ -1162,6 +1289,7 @@
platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
String v = Long.toString((platformLog.getCreateDate().getTime() - DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime() )/ 1000) ;
platformLog.setParam3(v);
+ platformLog.setRemark(platformJobBefor.getPlatformId().toString());
}else{
platformLog.setParam3("0");
}
@@ -1189,6 +1317,7 @@
platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
String v = Long.toString((platformJobAfter.getDoneDate().getTime() - DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime()) / 1000) ;
platformLog.setParam3(v);
+ platformLog.setRemark(platformJobBefor.getPlatformId().toString());
}
}else if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.WORKING.getKey())){
platformLog.setParam1(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
@@ -1290,7 +1419,9 @@
.selectAll(PlatformJob.class)
.selectAs(Platform::getName,PlatformJob::getPlatformName)
.selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+ .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
.leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+ .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getJobId,PlatformJob::getId)
.eq(PlatformJob::getPlatformId,platformId)
.eq(PlatformJob::getIsdeleted,Constants.ZERO)
.in(PlatformJob::getStatus,
@@ -1310,7 +1441,7 @@
//鏌ヨ鍓嶆柟鎺掗槦鏁伴噺
this.queryWaitNum(platformJob);
}
- PlatformWorkVO platformWorkVO = PlatformGroupServiceImpl.getPlatformWorkVO(platformId,platformJobList);
+ PlatformWorkVO platformWorkVO = PlatformGroupServiceImpl.getPlatformWorkVO(platformJoinMapper.selectById(platformId),platformJobList);
return platformWorkVO;
}
--
Gitblit v1.9.3