Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cloud-platform
Project
Project
Details
Activity
Releases
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
youjj
cloud-platform
Commits
7dc2f0b2
Commit
7dc2f0b2
authored
Jan 06, 2020
by
hanfeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
开票
parent
03b754a6
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
332 additions
and
22 deletions
+332
-22
InvoiceStatusEum.java
...om/xxfc/platform/universal/constant/InvoiceStatusEum.java
+31
-0
Invoice.java
...main/java/com/xxfc/platform/universal/entity/Invoice.java
+7
-6
NumberToCN.java
...in/java/com/xxfc/platform/universal/utils/NumberToCN.java
+129
-0
InvoiceController.java
...xxfc/platform/universal/controller/InvoiceController.java
+15
-10
InvoiceMapper.java
...ava/com/xxfc/platform/universal/mapper/InvoiceMapper.java
+13
-0
InvoiceBiz.java
.../java/com/xxfc/platform/universal/service/InvoiceBiz.java
+128
-0
InvoiceDao.java
...m/xxfc/platform/universal/service/invoice/InvoiceDao.java
+2
-1
InvoiceDaoImpl.java
...atform/universal/service/invoice/impl/InvoiceDaoImpl.java
+7
-5
No files found.
xx-universal/xx-universal-api/src/main/java/com/xxfc/platform/universal/constant/InvoiceStatusEum.java
0 → 100644
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
constant
;
import
lombok.Data
;
/**
* @Auther: Administrator
* @Date: 2020/1/6 18:04
* @Description:
*/
public
enum
InvoiceStatusEum
{
UNBILLED
(
0
,
"未开票"
),
ONGOING
(
1
,
"开票中"
),
SUCCESS
(
2
,
"开票成功"
),
FAILURE
(
3
,
"开票失败"
);
private
Integer
code
;
private
String
msg
;
InvoiceStatusEum
(
int
code
,
String
msg
)
{
this
.
code
=
code
;
this
.
msg
=
msg
;
}
public
Integer
getCode
()
{
return
code
;
}
public
String
getMsg
()
{
return
msg
;
}
}
xx-universal/xx-universal-api/src/main/java/com/xxfc/platform/universal/entity/Invoice.java
View file @
7dc2f0b2
...
...
@@ -7,7 +7,6 @@ import lombok.Data;
import
javax.persistence.*
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.List
;
@Data
@Table
(
name
=
"invoice"
)
...
...
@@ -15,11 +14,11 @@ import java.util.List;
public
class
Invoice
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
private
Integer
id
;
/**
* 用户id
*/
private
Long
userId
;
private
Integer
userId
;
/**
* 订单id :多个以逗号隔开
*/
...
...
@@ -195,11 +194,13 @@ public class Invoice {
* 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机
*/
private
Integer
pushMode
=
2
;
/**
* 开票代码
*/
private
String
invoiceSerialNum
;
private
String
createBy
;
private
String
updateBy
;
private
Date
createTime
;
private
Date
updateTime
;
@Column
(
insertable
=
false
,
updatable
=
false
)
private
List
<
OrderData
>
orders
;
}
xx-universal/xx-universal-api/src/main/java/com/xxfc/platform/universal/utils/NumberToCN.java
0 → 100644
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
utils
;
import
java.math.BigDecimal
;
/**
*
*
* 数字转换为汉语中人民币的大写<br>
*
*/
public
class
NumberToCN
{
/**
* 汉语中数字大写
*/
private
static
final
String
[]
CN_UPPER_NUMBER
=
{
"零"
,
"壹"
,
"贰"
,
"叁"
,
"肆"
,
"伍"
,
"陆"
,
"柒"
,
"捌"
,
"玖"
};
/**
* 汉语中货币单位大写,这样的设计类似于占位符
*/
private
static
final
String
[]
CN_UPPER_MONETRAY_UNIT
=
{
"分"
,
"角"
,
"元"
,
"拾"
,
"佰"
,
"仟"
,
"万"
,
"拾"
,
"佰"
,
"仟"
,
"亿"
,
"拾"
,
"佰"
,
"仟"
,
"兆"
,
"拾"
,
"佰"
,
"仟"
};
/**
* 特殊字符:整
*/
private
static
final
String
CN_FULL
=
"整"
;
/**
* 特殊字符:负
*/
private
static
final
String
CN_NEGATIVE
=
"负"
;
/**
* 金额的精度,默认值为2
*/
private
static
final
int
MONEY_PRECISION
=
2
;
/**
* 特殊字符:零元整
*/
private
static
final
String
CN_ZEOR_FULL
=
"零元"
+
CN_FULL
;
/**
* 把输入的金额转换为汉语中人民币的大写
*
* @param numberOfMoney
* 输入的金额
* @return 对应的汉语大写
*/
public
static
String
number2CNMontrayUnit
(
BigDecimal
numberOfMoney
)
{
StringBuffer
sb
=
new
StringBuffer
();
// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
// positive.
int
signum
=
numberOfMoney
.
signum
();
// 零元整的情况
if
(
signum
==
0
)
{
return
CN_ZEOR_FULL
;
}
// 这里会进行金额的四舍五入
long
number
=
numberOfMoney
.
movePointRight
(
MONEY_PRECISION
)
.
setScale
(
0
,
4
).
abs
().
longValue
();
// 得到小数点后两位值
long
scale
=
number
%
100
;
int
numUnit
=
0
;
int
numIndex
=
0
;
boolean
getZero
=
false
;
// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
if
(!(
scale
>
0
))
{
numIndex
=
2
;
number
=
number
/
100
;
getZero
=
true
;
}
if
((
scale
>
0
)
&&
(!(
scale
%
10
>
0
)))
{
numIndex
=
1
;
number
=
number
/
10
;
getZero
=
true
;
}
int
zeroSize
=
0
;
while
(
true
)
{
if
(
number
<=
0
)
{
break
;
}
// 每次获取到最后一个数
numUnit
=
(
int
)
(
number
%
10
);
if
(
numUnit
>
0
)
{
if
((
numIndex
==
9
)
&&
(
zeroSize
>=
3
))
{
sb
.
insert
(
0
,
CN_UPPER_MONETRAY_UNIT
[
6
]);
}
if
((
numIndex
==
13
)
&&
(
zeroSize
>=
3
))
{
sb
.
insert
(
0
,
CN_UPPER_MONETRAY_UNIT
[
10
]);
}
sb
.
insert
(
0
,
CN_UPPER_MONETRAY_UNIT
[
numIndex
]);
sb
.
insert
(
0
,
CN_UPPER_NUMBER
[
numUnit
]);
getZero
=
false
;
zeroSize
=
0
;
}
else
{
++
zeroSize
;
if
(!(
getZero
))
{
sb
.
insert
(
0
,
CN_UPPER_NUMBER
[
numUnit
]);
}
if
(
numIndex
==
2
)
{
if
(
number
>
0
)
{
sb
.
insert
(
0
,
CN_UPPER_MONETRAY_UNIT
[
numIndex
]);
}
}
else
if
(((
numIndex
-
2
)
%
4
==
0
)
&&
(
number
%
1000
>
0
))
{
sb
.
insert
(
0
,
CN_UPPER_MONETRAY_UNIT
[
numIndex
]);
}
getZero
=
true
;
}
// 让number每次都去掉最后一个数
number
=
number
/
10
;
++
numIndex
;
}
// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if
(
signum
==
-
1
)
{
sb
.
insert
(
0
,
CN_NEGATIVE
);
}
// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
if
(!(
scale
>
0
))
{
sb
.
append
(
CN_FULL
);
}
return
sb
.
toString
();
}
public
static
void
main
(
String
[]
args
)
{
double
money
=
2500.32
;
BigDecimal
numberOfMoney
=
new
BigDecimal
(
money
);
String
s
=
NumberToCN
.
number2CNMontrayUnit
(
numberOfMoney
);
System
.
out
.
println
(
"你输入的金额为:【"
+
money
+
"】 #--# ["
+
s
.
toString
()
+
"]"
);
}
}
\ No newline at end of file
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/controller/InvoiceController.java
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
controller
;
import
com.github.wxiaoqi.security.auth.client.annotation.IgnoreUserToken
;
import
com.github.wxiaoqi.security.auth.client.config.UserAuthConfig
;
import
com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil
;
import
com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo
;
import
com.github.wxiaoqi.security.common.msg.ObjectRestResponse
;
import
com.github.wxiaoqi.security.common.rest.BaseController
;
import
com.xxfc.platform.universal.entity.Invoice
;
import
com.xxfc.platform.universal.entity.vo.InvoiceVo
;
import
com.xxfc.platform.universal.service.InvoiceService
;
import
com.xxfc.platform.universal.service.InvoiceBiz
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
...
...
@@ -17,12 +23,11 @@ import java.util.Map;
* @Description:
*/
@RestController
@IgnoreUserToken
//
@IgnoreUserToken
@RequestMapping
(
"/invoice"
)
public
class
InvoiceController
{
@RequiredArgsConstructor
(
onConstructor_
={
@Autowired
}
)
public
class
InvoiceController
extends
BaseController
<
InvoiceBiz
,
Invoice
>
{
@Autowired
private
InvoiceService
invoiceService
;
/**
* 根据开票代码获取税号
...
...
@@ -31,7 +36,7 @@ public class InvoiceController {
*/
@GetMapping
(
"/dutyParagraph"
)
public
ObjectRestResponse
getDutyParagraphByCode
(
@RequestParam
(
"code"
)
String
code
){
String
dutyParagraph
=
invoiceService
.
getDutyParagraphByCode
(
code
);
String
dutyParagraph
=
baseBiz
.
getDutyParagraphByCode
(
code
);
return
ObjectRestResponse
.
succ
(
dutyParagraph
);
}
...
...
@@ -42,19 +47,19 @@ public class InvoiceController {
*/
@GetMapping
(
"/corporateName"
)
public
ObjectRestResponse
corporateName
(
@RequestParam
(
"name"
)
String
name
){
List
<
Map
<
String
,
String
>>
mapList
=
invoiceService
.
corporateName
(
name
);
List
<
Map
<
String
,
String
>>
mapList
=
baseBiz
.
corporateName
(
name
);
return
ObjectRestResponse
.
succ
(
mapList
);
}
@PostMapping
(
"/invoicing"
)
public
ObjectRestResponse
invoicing
(
@RequestBody
InvoiceVo
invoiceVo
){
String
invoicing
=
invoiceService
.
Invoicing
(
invoiceVo
);
public
ObjectRestResponse
invoicing
(
@RequestBody
InvoiceVo
invoiceVo
)
throws
Exception
{
String
invoicing
=
baseBiz
.
Invoicing
(
invoiceVo
);
return
ObjectRestResponse
.
succ
(
invoicing
);
}
@GetMapping
(
"/result"
)
public
ObjectRestResponse
invoiceResult
(
@RequestParam
(
"invoiceSerialNum"
)
String
invoiceSerialNum
){
String
result
=
invoiceService
.
invoiceResult
(
invoiceSerialNum
);
String
result
=
baseBiz
.
invoiceResult
(
invoiceSerialNum
);
return
ObjectRestResponse
.
succ
(
result
);
}
}
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/mapper/InvoiceMapper.java
0 → 100644
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
mapper
;
import
com.xxfc.platform.universal.entity.Invoice
;
import
tk.mybatis.mapper.common.Mapper
;
/**
* @author Administrator
* @Auther: Administrator
* @Date: 2020/1/6 16:38
* @Description:
*/
public
interface
InvoiceMapper
extends
Mapper
<
Invoice
>
{
}
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/service/Invoice
Service
.java
→
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/service/Invoice
Biz
.java
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
service
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.github.wxiaoqi.security.auth.client.config.UserAuthConfig
;
import
com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil
;
import
com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo
;
import
com.github.wxiaoqi.security.common.biz.BaseBiz
;
import
com.xxfc.platform.universal.constant.InvoiceStatusEum
;
import
com.xxfc.platform.universal.entity.Invoice
;
import
com.xxfc.platform.universal.entity.OrderData
;
import
com.xxfc.platform.universal.entity.vo.InvoiceVo
;
import
com.xxfc.platform.universal.mapper.InvoiceMapper
;
import
com.xxfc.platform.universal.service.invoice.InvoiceDao
;
import
com.xxfc.platform.universal.utils.NumberToCN
;
import
lombok.RequiredArgsConstructor
;
import
org.apache.commons.lang3.concurrent.BasicThreadFactory
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletRequest
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledThreadPoolExecutor
;
import
java.util.concurrent.TimeUnit
;
/**
* 发票服务
...
...
@@ -18,9 +35,14 @@ import java.util.Map;
* @Description:
*/
@Service
public
class
InvoiceService
{
@Autowired
private
InvoiceDao
invoiceDao
;
@RequiredArgsConstructor
(
onConstructor_
=
{
@Autowired
})
public
class
InvoiceBiz
extends
BaseBiz
<
InvoiceMapper
,
Invoice
>
{
private
final
InvoiceDao
invoiceDao
;
private
final
UserAuthConfig
userAuthConfig
;
private
final
HttpServletRequest
request
;
private
final
UserAuthUtil
userAuthUtil
;
private
final
ThreadPoolTaskExecutor
taskExecutor
;
private
static
final
String
salerName
=
"欣新房车网络科技(广东)股份有限公司"
;
//正式
...
...
@@ -39,6 +61,7 @@ public class InvoiceService {
private
static
final
String
clerk
=
"郑超"
;
// 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机
private
static
final
Integer
pushMode
=
2
;
private
static
final
ScheduledExecutorService
executorService
=
new
ScheduledThreadPoolExecutor
(
2
);
public
String
getDutyParagraphByCode
(
String
code
)
{
return
invoiceDao
.
getDutyParagraphByCode
(
code
);
...
...
@@ -48,7 +71,8 @@ public class InvoiceService {
return
invoiceDao
.
corporateName
(
name
);
}
public
String
Invoicing
(
InvoiceVo
invoiceVo
)
{
public
String
Invoicing
(
InvoiceVo
invoiceVo
)
throws
Exception
{
IJWTInfo
infoFromToken
=
userAuthUtil
.
getInfoFromToken
(
userAuthConfig
.
getToken
(
request
));
Invoice
invoice
=
new
Invoice
();
BeanUtils
.
copyProperties
(
invoiceVo
,
invoice
);
invoice
.
setSalerName
(
salerName
);
...
...
@@ -59,10 +83,46 @@ public class InvoiceService {
invoice
.
setReviewer
(
checker
);
invoice
.
setIssuer
(
clerk
);
invoice
.
setPushMode
(
pushMode
);
return
invoiceDao
.
Invoicing
(
invoice
);
invoice
.
setInvoiceDate
(
new
Date
());
List
<
OrderData
>
orders
=
invoiceVo
.
getOrders
();
//调用第三方开票
String
invoiceSerialNum
=
invoiceDao
.
Invoicing
(
invoice
,
orders
);
invoice
.
setInvoiceSerialNum
(
invoiceSerialNum
);
invoice
.
setUserId
(
Integer
.
valueOf
(
infoFromToken
.
getId
()));
//保存到数据库
mapper
.
insert
(
invoice
);
//异步查询开票结果
taskExecutor
.
execute
(()->{
queryInvoiceResult
(
invoiceSerialNum
,
invoice
.
getId
(),
0
);
});
return
invoiceSerialNum
;
}
public
String
invoiceResult
(
String
invoiceSerialNum
)
{
return
invoiceDao
.
invoiceResult
(
invoiceSerialNum
);
}
public
void
queryInvoiceResult
(
String
invoiceSerialNum
,
Integer
id
,
Integer
type
)
{
String
result
=
invoiceResult
(
invoiceSerialNum
);
JSONObject
jsonObject
=
JSON
.
parseObject
(
result
);
Map
<
String
,
Object
>
data
=
(
Map
<
String
,
Object
>)
jsonObject
.
get
(
"data"
);
Integer
status
=
(
Integer
)
data
.
get
(
"status"
);
if
(
InvoiceStatusEum
.
ONGOING
.
getCode
().
equals
(
status
)&&
type
==
0
){
executorService
.
schedule
(()->{
queryInvoiceResult
(
invoiceSerialNum
,
id
,
1
);
},
2
,
TimeUnit
.
HOURS
);
}
else
{
Invoice
invoice
=
new
Invoice
();
invoice
.
setId
(
id
);
invoice
.
setInvoiceStatus
(
status
);
invoice
.
setInvoiceCode
(
String
.
valueOf
(
data
.
get
(
"invoiceCode"
)));
invoice
.
setInvoiceNo
(
String
.
valueOf
(
data
.
get
(
"invoiceNum"
)));
invoice
.
setInvoiceAmount
(
BigDecimal
.
valueOf
((
Double
)
data
.
get
(
"invoiceNum"
)));
invoice
.
setTaxAmount
(
BigDecimal
.
valueOf
((
Double
)
data
.
get
(
"taxIncludedAmount"
)).
subtract
(
BigDecimal
.
valueOf
((
Double
)
data
.
get
(
"invoiceNum"
))));
invoice
.
setInvoiceSummaryAmount
(
BigDecimal
.
valueOf
((
Double
)
data
.
get
(
"taxIncludedAmount"
)));
invoice
.
setInvoiceSummaryAmountText
(
NumberToCN
.
number2CNMontrayUnit
(
BigDecimal
.
valueOf
((
Double
)
data
.
get
(
"taxIncludedAmount"
))));
mapper
.
updateByPrimaryKeySelective
(
invoice
);
}
}
}
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/service/invoice/InvoiceDao.java
View file @
7dc2f0b2
package
com
.
xxfc
.
platform
.
universal
.
service
.
invoice
;
import
com.xxfc.platform.universal.entity.Invoice
;
import
com.xxfc.platform.universal.entity.OrderData
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -15,7 +16,7 @@ public interface InvoiceDao {
String
getDutyParagraphByCode
(
String
code
);
String
Invoicing
(
Invoice
invoice
);
String
Invoicing
(
Invoice
invoice
,
List
<
OrderData
>
orders
);
String
invoiceResult
(
String
invoiceSerialNum
);
}
xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/service/invoice/impl/InvoiceDaoImpl.java
View file @
7dc2f0b2
...
...
@@ -107,7 +107,7 @@ public class InvoiceDaoImpl implements InvoiceDao {
@Override
public
String
Invoicing
(
Invoice
invoice
)
{
public
String
Invoicing
(
Invoice
invoice
,
List
<
OrderData
>
orders
)
{
NNOpenSDK
sdk
=
NNOpenSDK
.
getIntance
();
// API方法名
...
...
@@ -134,7 +134,7 @@ public class InvoiceDaoImpl implements InvoiceDao {
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
//销方信息
map
.
put
(
"orderNo"
,
invoice
.
getOrderId
());
map
.
put
(
"invoiceDate"
,
dateFormat
.
format
(
new
Date
()));
map
.
put
(
"invoiceDate"
,
dateFormat
.
format
(
invoice
.
getInvoice
Date
()));
map
.
put
(
"salerName"
,
invoice
.
getSalerName
());
map
.
put
(
"salerTaxNum"
,
invoice
.
getSalerTaxCode
());
map
.
put
(
"salerAddress"
,
invoice
.
getSalerAddressPhone
());
...
...
@@ -151,7 +151,6 @@ public class InvoiceDaoImpl implements InvoiceDao {
//订单信息
ArrayList
<
Map
<
String
,
String
>>
arrayList
=
Lists
.
newArrayList
();
map
.
put
(
"invoiceDetail"
,
arrayList
);
List
<
OrderData
>
orders
=
invoice
.
getOrders
();
for
(
OrderData
order
:
orders
)
{
HashMap
<
String
,
String
>
mx
=
new
HashMap
<>();
mx
.
put
(
"goodsName"
,
invoice
.
getContent
());
...
...
@@ -165,11 +164,14 @@ public class InvoiceDaoImpl implements InvoiceDao {
arrayList
.
add
(
mx
);
}
String
token
=
getTokenFP
();
String
jsonString
=
JSON
.
toJSONString
(
orderMap
);
//调用第三方接口
String
result
=
sdk
.
sendPostSyncRequest
(
url
,
senid
,
appKey2
,
appSecret2
,
token
,
taxnum2
,
method
,
jsonString
);
System
.
out
.
println
(
result
);
return
result
;
//把字符串json数据转换为map
JSONObject
jsonObject
=
JSON
.
parseObject
(
result
);
Map
<
String
,
String
>
data
=
(
Map
<
String
,
String
>)
jsonObject
.
get
(
"result"
);
return
data
.
get
(
"invoiceSerialNum"
);
}
@Override
...
...
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