From b24677ee3bc1a1605088c4ddfae2bf35a4affbb6 Mon Sep 17 00:00:00 2001 From: lishouyi <linlangsur163@163.com> Date: 星期四, 25 五月 2023 18:54:05 +0800 Subject: [PATCH] 卡车公司——财务——上传发票信息接口 --- src/main/java/com/stylefeng/guns/modular/api/ApiController.java | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 199 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/stylefeng/guns/modular/api/ApiController.java b/src/main/java/com/stylefeng/guns/modular/api/ApiController.java index 47287f9..422fef6 100644 --- a/src/main/java/com/stylefeng/guns/modular/api/ApiController.java +++ b/src/main/java/com/stylefeng/guns/modular/api/ApiController.java @@ -1,9 +1,23 @@ package com.stylefeng.guns.modular.api; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.intuit.ipp.core.IEntity; +import com.intuit.ipp.data.*; +import com.intuit.ipp.exception.FMSException; +import com.intuit.ipp.services.DataService; +import com.intuit.ipp.services.QueryResult; +import com.intuit.oauth2.data.BearerTokenResponse; +import com.intuit.oauth2.exception.OAuthException; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.base.tips.ErrorTip; import com.stylefeng.guns.core.common.constant.factory.ConstantFactory; +import com.stylefeng.guns.core.common.exception.BizExceptionEnum; +import com.stylefeng.guns.core.exception.GunsException; import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.Convert; import com.stylefeng.guns.core.util.JwtTokenUtil; @@ -15,17 +29,24 @@ import com.stylefeng.guns.modular.system.model.User; import com.stylefeng.guns.modular.system.model.UserInfo; import com.stylefeng.guns.modular.system.utils.EmailUtil; +import com.stylefeng.guns.modular.system.utils.InvoicesDataUploadUtil; import com.stylefeng.guns.modular.system.utils.RedisUtil; import com.stylefeng.guns.modular.system.utils.tips.SuccessTip; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.RandomStringUtils; +import org.json.JSONObject; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import java.math.BigDecimal; import java.util.*; /** @@ -37,6 +58,7 @@ @RestController @Api(tags = "登录") @RequestMapping("/gunsApi") +@Slf4j public class ApiController extends BaseController { @Autowired @@ -47,6 +69,10 @@ @Autowired private RedisUtil redisUtil; + + private final String INVOICE_DATA = "CARINVOICE:"; + + private static final String ACCOUNT_QUERY = "select * from Account where AccountType='%s' maxresults 1"; /** * api登录接口,通过账号密码获取token @@ -188,4 +214,177 @@ return sb.toString(); } + @ApiOperation(value = "redirectURL接口",notes="redirectURL接口") + @GetMapping(value = "/oauth2redirectOfCar") + @ResponseBody + @Transactional + public String callbackIntuit(@RequestParam("code") String authCode, + @RequestParam("state") String state, + @RequestParam(value = "realmId", required = false) String realmId, HttpSession session) throws OAuthException { + String accessToken = ""; + if (com.stylefeng.guns.core.util.ToolUtil.isEmpty(realmId)) { + return new JSONObject().put("response","No realm ID. QBO calls only work if the accounting scope was passed!").toString(); + } + try { + session.setAttribute("realmId", realmId); + session.setAttribute("auth_code", authCode); + + // OAuth2PlatformClient client = factory.getOAuth2PlatformClient(); + // String redirectUri = factory.getRedirectUrl(); + + BearerTokenResponse bearerTokenResponse = InvoicesDataUploadUtil.callBackFromOAuth(authCode); + accessToken = bearerTokenResponse.getAccessToken(); + session.setAttribute("access_token", bearerTokenResponse.getAccessToken()); + session.setAttribute("refresh_token", bearerTokenResponse.getRefreshToken()); + }catch (Exception e){ + e.printStackTrace(); + } + try { + + String value = redisUtil.getValue(INVOICE_DATA); + log.info("value:{}",value); + if (ToolUtil.isEmpty(value)){ + return "ERROR"; + } + Gson gson = new Gson(); + JsonArray jsonArray = gson.fromJson(value, JsonArray.class); + for (JsonElement jsonElement : jsonArray) { + JsonObject asJsonObject = jsonElement.getAsJsonObject(); + String name = asJsonObject.get("name").getAsString(); + String amount = asJsonObject.get("amount").getAsString(); + String unitPrice = asJsonObject.get("unitPrice").getAsString(); + DataService service = InvoicesDataUploadUtil.getDataService(realmId, accessToken); + Customer customer = getCustomerWithAllFields(name,"testconceptsample@mailinator.com"); + Customer savedCustomer = service.add(customer); + Item item = getItemFields(service, unitPrice == null || unitPrice == "ABC Corporations" ? "0" : unitPrice ); + Item savedItem = service.add(item); + Invoice invoice = getInvoiceFields(savedCustomer, savedItem, amount == null || amount == "" ? "0" : amount); + Invoice savedInvoice = service.add(invoice); + service.sendEmail(savedInvoice, customer.getPrimaryEmailAddr().getAddress()); + Payment payment = getPaymentFields(savedCustomer, savedInvoice); + Payment savedPayment = service.add(payment); + createResponse(savedPayment); + } + + } catch (Exception e) { + e.printStackTrace(); + throw new GunsException(BizExceptionEnum.CALLBACK_ERROR); + } + return "SUCCESS"; + } + + + + + private Customer getCustomerWithAllFields(String companyName,String mailAddr) { + Customer customer = new Customer(); + customer.setDisplayName(RandomStringUtils.randomAlphanumeric(6)); + customer.setCompanyName(companyName); + + EmailAddress emailAddr = new EmailAddress(); + emailAddr.setAddress(mailAddr); + customer.setPrimaryEmailAddr(emailAddr); + + return customer; + } + + private Item getItemFields(DataService service,String unitPrice) throws FMSException { + + Item item = new Item(); + item.setName("Item" + RandomStringUtils.randomAlphanumeric(5)); + item.setTaxable(false); + item.setUnitPrice(unitPrice == null || unitPrice == "" ? BigDecimal.ZERO :new BigDecimal(unitPrice)); + item.setType(ItemTypeEnum.SERVICE); + + Account incomeAccount = getIncomeBankAccount(service); + item.setIncomeAccountRef(createRef(incomeAccount)); + + return item; + } + + private Account getIncomeBankAccount(DataService service) throws FMSException { + QueryResult queryResult = service.executeQuery(String.format(ACCOUNT_QUERY, AccountTypeEnum.INCOME.value())); + List<? extends IEntity> entities = queryResult.getEntities(); + if(!entities.isEmpty()) { + return (Account)entities.get(0); + } + return createIncomeBankAccount(service); + } + + private ReferenceType createRef(IntuitEntity entity) { + ReferenceType referenceType = new ReferenceType(); + referenceType.setValue(entity.getId()); + return referenceType; + } + private Account createIncomeBankAccount(DataService service) throws FMSException { + Account account = new Account(); + account.setName("Incom" + RandomStringUtils.randomAlphabetic(5)); + account.setAccountType(AccountTypeEnum.INCOME); + + return service.add(account); + } + + private Invoice getInvoiceFields(Customer customer, Item item,String amount) { + + Invoice invoice = new Invoice(); + invoice.setCustomerRef(createRef(customer)); + BigDecimal balance = invoice.getBalance(); + log.info("balance:{}",balance); + + List<Line> invLine = new ArrayList<Line>(); + Line line = new Line(); + line.setAmount(amount == null || amount == "" ? BigDecimal.ZERO : new BigDecimal(amount)); + line.setDetailType(LineDetailTypeEnum.SALES_ITEM_LINE_DETAIL); + + SalesItemLineDetail silDetails = new SalesItemLineDetail(); + silDetails.setItemRef(createRef(item)); + + line.setSalesItemLineDetail(silDetails); + invLine.add(line); + invoice.setLine(invLine); + + return invoice; + } + + private Payment getPaymentFields(Customer customer, Invoice invoice) { + + Payment payment = new Payment(); + payment.setCustomerRef(createRef(customer)); + + payment.setTotalAmt(invoice.getTotalAmt()); + + List<LinkedTxn> linkedTxnList = new ArrayList<LinkedTxn>(); + LinkedTxn linkedTxn = new LinkedTxn(); + linkedTxn.setTxnId(invoice.getId()); + linkedTxn.setTxnType(TxnTypeEnum.INVOICE.value()); + linkedTxnList.add(linkedTxn); + + Line line1 = new Line(); + line1.setAmount(invoice.getTotalAmt()); + line1.setLinkedTxn(linkedTxnList); + + List<Line> lineList = new ArrayList<Line>(); + lineList.add(line1); + payment.setLine(lineList); + + return payment; + } + + + private String createResponse(Object entity) { + ObjectMapper mapper = new ObjectMapper(); + String jsonInString; + try { + jsonInString = mapper.writeValueAsString(entity); + } catch (Exception e) { + return createErrorResponse(e); + } + return jsonInString; + } + + private String createErrorResponse(Exception e) { + log.error("Exception while calling QBO ", e); + return new JSONObject().put("response","Failed").toString(); + } + } -- Gitblit v1.7.1