소스 검색

Merge branch 'dev' of http://git.ycjcjy.com/zhiyuxing/estateagents into dev

yansen 5 년 전
부모
커밋
42a1036574

+ 1
- 5
src/main/java/com/huiju/estateagents/controller/TaQrcodeController.java 파일 보기

224
 
224
 
225
     @RequestMapping(value = "/admin/getStatisticRecordExport", method = RequestMethod.GET)
225
     @RequestMapping(value = "/admin/getStatisticRecordExport", method = RequestMethod.GET)
226
     public void getStatisticRecordExport(Integer qrCodeId, Integer type, HttpServletRequest request, HttpServletResponse response) {
226
     public void getStatisticRecordExport(Integer qrCodeId, Integer type, HttpServletRequest request, HttpServletResponse response) {
227
-        ExcelWriter writer = null;
228
-        OutputStream outputStream = null;
229
         try {
227
         try {
230
-            outputStream = response.getOutputStream();
231
-            iTaQrcodeService.getStatisticRecordExport(type,qrCodeId,getOrgId(request));
232
-            outputStream.flush();
228
+            iTaQrcodeService.getStatisticRecordExport(type, qrCodeId, getOrgId(request), response);
233
         } catch (Exception e) {
229
         } catch (Exception e) {
234
             e.printStackTrace();
230
             e.printStackTrace();
235
         } finally {
231
         } finally {

+ 30
- 0
src/main/java/com/huiju/estateagents/entity/TaCustomerFrom.java 파일 보기

1
 package com.huiju.estateagents.entity;
1
 package com.huiju.estateagents.entity;
2
 
2
 
3
 import com.baomidou.mybatisplus.annotation.IdType;
3
 import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableField;
4
 import com.baomidou.mybatisplus.annotation.TableId;
5
 import com.baomidou.mybatisplus.annotation.TableId;
5
 import java.time.LocalDateTime;
6
 import java.time.LocalDateTime;
6
 import java.io.Serializable;
7
 import java.io.Serializable;
109
      */
110
      */
110
     private String remark;
111
     private String remark;
111
 
112
 
113
+    /**
114
+     * 用户名
115
+     */
116
+    @TableField(exist = false)
117
+    private String userName;
118
+
119
+    /**
120
+     * 用户手机号码
121
+     */
122
+    @TableField(exist = false)
123
+    private String userTel;
124
+
125
+    /**
126
+     * 用户性别
127
+     */
128
+    @TableField(exist = false)
129
+    private Integer sex;
130
+
131
+    /**
132
+     * 归属城市
133
+     */
134
+    @TableField(exist = false)
135
+    private String city;
136
+
137
+    /**
138
+     * 用户注册时间
139
+     */
140
+    @TableField(exist = false)
141
+    private LocalDateTime registerTime;
112
 
142
 
113
     /**
143
     /**
114
      * 渠道 ID
144
      * 渠道 ID

+ 4
- 2
src/main/java/com/huiju/estateagents/excel/QrCodeStatistics/QrCodeNewPersonNum.java 파일 보기

4
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
4
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
5
 import lombok.Data;
5
 import lombok.Data;
6
 
6
 
7
+import java.time.LocalDateTime;
8
+
7
 @Data
9
 @Data
8
 public class QrCodeNewPersonNum {
10
 public class QrCodeNewPersonNum {
9
     /**
11
     /**
38
      * 访问次数
40
      * 访问次数
39
      */
41
      */
40
     @ColumnWidth(15)
42
     @ColumnWidth(15)
41
-    @ExcelProperty(value = "访问次数", index = 4)
42
-    private String visitNum;
43
+    @ExcelProperty(value = "注册时间", index = 4)
44
+    private LocalDateTime registerTime;
43
 }
45
 }

+ 3
- 1
src/main/java/com/huiju/estateagents/service/ITaQrcodeService.java 파일 보기

8
 import org.springframework.web.bind.annotation.RequestParam;
8
 import org.springframework.web.bind.annotation.RequestParam;
9
 
9
 
10
 import javax.servlet.http.HttpServletRequest;
10
 import javax.servlet.http.HttpServletRequest;
11
+import javax.servlet.http.HttpServletResponse;
12
+import java.io.IOException;
11
 
13
 
12
 /**
14
 /**
13
  * <p>
15
  * <p>
27
 
29
 
28
     ResponseBean getStatisticRecord(Integer type, Integer pageNum, Integer pageSize, Integer qrCodeId, Integer orgId);
30
     ResponseBean getStatisticRecord(Integer type, Integer pageNum, Integer pageSize, Integer qrCodeId, Integer orgId);
29
 
31
 
30
-    void getStatisticRecordExport(Integer type, Integer qrCodeId, Integer orgId);
32
+    void getStatisticRecordExport(Integer type, Integer qrCodeId, Integer orgId, HttpServletResponse response) throws IOException;
31
 }
33
 }

+ 13
- 6
src/main/java/com/huiju/estateagents/service/impl/TaQrcodeServiceImpl.java 파일 보기

25
 import org.springframework.beans.factory.annotation.Autowired;
25
 import org.springframework.beans.factory.annotation.Autowired;
26
 import org.springframework.stereotype.Service;
26
 import org.springframework.stereotype.Service;
27
 
27
 
28
+import javax.servlet.http.HttpServletResponse;
29
+import java.io.IOException;
28
 import java.time.LocalDateTime;
30
 import java.time.LocalDateTime;
29
 import java.util.List;
31
 import java.util.List;
30
 
32
 
152
         Integer visitNum = taQrcodeMapper.getVisitNum(qrCodeId, orgId);
154
         Integer visitNum = taQrcodeMapper.getVisitNum(qrCodeId, orgId);
153
 
155
 
154
         // 查询新增用户数
156
         // 查询新增用户数
155
-//        Integer newPersons = taQrcodeMapper.getNewPersons(qrCodeId, orgId);
157
+        Integer newPersons = taQrcodeMapper.getNewPersons(qrCodeId, orgId);
156
 
158
 
157
         // 组装反参
159
         // 组装反参
158
         JSONObject resultObj = new JSONObject();
160
         JSONObject resultObj = new JSONObject();
159
         resultObj.put("visitPersons", visitPersons);
161
         resultObj.put("visitPersons", visitPersons);
160
         resultObj.put("visitNum", visitNum);
162
         resultObj.put("visitNum", visitNum);
161
-//        resultObj.put("newPersons", newPersons);
163
+        resultObj.put("newPersons", newPersons);
162
         resultObj.put("qrCodeInfo", taQrcode);
164
         resultObj.put("qrCodeInfo", taQrcode);
163
         responseBean.addSuccess(resultObj);
165
         responseBean.addSuccess(resultObj);
164
         return responseBean;
166
         return responseBean;
186
     }
188
     }
187
 
189
 
188
     @Override
190
     @Override
189
-    public void getStatisticRecordExport(Integer type, Integer qrCodeId, Integer orgId) {
191
+    public void getStatisticRecordExport(Integer type, Integer qrCodeId, Integer orgId, HttpServletResponse response) throws IOException {
192
+        response.setContentType("application/vnd.ms-excel");
193
+        response.setCharacterEncoding("utf-8");
190
         switch (type) {
194
         switch (type) {
191
             case 1:
195
             case 1:
192
                 List<QrCodeVisitPersonNum> records = taQrcodeMapper.getVisitPersonsRecordExport(qrCodeId,orgId);
196
                 List<QrCodeVisitPersonNum> records = taQrcodeMapper.getVisitPersonsRecordExport(qrCodeId,orgId);
193
-                EasyExcel.write("访问人数.xlsx", QrCodeVisitPersonNum.class).sheet("访问人数").doWrite(records);
197
+                response.setHeader("Content-disposition", "attachment;filename=访问人数.xlsx");
198
+                EasyExcel.write(response.getOutputStream(), QrCodeVisitPersonNum.class).sheet("访问人数").doWrite(records);
194
                 break;
199
                 break;
195
             case 2:
200
             case 2:
196
                 List<QrCodeVisitNum> records2 = taQrcodeMapper.getVisitNumRecordExport(qrCodeId, orgId);
201
                 List<QrCodeVisitNum> records2 = taQrcodeMapper.getVisitNumRecordExport(qrCodeId, orgId);
197
-                EasyExcel.write("访问次数.xlsx", QrCodeVisitNum.class).sheet("访问次数").doWrite(records2);
202
+                response.setHeader("Content-disposition", "attachment;filename=访问次数.xlsx");
203
+                EasyExcel.write(response.getOutputStream(), QrCodeVisitNum.class).sheet("访问次数").doWrite(records2);
198
                 break;
204
                 break;
199
             case 3:
205
             case 3:
200
                 List<QrCodeNewPersonNum> records3 = taQrcodeMapper.getNewPersonsRecordExport(qrCodeId, orgId);
206
                 List<QrCodeNewPersonNum> records3 = taQrcodeMapper.getNewPersonsRecordExport(qrCodeId, orgId);
201
-                EasyExcel.write("新增注册用户.xlsx", QrCodeNewPersonNum.class).sheet("新增注册用户").doWrite(records3);
207
+                response.setHeader("Content-disposition", "attachment;filename=新增注册用户.xlsx");
208
+                EasyExcel.write(response.getOutputStream(), QrCodeNewPersonNum.class).sheet("新增注册用户").doWrite(records3);
202
                 break;
209
                 break;
203
             default:
210
             default:
204
                 break;
211
                 break;

+ 93
- 31
src/main/resources/log/logback-spring.xml 파일 보기

2
 <configuration debug="false">
2
 <configuration debug="false">
3
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
3
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
4
     <property name="LOG_HOME" value="/home/dev/estateagents/service/logs" />
4
     <property name="LOG_HOME" value="/home/dev/estateagents/service/logs" />
5
+
5
     <!-- 控制台输出 -->
6
     <!-- 控制台输出 -->
6
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
7
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
7
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
8
+        <!-- 日志输出编码 -->
9
+        <!--<Encoding>UTF-8</Encoding>-->
10
+        <layout class="ch.qos.logback.classic.PatternLayout">
8
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
11
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
12
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
13
+            </pattern>
14
+        </layout>
15
+    </appender>
16
+
17
+    <!-- 时间滚动输出 level为 INFO 日志 -->
18
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
19
+        <!-- 正在记录的日志文件的路径及文件名 -->
20
+        <file>${LOG_HOME}/log_info.log</file>
21
+        <!--日志文件输出格式-->
22
+        <encoder>
9
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
23
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
24
+            <charset>UTF-8</charset>
10
         </encoder>
25
         </encoder>
11
-    </appender>
12
-    <!-- 按照每天生成日志文件 -->
13
-    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
26
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
14
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
27
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
15
-            <!--日志文件输出的文件名-->
16
-            <FileNamePattern>${LOG_HOME}/estateagents-%d{yyyy-MM-dd}.log</FileNamePattern>
28
+            <!-- 每天日志归档路径以及格式 -->
29
+            <fileNamePattern>${LOG_HOME}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
30
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
31
+                <maxFileSize>100MB</maxFileSize>
32
+            </timeBasedFileNamingAndTriggeringPolicy>
17
             <!--日志文件保留天数-->
33
             <!--日志文件保留天数-->
18
-            <MaxHistory>30</MaxHistory>
34
+            <maxHistory>15</maxHistory>
19
         </rollingPolicy>
35
         </rollingPolicy>
20
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
21
-            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
22
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
23
-        </encoder>
24
-        <!--日志文件最大的大小-->
25
-<!--        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
26
-<!--            <MaxFileSize>10MB</MaxFileSize>-->
27
-<!--        </triggeringPolicy>-->
36
+        <!-- 此日志文件只记录info级别的 -->
37
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
38
+            <level>info</level>
39
+            <onMatch>ACCEPT</onMatch>
40
+            <onMismatch>DENY</onMismatch>
41
+        </filter>
28
     </appender>
42
     </appender>
29
 
43
 
30
-    <!-- 按照每天生成日志文件 -->
31
-    <appender name="MYSQL"  class="ch.qos.logback.core.rolling.RollingFileAppender">
44
+    <!-- 时间滚动输出 level为 WARN 日志 -->
45
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
46
+        <!-- 正在记录的日志文件的路径及文件名 -->
47
+        <file>${LOG_HOME}/log_warn.log</file>
48
+        <!--日志文件输出格式-->
49
+        <encoder>
50
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
51
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
52
+        </encoder>
53
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
32
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
54
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
33
-            <!--日志文件输出的文件名-->
34
-            <FileNamePattern>${LOG_HOME}/estateagents-%d{yyyy-MM-dd}-sql.log</FileNamePattern>
55
+            <fileNamePattern>${LOG_HOME}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
56
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
57
+                <maxFileSize>100MB</maxFileSize>
58
+            </timeBasedFileNamingAndTriggeringPolicy>
35
             <!--日志文件保留天数-->
59
             <!--日志文件保留天数-->
36
-            <MaxHistory>30</MaxHistory>
60
+            <maxHistory>15</maxHistory>
37
         </rollingPolicy>
61
         </rollingPolicy>
38
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
39
-            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
62
+        <!-- 此日志文件只记录warn级别的 -->
63
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
64
+            <level>warn</level>
65
+            <onMatch>ACCEPT</onMatch>
66
+            <onMismatch>DENY</onMismatch>
67
+        </filter>
68
+    </appender>
69
+
70
+    <!-- 时间滚动输出 level为 ERROR 日志 -->
71
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
72
+        <!-- 正在记录的日志文件的路径及文件名 -->
73
+        <file>${LOG_HOME}/log_error.log</file>
74
+        <!--日志文件输出格式-->
75
+        <encoder>
40
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
76
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
77
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
41
         </encoder>
78
         </encoder>
42
-        <!--日志文件最大的大小-->
43
-<!--                <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
44
-<!--                    <MaxFileSize>1024MB</MaxFileSize>-->
45
-<!--                </triggeringPolicy>-->
79
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
80
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
81
+            <fileNamePattern>${LOG_HOME}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
82
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
83
+                <maxFileSize>100MB</maxFileSize>
84
+            </timeBasedFileNamingAndTriggeringPolicy>
85
+            <!--日志文件保留天数-->
86
+            <maxHistory>15</maxHistory>
87
+        </rollingPolicy>
88
+        <!-- 此日志文件只记录ERROR级别的 -->
89
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
90
+            <level>ERROR</level>
91
+            <onMatch>ACCEPT</onMatch>
92
+            <onMismatch>DENY</onMismatch>
93
+        </filter>
46
     </appender>
94
     </appender>
47
 
95
 
96
+    <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
97
+    <!-- <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="TRACE" />
98
+    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
99
+    <logger name="org.hibernate.SQL" level="DEBUG" />
100
+    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
101
+    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> -->
102
+
48
     <!--myibatis log configure-->
103
     <!--myibatis log configure-->
104
+    <!--<logger name="com.apache.ibatis" level="TRACE"/>-->
105
+    <!--<logger name="java.sql.Connection" level="DEBUG"/>-->
106
+    <!--<logger name="java.sql.Statement" level="DEBUG"/>-->
107
+    <!--<logger name="java.sql.PreparedStatement" level="DEBUG"/>-->
49
     <logger name="com.huiju.estateagents.mapper" level="DEBUG" additivity="false">
108
     <logger name="com.huiju.estateagents.mapper" level="DEBUG" additivity="false">
50
         <appender-ref ref="MYSQL" />
109
         <appender-ref ref="MYSQL" />
51
     </logger>
110
     </logger>
52
 
111
 
53
     <!-- 日志输出级别 -->
112
     <!-- 日志输出级别 -->
54
-    <root level="INFO">
55
-        <appender-ref ref="STDOUT" />
56
-        <appender-ref ref="FILE" />
57
-        <appender-ref ref="MYSQL" />
113
+    <root level="info">
114
+        <appender-ref ref="CONSOLE" />
115
+        <appender-ref ref="INFO_FILE" />
116
+        <appender-ref ref="WARN_FILE" />
117
+        <appender-ref ref="ERROR_FILE" />
58
     </root>
118
     </root>
119
+
120
+
59
 </configuration>
121
 </configuration>

+ 33
- 4
src/main/resources/mapper/TaQrcodeMapper.xml 파일 보기

51
     </select>
51
     </select>
52
 
52
 
53
     <select id="getNewPersons" resultType="java.lang.Integer">
53
     <select id="getNewPersons" resultType="java.lang.Integer">
54
-
54
+        SELECT
55
+            count( DISTINCT t.person_id )
56
+        FROM
57
+            ta_customer_from t
58
+        WHERE
59
+            t.org_id = #{orgId}
60
+            AND t.qr_code_id = #{qrCodeId}
55
     </select>
61
     </select>
56
 
62
 
57
     <select id="getVisitPersonsRecord" resultType="com.huiju.estateagents.entity.TaPersonVisitRecord">
63
     <select id="getVisitPersonsRecord" resultType="com.huiju.estateagents.entity.TaPersonVisitRecord">
122
             AND t.qrcode_id = #{qrCodeId}
128
             AND t.qrcode_id = #{qrCodeId}
123
     </select>
129
     </select>
124
 
130
 
125
-    <select id="getNewPersonsRecord" resultType="com.huiju.estateagents.entity.TaPersonVisitRecord">
126
-
131
+    <select id="getNewPersonsRecord" resultType="com.huiju.estateagents.entity.TaCustomerFrom">
132
+        SELECT
133
+            t.*,
134
+            t2.`name` userName,
135
+            t2.phone userTel,
136
+            t2.sex,
137
+            t2.city ,
138
+            t2.create_date registerTime
139
+        FROM
140
+            ta_customer_from t
141
+            LEFT JOIN ta_recommend_customer t2 ON t.person_id = t2.person_id
142
+        WHERE
143
+            t.org_id = #{orgId}
144
+            AND t.qr_code_id = #{qrCodeId}
127
     </select>
145
     </select>
128
 
146
 
129
     <select id="getNewPersonsRecordExport" resultType="com.huiju.estateagents.excel.QrCodeStatistics.QrCodeNewPersonNum">
147
     <select id="getNewPersonsRecordExport" resultType="com.huiju.estateagents.excel.QrCodeStatistics.QrCodeNewPersonNum">
130
-
148
+        SELECT
149
+            t2.`name` nickName,
150
+            t2.tel phone,
151
+            t2.sex gender,
152
+            t2.city province,
153
+            t.create_date registerTime
154
+        FROM
155
+            ta_customer_from t
156
+            LEFT JOIN ta_recommend_customer t2 ON t.person_id = t2.person_id
157
+        WHERE
158
+            t.org_id = #{orgId}
159
+            AND t.qr_code_id = #{qrCodeId}
131
     </select>
160
     </select>
132
 
161
 
133
 </mapper>
162
 </mapper>