From de27c6f2d428632ed21a015dc6bfb73cc07f31a3 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 30 三月 2023 10:43:55 +0800
Subject: [PATCH] 四向穿梭车入库模式完善
---
src/main/java/com/zy/core/thread/LiftThread.java | 8 +-
src/main/java/com/zy/core/model/command/LiftCommand.java | 6 +
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java | 2
src/main/java/com/zy/asrs/controller/ShuttleController.java | 2
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 101 ++++++++++++++-----------
src/main/java/com/zy/core/thread/ShuttleThread.java | 13 ++-
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | 2
src/main/resources/mapper/WrkMastMapper.xml | 9 +
src/main/java/com/zy/core/model/LiftSlave.java | 41 +++++++---
src/main/java/com/zy/core/model/protocol/LiftProtocol.java | 6 +
src/main/java/com/zy/core/ServerBootstrap.java | 4 +
11 files changed, 121 insertions(+), 73 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index 3dc3b05..bb931f7 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -266,7 +266,7 @@
command.setShuttleNo(shuttleSlave.getId().shortValue()); // 鍥涘悜绌挎杞︾紪鍙�
command.setTaskMode(shuttleTaskModeType.id.shortValue());
command.setSourceLocNo(param.getSourceLocNo());
- command.setDistLocNo(param.getDistLocNo());
+ command.setLocNo(param.getDistLocNo());
command.setTaskNo((short) 9999);
if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, command))) {
diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
index 5edbeaa..80a0f32 100644
--- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -98,5 +98,5 @@
WrkMast selectRackInStep48(Short workNo,Integer sourceStaNo);
- WrkMast selectByWorkNo9(Integer workNo);
+ WrkMast selectByWorkNo59(Integer workNo);
}
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index e3d8031..8bb3c30 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -636,15 +636,28 @@
if (true || staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) {
WrkMast wrkMast = wrkMastMapper.selectRackInStep48(workNo, staProtocol.getSiteId());
if (wrkMast != null) {
- if (wrkMast.getWrkSts() == 4) {
- //瀵绘壘鏈�杩戜笖绌洪棽鐨勫洓鍚戠┛姊溅
- HashMap<String, Object> searchIdleShuttle = this.searchIdleShuttle(wrkMast);
- ShuttleThread shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
+ if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 8) {
+ ShuttleThread shuttleThread = null;
+ HashMap<String, Object> searchIdleShuttle = null;
+ if (wrkMast.getWrkSts() == 4) {
+ //瀵绘壘鏈�杩戜笖绌洪棽鐨勫洓鍚戠┛姊溅
+ searchIdleShuttle = this.searchIdleShuttle(wrkMast);
+ shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
+ }else {
+ //鐘舵��8锛屽洓鍚戠┛姊溅宸插湪鎻愬崌鏈哄彛锛岀瓑寰呭懡浠よ繘琛屽叆搴撴惉杩愬姩浣�
+ Integer shuttleNo = wrkMast.getShuttleNo();//鍥涘悜绌挎杞﹀彿
+ shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
+ }
+
if (shuttleThread == null) {
continue;
}
ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+ if (!shuttleProtocol.isIdle()) {
+ continue;
+ }
+
wrkMast.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());//缁欏伐浣滄。鍒嗛厤鍥涘悜绌挎杞﹀彿
//鍒嗛厤浠诲姟鍙�
@@ -664,52 +677,30 @@
LocMast currentLocMast = locMastService.queryByQrCode(currentCode.toString());
assignCommand.setSourceLocNo(currentLocMast.getLocNo());
- if (Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
+ if (wrkMast.getWrkSts() == 8 || Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
//鍚屼竴灞�
//鍒嗛厤鐩爣搴撲綅
shuttleProtocol.setLocNo(wrkMast.getLocNo());
//鐩爣搴撲綅
- assignCommand.setDistLocNo(wrkMast.getLocNo());
+ assignCommand.setLocNo(wrkMast.getLocNo());
wrkMast.setWrkSts(9L);//灏忚溅鍏ュ簱涓�
}else {
//涓嶅悓灞傦紝灏嗙洰鏍囧簱浣嶅垎閰嶆垚鎻愬崌鏈哄簱浣嶅彿
- //鍒嗛厤鐩爣搴撲綅
- shuttleProtocol.setLocNo("1800201");
+
+ //灏忚溅褰撳墠灞傞珮
+ String currentLocNo = currentLocMast.getLocNo();
+ Integer currentLev = Integer.parseInt(currentLocNo.substring(currentLocNo.length() - 2, currentLocNo.length()));
+
+ //鑾峰彇鎻愬崌鏈�
+ LiftSlave liftSlave = slaveProperties.getLift().get(0);
+ //鎻愬崌鏈哄簱浣嶅彿
+ String liftLocNo = liftSlave.getLiftLocNo(currentLev);
+ shuttleProtocol.setLocNo(liftLocNo);
//鐩爣搴撲綅
- assignCommand.setDistLocNo("1800201");
+ assignCommand.setLocNo(liftLocNo);
wrkMast.setWrkSts(5L);//灏忚溅杩佺Щ鐘舵��
}
- if (wrkMastMapper.updateById(wrkMast) > 0) {
- //涓嬪彂浠诲姟
- MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
- }
- }else {
- //鐘舵��8锛屽洓鍚戠┛姊溅宸插湪鎻愬崌鏈哄彛锛岀瓑寰呭懡浠よ繘琛屽叆搴撴惉杩愬姩浣�
- Integer shuttleNo = wrkMast.getShuttleNo();//鍥涘悜绌挎杞﹀彿
- ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
- if (shuttleThread == null) {
- continue;
- }
- ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-
- //鍒嗛厤鐩爣搴撲綅
- shuttleProtocol.setLocNo(wrkMast.getLocNo());
-
- ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
- //鍥涘悜绌挎杞﹀彿
- assignCommand.setShuttleNo(shuttleNo.shortValue());
- //浠诲姟鍙�
- assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
- //鍏ュ嚭搴撴ā寮�
- assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());
- //婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
- Short currentCode = shuttleProtocol.getCurrentCode();
- LocMast currentLocMast = locMastService.queryByQrCode(currentCode.toString());
- assignCommand.setSourceLocNo(currentLocMast.getLocNo());
- //鐩爣搴撲綅
- assignCommand.setDistLocNo(wrkMast.getLocNo());
- wrkMast.setWrkSts(9L);//灏忚溅鍏ュ簱涓�
if (wrkMastMapper.updateById(wrkMast) > 0) {
//涓嬪彂浠诲姟
MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
@@ -778,10 +769,23 @@
//妤煎眰鐩稿悓鎯呭喌
//鎵捐窛绂诲嚭搴撶偣鏈�杩戠殑杞�
+ if (!(recentShuttleProtocol.isIdle() && shuttleProtocol.isIdle())) {
+ //鍙鏈変竴杈嗚溅涓嶆槸绌洪棽鍒欎笉杩涜璋冨害
+ map.put("sameLay", false);//涓嶅悓灞�
+ map.put("result", null);
+ return map;
+ }
+
+ //鑾峰彇鎻愬崌鏈�
+ LiftSlave liftSlave = slaveProperties.getLift().get(0);
+ //鎻愬崌鏈哄簱浣嶅彿
+ String recentLiftLocNo = liftSlave.getLiftLocNo(recentShuttleLocNoLayInt);
+ String shuttleLiftLocNo = liftSlave.getLiftLocNo(shuttleLocNoLayInt);
+
//褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒版彁鍗囨満璺緞
- List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, "1800201", ShuttleTaskModeType.PAK_IN.id);
+ List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, recentLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
//褰撳墠妤煎眰鍥涘悜绌挎杞﹀埌鎻愬崌鏈鸿矾寰�
- List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, "1800201", ShuttleTaskModeType.PAK_IN.id);
+ List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, shuttleLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
//鍒ゆ柇鍝竴涓矾寰勬渶鐭�
if (shuttlePath.size() < recentShuttlePath.size()) {
//濡傛灉褰撳墠妤煎眰鐨勮溅璺緞鏇村皬锛屽垯鏇存柊鏈�杩戠┛姊溅
@@ -811,9 +815,18 @@
//鍥涘悜绌挎杞︾姸鎬佷负绛夊緟纭
if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id && shuttleProtocol.getTaskNo() != 0) {
//灏嗕换鍔℃。鏍囪涓哄畬鎴�
- WrkMast wrkMast = wrkMastMapper.selectByWorkNo9(shuttleProtocol.getTaskNo().intValue());
+ WrkMast wrkMast = wrkMastMapper.selectByWorkNo59(shuttleProtocol.getTaskNo().intValue());
if (wrkMast != null) {
- wrkMast.setWrkSts(14L);
+ switch (wrkMast.getWrkSts().intValue()) {
+ case 9:
+ wrkMast.setWrkSts(14L);
+ break;
+ case 5:
+ wrkMast.setWrkSts(6L);
+ break;
+ default:
+ }
+
if (wrkMastMapper.updateById(wrkMast) > 0) {
//璁剧疆鍥涘悜绌挎杞︿负绌洪棽鐘舵��
shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
@@ -825,7 +838,7 @@
shuttleProtocol.setLocNo(null);
//鏍囪澶嶄綅
shuttleProtocol.setPakMk(true);
- News.error("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚爢鍨涙満鍙�={}", shuttleProtocol.getShuttleNo());
+ News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚爢鍨涙満鍙�={}", shuttleProtocol.getShuttleNo());
} else {
News.error("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傚洓鍚戠┛姊溅鍙�={}锛屽伐浣滃彿={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
}
diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index 1958d24..48d373b 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -73,6 +73,10 @@
for (Slave ste : slaveProperties.getSte()) {
MessageQueue.init(SlaveType.Ste, ste);
}
+ // 鍒濆鍖栨彁鍗囨満mq
+ for (Slave lift : slaveProperties.getLift()) {
+ MessageQueue.init(SlaveType.Lift, lift);
+ }
// 鍒濆鍖栧洓鍚戠┛姊溅mq
for (Slave shuttle : slaveProperties.getShuttle()) {
MessageQueue.init(SlaveType.Shuttle, shuttle);
diff --git a/src/main/java/com/zy/core/model/LiftSlave.java b/src/main/java/com/zy/core/model/LiftSlave.java
index 79bf2a4..15e6060 100644
--- a/src/main/java/com/zy/core/model/LiftSlave.java
+++ b/src/main/java/com/zy/core/model/LiftSlave.java
@@ -4,34 +4,49 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
+import java.util.ArrayList;
+import java.util.List;
+
@EqualsAndHashCode(callSuper = true)
@Data
public class LiftSlave extends Slave {
- private Integer rack;
+ // 鎺�
+ private Integer row;
- private Integer slot;
+ // 鍒�
+ private Integer bay;
- private Boolean demo;
+ //鎻愬崌鏈虹珯鐐�
+ private List<Sta> sta = new ArrayList<>();
@Data
public static class Sta {
- // 杈撻�佺嚎plc缂栧彿
- private Integer devpPlcId;
-
- // 绌挎杞︾珯鐐圭紪鍙�
+ // 鎻愬崌鏈虹珯鐐瑰彿
private Integer staNo;
-
- // 鎺�
- private Integer row;
-
- // 鍒�
- private Integer bay;
// 灞�
private Integer lev;
}
+ //鑾峰彇鎻愬崌鏈哄簱浣嶅彿
+ public String getLiftLocNo(Integer lev) {
+ StringBuffer sb = new StringBuffer();
+ if (row < 10) {
+ sb.append("0");
+ }
+ sb.append(row);
+
+ if (bay < 10) {
+ sb.append("00");
+ } else if (bay < 100) {
+ sb.append("0");
+ }
+ sb.append(bay);
+ sb.append(lev);
+ return sb.toString();
+ }
+
}
diff --git a/src/main/java/com/zy/core/model/command/LiftCommand.java b/src/main/java/com/zy/core/model/command/LiftCommand.java
index 173e7a0..bb1d3d0 100644
--- a/src/main/java/com/zy/core/model/command/LiftCommand.java
+++ b/src/main/java/com/zy/core/model/command/LiftCommand.java
@@ -62,6 +62,10 @@
/**
* 鎻愬崌鏈洪攣瀹�
*/
- private Short liftLock;
+ private Boolean liftLock;
+
+ public Short getLiftLockShortValue() {
+ return liftLock ? (short) 1 : (short) 0;
+ }
}
diff --git a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
index 1017aa9..07c1e2c 100644
--- a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
+++ b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
@@ -36,6 +36,6 @@
/**
* 鐩爣搴撲綅
*/
- private String distLocNo;
+ private String locNo;
}
diff --git a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
index bbdc2f7..cd00e23 100644
--- a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
@@ -28,7 +28,7 @@
/**
* 鎻愬崌鏈洪攣瀹�
*/
- private Short liftLock;
+ private Boolean liftLock;
/**
* 浣嶇疆鍒拌揪鍙嶉
@@ -161,4 +161,8 @@
*/
private Short liftActualSpeed;
+ public Short getLiftLockShortValue() {
+ return liftLock ? (short) 1 : (short) 0;
+ }
+
}
diff --git a/src/main/java/com/zy/core/thread/LiftThread.java b/src/main/java/com/zy/core/thread/LiftThread.java
index f67aa95..0f9a811 100644
--- a/src/main/java/com/zy/core/thread/LiftThread.java
+++ b/src/main/java/com/zy/core/thread/LiftThread.java
@@ -105,7 +105,7 @@
//鑾峰彇鏁版嵁
byte[] content = result.Content;
//鎻愬崌鏈洪攣瀹�
- liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransInt16(content,0));
+ liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransBool(content,0));
//浣嶇疆鍒拌揪鍙嶉
liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
//鍑嗗灏辩华
@@ -150,7 +150,7 @@
///璇诲彇鎻愬崌鏈虹姸鎬�-end
OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
- log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+// log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
// 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
//.....
@@ -187,7 +187,7 @@
//鍥涘眰楂樺害璁惧畾
array[5] = command.getHeight4();
//鎻愬崌鏈洪攣瀹�
- array[29] = command.getLiftLock();
+ array[29] = command.getLiftLockShortValue();
OperateResult result = modbusTcpNet.Write("0", array);;
if (result != null && result.IsSuccess) {
@@ -229,7 +229,7 @@
command.setHeight2((short) 100);
command.setHeight3((short) 200);
command.setHeight4((short) 303);
- command.setLiftLock((short) 1);
+ command.setLiftLock(true);
thread.write(command);
}
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index 43a6f6a..db733ce 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -227,7 +227,7 @@
basShuttle.setPakMk(shuttleProtocol.getPakMk());
if (shuttleService.updateById(basShuttle)) {
OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
- log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+// log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
}
}else {
@@ -348,7 +348,7 @@
HashMap<String, Object> map = new HashMap<>();
//璁$畻璺緞
- List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getDistLocNo(), assignCommand.getTaskMode().intValue());
+ List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), assignCommand.getTaskMode().intValue());
if (calc != null) {
//鑾峰彇鍒嗘璺緞
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
@@ -380,8 +380,11 @@
}
//鎵ц涓嬪彂鐨勬寚浠�
- private void executeWork(ShuttleAssignCommand assignCommand) {
+ private boolean executeWork(ShuttleAssignCommand assignCommand) {
//璇诲彇redis鏁版嵁
+ if (assignCommand == null) {
+ return false;
+ }
Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo());
HashMap map = JSON.parseObject(o.toString(), HashMap.class);
//褰撳墠姝ュ簭
@@ -458,6 +461,7 @@
//涓嬪彂鍛戒护
if (!write(command)) {
News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
+ return false;
} else {
News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
@@ -483,7 +487,7 @@
new Date(),
ShuttleTaskModeType.get(assignCommand.getTaskMode()).desc,
assignCommand.getSourceLocNo(),
- assignCommand.getDistLocNo(),
+ assignCommand.getLocNo(),
null,
null,
null,
@@ -501,6 +505,7 @@
}
}
+ return true;
}
/******************************************************************************************/
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index e8d66f1..f525429 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -240,10 +240,13 @@
select top 1 *
from dbo.asr_wrk_mast
where 1=1
- and wrk_sts in (4,8) and source_sta_no = #{sourceStaNo} and wrk_no=#{workNo} order by io_pri desc,wrk_sts desc
+ and ((wrk_sts = 4 and shuttle_no is null) or (wrk_sts = 8 and shuttle_no is not null))
+ and source_sta_no = #{sourceStaNo}
+ and wrk_no=#{workNo}
+ order by io_pri desc,wrk_sts desc
</select>
- <select id="selectByWorkNo9" resultMap="BaseResultMap">
- select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (9)
+ <select id="selectByWorkNo59" resultMap="BaseResultMap">
+ select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (5,9)
</select>
</mapper>
--
Gitblit v1.9.1