syh преди 5 години
родител
ревизия
0446433d88

BIN
jeecg-boot-module-system/docs/opencv-420.jar


+ 23 - 0
jeecg-boot-module-system/pom.xml

@@ -169,6 +169,12 @@
             <artifactId>poi-ooxml</artifactId>
             <version>3.17</version>
         </dependency>-->
+        <dependency>
+            <groupId>com.test</groupId>
+            <artifactId>opencv</artifactId>
+            <scope>system</scope>
+            <systemPath>${basedir}/docs/opencv-420.jar</systemPath>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>
@@ -186,6 +192,23 @@
     <build>
         <plugins>
             <plugin>
+                <groupId>org.mybatis.generator</groupId>
+                <artifactId>mybatis-generator-maven-plugin</artifactId>
+                <version>1.3.6</version>
+                <configuration>
+                    <!-- 是否覆盖,true表示会替换生成的JAVA文件,false则不覆盖 -->
+                    <overwrite>true</overwrite>
+                </configuration>
+                <dependencies>
+                    <!--mysql驱动包-->
+                    <dependency>
+                        <groupId>mysql</groupId>
+                        <artifactId>mysql-connector-java</artifactId>
+                        <version>5.1.45</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>

+ 10 - 12
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java

@@ -451,31 +451,31 @@ public class TestController {
             e.printStackTrace();
         }
         //1:查询当日数据
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-        if (null == tokens || tokens.size() <= 0) {
-            log.info("定时获取头条数据异常:为获取到可用的token");
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("project_id", 215);
+        List<UserAllocation> allocations = userAllocationService.list(queryWrapper);
+        if (null == allocations || allocations.size() <= 0) {
+            log.info("定时获取头条数据异常:获取用户信息失败");
         }
         Date finalGetDate = getDate;
-        tokens.forEach(token -> {
+
+        allocations.forEach(allocation -> {
             //3:获取广告计划信息数据
+            CtopOauthToken token = oauthTokenMapper.selectByAccountId(allocation.getAccountId());
             reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         });
 
         //清洗关于作业帮数据
         //1:查询作业帮相关的用户数据
-        QueryWrapper<UserAllocation> wrapper = new QueryWrapper<>();
-        wrapper.eq("project_id", 215);
-        List<UserAllocation> allocations = userAllocationService.list(wrapper);
-        if (null != allocations && allocations.size() > 0) {
             allocations.forEach(allocation -> {
                 //根据accountId和时间,查询相关的日报表信息
-                QueryWrapper<BytedancePlanDailyReport> queryWrapper = new QueryWrapper<>();
+                QueryWrapper<BytedancePlanDailyReport> reportQueryWrapper = new QueryWrapper<>();
                 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                 String dateString = dateFormat.format(finalGetDate) + " 00:00:00";
                 queryWrapper.eq("advertiser_id", allocation.getAccountId())
                         .eq("stat_datetime", dateString)
                 ;
-                List<BytedancePlanDailyReport> bytedancePlanDailyReports = planDailyReportService.list(queryWrapper);
+                List<BytedancePlanDailyReport> bytedancePlanDailyReports = planDailyReportService.list(reportQueryWrapper);
                 if (null != bytedancePlanDailyReports && bytedancePlanDailyReports.size() > 0) {
                     bytedancePlanDailyReports.forEach(report -> {
                         String adName = report.getAdName();
@@ -505,14 +505,12 @@ public class TestController {
                     });
                 }
             });
-        }
         ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
         return result;
     }
 
     @Autowired
     private IByteDanceAdvertiserDataService advertiserDataService;
-
     @GetMapping("getBytedanceData")
     public Map<String, Object> getBytedanceData() {
         Map<String, Object> result = new HashMap<>();

+ 130 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/CornerCheck.java

@@ -0,0 +1,130 @@
+package org.jeecg.modules.demo.opencv;
+
+import org.opencv.core.*;
+import org.opencv.highgui.HighGui;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 角点检测
+ */
+public class CornerCheck {
+    static {
+        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+    }
+
+    public static void main(String[] args) {
+//        harris();
+        detectConers();
+//        getConers();
+    }
+
+    public static void getConers() {
+        Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
+        List<Point> points = new ArrayList<>();
+        int minX = 10000;
+        int minY = 10000;
+        int maxX = 0;
+        int maxY = 0;
+        for (int j = 0; j < src.rows(); j++) {
+            for (int i = 0; i < src.cols(); i++) {
+                double[] details = src.get(j, i);
+                if (null != details && details.length > 0) {
+                    if (details[0] == 0 && details[1] == 236 && details[2] == 2) {
+                        System.out.print("{" + j + "," + i + "}:");
+                        Point point = new Point();
+                        point.x = i;
+                        point.y = j;
+                        if (minX >= i) {
+                            minX = i;
+                        }
+                        if (maxX <= i) {
+                            maxX = i;
+                        }
+                        if (maxY <= j) {
+                            maxY = j;
+                        }
+                        points.add(point);
+                    }
+                }
+            }
+        }
+
+        System.out.println(minX);
+
+    }
+
+    public static void detectConers() {
+        try {
+            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+
+            final int maxCorners = 50, blockSize = 3;
+            final double qualityLevel = 0.01, minDistance = 20.0, k = 0.04;
+            final boolean useHarrisDetector = false;
+            MatOfPoint corners = new MatOfPoint();
+
+            Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
+            if (src.empty()) {
+                throw new Exception("no file");
+            }
+            Mat dst = src.clone();
+            Mat gray = new Mat();
+            Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
+            Imgproc.goodFeaturesToTrack(gray, corners, maxCorners, qualityLevel, minDistance,
+                    new Mat(), blockSize, useHarrisDetector, k);
+            Point[] pCorners = corners.toArray();
+
+            for (int i = 0; i < pCorners.length; i++) {
+                double[] details = src.get((int) pCorners[i].y, (int) pCorners[i].x);
+                if (pCorners[i].x > 130 && pCorners[i].x < 570 && pCorners[i].y > 200 && pCorners[i].y < 850) {
+                    System.out.println(pCorners[i].toString());
+                    Imgproc.circle(dst, pCorners[i], 4, new Scalar(0, 0, 255), Imgproc.FILLED);
+                }
+            }
+            Imgcodecs.imwrite("D:\\data\\coners.jpg", dst);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println("例外:" + e);
+        }
+    }
+
+    /**
+     * OpenCV-4.1.0 Harris 角点检测
+     *
+     * @return void
+     * @Author: hyacinth
+     * @Title: harris
+     * @Description: TODO
+     * @date: 2019年8月26日 下午10:13:10
+     */
+    public static void harris() {
+        //载入图片
+        Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
+        Mat gray = new Mat();
+        Mat dst = new Mat();
+        //灰度处理
+        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
+        HighGui.imshow("灰度处理", gray);
+        Imgproc.cornerHarris(gray, dst, 2, 3, 0.06);
+        HighGui.imshow("角点检测", dst);
+        Core.normalize(dst, dst, 0, 255, Core.NORM_MINMAX, -1, new Mat());
+        HighGui.imshow("归一处理", dst);
+        Core.convertScaleAbs(dst, dst);
+
+        Mat result = src.clone();
+        for (int i = 0, row = result.rows(); i < row; i++) {
+            for (int j = 0, col = result.cols(); j < col; j++) {
+                if (dst.get(i, j).clone()[0] > 180) {
+                    Imgproc.circle(result, new Point(j, i), 1, new Scalar(0, 0, 255), Imgproc.FILLED);
+                    System.out.println("像素点位:" + j + "," + i);
+                }
+            }
+        }
+
+        HighGui.imshow("Harris 角点检测", result);
+        HighGui.waitKey(0);
+    }
+}

+ 77 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Perspective.java

@@ -0,0 +1,77 @@
+package org.jeecg.modules.demo.opencv;
+
+
+import org.opencv.core.Core;
+import org.opencv.core.CvType;
+import org.opencv.core.Mat;
+import org.opencv.core.Point;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+import org.opencv.utils.Converters;
+
+import java.util.List;
+
+/**
+ * 透视变换
+ */
+public class Perspective {
+    public static void main(String[] args) {
+        try {
+            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+
+            Mat src = Imgcodecs.imread("d://data//123.jpg");
+            Mat test = Imgcodecs.imread("d://data//test.jpg");
+            //读取图像到矩阵中
+            if (src.empty()) {
+                throw new Exception("no file");
+            }
+
+            int xMargin, yMargin;
+            int x0 = src.cols() / 4;
+            int x1 = (src.cols() / 4) * 3;
+            int y0 = src.cols() / 4;
+            int y1 = (src.cols() / 4) * 3;
+            Mat dst = new Mat();
+
+            List<Point> listSrcs = java.util.Arrays.asList(new Point(x0, y0), new Point(x0, y1), new Point(x1, y1), new Point(x1, y0));
+            Mat srcPoints = Converters.vector_Point_to_Mat(listSrcs, CvType.CV_32F);
+
+            xMargin = src.cols() / 10;
+            yMargin = src.rows() / 10;
+            List<Point> listDsts = java.util.Arrays.asList(new Point(x0 + xMargin, y0 + yMargin), listSrcs.get(1), listSrcs.get(2), new Point(x1 - xMargin, y0 + yMargin));
+            Mat dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);
+
+            Mat perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
+            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);
+            Imgcodecs.imwrite("d://data//1.jpg", dst);
+
+            xMargin = src.cols() / 8;
+            yMargin = src.cols() / 8;
+            listDsts.set(0, listSrcs.get(0));
+            listDsts.set(1, listSrcs.get(1));
+            listDsts.set(2, new Point(x1 - xMargin, y1 - yMargin));
+            listDsts.set(3, new Point(x1 - xMargin, y0 - yMargin));
+            dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);
+
+            perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
+            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);
+            Imgcodecs.imwrite("d://data//2.jpg", dst);
+
+            xMargin = src.cols() / 6;
+            yMargin = src.cols() / 6;
+            listDsts.set(0, new Point(x0 + xMargin, y0 + yMargin));
+            listDsts.set(1, listSrcs.get(1));
+            listDsts.set(2, new Point(x1 - xMargin, y1 - yMargin));
+            listDsts.set(3, listSrcs.get(3));
+            dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);
+
+            perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
+            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);
+
+            Imgcodecs.imwrite("d://data//3.jpg", dst);
+        } catch (Exception e) {
+            System.out.println("例外:" + e);
+        }
+
+    }
+}

+ 78 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/VideoProcessing.java

@@ -0,0 +1,78 @@
+package org.jeecg.modules.demo.opencv;
+
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.Frame;
+import org.bytedeco.javacv.Java2DFrameConverter;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+/**
+ * 视频截帧处理
+ */
+public class VideoProcessing {
+    public static String videoPath = "D:/data";
+
+    //存放截取视频某一帧的图片
+    public static String videoFramesPath = "D:/data/images/";
+
+    /**
+     * 将视频文件帧处理并以“jpg”格式进行存储。
+     * 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
+     *
+     * @param videoFileName
+     */
+    public static String grabberVideoFramer(String videoFileName) {
+        //最后获取到的视频的图片的路径
+        String videPicture = "";
+        //Frame对象
+        Frame frame = null;
+        //标识
+        int flag = 0;
+        try {
+			 /*
+            获取视频文件
+            */
+            FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
+            fFmpegFrameGrabber.start();
+
+            //获取视频总帧数
+            int ftp = fFmpegFrameGrabber.getLengthInFrames();
+            System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
+
+            while (flag <= ftp) {
+                frame = fFmpegFrameGrabber.grabImage();
+				/*
+				对视频的第五帧进行处理
+				 */
+                if (frame != null) {
+                    //文件绝对路径+名字
+                    String fileName = videoFramesPath + String.valueOf(flag) + ".jpg";
+
+                    //文件储存对象
+                    File outPut = new File(fileName);
+                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
+                }
+                flag++;
+            }
+            fFmpegFrameGrabber.stop();
+            fFmpegFrameGrabber.close();
+        } catch (Exception E) {
+            E.printStackTrace();
+        }
+        return videPicture;
+    }
+
+    public static BufferedImage FrameToBufferedImage(Frame frame) {
+        //创建BufferedImage对象
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        BufferedImage bufferedImage = converter.getBufferedImage(frame);
+        return bufferedImage;
+    }
+
+    public static void main(String[] args) {
+        String videoFileName = "video.mp4";
+        grabberVideoFramer(videoFileName);
+    }
+}

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

@@ -37,6 +37,19 @@ spring:
   ## quartz定时任务,采用数据库方式
   quartz:
     job-store-type: jdbc
+    #相关属性配置
+    properties:
+      org:
+        quartz:
+          jobStore:
+            class: org.quartz.simpl.RAMJobStore
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+            clusterCheckinInterval: 10000
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 20
+            threadPriority: 5
+            threadsInheritContextClassLoaderOfInitializingThread: true
   #json 时间戳统一转换
   jackson:
     date-format:   yyyy-MM-dd HH:mm:ss

+ 49 - 0
jeecg-boot-module-system/src/main/resources/generatorConfig.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE generatorConfiguration
+        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
+        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
+<generatorConfiguration>
+    <!-- 导入配置文件 -->
+    <properties resource="application.properties"/>
+
+    <!-- defaultModelType="flat" 设置复合主键时不单独为主键创建实体 -->
+    <context id="MySql" defaultModelType="flat">
+
+        <!-- 生成的POJO实现java.io.Serializable接口 -->
+        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
+
+        <!--注释-->
+        <commentGenerator>
+            <!-- 将数据库中表的字段描述信息添加到注释 -->
+            <property name="addRemarkComments" value="true"/>
+            <!-- 注释里不添加日期 -->
+            <property name="suppressDate" value="true"/>
+        </commentGenerator>
+        <!-- 数据库连接,直接通过${}读取application.properties里的配置 -->
+        <jdbcConnection
+                driverClass="${spring.datasource.driver-class-name}"
+                connectionURL="${spring.datasource.url}"
+                userId="${spring.datasource.username}"
+                password="${spring.datasource.password}"/>
+
+        <!-- 生成POJO对象,并将类放到com.songguoliang.springboot.entity包下 -->
+        <javaModelGenerator targetPackage="com.songguoliang.springboot.entity"
+                            targetProject="src/main/java"></javaModelGenerator>
+        <!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->
+        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator>
+
+
+        <!-- 生成mapper xml对应dao接口,放到com.songguoliang.springboot.mapper包下-->
+        <javaClientGenerator targetPackage="com.songguoliang.springboot.mapper" targetProject="src/main/java"
+                             type="XMLMAPPER"></javaClientGenerator>
+
+        <!-- table标签可以有多个,至少一个,tableName指定表名,可以使用_和%通配符 -->
+        <table tableName="tbl_user">
+            <!-- 是否只生成POJO对象 -->
+            <property name="modelOnly" value="false"/>
+            <!-- 数据库中表名有时我们都会带个前缀,而实体又不想带前缀,这个配置可以把实体的前缀去掉 -->
+            <domainObjectRenamingRule searchString="^Tbl" replaceString=""/>
+
+        </table>
+    </context>
+</generatorConfiguration>

+ 1 - 0
module-report/src/main/java/cn/com/ctop/bytedance/service/impl/ReportServiceImpl.java

@@ -224,6 +224,7 @@ public class ReportServiceImpl implements IReportService {
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
         var jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
         JSONObject getObject = getAdStat(token, jsonObject);
+        log.warn(getObject.toJSONString());
         if (null == getObject) {
             log.error("广告计划报表数据获取异常=》account:{};message:{}", token.getAccountId(), "返回数据异常");
             return;