Commit 373ff44c by huluobin

# fee

parent c1569b3e
package com.bailuntec.job;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
......@@ -18,9 +19,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@ComponentScan("com.bailuntec")
@EnableFeignClients(basePackages = {"com.bailuntec.api", "com.bailuntec.*.api"})
public class SampleApp {
public class EbayFinanceJob {
public static void main(String[] args) {
SpringApplication.run(SampleApp.class, args);
SpringApplication.run(EbayFinanceJob.class, args);
}
}
package com.bailuntec.job;
import com.bailuntec.application.IDcBaseFinanceEbayService;
import com.bailuntec.domain.DcBaseFinanceEbay;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/19 1:21 下午
*/
public class EbayFinanceWriter implements ItemWriter<DcBaseFinanceEbay> {
final IDcBaseFinanceEbayService dcBaseFinanceEbayService;
public EbayFinanceWriter(IDcBaseFinanceEbayService dcBaseFinanceEbayService) {
this.dcBaseFinanceEbayService = dcBaseFinanceEbayService;
}
@Override
public void write(@NonNull List<? extends DcBaseFinanceEbay> items) throws Exception {
dcBaseFinanceEbayService.saveBatch(items.stream().map(var -> (DcBaseFinanceEbay) var).collect(Collectors.toList()));
}
}
package com.bailuntec.job;
import com.bailuntec.domain.DcBaseCompanyAccount;
import com.ebay.soap.eBLBaseComponents.AccountEntryType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/19 9:47 上午
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EbayItem {
private AccountEntryType accountEntryType;
private DcBaseCompanyAccount dcBaseCompanyAccount;
}
package com.bailuntec.job;
import com.bailuntec.api.bailuntec.oa.OaApi;
import com.bailuntec.domain.DcBaseCompanyAccount;
import com.bailuntec.domain.DcBaseFinanceEbay;
import com.bailuntec.domain.DcJobConfig;
import com.bailuntec.infrastructure.util.enumerate.CurrencyType;
import com.ebay.soap.eBLBaseComponents.AccountEntryType;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.lang.NonNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/19 9:36 上午
*/
public class EbayItemProcessor implements ItemProcessor<EbayItem, DcBaseFinanceEbay> {
private DcJobConfig dcJobConfig;
private final OaApi oaApi;
public EbayItemProcessor(DcJobConfig dcJobConfig, OaApi oaApi) {
this.dcJobConfig = dcJobConfig;
this.oaApi = oaApi;
}
@Override
public DcBaseFinanceEbay process(@NonNull EbayItem ebayItem) throws Exception {
DcBaseFinanceEbay dcBaseFinanceEbay = new DcBaseFinanceEbay();
AccountEntryType accountEntryType = ebayItem.getAccountEntryType();
DcBaseCompanyAccount dcBaseCompanyAccount = ebayItem.getDcBaseCompanyAccount();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime gmt = LocalDateTime.ofInstant(accountEntryType.getDate().getTime().toInstant(), zone);
dcBaseFinanceEbay.setGmtDate(gmt);
dcBaseFinanceEbay.setBjDate(dcBaseFinanceEbay.getGmtDate().minusHours(15L));
dcBaseFinanceEbay.setAccountEntryType(accountEntryType.getAccountDetailsEntryType() == null ? "" : accountEntryType.getAccountDetailsEntryType().value());
dcBaseFinanceEbay.setVatPercent(accountEntryType.getVATPercent());
dcBaseFinanceEbay.setItemId(accountEntryType.getItemID());
dcBaseFinanceEbay.setTransactionId(accountEntryType.getTransactionID());
dcBaseFinanceEbay.setOrderLineId(accountEntryType.getOrderLineItemID());
dcBaseFinanceEbay.setReceivedTopRatedDiscount(accountEntryType.isReceivedTopRatedDiscount());
dcBaseFinanceEbay.setDescription(accountEntryType.getDescription());
dcBaseFinanceEbay.setMemo(accountEntryType.getMemo());
dcBaseFinanceEbay.setRefNumber(accountEntryType.getRefNumber());
dcBaseFinanceEbay.setTitle(accountEntryType.getTitle());
dcBaseFinanceEbay.setReportDate(dcJobConfig.getEndTime().toLocalDate());
if (accountEntryType.getGrossDetailAmount() != null) {
dcBaseFinanceEbay.setGrossAmount(BigDecimal.valueOf(accountEntryType.getGrossDetailAmount().getValue()));
dcBaseFinanceEbay.setCurrency(accountEntryType.getGrossDetailAmount().getCurrencyID().value());
dcBaseFinanceEbay.setExchangeRate(oaApi.getExchangeRateByCurAndDate(dcBaseFinanceEbay.getCurrency(), CurrencyType.CNY.value(), dcBaseFinanceEbay.getBjDate().toLocalDate()).getRate());
dcBaseFinanceEbay.setExchangeRateUsd(oaApi.getExchangeRateByCurAndDate(dcBaseFinanceEbay.getCurrency(), CurrencyType.USD.value(), dcBaseFinanceEbay.getBjDate().toLocalDate()).getRate());
}
if (accountEntryType.getGrossDetailAmount() != null) {
dcBaseFinanceEbay.setNetAmount(BigDecimal.valueOf(accountEntryType.getGrossDetailAmount().getValue()));
}
dcBaseFinanceEbay.setAccountId(dcBaseCompanyAccount.getAccountId());
dcBaseFinanceEbay.setCompanyId(dcBaseCompanyAccount.getCompanyId());
dcBaseFinanceEbay.setBjModified(LocalDateTime.now());
return dcBaseFinanceEbay;
}
}
......@@ -3,6 +3,8 @@ package com.bailuntec.job;
import com.bailuntec.common.ListUtil;
import com.bailuntec.domain.DcBaseCompanyAccount;
import com.bailuntec.domain.DcJobConfig;
import com.bailuntec.infrastructure.mapper.DcBaseCompanyAccountMapper;
import com.bailuntec.infrastructure.mapper.DcJobConfigMapper;
import com.ebay.sdk.ApiContext;
import com.ebay.sdk.ApiCredential;
import com.ebay.sdk.TimeFilter;
......@@ -12,10 +14,9 @@ import com.ebay.soap.eBLBaseComponents.AccountHistorySelectionCodeType;
import com.ebay.soap.eBLBaseComponents.DetailLevelCodeType;
import com.ebay.soap.eBLBaseComponents.PaginationType;
import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import java.time.ZoneId;
import java.util.Calendar;
......@@ -30,7 +31,8 @@ import java.util.List;
* @author robbendev
* @since 2021/1/18 5:23 下午
*/
public class EbayItemReader implements ItemReader<AccountEntryType> {
@Slf4j
public class EbayItemReader implements ItemReader<EbayItem> {
//剩余账户
private List<DcBaseCompanyAccount> dcBaseCompanyAccountList;
......@@ -38,28 +40,52 @@ public class EbayItemReader implements ItemReader<AccountEntryType> {
private List<AccountEntryType> accountEntryTypeList;
//当前账户
private DcBaseCompanyAccount dcBaseCompanyAccount;
//当前ebay请求接口
private GetAccountCall getAccountCall;
//当前页码
private Integer pageNum;
//配置
private DcJobConfig dcJobConfig;
private final DcBaseCompanyAccountMapper dcBaseCompanyAccountMapper;
private final DcJobConfigMapper dcJobConfigMapper;
private Integer pageNum;
private Integer pageSize;
private DcJobConfig dcJobConfig;
@SneakyThrows
public EbayItemReader(DcBaseCompanyAccountMapper dcBaseCompanyAccountMapper,
DcJobConfigMapper dcJobConfigMapper) {
this.dcBaseCompanyAccountMapper = dcBaseCompanyAccountMapper;
this.dcJobConfigMapper = dcJobConfigMapper;
this.init();
}
private void init() throws Exception {
dcBaseCompanyAccountList = dcBaseCompanyAccountMapper.queryPageEbay();
dcJobConfig = dcJobConfigMapper.selectByName("base-sync-finance-ebay-ad");
this.pageNum = dcJobConfig.getPageNum();
this.nextAccount();
}
@Override
public AccountEntryType read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
public EbayItem read() throws Exception {
if (ListUtil.isNotEmpty(accountEntryTypeList)) {
return accountEntryTypeList.remove(0);
AccountEntryType accountEntryType = accountEntryTypeList.remove(0);
log.info("读取一条广告费用记录");
return new EbayItem(accountEntryType, dcBaseCompanyAccount);
} else {
nextPage();
if (ListUtil.isNotEmpty(accountEntryTypeList)) {
return accountEntryTypeList.remove(0);
AccountEntryType accountEntryType = accountEntryTypeList.remove(0);
log.info("读取一条广告费用记录");
return new EbayItem(accountEntryType, dcBaseCompanyAccount);
} else {
nextAccount();
if (ListUtil.isNotEmpty(accountEntryTypeList)) {
return accountEntryTypeList.remove(0);
AccountEntryType accountEntryType = accountEntryTypeList.remove(0);
log.info("读取一条广告费用记录");
return new EbayItem(accountEntryType, dcBaseCompanyAccount);
} else {
return null;
}
......@@ -73,12 +99,13 @@ public class EbayItemReader implements ItemReader<AccountEntryType> {
refreshPage();
}
private void nextAccount() {
private void nextAccount() throws Exception {
this.pageNum = 1;
if (ListUtil.isNotEmpty(dcBaseCompanyAccountList)) {
dcBaseCompanyAccount = dcBaseCompanyAccountList.remove(0);
this.refreshAccountCall();
this.refreshPage();
}
}
......@@ -88,10 +115,11 @@ public class EbayItemReader implements ItemReader<AccountEntryType> {
cred.seteBayToken(dcBaseCompanyAccount.getSoapAuthToken());
apiContext.setApiServerUrl("https://api.ebay.com/wsapi");
GetAccountCall getAccountCall = new GetAccountCall(apiContext);
getAccountCall = new GetAccountCall(apiContext);
//详情类型 返回所有
getAccountCall.setDetailLevel(new DetailLevelCodeType[]{DetailLevelCodeType.RETURN_ALL});
AccountHistorySelectionCodeType accountHistorySelectionCodeType = AccountHistorySelectionCodeType.BETWEEN_SPECIFIED_DATES;
getAccountCall.setViewType(accountHistorySelectionCodeType);
//类型
getAccountCall.setViewType(AccountHistorySelectionCodeType.BETWEEN_SPECIFIED_DATES);
//开始时间
Calendar startCal = Calendar.getInstance();
......@@ -103,6 +131,8 @@ public class EbayItemReader implements ItemReader<AccountEntryType> {
TimeFilter timeFilter = new TimeFilter(startCal, endCal);
getAccountCall.setViewPeriod(timeFilter);
//endCal
getAccountCall.setInvoiceDate(endCal);
}
......
package com.bailuntec.job;
import com.bailuntec.domain.DcBaseFinanceEbay;
import com.bailuntec.infrastructure.mapper.DcBaseCompanyAccountMapper;
import com.bailuntec.infrastructure.mapper.DcJobConfigMapper;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.batch.api.listener.JobListener;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/19 1:37 下午
*/
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
public final JobBuilderFactory jobBuilderFactory;
public final StepBuilderFactory stepBuilderFactory;
private final EbayItemReader ebayItemReader;
private final EbayItemProcessor ebayItemProcessor;
private final EbayFinanceWriter ebayFinanceWriter;
private final DcBaseCompanyAccountMapper dcBaseCompanyAccountMapper;
private final DcJobConfigMapper dcJobConfigMapper;
@Autowired
public JobConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, EbayItemReader ebayItemReader, EbayItemProcessor ebayItemProcessor, EbayFinanceWriter ebayFinanceWriter, JobListener jobListener, DcBaseCompanyAccountMapper dcBaseCompanyAccountMapper, DcJobConfigMapper dcJobConfigMapper) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
this.ebayItemReader = ebayItemReader;
this.ebayItemProcessor = ebayItemProcessor;
this.ebayFinanceWriter = ebayFinanceWriter;
this.dcBaseCompanyAccountMapper = dcBaseCompanyAccountMapper;
this.dcJobConfigMapper = dcJobConfigMapper;
}
@Bean
EbayItemReader reader() {
return new EbayItemReader(dcBaseCompanyAccountMapper, dcJobConfigMapper);
}
@Bean
public Job dataHandleJob() {
return jobBuilderFactory.get("dataHandleJob")
.incrementer(new RunIdIncrementer())
.start(handleDataStep()) //start是JOB执行的第一个step
// ...
.build();
}
@Bean
public Step handleDataStep() {
return stepBuilderFactory.get("getData")
.<EbayItem, DcBaseFinanceEbay>chunk(100) // <输入,输出> 。chunk通俗的讲类似于SQL的commit; 这里表示处理(processor)100条后写入(writer)一次。
.reader(reader()) //指定ItemReader
.processor(ebayItemProcessor) //指定ItemProcessor
.writer(ebayFinanceWriter) //指定ItemWriter
.build();
}
}
spring:
# 服务名称
application:
name: base-sync-sample
name: base-sync-ebay
# 数据配置
datasource:
url: jdbc:mysql://gz-cdb-kp7s5i79.sql.tencentcdb.com:61691/bailun_datacenter?serverTimezone=GMT%2B8&characterEncoding=utf-8&rewriteBatchedStatements=true
url: jdbc:mysql://gz-cdb-kp7s5i79.sql.tencentcdb.com:61691/bailun_datecenter_test?serverTimezone=GMT%2B8&characterEncoding=utf-8&rewriteBatchedStatements=true
username: root
password: '#7kfnymAM$Y9-Ntf'
driver-class-name: com.mysql.jdbc.Driver
......
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