|
@@ -2,7 +2,7 @@ package cn.com.ctop.bytedance.service.impl;
|
|
|
|
|
|
import cn.com.ctop.bytedance.entity.BytedanceAdvertiserDailyReport;
|
|
import cn.com.ctop.bytedance.entity.BytedanceAdvertiserDailyReport;
|
|
import cn.com.ctop.bytedance.mapper.BytedanceAdvertiserDailyReportMapper;
|
|
import cn.com.ctop.bytedance.mapper.BytedanceAdvertiserDailyReportMapper;
|
|
-import cn.com.ctop.bytedance.mapper.BytedanceReportMapper;
|
|
|
|
|
|
+import cn.com.ctop.bytedance.mapper.ReportMapper;
|
|
import cn.com.ctop.bytedance.service.IBytedanceReportService;
|
|
import cn.com.ctop.bytedance.service.IBytedanceReportService;
|
|
import cn.com.ctop.common.module.entity.UserAllocation;
|
|
import cn.com.ctop.common.module.entity.UserAllocation;
|
|
import cn.com.ctop.common.module.mapper.UserAllocationMapper;
|
|
import cn.com.ctop.common.module.mapper.UserAllocationMapper;
|
|
@@ -12,11 +12,14 @@ import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyAccountMapp
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
+import org.jeecg.common.util.DateUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
+import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
public class BytedanceReportServiceImpl implements IBytedanceReportService {
|
|
public class BytedanceReportServiceImpl implements IBytedanceReportService {
|
|
@@ -27,7 +30,7 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
|
|
private BytedanceAdvertiserDailyReportMapper bytedanceAdvertiserDailyReportMapper;
|
|
private BytedanceAdvertiserDailyReportMapper bytedanceAdvertiserDailyReportMapper;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
- private BytedanceReportMapper bytedanceReportMapper;
|
|
|
|
|
|
+ private ReportMapper reportMapper;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private KuaishouReportDailyAccountMapper kuaishouReportDailyAccountMapper;
|
|
private KuaishouReportDailyAccountMapper kuaishouReportDailyAccountMapper;
|
|
@@ -185,5 +188,308 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
|
|
return returnJson;
|
|
return returnJson;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 快手-大盘报表
|
|
|
|
+ *
|
|
|
|
+ * @param requestJson
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public JSONObject getKuaiShouAccountReport(JSONObject requestJson) {
|
|
|
|
+ Integer type = requestJson.getInteger("type");
|
|
|
|
+ JSONObject accountJson = new JSONObject();
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ String nowDate = DateUtils.getNowDate("yyyy-MM-dd"); // 当前日期
|
|
|
|
+ String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1); // 当前日期-1
|
|
|
|
+ if (type == 1) { // 今日总消耗
|
|
|
|
+ accountJson = reportMapper.selectDayReport(nowDate);
|
|
|
|
+ JSONObject yesterJson = reportMapper.selectYesterday(anotherDay);
|
|
|
|
+ if (!Check.isNull(yesterJson)) {
|
|
|
|
+ BigDecimal cost = accountJson.getBigDecimal("cost"); // 今日消耗
|
|
|
|
+ BigDecimal yesterCost = yesterJson.getBigDecimal("cost");// 昨日消耗
|
|
|
|
+ BigDecimal compareBigDecima = new BigDecimal(0);
|
|
|
|
+ if (yesterCost.compareTo(compareBigDecima) != 0) {
|
|
|
|
+ BigDecimal costProportion = (cost.subtract(yesterCost)).divide(yesterCost, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ accountJson.put("costProportion", costProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ accountJson.put("costProportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Long photoShow = accountJson.getLong("photoShow");// 今日封面展示
|
|
|
|
+ Long yesterPhotoShow = yesterJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double showProportion = (photoShow.doubleValue() - yesterPhotoShow.doubleValue()) / yesterPhotoShow.doubleValue();
|
|
|
|
+ accountJson.put("showProportion", showProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ accountJson.put("showProportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Long photoClick = accountJson.getLong("photoClick");// 今日封面展示
|
|
|
|
+ Long yesterphotoClick = yesterJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double photoClickProportion = (photoClick.doubleValue() - yesterphotoClick.doubleValue()) / yesterphotoClick.doubleValue();
|
|
|
|
+ accountJson.put("photoClickProportion", photoClickProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ accountJson.put("photoClickProportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Long aclick = accountJson.getLong("aclick");// 今日封面展示
|
|
|
|
+ Long yesterAclick = yesterJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double aClickProportion = (aclick.doubleValue() - yesterAclick.doubleValue()) / yesterAclick.doubleValue();
|
|
|
|
+ accountJson.put("aClickProportion", aClickProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ accountJson.put("aClickProportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else if (type == 2) { // 昨日总消耗
|
|
|
|
+ accountJson = reportMapper.selectYesterday(anotherDay);
|
|
|
|
|
|
|
|
+ } else if (type == 3) { // 近七天
|
|
|
|
+ String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -7);
|
|
|
|
+ accountJson = reportMapper.selectByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 4) { // 近15天
|
|
|
|
+ String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -15);
|
|
|
|
+ accountJson = reportMapper.selectByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 5) {// 近一个月
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -1);
|
|
|
|
+ accountJson = reportMapper.selectByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 6) {// 近三个月
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -3);
|
|
|
|
+ accountJson = reportMapper.selectByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 7) {// 近六个月
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -6);
|
|
|
|
+ accountJson = reportMapper.selectByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 8) { // 所有
|
|
|
|
+ accountJson = reportMapper.selectAllAccount();
|
|
|
|
+
|
|
|
|
+ } else if (type == 9) { // 自定义查询日期
|
|
|
|
+ String startDate = requestJson.getString("startDate");
|
|
|
|
+ String endDate = requestJson.getString("endDate");
|
|
|
|
+ accountJson = reportMapper.selectByDate(startDate, endDate);
|
|
|
|
+ } else if (type == 10) {
|
|
|
|
+ String sign = requestJson.getString("sign");
|
|
|
|
+ String bigDate = requestJson.getString("bigDate");
|
|
|
|
+ String smallDate = requestJson.getString("smallDate");
|
|
|
|
+ if ("month".equals(sign)) {
|
|
|
|
+ Map<String, Object> dateMap = DateUtils.compare_date("yyyy-MM", bigDate, smallDate);
|
|
|
|
+ JSONObject beComparedJson = reportMapper.selectMonthReportByDate((String) dateMap.get("smallDate")); // 被除数数据
|
|
|
|
+ JSONObject comparedJson = reportMapper.selectMonthReportByDate((String) dateMap.get("bigDate")); // 除数数据
|
|
|
|
+ BigDecimal cost = comparedJson.getBigDecimal("cost");
|
|
|
|
+ BigDecimal comparedCost = beComparedJson.getBigDecimal("cost");
|
|
|
|
+
|
|
|
|
+ if (comparedCost.compareTo(new BigDecimal(0)) != 0) {
|
|
|
|
+ BigDecimal costProportion = (cost.subtract(comparedCost)).divide(comparedCost, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ comparedJson.put("costProportion", costProportion);
|
|
|
|
+ } else {
|
|
|
|
+ comparedJson.put("costProportion", 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Long photoClick = comparedJson.getLong("photoClick");
|
|
|
|
+ Long comparedPhotoClick = beComparedJson.getLong("photoShow");
|
|
|
|
+ if (comparedPhotoClick != 0L) {
|
|
|
|
+ double photoClickProportion = (photoClick.doubleValue() - comparedPhotoClick.doubleValue()) / comparedPhotoClick.doubleValue();
|
|
|
|
+ comparedJson.put("photoClickProportion", photoClickProportion);
|
|
|
|
+ } else {
|
|
|
|
+ comparedJson.put("photoClickProportion", 0);
|
|
|
|
+ }
|
|
|
|
+ Long comparedPhotoShow = beComparedJson.getLong("photoShow");
|
|
|
|
+ Long photoShow = comparedJson.getLong("photoShow");
|
|
|
|
+ if (comparedPhotoShow != 0L) {
|
|
|
|
+ double showProportion = (photoShow.doubleValue() - comparedPhotoShow.doubleValue()) / comparedPhotoShow.doubleValue();
|
|
|
|
+ comparedJson.put("showProportion", showProportion);
|
|
|
|
+ } else {
|
|
|
|
+ comparedJson.put("showProportion", 0);
|
|
|
|
+ }
|
|
|
|
+ Long aClick = comparedJson.getLong("aclick");
|
|
|
|
+ Long comparedAclick = beComparedJson.getLong("photoShow");
|
|
|
|
+ if (comparedAclick != 0L) {
|
|
|
|
+ double aClickProportion = (aClick.doubleValue() - comparedAclick.doubleValue()) / comparedAclick.doubleValue();
|
|
|
|
+ comparedJson.put("comparedAclick", aClickProportion);
|
|
|
|
+ } else {
|
|
|
|
+ comparedJson.put("comparedAclick", 0);
|
|
|
|
+ }
|
|
|
|
+ accountJson.put("beCompared", beComparedJson);
|
|
|
|
+ accountJson.put("compared", comparedJson);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return accountJson;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<JSONObject> getKuaiShouAccounDetailtReport(JSONObject requestJson) {
|
|
|
|
+ Integer type = requestJson.getInteger("type");
|
|
|
|
+ List<JSONObject> detail = new ArrayList<>();
|
|
|
|
+ try {
|
|
|
|
+ String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
|
|
|
|
+ String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
|
|
|
|
+ if (type == 1) { // 今日明细
|
|
|
|
+ List<JSONObject> dayDetail = reportMapper.selectReportDetail(nowDate);
|
|
|
|
+ for (int i = 0; i < dayDetail.size(); i++) {
|
|
|
|
+ JSONObject detailJson = dayDetail.get(i);
|
|
|
|
+ String statHour = detailJson.getString("statHour");
|
|
|
|
+
|
|
|
|
+ JSONObject yesterDayJson = reportMapper.selectYesterdayByHourAndDate(anotherDay, statHour);
|
|
|
|
+ if (!Check.isNull(yesterDayJson)) {
|
|
|
|
+ BigDecimal cost = detailJson.getBigDecimal("cost"); // 今日消耗
|
|
|
|
+ BigDecimal yesterCost = yesterDayJson.getBigDecimal("cost");// 昨日消耗
|
|
|
|
+ BigDecimal compareBigDecima = new BigDecimal(0);
|
|
|
|
+ if (yesterCost.compareTo(compareBigDecima) != 0) {
|
|
|
|
+ BigDecimal costProportion = (cost.subtract(yesterCost)).divide(yesterCost, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ detailJson.put("proportion", costProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ detailJson.put("proportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+ Long photoShow = detailJson.getLong("photoShow");// 今日封面展示
|
|
|
|
+ Long yesterPhotoShow = yesterDayJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double showProportion = (photoShow.doubleValue() - yesterPhotoShow.doubleValue()) / yesterPhotoShow.doubleValue();
|
|
|
|
+ detailJson.put("proportion", showProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ detailJson.put("proportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Long photoClick = detailJson.getLong("photoClick");// 今日封面展示
|
|
|
|
+ Long yesterphotoClick = yesterDayJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double photoClickroportion = (photoClick.doubleValue() - yesterphotoClick.doubleValue()) / yesterphotoClick.doubleValue();
|
|
|
|
+ detailJson.put("proportion", photoClickroportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ detailJson.put("proportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+ Long aclick = detailJson.getLong("aclick");// 今日封面展示
|
|
|
|
+ Long yesterAclick = yesterDayJson.getLong("photoShow");// 昨日封面展示
|
|
|
|
+ if (yesterPhotoShow != 0L) {
|
|
|
|
+ double aClickProportion = (aclick.doubleValue() - yesterAclick.doubleValue()) / yesterAclick.doubleValue();
|
|
|
|
+ detailJson.put("proportion", aClickProportion); // 较昨日增加比例
|
|
|
|
+ } else {
|
|
|
|
+ detailJson.put("proportion", 0); // 较昨日增加比例
|
|
|
|
+ }
|
|
|
|
+ detail.add(detailJson);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ System.err.println(detail);
|
|
|
|
+ } else if (type == 2) { // 昨日明细
|
|
|
|
+ detail = reportMapper.selectReportDetail(anotherDay);
|
|
|
|
+ System.err.println(detail);
|
|
|
|
+ } else if (type == 3) { // 近七天明细
|
|
|
|
+ String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -7);
|
|
|
|
+ detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
|
|
|
|
+
|
|
|
|
+ } else if (type == 4) { // 近十五天明细
|
|
|
|
+ String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -15);
|
|
|
|
+ detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
|
|
|
|
+ } else if (type == 5) { // 近1个月明细
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -1);
|
|
|
|
+ detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
|
|
|
|
+ } else if (type == 6) { // 近三个月明细
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -3);
|
|
|
|
+ detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
|
|
|
|
+ } else if (type == 7) { // 近半年明细
|
|
|
|
+ String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -6);
|
|
|
|
+ detail = reportMapper.selectDayDetailByMonth(anotherDay, endDate);
|
|
|
|
+ } else if (type == 8) {
|
|
|
|
+ detail = reportMapper.selectAllDayDetailByMonth();
|
|
|
|
+ } else if (type == 9) {
|
|
|
|
+ String startDate = requestJson.getString("startDate");
|
|
|
|
+ String endDate = requestJson.getString("endDate");
|
|
|
|
+ detail = reportMapper.selectDayDetailByDate(startDate, endDate);
|
|
|
|
+ } else if (type == 10) {
|
|
|
|
+ String sign = requestJson.getString("sign");
|
|
|
|
+ String bigDate = requestJson.getString("bigDate");
|
|
|
|
+ String smallDate = requestJson.getString("smallDate");
|
|
|
|
+ if ("month".equals(sign)) {
|
|
|
|
+ Map<String, Object> dateMap = DateUtils.compare_date("yyyy-MM", bigDate, smallDate);
|
|
|
|
+ List<JSONObject> comparedArr = reportMapper.selectDayDetailsByMonth((String) dateMap.get("bigDate")); // 除数数据
|
|
|
|
+ String comparedDate = (String) dateMap.get("bigDate");
|
|
|
|
+ for (int i = 0; i < comparedArr.size(); i++) {
|
|
|
|
+ JSONObject comparedJson = comparedArr.get(i);
|
|
|
|
+ if (!Check.isNull(comparedJson)) {
|
|
|
|
+ String statDate = comparedJson.getString("statDate");
|
|
|
|
+ String day = DateUtils.getDay("yyyy-MM-dd", statDate);
|
|
|
|
+ String beComparedDate = comparedDate + "-" + day;
|
|
|
|
+ JSONObject beComparedJson = reportMapper.selectDayDailyByDate(beComparedDate);
|
|
|
|
+ if (!Check.isNull(beComparedJson)) {
|
|
|
|
+ JSONObject json = new JSONObject();
|
|
|
|
+ BigDecimal cost = comparedJson.getBigDecimal("cost");
|
|
|
|
+ Long photoShow = comparedJson.getLong("photoShow");
|
|
|
|
+ Long photoClick = comparedJson.getLong("photoClick");
|
|
|
|
+ Long aClick = comparedJson.getLong("aclick");
|
|
|
|
+ json.put("cost", cost);
|
|
|
|
+ json.put("photoShow", photoShow);
|
|
|
|
+ json.put("photoClick", photoClick);
|
|
|
|
+ json.put("aClick", aClick);
|
|
|
|
+ json.put("statDate", statDate);
|
|
|
|
+
|
|
|
|
+ BigDecimal comparedCost = beComparedJson.getBigDecimal("cost");
|
|
|
|
+ Long comparedPhotoShow = beComparedJson.getLong("photoShow");
|
|
|
|
+ Long comparedPhotoClick = beComparedJson.getLong("photoClick");
|
|
|
|
+ Long comparedAClick = beComparedJson.getLong("aclick");
|
|
|
|
+ json.put("beComparedCost", comparedCost);
|
|
|
|
+ json.put("beComparedPhotoShow", comparedPhotoShow);
|
|
|
|
+ json.put("beComparedPhotoClick", comparedPhotoClick);
|
|
|
|
+ json.put("beComparedAClick", comparedAClick);
|
|
|
|
+ json.put("beComparedDate", beComparedDate);
|
|
|
|
+ if (comparedCost.compareTo(new BigDecimal(0)) != 0) {
|
|
|
|
+ BigDecimal costProportion = (cost.subtract(comparedCost)).divide(comparedCost, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ json.put("costProportion", costProportion);
|
|
|
|
+ } else {
|
|
|
|
+ json.put("costProportion", 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (comparedPhotoClick != 0L) {
|
|
|
|
+ double photoClickProportion = (photoClick.doubleValue() - comparedPhotoClick.doubleValue()) / comparedPhotoClick.doubleValue();
|
|
|
|
+ json.put("photoClickProportion", photoClickProportion);
|
|
|
|
+ } else {
|
|
|
|
+ json.put("photoClickProportion", 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (comparedPhotoShow != 0L) {
|
|
|
|
+ double showProportion = (photoShow.doubleValue() - comparedPhotoShow.doubleValue()) / comparedPhotoShow.doubleValue();
|
|
|
|
+ json.put("showProportion", showProportion);
|
|
|
|
+ } else {
|
|
|
|
+ json.put("showProportion", 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (comparedAClick != 0L) {
|
|
|
|
+ double aClickProportion = (aClick.doubleValue() - comparedAClick.doubleValue()) / comparedAClick.doubleValue();
|
|
|
|
+ json.put("comparedAclick", aClickProportion);
|
|
|
|
+ } else {
|
|
|
|
+ json.put("comparedAclick", 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ detail.add(json);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ return detail;
|
|
|
|
+ }
|
|
}
|
|
}
|