diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/TiktokConstant.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/TiktokConstant.java index 6efabd2..b088e3d 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/TiktokConstant.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/TiktokConstant.java @@ -75,4 +75,9 @@ public class TiktokConstant { * 艺术家尚未审核 */ public static final Integer TIKTOK_CREATOR_BANED_ERROR = 105012; + + /** + * 调用抖音获取广告收入信息失败 + */ + public static final Integer TIKTOK_INCOME_ERROR = 105013; } diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/RestTemplateConfiguration.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/RestTemplateConfiguration.java new file mode 100644 index 0000000..70269ac --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/RestTemplateConfiguration.java @@ -0,0 +1,27 @@ +package com.bnyer.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * @author chengkun + * @date 2022/4/28 17:27 + */ +@Configuration +public class RestTemplateConfiguration { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(15000); + factory.setReadTimeout(5000); + return factory; + } +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/TiktokConfig.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/TiktokConfig.java new file mode 100644 index 0000000..80adc6c --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/config/TiktokConfig.java @@ -0,0 +1,49 @@ +package com.bnyer.system.config; + +//import com.bnyer.img.handler.TokenCheckHandler; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 字节配置类 + * @author chengkun + * @date 2022/4/21 17:43 + */ +@Configuration +@ConfigurationProperties(prefix = "bnyer.system.tiktok") +@Getter +@RefreshScope +public class TiktokConfig implements WebMvcConfigurer { + + @Value("${bnyer.system.tiktok.appId}") + private String appId; + + @Value("${bnyer.system.tiktok.secret}") + private String secret; + + @Value("${bnyer.system.tiktok.adIncomeUrl}") + private String adIncomeUrl; + + @Value("${bnyer.system.tiktok.tokenUrl}") + private String tokenUrl; + +// @Resource +// private TokenCheckHandler tokenCheckHandler; + + /** 不需要拦截地址 */ +// public static final String[] excludeUrls = { "/mini/tiktok/loginTiktok", "/mini/tiktok/insertFeedback"}; +// +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// // 注册Token拦截器 +// registry.addInterceptor(tokenCheckHandler) +// .addPathPatterns("/**") +// .excludePathPatterns(excludeUrls) +// .order(-10); +// +// } +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/controller/CommonController.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/controller/CommonController.java new file mode 100644 index 0000000..4d78ed5 --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/controller/CommonController.java @@ -0,0 +1,39 @@ +package com.bnyer.system.controller; + +import com.alibaba.fastjson.JSON; +import com.bnyer.common.core.domain.Banner; +import com.bnyer.common.core.dto.BannerDto; +import com.bnyer.common.core.dto.BannerPageDto; +import com.bnyer.common.core.dto.StatusDto; +import com.bnyer.common.core.web.controller.BaseController; +import com.bnyer.common.core.web.domain.AjaxResult; +import com.bnyer.common.core.web.page.TableDataInfo; +import com.bnyer.system.service.IBannerService; +import com.bnyer.system.service.ITiktokService; +import com.github.pagehelper.PageHelper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(value = "【图文平台】公共接口",tags = "【图文平台】公共接口") +@RestController +@RequestMapping("/system/common") +@Slf4j +public class CommonController extends BaseController { + + @Autowired + private ITiktokService tiktokService; + + //@RequiresPermissions("system:config:list") + @ApiOperation(value="获取抖音广告首付详情") + @GetMapping(value = "/tiktokAdIncome") + public AjaxResult tiktokAdIncome(){ + return AjaxResult.success(tiktokService.getTiktokAdIncome()); + } +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokAdIncomeVo.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokAdIncomeVo.java new file mode 100644 index 0000000..fcb3a18 --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokAdIncomeVo.java @@ -0,0 +1,26 @@ +package com.bnyer.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + + +@Getter +@Setter +@ApiModel("抖音获取广告收益响应类") +public class TiktokAdIncomeVo implements Serializable { + + @ApiModelProperty(value="收入金额(单位分)") + private Integer income; + + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value="收入日期") + private String date; + + private static final long serialVersionUID = 1L; +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokTokenVo.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokTokenVo.java new file mode 100644 index 0000000..bf36f84 --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/domain/vo/TiktokTokenVo.java @@ -0,0 +1,26 @@ +package com.bnyer.system.domain.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + + +@Getter +@Setter +@ApiModel("抖音Token响应类") +public class TiktokTokenVo implements Serializable { + + @ApiModelProperty(value="token") + @JSONField(name = "access_token") + private String accessToken; + + @JSONField(name = "expires_in") + @ApiModelProperty(value="token有效时间") + private Integer expiresIn; + + private static final long serialVersionUID = 1L; +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/ITiktokService.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/ITiktokService.java new file mode 100644 index 0000000..3bf6fea --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/ITiktokService.java @@ -0,0 +1,19 @@ +package com.bnyer.system.service; + +import com.bnyer.system.domain.vo.TiktokAdIncomeVo; +import com.bnyer.system.domain.vo.TiktokTokenVo; + +public interface ITiktokService { + + /** + * 获取抖音token + * @return - + */ + TiktokTokenVo getTiktokToken(); + + /** + * 查询抖音广告收入 + * @return - + */ + TiktokAdIncomeVo getTiktokAdIncome(); +} diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/ProfitVerifyOrderServiceImpl.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/ProfitVerifyOrderServiceImpl.java index 4cfb244..7070777 100644 --- a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/ProfitVerifyOrderServiceImpl.java +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/ProfitVerifyOrderServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -128,9 +129,9 @@ public class ProfitVerifyOrderServiceImpl implements IProfitVerifyOrderService { //存在昨日平台下载数量 Integer platformDownloadNum = redisService.getCacheMapValue(tiktokKey, hashKey); //广告单价 - BigDecimal adPrice = yesterdayTotalAdProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); + BigDecimal adPrice = yesterdayTotalAdProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, RoundingMode.DOWN); //邀请单价 - BigDecimal invitePrice = yesterdayTotalInviteProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); + BigDecimal invitePrice = yesterdayTotalInviteProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, RoundingMode.DOWN); //查出昨日对应平台的所有广告待入账信息 List adProfits = creatorProfitService.queryPreProfit(params.getPlatform(), params.getAppType(), "0",date); if(adProfits.size() > 0){ diff --git a/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/TiktokServiceImpl.java b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/TiktokServiceImpl.java new file mode 100644 index 0000000..0479034 --- /dev/null +++ b/bnyer-services/bnyer-system/src/main/java/com/bnyer/system/service/impl/TiktokServiceImpl.java @@ -0,0 +1,95 @@ +package com.bnyer.system.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.bnyer.common.core.constant.TiktokConstant; +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.system.config.TiktokConfig; +import com.bnyer.system.domain.vo.TiktokAdIncomeVo; +import com.bnyer.system.domain.vo.TiktokTokenVo; +import com.bnyer.system.service.ITiktokService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class TiktokServiceImpl implements ITiktokService { + + @Resource + private TiktokConfig tiktokConfig; + + @Autowired + private RestTemplate restTemplate; + + @Override + public TiktokTokenVo getTiktokToken() { + Map map = new HashMap<>(); + map.put("appid",tiktokConfig.getAppId()); + map.put("secret", tiktokConfig.getSecret()); + map.put("grant_type", "client_credential"); + JSONObject tokenInfo = restTemplate.postForObject(tiktokConfig.getTokenUrl(), map, JSONObject.class); + if (tokenInfo != null) { + if(!tokenInfo.getString("err_no").equals(TiktokConstant.SUCCESS)){ + log.error("抖音获取token接口调用失败,错误状态码为:【{}】,错误信息为:【{}】",tokenInfo.getString("err_no"),tokenInfo.getString("err_tips")); + throw new ServiceException("抖音获取token接口调用失败!",TiktokConstant.TIKTOK_AUTH_ERROR); + } + }else{ + log.error("抖音获取token接口调用失败,错误信息为:【查无数据】"); + throw new ServiceException("抖音获取token接口调用失败!",TiktokConstant.TIKTOK_AUTH_ERROR); + } + //调用成功,组装返回数据 + JSONObject data = tokenInfo.getJSONObject("data"); + if(data != null){ + TiktokTokenVo result = new TiktokTokenVo(); + result.setAccessToken(data.getString("access_token")); + result.setExpiresIn(Integer.parseInt(data.getString("expires_in"))); + return result; + }else{ + return null; + } + } + + @Override + public TiktokAdIncomeVo getTiktokAdIncome() { + HttpHeaders headers = new HttpHeaders(); + headers.add("access-token",getTiktokToken().getAccessToken()); + Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String date = df.format(yesterday); + String url = tiktokConfig.getAdIncomeUrl() + "?start_date="+date+"&end_date="+date+"&host_name=douyin"; + HttpEntity entity = new HttpEntity("parameters", headers); + JSONObject resultInfo = restTemplate.exchange(url, HttpMethod.GET, entity, JSONObject.class).getBody(); + if(resultInfo != null){ + if(!resultInfo.getString("err_no").equals(TiktokConstant.SUCCESS)){ + log.error("抖音获取广告收入接口调用失败,错误状态码为:【{}】,错误信息为:【{}】",resultInfo.getString("err_no"),resultInfo.getString("err_msg")); + throw new ServiceException("抖音获取广告收入接口调用失败!",TiktokConstant.TIKTOK_INCOME_ERROR); + } + }else{ + log.error("抖音获取广告收入接口调用失败,错误信息为:【查无数据】"); + throw new ServiceException("抖音获取广告收入接口调用失败!",TiktokConstant.TIKTOK_INCOME_ERROR); + } + //调用成功,组装返回数据 + JSONObject data = resultInfo.getJSONObject("data"); + if(data != null){ + JSONArray incomeList = data.getJSONArray("income_list"); + if(incomeList.size() > 0){ + TiktokAdIncomeVo result = new TiktokAdIncomeVo(); + result.setIncome(Integer.parseInt(incomeList.getJSONObject(0).getString("income"))); + result.setDate(incomeList.getJSONObject(0).getString("date")); + return result; + } + } + return null; + } +}