|
|
@@ -6,9 +6,14 @@ import com.jeeplus.common.utils.JedisUtils;
|
|
|
import com.jeeplus.common.utils.StringUtils;
|
|
|
import com.jeeplus.modules.sys.entity.MainDictDetail;
|
|
|
import com.jeeplus.modules.sys.utils.DictUtils;
|
|
|
+import com.jeeplus.modules.workclientinfo.dao.WorkClientBankDao;
|
|
|
+import com.jeeplus.modules.workclientinfo.dao.WorkClientInfoDao;
|
|
|
+import com.jeeplus.modules.workclientinfo.entity.WorkClientBank;
|
|
|
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
|
|
|
import com.jeeplus.modules.workinvoice.dao.WorkInvoiceDao;
|
|
|
import com.jeeplus.modules.workinvoice.entity.OMS.OMSAccessTokenInfo;
|
|
|
import com.jeeplus.modules.workinvoice.entity.WorkInvoice;
|
|
|
+import com.jeeplus.modules.workinvoice.entity.WorkInvoiceTaxClassificationCode;
|
|
|
import com.jeeplus.modules.workinvoice.utils.HttpPostJsonUtil;
|
|
|
import com.jeeplus.modules.workinvoice.utils.OMSNationUtil;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
@@ -30,15 +35,19 @@ public class OMSDisposeService {
|
|
|
* 给accessToken查询的有效时间设置为1天
|
|
|
*/
|
|
|
private final int seconds = 86400;
|
|
|
- private static final String appId = Global.getConfig("appId");
|
|
|
- private static final String appKey = Global.getConfig("appKey");
|
|
|
- private static final String deptCode = Global.getConfig("deptCode");
|
|
|
+ private static final String appId = Global.getConfig("omsAppId");
|
|
|
+ private static final String appKey = Global.getConfig("omsAppKey");
|
|
|
+ private static final String deptCode = Global.getConfig("omsDeptCode");
|
|
|
//如果接口访问不正确,可以循环访问的次数
|
|
|
private final int remainRetryTimes = 20;
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
private WorkInvoiceDao workInvoiceDao;
|
|
|
+ @Autowired
|
|
|
+ private WorkClientInfoDao workClientInfoDao;
|
|
|
+ @Autowired
|
|
|
+ private WorkClientBankDao workClientBankDao;
|
|
|
|
|
|
/**
|
|
|
* 用于生成开蓝票信息
|
|
|
@@ -54,7 +63,7 @@ public class OMSDisposeService {
|
|
|
accessToken = jedis.get("OMSAccessToken");
|
|
|
if(StringUtils.isBlank(accessToken)){
|
|
|
// 获取AccessToken 9998重试5次
|
|
|
- accessToken = getOmsAccessTokenWithRetry(5, "accessToken", workInvoiceId);
|
|
|
+ accessToken = getOmsAccessTokenWithRetry(10, "accessToken", workInvoiceId);
|
|
|
if(StringUtils.isNotBlank(accessToken)){
|
|
|
jedis.setex("OMSAccessToken", seconds, accessToken);
|
|
|
map.put("token状态", "重新获取token成功,存入Redis");
|
|
|
@@ -72,45 +81,73 @@ public class OMSDisposeService {
|
|
|
OMSNationUtil util = new OMSNationUtil();
|
|
|
//获取需要开票的发票信息
|
|
|
WorkInvoice workInvoice = workInvoiceDao.get(workInvoiceId);
|
|
|
- if(null != workInvoice){
|
|
|
|
|
|
- List<MainDictDetail> billingContentList = DictUtils.getMainDictList("billing_content");
|
|
|
- for (MainDictDetail dictDetail: billingContentList) {
|
|
|
- if(workInvoice.getBillingContent().equals(dictDetail.getValue())){
|
|
|
- workInvoice.setBillingContent(dictDetail.getLabel());
|
|
|
- break;
|
|
|
+ if(null != workInvoice){
|
|
|
+ if(null != workInvoice.getClient() && StringUtils.isNotBlank(workInvoice.getClient().getId())){
|
|
|
+ //查询关联的客户开票信息
|
|
|
+ WorkClientInfo workClientInfo = workClientInfoDao.get(workInvoice.getClient().getId());
|
|
|
+ if(null != workClientInfo){
|
|
|
+ workInvoice.setClient(workClientInfo);
|
|
|
+ }else{
|
|
|
+ handleInvoiceRetryAllFail("",workInvoiceId, "开票获取发票信息失败"); // 解析失败直接兜底
|
|
|
+ return;
|
|
|
}
|
|
|
+ }else{
|
|
|
+ handleInvoiceRetryAllFail("",workInvoiceId, "开票获取发票信息失败"); // 解析失败直接兜底
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- //生成开票基础信息
|
|
|
- String string = util.neatenData(workInvoiceId,workInvoice);
|
|
|
+ WorkClientBank workClientBank = workClientBankDao.get(workInvoice.getBank());
|
|
|
+ if(null != workClientBank){
|
|
|
+ workInvoice.setBank(workClientBank.getOurBank());
|
|
|
+ }else{
|
|
|
+ handleInvoiceRetryAllFail("",workInvoiceId, "开票获取发票信息失败"); // 解析失败直接兜底
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- OMSAccessTokenInfo InvoiceTokenInfo = new OMSAccessTokenInfo();
|
|
|
- InvoiceTokenInfo.setAppId(appId);
|
|
|
- InvoiceTokenInfo.setAppKey(appKey);
|
|
|
- InvoiceTokenInfo.setExchangeId(UUID.randomUUID().toString());
|
|
|
- InvoiceTokenInfo.setAccessToken(accessToken);
|
|
|
- InvoiceTokenInfo.setData(string);
|
|
|
- String jsonInvoiceStr = JSON.toJSONString(InvoiceTokenInfo);
|
|
|
|
|
|
- String jsonInvoicResultStr = HttpPostJsonUtil.doPost("https://oms-sandbox.einvoice.js.cn:7079/prod-api/output/server/order/upload", jsonInvoiceStr);
|
|
|
- System.out.println("✅ 订单提交接口返回值:" + jsonInvoicResultStr);
|
|
|
- map.put("订单接口信息", jsonInvoicResultStr);
|
|
|
+ //判定开票内容是否关联税收编码
|
|
|
+ if(StringUtils.isNotBlank(workInvoice.getBillingContent())){
|
|
|
+ WorkInvoiceTaxClassificationCode billingContentDetail = workInvoiceDao.getBillingContentDetail(workInvoice);
|
|
|
+ if(null != billingContentDetail){
|
|
|
+ workInvoice.setBillingContent(billingContentDetail.getGoodName());
|
|
|
+ workInvoice.setGoodsTaxno(billingContentDetail.getGoodsTaxno());
|
|
|
+ }
|
|
|
+ //生成开票基础信息
|
|
|
+ String string = util.neatenData(workInvoiceId,workInvoice,billingContentDetail);
|
|
|
+
|
|
|
+ OMSAccessTokenInfo InvoiceTokenInfo = new OMSAccessTokenInfo();
|
|
|
+ InvoiceTokenInfo.setAppId(appId);
|
|
|
+ InvoiceTokenInfo.setAppKey(appKey);
|
|
|
+ InvoiceTokenInfo.setExchangeId(UUID.randomUUID().toString());
|
|
|
+ InvoiceTokenInfo.setAccessToken(accessToken);
|
|
|
+ InvoiceTokenInfo.setData(string);
|
|
|
+ String jsonInvoiceStr = JSON.toJSONString(InvoiceTokenInfo);
|
|
|
+
|
|
|
+ String jsonInvoicResultStr = HttpPostJsonUtil.doPost("https://oms-sandbox.einvoice.js.cn:7079/prod-api/output/server/order/upload", jsonInvoiceStr);
|
|
|
+ System.out.println("✅ 订单提交接口返回值:" + jsonInvoicResultStr);
|
|
|
+ map.put("订单接口信息", jsonInvoicResultStr);
|
|
|
+
|
|
|
+ // 调用订单上传重试方法(包含所有码值规则)
|
|
|
+ if(StringUtils.isNotBlank(jsonInvoicResultStr)){
|
|
|
+ //将上个节点获取的值存到数据库,留作redis崩溃后进行重新获取处理
|
|
|
+ workInvoice.setOrderForGoodsResultStr(jsonInvoicResultStr);
|
|
|
+ workInvoiceDao.updateOrderForGoodsResultStrById(workInvoice);
|
|
|
+
|
|
|
+
|
|
|
+ String finalAccessToken = accessToken;
|
|
|
+ String finalJsonInvoiceStr = jsonInvoiceStr;
|
|
|
+ executeOrderUploadRetry(workInvoiceId, remainRetryTimes, jsonInvoicResultStr, finalJsonInvoiceStr, finalAccessToken, map,"accessToken", "blueTicket");
|
|
|
+ }else{
|
|
|
+ handleInvoiceRetryAllFail(jsonInvoiceStr,workInvoiceId, "蓝票发送订单生成接口返回值为空,开票失败。节点访问参数为:" + jsonInvoicResultStr); // 解析失败直接兜底
|
|
|
|
|
|
- // 调用订单上传重试方法(包含所有码值规则)
|
|
|
- if(StringUtils.isNotBlank(jsonInvoicResultStr)){
|
|
|
- //将上个节点获取的值存到数据库,留作redis崩溃后进行重新获取处理
|
|
|
- workInvoice.setOrderForGoodsResultStr(jsonInvoicResultStr);
|
|
|
- workInvoiceDao.updateOrderForGoodsResultStrById(workInvoice);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ handleInvoiceRetryAllFail("",workInvoiceId, "开票获取发票信息失败"); // 解析失败直接兜底
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- String finalAccessToken = accessToken;
|
|
|
- String finalJsonInvoiceStr = jsonInvoiceStr;
|
|
|
- executeOrderUploadRetry(workInvoiceId, remainRetryTimes, jsonInvoicResultStr, finalJsonInvoiceStr, finalAccessToken, map,"accessToken", "blueTicket");
|
|
|
- }else{
|
|
|
- handleInvoiceRetryAllFail(jsonInvoiceStr,workInvoiceId, "蓝票发送订单生成接口返回值为空,开票失败。节点访问参数为:" + jsonInvoicResultStr); // 解析失败直接兜底
|
|
|
|
|
|
- }
|
|
|
}else{
|
|
|
handleInvoiceRetryAllFail("",workInvoiceId, "开票获取发票信息失败"); // 解析失败直接兜底
|
|
|
}
|
|
|
@@ -279,7 +316,7 @@ public class OMSDisposeService {
|
|
|
|
|
|
/**
|
|
|
* 用于访问接口返回9998时使用,存入Redis供定时任务处理
|
|
|
- * 硬编码配置:初始重试次数20次,Redis过期时间1天(86400秒)
|
|
|
+ * 硬编码配置:初始重试次数100次,Redis过期时间1天(86400秒)
|
|
|
* @param jsonInvoiceStr 订单上传的JSON参数
|
|
|
* @param accessToken AccessToken
|
|
|
* @param workInvoiceId 订单号
|
|
|
@@ -288,8 +325,8 @@ public class OMSDisposeService {
|
|
|
*/
|
|
|
public void saveInvoiceRetryScheduledTaskToRedis(String jsonInvoiceStr ,String accessToken, String workInvoiceId, String getKey, String initiationType) {
|
|
|
Jedis jedis = null;
|
|
|
- // 硬编码:初始重试次数20次
|
|
|
- final int INIT_RETRY_COUNT = 20;
|
|
|
+ // 硬编码:初始重试次数100次
|
|
|
+ final int INIT_RETRY_COUNT = 100;
|
|
|
// 硬编码:Redis任务过期时间1天(86400秒)
|
|
|
final int REDIS_EXPIRE_SECONDS = 86400;
|
|
|
|
|
|
@@ -358,10 +395,10 @@ public class OMSDisposeService {
|
|
|
//将错误信息保存到数据库
|
|
|
workInvoice.setOmsErrorMessage(errorMessage);
|
|
|
workInvoice.setOmsAccessToken(accessToken);
|
|
|
+ workInvoice.setInvoiceState("1");
|
|
|
//修改结果
|
|
|
workInvoiceDao.updateAccessTokenErrorById(workInvoice);
|
|
|
|
|
|
- //将业务流程进行撤回
|
|
|
|
|
|
//通知发起人或者开票管理员
|
|
|
}
|
|
|
@@ -391,7 +428,7 @@ public class OMSDisposeService {
|
|
|
accessToken = jedis.get("OMSAccessToken");
|
|
|
if(StringUtils.isBlank(accessToken)){
|
|
|
// 获取AccessToken 9998重试5次
|
|
|
- accessToken = getOmsAccessTokenWithRetry(5, "accessToken", workInvoiceId);
|
|
|
+ accessToken = getOmsAccessTokenWithRetry(10, "accessToken", workInvoiceId);
|
|
|
if(StringUtils.isNotBlank(accessToken)){
|
|
|
jedis.setex("OMSAccessToken", seconds, accessToken);
|
|
|
map.put("token状态", "重新获取token成功,存入Redis");
|
|
|
@@ -452,7 +489,7 @@ public class OMSDisposeService {
|
|
|
accessToken = jedis.get("OMSAccessToken");
|
|
|
if(StringUtils.isBlank(accessToken)){
|
|
|
// 获取AccessToken 9998重试5次
|
|
|
- accessToken = getOmsAccessTokenWithRetry(5, "accessToken", workInvoiceId);
|
|
|
+ accessToken = getOmsAccessTokenWithRetry(10, "accessToken", workInvoiceId);
|
|
|
if(StringUtils.isNotBlank(accessToken)){
|
|
|
jedis.setex("OMSAccessToken", seconds, accessToken);
|
|
|
map.put("token状态", "重新获取token成功,存入Redis");
|