Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
T
traffic-front
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangxiaoming
traffic-front
Commits
3b1cda94
Commit
3b1cda94
authored
Jul 11, 2018
by
frank.xa.zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add report view backend code
parent
ea74a6a8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
561 additions
and
82 deletions
+561
-82
CellCalcInfoDto.java
...ain/java/pwc/taxtech/atms/dto/vatdto/CellCalcInfoDto.java
+77
-0
CellDataDto.java
...rc/main/java/pwc/taxtech/atms/dto/vatdto/CellDataDto.java
+5
-5
CellTemplateConfigGroupDto.java
...c/taxtech/atms/dto/vatdto/CellTemplateConfigGroupDto.java
+40
-0
DataSourceDto.java
.../main/java/pwc/taxtech/atms/dto/vatdto/DataSourceDto.java
+1
-1
DataSourceExtendDto.java
...java/pwc/taxtech/atms/dto/vatdto/DataSourceExtendDto.java
+13
-0
PeriodCellTemplateConfigExtendDto.java
...ch/atms/dto/vatdto/PeriodCellTemplateConfigExtendDto.java
+26
-0
ReportDataDto.java
.../main/java/pwc/taxtech/atms/dto/vatdto/ReportDataDto.java
+1
-1
CellConfigTranslater.java
...a/pwc/taxtech/atms/service/impl/CellConfigTranslater.java
+119
-1
DataSourceMapper.java
.../main/java/pwc/taxtech/atms/vat/dao/DataSourceMapper.java
+13
-9
PeriodCellTemplateConfigMapper.java
.../taxtech/atms/vat/dao/PeriodCellTemplateConfigMapper.java
+4
-0
ReportGenerator.java
...in/java/pwc/taxtech/atms/vat/service/ReportGenerator.java
+4
-0
ReportGeneratorImpl.java
...wc/taxtech/atms/vat/service/impl/ReportGeneratorImpl.java
+63
-43
ReportServiceImpl.java
.../pwc/taxtech/atms/vat/service/impl/ReportServiceImpl.java
+140
-22
VatAbstractService.java
...pwc/taxtech/atms/vat/service/impl/VatAbstractService.java
+8
-0
CellConfigTranslater.java
...t/service/impl/report/functions/CellConfigTranslater.java
+12
-0
DataSourceMapper.xml
...n/resources/pwc/taxtech/atms/vat/dao/DataSourceMapper.xml
+35
-0
PeriodCellTemplateConfigMapper.xml
...c/taxtech/atms/vat/dao/PeriodCellTemplateConfigMapper.xml
+0
-0
vat-report-view.ctrl.js
...p/common/controls/vat-report-view/vat-report-view.ctrl.js
+0
-0
common.js
atms-web/src/main/webapp/bundles/common.js
+0
-0
No files found.
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/CellCalcInfoDto.java
0 → 100644
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
dto
.
vatdto
;
import
lombok.Getter
;
import
lombok.Setter
;
import
pwc.taxtech.atms.dto.CellTemplateConfigDto
;
import
pwc.taxtech.atms.vat.entity.ModifiedReportCell
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
java.util.List
;
@Setter
@Getter
public
class
CellCalcInfoDto
{
private
Long
cellID
;
private
Long
reportID
;
private
Integer
columnIndex
;
private
String
columnName
;
private
Integer
rowIndex
;
private
String
rowName
;
private
String
formula
;
private
String
parsedFormula
;
private
Boolean
isCalculated
;
private
String
cellValue
;
private
Long
cellTemplateID
;
private
Long
reportTemplateID
;
private
Integer
dataType
;
private
Boolean
isReadOnly
;
private
String
dataSourceExp
;
private
String
formulaExp
;
private
String
description
;
private
Boolean
dataSourceAvailable
;
private
CellTemplateConfigDto
cellTemplateConfig
;
private
List
<
DataSourceDto
>
dataSourceList
;
private
InvoiceListDto
dataInvoiceList
;
//是否是用户手工调整过得值
private
Boolean
isModified
;
//用户直接修改单元格的信息
private
ModifiedReportCell
modifiedReportCell
;
private
List
<
CellVoucherDatasourceDto
>
dataVoucherList
;
private
Boolean
isConfigured
;
private
Boolean
hasModelError
;
//private List<ErrorInfoDto> ErrorInfoList;
//private List<ModelBackFillAmountDesc> entriesCheckResultList;
//private List<FormulaValidationError> ValidationErrorList ;
private
String
comment
;
private
List
<
PeriodCellTemplateConfig
>
configList
;
}
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/CellDataDto.java
View file @
3b1cda94
...
...
@@ -10,9 +10,9 @@ import java.util.List;
@Getter
@Setter
public
class
CellDataDto
{
private
Stri
ng
cellID
;
private
Lo
ng
cellID
;
private
Stri
ng
reportID
;
private
Lo
ng
reportID
;
private
int
columnIndex
;
...
...
@@ -28,13 +28,13 @@ public class CellDataDto {
private
String
cellValue
;
private
Stri
ng
cellTemplateID
;
private
Lo
ng
cellTemplateID
;
private
Stri
ng
reportTemplateID
;
private
Lo
ng
reportTemplateID
;
private
Integer
dataType
;
private
Integer
isReadOnly
;
private
Boolean
isReadOnly
;
private
String
dataSourceExp
;
private
String
formulaExp
;
...
...
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/CellTemplateConfigGroupDto.java
0 → 100644
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
dto
.
vatdto
;
import
lombok.Getter
;
import
lombok.Setter
;
@Getter
@Setter
public
class
CellTemplateConfigGroupDto
{
Integer
columnIndex
;
Integer
rowIndex
;
String
columnName
;
String
rowName
;
Integer
dataType
;
Boolean
isReadOnly
;
Long
templateID
;
Long
reportTemplateID
;
String
comment
;
public
CellTemplateConfigGroupDto
(
Integer
columnIndex
,
Integer
rowIndex
,
String
columnName
,
String
rowName
,
Integer
dataType
,
Boolean
isReadOnly
,
Long
templateID
,
Long
reportTemplateID
,
String
comment
)
{
this
.
columnIndex
=
columnIndex
;
this
.
rowIndex
=
rowIndex
;
this
.
columnName
=
columnName
;
this
.
rowName
=
rowName
;
this
.
dataType
=
dataType
;
this
.
isReadOnly
=
isReadOnly
;
this
.
templateID
=
templateID
;
this
.
reportTemplateID
=
reportTemplateID
;
this
.
comment
=
comment
;
}
}
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/DataSourceDto.java
View file @
3b1cda94
...
...
@@ -17,7 +17,7 @@ public class DataSourceDto {
this
.
internalCode
=
_DataSourcePrefix
+
hashCode
()
+
_DataSourceSuffix
;
}
Stri
ng
id
;
Lo
ng
id
;
String
internalCode
;
String
name
;
...
...
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/DataSourceExtendDto.java
0 → 100644
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
dto
.
vatdto
;
import
lombok.Getter
;
import
lombok.Setter
;
import
pwc.taxtech.atms.vat.entity.DataSource
;
@Getter
@Setter
public
class
DataSourceExtendDto
extends
DataSource
{
private
Integer
operationType
;
private
Long
cellTemplateID
;
private
Long
cellDataID
;
}
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/PeriodCellTemplateConfigExtendDto.java
0 → 100644
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
dto
.
vatdto
;
import
lombok.Getter
;
import
lombok.Setter
;
import
pwc.taxtech.atms.common.CommonUtils
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
@Setter
@Getter
public
class
PeriodCellTemplateConfigExtendDto
extends
PeriodCellTemplateConfig
{
Integer
columnIndex
;
Integer
rowIndex
;
String
columnName
;
String
rowName
;
Integer
dataType
;
Boolean
isReadOnly
;
Long
templateID
;
Long
reportTemplateID
;
String
comment
;
PeriodCellTemplateConfig
periodCellTemplateConfig
;
public
PeriodCellTemplateConfig
getPeriodCellTemplateConfig
()
{
CommonUtils
.
copyProperties
(
this
,
periodCellTemplateConfig
);
return
periodCellTemplateConfig
;
}
}
atms-api/src/main/java/pwc/taxtech/atms/dto/vatdto/ReportDataDto.java
View file @
3b1cda94
...
...
@@ -12,5 +12,5 @@ import java.util.Map;
public
class
ReportDataDto
{
private
List
<
CellDataDto
>
cellData
;
private
List
<
PeriodFormulaBlock
>
formulaBlocks
;
private
Map
<
String
,
DataSourceDto
>
manualDataSources
;
private
Map
<
Long
,
DataSourceDto
>
manualDataSources
;
}
atms-api/src/main/java/pwc/taxtech/atms/service/impl/CellConfigTranslater.java
View file @
3b1cda94
...
...
@@ -4,8 +4,10 @@ import org.apache.commons.lang3.StringUtils;
import
pwc.taxtech.atms.constant.Constant
;
import
pwc.taxtech.atms.constant.enums.CellDataSourceType
;
import
pwc.taxtech.atms.dto.CellTemplateConfigDto
;
import
pwc.taxtech.atms.dto.vatdto.CellCalcInfoDto
;
import
pwc.taxtech.atms.entitiy.CellTemplate
;
import
pwc.taxtech.atms.entitiy.CellTemplateConfig
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
...
...
@@ -23,8 +25,16 @@ public final class CellConfigTranslater {
template
.
getColumnName
(),
template
.
getDataType
(),
template
.
getIsReadOnly
(),
template
.
getComment
(),
configList
);
}
public
static
CellTemplateConfigDto
getConfigDto
(
CellCalcInfoDto
x
)
{
return
CellConfigTranslater
.
getPeriodConfigDto
(
x
.
getCellTemplateID
(),
x
.
getCellTemplateID
(),
x
.
getRowIndex
(),
x
.
getRowName
(),
x
.
getColumnIndex
(),
x
.
getColumnName
(),
x
.
getDataType
(),
x
.
getIsReadOnly
(),
x
.
getDescription
(),
x
.
getConfigList
());
}
private
static
CellTemplateConfigDto
getConfigDto
(
Long
configID
,
Long
templateID
,
int
rowIndex
,
String
rowName
,
int
columnIndex
,
String
columnName
,
Integer
dataType
,
Boolean
isReadOnly
,
String
description
,
List
<
CellTemplateConfig
>
configList
)
{
String
columnName
,
Integer
dataType
,
Boolean
isReadOnly
,
String
description
,
List
<
CellTemplateConfig
>
configList
)
{
if
(
configList
==
null
)
{
return
null
;
}
...
...
@@ -105,6 +115,114 @@ public final class CellConfigTranslater {
return
cellTemplateConfigDto
;
}
private
static
CellTemplateConfigDto
getPeriodConfigDto
(
Long
configID
,
Long
templateID
,
int
rowIndex
,
String
rowName
,
int
columnIndex
,
String
columnName
,
Integer
dataType
,
Boolean
isReadOnly
,
String
description
,
List
<
PeriodCellTemplateConfig
>
configList
)
{
//already finished by today 20180711
if
(
configList
==
null
)
{
return
null
;
}
CellTemplateConfigDto
cellTemplateConfigDto
=
new
CellTemplateConfigDto
();
cellTemplateConfigDto
.
setCellTemplateID
(
configID
);
cellTemplateConfigDto
.
setTemplateID
(
templateID
);
cellTemplateConfigDto
.
setRowIndex
(
rowIndex
);
cellTemplateConfigDto
.
setRowName
(
rowName
);
cellTemplateConfigDto
.
setColumnIndex
(
columnIndex
);
cellTemplateConfigDto
.
setColumnName
(
columnName
);
cellTemplateConfigDto
.
setDataType
(
dataType
);
cellTemplateConfigDto
.
setIsReadOnly
(
isReadOnly
);
cellTemplateConfigDto
.
setFormulaDescription
(
description
);
Optional
<
PeriodCellTemplateConfig
>
formulaItem
=
configList
.
stream
()
.
filter
(
x
->
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
Formula
.
getCode
()))
.
findFirst
();
if
(
formulaItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasFormula
(
true
);
cellTemplateConfigDto
.
setFormula
(
formulaItem
.
get
().
getFormula
());
cellTemplateConfigDto
.
setParsedFormula
(
formulaItem
.
get
().
getParsedFormula
());
if
(
StringUtils
.
isBlank
(
cellTemplateConfigDto
.
getFormulaDescription
())
&&
StringUtils
.
isNotBlank
(
formulaItem
.
get
().
getFormulaDescription
()))
{
cellTemplateConfigDto
.
setFormulaDescription
(
formulaItem
.
get
().
getFormulaDescription
());
}
cellTemplateConfigDto
.
setFormulaDataSource
(
formulaItem
.
get
().
getFormulaDataSource
());
cellTemplateConfigDto
.
setCellTemplateID
(
formulaItem
.
get
().
getCellTemplateId
());
}
Optional
<
PeriodCellTemplateConfig
>
voucherItem
=
configList
.
stream
()
.
filter
(
x
->
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
Voucher
.
getCode
())).
findFirst
();
if
(
voucherItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasVoucher
(
true
);
cellTemplateConfigDto
.
setVoucherKeyword
(
voucherItem
.
get
().
getVoucherKeyword
()
==
null
?
StringUtils
.
EMPTY
:
voucherItem
.
get
().
getVoucherKeyword
());
if
(
StringUtils
.
isNotBlank
(
voucherItem
.
get
().
getAccountCodes
()))
{
cellTemplateConfigDto
.
setAccountCodes
(
getList
(
voucherItem
.
get
().
getAccountCodes
()));
}
}
Optional
<
PeriodCellTemplateConfig
>
invoiceItem
=
configList
.
stream
()
.
filter
(
x
->
(
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
OutputInvoice
.
getCode
()))
||
(
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
InputInvoice
.
getCode
())
||
(
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
CustomInvoice
.
getCode
())))).
findFirst
();
if
(
invoiceItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasInvoice
(
true
);
cellTemplateConfigDto
.
setInvoiceType
(
invoiceItem
.
get
().
getInvoiceType
());
cellTemplateConfigDto
.
setInvoiceAmountType
(
invoiceItem
.
get
().
getInvoiceAmountType
());
if
(
StringUtils
.
isNotBlank
(
invoiceItem
.
get
().
getTaxRate
()))
{
cellTemplateConfigDto
.
setTaxRate
(
getList
(
invoiceItem
.
get
().
getTaxRate
()));
}
if
(
StringUtils
.
isNotBlank
(
invoiceItem
.
get
().
getInvoiceCategory
()))
{
List
<
String
>
invoiceCategoryStrs
=
getList
(
invoiceItem
.
get
().
getInvoiceCategory
());
List
<
Integer
>
invoiceCategoryList
=
new
ArrayList
<>();
invoiceCategoryStrs
.
forEach
(
s
->
{
Integer
categoryVal
;
try
{
categoryVal
=
Integer
.
parseInt
(
s
);
invoiceCategoryList
.
add
(
categoryVal
);
}
catch
(
Exception
e
)
{
//转换错误就不做添加,直接吃掉这里的异常,不进行阻塞
}
});
cellTemplateConfigDto
.
setInvoiceCategory
(
invoiceCategoryList
);
}
}
Optional
<
PeriodCellTemplateConfig
>
keyInItem
=
configList
.
stream
()
.
filter
(
x
->
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
KeyIn
.
getCode
()))
.
findFirst
();
if
(
keyInItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasKeyIn
(
true
);
}
Optional
<
PeriodCellTemplateConfig
>
modelItem
=
configList
.
stream
()
.
filter
(
x
->
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
RelatedModel
.
getCode
()))
.
findFirst
();
if
(
modelItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasModel
(
true
);
cellTemplateConfigDto
.
setModelIDs
(
getList
(
modelItem
.
get
().
getModelIds
()));
}
Optional
<
PeriodCellTemplateConfig
>
validationItem
=
configList
.
stream
()
.
filter
(
x
->
x
.
getDataSourceType
().
equals
(
CellDataSourceType
.
Validation
.
getCode
()))
.
findFirst
();
if
(
validationItem
.
isPresent
())
{
cellTemplateConfigDto
.
setHasValidation
(
true
);
cellTemplateConfigDto
.
setValidation
(
validationItem
.
get
().
getValidation
());
cellTemplateConfigDto
.
setParsedFormula
(
validationItem
.
get
().
getParsedFormula
());
cellTemplateConfigDto
.
setValidationDescription
(
validationItem
.
get
().
getValidationDescription
());
cellTemplateConfigDto
.
setCellTemplateID
(
validationItem
.
get
().
getCellTemplateId
());
}
return
cellTemplateConfigDto
;
}
private
static
List
<
String
>
getList
(
String
joinString
)
{
if
(
StringUtils
.
isEmpty
(
joinString
))
{
return
null
;
...
...
atms-api/src/main/java/pwc/taxtech/atms/vat/dao/DataSourceMapper.java
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
vat
.
dao
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.session.RowBounds
;
import
pwc.taxtech.atms.MyVatMapper
;
import
pwc.taxtech.atms.dto.vatdto.DataSourceExtendDto
;
import
pwc.taxtech.atms.vat.entity.DataSource
;
import
pwc.taxtech.atms.vat.entity.DataSourceExample
;
import
java.util.List
;
@Mapper
public
interface
DataSourceMapper
extends
MyVatMapper
{
/**
...
...
@@ -106,22 +108,23 @@ public interface DataSourceMapper extends MyVatMapper {
*/
int
updateByPrimaryKey
(
DataSource
record
);
void
clearFormulaBlockWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearFormulaBlockWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearTaxRuleSettingWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearTaxRuleSettingWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearCellTemplateWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearCellTemplateWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearCellTemplateConfigWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearCellTemplateConfigWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearTemplateWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearTemplateWithPeriod
(
@Param
(
"period"
)
Integer
period
,
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
void
clearTaxPayerReportWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearTaxPayerReportWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearDataSourceWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearDataSourceWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearDataSourceDetailWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearDataSourceDetailWithPeriod
(
@Param
(
"period"
)
Integer
period
);
void
clearCellDataWithPeriod
(
@Param
(
"exceptReportTemplateIDs"
)
String
exceptReportTemplateIDs
);
List
<
DataSourceExtendDto
>
getFormulaDataSource
(
Long
reportID
);
}
\ No newline at end of file
atms-api/src/main/java/pwc/taxtech/atms/vat/dao/PeriodCellTemplateConfigMapper.java
View file @
3b1cda94
...
...
@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.session.RowBounds
;
import
pwc.taxtech.atms.MyVatMapper
;
import
pwc.taxtech.atms.dto.vatdto.PeriodCellTemplateConfigExtendDto
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfigExample
;
...
...
@@ -107,4 +108,6 @@ public interface PeriodCellTemplateConfigMapper extends MyVatMapper {
int
updateByPrimaryKey
(
PeriodCellTemplateConfig
record
);
void
batchInsert
(
List
<
PeriodCellTemplateConfig
>
list
);
List
<
PeriodCellTemplateConfigExtendDto
>
getPeriodCellTemplateConfigExtendDtos
(
@Param
(
"templateIDList"
)
List
<
Long
>
templateIDList
,
Integer
period
);
}
\ No newline at end of file
atms-api/src/main/java/pwc/taxtech/atms/vat/service/ReportGenerator.java
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
vat
.
service
;
import
pwc.taxtech.atms.dto.vatdto.CellCalcInfoDto
;
import
java.util.List
;
public
interface
ReportGenerator
{
String
generateData
(
String
projectId
,
List
<
Long
>
templateIds
,
Boolean
ifDeleteManualDataSource
,
List
<
String
>
exceptCellTemplates
,
Integer
periodParam
,
String
generator
);
List
<
CellCalcInfoDto
>
getCellCalcInfo
(
List
<
Long
>
templateIDList
,
Integer
periodParam
);
}
atms-api/src/main/java/pwc/taxtech/atms/vat/service/impl/ReportGeneratorImpl.java
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
vat
.
service
.
impl
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.openxml4j.exceptions.InvalidFormatException
;
import
org.apache.poi.ss.formula.functions.FreeRefFunction
;
import
org.apache.poi.ss.formula.udf.AggregatingUDFFinder
;
import
org.apache.poi.ss.formula.udf.DefaultUDFFinder
;
import
org.apache.poi.ss.formula.udf.UDFFinder
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.FormulaEvaluator
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.apache.poi.ss.usermodel.WorkbookFactory
;
import
org.apache.poi.ss.usermodel.*
;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
pwc.taxtech.atms.common.POIUtil
;
import
pwc.taxtech.atms.constant.enums.CellDataSourceType
;
import
pwc.taxtech.atms.service.impl.DistributedIDService
;
import
pwc.taxtech.atms.vat.dao.CellDataMapper
;
import
pwc.taxtech.atms.vat.dao.PeriodCellTemplateConfigMapper
;
import
pwc.taxtech.atms.vat.dao.PeriodCellTemplateMapper
;
import
pwc.taxtech.atms.vat.dao.PeriodTemplateMapper
;
import
pwc.taxtech.atms.vat.dao.ReportMapper
;
import
pwc.taxtech.atms.vat.entity.CellData
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplate
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfigExample
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateExample
;
import
pwc.taxtech.atms.vat.entity.PeriodTemplate
;
import
pwc.taxtech.atms.vat.entity.PeriodTemplateExample
;
import
pwc.taxtech.atms.vat.entity.Report
;
import
pwc.taxtech.atms.dto.vatdto.CellCalcInfoDto
;
import
pwc.taxtech.atms.dto.vatdto.CellTemplateConfigGroupDto
;
import
pwc.taxtech.atms.dto.vatdto.PeriodCellTemplateConfigExtendDto
;
import
pwc.taxtech.atms.vat.entity.*
;
import
pwc.taxtech.atms.vat.service.ReportGenerator
;
import
pwc.taxtech.atms.vat.service.impl.report.functions.FSJZ
;
import
pwc.taxtech.atms.vat.service.impl.report.functions.FormulaContext
;
...
...
@@ -41,37 +26,20 @@ import pwc.taxtech.atms.vat.service.impl.report.functions.SGSR;
import
java.io.File
;
import
java.io.FileNotFoundException
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
static
pwc
.
taxtech
.
atms
.
constant
.
Constant
.
EMPTY
;
@Service
public
class
ReportGeneratorImpl
implements
ReportGenerator
{
@Autowired
PeriodTemplateMapper
periodTemplateMapper
;
@Autowired
PeriodCellTemplateMapper
periodCellTemplateMapper
;
@Autowired
PeriodCellTemplateConfigMapper
periodCellTemplateConfigMapper
;
@Autowired
DistributedIDService
distributedIDService
;
@Autowired
ReportMapper
reportMapper
;
@Autowired
CellDataMapper
cellDataMapper
;
@Autowired
FormulaAgent
formulaAgent
;
public
class
ReportGeneratorImpl
extends
VatAbstractService
implements
ReportGenerator
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ReportGeneratorImpl
.
class
);
@Override
public
String
generateData
(
String
projectId
,
List
<
Long
>
templateIds
,
Boolean
ifDeleteManualDataSource
,
List
<
String
>
exceptCellTemplates
,
Integer
periodParam
,
String
generator
)
{
public
String
generateData
(
String
projectId
,
List
<
Long
>
templateIds
,
Boolean
ifDeleteManualDataSource
,
List
<
String
>
exceptCellTemplates
,
Integer
periodParam
,
String
generator
)
{
Date
createTime
=
new
Date
();
int
period
=
periodParam
!=
null
?
periodParam
:
0
;
...
...
@@ -269,4 +237,56 @@ public class ReportGeneratorImpl implements ReportGenerator {
UDFFinder
udfToolpack
=
new
AggregatingUDFFinder
(
udfs
);
workbook
.
addToolPack
(
udfToolpack
);
}
public
List
<
CellCalcInfoDto
>
getCellCalcInfo
(
List
<
Long
>
templateIDList
,
Integer
periodParam
)
{
//already finished by 20180711
int
period
=
0
;
if
(
periodParam
!=
null
)
{
period
=
periodParam
;
}
List
<
PeriodCellTemplateConfigExtendDto
>
periodCellTemplateConfigExtendDtos
=
periodCellTemplateConfigMapper
.
getPeriodCellTemplateConfigExtendDtos
(
templateIDList
,
period
);
List
<
CellCalcInfoDto
>
cellCalcInfoDtos
=
new
ArrayList
<>();
periodCellTemplateConfigExtendDtos
.
stream
().
collect
(
Collectors
.
groupingBy
(
a
->
new
CellTemplateConfigGroupDto
(
a
.
getColumnIndex
(),
a
.
getRowIndex
()
,
a
.
getColumnName
(),
a
.
getRowName
(),
a
.
getDataType
(),
a
.
getIsReadOnly
()
,
a
.
getId
(),
a
.
getReportTemplateID
(),
a
.
getComment
()))).
forEach
((
x
,
y
)
->
{
CellCalcInfoDto
cellCalcInfoDto
=
new
CellCalcInfoDto
();
cellCalcInfoDto
.
setColumnIndex
(
x
.
getColumnIndex
());
cellCalcInfoDto
.
setColumnName
(
x
.
getColumnName
());
cellCalcInfoDto
.
setRowIndex
(
x
.
getRowIndex
());
cellCalcInfoDto
.
setRowName
(
x
.
getRowName
());
cellCalcInfoDto
.
setFormula
(
convertListToString
(
y
.
stream
()
.
map
(
PeriodCellTemplateConfig:
:
getFormula
).
collect
(
Collectors
.
toList
())));
cellCalcInfoDto
.
setParsedFormula
(
convertListToString
(
y
.
stream
()
.
map
(
PeriodCellTemplateConfig:
:
getParsedFormula
).
collect
(
Collectors
.
toList
())));
//todo: add validation at here later
cellCalcInfoDto
.
setCellTemplateID
(
x
.
getTemplateID
());
cellCalcInfoDto
.
setReportTemplateID
(
x
.
getReportTemplateID
());
cellCalcInfoDto
.
setDataType
(
x
.
getDataType
());
cellCalcInfoDto
.
setIsReadOnly
(
x
.
getIsReadOnly
());
cellCalcInfoDto
.
setComment
(
x
.
getComment
());
cellCalcInfoDto
.
setConfigList
(
y
.
stream
()
.
map
(
PeriodCellTemplateConfigExtendDto:
:
getPeriodCellTemplateConfig
)
.
collect
(
Collectors
.
toList
()));
cellCalcInfoDtos
.
add
(
cellCalcInfoDto
);
});
return
cellCalcInfoDtos
;
}
private
String
convertListToString
(
List
<
String
>
list
)
{
StringBuilder
stringBuilder
=
new
StringBuilder
();
list
.
forEach
(
s
->
{
if
(
StringUtils
.
isNotBlank
(
s
))
{
stringBuilder
.
append
(
s
);
stringBuilder
.
append
(
"+"
);
}
});
if
(
stringBuilder
.
length
()
>
0
)
{
stringBuilder
.
deleteCharAt
(
stringBuilder
.
length
()
-
1
);
}
return
stringBuilder
.
toString
();
}
}
atms-api/src/main/java/pwc/taxtech/atms/vat/service/impl/ReportServiceImpl.java
View file @
3b1cda94
...
...
@@ -5,23 +5,14 @@ import org.springframework.stereotype.Service;
import
pwc.taxtech.atms.common.datasource.ShardingContextHolder
;
import
pwc.taxtech.atms.constant.enums.EnumServiceType
;
import
pwc.taxtech.atms.dto.OperationResultDto
;
import
pwc.taxtech.atms.dto.vatdto.CellTemplateReferenceDto
;
import
pwc.taxtech.atms.dto.vatdto.ReportDataDto
;
import
pwc.taxtech.atms.dto.vatdto.ReportDto
;
import
pwc.taxtech.atms.dto.vatdto.*
;
import
pwc.taxtech.atms.entitiy.*
;
import
pwc.taxtech.atms.exception.NotSupportedException
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplate
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
pwc.taxtech.atms.vat.entity.PeriodTemplate
;
import
pwc.taxtech.atms.vat.entity.PeriodTemplateExample
;
import
pwc.taxtech.atms.service.impl.CellConfigTranslater
;
import
pwc.taxtech.atms.vat.entity.*
;
import
pwc.taxtech.atms.vat.service.ReportService
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Service
...
...
@@ -66,10 +57,9 @@ public class ReportServiceImpl extends VatAbstractService implements ReportServi
ProjectServiceTypeExample
projectServiceTypeExample
=
new
ProjectServiceTypeExample
();
projectServiceTypeExample
.
createCriteria
().
andServiceTypeIDEqualTo
(
serviceTypeStr
).
andProjectIDEqualTo
(
projectID
);
Optional
<
Long
>
tempVlaue
=
projectServiceTypeMapper
.
selectByExample
(
projectServiceTypeExample
).
stream
().
map
(
ProjectServiceType:
:
getTemplateGroupID
).
findFirst
();
if
(
tempVlaue
.
isPresent
())
{
if
(
tempVlaue
.
isPresent
())
{
templateGroupID
=
tempVlaue
.
get
();
}
else
{
}
else
{
templateGroupID
=
0L
;
}
}
...
...
@@ -300,14 +290,142 @@ public class ReportServiceImpl extends VatAbstractService implements ReportServi
OperationResultDto
resultDto
=
new
OperationResultDto
();
ReportDataDto
dataDto
=
new
ReportDataDto
();
Report
report
=
reportMapper
.
selectByPrimaryKey
(
reportId
);
if
(
report
==
null
)
{
resultDto
.
setResult
(
false
);
resultDto
.
setResultMsg
(
"NoReport"
);
return
resultDto
;
}
PeriodTemplateExample
example
=
new
PeriodTemplateExample
();
example
.
createCriteria
().
andTemplateIdEqualTo
(
report
.
getTemplateId
()).
andPeriodEqualTo
(
report
.
getPeriod
());
Optional
<
PeriodTemplate
>
reportTemplate
=
periodTemplateMapper
.
selectByExample
(
example
).
stream
().
findFirst
();
if
(!
reportTemplate
.
isPresent
())
{
resultDto
.
setResult
(
false
);
resultDto
.
setResultMsg
(
"NoReportTemplate"
);
return
resultDto
;
}
Project
project
=
projectMapper
.
selectByPrimaryKey
(
report
.
getProjectId
());
if
(
project
==
null
)
{
resultDto
.
setResult
(
false
);
resultDto
.
setResultMsg
(
"NoProject"
);
return
resultDto
;
}
return
null
;
PeriodTemplateExample
periodTemplateExample
=
new
PeriodTemplateExample
();
periodTemplateExample
.
createCriteria
()
.
andTemplateGroupIdEqualTo
(
reportTemplate
.
get
().
getTemplateGroupId
())
.
andPeriodEqualTo
(
report
.
getPeriod
())
.
andIsActiveAssociationEqualTo
(
true
);
List
<
PeriodTemplate
>
reportTemplates
=
periodTemplateMapper
.
selectByExample
(
example
);
List
<
Long
>
templateIDs
=
new
ArrayList
<>();
templateIDs
.
add
(
report
.
getTemplateId
());
List
<
CellCalcInfoDto
>
cellCfgList
=
reportGenerator
.
getCellCalcInfo
(
templateIDs
,
report
.
getPeriod
());
CellDataExample
cellDataExample
=
new
CellDataExample
();
cellDataExample
.
createCriteria
().
andReportIdEqualTo
(
reportId
);
List
<
CellData
>
currentCellDataList
=
cellDataMapper
.
selectByExample
(
cellDataExample
);
PeriodFormulaBlockExample
periodFormulaBlockExample
=
new
PeriodFormulaBlockExample
();
periodFormulaBlockExample
.
createCriteria
().
andPeriodEqualTo
(
report
.
getPeriod
());
List
<
PeriodFormulaBlock
>
formulaBlocks
=
periodFormulaBlockMapper
.
selectByExample
(
periodFormulaBlockExample
);
dataDto
.
setFormulaBlocks
(
formulaBlocks
);
//todo: 关键字数据源稍后再加
// 获取通过KeyValueDataID关联的数据源,即公式数据源
//var formulaDataSourceList = (from ds in _dbprojectContext.Set<DataSource>()
//join cd in _dbprojectContext.Set<CellData>()
//on ds.KeyValueDataID equals cd.ID
//where cd.ReportID == reportID && ds.Type == (int)CellDataSourceType.Formula
//select new
//{
// DataSource = ds,
// CellTemplateID = cd.CellTemplateID,
// CellDataID = cd.ID
//}).AsNoTracking().ToList();
//todo: 模型数据源稍后再加
// 获取通过ModelBackFillAmount关联的数据源,即模型数据源
// TODO: Check模型回填数据源是否会有多对多的情况出现,如有需distinct
//var modelDataSourceList = (from ds in _dbprojectContext.Set<DataSource>()
//join fa in _dbprojectContext.Set<ModelBackFillAmount>()
//on ds.ID equals fa.DataSourceID
//join cd in _dbprojectContext.Set<CellData>()
//on fa.CellDataID equals cd.ID
//where cd.ReportID == reportID && ds.Type == (int)FormulaDataSourceType.ModelDatasource
//select new
//{
// DataSource = ds,
// OperationType = (int)DataSourceOperationType.Plus,
// CellTemplateID = cd.CellTemplateID,
// CellDataID = cd.ID
//}).AsNoTracking().ToList();
//公式计算数据源 20180711 完成
List
<
DataSourceExtendDto
>
manualDataSourceList
=
dataSourceMapper
.
getFormulaDataSource
(
reportId
);
Map
<
Long
,
DataSourceDto
>
datasource
=
new
IdentityHashMap
<>();
manualDataSourceList
.
forEach
(
a
->
{
DataSourceDto
dataSourceDto
=
new
DataSourceDto
();
dataSourceDto
.
setId
(
a
.
getId
());
dataSourceDto
.
setAmount
(
a
.
getAmount
());
dataSourceDto
.
setName
(
a
.
getName
());
dataSourceDto
.
setOperationType
(
a
.
getOperationType
());
dataSourceDto
.
setDataSourceType
(
a
.
getType
());
dataSourceDto
.
setDescription
(
a
.
getDescription
());
dataSourceDto
.
setCreateTime
(
a
.
getCreateTime
());
datasource
.
put
(
a
.
getCellTemplateID
(),
dataSourceDto
);
});
dataDto
.
setManualDataSources
(
datasource
);
List
<
CellDataDto
>
cellDataDtoList
=
new
ArrayList
<>();
cellCfgList
.
forEach
(
a
->
{
CellDataDto
cellDataDto
=
new
CellDataDto
();
cellDataDto
.
setColumnIndex
(
a
.
getColumnIndex
());
cellDataDto
.
setColumnName
(
a
.
getColumnName
());
cellDataDto
.
setRowIndex
(
a
.
getRowIndex
());
cellDataDto
.
setRowName
(
a
.
getRowName
());
cellDataDto
.
setCellTemplateID
(
a
.
getCellTemplateID
());
cellDataDto
.
setReportTemplateID
(
a
.
getReportTemplateID
());
cellDataDto
.
setDataType
(
a
.
getDataType
());
cellDataDto
.
setReportID
(
reportId
);
cellDataDto
.
setIsReadOnly
(
a
.
getIsReadOnly
());
Optional
<
CellData
>
celldata
=
currentCellDataList
.
stream
()
.
filter
(
x
->
x
.
getCellTemplateId
().
equals
(
a
.
getCellTemplateID
())).
findFirst
();
celldata
.
ifPresent
(
cellData
->
cellDataDto
.
setCellID
(
cellData
.
getId
()));
cellDataDto
.
setFormula
(
a
.
getFormula
());
celldata
.
ifPresent
(
cellData
->
cellDataDto
.
setCellValue
(
cellData
.
getData
()));
celldata
.
ifPresent
(
cellData
->
cellDataDto
.
setFormulaExp
(
cellData
.
getFormulaExp
()));
cellDataDto
.
setCellTemplateConfig
(
CellConfigTranslater
.
getConfigDto
(
a
));
List
<
Map
.
Entry
<
Long
,
DataSourceDto
>>
entryList
=
datasource
.
entrySet
().
stream
()
.
filter
(
y
->
y
.
getKey
().
equals
(
a
.
getCellTemplateID
())).
collect
(
Collectors
.
toList
());
List
<
DataSourceDto
>
dataSourceDtoList
=
new
ArrayList
<>();
entryList
.
forEach
(
z
->
dataSourceDtoList
.
add
(
z
.
getValue
()));
cellDataDto
.
setDataSourceList
(
dataSourceDtoList
);
cellDataDtoList
.
add
(
cellDataDto
);
});
ModifiedReportCellExample
modifiedReportCellExample
=
new
ModifiedReportCellExample
();
modifiedReportCellExample
.
createCriteria
().
andReportIdEqualTo
(
reportId
);
List
<
ModifiedReportCell
>
modifiedReportCellList
=
modifiedReportCellMapper
.
selectByExample
(
modifiedReportCellExample
);
modifiedReportCellList
.
forEach
(
mrc
->
{
Optional
<
CellDataDto
>
cdd
=
cellDataDtoList
.
stream
()
.
filter
(
cellDataDto
->
cellDataDto
.
getReportID
().
equals
(
mrc
.
getReportId
())
&&
cellDataDto
.
getRowIndex
()
==
mrc
.
getRow
()
&&
cellDataDto
.
getColumnIndex
()
==
mrc
.
getCol
()).
findFirst
();
if
(
cdd
.
isPresent
())
{
if
(!
mrc
.
getOriginalValue
().
equals
(
mrc
.
getValue
()))
{
cdd
.
get
().
setModifiedReportCell
(
mrc
);
cdd
.
get
().
setCellValue
(
mrc
.
getValue
());
cdd
.
get
().
setIsModified
(
true
);
}
}
});
dataDto
.
setCellData
(
cellDataDtoList
);
resultDto
.
setData
(
dataDto
);
resultDto
.
setResult
(
true
);
return
resultDto
;
}
}
atms-api/src/main/java/pwc/taxtech/atms/vat/service/impl/VatAbstractService.java
View file @
3b1cda94
...
...
@@ -70,5 +70,13 @@ public class VatAbstractService {
public
ProjectDao
projectDao
;
@Autowired
public
PeriodFormulaBlockMapper
periodFormulaBlockMapper
;
@Autowired
public
ReportMapper
reportMapper
;
@Autowired
public
CellDataMapper
cellDataMapper
;
@Autowired
public
ModifiedReportCellMapper
modifiedReportCellMapper
;
@Autowired
public
FormulaAgent
formulaAgent
;
}
atms-api/src/main/java/pwc/taxtech/atms/vat/service/impl/report/functions/CellConfigTranslater.java
0 → 100644
View file @
3b1cda94
package
pwc
.
taxtech
.
atms
.
vat
.
service
.
impl
.
report
.
functions
;
import
pwc.taxtech.atms.dto.CellTemplateConfigDto
;
import
pwc.taxtech.atms.vat.entity.PeriodCellTemplateConfig
;
import
java.util.List
;
public
final
class
CellConfigTranslater
{
public
static
CellTemplateConfigDto
GetPeriodConfigDto
(
String
configID
,
String
templateID
,
int
rowIndex
,
String
rowName
,
int
columnIndex
,
String
columnName
,
Integer
dataType
,
Integer
isReadOnly
,
String
description
,
List
<
PeriodCellTemplateConfig
>
configList
)
{
return
null
;
}
}
atms-api/src/main/resources/pwc/taxtech/atms/vat/dao/DataSourceMapper.xml
View file @
3b1cda94
...
...
@@ -484,6 +484,41 @@
WHERE report_id not in (${exceptReportTemplateIDs});
</if>
</delete>
<resultMap
id=
"DataSourceExtendDtoMap"
type=
"pwc.taxtech.atms.dto.vatdto.DataSourceExtendDto"
>
<id
column=
"id"
jdbcType=
"BIGINT"
property=
"id"
/>
<result
column=
"type"
jdbcType=
"INTEGER"
property=
"type"
/>
<result
column=
"name"
jdbcType=
"VARCHAR"
property=
"name"
/>
<result
column=
"amount"
jdbcType=
"DECIMAL"
property=
"amount"
/>
<result
column=
"description"
jdbcType=
"VARCHAR"
property=
"description"
/>
<result
column=
"key_value_data_id"
jdbcType=
"VARCHAR"
property=
"keyValueDataId"
/>
<result
column=
"create_by"
jdbcType=
"VARCHAR"
property=
"createBy"
/>
<result
column=
"create_time"
jdbcType=
"TIMESTAMP"
property=
"createTime"
/>
<result
column=
"update_by"
jdbcType=
"VARCHAR"
property=
"updateBy"
/>
<result
column=
"update_time"
jdbcType=
"TIMESTAMP"
property=
"updateTime"
/>
<result
column=
"row_name"
jdbcType=
"VARCHAR"
property=
"rowName"
/>
<result
column=
"column_name"
jdbcType=
"VARCHAR"
property=
"columnName"
/>
<result
column=
"row_index"
jdbcType=
"INTEGER"
property=
"rowIndex"
/>
<result
column=
"remap_batch_id"
jdbcType=
"VARCHAR"
property=
"remapBatchId"
/>
<result
column=
"column_index"
jdbcType=
"INTEGER"
property=
"columnIndex"
/>
<result
column=
"operation_type"
jdbcType=
"INTEGER"
property=
"operationType"
/>
<result
column=
"cell_template_id"
jdbcType=
"BIGINT"
property=
"cellTemplateID"
/>
<result
column=
"cell_data_id"
jdbcType=
"BIGINT"
property=
"cellDataID"
/>
</resultMap>
<select
id=
"getFormulaDataSource"
parameterType=
"java.lang.Long"
resultMap=
"DataSourceExtendDtoMap"
>
SELECT
ds.*,
cds.operation_type AS operation_type,
cd.cell_template_id AS cell_template_id,
cd.id AS cell_data_id
FROM data_source ds
JOIN cell_data_source cds
ON ds.id = cds.data_source_id
JOIN cell_data cd
ON cds.cell_data_id = cd.id
WHERE cd.report_id = #{reportID,jdbcType=BIGINT}
AND
<![CDATA[ ds.type <> 1 ]]>
</select>
<!--DELETE FROM period_tax_rule_setting WHERE period=#{period,jdbcType=INTEGER};-->
<!--DELETE FROM period_cell_template WHERE period=#{period,jdbcType=INTEGER} and report_template_id not in (${exceptReportTemplateIDs});-->
<!--DELETE FROM period_cell_template_config WHERE period=#{period,jdbcType=INTEGER} and report_template_id not in (${exceptReportTemplateIDs});-->
...
...
atms-api/src/main/resources/pwc/taxtech/atms/vat/dao/PeriodCellTemplateConfigMapper.xml
View file @
3b1cda94
This diff is collapsed.
Click to expand it.
atms-web/src/main/webapp/app/common/controls/vat-report-view/vat-report-view.ctrl.js
View file @
3b1cda94
This diff is collapsed.
Click to expand it.
atms-web/src/main/webapp/bundles/common.js
View file @
3b1cda94
This diff is collapsed.
Click to expand it.
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