Commit 7cdd81f0 by 蒋勇

d

parent b59a9361
const TaskBase=require("../../task.base"); const TaskBase=require("../../task.base");
var excel = require('exceljs');
const system = require("../../../system");
class ParseRptTask extends TaskBase{ class ParseRptTask extends TaskBase{
constructor(){ constructor(){
super(TaskBase.getServiceName(ParseRptTask)); super(TaskBase.getServiceName(ParseRptTask));
this.cacheData=[]; this.cacheData=[];
this.ossC=system.getObject("util.ossClient");
} }
async subBeforeTask(params){ async subBeforeTask(params){
console.log("前置操作......",this.serviceName); console.log("前置操作......",this.serviceName);
...@@ -15,11 +18,25 @@ class ParseRptTask extends TaskBase{ ...@@ -15,11 +18,25 @@ class ParseRptTask extends TaskBase{
if(x){ if(x){
this.cacheData.push(x); this.cacheData.push(x);
} }
setImmediate(()=>{ setImmediate(async ()=>{
await this.paseXls(); await this.parseXls();
}); });
} }
async paseXls(){ //读取模板文件
async readxls(path) {
var promise = new Promise((resv, rej) => {
var workbook = new excel.Workbook();
workbook.properties.date1904 = true;
workbook.xlsx.readFile(path)
.then(function () {
return resv(workbook);
}).catch(function (e) {
return rej(e);
});
});
return promise;
}
async parseXls(){
var pv=this.cacheData.pop(); var pv=this.cacheData.pop();
if(pv){ if(pv){
var tohandleurls=pv.split("~"); var tohandleurls=pv.split("~");
...@@ -27,9 +44,16 @@ class ParseRptTask extends TaskBase{ ...@@ -27,9 +44,16 @@ class ParseRptTask extends TaskBase{
var rptCode=tohandleurls[1]; var rptCode=tohandleurls[1];
var urldownload=tohandleurls[2]; var urldownload=tohandleurls[2];
//下载文件 //下载文件
var keyindex=urldownload.lastIndexOf("/");
var keystr=urldownload.substring(keyindex+1);
var result= await this.ossC.downfile(keystr);
var localpath="/tmp/"+keystr;
var wb= await this.readxls(localpath);
var parserByCode=require("./rptHandler/"+rptCode);
var rows=await parserByCode(wb);
console.log(JSON.stringify(rows));
this.parseXls();
this.paseXls();
} }
} }
async subDoTask(params){ async subDoTask(params){
......
module.exports =(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=10 && rowNumber<=47){
console.log(rowNumber,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..");
var rowDesc="";
var cacheStr="";
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==2){
if(typeof cell.value=="object"){
cell.value.richText.forEach(element => {
rowDesc+=element.text;
});
}else{
rowDesc+=cell.value;
}
cacheStr=rowDesc;
}
if(colNumber==19 || colNumber==26 || colNumber==36 || colNumber==40){
var colPos=1;
var buildRow={};
if(colNumber==19 || colNumber==26){
rowDesc=rowDesc+"/"+"一般项目";
}
if(colNumber==36 || colNumber==40){
rowDesc=rowDesc+"/"+"即征即退项目";
}
if(colNumber==19){
rowDesc+="/"+"本月数";
colPos=1;
}
if(colNumber==26){
rowDesc+="/"+"本年累计";
colPos=2;
}
if(colNumber==36){
rowDesc+="/"+"本月数";
colPos=3;
}
if(colNumber==40){
rowDesc+="/"+"本年累计";
colPos=4;
}
buildRow.rpttypecode="GT";
buildRow.position=rowNumber+"-"+colPos;
buildRow.desc=rowDesc;
buildRow.valstr=cell.value;
insertrows.push(buildRow);
rowDesc=cacheStr;
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports = (async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 13 && rowNumber <= 27) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 11) {
var buildRow = {};
buildRow.rpttypecode = "ITQ";
buildRow.valstr = cell.value;
buildRow.desc = desc + "/本年累计金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
if (rowNumber >= 29 && rowNumber <= 34) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 4) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 11) {
var buildRow = {};
buildRow.rpttypecode = "ITQ";
buildRow.valstr = cell.value;
buildRow.desc = desc + "/本年累计金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
if (rowNumber >= 39 && rowNumber <= 40) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 1) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 5) {
var buildRow = {};
buildRow.rpttypecode = "ITQ";
buildRow.valstr = cell.value;
buildRow.desc = desc;
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
if (colNumber == 8) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 11) {
var buildRow = {};
buildRow.rpttypecode = "ITQ";
buildRow.valstr = cell.value;
buildRow.desc = desc;
buildRow.position = rowNumber + "-" + 2;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 3 && rowNumber <= 38) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 3) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 4) {
var buildRow = {};
buildRow.rpttypecode = "ITY";
buildRow.valstr = cell.value;
buildRow.desc = desc + "/金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 3 && rowNumber <= 16) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 3) {
var buildRow = {};
buildRow.rpttypecode = "ITY";
buildRow.valstr = cell.value;
buildRow.desc = desc + "/金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 3 && rowNumber <= 28) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc = "";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 3) {
var buildRow = {};
buildRow.rpttypecode = "ITY_COST";
buildRow.valstr = cell.value;
buildRow.desc = desc + "/金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 5 && rowNumber <= 41) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 3) {
if (typeof cell.value == "object") {
desc="";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
cachetmp=desc;
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 4) {
desc=cachetmp+"/资产原值";
console.log(desc,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
if (colNumber == 5) {
desc=cachetmp+"/本年折旧、摊销额";
}
if (colNumber == 6) {
desc+="/累计折旧、摊销额";
}
if (colNumber == 7) {
desc=cachetmp+"/资产计税基础";
}
if (colNumber == 8) {
desc=cachetmp+"/税收折旧、摊销额";
}
if (colNumber == 9) {
desc=cachetmp+"/享受加速折旧政策的资产按税收一般规定计算的折旧、摊销额";
}
if (colNumber == 10) {
desc=cachetmp+"/加速折旧、摊销统计额";
}
if (colNumber == 11) {
desc=cachetmp+"/ 累计折旧、摊销额";
}
if (colNumber == 12) {
desc=cachetmp+"/ 纳税调整金额";
}
if (colNumber >=4 && colNumber <=12) {
var colpos=colNumber-3;
var buildRow = {};
buildRow.rpttypecode = "ITY_COST";
buildRow.valstr = cell.value;
buildRow.desc = desc;
buildRow.position = rowNumber + "-" + colpos;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 6 && rowNumber <= 17) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc="";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
cachetmp=desc;
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 3) {
desc=cachetmp+"/年度";
console.log(desc,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
if (colNumber == 4) {
desc=cachetmp+"/当年境内所得额";
}
if (colNumber == 5) {
desc+=cachetmp+"/分立转出的亏损额";
}
if (colNumber == 6) {
desc=cachetmp+"/可弥补年限5年";
}
if (colNumber == 7) {
desc=cachetmp+"/可弥补年限10年";
}
if (colNumber == 8) {
desc=cachetmp+"/弥补亏损企业类型";
}
if (colNumber == 9) {
desc=cachetmp+"/当年亏损额";
}
if (colNumber == 10) {
desc=cachetmp+"/ 当年待弥补的亏损额";
}
if (colNumber == 11) {
desc=cachetmp+"/使用境内所得弥补";
}
if (colNumber == 12) {
desc=cachetmp+"/使用境外所得弥补";
}
if (colNumber == 13) {
desc=cachetmp+"/当年可结转以后年度弥补的亏损额";
}
if (colNumber >=3 && colNumber <=13) {
var colpos=colNumber-2;
var buildRow = {};
buildRow.rpttypecode = "ITY_FILL_LOST";
buildRow.valstr = cell.value;
buildRow.desc = desc;
buildRow.position = rowNumber + "-" + colpos;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 3 && rowNumber <= 28) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc="";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
cachetmp=desc;
}
if (colNumber ==3 ) {
var buildRow = {};
buildRow.rpttypecode = "ITY_INCOME_DESC";
buildRow.timetypecode = "Q";
buildRow.valstr = cell.value;
buildRow.desc = desc+"/金额";
buildRow.position = rowNumber + "-" + 1;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb) => {
var sheet = wb.getWorksheet(1);
var insertrows = [];
sheet.eachRow({ includeEmpty: true }, function (row, rowNumber) {
if (rowNumber >= 5 && rowNumber <= 30) {
row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
if (colNumber == 2) {
if (typeof cell.value == "object") {
desc="";
cell.value.richText.forEach(element => {
desc += element.text;
});
} else {
desc = cell.value;
}
cachetmp=desc;
console.log(desc, ">>>>>>>>>>>>>>>");
}
if (colNumber == 3) {
desc=cachetmp+"/销售费用";
console.log(desc,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
if (colNumber == 4) {
desc=cachetmp+"/其中:境外支付";
}
if (colNumber == 5) {
desc+=cachetmp+"/管理费用";
}
if (colNumber == 6) {
desc=cachetmp+"/其中:境外支付";
}
if (colNumber == 7) {
desc=cachetmp+"/财务费用";
}
if (colNumber == 8) {
desc=cachetmp+"/其中:境外支付";
}
if (colNumber >=3 && colNumber <=8) {
var colpos=colNumber-2;
var buildRow = {};
buildRow.rpttypecode = "ITY_PERIOD";
buildRow.valstr = cell.value;
buildRow.desc = desc;
buildRow.position = rowNumber + "-" + colpos;
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=5 && rowNumber<=45){
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==1){
desc="资产/"+cell.value;
}
if(colNumber==3 || colNumber==4){
if(desc!="资产/"){
var buildRow={};
buildRow.rpttypecode="NA";
buildRow.valstr=cell.value;
if(colNumber==3){
buildRow.desc=desc+"/期末余额";
buildRow.position=rowNumber+"-"+1;
}else{
buildRow.desc=desc+"/年初余额";
buildRow.position=rowNumber+"-"+2;
}
insertrows.push(buildRow);
}
}
if(colNumber==5){
desc="负债和所有者权益/"+cell.value;
}
if(colNumber==7 || colNumber==8){
if(desc!="负债和所有者权益/"){
buildRow={};
buildRow.rpttypecode="NA";
buildRow.valstr=cell.value;
if(colNumber==7){
buildRow.desc=desc+"/期末余额";
buildRow.position=rowNumber+"-"+3;
}else{
buildRow.desc=desc+"/年初余额";
buildRow.position=rowNumber+"-"+4;
}
insertrows.push(buildRow);
}
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=5 && rowNumber<=38){
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==1){
if(typeof cell.value=="object"){
desc="";
cell.value.richText.forEach(element => {
desc+=element.text;
});
}else{
desc=cell.value;
}
console.log(desc,">>>>>>>>>>>>>>>");
}
if(colNumber==3 || colNumber==4){
var buildRow={};
buildRow.rpttypecode="NP";
buildRow.valstr=cell.value;
if(colNumber==3){
buildRow.desc=desc+"/本期金额";
buildRow.position=rowNumber+"-"+1;
}else{
buildRow.desc=desc+"/本年累计金额";
buildRow.position=rowNumber+"-"+2;
}
insertrows.push(buildRow);
}
});
}
});
return insertrows;
})();
\ No newline at end of file
module.exports=(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=5 && rowNumber<=36){
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==1){
desc="资产/"+cell.value;
console.log(desc,">>>>>>>>>>>>>>>");
}
if(colNumber==3 || colNumber==4){
if(desc!="资产/"){
var buildRow={};
buildRow.rpttypecode="SA";
buildRow.valstr=cell.value;
buildRow.valstr=cell.value;
if(colNumber==3){
buildRow.desc=desc+"/期末余额";
buildRow.position=rowNumber+"-"+1;
}else{
buildRow.desc=desc+"/年初余额";
buildRow.position=rowNumber+"-"+2;
}
insertrows.push(buildRow);
}
}
if(colNumber==5){
desc="负债和所有者权益/"+cell.value;
}
if(colNumber==7 || colNumber==8){
if(desc!="负债和所有者权益/"){
buildRow={};
buildRow.rpttypecode="SA";
buildRow.valstr=cell.value;
if(colNumber==7){
buildRow.desc=desc+"/期末余额";
buildRow.position=rowNumber+"-"+3;
}else{
buildRow.desc=desc+"/年初余额";
buildRow.position=rowNumber+"-"+4;
}
insertrows.push(buildRow);
}
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=5 && rowNumber<=38){
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==1){
if(typeof cell.value=="object"){
desc="";
cell.value.richText.forEach(element => {
desc+=element.text;
});
}else{
desc=cell.value;
}
console.log(desc,">>>>>>>>>>>>>>>");
}
if(colNumber==3 || colNumber==4){
var buildRow={};
buildRow.rpttypecode="SP";
buildRow.valstr=cell.value;
if(colNumber==3){
buildRow.desc=desc+"/本年累计金额";
buildRow.position=rowNumber+"-"+1;
}else{
buildRow.desc=desc+"/本月金额";
buildRow.position=rowNumber+"-"+2;
}
insertrows.push(buildRow);
}
});
}
});
return insertrows;
});
\ No newline at end of file
module.exports=(async (wb)=>{
var sheet = wb.getWorksheet(1);
var insertrows=[];
sheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
if(rowNumber>=9 && rowNumber<=33){
console.log(rowNumber,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..");
var rowDesc="";
var cacheStr="";
row.eachCell({ includeEmpty: true }, function(cell, colNumber) {
if(colNumber==2){
if(typeof cell.value=="object"){
cell.value.richText.forEach(element => {
rowDesc+=element.text;
});
}else{
rowDesc+=cell.value;
}
console.log(rowDesc);
cacheStr=rowDesc;
}
if(colNumber==5 || colNumber==6 || colNumber==7 || colNumber==8){
var colPos=1;
var buildRow={};
if(colNumber==5 || colNumber==6){
rowDesc=rowDesc+"/"+"本期数";
}
if(colNumber==7 || colNumber==8){
rowDesc=rowDesc+"/"+"本年累计";
}
if(colNumber==5){
rowDesc+="/"+"货物及劳务";
colPos=1;
}
if(colNumber==6){
rowDesc+="/"+"服务、不动产和无形资产";
colPos=2;
}
if(colNumber==7){
rowDesc+="/"+"货物及劳务";
colPos=3;
}
if(colNumber==8){
rowDesc+="/"+"服务、不动产和无形资产";
colPos=4;
}
buildRow.position=rowNumber+"-"+colPos;
buildRow.desc=rowDesc;
buildRow.valstr=cell.value;
insertrows.push(buildRow);
rowDesc=cacheStr;
}
});
}
});
return insertrows;
});
\ No newline at end of file
const TaskBase=require("../../task.base");
const system = require("../../../system");
var settings = require("../../../../config/settings");
class TmtransferTask extends TaskBase{
constructor(){
super(TaskBase.getServiceName(TmtransferTask));
this.restclient = system.getObject("util.restClient");
this.transferurl = settings.reqTransferurl();
}
async beforeTask(params){
console.log("前置操作......",this.serviceName);
//this.isThrough=true;
//console.log(this.cacheManager);
}
async subDoTask(params){
console.log(params);
console.log("TestTask1.....");
var url = this.transferurl + "api/transfer/tradeApi/uppaymentstatus";
var transferinfo = await this.execlient.execPost(null, url);
var result = JSON.parse(transferinfo.stdout)
return result;
}
}
module.exports=TmtransferTask;
...@@ -38,8 +38,8 @@ class OSSClient{ ...@@ -38,8 +38,8 @@ class OSSClient{
} }
module.exports=OSSClient; module.exports=OSSClient;
// var oss=new OSSClient(); // var oss=new OSSClient();
// var key="netsharp_QSzjD4HdKdTmRR6b5486pEA3AbsW8Pr8.jpg" // var key="GT.xlsx"
// oss.upfile(key,"/usr/devws/OMC/igirl-api/r3.jpg").then(function(result){ // oss.upfile(key,"./GT.xlsx").then(function(result){
// console.log(result); // console.log(result);
// }); // });
// oss.downfile(key).then(function(result){ // oss.downfile(key).then(function(result){
......
var RC=require("./redisClient.js"); var RC=require("./redisClient.js");
var client=new RC(); var client=new RC();
(async ()=>{ (async ()=>{
for(i=0;i<100;i++){ // var tohandleurls=pv.split("~");
await client.notifyConsume("k8stask","docurls",i); // var rptDate=tohandleurls[0];
} // var rptCode=tohandleurls[1];
// var urldownload=tohandleurls[2];
var mm="2019~GT~https://gsb-zc.oss-cn-beijing.aliyuncs.com/GT.xlsx";
await client.notifyConsume("k8stask","docurls",mm);
})() })()
\ No newline at end of file
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"ali-oss": "^6.3.1",
"co": "^4.6.0",
"exceljs": "^3.5.0",
"glob": "^7.1.4", "glob": "^7.1.4",
"mysql2": "^1.5.3", "mysql2": "^1.5.3",
"sequelize": "^4.37.8" "sequelize": "^4.37.8"
......
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