Commit 7dc2f0b2 authored by hanfeng's avatar hanfeng

开票

parent 03b754a6
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;
}
}
......@@ -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;
}
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
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);
}
}
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> {
}
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);
}
}
}
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);
}
......@@ -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.getInvoiceDate()));
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
......
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