Selaa lähdekoodia

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

yansen 5 vuotta sitten
vanhempi
commit
42a1036574

+ 1
- 5
src/main/java/com/huiju/estateagents/controller/TaQrcodeController.java Näytä tiedosto

@@ -224,12 +224,8 @@ public class TaQrcodeController extends BaseController {
224 224
 
225 225
     @RequestMapping(value = "/admin/getStatisticRecordExport", method = RequestMethod.GET)
226 226
     public void getStatisticRecordExport(Integer qrCodeId, Integer type, HttpServletRequest request, HttpServletResponse response) {
227
-        ExcelWriter writer = null;
228
-        OutputStream outputStream = null;
229 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 229
         } catch (Exception e) {
234 230
             e.printStackTrace();
235 231
         } finally {

+ 30
- 0
src/main/java/com/huiju/estateagents/entity/TaCustomerFrom.java Näytä tiedosto

@@ -1,6 +1,7 @@
1 1
 package com.huiju.estateagents.entity;
2 2
 
3 3
 import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableField;
4 5
 import com.baomidou.mybatisplus.annotation.TableId;
5 6
 import java.time.LocalDateTime;
6 7
 import java.io.Serializable;
@@ -109,6 +110,35 @@ public class TaCustomerFrom implements Serializable {
109 110
      */
110 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 144
      * 渠道 ID

+ 4
- 2
src/main/java/com/huiju/estateagents/excel/QrCodeStatistics/QrCodeNewPersonNum.java Näytä tiedosto

@@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
4 4
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
5 5
 import lombok.Data;
6 6
 
7
+import java.time.LocalDateTime;
8
+
7 9
 @Data
8 10
 public class QrCodeNewPersonNum {
9 11
     /**
@@ -38,6 +40,6 @@ public class QrCodeNewPersonNum {
38 40
      * 访问次数
39 41
      */
40 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 Näytä tiedosto

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
8 8
 import org.springframework.web.bind.annotation.RequestParam;
9 9
 
10 10
 import javax.servlet.http.HttpServletRequest;
11
+import javax.servlet.http.HttpServletResponse;
12
+import java.io.IOException;
11 13
 
12 14
 /**
13 15
  * <p>
@@ -27,5 +29,5 @@ public interface ITaQrcodeService extends IService<TaQrcode> {
27 29
 
28 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 Näytä tiedosto

@@ -25,6 +25,8 @@ import org.slf4j.LoggerFactory;
25 25
 import org.springframework.beans.factory.annotation.Autowired;
26 26
 import org.springframework.stereotype.Service;
27 27
 
28
+import javax.servlet.http.HttpServletResponse;
29
+import java.io.IOException;
28 30
 import java.time.LocalDateTime;
29 31
 import java.util.List;
30 32
 
@@ -152,13 +154,13 @@ public class TaQrcodeServiceImpl extends ServiceImpl<TaQrcodeMapper, TaQrcode> i
152 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 160
         JSONObject resultObj = new JSONObject();
159 161
         resultObj.put("visitPersons", visitPersons);
160 162
         resultObj.put("visitNum", visitNum);
161
-//        resultObj.put("newPersons", newPersons);
163
+        resultObj.put("newPersons", newPersons);
162 164
         resultObj.put("qrCodeInfo", taQrcode);
163 165
         responseBean.addSuccess(resultObj);
164 166
         return responseBean;
@@ -186,19 +188,24 @@ public class TaQrcodeServiceImpl extends ServiceImpl<TaQrcodeMapper, TaQrcode> i
186 188
     }
187 189
 
188 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 194
         switch (type) {
191 195
             case 1:
192 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 199
                 break;
195 200
             case 2:
196 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 204
                 break;
199 205
             case 3:
200 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 209
                 break;
203 210
             default:
204 211
                 break;

+ 93
- 31
src/main/resources/log/logback-spring.xml Näytä tiedosto

@@ -2,58 +2,120 @@
2 2
 <configuration debug="false">
3 3
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
4 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 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 23
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
24
+            <charset>UTF-8</charset>
10 25
         </encoder>
11
-    </appender>
12
-    <!-- 按照每天生成日志文件 -->
13
-    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
26
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
14 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 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 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 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 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 76
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
77
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
41 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 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 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 108
     <logger name="com.huiju.estateagents.mapper" level="DEBUG" additivity="false">
50 109
         <appender-ref ref="MYSQL" />
51 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 118
     </root>
119
+
120
+
59 121
 </configuration>

+ 33
- 4
src/main/resources/mapper/TaQrcodeMapper.xml Näytä tiedosto

@@ -51,7 +51,13 @@
51 51
     </select>
52 52
 
53 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 61
     </select>
56 62
 
57 63
     <select id="getVisitPersonsRecord" resultType="com.huiju.estateagents.entity.TaPersonVisitRecord">
@@ -122,12 +128,35 @@
122 128
             AND t.qrcode_id = #{qrCodeId}
123 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 145
     </select>
128 146
 
129 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 160
     </select>
132 161
 
133 162
 </mapper>