Преглед изворни кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
#	jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java
songyh пре 4 година
родитељ
комит
0a5d221115

+ 1 - 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java

@@ -125,7 +125,7 @@ public class Result<T> implements Serializable {
 	public static<T> Result<T> errorMsg(String msg) {
 		Result<T> r = new Result<T>();
 		r.setSuccess(true);
-		r.setCode(CommonConstant.STATUS_NORMAL);
+		r.setCode(CommonConstant.STATUS_DISABLE);
 		//r.setResult(t);
 		r.setMessage(msg);
 		return r;

+ 14 - 0
jeecg-boot-bytedance/pom.xml

@@ -25,6 +25,20 @@
             <artifactId>httpmime</artifactId>
             <version>4.5.10</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.tony19</groupId>
+            <artifactId>apktool-lib</artifactId>
+            <version>1.4.4-3</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.plist</groupId>
+            <artifactId>dd-plist</artifactId>
+            <version>1.16</version>
+            <scope>compile</scope>
+        </dependency>
+
         <!--引入微服务启动依赖 starter
       <dependency>
           <groupId>org.jeecgframework.boot</groupId>

+ 1 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/AiBytedanceAdvertiserStrategy.java

@@ -86,7 +86,7 @@ public class AiBytedanceAdvertiserStrategy{
 	/**优先从系统应用商店下载(投放目标)*/
 	private String adDownloadMode;
 	/**转化目标OPCM时必填(投放目标)*/
-	private Integer adConvertId;
+	private Long adConvertId;
 	/**直达链接(投放目标)*/
 	private String adOpenUrl;
 	/**附加创意类型(投放目标)*/

+ 3 - 2
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/AiBytedanceAdvertiserStrategyMapper.java

@@ -14,11 +14,12 @@ import org.jeecg.modules.bytedance.advertise.entity.UpdAdStaOrCpaOrBudget;
 public interface AiBytedanceAdvertiserStrategyMapper extends BaseMapper<AiBytedanceAdvertiserStrategy> {
 
 
+    Integer updStaByAccountId(@Param("accountId") String accountId,@Param("state") String state,@Param("id") String id);
+
     Integer updStaById(@Param("id") String id,@Param("state") String state);
 
     Integer updCpaById(@Param("id") String id,@Param("adCpaBid") String adCpaBid);
 
-    Integer updBudgetById(@Param("id") String id,@Param("budget") String budget
-                                    );
+    Integer updBudgetById(@Param("id") String id,@Param("budget") String budget);
 
 }

+ 10 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/AiBytedanceAdvertiserStrategyMapper.xml

@@ -2,6 +2,16 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrategyMapper">
 
+    <!-- 账户 修改 头条 配置信息 状态 -->
+    <update id="updStaByAccountId">
+        UPDATE ctop_ai_bytedance_advertiser_strategy
+            SET status = #{state}
+        WHERE
+            account_id = #{accountId}
+        <if test="id !=null and id != ''">
+            AND id != #{id}
+        </if>
+    </update>
 
     <!--修改 头条 配置信息 状态 -->
     <update id="updStaById">

+ 1 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdvertiserStrategyService.java

@@ -35,7 +35,7 @@ public interface IAiBytedanceAdvertiserStrategyService extends IService<AiByteda
      * @param
      * @return
      */
-    Result updStaById(String id,String state);
+    Result updStaById(String id,String state,String accountId);
 
     /**
      * 头条 - 配置信息 修改 出价; 预算;

+ 56 - 9
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -25,11 +25,19 @@ import org.jeecg.modules.bytedance.common.entity.UserAllocation;
 import org.jeecg.modules.bytedance.common.service.*;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.StringUtils;
+import org.simpleframework.xml.strategy.Strategy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.*;
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.spi.LocaleServiceProvider;
+import java.util.stream.Collectors;
 
 /**
  * 头条智能投放账户配置信息表
@@ -751,8 +759,32 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      * @param
      * @return
      */
-    public Result updStaById(String id,String state) {
-        aiBytedanceAdvertiserStrategyMapper.updStaById(id,state);
+    @Transactional
+    public Result updStaById(String id,String state,String accountId) {
+        //开启
+        if (StringUtils.equals(state,"0")){
+            //修改状态为开启
+            aiBytedanceAdvertiserStrategyMapper.updStaById(id,state);
+            //关闭 账户下 其他数据信息(不包含本条id信息) 状态为 关闭
+            aiBytedanceAdvertiserStrategyMapper.updStaByAccountId(accountId,"1",id);
+        }
+        //关闭
+        if (StringUtils.equals(state,"1")){
+            //查询是否有 状态为 开启 其他数据信息(不包含本id数据信息)
+            QueryWrapper<AiBytedanceAdvertiserStrategy> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("account_id", accountId);
+            queryWrapper.eq("status", "0");
+            queryWrapper.ne("id", id);
+            List<AiBytedanceAdvertiserStrategy> list = aiBytedanceAdvertiserStrategyMapper.selectList(queryWrapper);
+            //list 空 代表 只有当前数据 状态为 开启 则 状态 无法修改 为 关闭
+            if (Check.isNull(list)){
+                return Result.successMsg("无法关闭,同一账户下有且仅有一条配置信息状态数据为【开启】", null);
+            }
+            // 修改 账户下 状态 为关闭 (不包含本条数据信息)
+            aiBytedanceAdvertiserStrategyMapper.updStaByAccountId(accountId,state,id);
+
+        }
+
         return Result.successMsg("状态修改成功---》"+(state.equals("0") ? "开" : "关"), null);
     }
 
@@ -769,9 +801,15 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         Map<String,Object> mapPrice = new HashMap<>();
         //1-修改出价
         if (BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType())) {
-              mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
+            if (Check.isNull(updAdStaOrCpaOrBudget.getBId())){
+                return Result.errorMsg("出价不能为空,请重新输入。");
+            }
+            aiBytedanceAdvertiserStrategyMapper.updCpaById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBId());
+          /*
+            mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
             mapPrice.put("bid",updAdStaOrCpaOrBudget.getBId());
             priceList.add(mapPrice);
+*/
 
             // api 更新计划出价
             updResult = Marketing.updatePlanBid(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
@@ -781,15 +819,19 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 return Result.error(updResult.getMessage());
             }*/
             // 修改 出价
-            priceList.forEach(map-> {
+          /*  priceList.forEach(map-> {
                 aiBytedanceAdvertiserStrategyMapper.updCpaById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBId());
-            });
+            });*/
         }
         //2-修改预算
         if (BytedanceConstant.UPDTYPE_BUDGET.equals(updAdStaOrCpaOrBudget.getType())) {
-            mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
+            if (Check.isNull(updAdStaOrCpaOrBudget.getBudget())){
+                return Result.errorMsg("预算不能为空,请重新输入。");
+            }
+            aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBudget());
+           /* mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
             mapPrice.put("budget",updAdStaOrCpaOrBudget.getBudget());
-            priceList.add(mapPrice);
+            priceList.add(mapPrice);*/
             // api 修改计划 预算
            /* updResult = marketing.updatePlanBudget(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
             updResult = Marketing.updatePlanBudget(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
@@ -797,8 +839,10 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 return Result.error(updResult.getMessage());
             }*/
             priceList.forEach(map-> {
+            // 修改 预算 TODO
+            /*priceList.forEach(map-> {
                 aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBudget());
-            });
+            });*/
         }
         return Result.successMsg("修改"+(BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType()) ? "出价" : "预算")+"成功。", updResult.getResult());
     }
@@ -996,7 +1040,6 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      * @param aiBytedanceAdvertiserStrategy
      * @return: org.jeecg.common.api.vo.Result
      * @author: zianY
-     * @time: 2021/5/6 10:26
      */
     public Result addBytedanceStrategy(AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
         // 数据入库 string[] 转 string
@@ -1006,12 +1049,16 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         aiBytedanceAdvertiserStrategy.setCreativeInventoryType(org.apache.commons.lang3.StringUtils.join(aiBytedanceAdvertiserStrategy.getCreativeInventoryTypes(), ","));
         //创意标签
         aiBytedanceAdvertiserStrategy.setCreativeAdKeywords(org.apache.commons.lang3.StringUtils.join(aiBytedanceAdvertiserStrategy.getAdKeywords(), ","));
+        aiBytedanceAdvertiserStrategy.setCreativeAdKeywords(StringUtils.join(aiBytedanceAdvertiserStrategy.getAdKeywords(), ","));
+        //状态(0开 1关)
+        aiBytedanceAdvertiserStrategy.setStatus(0);
 
         //添加素材信息
         MaterialImageInfo imageInfo = new MaterialImageInfo();
         imageInfo.setUrl(aiBytedanceAdvertiserStrategy.getImageUrl());
         imageInfo.setUserId(aiBytedanceAdvertiserStrategy.getUserId());
         materialImageInfoService.initImageCode(imageInfo);
+
         aiBytedanceAdvertiserStrategyMapper.insert(aiBytedanceAdvertiserStrategy);
 
         return Result.successMsg("新增成功。",aiBytedanceAdvertiserStrategy);

+ 249 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/ApkUtils.java

@@ -0,0 +1,249 @@
+package org.jeecg.modules.bytedance.common.utils;
+
+import android.util.TypedValue;
+import brut.androlib.res.decoder.AXmlResourceParser;
+import com.dd.plist.NSArray;
+import com.dd.plist.NSString;
+import com.dd.plist.PropertyListParser;
+import org.xmlpull.v1.XmlPullParser;
+import com.dd.plist.NSDictionary;
+
+import java.io.*;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+public class ApkUtils {
+    /**
+     * 读取apk
+     * @param apkUrl
+     * @return
+     */
+    public static Map<String,Object> readAPK(String apkUrl){
+        ZipFile zipFile;
+        Map<String,Object> map = new HashMap<String, Object>();
+        try {
+            zipFile = new ZipFile(apkUrl);
+            Enumeration<?> enumeration = zipFile.entries();
+            ZipEntry zipEntry = null;
+            while (enumeration.hasMoreElements()) {
+                zipEntry = (ZipEntry) enumeration.nextElement();
+                if (zipEntry.isDirectory()) {
+
+                } else {
+                    if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
+                        AXmlResourceParser parser = new AXmlResourceParser();
+                        parser.open(zipFile.getInputStream(zipEntry));
+                        while (true) {
+                            int type = parser.next();
+                            if (type == XmlPullParser.END_DOCUMENT) {
+                                break;
+                            }
+                            String name = parser.getName();
+                            if(null != name && "manifest".equals(name.toLowerCase())){
+                                for (int i = 0; i != parser.getAttributeCount(); i++) {
+                                    if ("versionName".equals(parser.getAttributeName(i))) {
+                                        String versionName = getAttributeValue(parser, i);
+                                        if(null == versionName){
+                                            versionName = "";
+                                        }
+                                        map.put("versionName", versionName);
+                                    } else if ("package".equals(parser.getAttributeName(i))) {
+                                        String packageName = getAttributeValue(parser, i);
+                                        if(null == packageName){
+                                            packageName = "";
+                                        }
+                                        map.put("package", packageName);
+                                    } else if("versionCode".equals(parser.getAttributeName(i))){
+                                        String versionCode = getAttributeValue(parser, i);
+                                        if(null == versionCode){
+                                            versionCode = "";
+                                        }
+                                        map.put("versionCode", versionCode);
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                }
+            }
+            zipFile.close();
+        } catch (Exception e) {
+            map.put("code", "fail");
+            map.put("error","读取apk失败");
+        }
+        return map;
+    }
+
+    private static String getAttributeValue(AXmlResourceParser parser, int index) {
+        int type = parser.getAttributeValueType(index);
+        int data = parser.getAttributeValueData(index);
+        if (type == TypedValue.TYPE_STRING) {
+            return parser.getAttributeValue(index);
+        }
+        if (type == TypedValue.TYPE_ATTRIBUTE) {
+            return String.format("?%s%08X", getPackage(data), data);
+        }
+        if (type == TypedValue.TYPE_REFERENCE) {
+            return String.format("@%s%08X", getPackage(data), data);
+        }
+        if (type == TypedValue.TYPE_FLOAT) {
+            return String.valueOf(Float.intBitsToFloat(data));
+        }
+        if (type == TypedValue.TYPE_INT_HEX) {
+            return String.format("0x%08X", data);
+        }
+        if (type == TypedValue.TYPE_INT_BOOLEAN) {
+            return data != 0 ? "true" : "false";
+        }
+        if (type == TypedValue.TYPE_DIMENSION) {
+            return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
+        }
+        if (type == TypedValue.TYPE_FRACTION) {
+            return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
+        }
+        if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) {
+            return String.format("#%08X", data);
+        }
+        if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) {
+            return String.valueOf(data);
+        }
+        return String.format("<0x%X, type 0x%02X>", data, type);
+    }
+
+    private static String getPackage(int id) {
+        if (id >>> 24 == 1) {
+            return "android:";
+        }
+        return "";
+    }
+
+    // ///////////////////////////////// ILLEGAL STUFF, DONT LOOK :)
+    public static float complexToFloat(int complex) {
+        return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3];
+    }
+
+    private static final float[] RADIX_MULTS =
+            {
+                    0.00390625F, 3.051758E-005F,
+                    1.192093E-007F, 4.656613E-010F
+            };
+    private static final String[] DIMENSION_UNITS = { "px", "dip", "sp", "pt", "in", "mm", "", "" };
+    private static final String[] FRACTION_UNITS = { "%", "%p", "", "", "", "", "", "" };
+
+    /**
+     * 读取ipa
+     */
+    public static Map<String,Object> readIPA(String ipaURL){
+        Map<String,Object> map = new HashMap<String,Object>();
+        try {
+            File file = new File(ipaURL);
+            InputStream is = new FileInputStream(file);
+            InputStream is2 = new FileInputStream(file);
+            ZipInputStream zipIns = new ZipInputStream(is);
+            ZipInputStream zipIns2 = new ZipInputStream(is2);
+            ZipEntry ze;
+            ZipEntry ze2;
+            InputStream infoIs = null;
+            NSDictionary rootDict = null;
+            String icon = null;
+            while ((ze = zipIns.getNextEntry()) != null) {
+                if (!ze.isDirectory()) {
+                    String name = ze.getName();
+                    if (null != name &&
+                            name.toLowerCase().contains(".app/info.plist")) {
+                        ByteArrayOutputStream copy = new
+                                ByteArrayOutputStream();
+                        int chunk = 0;
+                        byte[] data = new byte[1024];
+                        while(-1!=(chunk=zipIns.read(data))){
+                            copy.write(data, 0, chunk);
+                        }
+                        infoIs = new ByteArrayInputStream(copy.toByteArray());
+                        rootDict = (NSDictionary) PropertyListParser.parse(infoIs);
+
+                        //我们可以根据info.plist结构获取任意我们需要的东西
+                        //比如下面我获取图标名称,图标的目录结构请下面图片
+                        //获取图标名称
+                        NSDictionary iconDict = (NSDictionary) rootDict.get("CFBundleIcons");
+
+                        while (null != iconDict) {
+                            if(iconDict.containsKey("CFBundlePrimaryIcon")){
+                                NSDictionary CFBundlePrimaryIcon = (NSDictionary)iconDict.get("CFBundlePrimaryIcon");
+                                if(CFBundlePrimaryIcon.containsKey("CFBundleIconFiles")){
+                                    NSArray CFBundleIconFiles =(NSArray)CFBundlePrimaryIcon.get("CFBundleIconFiles");
+                                    icon = CFBundleIconFiles.getArray()[0].toString();
+                                    if(icon.contains(".png")){
+                                        icon = icon.replace(".png", "");
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+
+            //根据图标名称下载图标文件到指定位置
+            while ((ze2 = zipIns2.getNextEntry()) != null) {
+                if (!ze2.isDirectory()) {
+                    String name = ze2.getName();
+                    if(name.contains(icon.trim())){
+                        FileOutputStream fos = new FileOutputStream(new File("E:\\python\\img\\icon.png"));
+                        int chunk = 0;
+                        byte[] data = new byte[1024];
+                        while(-1!=(chunk=zipIns2.read(data))){
+                            fos.write(data, 0, chunk);
+                        }
+                        fos.close();
+                        break;
+                    }
+                }
+            }
+
+            // 应用包名
+            NSString parameters = (NSString) rootDict.get("CFBundleIdentifier");
+            map.put("package", parameters.toString());
+            // 应用版本名
+            parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
+            map.put("versionName", parameters.toString());
+            //应用版本号
+            parameters = (NSString) rootDict.get("CFBundleVersion");
+            map.put("versionCode", parameters.toString());
+
+            infoIs.close();
+            is.close();
+            zipIns.close();
+
+        } catch (Exception e) {
+            map.put("code", "-1");
+            map.put("error","读取ipa文件失败");
+        }
+        return map;
+    }
+
+
+    public static void main(String[] args) {
+       // Map map = ApkUtils.readAPK("https://apps.bytesfield.com/download/basic/cur/1c728178004c8d4d6c83444a05c414c1a1cfae48");
+
+        //String filePath = LoadFileUtil.downLoadFromUrl("https://apps.bytesfield.com/download/basic/cur/1c728178004c8d4d6c83444a05c414c1a1cfae48","apkFile");
+        String filePath = LoadFileUtil.downLoadFromUrl("https://apps.bytesfield.com/download/basic/cur/96e5f2491826db22962149059da9e4eee7589764","apkFile");
+
+        System.out.println(filePath);
+
+        Map map = ApkUtils.readAPK("C:\\Users\\Administrator\\Downloads\\489586631a2c162f812e03be33ca7e87.apk");
+        Map map2 = ApkUtils.readAPK(filePath);
+
+        System.out.println(map);
+        System.out.println(map2);
+
+
+    }
+
+}

+ 60 - 10
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java

@@ -21,17 +21,13 @@ import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
 import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
 import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
 import org.jeecg.modules.bytedance.common.utils.Check;
-import org.jeecg.modules.bytedance.common.utils.ResultMapUtils;
-import org.jeecg.modules.bytedance.common.utils.StatusCode;
 import org.jeecg.modules.system.service.ISysRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 头条智能投放账户配置信息表
@@ -78,6 +74,7 @@ public class AiBytedanceAdvertiserStrategyController {
 		if(null != roleCode && !BytedanceConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)){
 			queryWrapper.eq("user_id", aiBytedanceAdvertiserStrategy.getLoginUserId());
 		}
+		queryWrapper.orderByDesc("create_time");
 		Page<AiBytedanceAdvertiserStrategy> page = new Page<AiBytedanceAdvertiserStrategy>(pageNo, pageSize);
 		//查询
 		IPage<AiBytedanceAdvertiserStrategy> pageList = aiBytedanceAdvertiserStrategyService.page(page, queryWrapper);
@@ -128,6 +125,13 @@ public class AiBytedanceAdvertiserStrategyController {
 	@PutMapping(value = "/edit")
 	public Result<AiBytedanceAdvertiserStrategy> edit(@RequestBody AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
 		Result<AiBytedanceAdvertiserStrategy> result = new Result<AiBytedanceAdvertiserStrategy>();
+		//商品卖点
+		aiBytedanceAdvertiserStrategy.setCreativeProductSellingPoints(StringUtils.join(aiBytedanceAdvertiserStrategy.getProductSellingPoints(), ","));
+		//广告位置
+		aiBytedanceAdvertiserStrategy.setCreativeInventoryType(StringUtils.join(aiBytedanceAdvertiserStrategy.getCreativeInventoryTypes(), ","));
+		//创意标签
+		aiBytedanceAdvertiserStrategy.setCreativeAdKeywords(StringUtils.join(aiBytedanceAdvertiserStrategy.getAdKeywords(), ","));
+
 		AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategyEntity = aiBytedanceAdvertiserStrategyService.getById(aiBytedanceAdvertiserStrategy.getId());
 		if(aiBytedanceAdvertiserStrategyEntity==null) {
 			result.error500("未找到对应实体");
@@ -155,7 +159,7 @@ public class AiBytedanceAdvertiserStrategyController {
 			log.error("删除失败",e.getMessage());
 			return Result.error("删除失败!");
 		}
-		return Result.ok("删除成功!");
+		return Result.successMsg("删除成功!",null);
 	}
 
 	/**
@@ -190,11 +194,17 @@ public class AiBytedanceAdvertiserStrategyController {
 			result.error500("未找到对应实体");
 		}else {
 			//商品卖点
-			aiBytedanceAdvertiserStrategy.setProductSellingPoints(aiBytedanceAdvertiserStrategy.getCreativeProductSellingPoints().split(","));
+			if (!Check.isNull(aiBytedanceAdvertiserStrategy.getCreativeProductSellingPoints())){
+				aiBytedanceAdvertiserStrategy.setProductSellingPoints(aiBytedanceAdvertiserStrategy.getCreativeProductSellingPoints().split(","));
+			}
 			//广告位置
-			aiBytedanceAdvertiserStrategy.setCreativeInventoryTypes(aiBytedanceAdvertiserStrategy.getCreativeInventoryType().split(","));
+			if (!Check.isNull(aiBytedanceAdvertiserStrategy.getCreativeInventoryType())){
+				aiBytedanceAdvertiserStrategy.setCreativeInventoryTypes(aiBytedanceAdvertiserStrategy.getCreativeInventoryType().split(","));
+			}
 			//创意标签
-			aiBytedanceAdvertiserStrategy.setAdKeywords(aiBytedanceAdvertiserStrategy.getCreativeAdKeywords().split(","));
+			if (!Check.isNull(aiBytedanceAdvertiserStrategy.getCreativeAdKeywords())){
+				aiBytedanceAdvertiserStrategy.setAdKeywords(aiBytedanceAdvertiserStrategy.getCreativeAdKeywords().split(","));
+			}
 			//素材图片url
 			MaterialImageInfo materialImageInfo = materialImageInfoService.getByCode(aiBytedanceAdvertiserStrategy.getCreativeProductImageCode());
 			aiBytedanceAdvertiserStrategy.setImageUrl(materialImageInfo.getUrl());
@@ -207,9 +217,11 @@ public class AiBytedanceAdvertiserStrategyController {
 
 	@ApiOperation(value="头条智能投放账户配置信息-修改状态(0开-1关)", notes="头条智能投放账户配置信息-修改状态(0开-1关)")
 	@PutMapping(value = "/updStaById")
-	public Result updStaById(@RequestParam("id")String id,  @ApiParam("状态(0开-1关)") @RequestParam("state") String state) {
+	public Result updStaById(@RequestParam("id")String id,
+							 @ApiParam("状态(0开-1关)") @RequestParam("state") String state,
+							 @ApiParam("账户id") @RequestParam("accountId") String accountId) {
 		try {
-			return aiBytedanceAdvertiserStrategyService.updStaById(id,state);
+			return aiBytedanceAdvertiserStrategyService.updStaById(id,state,accountId);
 		}catch (Exception e){
 			log.error("修改状态(0开-1关)失败",e.getMessage());
 			return Result.error("请求失败,请联系开发人员!");
@@ -315,4 +327,42 @@ public class AiBytedanceAdvertiserStrategyController {
 
 
 
+	/**
+	 *
+	 * @description:根据下载链接获取应用包名
+	 *
+	 * @param downloadType 类型
+	 * @param urlPath 下载链接
+	 * @return: org.jeecg.common.api.vo.Result
+	 * @author: zianY
+	 */
+	@ApiOperation(value="根据下载链接获取应用包名", notes="根据下载链接获取应用包名")
+	@GetMapping(value = "/getPackageNameByUrl")
+	public Result getPackageNameByUrl(@RequestParam("downloadType") String downloadType,@RequestParam("urlPath") String urlPath) {
+
+		try {
+			Map map = new HashMap();
+			//根据下载链接上传附件
+			urlPath = LoadFileUtil.downLoadFromUrl(urlPath, "appFiles");
+			if ("android".equalsIgnoreCase(downloadType)){
+				// 根据附件地址 读取 apk 信息
+				 map = ApkUtils.readAPK(urlPath);
+			}
+			if ("ios".equalsIgnoreCase(downloadType)){
+				 map = ApkUtils.readIPA(urlPath);
+			}
+			return Result.successMsg("根据下载链接获取应用包名成功", map);
+		}catch (Exception e){
+			log.error("根据下载链接获取应用包名异常",e.getMessage());
+			return Result.error("请求失败,请联系开发人员!");
+		}
+	}
+
+
+
+
+
+
+
+
 }

+ 1 - 1
jeecg-boot-module-system/src/main/resources/application-dev.yml

@@ -131,7 +131,7 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://139.186.165.84:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
+          url: jdbc:mysql://139.186.165.84:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
           username: hcst
           password: hcst@2020
           driver-class-name: com.mysql.jdbc.Driver