Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-csf
Overview
Overview
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xingmin
yd-csf
Commits
0249e992
Commit
0249e992
authored
Mar 04, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
push
parent
f447d3aa
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
152 additions
and
9 deletions
+152
-9
yd-csf-api/src/main/java/com/yd/csf/api/controller/ApiCommissionExpectedController.java
+83
-0
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiExpectedFortuneServiceImpl.java
+40
-8
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/ExpectedFortuneServiceImpl.java
+15
-1
yd-csf-service/src/main/java/com/yd/csf/service/vo/PayableReportVO.java
+6
-0
yd-csf-service/src/main/java/com/yd/csf/service/vo/ReceivableReportVO.java
+6
-0
yd-csf-service/src/main/resources/mappers/CommissionExpectedMapper.xml
+2
-0
No files found.
yd-csf-api/src/main/java/com/yd/csf/api/controller/ApiCommissionExpectedController.java
View file @
0249e992
...
@@ -20,6 +20,9 @@ import com.yd.csf.service.vo.CommissionExpectedExportDTO;
...
@@ -20,6 +20,9 @@ import com.yd.csf.service.vo.CommissionExpectedExportDTO;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
import
com.yd.csf.service.vo.ReceivableReportVO
;
import
com.yd.csf.service.vo.ReceivableReportVO
;
import
com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient
;
import
com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest
;
import
com.yd.insurance.base.feign.response.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageResponse
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.tags.Tag
;
import
io.swagger.v3.oas.annotations.tags.Tag
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
...
@@ -31,7 +34,9 @@ import javax.servlet.http.HttpServletRequest;
...
@@ -31,7 +34,9 @@ import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.UnsupportedEncodingException
;
import
java.io.UnsupportedEncodingException
;
import
java.net.URLEncoder
;
import
java.net.URLEncoder
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
/**
/**
...
@@ -49,6 +54,8 @@ public class ApiCommissionExpectedController {
...
@@ -49,6 +54,8 @@ public class ApiCommissionExpectedController {
private
CommissionExpectedService
commissionExpectedService
;
private
CommissionExpectedService
commissionExpectedService
;
@Resource
@Resource
private
PolicyService
policyService
;
private
PolicyService
policyService
;
@Resource
private
ApiInsuranceReconciliationCompanyFeignClient
companyFeignClient
;
/**
/**
* 批量新增预计入账
* 批量新增预计入账
...
@@ -270,10 +277,86 @@ public class ApiCommissionExpectedController {
...
@@ -270,10 +277,86 @@ public class ApiCommissionExpectedController {
receivableReportPage
=
commissionExpectedService
.
receivableReportPage
(
reportPage
,
allExpectedIdList
);
receivableReportPage
=
commissionExpectedService
.
receivableReportPage
(
reportPage
,
allExpectedIdList
);
}
}
enrichReceivableReportWithCompanyName
(
receivableReportPage
);
// 组装返回结果
// 组装返回结果
ReceivableReportResponse
response
=
new
ReceivableReportResponse
();
ReceivableReportResponse
response
=
new
ReceivableReportResponse
();
response
.
setStatisticsVO
(
statisticsVO
);
response
.
setStatisticsVO
(
statisticsVO
);
response
.
setPage
(
receivableReportPage
);
response
.
setPage
(
receivableReportPage
);
return
Result
.
success
(
response
);
return
Result
.
success
(
response
);
}
}
/**
* 处理receivableReportPage
* @return
*/
private
void
enrichReceivableReportWithCompanyName
(
IPage
<
ReceivableReportVO
>
page
)
{
if
(
page
==
null
||
CollectionUtils
.
isEmpty
(
page
.
getRecords
()))
{
return
;
}
// 收集所有非空的对账公司 bizId(去重)
List
<
String
>
bizIdList
=
page
.
getRecords
().
stream
()
.
map
(
ReceivableReportVO:
:
getReconciliationCompanyBizId
)
.
filter
(
StringUtils:
:
isNotBlank
)
.
distinct
()
.
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
bizIdList
))
{
return
;
}
// 调用 Feign 批量查询对账公司信息
ApiInsuranceReconciliationCompanyPageRequest
request
=
new
ApiInsuranceReconciliationCompanyPageRequest
();
request
.
setReconciliationCompanyBizIdList
(
bizIdList
);
request
.
setPageNo
(
1
);
request
.
setPageSize
(
bizIdList
.
size
());
// 确保一次查全
Result
result
=
companyFeignClient
.
page
(
request
);
// 返回原始 Result 类型
if
(
result
==
null
||
result
.
getCode
()
!=
200
||
result
.
getData
()
==
null
)
{
return
;
}
// 由于实际数据类型是 IPage<ApiInsuranceReconciliationCompanyPageResponse>,进行安全转换
Object
data
=
result
.
getData
();
if
(!(
data
instanceof
IPage
<?>))
{
// 类型不符合预期,记录日志并返回
return
;
}
IPage
<?>
rawPage
=
(
IPage
<?>)
data
;
if
(
CollectionUtils
.
isEmpty
(
rawPage
.
getRecords
()))
{
return
;
}
// 提取 records,并安全转换为目标类型
List
<
ApiInsuranceReconciliationCompanyPageResponse
>
companyList
=
new
ArrayList
<>();
for
(
Object
record
:
rawPage
.
getRecords
())
{
if
(
record
instanceof
ApiInsuranceReconciliationCompanyPageResponse
)
{
companyList
.
add
((
ApiInsuranceReconciliationCompanyPageResponse
)
record
);
}
}
if
(
companyList
.
isEmpty
())
{
return
;
}
// 构建 bizId -> name 映射
Map
<
String
,
String
>
nameMap
=
companyList
.
stream
()
.
filter
(
c
->
StringUtils
.
isNotBlank
(
c
.
getReconciliationCompanyBizId
()))
.
collect
(
Collectors
.
toMap
(
ApiInsuranceReconciliationCompanyPageResponse:
:
getReconciliationCompanyBizId
,
ApiInsuranceReconciliationCompanyPageResponse:
:
getName
,
(
v1
,
v2
)
->
v1
// 重复时保留第一个
));
// 回填名称
for
(
ReceivableReportVO
vo
:
page
.
getRecords
())
{
if
(
StringUtils
.
isNotBlank
(
vo
.
getReconciliationCompanyBizId
()))
{
String
name
=
nameMap
.
get
(
vo
.
getReconciliationCompanyBizId
());
if
(
StringUtils
.
isNotBlank
(
name
))
{
vo
.
setReconciliationCompany
(
name
);
}
}
}
}
}
}
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiExpectedFortuneServiceImpl.java
View file @
0249e992
...
@@ -29,14 +29,8 @@ import com.yd.csf.service.dto.CommissionRuleBindingDto;
...
@@ -29,14 +29,8 @@ import com.yd.csf.service.dto.CommissionRuleBindingDto;
import
com.yd.csf.service.dto.QueryPolicyAndBrokerDto
;
import
com.yd.csf.service.dto.QueryPolicyAndBrokerDto
;
import
com.yd.csf.service.dto.QueryPolicyBrokerDto
;
import
com.yd.csf.service.dto.QueryPolicyBrokerDto
;
import
com.yd.csf.service.enums.FortuneStatusEnum
;
import
com.yd.csf.service.enums.FortuneStatusEnum
;
import
com.yd.csf.service.model.CommissionRuleBinding
;
import
com.yd.csf.service.model.*
;
import
com.yd.csf.service.model.ExpectedFortune
;
import
com.yd.csf.service.service.*
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.model.PolicyBroker
;
import
com.yd.csf.service.service.ICommissionRuleBindingService
;
import
com.yd.csf.service.service.IExpectedFortuneService
;
import
com.yd.csf.service.service.PolicyBrokerService
;
import
com.yd.csf.service.service.PolicyService
;
import
com.yd.csf.service.vo.ExpectedFortuneExportDTO
;
import
com.yd.csf.service.vo.ExpectedFortuneExportDTO
;
import
com.yd.csf.service.vo.ExpectedFortuneStatisticsVO
;
import
com.yd.csf.service.vo.ExpectedFortuneStatisticsVO
;
import
com.yd.csf.service.vo.PayableReportVO
;
import
com.yd.csf.service.vo.PayableReportVO
;
...
@@ -56,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional;
...
@@ -56,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional;
import
org.springframework.transaction.support.TransactionTemplate
;
import
org.springframework.transaction.support.TransactionTemplate
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
import
java.math.BigDecimal
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.math.RoundingMode
;
...
@@ -94,6 +89,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
...
@@ -94,6 +89,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
private
PolicyBrokerService
policyBrokerService
;
private
PolicyBrokerService
policyBrokerService
;
@Autowired
@Autowired
private
ApiSysDictFeignClient
apiSysDictFeignClient
;
private
ApiSysDictFeignClient
apiSysDictFeignClient
;
@Resource
private
PolicyFollowService
policyFollowService
;
/**
/**
* 生成预计发佣
* 生成预计发佣
...
@@ -861,6 +858,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
...
@@ -861,6 +858,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
payableReportPage
=
iExpectedFortuneService
.
payableReportPage
(
reportPage
,
allFortuneIdList
);
payableReportPage
=
iExpectedFortuneService
.
payableReportPage
(
reportPage
,
allFortuneIdList
);
}
}
payableReportPage
=
convertPayableReportVO
(
payableReportPage
);
// 组装返回结果
// 组装返回结果
PayableReportResponse
response
=
new
PayableReportResponse
();
PayableReportResponse
response
=
new
PayableReportResponse
();
response
.
setStatisticsVO
(
statisticsVO
);
response
.
setStatisticsVO
(
statisticsVO
);
...
@@ -868,6 +866,40 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
...
@@ -868,6 +866,40 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
return
Result
.
success
(
response
);
return
Result
.
success
(
response
);
}
}
public
IPage
<
PayableReportVO
>
convertPayableReportVO
(
IPage
<
PayableReportVO
>
payableReportPage
)
{
if
(!
CollectionUtils
.
isEmpty
(
payableReportPage
.
getRecords
()))
{
List
<
String
>
policyNoList
=
payableReportPage
.
getRecords
().
stream
().
map
(
PayableReportVO:
:
getPolicyNo
).
collect
(
Collectors
.
toList
());
List
<
Policy
>
policyList
=
new
ArrayList
<>();
List
<
PolicyFollow
>
policyFollowList
=
new
ArrayList
<>();
if
(!
CollectionUtils
.
isEmpty
(
policyNoList
))
{
policyList
=
policyService
.
lambdaQuery
()
.
in
(
Policy:
:
getPolicyNo
,
policyNoList
)
.
list
();
policyFollowList
=
policyFollowService
.
lambdaQuery
()
.
in
(
PolicyFollow:
:
getPolicyNo
,
policyNoList
)
.
list
();
}
Map
<
String
,
Policy
>
policyMap
=
policyList
.
stream
()
.
collect
(
Collectors
.
toMap
(
Policy:
:
getPolicyNo
,
Function
.
identity
()));
Map
<
String
,
PolicyFollow
>
policyFollowMap
=
policyFollowList
.
stream
()
.
collect
(
Collectors
.
toMap
(
PolicyFollow:
:
getPolicyNo
,
Function
.
identity
()));
List
<
PayableReportVO
>
voList
=
payableReportPage
.
getRecords
().
stream
().
map
(
vo
->
{
Policy
policy
=
policyMap
.
get
(
vo
.
getPolicyNo
());
PolicyFollow
policyFollow
=
policyFollowMap
.
get
(
vo
.
getPolicyNo
());
if
(
policy
!=
null
)
{
vo
.
setPolicyCurrency
(
policy
.
getCurrency
());
}
if
(
policyFollow
!=
null
)
{
vo
.
setProductName
(
policyFollow
.
getProductName
());
vo
.
setProductLaunchBizId
(
policyFollow
.
getProductLaunchBizId
());
}
return
vo
;
}).
collect
(
Collectors
.
toList
());
payableReportPage
.
setRecords
(
voList
);
}
return
payableReportPage
;
}
/**
/**
* 创建应付款编号 应付款类型-CSF-年份后两位-6位数字(不重复)
* 创建应付款编号 应付款类型-CSF-年份后两位-6位数字(不重复)
*
*
...
...
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/ExpectedFortuneServiceImpl.java
View file @
0249e992
...
@@ -9,8 +9,10 @@ import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
...
@@ -9,8 +9,10 @@ import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import
com.yd.csf.service.model.ExpectedFortune
;
import
com.yd.csf.service.model.ExpectedFortune
;
import
com.yd.csf.service.dao.ExpectedFortuneMapper
;
import
com.yd.csf.service.dao.ExpectedFortuneMapper
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.model.PolicyFollow
;
import
com.yd.csf.service.service.IExpectedFortuneService
;
import
com.yd.csf.service.service.IExpectedFortuneService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.yd.csf.service.service.PolicyFollowService
;
import
com.yd.csf.service.service.PolicyService
;
import
com.yd.csf.service.service.PolicyService
;
import
com.yd.csf.service.vo.ExpectedFortuneStatisticsVO
;
import
com.yd.csf.service.vo.ExpectedFortuneStatisticsVO
;
import
com.yd.csf.service.vo.PayableReportVO
;
import
com.yd.csf.service.vo.PayableReportVO
;
...
@@ -37,6 +39,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
...
@@ -37,6 +39,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
@Resource
@Resource
private
PolicyService
policyService
;
private
PolicyService
policyService
;
@Resource
private
PolicyFollowService
policyFollowService
;
@Override
@Override
public
IPage
<
ApiExpectedFortunePageResponse
>
page
(
Page
<
ApiExpectedFortunePageResponse
>
page
,
public
IPage
<
ApiExpectedFortunePageResponse
>
page
(
Page
<
ApiExpectedFortunePageResponse
>
page
,
ApiExpectedFortunePageRequest
request
)
{
ApiExpectedFortunePageRequest
request
)
{
...
@@ -87,19 +92,28 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
...
@@ -87,19 +92,28 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
List
<
Policy
>
policyList
=
policyService
.
lambdaQuery
()
List
<
Policy
>
policyList
=
policyService
.
lambdaQuery
()
.
in
(
Policy:
:
getPolicyNo
,
expectedFortuneList
.
stream
().
map
(
ExpectedFortune:
:
getPolicyNo
).
collect
(
Collectors
.
toList
()))
.
in
(
Policy:
:
getPolicyNo
,
expectedFortuneList
.
stream
().
map
(
ExpectedFortune:
:
getPolicyNo
).
collect
(
Collectors
.
toList
()))
.
list
();
.
list
();
List
<
PolicyFollow
>
policyFollowList
=
policyFollowService
.
lambdaQuery
()
.
in
(
PolicyFollow:
:
getPolicyNo
,
expectedFortuneList
.
stream
().
map
(
ExpectedFortune:
:
getPolicyNo
).
collect
(
Collectors
.
toList
()))
.
list
();
Map
<
String
,
Policy
>
policyMap
=
policyList
.
stream
()
Map
<
String
,
Policy
>
policyMap
=
policyList
.
stream
()
.
collect
(
Collectors
.
toMap
(
Policy:
:
getPolicyNo
,
Function
.
identity
()));
.
collect
(
Collectors
.
toMap
(
Policy:
:
getPolicyNo
,
Function
.
identity
()));
Map
<
String
,
PolicyFollow
>
policyFollowMap
=
policyFollowList
.
stream
()
.
collect
(
Collectors
.
toMap
(
PolicyFollow:
:
getPolicyNo
,
Function
.
identity
()));
List
<
ApiExpectedFortunePageResponse
>
expectedFortuneVOList
=
expectedFortuneList
.
stream
().
map
(
expectedFortune
->
{
List
<
ApiExpectedFortunePageResponse
>
expectedFortuneVOList
=
expectedFortuneList
.
stream
().
map
(
expectedFortune
->
{
ApiExpectedFortunePageResponse
expectedFortuneVO
=
new
ApiExpectedFortunePageResponse
();
ApiExpectedFortunePageResponse
expectedFortuneVO
=
new
ApiExpectedFortunePageResponse
();
BeanUtils
.
copyProperties
(
expectedFortune
,
expectedFortuneVO
);
BeanUtils
.
copyProperties
(
expectedFortune
,
expectedFortuneVO
);
Policy
policy
=
policyMap
.
get
(
expectedFortune
.
getPolicyNo
());
Policy
policy
=
policyMap
.
get
(
expectedFortune
.
getPolicyNo
());
PolicyFollow
policyFollow
=
policyFollowMap
.
get
(
expectedFortune
.
getPolicyNo
());
if
(
policy
!=
null
)
{
if
(
policy
!=
null
)
{
expectedFortuneVO
.
setInsuranceCompany
(
policy
.
getInsuranceCompany
());
expectedFortuneVO
.
setInsuranceCompany
(
policy
.
getInsuranceCompany
());
expectedFortuneVO
.
setProductName
(
policy
.
getProductName
());
expectedFortuneVO
.
setPremium
(
policy
.
getPaymentPremium
());
expectedFortuneVO
.
setPremium
(
policy
.
getPaymentPremium
());
}
}
if
(
policyFollow
!=
null
)
{
expectedFortuneVO
.
setProductName
(
policyFollow
.
getProductName
());
expectedFortuneVO
.
setProductLaunchBizId
(
policyFollow
.
getProductLaunchBizId
());
}
return
expectedFortuneVO
;
return
expectedFortuneVO
;
}).
collect
(
Collectors
.
toList
());
}).
collect
(
Collectors
.
toList
());
return
expectedFortuneVOList
;
return
expectedFortuneVOList
;
...
...
yd-csf-service/src/main/java/com/yd/csf/service/vo/PayableReportVO.java
View file @
0249e992
...
@@ -89,6 +89,12 @@ public class PayableReportVO {
...
@@ -89,6 +89,12 @@ public class PayableReportVO {
private
String
currency
;
private
String
currency
;
/**
/**
* 保单币种
*/
@Schema
(
description
=
"保单币种"
)
private
String
policyCurrency
;
/**
* 应出账金额(港币)
* 应出账金额(港币)
*/
*/
@Schema
(
description
=
"应出账金额(港币)"
)
@Schema
(
description
=
"应出账金额(港币)"
)
...
...
yd-csf-service/src/main/java/com/yd/csf/service/vo/ReceivableReportVO.java
View file @
0249e992
...
@@ -31,6 +31,12 @@ public class ReceivableReportVO {
...
@@ -31,6 +31,12 @@ public class ReceivableReportVO {
private
String
reconciliationCompany
;
private
String
reconciliationCompany
;
/**
/**
* 对账公司Id
*/
@Schema
(
description
=
"对账公司Id"
)
private
String
reconciliationCompanyBizId
;
/**
* 入账期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
* 入账期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
*/
@Schema
(
description
=
"入账期数"
)
@Schema
(
description
=
"入账期数"
)
...
...
yd-csf-service/src/main/resources/mappers/CommissionExpectedMapper.xml
View file @
0249e992
...
@@ -70,6 +70,7 @@
...
@@ -70,6 +70,7 @@
null as receivableNo,
null as receivableNo,
ce.policy_no as policyNo,
ce.policy_no as policyNo,
MAX(ce.reconciliation_company) as reconciliationCompany,
MAX(ce.reconciliation_company) as reconciliationCompany,
MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
ce.commission_period as commissionPeriod,
MAX(ce.total_period) as totalPeriod,
MAX(ce.total_period) as totalPeriod,
DATE_ADD(DATE_ADD(MAX(p.effective_date), INTERVAL 2 MONTH), INTERVAL (ce.commission_period - 1) YEAR) as commissionDate,
DATE_ADD(DATE_ADD(MAX(p.effective_date), INTERVAL 2 MONTH), INTERVAL (ce.commission_period - 1) YEAR) as commissionDate,
...
@@ -110,6 +111,7 @@
...
@@ -110,6 +111,7 @@
ce.receivable_no as receivableNo,
ce.receivable_no as receivableNo,
ce.policy_no as policyNo,
ce.policy_no as policyNo,
ce.reconciliation_company as reconciliationCompany,
ce.reconciliation_company as reconciliationCompany,
ce.reconciliation_company_biz_id as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
ce.commission_period as commissionPeriod,
ce.total_period as totalPeriod,
ce.total_period as totalPeriod,
ce.commission_date as commissionDate,
ce.commission_date as commissionDate,
...
...
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