Commit 0f55a2d3 authored by dahai's avatar dahai

Merge remote-tracking branch 'origin/dev' into dev

parents 6888f29d 70cf5aa8
......@@ -41,6 +41,7 @@ public interface LogMapper {
public boolean insertIntoAnalysis(@Param("fileDic")String fileDic,@Param("fileId")String fileId,@Param("commonCardCount")String commonCardCount,@Param("postCardCount")String postCardCount);
//查询解析数据
@Select("<script> " +
"SELECT * FROM " +
"( " +
......@@ -53,7 +54,7 @@ public interface LogMapper {
" LEFT JOIN FILE_NAME_DIC ON FILE_NAME_DIC.FILE_ID = ANALYSIS.FILE_DIC_ID "+
"WHERE 1=1" +
"<if test='fileName !=\"\"' >" +
" and FILE_NAME_DIC.FILE_NAME=#{fileName} " +
" and FILES.SOURCE_FILE_NAME=#{fileName} " +
"</if>" +
"<if test='analysisDate !=\"\"' >" +
"AND subStr(FILE_NAME_DIC.ANALYSIS_DATE,0,8) =subStr( #{analysisDate},0,8) " +
......@@ -69,11 +70,13 @@ public interface LogMapper {
@Select("select files.id from files where files.SOURCE_FILE_NAME = #{fileName}")
public String selectByFileName(@Param("fileName")String fileName);
/*查询新包日志*/
@Select("<script> " +
"SELECT * FROM " +
" ( " +
" SELECT A.*, ROWNUM RN " +
" FROM (SELECT NEW_FILE_NAME,CREATE_DATE,RECORD_NUMBER,DWDM,DWMC FROM NEW_FILES " +
" FROM (SELECT NEW_FILE_NAME,CREATE_DATE,RECORD_NUMBER,DWDM,DWMC " +
" FROM NEW_FILES " +
" RIGHT JOIN PREPRO_PERSON ON NEW_FILES.ID = PREPRO_PERSON.NEW_FILE_ID" +
" where 1=1 " +
" <if test='newFileName !=\"\"' >" +
......@@ -118,14 +121,14 @@ public interface LogMapper {
public int selectNewFileLogCount(@Param("newFileName") String newFileName, @Param("cardId") String cardId, @Param("createDate") String createDate, @Param("uploadCountyCode") String uploadCountyName);
// TODO 解析日志总数
@Select("<script> " +
"SELECT COUNT(*) FROM FILE_NAME_DIC \n" +
"LEFT JOIN PERSON_POST ON FILE_NAME_DIC.FILE_ID=PERSON_POST.FILE_ID " +
"LEFT JOIN FILES ON FILES.ID=FILE_NAME_DIC.FILE_ID " +
"left join PREPRO_PERSON on PREPRO_PERSON.JMSFZSLH = person_post.FIRST_WHITE " +
"SELECT COUNT(*) FROM FILES \n" +
"LEFT JOIN ANALYSIS ON ANALYSIS.FILE_ID =FILES.ID "+
"LEFT JOIN FILE_NAME_DIC ON FILE_NAME_DIC.FILE_ID=ANALYSIS.FILE_DIC_ID " +
"where 1=1 " +
"<if test='fileName !=\"\"' >" +
"and NEW_FILES.NEW_FILE_NAME=#{fileName} " +
"and FILES.SOURCE_FILE_NAME=#{fileName} " +
"</if>" +
"<if test='analysisDate !=\"\"' >" +
"AND subStr(FILE_NAME_DIC.ANALYSIS_DATE,0,8) = #{analysisDate} " +
......
......@@ -12,42 +12,59 @@ import java.util.Map;
@Mapper
public interface SelectSerialNumberMapper {
@Select("select TASK.TASK_ID," +
"COUNTY_DIC.COUNTYNAME," +
"COUNTY_DIC.COUNTY_CODE," +
"CARD_TYPE_DIC.CARD_TYPE," +
"CARD_TYPE_DIC.CARD_TYPE_ID," +
"TASK.ISSUED_DATE," +
"TASK.PRINT_OUT_DATE," +
"TASK.POSITION_DATE," +
"TASK.CONCORA_CRUSH_DATE, "+
"TASK.PUNCHING_DATE," +
"TASK.SORTING_DATE," +
"TASK.QUALITY_TEST_DATE\n" +
" from TASK \n" +
" LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE\n" +
" LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID\n" +
" WHERE TASK_ID =#{id}")
@Select("select TASK.TASK_ID,COUNTY_DIC.COUNTYNAME,COUNTY_DIC.COUNTY_CODE,\n" +
"CARD_TYPE_DIC.CARD_TYPE,CARD_TYPE_DIC.CARD_TYPE_ID,TASK.ISSUED_DATE,\n" +
"TASK.PRINT_OUT_DATE,TASK.POSITION_DATE,TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE,\n" +
"TASK.SORTING_DATE,TASK.QUALITY_TEST_DATE,SUM(GROUP_NO.VALID_COUNT) valid_count\n" +
"from TASK \n" +
"LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE \n" +
"LEFT JOIN GROUP_NO ON GROUP_NO.TASK_ID = TASK.TASK_ID\n" +
"LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID \n" +
"WHERE TASK.TASK_ID =#{id} and GROUP_NO.GROUP_NO is not null\n" +
"group by TASK.TASK_ID, COUNTY_DIC.COUNTYNAME, COUNTY_DIC.COUNTY_CODE, CARD_TYPE_DIC.CARD_TYPE, CARD_TYPE_DIC.CARD_TYPE_ID, \n" +
"TASK.ISSUED_DATE, TASK.PRINT_OUT_DATE, TASK.POSITION_DATE, TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE, \n" +
"TASK.SORTING_DATE, TASK.QUALITY_TEST_DATE\n" +
"UNION all \n" +
"select TASK.TASK_ID,COUNTY_DIC.COUNTYNAME,COUNTY_DIC.COUNTY_CODE,\n" +
"CARD_TYPE_DIC.CARD_TYPE,CARD_TYPE_DIC.CARD_TYPE_ID,TASK.ISSUED_DATE,\n" +
"TASK.PRINT_OUT_DATE,TASK.POSITION_DATE,TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE,\n" +
"TASK.SORTING_DATE,TASK.QUALITY_TEST_DATE,count(SPECIAL_CARD.ACCEPT_NO) valid_count\n" +
"from TASK \n" +
"LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE \n" +
"LEFT JOIN SPECIAL_CARD on SPECIAL_CARD.TASK_ID = TASK.TASK_ID\n" +
"LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID \n" +
"WHERE TASK.TASK_ID =#{id}\n" +
"group by TASK.TASK_ID, COUNTY_DIC.COUNTYNAME, COUNTY_DIC.COUNTY_CODE, CARD_TYPE_DIC.CARD_TYPE, CARD_TYPE_DIC.CARD_TYPE_ID, \n" +
"TASK.ISSUED_DATE, TASK.PRINT_OUT_DATE, TASK.POSITION_DATE, TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE, \n" +
"TASK.SORTING_DATE, TASK.QUALITY_TEST_DATE")
public List<Map<String,Object>> selectByWorkOrder(String id);
@Select("select GROUP_NO.TASK_ID," +
"COUNTY_DIC.COUNTYNAME," +
"COUNTY_DIC.COUNTY_CODE," +
"CARD_TYPE_DIC.CARD_TYPE," +
"CARD_TYPE_DIC.CARD_TYPE_ID," +
"TASK.ISSUED_DATE," +
"TASK.PRINT_OUT_DATE," +
"TASK.POSITION_DATE," +
"TASK.CONCORA_CRUSH_DATE, "+
"TASK.PUNCHING_DATE," +
"TASK.SORTING_DATE," +
"TASK.QUALITY_TEST_DATE\n" +
"from TASK\n" +
"LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE\n" +
"LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID\n" +
"LEFT JOIN GROUP_NO ON TASK.TASK_ID=GROUP_NO.TASK_ID\n" +
"WHERE GROUP_NO =#{id}")
@Select("select TASK.TASK_ID,COUNTY_DIC.COUNTYNAME,COUNTY_DIC.COUNTY_CODE,\n" +
"CARD_TYPE_DIC.CARD_TYPE,CARD_TYPE_DIC.CARD_TYPE_ID,TASK.ISSUED_DATE,\n" +
"TASK.PRINT_OUT_DATE,TASK.POSITION_DATE,TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE,\n" +
"TASK.SORTING_DATE,TASK.QUALITY_TEST_DATE,SUM(GROUP_NO.VALID_COUNT) valid_count\n" +
"from TASK \n" +
"LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE \n" +
"LEFT JOIN GROUP_NO ON GROUP_NO.TASK_ID = TASK.TASK_ID\n" +
"LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID \n" +
"WHERE GROUP_NO.GROUP_NO =#{id} and GROUP_NO.GROUP_NO is not null\n" +
"group by TASK.TASK_ID, COUNTY_DIC.COUNTYNAME, COUNTY_DIC.COUNTY_CODE, CARD_TYPE_DIC.CARD_TYPE, CARD_TYPE_DIC.CARD_TYPE_ID, \n" +
"TASK.ISSUED_DATE, TASK.PRINT_OUT_DATE, TASK.POSITION_DATE, TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE, \n" +
"TASK.SORTING_DATE, TASK.QUALITY_TEST_DATE\n" +
"UNION all \n" +
"select TASK.TASK_ID,COUNTY_DIC.COUNTYNAME,COUNTY_DIC.COUNTY_CODE,\n" +
"CARD_TYPE_DIC.CARD_TYPE,CARD_TYPE_DIC.CARD_TYPE_ID,TASK.ISSUED_DATE,\n" +
"TASK.PRINT_OUT_DATE,TASK.POSITION_DATE,TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE,\n" +
"TASK.SORTING_DATE,TASK.QUALITY_TEST_DATE,count(SPECIAL_CARD.ACCEPT_NO) valid_count\n" +
"from TASK \n" +
"LEFT JOIN COUNTY_DIC ON TASK.COUNTY_CODE =COUNTY_DIC.COUNTY_CODE \n" +
"LEFT JOIN SPECIAL_CARD on SPECIAL_CARD.TASK_ID = TASK.TASK_ID\n" +
"LEFT JOIN CARD_TYPE_DIC ON TASK.CARD_TYPE = CARD_TYPE_DIC.CARD_TYPE_ID \n" +
"WHERE GROUP_NO.GROUP_NO =#{id} \n" +
"group by TASK.TASK_ID, COUNTY_DIC.COUNTYNAME, COUNTY_DIC.COUNTY_CODE, CARD_TYPE_DIC.CARD_TYPE, CARD_TYPE_DIC.CARD_TYPE_ID, \n" +
"TASK.ISSUED_DATE, TASK.PRINT_OUT_DATE, TASK.POSITION_DATE, TASK.CONCORA_CRUSH_DATE, TASK.PUNCHING_DATE, \n" +
"TASK.SORTING_DATE, TASK.QUALITY_TEST_DATE")
public List<Map<String,Object>> selectByGroupNo(String id);
......
......@@ -2,7 +2,7 @@
提示
</div>
<div class="ui-dialog-content">
<div>确认删除{{startDate}}到{{endDate}}导入的{{total}}条记录吗?</div>
<div>确认删除<span ng-if="startDate">{{startDate}}到{{endDate}}导入的</span>{{total}}条记录吗?</div>
</div>
<div class="ui-dialog-confirm">
<button type="submit" class="btn btn-info" ng-click="confirmDelete()">确认删除</button>
......
......@@ -225,6 +225,7 @@ angular.module('AvatarCheck', [
}
$scope.addQuickCardProd = function(){
console.log($scope.searchResult.workOrderData[0].CARD_TYPE_ID)
if($(".prod:checked").length>0){
var idx = $(".prod:checked").val();
var check = idx.split("+");
......
......@@ -350,6 +350,7 @@ angular.module('AvatarCheck.http', ['ngDialog', 'LocalStorageModule'])
if(angular.isUndefined(oldPackageName)){
oldPackageName='';
}
console.log(oldPackageName,date)
$http({
method: 'GET',
url: "../LogApi/selectAnalysisLogCount"+urlTimeStamp(),
......@@ -365,6 +366,7 @@ angular.module('AvatarCheck.http', ['ngDialog', 'LocalStorageModule'])
if(angular.isUndefined(oldPackageName)){
oldPackageName='';
}
console.log(oldPackageName,date,currentPage,itemsPerPage)
$http({
method: 'GET',
url: "../LogApi/selectByAnalysisLog"+urlTimeStamp(),
......
......@@ -43,7 +43,7 @@
<div class="input-group-addon">
<i class="fa fa-calendar"></i>
</div>
<input type="text" class="form-control pull-right" ng-value="choseDate" id="datepicker" readonly/>
<input type="text" class="form-control pull-right" id="datepicker" readonly/>
<span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
</div>
</td>
......@@ -75,8 +75,8 @@
<td>{{item.FILE_NAME}}</td>
<td>{{item.ANALYSIS_DATE | myDateFilter}}</td>
<td>{{item.RECORD_NUMBER}}</td>
<td>{{item.PUCOUNT}}</td>
<td>{{item.YOUCOUNT}}</td>
<td>{{item.COMMON_CARD_COUNT}}</td>
<td>{{item.POST_CARD_COUNT}}</td>
</tr>
</tbody>
......
......@@ -24,7 +24,7 @@ angular.module('AvatarCheck.analysisLog', ['ngRoute', 'AvatarCheck.http', 'tm.pa
$($($(this).parent()).prev()).val("");
})
// $scope.choseDate = $filter("date")(new Date(), "yyyy-MM-dd");
$scope.paginationConf = {
currentPage: 1,
......
......@@ -48,7 +48,7 @@
<td><input type="text" class="form-control" ng-model="sljg" placeholder="受理机关"></td>
<td>制证类型:</td>
<td style="text-align: left;">
<select class="form-control select2" id="county" ng-model="typeCode">
<select class="form-control select2" id="cardType">
<option value="">--请选择制证类型--</option>
<option value="{{type.cardTypeId}}" ng-repeat="type in typeList">{{type.cardType}}</option>
</select>
......
......@@ -85,6 +85,7 @@ angular.module('AvatarCheck.cardProdPackage', ['ngRoute', 'AvatarCheck.http', 't
var getCountAndDownloadUrl = function (url) {
var date = $("#datepicker").val();
var packageType = $("#packageType").val();
var cardType=$("#cardType").val();
if(angular.isUndefined($scope.uploadNo)){
url = url + 'uploadNo=&';
}else{
......@@ -110,10 +111,10 @@ angular.module('AvatarCheck.cardProdPackage', ['ngRoute', 'AvatarCheck.http', 't
}else{
url = url + 'SSXQDM=' + $scope.sljg + '&';
}
if(angular.isUndefined($scope.typeCode)){
if(cardType==''){
url = url + 'cardType=&';
}else{
url = url + 'cardType=' + $scope.typeCode + '&';
url = url + 'cardType=' + cardType + '&';
}
if(angular.isUndefined(packageType)){
url = url + 'state=&';
......@@ -121,8 +122,7 @@ angular.module('AvatarCheck.cardProdPackage', ['ngRoute', 'AvatarCheck.http', 't
url = url + 'state=' + packageType + '&';
}
if (date==''){
date=$filter("date")(new Date(), "yyyy-MM-dd");
url = url + 'uploadDate=' + date + '&';
url = url + 'uploadDate=&';
}else{
url = url + 'uploadDate=' + date + '&';
}
......@@ -133,6 +133,7 @@ angular.module('AvatarCheck.cardProdPackage', ['ngRoute', 'AvatarCheck.http', 't
var a = document.createElement("a");
document.body.appendChild(a);
a.href = encodeURI(getCountAndDownloadUrl(url));
console.log(encodeURI(getCountAndDownloadUrl(url)))
a.click();
}
......
......@@ -99,37 +99,36 @@ angular.module('AvatarCheck.cardProdUpdate', ['ngRoute', 'AvatarCheck.http'])
if(angular.isUndefined(pcs_name)){
pcs_name='';
}
if(startDate==''){
startDate=$filter("date")(new Date(), "yyyy-MM-dd");
}
if(endDate==''){
endDate=$filter("date")(new Date(), "yyyy-MM-dd");
}
ngDialog.open({
template: 'dialogs/confirmDeleteProdCards.html' + urlTimeStamp(),
width: 600,
cache: false,
closeByDocument:false,
controller: ['$scope', function ($scope) {
$scope.startDate = startDate;
$scope.endDate = endDate;
HttpService.selectXmlDataCount(startPackageNo,endPackageNo,pcs_name,startDate,endDate,function(data){
$scope.total=data;
console.log($scope.total,"count")
})
$scope.confirmDelete = function () {
HttpService.deleteProdCards(startPackageNo,endPackageNo,pcs_name,startDate,endDate, function (data) {
if(data){
MessageService.showAlert("删除成功");
$scope.closeThisDialog();
reGet();
}else{
MessageService.showAlert("删除失败")
}
if((startDate!=''&&endDate=='')||(endDate!=''&&startDate=='')) {
MessageService.showAlert("请选择起始日期和结束日期")
}else{
ngDialog.open({
template: 'dialogs/confirmDeleteProdCards.html' + urlTimeStamp(),
width: 600,
cache: false,
closeByDocument:false,
controller: ['$scope', function ($scope) {
$scope.startDate = startDate;
$scope.endDate = endDate;
HttpService.selectXmlDataCount(startPackageNo,endPackageNo,pcs_name,startDate,endDate,function(data){
$scope.total=data;
console.log($scope.total,"count")
})
};
$scope.confirmDelete = function () {
HttpService.deleteProdCards(startPackageNo,endPackageNo,pcs_name,startDate,endDate, function (data) {
if(data){
MessageService.showAlert("删除成功");
$scope.closeThisDialog();
reGet();
}else{
MessageService.showAlert("删除失败")
}
})
};
}]
});
}
}]
});
}
});
\ No newline at end of file
......@@ -31,6 +31,7 @@ angular.module('AvatarCheck.createTaskList', ['ngRoute', 'AvatarCheck.http', 'tm
$scope.isHistory=0;
$scope.searchCurrent = function(){
$rootScope.cardsTotal = 0;
$scope.isHistory=0;
HttpService.getTaskListToCreate($('#datepicker').val(),function(data){
$scope.cycleSheetData = data;
......@@ -232,6 +233,7 @@ angular.module('AvatarCheck.createTaskList', ['ngRoute', 'AvatarCheck.http', 'tm
$scope.searchCurrent();
$scope.selected=[];
$rootScope.selectedGroup=[];
$rootScope.cardsTotal = 0;
})
}else{
MessageService.showAlert("请选择创建任务单的组")
......
......@@ -27,7 +27,7 @@
</ul>
</a>
</li>
<li class="pull-right" style="padding-right: 20px;"><h5>已选择数量:{{cardsTotal}}</h5></li>
<li class="pull-right" style="padding-right: 20px;"><h4>已选择数量:{{cardsTotal}}</h4></li>
</ul>
</div>
<div ng-repeat="type in cycleSheetData track by $index" class="table-responsive mailbox-messages" ng-show="currentTab==$index">
......
......@@ -24,8 +24,10 @@ angular.module('AvatarCheck.dispatchTask', ['ngRoute', 'AvatarCheck.http', 'tm.p
$scope.choseDate = $filter("date")(new Date(), "yyyy-MM-dd");
$scope.isHistory=0;
$scope.searchTaskList = function(){
$rootScope.cardsTotal = 0;
$scope.isHistory=0;
HttpService.getTaskListByProcess(function(data){
$scope.cycleSheetData = data;
......@@ -178,6 +180,7 @@ angular.module('AvatarCheck.dispatchTask', ['ngRoute', 'AvatarCheck.http', 'tm.p
HttpService.updateTaskListProcess(json,function(data){
$scope.searchTaskList();
MessageService.showAlert("下发完成")
$rootScope.cardsTotal = 0;
})
}else{
MessageService.showAlert("请选择下发的任务单")
......
......@@ -30,8 +30,25 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
$scope.choseDate = $filter("date")(new Date(), "yyyy-MM-dd");
$scope.paginationConf = {
currentPage: 1,
itemsPerPage: 10,
perPageOptions: [10, 20, 30, 40, 50]
};
$scope.getXmlPackage = function(){
if($scope.paginationConf.currentPage==0){
$scope.paginationConf.currentPage=1;
}
HttpService.selectXmlPackage($("#datepicker").val(),$scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage,function(data){
$scope.paginationConf.totalItems=data.respData.count;
$scope.xmlPackageData = data.respData.mapList;
console.log($scope.xmlPackageData,"$scope.xmlPackageData")
})
}
// 通过$watch currentPage和itemperPage 当他们一变化的时候,重新获取数据条目
$scope.$watch('paginationConf.currentPage +paginationConf.itemsPerPage', $scope.getXmlPackage);
var getData = $scope.getXmlPackage;
$scope.analysis = function (uploadDate,packageCount) {
ngDialog.open({
template: 'dialogs/analysisDialog.html' + urlTimeStamp(),
......@@ -48,7 +65,9 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
console.log(uploadDate)
HttpService.analyseToUpdateIfPostCard(fileid,uploadDate,function(data){
if(data){
$scope.closeThisDialog();
MessageService.showAlert("解析完成")
getData();
}
})
}
......@@ -66,7 +85,6 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
for(var i in files){
fd.append('file', files[i]);
}
var getData = $scope.getXmlPackage;
ngDialog.openConfirm({
template: 'dialogs/alert.html' + urlTimeStamp(),
width: 600,
......@@ -89,23 +107,7 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
}
$scope.paginationConf = {
currentPage: 1,
itemsPerPage: 10,
perPageOptions: [10, 20, 30, 40, 50]
};
$scope.getXmlPackage = function(){
if($scope.paginationConf.currentPage==0){
$scope.paginationConf.currentPage=1;
}
HttpService.selectXmlPackage($("#datepicker").val(),$scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage,function(data){
$scope.paginationConf.totalItems=data.respData.count;
$scope.xmlPackageData = data.respData.mapList;
console.log($scope.xmlPackageData,"$scope.xmlPackageData")
})
}
// 通过$watch currentPage和itemperPage 当他们一变化的时候,重新获取数据条目
$scope.$watch('paginationConf.currentPage +paginationConf.itemsPerPage', $scope.getXmlPackage);
var reGet = $scope.getXmlPackage;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment