Browse Source

Merge remote-tracking branch 'origin/master'

yumeng 5 years ago
parent
commit
5ed4a6f662
18 changed files with 514 additions and 45 deletions
  1. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BidWarningServiceImpl.java
  2. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CpaBidWarningServiceImpl.java
  3. 13 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java
  4. 8 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/impl/WpsFileServiceImpl.java
  5. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/WpsUtil.java
  6. 4 15
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/upload/oss/WpsOSSUtil.java
  7. 8 7
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  8. 5 0
      module-common/pom.xml
  9. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileType.java
  10. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileTypeJudge.java
  11. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileUtil.java
  12. 46 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MailLogServiceImpl.java
  13. 3 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RefreshTokenServiceImpl.java
  14. 16 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/SendMessageServiceImpl.java
  15. 295 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/CosUtils.java
  16. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/upload/ResFileDTO.java
  17. 108 8
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/AccountWarningServiceImpl.java
  18. 1 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ByteDanceHourlyAccountWarningServiceImpl.java

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BidWarningServiceImpl.java

@@ -83,6 +83,7 @@ public class BidWarningServiceImpl implements IBidWarningService {
 
                             if (!Check.isNull(unitWarning)) {
                                 sendMessage(project.getMediaId(), accountId, projectId, project.getProjectName(), userAllocation.getAuthName(), unitWarning, maxBid);
+                                sendFeishumessage(project.getMediaId(), accountId, projectId, project.getProjectName(), userAllocation.getAuthName(), unitWarning, maxBid);
                             }
                         }
                     }

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CpaBidWarningServiceImpl.java

@@ -67,6 +67,7 @@ public class CpaBidWarningServiceImpl implements ICpaBidWarningService {
 
                     if (!Check.isNull(unitWarning)) {
                         sendMessage(project.getMediaId(), accountId, project.getId(), project.getProjectName(), userAllocation.getAuthName(), unitWarning, maxDeepCpaBid);
+                        sendFeishuMessage(project.getMediaId(), accountId, project.getId(), project.getProjectName(), userAllocation.getAuthName(), unitWarning, maxDeepCpaBid);
                     }
                 }
             }

+ 13 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java

@@ -1,5 +1,7 @@
 package org.jeecg.modules.wps.controller;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
+import cn.com.ctop.common.module.service.ISysRoleService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -36,7 +38,8 @@ import java.util.Map;
 public class WpsFileController {
 	@Autowired
 	private IWpsFileService wpsFileService;
-
+	@Autowired
+	private ISysRoleService sysRoleService;
 	@PostMapping("bindProject")
 	public Map<String,Object> bindProject(String fileId,Long projectId){
 		return wpsFileService.bindProject(fileId,projectId);
@@ -71,10 +74,18 @@ public class WpsFileController {
 												@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
 												@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 												HttpServletRequest req) {
+		String name = wpsFile.getName();
+		wpsFile.setName(null);
 		Result<IPage<WpsFile>> result = new Result<>();
 		QueryWrapper<WpsFile> queryWrapper = QueryGenerator.initQueryWrapper(wpsFile, req.getParameterMap());
+		if(null!=name&&!name.trim().equals("")){
+			queryWrapper.like("name",name);
+		}
 		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		queryWrapper.eq("creator",sysUser.getId());
+		String roleCode = sysRoleService.getRoleCodeByUserId(sysUser.getId());
+		if(null==roleCode||!roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN)){
+			queryWrapper.eq("creator",sysUser.getId());
+		}
 		Page<WpsFile> page = new Page<>(pageNo, pageSize);
 		IPage<WpsFile> pageList = wpsFileService.page(page, queryWrapper);
 		result.setSuccess(true);

+ 8 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/impl/WpsFileServiceImpl.java

@@ -1,7 +1,10 @@
 package org.jeecg.modules.wps.service.impl;
 
+import cn.com.ctop.common.module.file.FileUtil;
+import cn.com.ctop.common.module.utils.CosUtils;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.common.module.vo.ResFileDTO;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -14,13 +17,14 @@ import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.jeecg.modules.wps.config.Context;
 import org.jeecg.modules.wps.dto.*;
-import org.jeecg.modules.wps.entity.*;
+import org.jeecg.modules.wps.entity.WpsFile;
+import org.jeecg.modules.wps.entity.WpsFileVersion;
+import org.jeecg.modules.wps.entity.WpsFileWatermark;
+import org.jeecg.modules.wps.entity.WpsUser;
 import org.jeecg.modules.wps.mapper.WpsFileMapper;
 import org.jeecg.modules.wps.service.*;
 import org.jeecg.modules.wps.util.Token;
 import org.jeecg.modules.wps.util.WpsUtil;
-import org.jeecg.modules.wps.util.file.FileUtil;
-import org.jeecg.modules.wps.util.upload.ResFileDTO;
 import org.jeecg.modules.wps.util.upload.oss.WpsOSSUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -265,7 +269,7 @@ public class WpsFileServiceImpl extends ServiceImpl<WpsFileMapper, WpsFile> impl
     public Map<String,Object> fileSave(MultipartFile mFile,String userId,String fileId){
         Date date = new Date();
         // 上传
-        ResFileDTO resFileDTO = WpsOSSUtil.uploadMultipartFile(mFile);
+        ResFileDTO resFileDTO = CosUtils.uploadMultipartFile(mFile,"script-lib/wps/");
         int size = (int) resFileDTO.getFileSize();
         WpsFile file = this.getById(fileId);
         FileDTO fileInfo = new FileDTO();

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/WpsUtil.java

@@ -1,6 +1,6 @@
 package org.jeecg.modules.wps.util;
 
-import org.jeecg.modules.wps.util.file.FileUtil;
+import cn.com.ctop.common.module.file.FileUtil;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 

+ 4 - 15
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/upload/oss/WpsOSSUtil.java

@@ -1,14 +1,14 @@
 package org.jeecg.modules.wps.util.upload.oss;
 
+import cn.com.ctop.common.module.file.FileType;
+import cn.com.ctop.common.module.file.FileTypeJudge;
+import cn.com.ctop.common.module.file.FileUtil;
+import cn.com.ctop.common.module.vo.ResFileDTO;
 import com.aliyun.oss.HttpMethod;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.model.*;
 import org.apache.commons.lang.StringUtils;
-import org.jeecg.modules.wps.util.file.FileType;
-import org.jeecg.modules.wps.util.file.FileTypeJudge;
-import org.jeecg.modules.wps.util.file.FileUtil;
-import org.jeecg.modules.wps.util.upload.ResFileDTO;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -46,17 +46,6 @@ public class WpsOSSUtil {
         return new OSSClient(endpoint,accessKey, accessSecret);
     }
 
-    public static String simpleUploadFilePath(String filePath){
-        File file = new File(filePath);
-        return simpleUploadFile(file);
-    }
-
-    public static String simpleUploadFile(File file){
-        String fileName = file.getName();
-        String newFileName = FileUtil.makeNewFileName(fileName);
-        getOSSClient().putObject(bucketName, diskName + newFileName, file);
-        return (fileUrlPrefix + diskName + newFileName);
-    }
 
     public String simpleUploadMultipartFile(MultipartFile file){
         String fileName = file.getOriginalFilename();

+ 8 - 7
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -2,7 +2,6 @@ package org.jeecg;
 
 import cn.com.ctop.common.module.entity.BindAccountLogin;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
@@ -48,12 +47,14 @@ public class SampleTest {
 
     @Test
     public void testOceanEngineJob() {
-       List<UserAllocation>tokens = userAllocationService.getByParams(107L,null,null);
-       Date startDate = DateUtils.getDate();
-       tokens.forEach(token -> {
-           CtopOauthToken getToken  = oauthTokenService.getTokenByAccountId(token.getAccountId());
-           reportService.getAdvertiserReport(getToken,startDate,startDate,CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-       });
+       CtopOauthToken token = oauthTokenService.getTokenByAccountId(1657505911879694L);
+       CtopOauthToken token1 = oauthTokenService.getTokenByAccountId(1666111623537678L);
+       for(int i=20;i<80;i++){
+           Date startDate = DateUtils.addDay(new Date(),-i);
+           System.out.println(DateUtils.formatDate(startDate));
+           reportService.getAdvertiserReport(token,startDate,startDate,CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_DAILY);
+           reportService.getAdvertiserReport(token1,startDate,startDate,CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_DAILY);
+       }
     }
 
     @Autowired

+ 5 - 0
module-common/pom.xml

@@ -78,6 +78,11 @@
             <artifactId>groovy</artifactId>
             <version>${groovy.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>5.6.25</version>
+        </dependency>
 
     </dependencies>
 

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileType.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.wps.util.file;
+package cn.com.ctop.common.module.file;
 
 /**
  * 文件类型枚取

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileTypeJudge.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.wps.util.file;
+package cn.com.ctop.common.module.file;
 
 import org.springframework.stereotype.Component;
 

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/file/FileUtil.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.wps.util.file;
+package cn.com.ctop.common.module.file;
 
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;

+ 46 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MailLogServiceImpl.java

@@ -1,10 +1,14 @@
 package cn.com.ctop.common.module.service.impl;
 
+import cn.com.ctop.common.module.entity.CorpFeishuUser;
 import cn.com.ctop.common.module.entity.MailLog;
 import cn.com.ctop.common.module.mapper.MailLogMapper;
+import cn.com.ctop.common.module.service.ICorpFeishuUserService;
 import cn.com.ctop.common.module.service.IMailLogService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
+import cn.com.feishu.provider.MessageProvider;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
@@ -38,8 +42,28 @@ public class MailLogServiceImpl extends ServiceImpl<MailLogMapper, MailLog> impl
 
             CorpWexinUtils.sendMessageByWeChatId(weChatId, text.toString());
         }
+
+        CorpFeishuUser user = corpFeishuUserService.getByUserId(responsibleId);
+        if(null!=user){
+            JSONArray openIds = new JSONArray();
+            openIds.add(user.getOpenId());
+            try {
+                String transferorName = mailLogMapper.getUserNameByUserId(transferor); // 转让人姓名
+                String assigneeName = mailLogMapper.getUserNameByUserId(assignee); // 转让人姓名
+                StringBuilder text = new StringBuilder();
+                text.append("转户申请").append("\n\r").
+                        append("您的项目:").append(projectName + ",").append("\n\r")
+                        .append("账号:" + accountId).append(",申请由:" + transferorName + "转户于:" + assigneeName).append("\n\r")
+                        .append("等待您的审核,请您及时处理!");
+                MessageProvider.batchSend(null,openIds,null,text.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
     }
 
+    @Autowired
+    private ICorpFeishuUserService corpFeishuUserService;
 
     /**
      * 转户通过或失败发送通知
@@ -71,6 +95,27 @@ public class MailLogServiceImpl extends ServiceImpl<MailLogMapper, MailLog> impl
             CorpWexinUtils.sendMessageByWeChatId(weChatId, text.toString());
         }
 
-
+        CorpFeishuUser user = corpFeishuUserService.getByUserId(userId);
+        if(null!=user){
+            JSONArray openIds = new JSONArray();
+            openIds.add(user.getOpenId());
+            try {
+                String statusName = "";
+                if (status == 1) {
+                    statusName = "通过";
+                } else if (status == 2) {
+                    statusName = "拒绝";
+                }
+                StringBuilder text = new StringBuilder();
+                text.append("转户申请审核通知").append("\n\r").
+                        append("您的项目:").append(projectName + ",").append("\n\r")
+                        .append("账号:" + accountId).append("\n\r")
+                        .append("申请的转户操作已:" + statusName).append("\n\r")
+                        .append("请您前往验证,谢谢!");
+                MessageProvider.batchSend(null,openIds,null,text.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
     }
 }

+ 3 - 2
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RefreshTokenServiceImpl.java

@@ -6,6 +6,7 @@ import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IRefreshTokenService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
+import com.xxl.job.core.log.XxlJobLogger;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,14 +32,14 @@ public class RefreshTokenServiceImpl implements IRefreshTokenService {
 
         if (!Check.isNull(oauthTokens)) {
             for (CtopOauthToken oauthToken : oauthTokens) {
-                log.info("刷新token,accountId:{}", oauthToken.getAccountId());
+                XxlJobLogger.log("刷新token,accountId:{}", oauthToken.getAccountId());
                 //快手
                 if (CtopAdConstant.PLATFORM_TYPE_KUAISHOU.equals(oauthToken.getMediaId().trim())) {
                     oauthTokenService.getKuaiShouRefreshToken(oauthToken.getAccountId(), oauthToken.getAccessToken(), oauthToken.getRefreshToken(), oauthToken.getAgentType());
                 }
             }
         } else {
-            log.error("----------------------刷新token获取数据返回结果为空----------------------------------");
+            XxlJobLogger.log("----------------------刷新token获取数据返回结果为空----------------------------------");
         }
     }
 

+ 16 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/SendMessageServiceImpl.java

@@ -1,9 +1,13 @@
 package cn.com.ctop.common.module.service.impl;
 
+import cn.com.ctop.common.module.entity.CorpFeishuUser;
 import cn.com.ctop.common.module.mapper.MailLogMapper;
+import cn.com.ctop.common.module.service.ICorpFeishuUserService;
 import cn.com.ctop.common.module.service.ISendMessageService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
+import cn.com.feishu.provider.MessageProvider;
+import com.alibaba.fastjson.JSONArray;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -13,7 +17,8 @@ import org.springframework.stereotype.Service;
 public class SendMessageServiceImpl implements ISendMessageService {
     @Autowired
     private MailLogMapper mailLogMapper;
-
+    @Autowired
+    private ICorpFeishuUserService corpFeishuUserService;
     @Override
     public void sendMessage(String userId, String text) {
         String weChatId = mailLogMapper.getWChatIdByUserId(userId);
@@ -21,6 +26,16 @@ public class SendMessageServiceImpl implements ISendMessageService {
             CorpWexinUtils.sendMessageByWeChatId(weChatId, text);
             log.info("消息发送成功,userId:{}", userId);
         }
+        CorpFeishuUser user = corpFeishuUserService.getByUserId(userId);
+        if(null!=user){
+            JSONArray openIds = new JSONArray();
+            openIds.add(user.getOpenId());
+            try {
+                MessageProvider.batchSend(null,openIds,null,text);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
     }
 
 }

+ 295 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/CosUtils.java

@@ -0,0 +1,295 @@
+package cn.com.ctop.common.module.utils;
+
+import cn.com.ctop.common.module.file.FileType;
+import cn.com.ctop.common.module.file.FileTypeJudge;
+import cn.com.ctop.common.module.vo.ResFileDTO;
+import com.qcloud.cos.COSClient;
+import com.qcloud.cos.ClientConfig;
+import com.qcloud.cos.auth.BasicCOSCredentials;
+import com.qcloud.cos.auth.COSCredentials;
+import com.qcloud.cos.exception.CosClientException;
+import com.qcloud.cos.exception.CosServiceException;
+import com.qcloud.cos.model.*;
+import com.qcloud.cos.region.Region;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+public class CosUtils {
+    private static final String ACCESSKEY = "AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets";
+    private static final String SECRETKEY ="tXzuwMfplTTK3c9GFUyETilasvQfePu9";
+    private static final String APPID = "1301855440";
+    private static final String BUCKETNAME = "media-"+APPID;
+    private static final String REGIONID = "ap-chongqing";
+    private static final String URL_PREFIX = "https://"+BUCKETNAME+".cos.ap-chongqing.myqcloud.com/";
+    /**
+     * https://media-1301855440.cos.ap-chongqing.myqcloud.com/MyFile1/1234.mp4
+     */
+    /**
+     * 初始化CosClient相关配置, appid、accessKey、secretKey、region
+     * @return
+     */
+    public static COSClient getCosClient() {
+        // 1 初始化用户身份信息(secretId, secretKey)
+        COSCredentials cred = new BasicCOSCredentials(ACCESSKEY, SECRETKEY);
+        // 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
+        // clientConfig中包含了设置region, https(默认http), 超时, 代理等set方法, 使用可参见源码或者接口文档FAQ中说明
+        ClientConfig clientConfig = new ClientConfig(new Region(REGIONID));
+        // 3 生成cos客户端
+        COSClient cosClient = new COSClient(cred, clientConfig);
+        // bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
+        //String bucketName = BUCKETNAME;
+        return cosClient;
+    }
+
+    /**
+     * URL_PREFIX+fileSavePath+fileName
+     * 上传文件
+     * @return
+     * //绝对路径和相对路径都OK
+     */
+    public static String uploadFile(String filePath,String fileSavePath,String fileName) {
+        File localFile = new File(filePath);
+        PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, fileSavePath+fileName, localFile);
+        // 设置存储类型, 默认是标准(Standard), 低频(standard_ia),一般为标准的
+        putObjectRequest.setStorageClass(StorageClass.Standard);
+        COSClient cc = getCosClient();
+        try {
+            PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
+            String etag = putObjectResult.getETag();
+            return etag;
+        } catch (CosServiceException e) {
+            e.printStackTrace();
+        } catch (CosClientException e) {
+            e.printStackTrace();
+        }finally {
+            // 关闭客户端
+            cc.shutdown();
+        }
+        return null;
+    }
+
+    /**
+     * 下载文件
+     * @param bucketName
+     * @param key
+     * @return
+     */
+    public static String downLoadFile(String bucketName, String key) {
+        File downFile = new File("E:\\software\\1.jpg");
+        COSClient cc = getCosClient();
+        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
+
+        ObjectMetadata downObjectMeta = cc.getObject(getObjectRequest, downFile);
+        cc.shutdown();
+        String etag = downObjectMeta.getETag();
+        return etag;
+    }
+
+    /**
+     * 删除文件
+     * @param bucketName
+     * @param key
+     */
+    public static void deleteFile(String bucketName, String key) {
+        COSClient cc = getCosClient();
+        try {
+            cc.deleteObject(bucketName, key);
+        } catch (CosClientException e) {
+            e.printStackTrace();
+        } finally {
+            cc.shutdown();
+        }
+
+    }
+
+    /**
+     * 创建桶
+     * @param bucketName
+     * @return
+     * @throws CosClientException
+     * @throws CosServiceException
+     */
+    public static Bucket createBucket(String bucketName) throws CosClientException, CosServiceException {
+        COSClient cc = getCosClient();
+        Bucket bucket = null;
+        try {
+            bucket = cc.createBucket(bucketName);
+        } catch (CosClientException e) {
+            e.printStackTrace();
+        } finally {
+        }
+        return bucket;
+    };
+
+    /**
+     * 删除桶
+     * @param bucketName
+     * @throws CosClientException
+     * @throws CosServiceException
+     */
+    public void deleteBucket(String bucketName){
+        COSClient cc = getCosClient();
+        try {
+            cc.deleteBucket(bucketName);
+        } catch (CosClientException e) {
+            e.printStackTrace();
+        } finally {
+        }
+    };
+
+    /**
+     * 判断桶是否存在
+     * @param bucketName
+     * @return
+     */
+    public static boolean doesBucketExist(String bucketName){
+        COSClient cc = getCosClient();
+        return cc.doesBucketExist(bucketName);
+    }
+
+    /**
+     * 查看桶文件
+     * @param bucketName
+     * @return
+     * @throws CosClientException
+     * @throws CosServiceException
+     */
+    public static ObjectListing listObjects(String bucketName) throws CosClientException, CosServiceException {
+        COSClient cc = getCosClient();
+
+        // 获取 bucket 下成员(设置 delimiter)
+        ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
+        listObjectsRequest.setBucketName(bucketName);
+        // 设置 list 的 prefix, 表示 list 出来的文件 key 都是以这个 prefix 开始
+        listObjectsRequest.setPrefix("");
+        // 设置 delimiter 为/, 即获取的是直接成员,不包含目录下的递归子成员
+        listObjectsRequest.setDelimiter("/");
+        // 设置 marker, (marker 由上一次 list 获取到, 或者第一次 list marker 为空)
+        listObjectsRequest.setMarker("");
+        // 设置最多 list 100 个成员,(如果不设置, 默认为 1000 个,最大允许一次 list 1000 个 key)
+        listObjectsRequest.setMaxKeys(100);
+
+        ObjectListing objectListing = cc.listObjects(listObjectsRequest);
+        // 获取下次 list 的 marker
+        String nextMarker = objectListing.getNextMarker();
+        // 判断是否已经 list 完, 如果 list 结束, 则 isTruncated 为 false, 否则为 true
+        boolean isTruncated = objectListing.isTruncated();
+        List<COSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
+        for (COSObjectSummary cosObjectSummary : objectSummaries) {
+            // get file path
+            String key = cosObjectSummary.getKey();
+            // get file length
+            long fileSize = cosObjectSummary.getSize();
+            // get file etag
+            String eTag = cosObjectSummary.getETag();
+            // get last modify time
+            Date lastModified = cosObjectSummary.getLastModified();
+            // get file save type
+            String StorageClassStr = cosObjectSummary.getStorageClass();
+        }
+        return objectListing;
+    }
+
+    /**
+     *查询一个 Bucket 所在的 Region。
+     * @param bucketName
+     * @return
+     */
+    public static String getBucketLocation(String bucketName){
+        COSClient cosClient = getCosClient();
+        // bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
+        return cosClient.getBucketLocation(bucketName);
+    }
+
+    public static ResFileDTO uploadMultipartFile(MultipartFile file,String fileSavePath){
+        String fileName = file.getOriginalFilename();
+        InputStream inputStream;
+        ResFileDTO o = new ResFileDTO();
+        String fileType ;
+        long fileSize = file.getSize();
+        try {
+            inputStream = file.getInputStream();
+            FileType type = FileTypeJudge.getType(inputStream);
+
+            if(type == null || "null".equals(type.toString()) ||
+                    "XLS_DOC".equals(type.toString())|| "XLSX_DOCX".equals(type.toString()) ||
+                    "WPSUSER".equals(type.toString())|| "WPS".equals(type.toString())){
+                fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
+            }else{
+                fileType = type.toString().toLowerCase();
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            //用户上传的文件类型为空,并且通过二进制流获取不到文件类型,因为二进制流只列举了常用的
+            fileType = "";
+        }
+
+        try {
+            o = uploadDetailInputStream(file.getInputStream(),fileName,fileType,fileSize,fileSavePath);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return o;
+    }
+
+
+    public static ResFileDTO uploadDetailInputStream (InputStream in, String fileName , String fileType, long fileSize,String fileSavePath) {
+        String uuidFileName = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
+        String fileUrl = URL_PREFIX+fileSavePath+uuidFileName;
+        String md5key = uploadFileByInputStream(in, fileSavePath, uuidFileName);
+        ResFileDTO o = new ResFileDTO();
+        if(md5key != null){
+            o.setFileType(fileType);
+            o.setFileName(fileName);
+            o.setCFileName(uuidFileName);
+            o.setFileUrl(fileUrl);
+            o.setFileSize(fileSize);
+            o.setMd5key(md5key);
+        }
+        return o;
+    }
+
+    public static String uploadFileByInputStream(InputStream fileStream, String fileSavePath, String fileName){
+        ObjectMetadata metadata = new ObjectMetadata();
+        PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, fileSavePath+fileName, fileStream,metadata);
+        // 设置存储类型, 默认是标准(Standard), 低频(standard_ia),一般为标准的
+        putObjectRequest.setStorageClass(StorageClass.Standard);
+        COSClient cc = getCosClient();
+        try {
+            PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
+            String etag = putObjectResult.getETag();
+            return etag;
+        } catch (CosServiceException e) {
+            e.printStackTrace();
+        } catch (CosClientException e) {
+            e.printStackTrace();
+        }finally {
+            // 关闭客户端
+            cc.shutdown();
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        String filepath = "D:\\1234.mp4";
+        String fileSavePath = "script-lib/wps/";
+        String fileName = UUID.randomUUID().toString()+filepath.substring(filepath.lastIndexOf("."));
+        String filePath = uploadFile(filepath, fileSavePath, fileName);
+        System.out.println(filePath);
+//          downLoadFile(BUCKETNAME , KEY);
+        // deleteFile(BUCKETNAME , KEY01);
+//        createBucket("sunjunxian01-1251782781");
+        //deleteBucket();
+//        doesBucketExist("sunjunxian01-1251782781");
+//        System.out.println(listObjects(BUCKETNAME));
+        //System.out.println("BUCKETNAME的位置:" + getBucketLocation(BUCKETNAME));
+    }
+}

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/util/upload/ResFileDTO.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.wps.util.upload;
+package cn.com.ctop.common.module.vo;
 
 import lombok.Data;
 

+ 108 - 8
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/AccountWarningServiceImpl.java

@@ -4,13 +4,17 @@ import cn.com.ctop.common.module.entity.MailLog;
 import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.mapper.MailLogMapper;
 import cn.com.ctop.common.module.mapper.UserAllocationMapper;
+import cn.com.ctop.common.module.service.ICorpFeishuUserService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
 import cn.com.ctop.common.module.utils.SendMailUtil;
 import cn.com.ctop.kuaishou.modules.batch.service.IAccountWarningService;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyAccountMapper;
+import cn.com.feishu.provider.MessageProvider;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -19,6 +23,7 @@ import java.math.RoundingMode;
 import java.util.List;
 
 @Service
+@Slf4j
 public class AccountWarningServiceImpl implements IAccountWarningService {
     @Autowired
     private KuaishouReportHourlyAccountMapper hourlyAccountMapper;
@@ -60,12 +65,11 @@ public class AccountWarningServiceImpl implements IAccountWarningService {
                 if (!Check.isNull(nowCost) && nowCost.compareTo(new BigDecimal(0)) != 0) {
                     BigDecimal lastHourCost = hourlyAccountMapper.getCost(accountId, maxHour - 1, statDate);
                     if (!Check.isNull(lastHourCost) && lastHourCost.compareTo(new BigDecimal(0)) != 0) {
-                        if (!Check.isNull(userAllocation)) {
-                            BigDecimal subtract = nowCost.subtract(lastHourCost);
-                            BigDecimal divide = nowCost.divide(lastHourCost, 2, RoundingMode.HALF_UP);
-                            if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
-                                sendMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
-                            }
+                        BigDecimal subtract = nowCost.subtract(lastHourCost);
+                        BigDecimal divide = nowCost.divide(lastHourCost, 2, RoundingMode.HALF_UP);
+                        if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
+                            sendMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
+                            sendFeishuMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
                         }
                     }
                 }
@@ -78,6 +82,7 @@ public class AccountWarningServiceImpl implements IAccountWarningService {
                     BigDecimal divide = nowCost.divide(yesterdayHourCost, 2, RoundingMode.HALF_UP);
                     if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
                         sendYesterdayMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
+                        sendYesterdayFeishuMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
                     }
                 }
             }
@@ -88,6 +93,103 @@ public class AccountWarningServiceImpl implements IAccountWarningService {
 
     }
 
+    private void sendYesterdayFeishuMessage(Long accountId, String authName, Integer maxHour, BigDecimal nowCost, Long projectId, String projectName) {
+
+        StringBuilder text = new StringBuilder();
+        text.append("较昨日同时段消耗预警").append("\n\r")
+                .append("您的项目:" + projectName + "下的,").append("\n\r")
+                .append("账号:").append(accountId + ",").append("授权名称为:" + authName).append("\n\r")
+                .append("相较于昨日 " + maxHour + "时").append("\n\r")
+                .append("出现消耗暴涨,").append("消耗金额为:" + nowCost).append("\n\r")
+                .append("请您及时查看!");
+
+
+        QueryWrapper<MailLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.eq("hour", maxHour);
+        queryWrapper.eq("mail_type", 3);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        MailLog checkMailLog = mailLogMapper.selectOne(queryWrapper);
+        if (Check.isNull(checkMailLog)) {
+            List<String> mailList = mailLogMapper.selectMailList(projectId);
+            String subject = "快手-较昨日同时段账户消耗预警";
+            try {
+                SendMailUtil.sendMail(mailList, subject, text.toString());
+                MailLog mailLog = new MailLog();
+                mailLog.setAccountId(accountId);
+                mailLog.setMailType(3);
+                mailLog.setHour(maxHour);
+                mailLog.setContent(text.toString());
+                mailLog.setSendEmil(JSON.toJSONString(mailList));
+                mailLog.setSubject(subject);
+                mailLogMapper.insert(mailLog);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            JSONArray openIds = corpFeishuUserService.getOpenIdByParams(projectId);
+            if(null == openIds||openIds.isEmpty()){
+                log.error("该项目下运营飞书账号尚未绑定邮箱=>projectId:{}",projectId);
+                return;
+            }
+            try {
+                MessageProvider.batchSend(null,openIds,null,text.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Autowired
+    private ICorpFeishuUserService corpFeishuUserService;
+
+    private void sendFeishuMessage(Long accountId, String authName, Integer hour, BigDecimal amount, Long projectId, String projectName) {
+
+        StringBuilder text = new StringBuilder();
+        text.append("较上时段消耗预警").append("\n\r")
+                .append("您的项目:" + projectName + " 下的").append("\n\r")
+                .append("账号:").append(accountId + ",").append("授权名称为:" + authName).append("\n\r")
+                .append(hour + " 时").append("相较于 " + (hour - 1) + " 时").append("<br/>")
+                .append("出现消耗暴涨,").append("消耗金额为:" + amount).append("<br/>")
+                .append("请您及时查看!");
+
+        QueryWrapper<MailLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.eq("hour", hour);
+        queryWrapper.eq("mail_type", 2);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        MailLog checkMailLog = mailLogMapper.selectOne(queryWrapper);
+        if (Check.isNull(checkMailLog)) {
+            List<String> mailList = mailLogMapper.selectMailList(projectId);
+            String subject = "快手-账户消耗预警";
+            try {
+                SendMailUtil.sendMail(mailList, subject, text.toString());
+                MailLog mailLog = new MailLog();
+                mailLog.setAccountId(accountId);
+                mailLog.setMailType(2);
+                mailLog.setHour(hour);
+                mailLog.setContent(text.toString());
+                mailLog.setSendEmil(JSON.toJSONString(mailList));
+                mailLog.setSubject(subject);
+                mailLogMapper.insert(mailLog);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        JSONArray openIds = corpFeishuUserService.getOpenIdByParams(projectId);
+        if(null == openIds||openIds.isEmpty()){
+            log.error("该项目下运营飞书账号尚未绑定邮箱=>projectId:{}",projectId);
+            return;
+        }
+        try {
+            MessageProvider.batchSend(null,openIds,null,text.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
     private void sendYesterdayMessage(Long accountId, String authName, Integer maxHour, BigDecimal nowCost, Long projectId, String projectName) {
 
         StringBuilder text = new StringBuilder();
@@ -125,8 +227,6 @@ public class AccountWarningServiceImpl implements IAccountWarningService {
             List<String> wexinIds = mailLogMapper.selectWeiXinIdList(projectId);
             CorpWexinUtils.sendMessage(wexinIds, text.toString());
         }
-
-
     }
 
 

+ 1 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ByteDanceHourlyAccountWarningServiceImpl.java

@@ -77,6 +77,7 @@ public class ByteDanceHourlyAccountWarningServiceImpl implements IByteDanceHourl
                     BigDecimal divide = nowCost.divide(yesterdayHourCost, 2, RoundingMode.HALF_UP);
                     if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
                         sendYesterdayMessage(accountId, userAllocation.getAuthName(), maxHour, cost, userAllocation.getProjectId(), userAllocation.getProjectName());
+                        sendYesterdayFeishuMessage(accountId, userAllocation.getAuthName(), maxHour, cost, userAllocation.getProjectId(), userAllocation.getProjectName());
                     }
                 }
             }