Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
Y
YX_IDENT_beijing_auxiliary_YD
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangyusheng
YX_IDENT_beijing_auxiliary_YD
Commits
6c885d7a
Commit
6c885d7a
authored
Mar 08, 2019
by
suichenguang
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into dev
parents
3d24c563
a20cc3be
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
184 additions
and
88 deletions
+184
-88
TaskListApi.java
src/main/java/com/yxproject/start/api/TaskListApi.java
+0
-0
TaskListMapper.java
src/main/java/com/yxproject/start/mapper/TaskListMapper.java
+3
-3
TaskListService.java
...ain/java/com/yxproject/start/service/TaskListService.java
+2
-2
TaskListServiceImpl.java
...com/yxproject/start/service/impl/TaskListServiceImpl.java
+11
-3
analysisDialog.html
src/main/resources/static/dialogs/analysisDialog.html
+16
-2
app.js
src/main/resources/static/js/app.js
+2
-5
service.js
src/main/resources/static/js/service.js
+38
-0
analysisLog.js
src/main/resources/static/views/analysisLog/analysisLog.js
+2
-0
createTaskList.js
...n/resources/static/views/createTaskList/createTaskList.js
+6
-1
dispatchTask.js
src/main/resources/static/views/dispatchTask/dispatchTask.js
+75
-60
login.js
src/main/resources/static/views/login/login.js
+8
-8
packageLog.js
src/main/resources/static/views/packageLog/packageLog.js
+2
-1
xmlAndSearch.js
src/main/resources/static/views/xmlAndSearch/xmlAndSearch.js
+19
-3
No files found.
src/main/java/com/yxproject/start/api/TaskListApi.java
View file @
6c885d7a
This diff is collapsed.
Click to expand it.
src/main/java/com/yxproject/start/mapper/TaskListMapper.java
View file @
6c885d7a
...
...
@@ -144,7 +144,7 @@ public interface TaskListMapper {
"left join COUNTY_DIC on COUNTY_DIC.COUNTY_CODE = task.COUNTY_CODE\n"
+
"left join (select task_id, nvl(count(*),0) faileCount from FAILED_CARD group by task_id ) fc on fc.TASK_ID = task.TASK_ID\n"
+
"where task.TASK_STATE_ID = #{process}"
)
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_common
(
@Param
(
"process"
)
Stri
ng
process
);
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_common
(
@Param
(
"process"
)
lo
ng
process
);
/**
* 循环单查询
...
...
@@ -159,7 +159,7 @@ public interface TaskListMapper {
"left join COUNTY_DIC on COUNTY_DIC.COUNTY_CODE = task.COUNTY_CODE\n"
+
"left join (select task_id,nvl(count(*),0) faileCount from FAILED_CARD group by task_id ) fc on fc.TASK_ID = task.TASK_ID\n"
+
"where SPECIAL_CARD.SPECIAL_TYPE =2 and task.TASK_STATE_ID = #{process}"
)
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_fast
(
@Param
(
"process"
)
Stri
ng
process
);
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_fast
(
@Param
(
"process"
)
lo
ng
process
);
/**
* 循环单查询
...
...
@@ -174,7 +174,7 @@ public interface TaskListMapper {
"left join COUNTY_DIC on COUNTY_DIC.COUNTY_CODE = task.COUNTY_CODE\n"
+
"left join (select task_id,nvl(count(*),0) faileCount from FAILED_CARD group by task_id ) fc on fc.TASK_ID = task.TASK_ID\n"
+
"where SPECIAL_CARD.SPECIAL_TYPE =1 and task.TASK_STATE_ID = #{process}"
)
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_remaind
(
@Param
(
"process"
)
Stri
ng
process
);
public
List
<
Map
<
String
,
Object
>>
selectByCountyAtAuxiliary_remaind
(
@Param
(
"process"
)
lo
ng
process
);
...
...
src/main/java/com/yxproject/start/service/TaskListService.java
View file @
6c885d7a
...
...
@@ -18,13 +18,13 @@ public interface TaskListService {
public
boolean
createTaskList
(
List
<
TaskListEntity
>
resultMap
);
public
boolean
updateState
(
String
taskId
,
String
process
,
String
name
);
public
boolean
updateState
(
List
<
String
>
list
,
String
process
,
String
name
);
public
List
<
Object
>
selectByCountyAtACCU
(
String
date
);
public
Map
<
String
,
Object
>
selectByGroupNoAtACCU
(
String
date
,
String
typeCode
,
String
countyCode
,
long
currPage
,
long
pageSize
);
public
List
<
Object
>
selectByCountyAtAuxiliary
(
Stri
ng
process
);
public
List
<
Object
>
selectByCountyAtAuxiliary
(
lo
ng
process
);
public
List
<
Object
>
selectGroupAtACCU
(
String
date
,
String
typeCode
,
String
countyCode
);
...
...
src/main/java/com/yxproject/start/service/impl/TaskListServiceImpl.java
View file @
6c885d7a
...
...
@@ -12,6 +12,7 @@ import com.yxproject.start.service.TaskListService;
import
org.apache.ibatis.annotations.Mapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.jws.Oneway
;
import
java.util.ArrayList
;
...
...
@@ -52,7 +53,9 @@ public class TaskListServiceImpl implements TaskListService {
}
@Override
public
boolean
updateState
(
String
taskId
,
String
process
,
String
name
)
{
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
boolean
updateState
(
List
<
String
>
list
,
String
process
,
String
name
)
{
for
(
String
taskId:
list
)
{
switch
(
process
){
case
"1"
:
taskListMapper
.
updateState1
(
taskId
,
process
,
name
);
...
...
@@ -78,6 +81,8 @@ public class TaskListServiceImpl implements TaskListService {
default
:
break
;
}
}
return
true
;
}
...
...
@@ -209,7 +214,8 @@ public class TaskListServiceImpl implements TaskListService {
* @return
*/
@Override
public
List
<
Object
>
selectByCountyAtAuxiliary
(
String
process
)
{
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
List
<
Object
>
selectByCountyAtAuxiliary
(
long
process
)
{
//查询普通组号列表 在辅助库中
List
<
Map
<
String
,
Object
>>
mapList_common
=
taskListMapper
.
selectByCountyAtAuxiliary_common
(
process
);
//查询快证组号列表 在辅助库中
...
...
@@ -258,6 +264,7 @@ public class TaskListServiceImpl implements TaskListService {
* @return
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
boolean
saveTask
(
TaskEntity
taskEntity
)
{
return
taskListMapper
.
saveTask
(
taskEntity
);
}
...
...
@@ -268,6 +275,7 @@ public class TaskListServiceImpl implements TaskListService {
* @return
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
boolean
saveTask
(
List
<
Object
>
list
,
String
submitName
,
String
process
)
{
Map
<
String
,
Object
>
stringObjectMap
=(
Map
<
String
,
Object
>)
list
.
get
(
0
);
TaskEntity
taskEntity
=
new
TaskEntity
();
...
...
@@ -342,7 +350,7 @@ public class TaskListServiceImpl implements TaskListService {
Map
<
String
,
Object
>
typemap
=
new
LinkedHashMap
<>();
for
(
Map
<
String
,
Object
>
o:
mapList
){
if
(
typemap
!=
null
&&
typemap
.
containsKey
(
o
.
get
(
"TASK_ID"
)+
""
)){
List
<
Map
<
String
,
Object
>>
maplist_county
=
(
List
<
Map
<
String
,
Object
>>)
typemap
.
get
(
o
.
get
(
"TASK_ID"
));
List
<
Map
<
String
,
Object
>>
maplist_county
=
(
List
<
Map
<
String
,
Object
>>)
typemap
.
get
(
o
.
get
(
"TASK_ID"
)
+
""
);
maplist_county
.
add
(
o
);
typemap
.
put
(
o
.
get
(
"TASK_ID"
)+
""
,
maplist_county
);
}
else
{
...
...
src/main/resources/static/dialogs/analysisDialog.html
View file @
6c885d7a
...
...
@@ -15,7 +15,18 @@
</tr>
</thead>
<tbody>
<tr
>
<tr
ng-repeat=
"item in resultData"
>
<td>
{{$index+1}}
</td>
<td>
2019-03-04 15:08
</td>
<td>
格口文件.xls
</td>
<td>
400
</td>
<td>
2019-03-01
</td>
<td>
2019-03-03
</td>
<td
ng-click=
""
>
<button
class=
"btn"
>
解析
</button>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
2019-03-04 15:08
</td>
<td>
格口文件.xls
</td>
...
...
@@ -66,12 +77,15 @@
2019-03-03
</td>
<td
ng-click=
""
>
<button
class=
"btn"
>
解析
</button>
<button
class=
"btn"
ng-click=
"doAnalyse()"
>
解析
</button>
</td>
</tr>
</tbody>
</table>
<div
style=
"padding-left: 27%;"
>
<tm-pagination
conf=
"paginationConf"
class=
"ul"
></tm-pagination>
</div>
</div>
<div
class=
"ui-dialog-confirm"
>
<div
class=
"progress"
>
...
...
src/main/resources/static/js/app.js
View file @
6c885d7a
...
...
@@ -82,9 +82,6 @@ angular.module('AvatarCheck', [
if
(
$location
.
path
()
==
"/xmlAndSearch"
)
{
$rootScope
.
tab
=
'/xmlAndSearch'
;
}
if
(
$location
.
path
()
==
"/cardProdUpdate"
)
{
$rootScope
.
tab
=
'/cardProdUpdate'
;
}
if
(
$location
.
path
()
==
"/uploadExcelAndSearch"
)
{
$rootScope
.
tab
=
'/uploadExcelAndSearch'
;
}
...
...
@@ -138,10 +135,10 @@ angular.module('AvatarCheck', [
$
(
"body"
).
addClass
(
"sidebar-collapse"
);
}
if
(
$location
.
path
()
==
"/analysisLog"
)
{
$rootScope
.
tab
=
'/
cardProdUpdate
'
;
$rootScope
.
tab
=
'/
analysisLog
'
;
}
if
(
$location
.
path
()
==
"/packageLog"
)
{
$rootScope
.
tab
=
'/
cardProdUpdate
'
;
$rootScope
.
tab
=
'/
packageLog
'
;
}
...
...
src/main/resources/static/js/service.js
View file @
6c885d7a
...
...
@@ -431,12 +431,14 @@ angular.module('AvatarCheck.http', ['ngDialog', 'LocalStorageModule'])
},
createTask
:
function
(
data
,
success
){
var
body
=
JSON
.
stringify
(
data
);
console
.
log
(
"data:"
,
body
)
$http
({
method
:
'POST'
,
url
:
"../TaskList/createTask"
,
data
:
body
,
headers
:
{
'Content-Type'
:
'application/json'
}
}).
then
(
function
successCallback
(
response
)
{
console
.
log
(
response
.
data
)
success
(
response
.
data
)
})
},
...
...
@@ -461,6 +463,41 @@ angular.module('AvatarCheck.http', ['ngDialog', 'LocalStorageModule'])
}).
then
(
function
successCallback
(
response
)
{
succuss
(
response
.
data
)
})
},
getTaskListByProcess
:
function
(
success
){
$http
({
method
:
'GET'
,
url
:
"../TaskList/queryByCountyAtAuxiliary"
+
urlTimeStamp
(),
params
:{
process
:
$rootScope
.
loginData
.
roleList
[
0
].
process
}
}).
then
(
function
successCallback
(
response
)
{
success
(
response
.
data
)
})
},
analyseData
:
function
(
date
,
currPage
,
pageSize
,
success
){
$http
({
method
:
'GET'
,
url
:
"../importXML/queryPersonXML"
+
urlTimeStamp
(),
params
:{
importDate
:
date
,
currPage
:
currPage
,
pageSize
:
pageSize
}
}).
then
(
function
successCallback
(
response
)
{
success
(
response
.
data
)
})
},
analyseDataCount
:
function
(
date
,
success
)
{
$http
({
method
:
'GET'
,
url
:
"../importXML/queryPersonXMLCount"
+
urlTimeStamp
(),
params
:{
importDate
:
date
}
}).
then
(
function
successCallback
(
response
)
{
success
(
response
.
data
)
})
}
}
});
\ No newline at end of file
src/main/resources/static/views/analysisLog/analysisLog.js
View file @
6c885d7a
...
...
@@ -33,10 +33,12 @@ angular.module('AvatarCheck.analysisLog', ['ngRoute', 'AvatarCheck.http', 'tm.pa
$scope
.
getAnalyseLog
=
function
(){
HttpService
.
selectAnalyseLogCount
(
$scope
.
oldPackageName
,
$
(
"#datepicker"
).
val
(),
function
(
data
)
{
console
.
log
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
())
$scope
.
paginationConf
.
totalItems
=
data
;
console
.
log
(
$scope
.
paginationConf
.
totalItems
)
})
HttpService
.
selectAnalyseLog
(
$scope
.
oldPackageName
,
$
(
"#datepicker"
).
val
(),
$scope
.
paginationConf
.
currentPage
,
$scope
.
paginationConf
.
itemsPerPage
,
function
(
data
){
console
.
log
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
())
$scope
.
analyseLog
=
data
;
console
.
log
(
$scope
.
analyseLog
)
})
...
...
src/main/resources/static/views/createTaskList/createTaskList.js
View file @
6c885d7a
...
...
@@ -41,6 +41,9 @@ angular.module('AvatarCheck.createTaskList', ['ngRoute', 'AvatarCheck.http', 'tm
}
$scope
.
searchCurrent
();
var
reGet
=
function
()
{
$scope
.
searchCurrent
();
}
$scope
.
currentTab
=
0
;
$scope
.
func
=
function
(
index
)
{
...
...
@@ -155,9 +158,11 @@ angular.module('AvatarCheck.createTaskList', ['ngRoute', 'AvatarCheck.http', 'tm
groupList
:
groupList
,
tag
:
0
}
console
.
log
(
map
)
HttpService
.
createTask
(
map
,
function
(
data
){
MessageService
.
showAlert
(
"创建成功"
)
$scope
.
searchCurrent
();
console
.
log
(
reGet
)
reGet
();
})
}
...
...
src/main/resources/static/views/dispatchTask/dispatchTask.js
View file @
6c885d7a
...
...
@@ -22,69 +22,84 @@ angular.module('AvatarCheck.dispatchTask', ['ngRoute', 'AvatarCheck.http', 'tm.p
$scope
.
choseDate
=
$filter
(
"date"
)(
new
Date
(),
"yyyy-MM-dd"
);
$scope
.
cycleSheetData
=
[
{
typeCode
:
'1'
,
typeName
:
'普通证'
,
typeSum
:
300
,
isActive
:
'true'
,
countyList
:
[
{
saveDate
:
'20190228'
,
county
:
'朝阳区'
,
groupCount
:
5
,
groupNo
:
'00234653-03687587'
,
valid
:
240
,
invalid
:
0
,
state
:
'未下发'
},
{
saveDate
:
'20190228'
,
county
:
'海淀区'
,
groupCount
:
6
,
groupNo
:
'00234653-03687588'
,
valid
:
280
,
invalid
:
2
,
state
:
'未下发'
},
{
saveDate
:
'20190228'
,
county
:
'海淀区'
,
groupCount
:
6
,
groupNo
:
'00234653-03687588'
,
valid
:
280
,
invalid
:
2
,
state
:
'未下发'
$scope
.
searchTaskList
=
function
(){
HttpService
.
getTaskListByProcess
(
function
(
data
){
$scope
.
cycleSheetData
=
data
;
for
(
var
i
=
0
;
i
<
$scope
.
cycleSheetData
.
length
;
i
++
){
if
(
i
==
$scope
.
currentTab
){
$scope
.
cycleSheetData
[
i
].
isActive
=
true
;
}
else
{
$scope
.
cycleSheetData
[
i
].
isActive
=
false
;
}
]
},
{
typeCode
:
'9'
,
typeName
:
'邮寄证'
,
typeSum
:
500
,
isActive
:
'false'
,
countyList
:
[
{
saveDate
:
'20190228'
,
county
:
'朝阳区'
,
groupCount
:
5
,
groupNo
:
'00234653-03687587'
,
valid
:
240
,
invalid
:
0
,
state
:
'未下发'
},
{
saveDate
:
'20190228'
,
county
:
'海淀区'
,
groupCount
:
6
,
groupNo
:
'00234653-03687588'
,
valid
:
280
,
invalid
:
2
,
state
:
'未下发'
}
]
console
.
log
(
$scope
.
cycleSheetData
)
})
}
]
$scope
.
searchTaskList
();
// $scope.cycleSheetData = [
// {
// typeCode: '1',
// typeName: '普通证',
// typeSum: 300,
// isActive: 'true',
// countyList: [
// {
// saveDate: '20190228',
// county: '朝阳区',
// groupCount:5,
// groupNo: '00234653-03687587',
// valid: 240,
// invalid: 0,
// state:'未下发'
// },
// {
// saveDate: '20190228',
// county: '海淀区',
// groupCount:6,
// groupNo: '00234653-03687588',
// valid: 280,
// invalid: 2,
// state:'未下发'
// },
// {
// saveDate: '20190228',
// county: '海淀区',
// groupCount:6,
// groupNo: '00234653-03687588',
// valid: 280,
// invalid: 2,
// state:'未下发'
// }
// ]
// },
// {
// typeCode: '9',
// typeName: '邮寄证',
// typeSum: 500,
// isActive: 'false',
// countyList: [
// {
// saveDate: '20190228',
// county: '朝阳区',
// groupCount:5,
// groupNo: '00234653-03687587',
// valid: 240,
// invalid: 0,
// state:'未下发'
// },
// {
// saveDate: '20190228',
// county: '海淀区',
// groupCount:6,
// groupNo: '00234653-03687588',
// valid: 280,
// invalid: 2,
// state:'未下发'
// }
// ]
// }
// ]
$scope
.
currentTab
=
0
;
$scope
.
func
=
function
(
index
)
{
for
(
var
idx
in
$scope
.
cycleSheetData
)
{
...
...
src/main/resources/static/views/login/login.js
View file @
6c885d7a
...
...
@@ -42,23 +42,23 @@ angular.module('AvatarCheck.login', ['ngRoute', 'AvatarCheck.http'])
$location
.
path
(
"/taskListPreLocating"
);
$rootScope
.
tab
=
'/taskListPreLocating'
;
break
;
case
4
:
case
6
:
$location
.
path
(
"/taskListSorting"
);
$rootScope
.
tab
=
'/taskListSorting'
;
break
;
case
5
:
$location
.
path
(
"/taskListQualityCheck"
);
$rootScope
.
tab
=
'/taskListQualityCheck'
;
break
;
case
6
:
$location
.
path
(
"/receitp"
);
$rootScope
.
tab
=
'/receitp'
;
case
4
:
break
;
case
7
:
$location
.
path
(
"/
uploadExcelAndSearch
"
);
$rootScope
.
tab
=
'/
uploadExcelAndSearch
'
;
$location
.
path
(
"/
receitp
"
);
$rootScope
.
tab
=
'/
receitp
'
;
break
;
case
8
:
$location
.
path
(
"/searchCardMsg"
);
$rootScope
.
tab
=
'/searchCardMsg'
;
break
;
case
9
:
$location
.
path
(
"/createTaskList"
);
$rootScope
.
tab
=
'/createTaskList'
;
break
;
...
...
src/main/resources/static/views/packageLog/packageLog.js
View file @
6c885d7a
...
...
@@ -35,11 +35,12 @@ angular.module('AvatarCheck.packageLog', ['ngRoute', 'AvatarCheck.http', 'tm.pag
$scope
.
getPackageLog
=
function
(){
HttpService
.
selectPackageLogCount
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
(),
$scope
.
county
,
function
(
data
)
{
console
.
log
(
data
)
console
.
log
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
()
)
$scope
.
paginationConf
.
totalItems
=
data
;
console
.
log
(
$scope
.
paginationConf
.
totalItems
)
})
HttpService
.
selectPackageLog
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
(),
$scope
.
county
,
$scope
.
paginationConf
.
currentPage
,
$scope
.
paginationConf
.
itemsPerPage
,
function
(
data
){
console
.
log
(
$scope
.
newPackageName
,
$scope
.
idCard
,
$
(
'#datepicker'
).
val
())
$scope
.
packageLogData
=
data
;
console
.
log
(
$scope
.
packageLogData
)
})
...
...
src/main/resources/static/views/xmlAndSearch/xmlAndSearch.js
View file @
6c885d7a
...
...
@@ -33,14 +33,30 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
$scope
.
analysis
=
function
(
uploadDate
,
packageCount
)
{
ngDialog
.
open
({
template
:
'dialogs/analysisDialog.html'
+
urlTimeStamp
(),
width
:
876
,
cache
:
false
,
controller
:
[
'$scope'
,
function
(
$scope
)
{
controller
:
[
'$scope'
,
'HttpService'
,
function
(
$scope
,
HttpService
)
{
$scope
.
paginationConf
=
{
currentPage
:
1
,
itemsPerPage
:
10
,
perPageOptions
:
[
10
,
20
,
30
,
40
,
50
]
};
$scope
.
upDate
=
uploadDate
;
$scope
.
upCount
=
packageCount
;
$scope
.
getAnalyseData
=
function
()
{
HttpService
.
analyseDataCount
(
uploadDate
,
function
(
data
)
{
$scope
.
paginationConf
.
totalItems
=
data
.
respData
.
string
;
console
.
log
(
$scope
.
paginationConf
.
totalItems
)
})
HttpService
.
analyseData
(
uploadDate
,
$scope
.
paginationConf
.
currentPage
,
$scope
.
paginationConf
.
itemsPerPage
,
function
(
data
)
{
$scope
.
resultData
=
data
;
console
.
log
(
$scope
.
resultData
)
})
}
// 通过$watch currentPage和itemperPage 当他们一变化的时候,重新获取数据条目
$scope
.
$watch
(
'paginationConf.currentPage +paginationConf.itemsPerPage'
,
$scope
.
getAnalyseData
);
}]
});
...
...
@@ -61,12 +77,12 @@ angular.module('AvatarCheck.xmlAndSearch', ['ngRoute', 'AvatarCheck.http', 'tm.p
}
}
$scope
.
paginationConf
=
{
currentPage
:
1
,
itemsPerPage
:
10
,
perPageOptions
:
[
10
,
20
,
30
,
40
,
50
]
};
$scope
.
getXmlPackage
=
function
(){
console
.
log
(
$
(
"#datepicker"
).
val
())
HttpService
.
selectXmlPackageCount
(
$
(
"#datepicker"
).
val
(),
function
(
data
){
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment