Merge remote-tracking branch 'origin/1130-查验接口加上幂等校验' into release

# Conflicts:
#	dxhy-erp/pom.xml
#	dxhy-erp/src/main/java/com/dxhy/erp/controller/SDNYMainProcessController.java
release
wangrangrang 2 years ago
commit 7c31e89e4d
  1. 4
      dxhy-erp/pom.xml
  2. 355
      dxhy-erp/src/main/java/com/dxhy/erp/controller/SDNYMainProcessController.java

@ -156,6 +156,10 @@
<artifactId>spring-cloud-starter-bootstrap</artifactId> <artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.2</version> <version>3.0.2</version>
</dependency> </dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>

@ -12,7 +12,6 @@ import com.dxhy.common.exception.BaseException;
import com.dxhy.common.util.InvoiceUtil; import com.dxhy.common.util.InvoiceUtil;
import com.dxhy.common.utils.Base64Encoding; import com.dxhy.common.utils.Base64Encoding;
import com.dxhy.common.utils.R; import com.dxhy.common.utils.R;
import com.dxhy.erp.dao.*;
import com.dxhy.erp.entity.*; import com.dxhy.erp.entity.*;
import com.dxhy.erp.entity.sdny.*; import com.dxhy.erp.entity.sdny.*;
import com.dxhy.erp.model.InvoiceDetailInfo; import com.dxhy.erp.model.InvoiceDetailInfo;
@ -21,11 +20,14 @@ import com.dxhy.erp.utils.Base64;
import com.dxhy.erp.utils.HmacSHA1Util; import com.dxhy.erp.utils.HmacSHA1Util;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -86,6 +88,9 @@ public class SDNYMainProcessController extends AbstractController {
@Autowired @Autowired
private ImageSubmitService imageSubmitService; private ImageSubmitService imageSubmitService;
@Resource
private RedissonClient redisson;
/** /**
* 查验发票 * 查验发票
*/ */
@ -489,142 +494,154 @@ public class SDNYMainProcessController extends AbstractController {
@SysLog("发票查验") @SysLog("发票查验")
public ResponseEntity<String> singleInvoiceCheck(@RequestBody Map<String, String> pramsMap) throws Exception { public ResponseEntity<String> singleInvoiceCheck(@RequestBody Map<String, String> pramsMap) throws Exception {
log.info("传入的参数为:{}", pramsMap); log.info("传入的参数为:{}", pramsMap);
String dbName = "business"; String param = JSONObject.toJSONString(pramsMap);
JSONObject checkInvoiceResult = null; //加分布式锁
String lockKey = Base64Utils.encodeToString(param.getBytes());
InvoiceUtil iu = new InvoiceUtil(pramsMap.get("invoiceCode")); boolean isLock = false;
String fplxdm = iu.getFplxdm(); RLock lock = redisson.getLock(lockKey);
if (fplxdm != null || "10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType")) || pramsMap.get("invoiceCode").startsWith("50000")) { try {
//查验类发票,执行查验操作后入库 isLock = lock.tryLock();
log.info("查验类发票,执行查验操作后入库");
//权限校验
if (StringUtils.isBlank(pramsMap.get("invoiceNumber"))) {
return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票号码不能为空!")));
}
pramsMap.put("invoiceNo", pramsMap.get("invoiceNumber"));
if (StringUtils.isNotBlank(pramsMap.get("billingDate"))) { if (!isLock) {
String billingDate = pramsMap.get("billingDate").replaceAll("-", ""); log.info("当前已有线程获取到锁");
iu.setKprq(pramsMap.get("billingDate"));
pramsMap.put("invoiceDate", billingDate);
pramsMap.put("billingDate", billingDate);
} else { } else {
return ResponseEntity.ok(JSONObject.toJSONString(R.error("开票日期不能为空!")));
}
if (StringUtils.isBlank(pramsMap.get("invoiceType"))) { String dbName = "business";
return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票类型不能为空!"))); JSONObject checkInvoiceResult = null;
}
InvoiceUtil iu = new InvoiceUtil(pramsMap.get("invoiceCode"));
if (SNFplxEnum.ZP.getSnFplxDm().equals(pramsMap.get("invoiceType")) String fplxdm = iu.getFplxdm();
|| SNFplxEnum.JDC.getSnFplxDm().equals(pramsMap.get("invoiceType")) if (fplxdm != null || "10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType")) || pramsMap.get("invoiceCode").startsWith("50000")) {
|| SNFplxEnum.DZZP.getSnFplxDm().equals(pramsMap.get("invoiceType")) //查验类发票,执行查验操作后入库
|| SNFplxEnum.ESC.getSnFplxDm().equals(pramsMap.get("invoiceType")) log.info("查验类发票,执行查验操作后入库");
|| SNFplxEnum.QDZP.getSnFplxDm().equals(pramsMap.get("invoiceType")) //权限校验
|| SNFplxEnum.QDPP.getSnFplxDm().equals(pramsMap.get("invoiceType"))) { if (StringUtils.isBlank(pramsMap.get("invoiceNumber"))) {
if (StringUtils.isBlank(pramsMap.get("totalAmount"))) { return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票号码不能为空!")));
return ResponseEntity.ok(JSONObject.toJSONString(R.error("金额不能为空!"))); }
}
} else {
if (StringUtils.isBlank(pramsMap.get("checkCode"))) {
return ResponseEntity.ok(JSONObject.toJSONString(R.error("校验码不能为空!")));
}
}
if ("10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType"))) { pramsMap.put("invoiceNo", pramsMap.get("invoiceNumber"));
pramsMap.put("invoiceType", "21");
}
log.info("发票类型为:{}", pramsMap.get("invoiceType")); if (StringUtils.isNotBlank(pramsMap.get("billingDate"))) {
String billingDate = pramsMap.get("billingDate").replaceAll("-", "");
iu.setKprq(pramsMap.get("billingDate"));
pramsMap.put("invoiceDate", billingDate);
pramsMap.put("billingDate", billingDate);
} else {
return ResponseEntity.ok(JSONObject.toJSONString(R.error("开票日期不能为空!")));
}
String uuid = (StringUtils.isBlank(pramsMap.get("invoiceCode")) ? "" : pramsMap.get("invoiceCode")) + pramsMap.get("invoiceNo"); if (StringUtils.isBlank(pramsMap.get("invoiceType"))) {
log.info("uuid={}", uuid); return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票类型不能为空!")));
String notes = invoiceQueryService.checkingInvoiceInfo("business", uuid, getUserInfo()); }
if (notes != null) {
return ResponseEntity.ok(JSONObject.toJSONString(R.error(notes)));
}
//非通行费类发票 先判断底账库中是否已存在 if (SNFplxEnum.ZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
if (!"32000".equals(pramsMap.get("invoiceType"))) { || SNFplxEnum.JDC.getSnFplxDm().equals(pramsMap.get("invoiceType"))
//查询底账库是否有对应发票,有则直接返回 || SNFplxEnum.DZZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
QueryWrapper<BaseTDxRecordInvoice> recordWrapper = new QueryWrapper<>(); || SNFplxEnum.ESC.getSnFplxDm().equals(pramsMap.get("invoiceType"))
recordWrapper.eq("uuid", uuid); || SNFplxEnum.QDZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
BaseTDxRecordInvoice checkInvoiceByUuid = snPushCheckRecordService.selectRecordByWrapper(recordWrapper); || SNFplxEnum.QDPP.getSnFplxDm().equals(pramsMap.get("invoiceType"))) {
if (checkInvoiceByUuid != null) { if (StringUtils.isBlank(pramsMap.get("totalAmount"))) {
log.info("进项票池已存在发票.直接返回票池信息"); return ResponseEntity.ok(JSONObject.toJSONString(R.error("金额不能为空!")));
R data = new R(1000, "default success"); }
} else {
if (StringUtils.isBlank(pramsMap.get("checkCode"))) {
return ResponseEntity.ok(JSONObject.toJSONString(R.error("校验码不能为空!")));
}
}
//如果购方名称为空,则查验之后补充购销方相关信息 if ("10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType"))) {
String gfName = checkInvoiceByUuid.getGfName(); pramsMap.put("invoiceType", "21");
String gfAddressAndPhone = checkInvoiceByUuid.getGfAddressAndPhone(); }
if(StringUtils.isEmpty(gfName) || StringUtils.isEmpty(gfAddressAndPhone)){
log.info("购方名称为空,查验补充信息");
checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, null);
if (!checkInvoiceResult.containsKey("code")) { log.info("发票类型为:{}", pramsMap.get("invoiceType"));
if (!checkInvoiceResult.containsKey("cyjg")) {
snPushCheckRecordService.updateInvoice(dbName, checkInvoiceResult, recordWrapper);
} else if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
data = errorInfo(checkInvoiceResult, data);
return ResponseEntity.ok(JSONObject.toJSONString(data));
} String uuid = (StringUtils.isBlank(pramsMap.get("invoiceCode")) ? "" : pramsMap.get("invoiceCode")) + pramsMap.get("invoiceNo");
} log.info("uuid={}", uuid);
checkInvoiceByUuid = snPushCheckRecordService.selectRecordByWrapper(recordWrapper); String notes = invoiceQueryService.checkingInvoiceInfo("business", uuid, getUserInfo());
if (notes != null) {
return ResponseEntity.ok(JSONObject.toJSONString(R.error(notes)));
} }
String invoiceNo = checkInvoiceByUuid.getInvoiceNo(); //非通行费类发票 先判断底账库中是否已存在
QueryWrapper<BaseTDxRecordInvoiceDetail> detailWrapper = new QueryWrapper<>(); if (!"32000".equals(pramsMap.get("invoiceType"))) {
detailWrapper.eq("uuid", uuid); //查询底账库是否有对应发票,有则直接返回
QueryWrapper<BaseTDxRecordInvoice> recordWrapper = new QueryWrapper<>();
recordWrapper.eq("uuid", uuid);
BaseTDxRecordInvoice checkInvoiceByUuid = snPushCheckRecordService.selectRecordByWrapper(recordWrapper);
if (checkInvoiceByUuid != null) {
log.info("进项票池已存在发票.直接返回票池信息");
R data = new R(1000, "default success");
//如果购方名称为空,则查验之后补充购销方相关信息
String gfName = checkInvoiceByUuid.getGfName();
String gfAddressAndPhone = checkInvoiceByUuid.getGfAddressAndPhone();
if (StringUtils.isEmpty(gfName) || StringUtils.isEmpty(gfAddressAndPhone)) {
log.info("购方名称为空,查验补充信息");
checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, null);
if (!checkInvoiceResult.containsKey("code")) {
if (!checkInvoiceResult.containsKey("cyjg")) {
snPushCheckRecordService.updateInvoice(dbName, checkInvoiceResult, recordWrapper);
} else if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
data = errorInfo(checkInvoiceResult, data);
return ResponseEntity.ok(JSONObject.toJSONString(data));
List<BaseTDxRecordInvoiceDetail> baseTDxRecordInvoiceDetail = null; }
List<TDxVehicleSaleInvoice> vehicleList = null; }
if ("10104".equals(pramsMap.get("invoiceType")) || "10105".equals(pramsMap.get("invoiceType"))) { checkInvoiceByUuid = snPushCheckRecordService.selectRecordByWrapper(recordWrapper);
vehicleList = snPushCheckRecordService.vihicleList(uuid); }
} else {
baseTDxRecordInvoiceDetail = snPushCheckRecordService.selectRecordDetailListByWrapper(detailWrapper);
}
if ((baseTDxRecordInvoiceDetail == null || baseTDxRecordInvoiceDetail.size() == 0) && (vehicleList == null || vehicleList.size() == 0)) { String invoiceNo = checkInvoiceByUuid.getInvoiceNo();
checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, null); QueryWrapper<BaseTDxRecordInvoiceDetail> detailWrapper = new QueryWrapper<>();
detailWrapper.eq("uuid", uuid);
if (!checkInvoiceResult.containsKey("code")) { List<BaseTDxRecordInvoiceDetail> baseTDxRecordInvoiceDetail = null;
if (!checkInvoiceResult.containsKey("cyjg")) { List<TDxVehicleSaleInvoice> vehicleList = null;
//先删除原有主数据,再查验更新主数据和明细数据 if ("10104".equals(pramsMap.get("invoiceType")) || "10105".equals(pramsMap.get("invoiceType"))) {
snPushCheckRecordService.updateInvoice(dbName, checkInvoiceResult, recordWrapper); vehicleList = snPushCheckRecordService.vihicleList(uuid);
} else {
baseTDxRecordInvoiceDetail = snPushCheckRecordService.selectRecordDetailListByWrapper(detailWrapper);
}
if ("10104".equals(pramsMap.get("invoiceType")) || "10105".equals(pramsMap.get("invoiceType"))) { if ((baseTDxRecordInvoiceDetail == null || baseTDxRecordInvoiceDetail.size() == 0) && (vehicleList == null || vehicleList.size() == 0)) {
vehicleList = snPushCheckRecordService.vihicleList(uuid); checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, null);
} else {
baseTDxRecordInvoiceDetail = snPushCheckRecordService.selectRecordDetailListByWrapper(detailWrapper); if (!checkInvoiceResult.containsKey("code")) {
if (!checkInvoiceResult.containsKey("cyjg")) {
//先删除原有主数据,再查验更新主数据和明细数据
snPushCheckRecordService.updateInvoice(dbName, checkInvoiceResult, recordWrapper);
if ("10104".equals(pramsMap.get("invoiceType")) || "10105".equals(pramsMap.get("invoiceType"))) {
vehicleList = snPushCheckRecordService.vihicleList(uuid);
} else {
baseTDxRecordInvoiceDetail = snPushCheckRecordService.selectRecordDetailListByWrapper(detailWrapper);
}
} else if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
data = errorInfo(checkInvoiceResult, data);
return ResponseEntity.ok(JSONObject.toJSONString(data));
}
} }
} else if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
data = errorInfo(checkInvoiceResult, data);
return ResponseEntity.ok(JSONObject.toJSONString(data));
} }
} JSONObject checkInvoice = (JSONObject) JSONObject.toJSON(checkInvoiceByUuid);
} JSONArray checkInvoiceDetail = (JSONArray) JSONObject.toJSON(baseTDxRecordInvoiceDetail);
JSONObject checkInvoice = (JSONObject) JSONObject.toJSON(checkInvoiceByUuid); JSONObject vehicleDetail = new JSONObject();
JSONArray checkInvoiceDetail = (JSONArray) JSONObject.toJSON(baseTDxRecordInvoiceDetail); if (vehicleList != null && vehicleList.size() > 0) {
JSONObject vehicleDetail = new JSONObject(); vehicleDetail = (JSONObject) JSONObject.toJSON(vehicleList.get(0));
if(vehicleList != null && vehicleList.size() > 0) { }
vehicleDetail = (JSONObject) JSONObject.toJSON(vehicleList.get(0));
}
convertToResult(checkInvoice, checkInvoiceDetail, vehicleDetail); convertToResult(checkInvoice, checkInvoiceDetail, vehicleDetail);
data.put("data", checkInvoice); data.put("data", checkInvoice);
//查验结果保存 //查验结果保存
//saveCheckLog(pramsMap, checkInvoice); //saveCheckLog(pramsMap, checkInvoice);
return ResponseEntity.ok(JSONObject.toJSONString(data)); return ResponseEntity.ok(JSONObject.toJSONString(data));
} else { } else {
TdxSaleRecordInvoice tdxSaleRecordInvoice = snPushCheckRecordService.selectSaleByUuid(uuid); TdxSaleRecordInvoice tdxSaleRecordInvoice = snPushCheckRecordService.selectSaleByUuid(uuid);
log.info("tdxSaleRecordInvoice={}", tdxSaleRecordInvoice); log.info("tdxSaleRecordInvoice={}", tdxSaleRecordInvoice);
if (tdxSaleRecordInvoice != null) { if (tdxSaleRecordInvoice != null) {
log.info("销项票池已存在发票.直接返回票池信息"); log.info("销项票池已存在发票.直接返回票池信息");
R data = new R(1000, "default success"); R data = new R(1000, "default success");
String invoiceNo = tdxSaleRecordInvoice.getInvoiceNo(); String invoiceNo = tdxSaleRecordInvoice.getInvoiceNo();
QueryWrapper<RecordInvoiceSaleDetailModel> saleDetailWrapper = new QueryWrapper<>(); QueryWrapper<RecordInvoiceSaleDetailModel> saleDetailWrapper = new QueryWrapper<>();
@ -656,51 +673,51 @@ public class SDNYMainProcessController extends AbstractController {
} }
convertToResult(checkInvoice, saleDetail); convertToResult(checkInvoice, saleDetail);
data.put("data", checkInvoice); data.put("data", checkInvoice);
//查验结果保存 //查验结果保存
// saveCheckLog(pramsMap,checkInvoice); // saveCheckLog(pramsMap,checkInvoice);
return ResponseEntity.ok(JSONObject.toJSONString(data)); return ResponseEntity.ok(JSONObject.toJSONString(data));
}
}
} }
}
}
try { try {
checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, "1"); checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap, "1");
log.info("查验结果为:{}", checkInvoiceResult); log.info("查验结果为:{}", checkInvoiceResult);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
log.error("查验失败,errormsg:{}", e.getMessage()); log.error("查验失败,errormsg:{}", e.getMessage());
return ResponseEntity.ok(JSONObject.toJSONString(R.error("查验失败," + e.getMessage()))); return ResponseEntity.ok(JSONObject.toJSONString(R.error("查验失败," + e.getMessage())));
} }
if (!checkInvoiceResult.containsKey("code")) { if (!checkInvoiceResult.containsKey("code")) {
if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) { if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
R data = new R(); R data = new R();
data = errorInfo(checkInvoiceResult, data); data = errorInfo(checkInvoiceResult, data);
return ResponseEntity.ok(JSONObject.toJSONString(data)); return ResponseEntity.ok(JSONObject.toJSONString(data));
} }
R data = new R(1000, "default success"); R data = new R(1000, "default success");
data.put("message", "success"); data.put("message", "success");
if (!checkInvoiceResult.containsKey("cyjg")) { if (!checkInvoiceResult.containsKey("cyjg")) {
checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber")); checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber"));
log.info("返回给影像系统的结果为:{}", checkInvoiceResult); log.info("返回给影像系统的结果为:{}", checkInvoiceResult);
signSaveInvoiceInfoService.saveQueryInvoiceResult(checkInvoiceResult, "", "1", dbName); signSaveInvoiceInfoService.saveQueryInvoiceResult(checkInvoiceResult, "", "1", dbName);
} }
Object o = checkInvoiceResult.get("invoiceLineList"); Object o = checkInvoiceResult.get("invoiceLineList");
JSONArray jsonArray = JSONObject.parseArray(JSONObject.toJSONString(o)); JSONArray jsonArray = JSONObject.parseArray(JSONObject.toJSONString(o));
for (Object object : jsonArray) { for (Object object : jsonArray) {
Map map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class); Map map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class);
String taxRate = (String) map.get("taxRate"); String taxRate = (String) map.get("taxRate");
if ("0".equals(taxRate) || "*".equals(taxRate) || "**".equals(taxRate) || "***".equals(taxRate) || "不征税".equals(taxRate) || "免税".equals(taxRate)) { if ("0".equals(taxRate) || "*".equals(taxRate) || "**".equals(taxRate) || "***".equals(taxRate) || "不征税".equals(taxRate) || "免税".equals(taxRate)) {
map.put("taxRate", "0.00"); map.put("taxRate", "0.00");
} }
} }
data.put("data", checkInvoiceResult); data.put("data", checkInvoiceResult);
return ResponseEntity.ok(JSONObject.toJSONString(data)); return ResponseEntity.ok(JSONObject.toJSONString(data));
} }
@ -711,19 +728,31 @@ public class SDNYMainProcessController extends AbstractController {
log.info("其他类发票,不做查验,直接入库"); log.info("其他类发票,不做查验,直接入库");
data.put("message", "success"); data.put("message", "success");
checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber")); checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber"));
checkInvoiceResult.put("message", "入库成功"); checkInvoiceResult.put("message", "入库成功");
log.info("返回给影像系统的结果为:{}", checkInvoiceResult); log.info("返回给影像系统的结果为:{}", checkInvoiceResult);
data.put("data", checkInvoiceResult); data.put("data", checkInvoiceResult);
} else { } else {
data.put("message", "error 其他类发票不支持查验"); data.put("message", "error 其他类发票不支持查验");
} }
return ResponseEntity.ok(JSONObject.toJSONString(data)); return ResponseEntity.ok(JSONObject.toJSONString(data));
} }
return ResponseEntity.ok(JSONObject.toJSONString(R.error().put("data", checkInvoiceResult))); return ResponseEntity.ok(JSONObject.toJSONString(R.error().put("data", checkInvoiceResult)));
}
}catch (Exception e) {
e.printStackTrace();
return ResponseEntity.ok(JSONObject.toJSONString(R.error().put("data", "")));
}
finally {
//关锁
if (isLock) {
lock.unlock();
}
}
return ResponseEntity.ok(JSONObject.toJSONString(R.error().put("data", "请求正在处理,不要重复提交")));
} }
@Async @Async

Loading…
Cancel
Save