Commit 8b66b21f authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents a17b6cb5 9bcfc757
......@@ -9,7 +9,7 @@
color:#1BBC9B;
}
.edit{
color:#03d76f;
color:#03d76f !important;
}
.clofff{
color:#fff;
......
<template>
<div class="business flex flexc">
<a-tabs :activeKey="active" @change="changeRouter">
<a-tab-pane key="/business/businessmanage" tab="业务管理">
<!-- <BusinessTabs2 v-if="active === 1" ref="BusinessTabs2" /> -->
</a-tab-pane>
<a-tab-pane key="/business/businessmanage" tab="业务管理"> </a-tab-pane>
<a-tab-pane key="/business/mattermanage" tab="事项管理">
<!-- <BusinessTabs1 v-if="active === 2" ref="BusinessTabs1" /> -->
</a-tab-pane>
<a-tab-pane key="/business/mattermanage" tab="事项管理"> </a-tab-pane>
<a-tab-pane key="/business/businessinmanage" tab="业务事项关联">
<!-- <BusinessTabs3 v-if="active === 3" ref="BusinessTabs3" /> -->
</a-tab-pane>
<a-tab-pane key="/business/workguide" tab="办事指南数据管理">
</a-tab-pane>
</a-tabs>
<div class="business-out-box flex1">
......@@ -20,21 +17,12 @@
</template>
<script>
// import BusinessTabs1 from "./components/businessTabs1.vue";
// import BusinessTabs2 from "./components/businessTabs2.vue";
// import BusinessTabs3 from "./components/businessTabs3.vue";
export default {
components: {
// BusinessTabs1,
// BusinessTabs2,
// BusinessTabs3,
},
components: {},
data() {
return {
siteId: "", // 站点id
// active: 1,
};
},
computed: {
......@@ -60,15 +48,7 @@ export default {
/deep/.ant-tabs-nav-container {
border-bottom: 1px solid rgb(224, 224, 224) !important;
}
&::after {
content: "";
width: 1px;
height: 82vh;
position: absolute;
background-color: #eeeeee;
top: 44px;
left: 50%;
}
.business-out-box {
overflow-y: auto;
}
......
......@@ -354,17 +354,18 @@ export default {
onSelectLeftRow(record, selected) {
if (selected && record.children && record.children.length) {
record.children.forEach((v) => {
this.selectedLeftRowKeys= [...new Set([...this.selectedLeftRowKeys,v.id])]
this.deleteData=[...new Set([...this.deleteData,v])];
this.selectedLeftRowKeys = [
...new Set([...this.selectedLeftRowKeys, v.id]),
];
this.deleteData = [...new Set([...this.deleteData, v])];
});
} else if (!selected) {
this.selectedLeftRowKeys = this.selectedLeftRowKeys.filter(
(v) => v != record.id
);
this.deleteData = this.deleteData.filter((v) => {
return v.id !=record.id
return v.id != record.id;
});
}
},
// 批量删除
......@@ -525,6 +526,15 @@ export default {
width: 100%;
height: 100%;
display: flex;
&::after {
content: "";
width: 1px;
height: 82vh;
position: absolute;
background-color: #eeeeee;
top: 44px;
left: 50%;
}
.left,
.right {
width: 50%;
......
......@@ -586,6 +586,15 @@ export default {
.basicset-tab2 {
width: 100%;
display: flex;
&::after {
content: "";
width: 1px;
height: 82vh;
position: absolute;
background-color: #eeeeee;
top: 44px;
left: 50%;
}
.left,
.right {
width: 50%;
......
......@@ -666,6 +666,15 @@ export default {
.basicset-tab3 {
width: 100%;
display: flex;
&::after {
content: "";
width: 1px;
height: 82vh;
position: absolute;
background-color: #eeeeee;
top: 44px;
left: 50%;
}
.left,
.right {
width: 50%;
......
rrent" <template>
<div class="basicset-tab4">
<div class="left">
<div class="header">
<h3 class="titel">站点事项列表</h3>
<div class="header-bottom flex aic jcb">
<div class="left-btn"></div>
<div>
<a-space>
<a-select
style="min-width: 120px"
allowClear
v-model="dept"
class="select-department"
placeholder="部门搜索"
>
<a-select-option
v-for="v in deptList"
:key="v.id"
:value="v.deptNumber"
>
{{ v.name }}
</a-select-option>
</a-select>
<a-select
style="width: 120px"
allowClear
v-model="source"
class="select-department"
placeholder="事项来源"
>
<a-select-option :value="0"> 一体化添加 </a-select-option>
<a-select-option :value="1"> 手动添加 </a-select-option>
</a-select>
<a-input-search
v-model="searchVal"
placeholder="请输入事项名称搜索"
enter-button="搜索"
@search="onSearch"
allowClear
/>
</a-space>
</div>
</div>
</div>
<div class="table-content">
<!-- 表格 -->
<a-table
bordered
size="middle"
:loading="loading"
:pagination="{
showTotal: (total) => `共 ${total} 条`,
current: current,
total: total,
pageSize: size,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: pageSizeOptions,
onChange: changePage,
onShowSizeChange: showSizeChange,
}"
:scroll="{ y: 550 }"
:columns="columns"
:data-source="matterSiteData"
:rowKey="(record) => record.id"
>
<template slot="index" slot-scope="text, record, index">
<span>
{{ (current - 1) * size + index + 1 }}
</span>
</template>
<!-- 部门 -->
<template slot="deptName" slot-scope="text">
{{ text.deptName ? text.deptName : "--" }}
</template>
<!-- 事项名称 -->
<template slot="matterName" slot-scope="text">
<a-tooltip placement="topLeft">
<template slot="title">
{{ text.matterName }}
</template>
<div class="matter-name">{{ text.matterName }}</div>
</a-tooltip>
</template>
<!-- 事项来源 -->
<template slot="source" slot-scope="text">
<a-tag v-if="text.source == 0" color="green"> 一体化添加 </a-tag>
<a-tag v-else color="blue"> 手动添加 </a-tag>
</template>
<!-- 操作 -->
<template slot="action" slot-scope="text">
<a-space size="middle">
<div
class="workguide_btn"
:style="{ color: text.hot == 1 ? '#03d76f' : '#1890FF' }"
@click="handleSiteEdit(text, 'hot')"
>
{{ text.hot == 1 ? "取消热门" : "设置热门" }}
</div>
<div
class="workguide_btn"
style="width: 60px"
@click="handleSiteEdit(text, 'display')"
>
{{ text.display == 1 ? "取消展示" : "展示" }}
</div>
</a-space>
</template>
</a-table>
</div>
</div>
</div>
</template>
<script>
import { getSiteMatterList, addSitematter } from "@/services/matter";
import { getDeptList } from "@/services/dept";
import local from "@/utils/local";
const columns = [
{
title: "序号",
width: "50px",
scopedSlots: { customRender: "index" },
},
{
title: "部门",
width: "20%",
scopedSlots: {
customRender: "deptName",
},
},
{
title: "事项名称",
// ellipsis: true,
align: "left",
scopedSlots: {
customRender: "matterName",
},
},
{
title: "事项来源",
scopedSlots: {
customRender: "source",
},
},
{
title: "操作",
width: "200px",
scopedSlots: {
customRender: "action",
},
},
];
export default {
components: {},
data() {
return {
columns,
loading: false,
source: undefined, // 左边来源
selectedRowKeys: [],
matterSiteData: [], // 站点事项
matterDataList: [], //事项列表数据
current: 1,
total: 0,
size: 10,
pageSizeOptions: ["10", "30", "50", "100"],
siteId: local.getLocal("siteId"), // 站点id
deptList: [], // 站点部门
searchVal: "", // 站点事项搜索
dept: undefined, // 部门搜索
};
},
created() {
this.getDeptListData();
this.getMatterSiteData();
},
methods: {
// 获取部门列表
async getDeptListData(obj = {}) {
this.deptLoading = true;
let res = await getDeptList({
siteId: this.siteId,
page: 1,
size: -1,
...obj,
});
this.deptLoading = false;
let { code, data } = res.data;
if (code === 1) {
this.deptList = data.data;
}
},
// 获取站点事项
async getMatterSiteData(search = {}) {
this.loading = true;
let res = await getSiteMatterList({
page: this.current,
size: this.size,
siteId: this.siteId,
source: this.source,
matterName: `%${this.searchVal}%`,
deptCode: this.dept,
...search,
});
let { pageInfo, data } = res.data.data;
this.total = pageInfo.totalResult;
this.matterSiteData = data;
this.loading = false;
},
// 搜索
onSearch() {
this.current = 1;
this.getMatterSiteData();
},
// 左翻页
changePage(num) {
this.current = num;
this.getMatterSiteData();
},
// 左边改变每页显示数量
showSizeChange(current, size) {
this.current = current;
this.size = size;
this.getMatterSiteData();
},
// 设置热门、展示
async handleSiteEdit(row, type) {
let hot;
let display;
if (type === "hot") {
if (row.hot == 1) {
hot = 0;
} else {
hot = 1;
}
} else {
if (row.display == 1) {
display = 0;
} else {
display = 1;
}
}
let obj = {
id: row.id,
};
if (hot != "undefined") obj.hot = hot;
if (display != "undefined") obj.display = display;
let res = await addSitematter(obj);
if (res.data.code == 1) {
this.$message.success("设置成功");
this.getMatterSiteData();
this.$forceUpdate();
}
},
},
};
</script>
<style lang="less" scoped>
/deep/.business {
&::after {
content: "";
width: 1px;
height: 82vh;
position: absolute;
background-color: red;
top: 44px;
left: 50%;
}
}
.basicset-tab4 {
width: 100%;
height: 100%;
padding: 0px 20px;
.header {
margin-bottom: 15px;
}
.workguide_btn {
cursor: pointer;
width: 60px;
color: #1890ff;
}
.matter-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
</style>
......@@ -76,6 +76,7 @@ const options = {
"@/pages/basicset/business/components/businessTabs1"
),
},
// 事项管理
{
path: "mattermanage",
meta: {
......@@ -86,6 +87,7 @@ const options = {
"@/pages/basicset/business/components/businessTabs2"
),
},
// 业务事项关联
{
path: "businessinmanage",
meta: {
......@@ -96,6 +98,17 @@ const options = {
"@/pages/basicset/business/components/businessTabs3"
),
},
// 办事指南事项管理
{
path: "workguide",
meta: {
invisible: true,
},
component: () =>
import(
"@/pages/basicset/business/components/businessTabs4"
),
},
],
},
{
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,6 +11,7 @@
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@jiaminghi/data-view": "^2.10.0",
"ant-design-vue": "^1.7.8",
"axios": "^0.27.2",
"babel-polyfill": "^6.26.0",
......
import http from "../request/http";
let baseURL = process.env.VUE_APP_API_BASE_URL;
let BASEURL = process.env.VUE_APP_API_PHP_URL;
/* 使用行为分析 */
//事件分析
export function getEventCensus(params) {
return http.post(`${baseURL}/zwfw/act/analyse/pageEventCensus`, params);
}
//产品热力图
export function getProductHotCensus(params) {
return http.post(`${baseURL}/zwfw/act/analyse/productHotCensus`, params);
}
//页面访问分析
export function getAccessAnalyse(params) {
return http.post(`${baseURL}/zwfw/act/analyse/accessAnalyse`, params);
}
//路径分析
export function getWayAccessAnalyse(params) {
return http.post(`${baseURL}/zwfw/act/analyse/wayAccessAnalyse`, params);
}
\ No newline at end of file
......@@ -66,6 +66,10 @@ export function getWLLZCount(params) {
export function getWLLZInfo(params) {
return http.get(`${BASEURL}/wllz/index/complainInfo`, params);
}
// 12345报表
export function getSys12345(params) {
return http.get(`${BASEURL}/wllz/complainapi/sys12345`, params);
}
// 样表列表
export function getBillList(params) {
......@@ -137,3 +141,47 @@ export function getOtherList(params) {
export function getRigusersList(params) {
return http.get(`${BASEURL}/admin/reportforms/rigusers`, params);
}
/**
* 服务类型数据分析
*/
// 预约趋势
export function getTrend(params) {
return http.get(`${BASEURL}/admin/order/getTrend`, params);
}
// 预约热度排名
export function getOrderRanking(params) {
return http.get(`${BASEURL}/admin/order/getOrderRanking`, params);
}
// 预约人群画像-地域分布
export function getStatisticArea(params) {
return http.get(`${BASEURL}/admin/statistic/area`, params);
}
// 预约人群画像-年龄分布
export function getStatisticAges(params) {
return http.get(`${BASEURL}/admin/statistic/ages`, params);
}
// 预约人群画像-签到准确率
export function getStatisticSignin(params) {
return http.get(`${BASEURL}/admin/statistic/signin`, params);
}
// 预约人群画像-性别分布
export function getStatisticSexual(params) {
return http.get(`${BASEURL}/admin/statistic/sexual`, params);
}
/**
* 办不成事报表
*/
// 办不成事列表
export function getImpossible(params) {
return http.get(`${BASEURL}/admin/impossible/index`, params);
}
// 统计办不成事和已回复
export function getCountImpossible(params) {
return http.get(`${BASEURL}/admin/impossible/countImpossible`, params);
}
// 办不成事详情
export function getImpossibleInfo(params) {
return http.get(`${BASEURL}/admin/impossible/impossibleInfo`, params);
}
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" pointer-events="none" class="leaflet-zoom-animated" width="1024" height="689"
viewBox="240 120 400 300">
<g>
<path class="leaflet-interactive" stroke="#201920" stroke-opacity="1" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" fill="none"
d="M255 257L253 253L256 250L255 249L259 245L261 245L261 243L262 244L265 242L266 245L270 245L273 239L278 240L278 238L279 239L285 234L292 231L292 224L295 223L292 211L289 210L294 207L295 208L299 206L305 206L303 202L308 190L313 193L322 192L322 182L329 178L329 174L335 174L334 177L336 177L336 179L338 181L339 180L340 183L347 185L350 188L353 195L351 205L354 208L355 207L360 209L368 209L375 215L378 214L377 215L383 227L409 227L425 234L429 233L430 235L445 229L457 229L462 227L472 218L469 215L470 210L472 208L481 211L488 205L491 206L494 204L498 198L502 198L508 194L512 194L511 195L512 194L514 196L517 195L516 190L510 184L507 183L503 187L501 185L497 185L495 187L492 183L494 182L499 168L505 171L509 167L514 166L514 160L518 152L522 148L522 144L518 142L523 136L524 137L531 134L539 134L545 138L548 137L552 141L554 145L553 146L555 148L554 149L557 154L556 155L560 161L559 164L561 164L560 167L562 170L567 170L575 176L577 176L579 180L578 183L581 187L585 187L597 181L603 180L601 182L601 188L598 189L599 191L597 199L594 202L592 208L591 209L585 206L581 210L581 225L579 225L577 227L578 228L574 224L573 229L571 229L568 232L564 232L565 235L563 237L558 236L559 235L556 234L555 237L550 242L548 242L549 243L548 242L543 246M283 304L281 300L282 299L284 301L286 299L286 297L283 294L283 290L285 288L280 286L280 280L274 280L271 277L269 277L267 275L267 271L259 269L259 267L261 268M443 368L441 366L442 363L437 362L434 359L426 365L424 363L421 365L419 363L417 363L417 365L413 365L413 373L411 373L410 369L406 371L404 367L400 367L399 366L401 362L398 361L396 357L396 355L398 355L390 355L391 348L395 344L397 344L397 334L395 332L394 333L393 328L390 327L387 332L383 328L379 328L367 337L359 337L358 333L356 333L355 330L352 331L353 330L344 329L342 335L340 333L341 330L330 331L328 329L325 330L326 329L324 331L323 328L319 328L320 326L315 325L313 321L310 322L300 314L298 314L297 317L288 310L284 310L283 304M449 370L443 368M451 462L451 456M457 403L460 409M463 426L461 432M471 477L477 475M492 455L496 450M509 434L512 427M512 404L512 411M518 386L515 392M529 370L524 375M532 359L534 351"
id="国界" />
<path class="leaflet-interactive" stroke="#201920" stroke-opacity="1" stroke-width="2" stroke-linecap="butt"
stroke-linejoin="round" stroke-dasharray="4,4" stroke-dashoffset="4" fill="none"
d="M261 268L263 266L261 264L261 258L255 257" id="争议" />
<path class="leaflet-interactive" stroke="gray" stroke-opacity="1" stroke-width="1" stroke-linecap="round"
stroke-linejoin="round" stroke-dasharray="8,4,4,4" fill="none"
d="M481 366L481 366M485 364L483 366L485 367L485 364" id="港澳" />
<path class="leaflet-interactive" stroke="#4190da" stroke-opacity="1" stroke-width="1" stroke-linecap="round"
stroke-linejoin="round" fill="none"
d="M484 365L482 363L482 365L479 368L478 367L478 369L472 369L470 371L462 373L464 377L462 379L460 379L459 370L449 370M463 373L463 373M463 373L464 374L462 374L463 373M481 366L481 366M484 365L484 365M484 365L484 365M484 365L484 365M517 338L515 342L515 346L517 346L513 346L514 347L512 347L512 349L509 352L507 352L507 354L503 358L501 358L496 363L493 362L493 364L488 363L486 364L487 365L485 365L486 366L484 365M517 338L517 338M528 323L527 322L527 328L525 330L524 329L524 331L521 333L522 334L517 338M526 271L523 272L521 276L518 275L519 276L513 284L520 289L523 296L523 300L525 300L526 303L528 303L529 306L523 305L525 307M525 307L528 308L530 313L524 313L529 318L529 322M526 271L526 271M526 271L526 271M531 252L524 257L524 255L527 254L525 250L530 245L528 241L524 241L521 244L521 246L515 248L514 251L511 254L512 253L509 254L510 255L506 253L504 257L504 259L506 259L509 262L512 261L514 263L512 265L513 268L517 268L517 266L521 263L523 263L526 266L529 265L533 267L532 270L529 269L526 271M526 271L527 270L526 271M528 323L528 323M528 323L528 323M528 323L528 323M529 322L528 323M529 322L529 322M530 317L530 317M530 317L530 317M530 317L530 317M531 317L530 317M530 317L529 316L531 317M531 317L531 317M531 315L531 315M531 315L531 315M531 252L531 252M543 246L540 249L536 249L531 252M532 312L532 312M532 312L532 312M533 312L533 312M454 370L454 370M456 374L456 374M458 380L458 380M458 454L461 453L458 454M458 391L453 388L453 384L457 380L458 381L464 379L467 381L464 387L458 391M460 451L460 451M463 376L463 376M463 373L463 373M463 451L464 452L463 451M463 450L464 449L463 450M464 373L464 373M464 378L464 378M464 450L464 450M464 374L464 374M468 405L468 405M469 397L469 397M469 447L469 447M469 401L469 401M469 443L469 443M470 453L470 453M470 451L470 451M470 401L470 401M470 401L470 401M470 451L470 451M470 402L470 402M470 446L471 447L470 446M470 400L470 400M470 452L470 452M470 400L470 400M471 403L470 402L471 403M471 401L471 401M471 403L471 403M472 450L472 450M472 402L472 402M472 474L472 474M473 446L474 445L473 446M473 445L473 445M473 474L473 474M473 399L473 399M473 406L474 405L473 406M473 398L473 398M474 445L474 445M474 474L474 474M474 445L474 445M474 464L474 464M474 398L474 398M474 399L474 399M474 402L474 402M475 370L475 370M475 463L475 463M475 404L476 403L475 404M475 401L475 401M475 441L475 441M475 464L475 464M475 463L475 463M475 445L476 446L475 445M475 462L475 462M475 467L475 467M475 370L475 370M475 464L476 465L475 464M476 465L476 465M476 401L476 401M476 467L476 467M476 369L475 370L476 369M476 402L476 402M476 400L476 400M477 370L476 369L477 370M477 445L477 445M477 370L477 370M477 399L477 399M477 451L477 451M477 441L477 441M477 441L477 441M477 468L478 467L477 468M478 448L478 448M478 383L478 383M478 441L478 441M478 369L478 369M479 368L479 368M479 369L479 369M479 368L479 368M479 460L479 460M479 450L479 450M479 450L480 449L479 450M481 367L481 367M481 437L481 437M481 456L481 456M481 445L482 444L481 445M482 443L482 443M482 368L482 368M482 406L482 406M482 368L482 368M482 368L482 368M482 368L482 368M482 452L483 453L482 452M482 454L482 454M483 365L483 365M483 367L483 367M483 385L483 385M483 366L483 366M483 439L483 439M483 407L483 407M483 406L483 406M483 450L483 450M483 453L487 451L483 453M483 445L483 445M483 405L483 405M483 445L484 446L483 445M483 445L484 446L483 445M483 407L483 407M484 439L484 439M484 434L484 434M484 450L484 450M484 404L484 404M484 366L484 366M484 368L484 368M484 442L485 443L484 442M485 366L485 366M485 368L485 368M485 446L485 446M485 404L485 404M485 368L485 368M485 407L485 407M485 437L485 437M485 440L485 440M485 367L485 367M485 406L485 406M485 440L485 440M485 431L485 431M485 364L485 364M485 433L485 433M485 366L485 366M486 438L486 438M486 435L486 435M486 430L486 430M486 404L487 403L486 404M486 439L486 439M486 406L486 406M486 440L486 440M486 434L486 434M486 435L487 434L486 435M486 439L486 439M486 450L487 449L486 450M487 439L487 439M487 439L487 439M487 431L487 431M487 439L487 439M487 445L487 445M487 406L487 406M487 439L487 439M487 431L487 431M487 365L487 365M487 453L487 453M487 449L487 449M487 437L487 437M487 430L488 431L487 430M488 433L488 433M488 403L488 403M488 440L487 441L488 440M488 449L488 449M488 432L488 432M488 404L488 404M488 434L488 434M488 455L488 455M488 450L489 451L488 450M489 434L489 434M489 404L489 404M489 453L489 453M489 433L489 433M490 448L491 449L490 448M491 447L491 447M491 438L491 438M491 416L491 416M492 442L492 442M492 439L492 439M492 448L492 448M493 436L493 436M493 436L493 436M493 436L493 436M494 436L494 436M494 436L494 436M494 440L494 440M494 434L494 434M494 374L494 374M495 373L495 373M495 443L495 443M495 438L495 438M496 441L496 441M496 445L496 445M497 440L497 440M498 444L498 444M498 440L498 440M498 437L498 437M498 440L498 440M499 436L499 436M499 402L499 402M499 430L499 430M499 376L499 376M499 444L499 444M499 375L500 376L499 375M500 436L500 436M501 359L501 359M502 435L502 435M502 435L502 435M502 437L502 437M502 435L502 435M502 433L502 433M503 438L503 438M503 433L503 433M504 435L504 435M505 433L505 433M505 409L505 409M505 434L505 434M507 353L507 353M507 353L507 353M508 353L508 353M509 352L508 353L509 352M510 254L510 254M511 254L511 254M511 254L511 254M514 360L514 360M515 348L515 348M515 359L515 359M515 358L515 358M515 357L515 357M515 345L515 345M516 342L516 342M516 358L516 358M516 345L516 345M516 345L516 345M516 339L516 339M516 347L516 347M516 347L516 347M516 339L516 339M517 345L517 345M517 342L517 342M517 343L517 343M518 359L518 359M518 341L518 341M518 340L518 340M518 339L518 339M518 339L518 339M518 338L518 338M519 278L519 278M519 337L519 337M520 366L520 366M520 337L520 337M520 264L520 264M520 340L520 340M521 262L521 262M522 368L519 364L518 357L523 351L523 349L527 347L529 349L525 363L522 368M522 262L522 262M522 262L522 262M522 261L522 261M522 244L522 244M522 260L522 260M523 259L523 259M523 259L523 259M523 273L523 273M524 330L524 330M524 334L524 334M524 330L524 330M524 330L524 330M526 305L529 307L527 307L526 305M526 300L526 300M526 363L526 363M526 367L527 368L526 367M527 368L527 368M527 307L527 307M527 323L527 323M528 325L528 325M528 308L527 307L528 308M528 308L530 308L528 308M528 317L528 317M528 325L528 325M528 325L528 325M528 327L528 327M528 316L529 317L528 316M528 309L528 309M528 327L528 327M529 346L529 346M529 350L529 350M529 316L529 316M529 309L529 309M529 315L529 315M529 322L529 322M529 319L529 319M529 317L529 317M529 316L529 316M529 313L529 313M530 317L530 317M530 317L530 317M530 317L530 317M530 317L530 317M530 316L530 316M530 315L530 315M530 315L530 315M530 321L530 321M530 319L529 318L530 319M530 319L530 319M530 317L530 317M531 318L531 318M531 318L531 318M531 319L530 318L531 319M531 317L532 318L531 317M531 253L531 253M531 317L531 317M531 314L531 314M532 314L532 314M532 253L532 253M532 253L532 253M532 313L532 313M533 253L533 253M533 316L533 316M533 255L533 255M533 312L533 312M534 312L534 312M535 251L535 251M535 252L535 252M536 255L536 255M537 344L538 345L536 345L537 344M538 344L538 344M538 343L539 344L538 343M538 345L538 345M538 344L538 344M538 345L538 345M539 249L539 249M543 343L544 344L543 343"
id="海洋" />
<path class="leaflet-interactive" stroke="#747569" stroke-opacity="0.6" stroke-width="1" stroke-linecap="round"
stroke-linejoin="round" fill="none"
d="M345 276L343 274L332 273L326 275L322 279L319 278L314 281L307 280L307 278L299 282L293 280L290 283L290 285L288 287L284 287L285 288M391 300L389 300L389 302L386 303L387 304L385 304L385 306L383 304L383 306L380 306L378 302L377 303L377 301L373 299L369 301L358 298L356 296L350 296L346 292L347 291L345 291L345 276M361 254L348 258L348 260L350 260L350 264L354 267L354 269L351 270L351 272L353 272L353 276L347 274L347 276L345 276M414 293L413 294L413 292L412 293L408 289L416 289L417 288L415 284L417 280L420 279L419 280L421 276L418 269L419 268L415 264L410 263L405 258L405 260L402 259L397 254L393 256L388 253L386 255L387 258L385 258L385 260L382 261L380 259L374 259L372 256L370 257L364 253L361 254M383 227L381 229L382 233L380 233L377 236L377 234L375 234L368 242L364 243L360 253L361 254M428 266L423 263L423 259L428 255L426 251L421 254L416 253L416 255L412 257L409 254L409 252L401 248L405 245L404 241L402 240L397 243L394 243L394 240L390 237L392 235L388 226M399 322L398 312L396 309L397 308L395 306L394 301L391 300M414 293L413 296L410 295L411 298L409 300L405 300L404 297L402 299L399 296L397 296L395 290L392 289L389 292L391 294L389 298L391 300M393 329L397 328L396 325L398 325L399 322M434 332L433 329L429 331L428 326L426 326L426 328L423 329L424 332L420 334L421 341L418 340L414 342L408 330L406 332L404 330L405 329L403 325L401 325L400 328L399 327L399 322M435 298L433 300L430 299L428 297L428 293L424 291L423 292L421 288L419 288L419 290L416 291L418 293L415 296L414 293M447 263L441 259L444 254L442 252L437 256L436 264L428 266M428 266L430 266L430 268L431 267L434 270L434 278L435 277L440 282L440 278L443 277L443 275L440 272L442 270L441 269L445 268M434 332L434 334L429 333L424 336L425 339L430 340L428 344L431 347L430 351M430 351L430 353L431 352L434 355L435 354L439 356L439 358L435 360M458 343L455 344L455 346L454 345L449 348L447 348L444 345L444 347L438 351L435 349L430 351M440 327L438 325L436 327L440 330L438 332L434 332M445 268L445 270L453 274L453 280L449 282L448 281L447 284L442 283L440 287L442 287L440 291L441 292L438 293L438 297L435 298M452 302L449 303L446 300L445 301L443 299L440 300L438 298L435 298M457 327L455 329L451 325L451 323L448 324L448 322L446 322L446 324L444 324L441 327L441 325L440 327M440 327L440 325L434 321L434 319L437 318L435 316L437 314L439 316L442 315L442 317L444 316L447 313L446 312L450 310L452 302M445 268L447 263M467 252L467 250L464 253L462 251L462 253L460 253L459 256L455 259L456 262L454 262L454 264L451 265L447 263M452 302L458 306M458 306L461 307L462 310L457 314L454 313L451 318L453 318L455 320L454 321L456 321L456 323M456 323L457 327M483 323L481 319L478 321L477 318L475 320L471 317L470 318L466 316L463 319L460 318L456 323M458 343L457 335L454 336L458 332L457 327M472 351L470 351L469 348L467 350L466 349L469 344L468 341L466 341L467 340L462 343L458 343M466 295L458 295L460 297L459 298L462 299L458 301L458 306M460 371L459 371M460 371L459 370L469 362L469 358L472 355L472 351M460 379L461 379M461 379L463 379M463 286L463 270L465 266L464 261L467 256L467 252M463 286L464 290L467 293L466 295M463 286L472 283L472 281L477 282L481 280L482 274M463 378L464 378M491 308L484 305L482 301L472 301L466 295M467 296L467 296M484 242L481 245L475 245L472 248L472 250L467 252M472 351L473 348L477 350L479 346L483 346M492 275L489 276L482 274M482 274L481 271L484 264L481 257L484 254L486 254L487 251L486 248L483 247L486 245L484 242M496 318L492 318L488 320L489 321L485 321L483 323M483 346L485 342L483 342L483 334L481 334L481 332L485 328L483 323M483 346L488 347L484 351L485 352L489 352L491 350L493 352L494 349M513 237L512 238L507 235L508 232L505 227L501 229L499 233L493 233L490 236L487 231L483 237L484 242M496 286L496 288L498 288L499 291L496 292L492 290L493 293L491 293L489 297L490 300L494 300L495 303L491 308M496 318L494 314L495 311L491 308M506 260L503 263L499 263L496 267L495 266L495 268L491 272L492 275M496 286L492 286L492 284L488 282L495 276L491 278L492 275M494 349L496 343L499 340L498 337L502 335L501 332L509 328M502 358L500 356L500 352L494 349M507 321L502 318L500 320L498 316L498 318L496 318M497 286L496 286M514 283L513 282L507 288L506 285L502 287L500 283L497 284L497 286M516 309L512 309L508 303L511 300L512 301L513 298L512 297L508 299L507 295L506 296L507 293L497 286M503 246L503 242L501 242L498 239L498 241L497 240L498 241L496 241L496 243L493 244L494 245L492 249L494 251L500 250M504 257L501 258L499 256L500 250M500 250L500 250M500 250L502 250L502 247M502 247L499 248L500 250M502 358L502 359M503 246L502 247M503 359L503 360M503 246L505 248L503 248L505 251L506 250L506 253M507 321L511 319L511 315L513 315L514 312L515 313L516 309M507 321L506 322L509 325L509 328M520 336L520 334L516 334L516 332L514 334L511 333L511 329L509 328M513 237L513 231L515 229L518 234L526 228L527 229L529 227L536 226L539 222M517 247L515 243L511 241L513 237M523 310L521 312L516 309M522 336L522 336M522 259L524 259M529 306L524 305L525 306L523 310M525 312L523 312L523 310M525 312L526 312M537 193L535 195L531 189L534 186L536 186L536 184L538 184L542 179L542 181L544 181L543 180L545 174L548 173L547 168L551 162L552 157L548 152L546 152L547 153L544 155L536 155L533 151L534 146L530 144L528 146L525 143L528 138L526 136M527 312L527 312M528 312L529 312M529 312L530 311M531 311L532 311M533 311L533 311M582 221L577 220L577 216L569 220L566 217L566 213L564 213L563 216L560 213L561 212L557 210L558 209L556 207L553 208L550 205L542 205L540 202L540 198L536 199M536 199L535 196L538 195L537 193M536 199L533 202L534 203L532 201L527 202L530 205L530 213L532 215L536 213L535 214L539 222M537 193L536 192L537 193M537 193L537 193M537 193L537 193M539 222L540 221L543 224L543 226L545 224L549 232L548 235L550 237L550 241M437 280L437 280M458 338L458 338M477 318L477 318"
id="省界" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M503 243L504 242L500 242L499 239L497 241L498 242L493 244L494 245L492 249L494 251L498 251L500 249L499 248L503 246L503 243z"
id="北京市" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M505 252L506 251L503 248L505 248L503 246L501 248L502 249L499 251L499 257L504 258L504 256L506 255L505 252zM505 252L505 252z"
id="天津市" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M503 242L502 245L505 248L503 248L508 255L510 255L509 254L511 254L517 247L515 243L511 241L513 237L512 238L507 235L508 232L505 227L501 229L499 233L493 233L490 236L487 231L485 233L483 239L485 245L487 245L484 247L483 246L486 249L486 251L487 250L486 253L482 255L483 256L481 260L484 263L484 265L482 271L480 271L483 274L491 276L491 272L495 267L506 260L504 258L499 257L500 250L492 250L492 248L495 245L494 244L498 242L497 241L499 239L500 242L503 242zM502 247L499 248L501 250L502 247zM505 252L505 252zM511 254L511 254z"
id="河北省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M463 286L472 283L472 281L476 282L481 279L481 271L484 266L481 258L483 256L482 255L485 254L487 250L486 251L486 249L483 246L484 247L486 245L485 242L483 244L482 243L481 245L475 245L472 248L472 250L470 250L466 255L467 256L464 261L464 279L462 286z"
id="山西省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M388 226L392 235L390 236L394 243L397 243L398 241L399 242L402 240L404 241L405 245L402 248L409 252L411 256L415 257L416 255L414 254L420 254L426 251L427 252L428 254L423 259L423 263L425 263L427 266L437 263L437 257L442 252L444 254L441 260L446 261L450 265L452 265L455 262L456 258L462 252L465 253L467 250L467 252L469 252L469 250L471 250L474 245L476 246L482 244L484 242L483 237L487 231L490 236L493 233L498 233L500 229L505 228L507 230L506 231L508 233L508 237L513 238L515 230L518 233L518 235L522 230L532 226L536 226L539 223L536 220L538 220L537 215L535 213L532 215L530 213L530 206L529 203L527 203L528 200L530 202L534 202L536 198L535 195L536 196L538 194L536 192L537 193L535 195L531 189L534 186L536 186L536 184L538 184L542 179L542 181L544 181L543 180L545 174L548 173L547 168L551 162L552 157L548 152L546 152L547 153L544 155L536 155L533 151L534 146L530 144L528 146L525 143L528 138L524 136L518 141L518 143L522 143L522 149L518 151L517 156L513 162L514 165L505 171L499 168L495 176L494 182L492 183L495 187L497 185L501 185L503 187L505 184L509 184L516 190L517 194L515 196L511 194L503 196L503 198L500 197L495 204L491 206L488 205L481 211L475 208L471 209L469 213L472 218L470 221L468 221L458 229L445 229L430 235L430 233L427 234L416 231L414 228L398 228L388 226z"
id="内蒙古自治区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M538 249L542 248L546 243L550 241L550 237L548 235L548 231L545 224L543 226L543 224L540 221L538 225L537 224L534 227L531 226L528 229L527 228L522 230L518 234L515 229L513 231L514 236L511 241L515 243L517 247L519 247L522 244L522 242L524 242L523 241L530 242L529 247L526 248L525 251L527 253L524 256L529 255L528 254L529 255L532 251L538 249zM533 253L532 252L533 253zM531 253L531 253zM533 253L533 253zM533 254L533 254zM535 251L535 251zM532 253L532 253zM522 244L522 244zM535 252L535 251zM536 255L536 254zM539 249L539 249z"
id="辽宁省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M572 229L574 225L576 225L578 229L577 226L579 226L582 222L579 221L576 216L568 220L565 213L564 216L562 216L560 213L561 212L559 212L556 207L553 208L546 204L543 205L540 202L541 200L539 198L536 199L533 202L534 203L532 201L528 201L527 203L529 203L531 215L535 213L538 218L538 220L536 220L543 224L543 226L545 224L548 231L548 235L550 237L550 241L552 241L556 234L558 234L558 236L564 237L565 236L563 232L569 232L570 229L572 229z"
id="吉林省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M538 199L539 198L541 200L541 204L546 204L552 208L555 207L558 209L557 210L561 212L560 213L563 216L563 214L566 213L568 220L576 216L577 219L581 221L582 216L580 210L586 206L591 209L592 208L594 202L597 199L599 191L598 190L602 186L600 184L604 180L600 180L588 186L581 187L578 183L579 180L577 176L575 176L571 171L570 172L568 170L565 171L561 169L561 165L559 163L560 162L557 157L557 153L555 151L555 147L552 141L548 137L545 138L540 134L531 134L527 136L528 139L524 143L527 144L527 146L531 144L533 146L535 155L544 155L547 152L550 154L552 158L547 167L548 172L544 176L544 182L543 183L542 180L531 189L535 195L537 193L536 192L538 194L536 196L535 195L535 197L538 199z"
id="黑龙江省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M523 310L524 312L529 312L529 310L526 307L524 307L523 310zM529 306L524 305L526 307L529 307zM528 308L527 307L528 308zM528 308L530 309L528 308zM527 307L527 307zM529 309L529 309zM528 309L529 309z"
id="上海市" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M502 286L499 283L497 285L507 293L506 296L507 295L509 299L511 299L511 297L513 299L512 301L511 300L509 302L512 309L513 308L521 312L524 309L524 305L529 306L528 303L526 303L526 301L523 300L523 296L520 289L516 287L513 284L513 282L507 288L506 285L504 287L502 286z"
id="江苏省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M509 328L511 328L511 333L514 334L516 332L516 334L520 334L520 336L522 331L524 331L523 330L527 328L527 322L529 322L529 318L523 310L521 312L516 309L515 313L514 312L514 314L511 315L511 319L507 322L509 328zM530 317L531 316L529 316L530 317zM530 316L530 316zM530 319L530 319zM531 312L532 312zM530 315L530 315zM531 315L531 315zM529 322L529 322zM531 318L532 317L531 318zM531 314L531 314zM528 325L528 325zM531 318L531 318zM528 323L528 323zM525 332L525 332zM529 312L530 313L529 312zM528 327L528 327zM530 319L530 319zM532 317L532 317zM532 313L532 313zM528 327L528 327zM529 316L529 316zM531 317L531 317zM528 317L528 317zM524 333L524 333zM529 322L529 322zM529 319L529 319zM529 316L529 316zM529 315L529 315zM530 317L530 317zM531 319L530 319zM524 331L524 331zM533 316L533 316zM531 315L531 315zM531 318L531 318zM533 312L533 312zM524 330L524 330zM524 330L524 330zM532 317L532 317zM534 312L534 312zM530 317L530 317zM529 317L529 317zM524 330L524 330zM532 317L532 317zM530 317L530 317z"
id="浙江省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M498 290L499 291L496 292L494 290L492 291L493 292L491 296L489 296L489 298L492 301L493 300L495 303L491 307L495 311L494 314L496 318L498 318L498 316L500 320L502 317L508 321L511 318L511 316L514 315L516 310L514 308L511 309L511 307L508 304L510 300L513 299L511 297L511 299L509 299L508 296L506 296L507 293L498 286L496 286L498 290zM511 307L511 307zM499 319L499 319zM492 301L492 301z"
id="安徽省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M512 349L511 348L513 348L513 346L517 346L515 346L517 341L516 339L518 339L517 340L520 335L515 332L513 334L511 332L511 328L509 328L501 332L502 335L498 338L498 342L495 345L494 350L498 352L499 351L500 356L502 358L507 354L507 352L510 352L510 350L512 349zM509 352L508 353L509 352zM515 348L515 348zM515 345L515 345zM518 342L517 341zM508 353L508 353zM517 338L517 338zM507 352L507 352zM517 342L517 342zM516 342L515 342zM518 340L518 339zM516 345L516 345zM516 339L517 339zM518 339L518 339zM520 337L519 337zM519 338L519 338zM516 339L516 339z"
id="福建省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M507 321L502 318L500 320L498 316L498 318L492 318L488 320L489 321L485 321L483 323L485 327L481 333L483 335L483 341L485 341L483 346L488 347L484 351L485 352L489 352L491 350L493 352L494 351L496 343L498 342L497 341L501 333L509 328L506 322L507 321z"
id="江西省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M497 286L497 284L500 283L502 287L506 285L507 288L513 282L514 283L519 276L518 275L521 276L523 272L531 270L533 266L527 266L522 263L519 264L516 268L514 268L512 266L514 263L511 261L509 262L507 260L505 260L503 263L499 263L491 272L491 278L495 276L488 282L493 286L497 286zM522 262L522 263zM522 262L522 262zM523 273L523 273zM522 261L522 261zM523 259L523 259zM519 278L519 278zM521 262L521 262zM522 260L522 260zM526 265L526 265zM526 265L526 265zM526 265L526 265zM492 277L492 277z"
id="山东省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M476 301L482 301L484 305L491 308L492 307L495 303L494 300L490 300L489 297L494 290L496 292L499 291L498 288L496 288L496 286L492 286L490 283L488 283L495 276L491 278L492 275L489 276L483 274L479 281L473 281L473 283L463 287L467 294L466 295L470 300L474 302L476 301zM482 302L482 302z"
id="河南省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M467 296L458 295L460 297L459 298L462 299L458 301L458 305L462 309L462 311L460 311L457 314L454 313L452 315L452 319L453 318L455 320L454 321L456 321L456 323L458 319L464 319L465 316L474 320L478 318L477 319L479 321L481 318L482 323L485 321L489 321L488 320L492 318L496 318L494 314L495 311L492 308L484 305L482 301L472 301L467 296zM456 313L456 313zM467 296L467 296zM476 301L476 301zM477 318L477 318z"
id="湖北省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M472 351L473 348L477 350L479 346L483 346L485 342L483 342L484 339L483 334L481 334L481 332L485 328L481 322L481 318L478 321L477 318L475 320L471 317L470 318L464 316L463 319L461 318L457 320L456 325L458 333L456 333L454 336L458 336L457 341L460 344L461 341L461 343L463 343L466 340L468 344L469 343L466 349L467 350L469 348L470 351L472 350zM458 338L458 338z"
id="湖南省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M481 366L482 363L484 365L493 362L496 363L501 358L501 354L499 352L500 351L494 349L493 352L491 350L489 352L485 352L484 351L488 347L487 346L479 346L477 350L473 348L471 354L472 355L469 358L469 362L459 370L460 379L464 377L462 373L465 371L466 372L478 367L479 368L481 366zM501 359L501 359zM477 369L476 370L477 369zM475 370L476 369L475 370zM485 368L485 367zM463 373L464 372L463 373zM475 370L475 370zM464 373L462 374L464 373zM482 368L482 368zM482 368L482 368zM479 369L479 368zM483 365L482 365zM485 368L485 368zM484 368L484 368zM499 375L500 375zM478 369L478 368zM463 376L463 376zM464 374L464 374zM464 378L464 378zM495 373L495 373zM494 374L495 374zM494 363L494 363zM494 363L494 363z"
id="广东省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M458 343L455 344L455 346L454 345L449 348L446 348L445 345L444 348L443 347L439 349L439 351L435 349L429 351L433 353L433 355L439 355L439 357L436 360L438 362L443 363L441 365L442 368L449 371L459 371L461 368L463 368L463 366L465 366L465 364L469 362L469 358L472 355L472 351L470 351L469 348L467 350L466 349L469 344L467 340L462 343L458 343zM433 349L433 350zM456 374L456 374z"
id="广西壮族自治区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M461 380L457 380L453 384L453 388L455 390L458 391L464 388L464 385L467 382L465 379L462 379zM473 474L473 474zM479 450L480 449zM472 474L472 474zM469 397L469 397zM505 409L505 408zM474 474L474 473zM471 403L471 402zM470 402L470 402zM483 453L487 451L483 452zM483 445L484 446L483 445zM483 446L483 446zM472 402L472 402zM471 401L471 401zM473 445L473 445zM482 454L483 454zM485 446L485 446zM473 398L474 398zM487 437L488 437zM494 440L494 440zM487 439L487 439zM482 452L483 452zM458 454L459 453L458 454zM496 445L497 445zM475 404L476 403L475 404zM475 445L476 445zM486 434L487 434zM474 402L475 402zM498 437L498 436zM474 398L474 398zM469 401L470 401zM492 439L492 439zM487 449L488 449zM486 450L487 449zM490 448L491 449L490 448zM483 450L483 450zM492 442L492 442zM498 444L498 444zM481 445L482 445zM487 433L488 433zM487 431L487 430zM489 434L489 434zM470 401L470 401zM483 445L483 446zM460 451L461 451zM499 430L499 430zM470 400L471 400zM475 401L475 401zM471 403L471 403zM483 439L483 438zM488 449L488 450zM498 440L498 440zM491 438L491 438zM500 436L500 436zM488 403L488 403zM495 443L495 443zM482 443L482 443zM487 453L488 453zM486 435L487 434zM505 434L505 434zM485 437L485 437zM487 430L488 430zM499 436L499 436zM463 450L464 449L463 450zM469 447L469 447zM491 447L491 447zM479 450L479 450zM484 433L484 433zM502 437L502 437zM485 404L485 403zM464 450L464 450zM492 448L492 447zM470 453L470 453zM470 446L471 447L470 446zM463 451L464 451zM474 445L474 445zM498 440L498 440zM472 450L472 450zM486 406L486 406zM489 433L489 433zM484 404L484 404zM495 438L495 438zM502 435L502 435zM488 455L488 455zM477 445L477 445zM470 452L470 452zM473 446L474 445zM475 463L475 463zM487 445L487 445zM488 450L489 450zM478 448L478 448zM481 456L481 456zM499 402L499 402zM503 438L503 438zM478 383L478 383zM486 404L486 403zM483 385L482 385zM476 467L476 467zM470 451L470 451zM474 445L474 445zM477 451L477 451zM475 464L476 464zM475 464L475 464zM491 416L491 416zM481 437L481 437zM483 407L483 407zM477 468L477 467zM475 467L476 467zM474 464L474 464zM473 399L473 399zM473 406L473 405zM476 465L476 465zM475 463L475 463zM479 460L479 460zM496 441L496 441zM489 453L489 453zM470 451L470 451zM483 405L483 405zM489 404L489 404zM499 444L499 444zM476 401L476 401zM468 380L468 380zM494 436L494 436zM502 435L502 435zM476 402L476 402zM494 436L494 436zM475 441L475 441zM487 406L487 406zM502 433L502 433zM505 433L505 433zM484 442L485 442zM488 440L488 441zM475 462L475 462z"
id="海南省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M440 327L442 325L442 327L445 324L446 325L447 322L449 324L450 323L452 325L451 326L453 326L453 328L454 327L454 329L456 329L457 324L456 321L454 321L455 320L453 318L452 319L452 315L454 313L457 314L460 311L461 312L462 309L452 302L450 310L448 312L447 311L447 313L443 317L438 314L436 316L437 317L434 320L438 324L440 324L440 326zM456 313L456 313zM436 316L436 316zM456 313L456 313zM444 317L444 317z"
id="重庆市" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M411 335L410 336L412 340L416 342L421 340L420 335L427 326L429 326L428 327L430 331L432 331L433 329L434 332L438 332L440 330L437 329L436 326L440 326L440 324L438 324L434 320L438 314L443 317L447 313L446 312L450 310L452 302L449 303L446 300L440 300L438 298L435 298L433 300L430 299L428 297L428 293L424 291L423 292L421 288L417 290L418 293L415 296L414 293L413 296L410 295L411 298L409 300L405 300L404 297L402 299L399 296L397 296L395 290L392 289L389 292L391 294L389 298L395 303L395 305L398 308L396 308L399 317L399 327L400 328L402 324L405 328L404 329L406 331L408 330L408 332L411 335zM440 316L440 316zM444 316L444 316zM436 316L436 316z"
id="四川省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M457 327L455 329L451 325L451 323L448 324L448 322L446 322L445 325L444 324L441 327L441 325L441 327L438 325L436 327L440 330L438 332L435 331L434 334L426 334L424 336L425 339L430 340L428 345L431 348L430 351L434 349L439 351L439 349L443 347L444 348L445 345L446 348L450 348L450 346L453 347L453 345L456 346L455 345L457 345L458 336L454 336L458 332L457 327zM458 337L458 337zM458 338L458 338z"
id="贵州省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M434 332L433 329L431 331L429 330L429 326L425 327L426 328L424 328L424 331L420 335L421 340L415 342L412 339L409 332L406 331L402 325L400 327L401 328L399 328L399 322L398 325L396 325L397 328L396 329L394 327L393 330L394 333L395 332L397 334L397 344L395 344L391 349L390 355L398 355L396 355L396 357L398 361L399 360L398 361L401 362L399 366L404 367L406 371L410 369L410 371L414 373L414 365L418 363L421 365L423 363L431 363L432 360L436 360L439 357L439 355L433 355L434 354L429 351L431 349L429 345L431 340L429 338L425 338L427 334L434 334L434 332z"
id="云南省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M345 276L343 274L333 273L325 275L324 278L318 278L313 281L309 281L306 278L304 278L300 282L296 280L292 281L288 287L284 287L285 288L282 290L286 298L285 301L283 301L283 299L281 301L281 303L284 306L284 310L290 311L290 313L297 317L298 314L300 314L310 322L313 321L315 325L320 326L319 327L325 331L325 329L327 331L327 329L331 331L341 330L340 333L342 335L343 331L346 328L356 331L356 333L358 333L360 337L367 337L379 328L383 328L387 332L390 327L394 329L394 327L396 329L396 325L398 325L399 322L399 317L394 301L390 300L388 302L389 303L385 305L386 306L382 304L383 306L380 306L378 302L377 303L377 301L373 299L369 301L348 294L346 292L347 291L345 291L345 276z"
id="西藏自治区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M463 286L463 270L465 266L464 261L468 253L467 250L464 253L462 251L462 253L459 254L459 256L455 259L454 264L451 265L447 263L445 265L445 269L453 273L453 281L448 281L447 284L442 283L440 287L442 287L440 291L441 292L437 294L437 298L435 297L436 299L444 299L449 303L452 302L457 306L459 304L458 301L462 299L459 298L460 297L458 295L465 296L467 294L464 291L465 290L463 286zM467 294L467 294zM438 299L438 299z"
id="陕西省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M441 278L440 281L437 280L437 278L434 277L434 270L431 267L430 268L430 266L423 263L423 259L428 255L426 251L421 254L414 254L415 257L409 255L409 253L406 250L401 248L405 245L405 241L402 240L397 243L394 243L394 240L390 237L392 235L388 226L383 227L381 229L382 231L380 234L376 234L368 242L364 243L360 253L364 253L370 257L371 256L373 259L379 259L382 261L385 260L385 258L387 258L386 255L388 253L393 256L397 254L402 259L404 260L404 258L411 263L416 264L415 265L418 268L421 277L419 277L420 280L419 279L415 285L417 288L416 289L412 289L409 287L408 288L412 293L413 292L413 294L415 294L415 296L418 293L416 290L420 288L422 292L423 291L428 293L428 297L430 299L435 299L435 297L436 298L438 296L436 294L441 293L441 283L448 284L449 281L453 281L453 273L442 268L440 272L443 275L443 277L441 278zM438 280L438 280zM420 274L420 274zM438 280L438 280zM441 278L441 278z"
id="甘肃省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M420 274L418 269L419 268L415 264L410 263L408 260L404 258L405 260L403 259L398 254L395 254L393 256L387 253L387 257L383 261L380 259L374 259L372 256L370 257L365 255L365 253L348 258L348 260L350 260L350 264L354 268L351 271L353 273L352 276L347 274L347 276L344 277L346 277L344 281L344 284L346 284L345 291L347 291L346 292L351 296L355 296L369 301L373 299L377 301L376 302L378 302L380 306L382 306L382 304L386 306L385 305L389 303L388 302L390 300L389 297L391 295L389 291L392 289L396 292L397 296L399 296L402 299L404 297L405 300L409 300L411 298L410 295L412 296L414 295L414 293L413 294L413 292L412 293L408 289L417 288L415 284L417 280L420 279L420 274z"
id="青海省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M445 268L447 262L441 260L444 255L443 252L441 252L438 255L436 264L428 266L430 266L430 268L431 267L434 270L434 276L440 282L440 278L443 277L443 275L440 272L442 270L441 269L445 268zM438 280L438 280zM438 280L438 280z"
id="宁夏回族自治区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M383 227L377 214L376 215L364 208L354 208L351 205L353 200L353 194L348 186L342 184L336 179L336 177L334 177L335 174L329 174L329 178L327 180L323 180L322 182L322 192L313 193L308 190L303 202L305 206L299 206L290 209L292 211L292 215L295 222L292 225L294 225L291 227L292 230L288 234L287 233L277 240L274 239L270 243L270 245L266 245L265 243L261 244L258 247L257 246L253 253L256 258L259 257L261 259L260 260L262 266L259 267L259 269L263 269L267 272L268 277L275 280L279 280L280 285L285 288L284 287L288 287L293 280L299 282L305 278L307 280L314 281L318 278L324 278L325 275L333 273L352 276L353 273L351 271L354 268L350 264L350 260L348 260L348 258L360 255L364 243L369 241L375 234L377 234L377 236L382 232L382 227z"
id="新疆维吾尔自治区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M520 365L521 368L523 368L523 364L526 361L529 349L527 347L521 352L518 357L519 364zM544 343L544 343zM537 344L537 344zM516 358L515 358zM539 343L539 343zM515 358L515 358zM515 359L515 359zM515 357L515 357zM529 345L530 345zM526 363L526 363zM526 367L527 367zM530 346L530 346zM514 360L515 360zM520 366L520 365z"
id="台湾省" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M484 365L483 366L486 365L484 365zM484 366L484 366zM485 365L485 365zM485 365L485 365zM485 365L485 365zM485 366L485 366zM485 365L485 365zM486 366L486 366zM485 366L485 366z"
id="香港特别行政区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M481 367L481 367zM481 366L481 366z" id="澳门特别行政区" />
<path class="leaflet-interactive" stroke="#3388ff" stroke-opacity="0" stroke-width="3" stroke-linecap="round"
stroke-linejoin="round" fill="#eee" fill-opacity="0.5" fill-rule="evenodd"
d="M532 359L534 352L532 359zM524 375L529 370L528 369L524 375zM515 392L518 386L515 392zM512 409L512 404L512 409zM510 432L509 434L512 427L511 429zM492 455L496 450L492 455zM474 476L471 477L477 475L475 476zM451 461L451 456L451 461zM462 431L461 432L463 426L462 430zM460 408L457 403L459 407z"
id="100000_JD" />
</g>
</svg>
\ No newline at end of file
<template>
<img :src="imgsrc">
</template>
<script>
export default {
props:['src'],
computed:{
imgsrc:function(){
return this.src?`${process.env.VUE_APP_API_BASE_URL}/${this.src}`:require('./thumb.jpg')
}
}
}
</script>
\ No newline at end of file
<template>
<div class="thumb" >
<div v-if="fileType == 'img'">
<img :src="images[index]" v-if="src" @click="show">
<img src="./thumb.jpg" v-else>
</div>
<div v-else>
<a-icon type="play-circle" style="font-size:20px" @click="visible = true"/>
<a-modal
title="详情"
:visible="visible"
:footer="null"
@cancel="visible=false"
>
<video :src="images[0]" style="width:100%;height:100%" controls autoplay v-if="visible"></video>
</a-modal>
</div>
</div>
</template>
<script>
export default {
props:{
src:[String,Array],
index:{
type:Number,
default:0
}
},
data(){
return{
images:[],
fileType:"img",
visible:false
}
},
watch:{
src:{
handler:function(v){
if(v){
if(typeof v == 'string'){
this.images = v.split(",").map(v=>{
return this.publicSrc(v)
})
}else{
this.images = v.map(v=>{
return this.publicSrc(v)
})
}
// 判断视频格式
if(v.search(/mp4/ig)>=0){
this.fileType = 'mp4'
}else{
this.fileType = 'img'
}
}
},
immediate:true
}
},
methods:{
publicSrc(src){
if(src.search(/http/ig)>-1){
return `${src}`
}else{
return `${process.env.VUE_APP_API_BASE_URL}/${src}`
}
},
show(){
this.$viewerApi({
images: this.images,
options: {
initialViewIndex: this.index
},
})
}
}
}
</script>
<style lang="less" scoped>
.thumb{
width: 50px;
// height: 60px;
margin: 0 auto;
cursor: pointer;
img{
display: inline-block;
width: 100%;
height: 100%;
}
}
</style>
\ No newline at end of file
......@@ -20,6 +20,9 @@ import * as directives from "@/directive";
Object.keys(directives).forEach((name) =>
Vue.directive(name, directives[name])
);
// datav
import dataV from '@jiaminghi/data-view'
Vue.use(dataV)
// 引入lodash
import lodash from "lodash";
Vue.prototype.$_ = lodash;
......
......@@ -232,6 +232,27 @@ const routes = [
},
],
},
{
path: "Impossible",
name: "Impossible",
redirect: "/home/dataManagement/Impossible/ImpossibleForm",
component: () =>
import(
/* webpackChunkName: "oneYardPass" */ "@/views/dataAdmin/components/Impossible/module.vue"
),
meta: { title: "办不成事报表" },
children: [
{
path: "ImpossibleForm",
name: "ImpossibleForm",
component: () =>
import(
/* webpackChunkName: "reportForm" */ "@/views/dataAdmin/components/Impossible/index.vue"
),
meta: { title: "办不成事报表" },
},
],
},
{
path: "AIEfficiency",
name: "AIEfficiency",
......
......@@ -3,23 +3,23 @@
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getList">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="main">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }">
<div class="mt20">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="false">
</a-table>
</div>
......@@ -27,18 +27,27 @@
</template>
<script>
import {getEventCensus} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD')
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
product:[{
title:'排队机',
id:1
}],
columns: [{
title: "序号",
width: "70px",
......@@ -47,26 +56,38 @@
},
{
title: "事件",
dataIndex: "title",
dataIndex: "eventName",
align: "center",
},
{
title: '事件ID',
dataIndex: 'address',
dataIndex: 'eventCode',
align: "center",
},
{
title: '事件数量(日均)',
dataIndex: 'address1',
dataIndex: 'dayAvg',
align: "center",
},
{
title: '事件平均使用时长(单次)',
dataIndex: 'address2',
dataIndex: 'takeTimeAvg',
align: "center",
}
],
data: []
data: [],
}
},
mounted() {
this.getList()
},
methods:{
getList() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getEventCensus(this.queryform).then(res=>{
this.data = res.data.data
})
}
}
};
......
......@@ -3,17 +3,17 @@
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
......@@ -23,11 +23,11 @@
<div>页面访问指标趋势</div>
<div class="txt-dv">
<div>
<div class="num">4058</div>
<div class="num">{{data ? data.accessSum : 0}}</div>
<div>页面累计访问次数</div>
</div>
<div>
<div class="num">4058</div>
<div class="num">{{data ? data.dayAccessAvg : 0}}</div>
<div>日均访问次数</div>
</div>
</div>
......@@ -37,11 +37,11 @@
<div class="page-box">
<div class="page-dv">
<div>人均访问深度</div>
<div class="page-num">4.00</div>
<div class="page-num">{{data ? data.depthAvg : 0}}</div>
</div>
<div class="page-dv">
<div>次均访问深度</div>
<div class="page-num">4.00</div>
<div class="page-num">{{data ? data.singleDepth : 0}}</div>
</div>
</div>
<div class="chatrs-dv">
......@@ -55,26 +55,48 @@
<script>
import * as echarts from 'echarts'
import {getAccessAnalyse} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD')
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
product:[{
title:'排队机',
id:1
}],
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
data:null
}
},
mounted() {
this.initLine()
this.initBar()
this.getData()
},
methods: {
initBar() {
getData() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getAccessAnalyse(this.queryform).then(res=>{
this.data = res.data
let lineX = res.data.accessTrend.map(item=>item.accessDay)
let lineY = res.data.accessTrend.map(item=>item.accessCount)
let barX = res.data.pageAccessTop.map(item=>item.accessCount)
let barY = res.data.pageAccessTop.map(item=>item.pageName)
this.initLine(lineX,lineY)
this.initBar(barX,barY)
})
},
initBar(barX,barY) {
let chartDom = document.getElementById('pages')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -103,7 +125,7 @@
},
yAxis: {
type: 'category',
data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World'],
data: barY,
axisTick: {
show: false
}
......@@ -111,13 +133,13 @@
series: [{
name: '访问次数',
type: 'bar',
data: [18203, 23489, 29034, 104970, 131744, 630230],
data: barX,
barWidth:10
}
]
})
},
initLine() {
initLine(lineX,lineY) {
let chartDom = document.getElementById('number')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -132,7 +154,7 @@
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
data: lineX,
axisTick: {
show: false
}
......@@ -142,7 +164,7 @@
},
series: [{
name: '页面访问次数',
data: [150, 230, 224, 218, 135, 147, 260],
data: lineY,
type: 'line',
markLine: {
data: [{
......
......@@ -3,17 +3,17 @@
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
......@@ -24,12 +24,21 @@
<script>
import * as echarts from 'echarts'
import {getWayAccessAnalyse} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
},
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD')
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
product:[{
title:'排队机',
id:1
}],
labelCol: {
span: 1
},
......@@ -39,10 +48,30 @@
}
},
mounted() {
this.init()
this.getData()
},
methods: {
init() {
getData() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getWayAccessAnalyse(this.queryform).then(res=>{
let data = res.data.data.map(item=>({name:item.name}))
let links = res.data.links.map(item=>({
source:item.sourceName,
target:item.targetName,
value:item.value,
lineStyle:{
color:'source'
}
}))
this.init(data,links)
})
},
uniqueFunc(arr, uniId){
const res = new Map();
return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
},
init(data,links) {
let chartDom = document.getElementById('path')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -54,74 +83,8 @@
},
color:['#FFCAC4','#6D86DE','#409AFE','#4DB3EA','#07CF8C'],
nodeWidth:10,
data: [{
name: 'a'
},
{
name: 'b'
},
{
name: 'a1'
},
{
name: 'a2'
},
{
name: 'b1'
},
{
name: 'c'
}
],
links: [{
source: 'a',
target: 'a1',
value: 5,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'a2',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b',
target: 'b1',
value: 8,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'b1',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'a1',
value: 1,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'c',
value: 2,
lineStyle:{
color:'source'
}
}
]
data: data,
links: links
}
})
}
......
......@@ -2,29 +2,30 @@
<!-- 产品分析 -->
<div class="page">
<div class="img-dv">
<div id="queuing" @click="clickEvent"></div>
<img :src="BASE_URL + img" ref="img">
<div id="queuing"></div>
</div>
<div class="list-dv">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 180px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false" />
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 390px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.pageCode" style="width: 410px">
<a-select-option :value="item.id" v-for="(item,index) in page" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getList">
开始分析
</a-button>
</a-form-model-item>
......@@ -35,7 +36,7 @@
<div>312321</div>
</div>
<div style="margin-bottom: 20px;">事件排名Top10</div>
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="false">
</a-table>
</div>
</div>
......@@ -44,12 +45,28 @@
<script>
import Heatmap from 'heatmap.js';
import moment from 'moment';
import {
getProductHotCensus
} from '@/api/dataActuary.js'
export default {
data() {
return {
queryform: {
value: null
productId: 1,
dateTimeStart: moment().format('yyyy-MM-DD'),
dateTimeEnd: moment().format('yyyy-MM-DD'),
pageCode: '/'
},
time: [moment().format('yyyy-MM-DD'), moment().format('yyyy-MM-DD')],
product: [{
title: '排队机',
id: 1
}],
page: [{
title: '首页',
id: '/'
}],
labelCol: {
span: 1
},
......@@ -64,43 +81,61 @@
},
{
title: "事件",
dataIndex: "title",
dataIndex: "businessName",
align: "center",
},
{
title: '点击次数',
dataIndex: 'address',
dataIndex: 'value',
align: "center",
},
{
title: '事件数量(日均)',
dataIndex: 'address1',
dataIndex: 'proportion',
align: "center",
}
],
data: [],
heatmapInstance: null,
dataPoint: []
dataPoint: [],
img: '',
BASE_URL: process.env.VUE_APP_API_BASE_URL + '/'
}
},
mounted() {
this.init('queuing')
},
methods: {
clickEvent(e) {
this.dataPoint.push({
x: e.layerX,
y: e.layerY,
value: 20
})
getList() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getProductHotCensus(this.queryform).then(res => {
this.data = res.data.data
this.img = res.data.screenUrl
let imgSize = new Image();
imgSize.src = this.BASE_URL + this.img;
imgSize.onload = () => {
let w = this.$refs.img.width / imgSize.width
let h = this.$refs.img.height / imgSize.height
this.dataPoint = res.data.data.map(({
x,
y,
value
}) => ({
x: parseInt(x * w),
y: parseInt(y * h),
value
}))
let data = {
max: 100,
max: 10,
min: 0,
data: this.dataPoint
};
this.heatmapInstance.setData(data);
}
})
},
init(el, dataPoint) {
init(el) {
let config = {
container: document.getElementById(el),
radius: 30,
......@@ -109,6 +144,7 @@
blur: .5
};
this.heatmapInstance = Heatmap.create(config);
this.getList()
}
}
};
......@@ -122,16 +158,20 @@
.img-dv {
width: 60%;
min-height: 100%;
display: flex;
justify-content: center;
align-items: center;
margin: 100px;
position: relative;
img {
width: 100%;
}
#queuing {
width: 740px;
height: 370px;
background-image: url('https://cdn.pixabay.com/photo/2023/03/22/20/16/muffin-7870491_640.jpg');
background-size: 100% 100%;
width: 100%;
height: 100%;
position: absolute !important;
top: 0;
left: 0;
z-index: 999;
}
}
......
<template>
<div class="ff p15">
<div class="form-box">
<div class="num-dv">
<a-button :loading="btnLoading" type="success" @click="handleExportTable">
<span>{{ tableSelectedRows.length ? "导出" : "导出全部" }}</span>
</a-button>
<div class="ml20">提交次数:{{ numObj ? numObj.count : 0 }}</div>
<div class="ml20">回复次数:{{ numObj ? numObj.reply_count : 0 }}</div>
</div>
<a-form :model="queryform" layout="inline">
<a-form-item>
<a-checkbox @change="onChange">只看未回复</a-checkbox>
</a-form-item>
<a-form-item>
<a-select v-model="queryform.source" style="width: 140px">
<a-select-option value="">全部来源</a-select-option>
<a-select-option :value="item.value" v-for="item,index in deviceList"
:key="index">{{item.label}}</a-select-option>
</a-select>
</a-form-item>
<a-form-item>
<a-range-picker v-model:value="queryform.time" valueFormat="yyyy-MM-DD" style="width: 270px" />
</a-form-item>
<a-form-item>
<a-input v-model:value="queryform.keyword" placeholder="请输入标题或者名字关键字搜索" style="width: 220px" />
</a-form-item>
<a-form-item>
<a-button type="primary" @click="getlist">搜索</a-button>
</a-form-item>
</a-form>
</div>
<div class="table-box">
<a-table :dataSource="tabledataSource" :columns="tablecolumns" :pagination="pagination" :scroll="{ y: 590 }"
:row-key="(record) => record.id" @change="changeTablePage" :row-selection="{
selectedRowKeys: tableSelectedKeys,
onChange: onSelectChange,
}">
<template slot="type" slot-scope="text, record, index">
<div>{{typeList.find(item=>record.type).label}}</div>
</template>
<template slot="valid" slot-scope="text, record, index">
<div>{{record.valid == 1 ? '' : ''}}</div>
</template>
<template slot="secrecy" slot-scope="text, record, index">
<div>{{record.secrecy == 1 ? '' : ''}}</div>
</template>
<template slot="status" slot-scope="text, record, index">
<div>{{record.status == 1 ? '' : ''}}</div>
</template>
<template slot="操作" slot-scope="text, record, index">
<a-button type="link" @click="detail(record)">详情</a-button>
</template>
</a-table>
</div>
<a-drawer title="详情" :visible="visible" width="100%" @close="visible = false">
<div class="content-box">
<div class="content-dv" v-if="detailData">
<div style="margin-bottom: 10px;">建议内容</div>
<a-descriptions layout="vertical" :column="4">
<a-descriptions-item label="问题主题" :span="4">
{{detailData.title}}
</a-descriptions-item>
<a-descriptions-item label="具体问题" :span="4">
{{detailData.content}}
</a-descriptions-item>
<a-descriptions-item label="业务名称" :span="4">
{{detailData.business}}
</a-descriptions-item>
<a-descriptions-item label="办事区县" :span="4">
{{detailData.region}}
</a-descriptions-item>
<a-descriptions-item label="单位名称" :span="4">
{{detailData.dept_name}}
</a-descriptions-item>
<a-descriptions-item label="真实姓名">
{{detailData.name}}
</a-descriptions-item>
<a-descriptions-item label="联系电话">
{{detailData.phone}}
</a-descriptions-item>
<a-descriptions-item label="身份证号">
{{detailData.idcard}}
</a-descriptions-item>
<a-descriptions-item label="电子邮箱">
{{detailData.email}}
</a-descriptions-item>
<a-descriptions-item label="联系地址" :span="4">
{{detailData.address}}
</a-descriptions-item>
<a-descriptions-item label="提交时间" :span="4">
{{detailData.create_time}}
</a-descriptions-item>
</a-descriptions>
</div>
<div class="content-dv" v-if="detailData">
<div style="margin-bottom: 10px;">建议答复</div>
<a-descriptions layout="vertical" :column="1">
<a-descriptions-item label="所属部门">
{{detailData.reply_dept}}
</a-descriptions-item>
<a-descriptions-item label="回复内容">
{{detailData.reply_content}}
</a-descriptions-item>
<a-descriptions-item label="附件">
<div class="img-dv" v-if="detailData.reply_url && detailData.reply_url.length > 0">
<thumbImage :src="item.url" :index="idx" @click="idx = index" fileType="img"
v-for="item,index in detailData.reply_url" :key="index" />
</div>
</a-descriptions-item>
<a-descriptions-item label="回复人">
{{detailData.reply_people}}
</a-descriptions-item>
<a-descriptions-item label="回复时间">
{{detailData.update_time}}
</a-descriptions-item>
</a-descriptions>
</div>
</div>
<div class="btn-dv">
<a-button style="marginRight: 8px" @click="visible = false">
关闭
</a-button>
</div>
</a-drawer>
</div>
</template>
<script>
import {
getImpossible,
getImpossibleInfo,
getCountImpossible
} from '@/api/dataAdmin.js'
import image from '@/components/image/thumbImage'
import {
export2Excel
} from "@/utils/js/exportExcel";
import moment from 'moment'
export default {
data() {
return {
idx: 0,
queryform: {
page: 1,
size: 10,
source: '',
keyword: null,
time: [moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
reply:''
},
deviceList: [{
label: '微官网',
value: 1
}, {
label: '自助服务系统',
value: 2
}],
btnLoading: false,
tableSelectedKeys: [],
tableSelectedRows: [],
defaultFileList: [],
visible: false,
tablename: "treaty", //接口地址 名称
tablecolumns: [{
title: "序号",
width: "70px",
align: 'center',
customRender: (text, record, index) =>
(this.queryform.page - 1) * this.queryform.size +
index +
1,
},
{
title: "问题主题",
dataIndex: "title",
align: 'center',
scopedSlots: {
customRender: (text, record, index) => `${record.title || '--'}`
},
},
{
title: "业务名称",
dataIndex: "business",
align: 'center',
scopedSlots: {
customRender: (text, record, index) => `${record.business || '--'}`
},
},
{
title: "真实姓名",
dataIndex: "name",
align: 'center',
customRender: (text, record, index) => `${record.name || '--'}`
},
{
title: "联系电话",
dataIndex: "phone",
align: 'center',
customRender: (text, record, index) => `${record.phone || '--'}`
},
{
title: "提交日期",
dataIndex: "create_time",
align: 'center',
customRender: (text, record, index) => `${record.create_time || '--'}`
},
{
title: "是否回复",
dataIndex: "status",
align: 'center',
scopedSlots: {
customRender: "status",
},
},
{
title: "回复人",
dataIndex: "reply_name",
align: 'center',
customRender: (text, record, index) => `${record.reply_name || '--'}`
},
{
title: "回复时间",
dataIndex: "update_time",
align: 'center',
customRender: (text, record, index) => `${record.update_time || '--'}`
},
{
title: "所属部门",
dataIndex: "dept_name",
align: 'center',
customRender: (text, record, index) => `${record.dept_name || '--'}`
},
{
title: "操作",
dataIndex: "操作",
scopedSlots: {
customRender: "操作",
},
},
], //表头数据
pagination: {
total: 0,
pageSize: 10, //每页中显示10条数据
showSizeChanger: true,
pageSizeOptions: ["10", "20", "50", "100"], //每页中显示的数据
showTotal: total => `共有 ${total} 条数据`, //分页中显示总的数据
},
tabledataSource: [], //表格数据
columnsSearch: [
], //表格查询条件
detailData: null,
deplist: [],
numObj: null
}
},
async created() {
this.getlist()
let {
data
} = await getCountImpossible()
this.numObj = data
},
methods: {
getlist() {
getImpossible(this.queryform).then(res => {
this.tabledataSource = res.data.data
this.pagination.total = res.data.total
})
},
changeTablePage(e) {
this.queryform.page = e.current
this.queryform.size = e.pageSize
this.getlist()
},
onChange(e) {
this.queryform.reply = e.target.checked ? 0 : ''
},
detail(row) {
getImpossibleInfo({
id: row.id
}).then(res => {
this.detailData = res.data
this.visible = true
})
},
// 选中
onSelectChange(keys, rows) {
this.tableSelectedKeys = keys;
const res = new Map();
this.tableSelectedRows = [...this.tableSelectedRows, ...rows]
.filter((v) => {
return !res.has(v.id) && res.set(v.id, 1);
})
.filter((v) => {
return this.tableSelectedKeys.some((val) => v.id == val);
});
},
// 导出
async handleExportTable() {
this.btnLoading = true;
let obj = {
1: "本地打印",
2: "在线提交",
};
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
// 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => {
if (item.type == keys) {
item.type = obj[keys];
}
});
});
} else {
let datas = this.$_.cloneDeep(
await getImpossible({
page: 1,
size: -1
})
);
data = datas.data.data
if (!data.length) return;
for (let item of data) {
Object.keys(obj).forEach((key) => {
if (item.type == key) {
item.type = obj[key];
}
});
}
}
export2Excel(
this.tHeader,
this.filterVal,
data,
"填单记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
this.btnLoading = false;
},
}
}
</script>
<style scoped lang="less">
.form-box {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
.num-dv{
display: flex;
align-items: center;
.ml20{
margin-left: 20px;
}
}
}
.img-dv {
display: flex;
flex-wrap: wrap;
img {
width: 40px;
height: 40px;
margin-right: 10px;
margin-bottom: 10px;
}
}
/deep/.ant-spin-container{
display: block !important;
}
/deep/.ant-drawer-body {
background: #f7f7f7;
padding: 15px;
box-sizing: border-box;
min-height: calc(100vh - 55px);
}
/deep/td {
text-align: left;
}
/deep/.ant-descriptions-item-label{
color: #1890ff;
}
.btn-dv {
background-color: #fff;
padding: 15px;
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
.content-box {
display: flex;
justify-content: space-between;
width: 100%;
}
.content-dv {
width: calc(50% - 10px);
background: #fff;
border-radius: 10px;
padding: 10px;
}
</style>
\ No newline at end of file
import { deepClone } from "@/utils/js/common.js";
export default {
data() {
return {
defaultInfoForm: {},
modalInfo: {
confirmLoading: false,
visible: false,
title: '用户信息',
width: '30%',
},
}
},
props: {
sourceInfoForm: {
type: Object,
default: () => {
return {
// --------------申报人信息-----------------------
name: "张三",
Gender: "",
Age: "56",
Phone: "13080888888",
yuyuecishu: "12",
paiduicishu: "6",
guanlianyewu: "12",
haxizhi: "3sad54a5f4sda4da4sd4adasdqa1sda1g1d1ada4d4f1fgweqqwq01f4sa4dgds1eqw5e1c2c2vx",
qukuaigaodu: "24292496",
chuangjianshijian: "2022-04-25 18:22",
// --------------业务分析-----------------------
yewuming: '公安户籍类',
guanlianshixiang: [
{
shixiangmingcheng: '事项名称事项名称事项名称事项名称事项名称事项名称',
},
{
shixiangmingcheng: '事项名称事项名称事项名称事项名称事项名称事项名称',
},
{
shixiangmingcheng: '事项名称事项名称事项名称事项名称事项名称事项名称',
},
],
shoulicishu: "12546",
banjiecishu: "12348",
haopinglv: "99.99%",
// --------------工作人员-----------------------
workImgUrl: require('../../../../../assets/images/logo.png'),
workpeople: "刘明洋",
JobNo: "01",
department: '税务局',
PoliticalOutlook: '党员',
workPhone: '13080888888',
Starlevel: '5',
souliyewu: '12247877',
pingjiacishu: '1225454',
};
},
},
},
watch: {
sourceInfoForm: {
handler(newValue, oldValue) {
// console.log(newValue);
// console.log(oldValue);
this.defaultInfoForm = Object.assign({}, deepClone(newValue));
},
deep: true,
},
},
computed: {
},
created() {
setTimeout(() => {
this.defaultInfoForm = Object.assign({}, deepClone(this.sourceInfoForm));
// console.log(this.defaultInfoForm);
}, 0);
},
methods: {
modalClose() {
this.modalInfo.visible = false;
}
},
}
\ No newline at end of file
<template>
<div class="Container">
<div class="main">
<a-tabs v-model="tabsActive" @change="tabsChange" :forceRender="false">
<a-tab-pane
:key="item.path"
v-for="(item, index) of tabsList['children']"
:tab="item['meta']['title']"
>
</a-tab-pane>
</a-tabs>
<router-view style="padding: 0 1rem" />
</div>
</div>
</template>
<script>
import { getItemData } from "@/utils/js/common.js";
import common from "@/mixins/common";
export default {
name: "ImpossibleModule",
mixins: [common],
data() {
return {
tabsActive: undefined,
};
},
computed: {
tabsList() {
return getItemData(this.$router.options.routes, "name", "Impossible");
},
},
mounted() {
this.$nextTick(() => {
this.tabsActive = this.$route.path.substr(
this.$route.path.lastIndexOf("/") + 1
);
});
},
methods: {
tabsChange(val) {
this.$router.push({
path: `/home/dataManagement/Impossible/${val}`,
// query: { testoption: "test001" },
});
},
},
};
</script>
<style lang="less" scoped>
@headerH: 4.5rem;
.Container {
height: 100% !important;
// background: #fac;
background: #f5f5f5;
display: flex;
flex-direction: column;
.main {
// background: #afc;
background: #ffffff;
border-radius: 6px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
margin: 1.2rem 2rem;
}
&::before {
content: "";
display: block;
width: 100%;
height: @headerH;
background: rgb(59, 135, 255);
background: -moz-linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
background: -webkit-linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
background: linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#3b87ff",endColorstr="#6c35f7",GradientType=1);
}
/deep/.ant-tabs-nav {
.ant-tabs-tab {
margin: 0 !important;
}
}
/deep/.ant-tabs-tab {
font-size: 1rem !important;
& + .ant-tabs-tab {
margin: 0 !important;
margin-left: 0.7rem !important;
}
}
}
</style>
......@@ -2,16 +2,16 @@
<div class="callRecord-Container">
<div class="header_box">
<div>
<a-button type="success" @click="exportTable">
<a-button :loading="btnLoading" type="success" @click="handleExportTable">
<span>{{ tableSelectedRows.length ? "导出" : "导出全部" }}</span>
</a-button>
<b>拨打次数:<i>233</i></b>
<b>拨打次数:<i>{{total}}</i></b>
</div>
<span>
<a-input style="width:250px;" v-model="searchName" placeholder="请输入标题或姓名关键字搜索">
<a-icon slot="prefix" type="search" />
</a-input>
<a-button type="primary">搜索</a-button>
<a-button type="primary" @click="getList">搜索</a-button>
</span>
</div>
<div class="main">
......@@ -19,7 +19,7 @@
selectedRowKeys: tableSelectedKeys,
onChange: onSelectChange,
}" :scroll="{ y: 590 }" :pagination="tablePagination" @change="pagTableChange" :loading="tableLoading"
:columns="tableHeaders" :dataSource="tableSourceData">
:columns="tableHeaders" :dataSource="tableSourceData" >
</a-table>
</div>
</div>
......@@ -27,7 +27,10 @@
<script>
import table from "@/mixins/table";
import {getSys12345} from "@/api/dataAdmin"
import {
export2Excel
} from "@/utils/js/exportExcel";
export default {
mixins: [table],
name: "callRecordForm",
......@@ -45,49 +48,55 @@ export default {
{
title: "微信号",
align: "center",
dataIndex: "微信号",
dataIndex: "nickname",
customRender: (text, record, index) => `${record.nickname || '--'}`
},
{
title: "电话号码",
align: "center",
dataIndex: "电话号码",
dataIndex: "phone",
customRender: (text, record, index) => `${record.phone || '--'}`
},
{
title: "拨打位置",
align: "center",
dataIndex: "拨打位置",
dataIndex: "address",
customRender: (text, record, index) => `${record.address || '--'}`
},
{
title: "拨打时间",
align: "center",
dataIndex: "拨打时间",
dataIndex: "create_time",
customRender: (text, record, index) => `${record.create_time || '--'}`
},
],
btnLoading: false,
tableSelectedKeys: [],
tableSelectedRows: [],
BegindAndEndTime: [],
searchName: undefined,
visible: false,
total:0
};
},
components: {
},
mounted() {
this.setMoment();
for (let key = 0; key < 20; key++) {
this.tableSourceData.push({
id: `00${key + 1}`,
微信号: `liudefa${key + 1}`,
电话号码: `1388888888888`,
拨打位置: `四川省成都市武侯区天益街1号理想中心3栋170${key + 1}号`,
拨打时间: `2022-09-26 13:30:00`
});
}
this.getList();
},
methods: {
getList(){
getSys12345({
phone:this.searchName
}).then(res=>{
this.tableSourceData = res.data.data
this.total = res.data.total
})
},
rangePickerChange(val) {
console.log(val);
},
QueueState(type) {
switch (type) {
case 0:
......@@ -98,7 +107,61 @@ export default {
return "type0";
}
},
// 选中
onSelectChange(keys, rows) {
this.tableSelectedKeys = keys;
const res = new Map();
this.tableSelectedRows = [...this.tableSelectedRows, ...rows]
.filter((v) => {
return !res.has(v.id) && res.set(v.id, 1);
})
.filter((v) => {
return this.tableSelectedKeys.some((val) => v.id == val);
});
},
// 导出
async handleExportTable() {
this.btnLoading = true;
let obj = {
1: "本地打印",
2: "在线提交",
};
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
// 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => {
if (item.type == keys) {
item.type = obj[keys];
}
});
});
} else {
let datas = this.$_.cloneDeep(
await getSys12345({
page: 1,
size: -1
})
);
data = datas.data.data
if (!data.length) return;
for (let item of data) {
Object.keys(obj).forEach((key) => {
if (item.type == key) {
item.type = obj[key];
}
});
}
}
export2Excel(
this.tHeader,
this.filterVal,
data,
"填单记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
this.btnLoading = false;
},
showDrawer() {
this.visible = true;
},
......
......@@ -11,31 +11,32 @@
</div>
<span>
<a-space>
<a-checkbox @change="changeReply">
<a-checkbox @change="changeReply" v-model="isReply">
只看未回复
</a-checkbox>
<a-select placeholder="全部类型" @change="changeType">
<a-select placeholder="全部类型" v-model="nowType" @change="changeType">
<a-select-option value="1"> 部门建议 </a-select-option>
<a-select-option value="2"> 办事建议 </a-select-option>
<a-select-option value="3"> 网站建议 </a-select-option>
<a-select-option value="4"> 我要就错 </a-select-option>
<a-select-option value="5"> 我要投诉 </a-select-option>
</a-select>
<a-select placeholder="全部来源" @change="changeDevice">
<a-select placeholder="全部来源" v-model="nowDevice" @change="changeDevice">
<a-select-option value="1"> 评价系统 </a-select-option>
<a-select-option value="2"> 导视系统 </a-select-option>
<a-select-option value="3"> 自助服务系统 </a-select-option>
<a-select-option value="4"> 微官网 </a-select-option>
<a-select-option value="5"> 数字填单系统 </a-select-option>
</a-select>
<a-range-picker style="width:250px;" format="YYYY年MM月DD日" class="range_picker_style"
@change="rangePickerChange">
<a-range-picker style="width:250px;" format="YYYY-MM-DD" class="range_picker_style"
@change="rangePickerChange" v-model="timeList">
</a-range-picker>
<a-input style="width:250px;" v-model="searchName" placeholder="请输入标题或姓名关键字搜索">
<a-icon slot="prefix" type="search" />
</a-input>
<a-button type="primary" @click="togetWLLZCount">搜索</a-button>
<a-button @click="resetting">重置</a-button>
</a-space>
</span>
</div>
......@@ -153,8 +154,8 @@ export default {
visible: false,
nowSite:null,//当前站点
isReply:false,//是否回复
nowType:null,//当前类型
nowDevice:null,// 来源
nowType:undefined,//当前类型
nowDevice:undefined,// 来源
timeList:[],// 时间
JYCount:0,//建议次数
HFCount:0,//回复次数
......@@ -166,7 +167,7 @@ export default {
mounted() {
this.setMoment();
// 设置默认时间为今天
this.timeList=[this.$moment(new Date()).format("YYYY-MM-DD"),this.$moment(new Date()).format("YYYY-MM-DD")]
this.timeList=[this.$moment().format("YYYY-MM-DD"),this.$moment().format("YYYY-MM-DD")]
this.nowSite = localStorage.getItem('siteId');
this.togetWLLZCount()
},
......@@ -176,6 +177,15 @@ export default {
}
},
methods: {
//重置
resetting() {
this.timeList=[this.$moment().format("YYYY-MM-DD"),this.$moment().format("YYYY-MM-DD")]
this.nowType = undefined
this.nowDevice = undefined
this.searchName = undefined
this.isReply = false
this.togetWLLZCount()
},
// 重写导出
toexportTable() {
let tableData = [];
......
......@@ -353,7 +353,7 @@ export default {
},
// 获取列表数据
async getCallQueListArr(search = {}) {
let res = getCallQueList({
let res = await getCallQueList({
page: this.tablePagination.current,
size: this.tablePagination.pageSize,
...this.searchForm,
......@@ -363,6 +363,7 @@ export default {
let { data, total } = res.data;
this.tableList = data;
this.tablePagination.total = total;
console.log(this.tableList)
return data;
}
},
......
......@@ -4,6 +4,7 @@
<script>
import { deepClone } from "@/utils/js/common.js";
import lodash from "lodash";
import{getStatisticAges} from '@/api/dataAdmin.js'
export default {
props: {
info: {
......@@ -40,19 +41,16 @@ export default {
default: () => {},
},
},
mounted() {
this._initEcharts();
async mounted() {
let {data} = await getStatisticAges()
let label = data.map(item=> item.age_area)
let value = data.map(item=> item.nums)
this._initEcharts(label,value);
},
methods: {
_initEcharts() {
const NAME = [];
const VALUE = [];
_initEcharts(label,value) {
const myChart = this.$echarts.init(this.$el);
const echarts = this.$echarts;
this.info.forEach((item) => {
NAME.push(item.name);
VALUE.push(item.value);
});
let option = {
legend: {
data: ["预约次数"],
......@@ -72,7 +70,10 @@ export default {
},
xAxis: {
type: "category",
data: NAME,
data: label,
axisTick:{
show:false
}
},
yAxis: {
type: "value",
......@@ -85,7 +86,7 @@ export default {
},
series: [
{
data: VALUE,
data: value,
name: "预约次数",
barWidth: "50%",
type: "bar",
......
......@@ -8,58 +8,18 @@ export default {
props: {
info: {
type: Array,
default: () => [
{
value: 140,
name: "08:00~09:00",
},
{
value: 150,
name: "09:00~10:00",
},
{
value: 160,
name: "10:00~11:00",
},
{
value: 170,
name: "11:00~12:00",
},
{
value: 180,
name: "12:00~13:00",
},
{
value: 190,
name: "13:00~14:00",
},
{
value: 200,
name: "14:00~15:00",
},
{
value: 210,
name: "15:00~16:00",
},
{
value: 220,
name: "16:00~17:00",
},
{
value: 230,
name: "18:00~19:00",
},
{
value: 240,
name: "19:00~20:00",
},
],
default: () => [],
},
option: {
type: Object,
default: () => {},
},
},
watch:{
info(){
this._initEcharts();
}
},
mounted() {
this._initEcharts();
},
......@@ -70,8 +30,8 @@ export default {
const myChart = this.$echarts.init(this.$el);
const echarts = this.$echarts;
this.info.forEach((item) => {
NAME.push(item.name);
VALUE.push(item.value);
NAME.push(item.datetime);
VALUE.push(item.count);
});
let option = {
legend: {
......
......@@ -4,6 +4,7 @@
<script>
import { deepClone } from "@/utils/js/common.js";
import lodash from "lodash";
import{getStatisticSexual} from '@/api/dataAdmin.js'
export default {
props: {
info: {
......@@ -24,11 +25,13 @@ export default {
default: () => {},
},
},
mounted() {
this._initEcharts();
async mounted() {
let {data} = await getStatisticSexual()
let value = data.map(({idcard_Sex,nums})=>({name:idcard_Sex,value:nums}))
this._initEcharts(value);
},
methods: {
_initEcharts() {
_initEcharts(value) {
const myChart = this.$echarts.init(this.$el);
const echarts = this.$echarts;
......@@ -43,7 +46,6 @@ export default {
},
legend: {
data: this.info.map((item) => item.name),
bottom: "5%",
right: "center",
itemWidth: 13,
......@@ -84,18 +86,12 @@ export default {
rich_green: {
color: "#50CCCB",
},
},
formatter: function (params) {
if (params.name === "女士") {
return (
params.name + "\n\n" + `{rich_blue|${params.percent}%}`
);
} else if (params.name === "男士") {
return (
params.name + "\n\n" + `{rich_green|${params.percent}%}`
);
}
},
label: {
normal: {
formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比)
}
},
labelLine: {
length: 10,
......@@ -110,7 +106,7 @@ export default {
},
},
},
data: this.info,
data: value,
},
],
};
......
......@@ -29,7 +29,7 @@ export default {
const echarts = this.$echarts;
let option = {
title: {
text: `{c|${this.info.name}} \n{a|` + this.info.value + "%" + "}",
text: `{c|${this.info.starttime}~${this.info.endtime}} \n{a|` + this.info.success_rate * 100 + "%" + "}",
x: "center",
y: "center",
textStyle: {
......@@ -62,7 +62,7 @@ export default {
},
data: [
{
value: this.info.value,
value: this.info.success_rate * 100,
name: "",
itemStyle: {
normal: {
......@@ -82,7 +82,7 @@ export default {
},
},
{
value: 100 - this.info.value,
value: 100 - (this.info.success_rate * 100),
name: "",
label: {
normal: {
......
......@@ -4,20 +4,19 @@
<Head :title="'地域分布'"> </Head>
<div class="diyufenbu_box">
<div class="_left">
<p style="margin: 15px">没画,暂时不知道画布地区,原型显示的是广东</p>
<div ref="chart" style="width: 100%;height: 100%;"></div>
</div>
<ul class="_right">
<li class="list">
<span>排名</span>
<span style="margin-right: 20px;">排名</span>
<i>部门名称</i>
<b>预约热度</b>
</li>
<li class="list" v-for="item of 10">
<span>NO.{{ item }}</span>
<i>区发改局</i>
<li class="list" v-for="item,index in area" :key="index">
<span style="margin-right: 20px;">NO.{{ index+1 }}</span>
<i>{{item.area}}</i>
<b>
<a-progress :percent="90" :show-info="false" status="active"
/></b>
<a-progress :percent="item.nums" :show-info="false" status="active" /></b>
</li>
</ul>
</div>
......@@ -35,21 +34,34 @@
<div class="bottom_box">
<Head :title="'签到准时率'"> </Head>
<div class="echarts">
<QiandaoPie class="list" v-for="item of 10" :key="item" />
<QiandaoPie class="list" :info="item" v-for="item,index in sign" :key="index" />
</div>
</div>
</div>
</template>
<script>
import NianlingBar from "./components/bar.vue";
import XingbiePie from "./components/pie.vue";
import QiandaoPie from "./components/pie2.vue";
import Head from "./components/header.vue";
export default {
import NianlingBar from "./components/bar.vue";
import XingbiePie from "./components/pie.vue";
import QiandaoPie from "./components/pie2.vue";
import Head from "./components/header.vue";
import {
getStatisticArea,
getStatisticSignin
} from '@/api/dataAdmin.js'
import axios from 'axios'
import * as echarts from 'echarts'
export default {
name: "PortalAdminVueCrowdPortrait",
data() {
return {};
return {
area: [],
sign: [],
config: {
bgImgSrc: require('../../../../assets/china.svg')
},
chart:null
};
},
components: {
Head,
......@@ -57,43 +69,355 @@ export default {
XingbiePie,
QiandaoPie,
},
mounted() {},
async mounted() {
let {
data
} = await getStatisticArea()
this.area = data
let sign = await getStatisticSignin()
this.sign = sign.data
let point = await axios.get('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
console.log(point)
this.init(point.data)
},
methods: {
//初始化
init(data) {
if (this.chart == null) {
this.chart = echarts.init(this.$refs.chart);
}
echarts.registerMap('china', data);
var geoGpsMap = [104.64, 28.75];
var geoCoordMap = {
'江苏': [118.8062, 31.9208],
'黑龙江': [127.9688, 45.368],
'内蒙古': [110.3467, 41.4899],
'吉林': [125.8154, 44.2584],
'北京': [116.4551, 40.2539],
'辽宁': [123.1238, 42.1216],
// 河北: [114.4995, 38.1006],
'天津': [117.4219, 39.4189],
// 山西: [112.3352, 37.9413],
'陕西': [109.1162, 34.2004],
// 甘肃: [103.5901, 36.3043],
// 宁夏: [106.3586, 38.1775],
青海: [101.4038, 36.8207],
'新疆': [87.9236, 43.5883],
'四川': [103.9526, 30.7617],
// 重庆: [108.384366, 30.439702],
'山东': [117.1582, 36.8701],
// 河南: [113.4668, 34.6234],
// '安徽': [117.29, 32.0581],
'湖北': [114.3896, 30.6628],
'浙江': [119.5313, 29.8773],
// 福建: [119.4543, 25.9222],
// 江西: [116.0046, 28.6633],
'湖南': [113.0823, 28.2568],
// 贵州: [106.6992, 26.7682],
// 云南: [102.9199, 25.4663],
// 广东: [113.12244, 23.009505],
// 广西: [108.479, 23.1152],
// 海南: [110.3893, 19.8516],
'上海': [121.4648, 31.2891],
'西藏': [91.141017, 29.668461],
// 台湾: [121.509062, 25.044332]
};
var data = [];
var mapData = [];
for (var key in geoCoordMap) {
if (name.includes(key)) {
geoGpsMap = geoCoordMap[key];
}
const keys = key;
const filters = data.filter(item => {
return item.name.includes(keys);
})[0];
mapData.push({
name: key,
value: filters ? filters.value : 0
});
}
mapData.sort((a, b) => {
return a.value - b.value;
});
const colors = ['#4a99de', '#1890FF'];
var convertData = function(data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
});
}
}
return res;
};
var convertToLineData = function(data, gps) {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var fromCoord = geoCoordMap[dataItem.name];
var toCoord = gps; // gps:‘中心点’
if (fromCoord && toCoord) {
res.push({
fromName: gps,
toName: dataItem.name,
coords: [
fromCoord,
toCoord
]
});
}
}
return res;
};
let option = {
// backgroundColor: '#01193f',
color: ['#3BD8FF'], //飞线的颜色
series: [
// 地图线的动画效果
{
type: 'lines',
zlevel: 2,
effect: {
show: true,
period: 4,
trailLength: 0.02, //特效尾迹长度[0,1]值越大,尾迹越长重
symbol: 'circle', //箭头图标
symbolSize: 5, //图标大小
},
lineStyle: {
normal: {
width: 2,
opacity: 0.05, //尾迹线条透明度
curveness: 0.01 //尾迹线条曲直度
}
},
tooltip: {
show: false
},
data: convertToLineData(mapData, geoGpsMap)
},
// 地图点的动画效果
{
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
data: convertData(mapData).map(item => {
return {
name: item.name,
value: item.value.splice(0, 2)
};
}),
// showEffectOn: 'render',
rippleEffect: {
period: 6, //动画时间,值越小速度越快
brushType: 'fill', //波纹绘制方式 stroke, fill
scale: 4, //波纹圆环最大限制,值越大波纹越大
color: '#3BD8FF'
},
// hoverAnimation: true,
symbol: 'circle',
symbolSize: 5,
itemStyle: {
normal: {
show: true,
color: '#3BD8FF',
// shadowBlur: 20,
// shadowColor: '#333'
}
}
},
methods: {},
};
{
type: "effectScatter",
coordinateSystem: "geo",
zlevel: 2,
rippleEffect: {
period: 4,
brushType: "fill",
scale: 4,
color: '#ff0000'
},
label: {
normal: {
show: false,
position: "top",
// offset: [5, 0], //偏移设置
color: "#ff0000",
formatter: "宜宾市",
textStyle: {
color: "#fff",
fontSize: '16px'
}
},
emphasis: {
show: true
}
},
symbol: "circle",
symbolSize: 5,
itemStyle: {
normal: {
show: true,
color: "#ff0000"
}
},
data: [{
name: '宜宾市',
value: [104.64, 28.75]
}],
},
// 地图?
{
type: 'map',
mapType: 'china',
top: '30%',
left: '25%',
zoom: 1.7,
label: { // 地图上的文字
normal: {
show: false,
textStyle: {
color: '#ffffff'
}
}
},
itemStyle: {
normal: {
areaColor: '#6194F8',
borderColor: '#fff',
borderWidth: 1,
shadowColor: '#CCEAFD',
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowBlur: 0,
},
},
emphasis: { // 高亮时区域颜色
itemStyle: {
areaColor: '#1890FF',
},
label: {
color: '#ffffff'
}
},
data: data.map((item, index) => {
return {
name: item.name,
value: item.value,
itemStyle: {
areaColor: item.value > 10 ? colors[1] : colors[0]
}
};
})
}
],
geo: {
map: 'china',
top: '30%',
aspectScale: 0.75, // 长宽比
left: '25%',
zoom: 1.7,
roam: false,
itemStyle: {
normal: {
shadowColor: '#CCEAFD',
shadowOffsetX: 0,
shadowOffsetY: 0
}
},
regions: [{
name: '南海诸岛',
itemStyle: {
normal: {
opacity: 0,
label: {
show: false
}
}
}
}]
},
tooltip: {
show: false,
trigger: 'item',
backgroundColor: '#CCEAFD',
padding: 0,
formatter: function(params) {
var name = params.name || params.seriesName;
var value = params.data.value || 0;
// 实际来源地**
// 最终目的地规模**人
var content = `<div class="info_box">
<div class="info_box_marker"></div>
<div class="info_box_box">
<span class="name">${name}</span>
<span class="value">${value}</span>
<span class="company">人</span>
</div>
</div>`;
return content;
}
}
};
this.chart.setOption(option);
}
},
};
</script>
<style lang="less" scoped>
.CrowdPortrait-Container {
.CrowdPortrait-Container {
background: #f0f2f5;
& > .diyufenbu {
&>.diyufenbu {
background: #fff;
.diyufenbu_box {
display: flex;
align-items: stretch;
justify-content: space-between;
& > ._left {
&>._left {
flex: 1;
height: 440px;
// background: #fac;
}
& > ._right {
width: 35%;
&>._right {
width: 40%;
padding: 15px;
.list {
& + .list {
&+.list {
margin-top: 15px;
}
&:last-child {
// padding-bottom: 20px;
// border-bottom: 1px solid #eee;
}
display: flex;
justify-content: flex-start;
align-items: center;
span {
text-align: left;
width: 10%;
}
i {
font-style: normal;
text-align: left;
......@@ -102,6 +426,7 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
b {
font-weight: normal;
text-align: left;
......@@ -111,44 +436,52 @@ export default {
}
}
}
& > .center_box {
&>.center_box {
display: flex;
justify-content: space-between;
align-items: stretch;
margin-top: 20px;
& > .nianling {
&>.nianling {
height: 430px;
width: 50%;
background: #fff;
margin-right: 20px;
display: flex;
flex-direction: column;
.echarts {
flex: 1;
}
}
& > .xingbie {
&>.xingbie {
width: 50%;
width: 50%;
background: #fff;
display: flex;
flex-direction: column;
.echarts {
flex: 1;
}
}
}
& > .bottom_box {
&>.bottom_box {
height: 480px;
margin-top: 20px;
width: 100%;
background: #fff;
display: flex;
flex-direction: column;
.echarts {
flex: 1;
display: flex;
flex-wrap: wrap;
// align-items: stretch;
.list {
// background: #caf;
......@@ -161,6 +494,5 @@ export default {
}
}
}
}
}
</style>
\ No newline at end of file
......@@ -4,54 +4,51 @@
<Head :title="'预约热度排名'">
<template slot="operation">
<a-range-picker
format="YYYY年MM月DD日"
valueFormat="YYYY-MM-DD"
class="range_picker_style"
@change="rangePickerChange"
v-model="BegindAndEndTime"
v-if="day == 5"
>
</a-range-picker>
<a-select default-value="001">
<!-- <a-select-option
v-for="(item, index) of selectOptions"
:key="index"
:value="item.value"
>
{{ item.label }}
</a-select-option> -->
<a-select-option value="001"> 近3天 </a-select-option>
<a-select-option value="002"> 近7天 </a-select-option>
<a-select v-model="day">
<a-select-option value="0"> 今天 </a-select-option>
<a-select-option value="1"> 近7天 </a-select-option>
<a-select-option value="2"> 近30天 </a-select-option>
<a-select-option value="3"> 近90天 </a-select-option>
<a-select-option value="4"> 近180天 </a-select-option>
<a-select-option value="5"> 自定义 </a-select-option>
</a-select>
<a-button type="primary">搜索</a-button>
<a-button type="primary" @click="getData">搜索</a-button>
</template>
</Head>
<div class="heat_box">
<div class="heat_box" v-if="data">
<ul class="heat_left">
<li class="list">
<span>排名</span>
<i>部门名称</i>
<b>预约热度</b>
</li>
<li class="list" v-for="item of 5">
<span>NO.{{ item }}</span>
<i>区发改局</i>
<li class="list" v-for="item,index in data.section" :key="index">
<span>NO.{{ index+1 }}</span>
<i>{{item.deptname}}</i>
<b>
<a-progress :percent="90" :show-info="false" status="active"
<a-progress :percent="item.count" :show-info="false" status="active"
/></b>
</li>
</ul>
<ul class="heat_right">
<li class="list">
<span>排名</span>
<i>部门名称</i>
<i>事项名称</i>
<b>预约热度</b>
</li>
<li class="list" v-for="item of 5">
<span>NO.{{ item }}</span>
<i>区发改局</i>
<li class="list" v-for="item,index in data.matter" :key="index">
<span>NO.{{ index+1 }}</span>
<i>{{item.mattername}}</i>
<b>
<a-progress :percent="90" :show-info="false" status="active"
<a-progress :percent="item.count" :show-info="false" status="active"
/></b>
</li>
</ul>
......@@ -62,20 +59,37 @@
<script>
import Head from "./components/header.vue";
import {getOrderRanking} from '@/api/dataAdmin.js'
export default {
name: "PortalAdminVueHeatRanking",
data() {
return {
day:'0',
BegindAndEndTime: [],
data:null
};
},
components: {
Head,
},
mounted() {},
watch:{
day(val){
if (val != 5) this.BegindAndEndTime = []
}
},
mounted() {
this.getData()
},
methods: {
getData(){
getOrderRanking({
selected:this.day == 5 ? null : this.day,
time:this.BegindAndEndTime
}).then(res=>{
this.data = res.data
})
},
rangePickerChange(val) {
console.log(val);
},
......
......@@ -4,30 +4,27 @@
<Head :title="'预约趋势研究'">
<template slot="operation">
<a-range-picker
format="YYYY年MM月DD日"
valueFormat="YYYY-MM-DD"
class="range_picker_style"
@change="rangePickerChange"
v-model="BegindAndEndTime"
v-if="day == 5"
>
</a-range-picker>
<a-select default-value="001">
<!-- <a-select-option
v-for="(item, index) of selectOptions"
:key="index"
:value="item.value"
>
{{ item.label }}
</a-select-option> -->
<a-select-option value="001"> 近3天 </a-select-option>
<a-select-option value="002"> 近7天 </a-select-option>
<a-select v-model="day">
<a-select-option value="0"> 今天 </a-select-option>
<a-select-option value="1"> 近7天 </a-select-option>
<a-select-option value="2"> 近30天 </a-select-option>
<a-select-option value="3"> 近90天 </a-select-option>
<a-select-option value="4"> 近180天 </a-select-option>
<a-select-option value="5"> 自定义 </a-select-option>
</a-select>
<a-button type="primary">搜索</a-button>
<a-button type="primary" @click="getData">搜索</a-button>
</template>
</Head>
<div class="echarts">
<Brokenline />
<Brokenline :info="chartsData" v-if="chartsData"/>
</div>
</div>
<div class="fx">
......@@ -39,11 +36,11 @@
:pagination="false"
:columns="tableHeaders"
:dataSource="tableSourceData"
:scroll="{ y: 590 }"
>
</a-table>
<p class="updateTime">
<i class="fa fa-info-circle"></i>数据更新时间:2021-07-12
18:00:00,受数据波动影响,可能会有延迟。
<i class="fa fa-info-circle"></i>数据更新时间:{{date}},受数据波动影响,可能会有延迟。
</p>
</div>
</div>
......@@ -53,22 +50,18 @@
<script>
import Head from "./components/header.vue";
import Brokenline from "./components/line.vue";
import {getTrend} from '@/api/dataAdmin.js'
import moment from 'moment'
export default {
name: "PortalAdminVueMakeDataAnalyse",
data() {
return {
day:'0',
date:'',
BegindAndEndTime: [],
chartsData:null,
tableSourceData: [],
tableHeaders: [
{
title: "序号",
dataIndex: "index",
width: "60px",
key: "index",
align: "center",
customRender: (text, record, index) => `${index + 1}`,
},
{
title: "研究对象",
align: "center",
......@@ -106,22 +99,33 @@ export default {
Head,
Brokenline,
},
mounted() {
for (let key = 0; key < 2; key++) {
this.tableSourceData.push({
id: `00${key + 1}`,
研究对象: `预约次数${key + 1}`,
预约总量: `56 ${key + 1}`,
开放预约天数: `1 ${key + 1}`,
预约日均值: `56 ${key + 1}`,
整体同比: `23% ${key + 1}`,
整体环比: `18% ${key + 1}`,
});
watch:{
day(val){
if (val != 5) this.BegindAndEndTime = []
}
},
mounted() {
this.date = moment().format('yyyy-MM-DD hh:mm:ss')
this.getData()
},
methods: {
getData(){
getTrend({
selected:this.day == 5 ? null : this.day,
time:this.BegindAndEndTime
}).then(res=>{
this.chartsData = res.data.list
this.tableSourceData.push({
研究对象: `预约次数`,
预约总量: res.data.orderAll,
开放预约天数: res.data.openday,
预约日均值: res.data.prev_num,
整体同比: res.data.tbi,
整体环比: res.data.hbi,
});
})
},
rangePickerChange(val) {
console.log(val);
},
......@@ -141,7 +145,7 @@ export default {
.table_box {
padding: 15px;
.updateTime {
margin: 10px 0;
margin: 15px 0;
i {
margin: 0 5px;
-webkit-transform: rotate(180deg);
......
......@@ -38,7 +38,7 @@
</li>
</template>
</ul>
<p class="bottom">服务类数据分析<a-icon type="swap-right" /></p>
<p class="bottom" @click="handleCkeck('/home/dataManagement/serviceDataAnalyse/makeTrendResearch')">服务类数据分析<a-icon type="swap-right" /></p>
</li>
</ul>
......
......@@ -937,7 +937,7 @@
"@babel/types" "^7.4.4"
"esutils" "^2.0.2"
"@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.12.13", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
"integrity" "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ=="
"resolved" "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.7.tgz"
"version" "7.20.7"
......@@ -990,6 +990,51 @@
dependencies:
"@hapi/hoek" "^9.0.0"
"@jiaminghi/bezier-curve@*":
"integrity" "sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw=="
"resolved" "https://registry.npmjs.org/@jiaminghi/bezier-curve/-/bezier-curve-0.0.9.tgz"
"version" "0.0.9"
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/c-render@^0.4.3":
"integrity" "sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q=="
"resolved" "https://registry.npmjs.org/@jiaminghi/c-render/-/c-render-0.4.3.tgz"
"version" "0.4.3"
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/bezier-curve" "*"
"@jiaminghi/color" "*"
"@jiaminghi/transition" "*"
"@jiaminghi/charts@*":
"integrity" "sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA=="
"resolved" "https://registry.npmjs.org/@jiaminghi/charts/-/charts-0.2.18.tgz"
"version" "0.2.18"
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/c-render" "^0.4.3"
"@jiaminghi/color@*":
"integrity" "sha512-ZY3hdorgODk4OSTbxyXBPxAxHPIVf9rPlKJyK1C1db46a50J0reFKpAvfZG8zMG3lvM60IR7Qawgcu4ZDO3+Hg=="
"resolved" "https://registry.npmjs.org/@jiaminghi/color/-/color-1.1.3.tgz"
"version" "1.1.3"
"@jiaminghi/data-view@^2.10.0":
"integrity" "sha512-Cud2MTiMcqc5k2KWabR/svuVQmXHANqURo+yj40370/LdI/gyUJ6LG203hWXEnT1nMCeiv/SLVmxv3PXLScCeA=="
"resolved" "https://registry.npmjs.org/@jiaminghi/data-view/-/data-view-2.10.0.tgz"
"version" "2.10.0"
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/charts" "*"
"@jiaminghi/transition@*":
"integrity" "sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg=="
"resolved" "https://registry.npmjs.org/@jiaminghi/transition/-/transition-1.1.11.tgz"
"version" "1.1.11"
dependencies:
"@babel/runtime" "^7.5.5"
"@jridgewell/gen-mapping@^0.1.0":
"integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="
"resolved" "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
......
-- ----------------------------
-- 页面事件记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_event`;
CREATE TABLE mortals_xhx_page_event(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`businessCode` varchar(256) COMMENT '业务场景编码',
`businessName` varchar(256) COMMENT '业务场景名称',
`eventCode` varchar(256) COMMENT '事件编码',
`eventName` varchar(256) COMMENT '事件名称',
`takeTime` int(8) COMMENT '事件耗时(单位毫秒)',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`coordinate` varchar(128) COMMENT '事件坐标(x,y)',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='页面事件记录';
-- ----------------------------
-- 页面路径记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_route`;
CREATE TABLE mortals_xhx_page_route(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`sourceCode` varchar(256) COMMENT '开始页面编码(路由)',
`sourceName` varchar(256) COMMENT '开始页面名称',
`targetCode` varchar(256) COMMENT '目标页面编码(路由)',
`targetName` varchar(256) COMMENT '目标页面名称',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='页面路径记录';
-- ----------------------------
-- 产品页面配置表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_info`;
CREATE TABLE mortals_xhx_page_info(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`screenUrl` varchar(256) COMMENT '页面截图地址',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面配置';
-- ----------------------------
-- 产品页面访问记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_access`;
CREATE TABLE mortals_xhx_page_access(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`firstCode` varchar(256) COMMENT '页面编码(页面路由)',
`firstName` varchar(256) COMMENT '页面名称',
`secondCode` varchar(256) COMMENT '页面编码(页面路由)',
`secondName` varchar(256) COMMENT '页面名称',
`thirdCode` varchar(256) COMMENT '页面编码(页面路由)',
`thirdName` varchar(256) COMMENT '页面名称',
`fourthCode` varchar(256) COMMENT '页面编码(页面路由)',
`fourthName` varchar(256) COMMENT '页面名称',
`accessContent` text COMMENT '完整路径',
`pageDepth` int(8) DEFAULT '0' COMMENT '页面深度',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面访问记录';
-- ----------------------------
-- 产品页面配置表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_access_depth`;
CREATE TABLE mortals_xhx_page_access_depth(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`depthValue` int(8) COMMENT '本次访问深度',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面配置';
......@@ -4613,13 +4613,13 @@ msg|String|消息|-
## 用户行为分析
### 客户端埋点
**请求URL:** page/bury/save
**请求URL:** zwfw/page/bury/save
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 保存或更新页面事件记录:id为空时为新增保存,否则为更新提交
**简要描述:** 保存页面事件记录
**请求参数:**
......@@ -4708,8 +4708,955 @@ data|object|数据对象
```
### 保存页面截图
**请求URL:** zwfw/page/bury/screen/save
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 保存或更新产品页面配置:id为空时为新增保存,否则为更新提交
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
deviceNum|String|否|设备编码
productId|Long|否|产品id
productName|String|否|产品名称
pageCode|String|否|页面编码(页面路由)
pageName|String|否|页面名称
screenUrl|String|否|页面截图地址
**请求样例:**
```
{
"deviceNum":"fblh4k",
"productId":427,
"productName":"oo1k4e",
"pageCode":"5fzoqc",
"pageName":"r8smsl",
"screenUrl":"feq3hw",
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;id|Long|保存后主键id
&emsp;entity|object|保存更新实体
&emsp;&emsp;id|Long|序号,主键,自增长
&emsp;&emsp;deviceNum|String|设备编码
&emsp;&emsp;productId|Long|产品id
&emsp;&emsp;productName|String|产品名称
&emsp;&emsp;pageCode|String|页面编码(页面路由)
&emsp;&emsp;pageName|String|页面名称
&emsp;&emsp;screenUrl|String|页面截图地址
&emsp;&emsp;createUserId|Long|创建用户
&emsp;&emsp;createTime|Date|创建时间
&emsp;&emsp;updateUserId|Long|更新用户
&emsp;&emsp;updateTime|Date|更新时间
**响应消息样例:**
```
{
"msg":"新增模块成功",
"code":1,
"data":{}
}
}
```
### 事件分析
**请求URL:** zwfw/act/analyse/pageEventCensus
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询事件分析
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11"
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;data|array|数组对象
&emsp;&emsp;eventCode|String|设备编码
&emsp;&emsp;eventName|String|产品id
&emsp;&emsp;dayAvg|int|事件日均数量
&emsp;&emsp;takeTimeAvg|float|事件平均耗时(单位秒)
**响应消息样例:**
```
{
"data": {
"data": [
{
"eventCode": "Click",
"eventName": "点击",
"dayAvg": "47",
"takeTimeAvg": "0.96"
}
]
},
"code": 1,
"msg": "查询事件分析结果成功"
}
```
### 产品热力图
**请求URL:** zwfw/act/analyse/productHotCensus
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询产品热力图
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
pageCode|String|是|页面编码
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11",
"pageCode":"/"
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;data|array|数组对象
&emsp;&emsp;businessCode|String|业务编码
&emsp;&emsp;businessName|String|业务名称
&emsp;&emsp;coordinate|String|坐标信息
&emsp;&emsp;x|float|页面x坐标
&emsp;&emsp;y|float|页面y坐标
&emsp;&emsp;value|int|事件点击次数
&emsp;&emsp;proportion|String|事件占比
&emsp;clickSum|int|总点击次数
&emsp;screenUrl|String|页面截图保存地址
**响应消息样例:**
```
{
"data": {
"data": [
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "966,286",
"value": 4,
"x": 966.0,
"y": 286.0,
"proportion": "16.67%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "1844,558",
"value": 3,
"x": 1844.0,
"y": 558.0,
"proportion": "12.50%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "1861,906",
"value": 3,
"x": 1861.0,
"y": 906.0,
"proportion": "12.50%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "1073,242",
"value": 3,
"x": 1073.0,
"y": 242.0,
"proportion": "12.50%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "932,13",
"value": 2,
"x": 932.0,
"y": 13.0,
"proportion": "8.33%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "1882,900",
"value": 2,
"x": 1882.0,
"y": 900.0,
"proportion": "8.33%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "986,13",
"value": 2,
"x": 986.0,
"y": 13.0,
"proportion": "8.33%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "152,1812",
"value": 2,
"x": 152.0,
"y": 1812.0,
"proportion": "8.33%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "180,1820",
"value": 2,
"x": 180.0,
"y": 1820.0,
"proportion": "8.33%"
},
{
"businessCode": "/",
"businessName": "首页",
"coordinate": "899,337",
"value": 1,
"x": 899.0,
"y": 337.0,
"proportion": "4.17%"
}
],
"clickSum": 24,
"screenUrl": "/file/uploadfile/1681357141107.png"
},
"code": 1,
"msg": "查询产品热力图成功"
}
```
### 页面访问分析
**请求URL:** zwfw/act/analyse/accessAnalyse
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询页面访问分析
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11"
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;accessTrend|array|页面访问趋势图
&emsp;&emsp;accessDay|String|日期
&emsp;&emsp;accessCount|int|访问次数
&emsp;pageAccessTop|array|页面访问次数TOP10
&emsp;&emsp;pageCode|String|页面编码
&emsp;&emsp;pageName|String|页面名称
&emsp;&emsp;accessCount|int|访问次数
&emsp;accessSum|int|页面累计访问次数
&emsp;dayAccessAvg|float|日均访问次数
&emsp;depthAvg|float|人均访问深度
&emsp;singleDepth|float|次均访问深度
**响应消息样例:**
```
{
"data": {
"dayAccessAvg": 234.0,
"accessTrend": [
{
"accessDay": "04-12",
"accessCount": 245
},
{
"accessDay": "04-13",
"accessCount": 251
},
{
"accessDay": "04-14",
"accessCount": 206
}
],
"pageAccessTop": [
{
"pageCode": "/",
"pageName": "首页",
"accessCount": 371
},
{
"pageCode": "/floor",
"pageName": "中心导航",
"accessCount": 165
},
{
"pageCode": "/business/test001",
"pageName": "办理业务",
"accessCount": 60
},
{
"pageCode": "/business/166",
"pageName": "办理业务",
"accessCount": 24
},
{
"pageCode": "/makeTakeNum",
"pageName": "预约取号",
"accessCount": 23
},
{
"pageCode": "/Layout",
"pageName": "应用集市",
"accessCount": 22
},
{
"pageCode": "/signInWay",
"pageName": "签到方式",
"accessCount": 13
},
{
"pageCode": "/business/148",
"pageName": "办理业务",
"accessCount": 8
},
{
"pageCode": "/signInWay?matterId=34464&businessid=169&phone=1&idcardtake=1&face=0",
"pageName": "签到方式",
"accessCount": 5
},
{
"pageCode": "/signInWay?businessid=149&phone=1&idcardtake=1&face=0",
"pageName": "签到方式",
"accessCount": 4
}
],
"depthAvg": 2.08,
"accessSum": 702,
"singleDepth": 2.08
},
"code": 1,
"msg": "查询页面访问分析成功"
}
```
### 页面路径访问分析
**请求URL:** zwfw/act/analyse/wayAccessAnalyse
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询页面路径访问分析
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11"
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;data|array|页面
&emsp;&emsp;code|String|页面code
&emsp;&emsp;name|String|页面name
&emsp;links|array|页面路径
&emsp;&emsp;source|String|开始页面
&emsp;&emsp;sourceName|String|开始页面名称
&emsp;&emsp;target|String|目标页面
&emsp;&emsp;targetName|String|目标页面名称
&emsp;&emsp;value|int|访问次数
**响应消息样例:**
```
{
"data": {
"data": [
{
"code": "/",
"name": "首页"
},
{
"code": "/floor",
"name": "中心导航"
},
{
"code": "/Layout",
"name": "应用集市"
},
{
"code": "/business/test001",
"name": "办理业务"
},
{
"code": "/business/148",
"name": "办理业务"
},
{
"code": "/makeTakeNum",
"name": "预约取号"
},
{
"code": "/makeList?phone=13730664362",
"name": "预约列表"
},
{
"code": "/signInWay?businessid=149&phone=1&idcardtake=1&face=0",
"name": "签到方式"
},
{
"code": "/print?state=error",
"name": "打印"
},
{
"code": "/business/166",
"name": "办理业务"
},
{
"code": "/bizMatters?businessid=170&phone=1&idcardtake=1&face=0",
"name": "业务事项"
},
{
"code": "/bizMatters",
"name": "业务事项"
},
{
"code": "/signInWay",
"name": "签到方式"
},
{
"code": "/print",
"name": "打印"
}
],
"links": [
{
"source": "/",
"sourceName": "首页",
"target": "/",
"targetName": "首页",
"value": 143
},
{
"source": "/",
"sourceName": "首页",
"target": "/business/test001",
"targetName": "办理业务",
"value": 38
},
{
"source": "/",
"sourceName": "首页",
"target": "/floor",
"targetName": "中心导航",
"value": 142
},
{
"source": "/",
"sourceName": "首页",
"target": "/Layout",
"targetName": "应用集市",
"value": 16
},
{
"source": "/",
"sourceName": "首页",
"target": "/makeTakeNum",
"targetName": "预约取号",
"value": 8
},
{
"source": "/",
"sourceName": "首页",
"target": "/print",
"targetName": "打印",
"value": 1
},
{
"source": "/bizMatters",
"sourceName": "业务事项",
"target": "/",
"targetName": "首页",
"value": 2
},
{
"source": "/bizMatters",
"sourceName": "业务事项",
"target": "/signInWay",
"targetName": "签到方式",
"value": 8
},
{
"source": "/bizMatters?businessid=170&phone=1&idcardtake=1&face=0",
"sourceName": "业务事项",
"target": "/",
"targetName": "首页",
"value": 1
},
{
"source": "/business/148",
"sourceName": "办理业务",
"target": "/",
"targetName": "首页",
"value": 2
},
{
"source": "/business/148",
"sourceName": "办理业务",
"target": "/signInWay",
"targetName": "签到方式",
"value": 2
},
{
"source": "/business/148",
"sourceName": "办理业务",
"target": "/signInWay?businessid=149&phone=1&idcardtake=1&face=0",
"targetName": "签到方式",
"value": 1
},
{
"source": "/business/166",
"sourceName": "办理业务",
"target": "/",
"targetName": "首页",
"value": 3
},
{
"source": "/business/166",
"sourceName": "办理业务",
"target": "/bizMatters",
"targetName": "业务事项",
"value": 9
},
{
"source": "/business/166",
"sourceName": "办理业务",
"target": "/bizMatters?businessid=170&phone=1&idcardtake=1&face=0",
"targetName": "业务事项",
"value": 1
},
{
"source": "/business/test001",
"sourceName": "办理业务",
"target": "/",
"targetName": "首页",
"value": 17
},
{
"source": "/business/test001",
"sourceName": "办理业务",
"target": "/bizMatters",
"targetName": "业务事项",
"value": 1
},
{
"source": "/business/test001",
"sourceName": "办理业务",
"target": "/business/148",
"targetName": "办理业务",
"value": 5
},
{
"source": "/business/test001",
"sourceName": "办理业务",
"target": "/business/166",
"targetName": "办理业务",
"value": 13
},
{
"source": "/business/test001",
"sourceName": "办理业务",
"target": "/signInWay",
"targetName": "签到方式",
"value": 2
},
{
"source": "/floor",
"sourceName": "中心导航",
"target": "/",
"targetName": "首页",
"value": 130
},
{
"source": "/Layout",
"sourceName": "应用集市",
"target": "/",
"targetName": "首页",
"value": 16
},
{
"source": "/makeList?phone=13730664362",
"sourceName": "预约列表",
"target": "/",
"targetName": "首页",
"value": 1
},
{
"source": "/makeList?phone=13730664362",
"sourceName": "预约列表",
"target": "/makeTakeNum",
"targetName": "预约取号",
"value": 1
},
{
"source": "/makeTakeNum",
"sourceName": "预约取号",
"target": "/",
"targetName": "首页",
"value": 7
},
{
"source": "/makeTakeNum",
"sourceName": "预约取号",
"target": "/makeList?phone=13730664362",
"targetName": "预约列表",
"value": 2
},
{
"source": "/print",
"sourceName": "打印",
"target": "/",
"targetName": "首页",
"value": 3
},
{
"source": "/print?state=error",
"sourceName": "打印",
"target": "/",
"targetName": "首页",
"value": 1
},
{
"source": "/signInWay",
"sourceName": "签到方式",
"target": "/",
"targetName": "首页",
"value": 9
},
{
"source": "/signInWay",
"sourceName": "签到方式",
"target": "/print",
"targetName": "打印",
"value": 3
},
{
"source": "/signInWay?businessid=149&phone=1&idcardtake=1&face=0",
"sourceName": "签到方式",
"target": "/print?state=error",
"targetName": "打印",
"value": 1
}
]
},
"code": 1,
"msg": "查询页面路径访问分析成功"
}
```
### 页面使用习惯分析
**请求URL:** zwfw/act/analyse/usageCensus
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询页面使用习惯分析
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11"
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|array|数据对象
&emsp;businessCode|String|业务功能code
&emsp;businessName|String|业务功能name
&emsp;accessCount|int|访问次数
&emsp;proportion|String|占比
&emsp;propValue|String|占比值
**响应消息样例:**
```
{
"data": [
{
"businessCode": "/",
"businessName": "首页",
"accessCount": 2,
"proportion": "50.00%",
"propValue": 0.5
},
{
"businessCode": "/floor",
"businessName": "中心导航",
"accessCount": 1,
"proportion": "25.00%",
"propValue": 0.25
},
{
"businessCode": "/Layout",
"businessName": "中心导航",
"accessCount": 1,
"proportion": "25.00%",
"propValue": 0.25
}
],
"code": 1,
"msg": "查询页面使用习惯分析成功"
}
```
### 页面信息流分析
**请求URL:** zwfw/act/analyse/informationFlow
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询页面信息流分析
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-15",
"dateTimeEnd":"2023-04-15",
"particleType":1,
"isRatio":1
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|array|数据对象
&emsp;productId|long|产品id
&emsp;dateStr|String|分组时间
&emsp;productName|String|产品名称
&emsp;firstCode|String|一级场景code
&emsp;firstName|String|一级场景name
&emsp;secondCode|String|二级场景code
&emsp;secondName|String|二级场景name
&emsp;thirdCode|String|三级场景code
&emsp;thirdName|String|三级场景name
&emsp;fourthCode|String|四级场景code
&emsp;fourthName|String|四级场景name
&emsp;accessCount|int|访问次数,打开次数
&emsp;pageDepth|int|访问页面数
&emsp;accessRatio|int|访问次数增量
&emsp;depthRatio|int|访问页面数增量
**响应消息样例:**
```
{
"data": [
{
"deleted": 0,
"accessCount": 1,
"dateStr": "2023-04-15 21:00:00",
"timeStr": "21:00:00",
"accessRatio": 0.0,
"depthRatio": 0.0,
"productId": 1,
"productName": "导视机",
"firstCode": "/",
"firstName": "首页",
"secondCode": "/floor",
"secondName": "中心导航",
"thirdCode": "--",
"thirdName": "--",
"fourthCode": "--",
"fourthName": "--",
"pageDepth": 2
},
{
"deleted": 0,
"accessCount": 2,
"dateStr": "2023-04-15 21:10:00",
"timeStr": "21:10:00",
"accessRatio": -0.33,
"depthRatio": 0.0,
"productId": 1,
"productName": "导视机",
"firstCode": "/",
"firstName": "首页",
"secondCode": "/floor",
"secondName": "中心导航",
"thirdCode": "--",
"thirdName": "--",
"fourthCode": "--",
"fourthName": "--",
"pageDepth": 2
},
{
"deleted": 0,
"accessCount": 2,
"dateStr": "2023-04-15 21:20:00",
"timeStr": "21:20:00",
"accessRatio": -0.33,
"depthRatio": 0.0,
"productId": 1,
"productName": "导视机",
"firstCode": "/",
"firstName": "首页",
"secondCode": "/floor",
"secondName": "中心导航",
"thirdCode": "--",
"thirdName": "--",
"fourthCode": "--",
"fourthName": "--",
"pageDepth": 2
},
{
"deleted": 0,
"accessCount": 2,
"dateStr": "2023-04-15 21:30:00",
"timeStr": "21:30:00",
"accessRatio": -0.33,
"depthRatio": 0.0,
"productId": 1,
"productName": "导视机",
"firstCode": "/",
"firstName": "首页",
"secondCode": "/floor",
"secondName": "中心导航",
"thirdCode": "--",
"thirdName": "--",
"fourthCode": "--",
"fourthName": "--",
"pageDepth": 2
}
],
"code": 1,
"msg": "查询信息流分析成功"
}
```
## 字典附录
......
package com.mortals.xhx.common.utils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/***
* 测试转化图片为base64字符串
* @author Administrator
*
*/
public class ImageBase64 {
//转化图片为base64
public static String convertStr(String filePath) throws Exception {
InputStream is = new FileInputStream(filePath);
byte[] data = null;
data = new byte[is.available()];
is.read(data);
is.close();
return java.util.Base64.getEncoder().encodeToString(data);
}
//转化字符串为图片
public static String convertImg(String base64,String filePath) throws Exception {
byte[] arr = java.util.Base64.getDecoder().decode(base64);
for (int i = 0; i < arr.length; ++i) {
if (arr[i] < 0) {// 调整异常数据
arr[i] += 256;
}
}
OutputStream out = new FileOutputStream(filePath);
out.write(arr);
out.flush();
out.close();
return filePath;
}
public static void main(String[] args) throws Exception {
// String filePath = "D:\\mortals\\app\\data\\cpm\\file\\uploadfile\\test.jpg";
// System.out.println(filePath);
// String str = convertStr(filePath);
// System.out.println(str);
String ab = "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";//贴上后发现有点长,就去掉了
String filePath2 = "D:\\mortals\\app\\data\\cpm\\file\\uploadfile\\b.png";
convertImg(ab,filePath2);
}
}
......@@ -2,6 +2,8 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import java.util.List;
/**
* 产品页面配置Dao
......@@ -13,5 +15,10 @@ import java.util.List;
public interface PageAccessDao extends ICRUDDao<PageAccessEntity,Long>{
/**
* 信息流分析
* @param pdu
* @return
*/
List<PageAccessEntity> getInformationFlow(PageCensusPdu pdu);
}
......@@ -2,6 +2,9 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import java.util.List;
/**
* 产品页面配置Dao
......@@ -13,5 +16,10 @@ import java.util.List;
public interface PageAccessDepthDao extends ICRUDDao<PageAccessDepthEntity,Long>{
/**
* 人均访问深度
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getDepthAvg(PageCensusPdu pdu);
}
......@@ -2,6 +2,12 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import com.mortals.xhx.module.page.model.vo.UsageCensusVo;
import java.util.List;
/**
* 页面事件记录Dao
......@@ -13,5 +19,39 @@ import java.util.List;
public interface PageEventDao extends ICRUDDao<PageEventEntity,Long>{
/**
* 事件分析
* @param pdu
* @return
*/
List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu);
/**
* 产品热力图
* @param pdu
* @return
*/
List<ProductHotCensusVo> getProductHotCensus(PageCensusPdu pdu);
/**
* 页面访问指标趋势
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getPageAccessTrend(PageCensusPdu pdu);
/**
* 页面访问次数TOP10
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getPageAccessTop(PageCensusPdu pdu);
/**
* 使用习惯
* @param pdu
* @return
*/
List<UsageCensusVo> getUsageCensus(PageCensusPdu pdu);
}
......@@ -2,7 +2,12 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import java.util.List;
import java.util.Map;
/**
* 页面路径记录Dao
* 页面路径记录 DAO接口
......@@ -13,5 +18,17 @@ import java.util.List;
public interface PageRouteDao extends ICRUDDao<PageRouteEntity,Long>{
/**
* 路径图
* @param pdu
* @return
*/
List<PageWayCensusVo> getPageWayCensus(PageCensusPdu pdu);
/**
* 获取路径图页面名称
* @param pdu
* @return
*/
List<Map<String,Object>> getPageWayCode(PageCensusPdu pdu);
}
package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageAccessDao;
import com.mortals.xhx.module.page.model.PageAccessEntity;
......@@ -17,5 +18,8 @@ import java.util.List;
public class PageAccessDaoImpl extends BaseCRUDDaoMybatis<PageAccessEntity,Long> implements PageAccessDao {
@Override
public List<PageAccessEntity> getInformationFlow(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getInformationFlow"), pdu);
}
}
package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageAccessDepthDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
......@@ -16,6 +18,9 @@ import java.util.List;
@Repository("pageAccessDepthDao")
public class PageAccessDepthDaoImpl extends BaseCRUDDaoMybatis<PageAccessDepthEntity,Long> implements PageAccessDepthDao {
@Override
public List<AccessTrendCensusVo> getDepthAvg(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getDepthAvg"), pdu);
}
}
package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import com.mortals.xhx.module.page.model.vo.UsageCensusVo;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageEventDao;
import com.mortals.xhx.module.page.model.PageEventEntity;
......@@ -17,5 +22,30 @@ import java.util.List;
public class PageEventDaoImpl extends BaseCRUDDaoMybatis<PageEventEntity,Long> implements PageEventDao {
@Override
public List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageEventCensus"), pdu);
}
@Override
public List<ProductHotCensusVo> getProductHotCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getProductHotCensus"), pdu);
}
@Override
public List<AccessTrendCensusVo> getPageAccessTrend(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageAccessTrend"), pdu);
}
@Override
public List<AccessTrendCensusVo> getPageAccessTop(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageAccessTop"), pdu);
}
@Override
public List<UsageCensusVo> getUsageCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getUsageCensus"), pdu);
}
}
package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageRouteDao;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
import java.util.Map;
/**
* 页面路径记录DaoImpl DAO接口
*
......@@ -17,5 +21,13 @@ import java.util.List;
public class PageRouteDaoImpl extends BaseCRUDDaoMybatis<PageRouteEntity,Long> implements PageRouteDao {
@Override
public List<PageWayCensusVo> getPageWayCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageWayCensus"), pdu);
}
@Override
public List<Map<String, Object>> getPageWayCode(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageWayCode"), pdu);
}
}
......@@ -10,12 +10,16 @@ import com.mortals.xhx.module.page.model.vo.PageAccessDepthVo;
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageAccessDepthEntity extends PageAccessDepthVo {
private static final long serialVersionUID = 1L;
/**
* 设备编码
*/
private String deviceNum;
/**
* 产品id
*/
......@@ -41,6 +45,20 @@ public class PageAccessDepthEntity extends PageAccessDepthVo {
public PageAccessDepthEntity(){}
/**
* 获取 设备编码
* @return String
*/
public String getDeviceNum(){
return deviceNum;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum;
}
/**
* 获取 产品id
* @return Long
*/
......@@ -98,7 +116,7 @@ public class PageAccessDepthEntity extends PageAccessDepthVo {
}
/**
* 获取 本次访问深度
* @return String
* @return Integer
*/
public Integer getDepthValue(){
return depthValue;
......@@ -132,6 +150,7 @@ public class PageAccessDepthEntity extends PageAccessDepthVo {
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
......@@ -142,6 +161,8 @@ public class PageAccessDepthEntity extends PageAccessDepthVo {
public void initAttrValue(){
this.deviceNum = "";
this.productId = null;
this.productName = "";
......
......@@ -6,7 +6,7 @@ import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
* 产品页面配置查询对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageAccessDepthQuery extends PageAccessDepthEntity {
/** 开始 序号,主键,自增长 */
......@@ -24,6 +24,11 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
/** 序号,主键,自增长排除列表 */
private List <Long> idNotList;
/** 设备编码 */
private List<String> deviceNumList;
/** 设备编码排除列表 */
private List <String> deviceNumNotList;
/** 开始 产品id */
private Long productIdStart;
......@@ -54,11 +59,21 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
/** 页面名称排除列表 */
private List <String> pageNameNotList;
/** 本次访问深度 */
private List<Integer> depthValueList;
/** 开始 本次访问深度 */
private Integer depthValueStart;
/** 结束 本次访问深度 */
private Integer depthValueEnd;
/** 增加 本次访问深度 */
private Integer depthValueIncrement;
/** 本次访问深度列表 */
private List <Integer> depthValueList;
/** 本次访问深度排除列表 */
private List <String> depthValueNotList;
private List <Integer> depthValueNotList;
/** 开始 创建用户 */
private Long createUserIdStart;
......@@ -190,6 +205,38 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
}
/**
* 获取 设备编码
* @return deviceNumList
*/
public List<String> getDeviceNumList(){
return this.deviceNumList;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public void setDeviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
}
/**
* 获取 设备编码
* @return deviceNumNotList
*/
public List<String> getDeviceNumNotList(){
return this.deviceNumNotList;
}
/**
* 设置 设备编码
* @param deviceNumNotList
*/
public void setDeviceNumNotList(List<String> deviceNumNotList){
this.deviceNumNotList = deviceNumNotList;
}
/**
* 获取 开始 产品id
* @return productIdStart
......@@ -367,6 +414,54 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
this.pageNameNotList = pageNameNotList;
}
/**
* 获取 开始 本次访问深度
* @return depthValueStart
*/
public Integer getDepthValueStart(){
return this.depthValueStart;
}
/**
* 设置 开始 本次访问深度
* @param depthValueStart
*/
public void setDepthValueStart(Integer depthValueStart){
this.depthValueStart = depthValueStart;
}
/**
* 获取 结束 本次访问深度
* @return $depthValueEnd
*/
public Integer getDepthValueEnd(){
return this.depthValueEnd;
}
/**
* 设置 结束 本次访问深度
* @param depthValueEnd
*/
public void setDepthValueEnd(Integer depthValueEnd){
this.depthValueEnd = depthValueEnd;
}
/**
* 获取 增加 本次访问深度
* @return depthValueIncrement
*/
public Integer getDepthValueIncrement(){
return this.depthValueIncrement;
}
/**
* 设置 增加 本次访问深度
* @param depthValueIncrement
*/
public void setDepthValueIncrement(Integer depthValueIncrement){
this.depthValueIncrement = depthValueIncrement;
}
/**
* 获取 本次访问深度
* @return depthValueList
......@@ -387,7 +482,7 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
* 获取 本次访问深度
* @return depthValueNotList
*/
public List<String> getDepthValueNotList(){
public List<Integer> getDepthValueNotList(){
return this.depthValueNotList;
}
......@@ -395,10 +490,11 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
* 设置 本次访问深度
* @param depthValueNotList
*/
public void setDepthValueNotList(List<String> depthValueNotList){
public void setDepthValueNotList(List<Integer> depthValueNotList){
this.depthValueNotList = depthValueNotList;
}
/**
* 获取 开始 创建用户
* @return createUserIdStart
......@@ -679,6 +775,25 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
return this;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public PageAccessDepthQuery deviceNum(String deviceNum){
setDeviceNum(deviceNum);
return this;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public PageAccessDepthQuery deviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
return this;
}
/**
* 设置 产品id
* @param productId
......@@ -790,7 +905,6 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
return this;
}
/**
* 设置 本次访问深度
* @param depthValue
......@@ -800,6 +914,33 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
return this;
}
/**
* 设置 开始 本次访问深度
* @param depthValueStart
*/
public PageAccessDepthQuery depthValueStart(Integer depthValueStart){
this.depthValueStart = depthValueStart;
return this;
}
/**
* 设置 结束 本次访问深度
* @param depthValueEnd
*/
public PageAccessDepthQuery depthValueEnd(Integer depthValueEnd){
this.depthValueEnd = depthValueEnd;
return this;
}
/**
* 设置 增加 本次访问深度
* @param depthValueIncrement
*/
public PageAccessDepthQuery depthValueIncrement(Integer depthValueIncrement){
this.depthValueIncrement = depthValueIncrement;
return this;
}
/**
* 设置 本次访问深度
* @param depthValueList
......@@ -809,6 +950,15 @@ public class PageAccessDepthQuery extends PageAccessDepthEntity {
return this;
}
/**
* 设置 本次访问深度
* @param depthValueNotList
*/
public PageAccessDepthQuery depthValueNotList(List<Integer> depthValueNotList){
this.depthValueNotList = depthValueNotList;
return this;
}
/**
* 设置 创建用户
* @param createUserId
......
......@@ -7,15 +7,19 @@ import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.vo.PageAccessVo;
/**
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
*/
* 产品页面访问记录实体对象
*
* @author zxfei
* @date 2023-04-13
*/
public class PageAccessEntity extends PageAccessVo {
private static final long serialVersionUID = 1L;
/**
* 设备编码
*/
private String deviceNum;
/**
* 产品id
*/
......@@ -27,19 +31,61 @@ public class PageAccessEntity extends PageAccessVo {
/**
* 页面编码(页面路由)
*/
private String pageCode;
private String firstCode;
/**
* 页面名称
*/
private String pageName;
private String firstName;
/**
* 场景维度
* 页面编码(页面路由)
*/
private String secondCode;
/**
* 页面名称
*/
private String secondName;
/**
* 页面编码(页面路由)
*/
private String thirdCode;
/**
* 页面名称
*/
private Integer sceneDepth;
private String thirdName;
/**
* 页面编码(页面路由)
*/
private String fourthCode;
/**
* 页面名称
*/
private String fourthName;
/**
* 完整路径
*/
private String accessContent;
/**
* 页面深度
*/
private Integer pageDepth;
public PageAccessEntity(){}
/**
* 获取 设备编码
* @return String
*/
public String getDeviceNum(){
return deviceNum;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum;
}
/**
* 获取 产品id
* @return Long
......@@ -72,43 +118,141 @@ public class PageAccessEntity extends PageAccessVo {
* 获取 页面编码(页面路由)
* @return String
*/
public String getPageCode(){
return pageCode;
public String getFirstCode(){
return firstCode;
}
/**
* 设置 页面编码(页面路由)
* @param pageCode
* @param firstCode
*/
public void setPageCode(String pageCode){
this.pageCode = pageCode;
public void setFirstCode(String firstCode){
this.firstCode = firstCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getPageName(){
return pageName;
public String getFirstName(){
return firstName;
}
/**
* 设置 页面名称
* @param pageName
* @param firstName
*/
public void setPageName(String pageName){
this.pageName = pageName;
public void setFirstName(String firstName){
this.firstName = firstName;
}
/**
* 获取 场景维度
* 获取 页面编码(页面路由)
* @return String
*/
public String getSecondCode(){
return secondCode;
}
/**
* 设置 页面编码(页面路由)
* @param secondCode
*/
public void setSecondCode(String secondCode){
this.secondCode = secondCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getSecondName(){
return secondName;
}
/**
* 设置 页面名称
* @param secondName
*/
public void setSecondName(String secondName){
this.secondName = secondName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getThirdCode(){
return thirdCode;
}
/**
* 设置 页面编码(页面路由)
* @param thirdCode
*/
public void setThirdCode(String thirdCode){
this.thirdCode = thirdCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getThirdName(){
return thirdName;
}
/**
* 设置 页面名称
* @param thirdName
*/
public void setThirdName(String thirdName){
this.thirdName = thirdName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getFourthCode(){
return fourthCode;
}
/**
* 设置 页面编码(页面路由)
* @param fourthCode
*/
public void setFourthCode(String fourthCode){
this.fourthCode = fourthCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getFourthName(){
return fourthName;
}
/**
* 设置 页面名称
* @param fourthName
*/
public void setFourthName(String fourthName){
this.fourthName = fourthName;
}
/**
* 获取 完整路径
* @return String
*/
public String getAccessContent(){
return accessContent;
}
/**
* 设置 完整路径
* @param accessContent
*/
public void setAccessContent(String accessContent){
this.accessContent = accessContent;
}
/**
* 获取 页面深度
* @return Integer
*/
public Integer getSceneDepth(){
return sceneDepth;
public Integer getPageDepth(){
return pageDepth;
}
/**
* 设置 场景维
* @param sceneDepth
* 设置 页面深
* @param pageDepth
*/
public void setSceneDepth(Integer sceneDepth){
this.sceneDepth = sceneDepth;
public void setPageDepth(Integer pageDepth){
this.pageDepth = pageDepth;
}
......@@ -132,24 +276,48 @@ public class PageAccessEntity extends PageAccessVo {
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
sb.append(",pageName:").append(getPageName());
sb.append(",sceneDepth:").append(getSceneDepth());
sb.append(",firstCode:").append(getFirstCode());
sb.append(",firstName:").append(getFirstName());
sb.append(",secondCode:").append(getSecondCode());
sb.append(",secondName:").append(getSecondName());
sb.append(",thirdCode:").append(getThirdCode());
sb.append(",thirdName:").append(getThirdName());
sb.append(",fourthCode:").append(getFourthCode());
sb.append(",fourthName:").append(getFourthName());
sb.append(",accessContent:").append(getAccessContent());
sb.append(",pageDepth:").append(getPageDepth());
return sb.toString();
}
public void initAttrValue(){
this.deviceNum = "";
this.productId = null;
this.productName = "";
this.pageCode = "";
this.firstCode = "";
this.firstName = "";
this.secondCode = "";
this.secondName = "";
this.thirdCode = "";
this.thirdName = "";
this.fourthCode = "";
this.fourthName = "";
this.pageName = "";
this.accessContent = "";
this.sceneDepth = 0;
this.pageDepth = 0;
}
}
\ No newline at end of file
......@@ -3,11 +3,11 @@ package com.mortals.xhx.module.page.model;
import java.util.List;
import com.mortals.xhx.module.page.model.PageAccessEntity;
/**
* 产品页面配置查询对象
*
* @author zxfei
* @date 2023-04-10
*/
* 产品页面访问记录查询对象
*
* @author zxfei
* @date 2023-04-13
*/
public class PageAccessQuery extends PageAccessEntity {
/** 开始 序号,主键,自增长 */
private Long idStart;
......@@ -24,6 +24,11 @@ public class PageAccessQuery extends PageAccessEntity {
/** 序号,主键,自增长排除列表 */
private List <Long> idNotList;
/** 设备编码 */
private List<String> deviceNumList;
/** 设备编码排除列表 */
private List <String> deviceNumNotList;
/** 开始 产品id */
private Long productIdStart;
......@@ -45,29 +50,64 @@ public class PageAccessQuery extends PageAccessEntity {
/** 产品名称排除列表 */
private List <String> productNameNotList;
/** 页面编码(页面路由) */
private List<String> pageCodeList;
private List<String> firstCodeList;
/** 页面编码(页面路由)排除列表 */
private List <String> firstCodeNotList;
/** 页面名称 */
private List<String> firstNameList;
/** 页面名称排除列表 */
private List <String> firstNameNotList;
/** 页面编码(页面路由) */
private List<String> secondCodeList;
/** 页面编码(页面路由)排除列表 */
private List <String> secondCodeNotList;
/** 页面名称 */
private List<String> secondNameList;
/** 页面名称排除列表 */
private List <String> secondNameNotList;
/** 页面编码(页面路由) */
private List<String> thirdCodeList;
/** 页面编码(页面路由)排除列表 */
private List <String> pageCodeNotList;
private List <String> thirdCodeNotList;
/** 页面名称 */
private List<String> pageNameList;
private List<String> thirdNameList;
/** 页面名称排除列表 */
private List <String> pageNameNotList;
/** 开始 场景维度 */
private Integer sceneDepthStart;
private List <String> thirdNameNotList;
/** 页面编码(页面路由) */
private List<String> fourthCodeList;
/** 结束 场景维度 */
private Integer sceneDepthEnd;
/** 页面编码(页面路由)排除列表 */
private List <String> fourthCodeNotList;
/** 页面名称 */
private List<String> fourthNameList;
/** 增加 场景维度 */
private Integer sceneDepthIncrement;
/** 页面名称排除列表 */
private List <String> fourthNameNotList;
/** 完整路径 */
private List<String> accessContentList;
/** 场景维度列表 */
private List <Integer> sceneDepthList;
/** 完整路径排除列表 */
private List <String> accessContentNotList;
/** 开始 页面深度 */
private Integer pageDepthStart;
/** 场景维度排除列表 */
private List <Integer> sceneDepthNotList;
/** 结束 页面深度 */
private Integer pageDepthEnd;
/** 增加 页面深度 */
private Integer pageDepthIncrement;
/** 页面深度列表 */
private List <Integer> pageDepthList;
/** 页面深度排除列表 */
private List <Integer> pageDepthNotList;
/** 开始 创建用户 */
private Long createUserIdStart;
......@@ -200,6 +240,38 @@ public class PageAccessQuery extends PageAccessEntity {
}
/**
* 获取 设备编码
* @return deviceNumList
*/
public List<String> getDeviceNumList(){
return this.deviceNumList;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public void setDeviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
}
/**
* 获取 设备编码
* @return deviceNumNotList
*/
public List<String> getDeviceNumNotList(){
return this.deviceNumNotList;
}
/**
* 设置 设备编码
* @param deviceNumNotList
*/
public void setDeviceNumNotList(List<String> deviceNumNotList){
this.deviceNumNotList = deviceNumNotList;
}
/**
* 获取 开始 产品id
* @return productIdStart
......@@ -315,146 +387,370 @@ public class PageAccessQuery extends PageAccessEntity {
/**
* 获取 页面编码(页面路由)
* @return pageCodeList
* @return firstCodeList
*/
public List<String> getPageCodeList(){
return this.pageCodeList;
public List<String> getFirstCodeList(){
return this.firstCodeList;
}
/**
* 设置 页面编码(页面路由)
* @param pageCodeList
* @param firstCodeList
*/
public void setPageCodeList(List<String> pageCodeList){
this.pageCodeList = pageCodeList;
public void setFirstCodeList(List<String> firstCodeList){
this.firstCodeList = firstCodeList;
}
/**
* 获取 页面编码(页面路由)
* @return pageCodeNotList
* @return firstCodeNotList
*/
public List<String> getPageCodeNotList(){
return this.pageCodeNotList;
public List<String> getFirstCodeNotList(){
return this.firstCodeNotList;
}
/**
* 设置 页面编码(页面路由)
* @param pageCodeNotList
* @param firstCodeNotList
*/
public void setPageCodeNotList(List<String> pageCodeNotList){
this.pageCodeNotList = pageCodeNotList;
public void setFirstCodeNotList(List<String> firstCodeNotList){
this.firstCodeNotList = firstCodeNotList;
}
/**
* 获取 页面名称
* @return pageNameList
* @return firstNameList
*/
public List<String> getPageNameList(){
return this.pageNameList;
public List<String> getFirstNameList(){
return this.firstNameList;
}
/**
* 设置 页面名称
* @param pageNameList
* @param firstNameList
*/
public void setPageNameList(List<String> pageNameList){
this.pageNameList = pageNameList;
public void setFirstNameList(List<String> firstNameList){
this.firstNameList = firstNameList;
}
/**
* 获取 页面名称
* @return pageNameNotList
* @return firstNameNotList
*/
public List<String> getPageNameNotList(){
return this.pageNameNotList;
public List<String> getFirstNameNotList(){
return this.firstNameNotList;
}
/**
* 设置 页面名称
* @param pageNameNotList
* @param firstNameNotList
*/
public void setFirstNameNotList(List<String> firstNameNotList){
this.firstNameNotList = firstNameNotList;
}
/**
* 获取 页面编码(页面路由)
* @return secondCodeList
*/
public List<String> getSecondCodeList(){
return this.secondCodeList;
}
/**
* 设置 页面编码(页面路由)
* @param secondCodeList
*/
public void setSecondCodeList(List<String> secondCodeList){
this.secondCodeList = secondCodeList;
}
/**
* 获取 页面编码(页面路由)
* @return secondCodeNotList
*/
public void setPageNameNotList(List<String> pageNameNotList){
this.pageNameNotList = pageNameNotList;
public List<String> getSecondCodeNotList(){
return this.secondCodeNotList;
}
/**
* 获取 开始 场景维度
* @return sceneDepthStart
* 设置 页面编码(页面路由)
* @param secondCodeNotList
*/
public Integer getSceneDepthStart(){
return this.sceneDepthStart;
public void setSecondCodeNotList(List<String> secondCodeNotList){
this.secondCodeNotList = secondCodeNotList;
}
/**
* 设置 开始 场景维度
* @param sceneDepthStart
* 获取 页面名称
* @return secondNameList
*/
public void setSceneDepthStart(Integer sceneDepthStart){
this.sceneDepthStart = sceneDepthStart;
public List<String> getSecondNameList(){
return this.secondNameList;
}
/**
* 获取 结束 场景维度
* @return $sceneDepthEnd
* 设置 页面名称
* @param secondNameList
*/
public Integer getSceneDepthEnd(){
return this.sceneDepthEnd;
public void setSecondNameList(List<String> secondNameList){
this.secondNameList = secondNameList;
}
/**
* 设置 结束 场景维度
* @param sceneDepthEnd
* 获取 页面名称
* @return secondNameNotList
*/
public void setSceneDepthEnd(Integer sceneDepthEnd){
this.sceneDepthEnd = sceneDepthEnd;
public List<String> getSecondNameNotList(){
return this.secondNameNotList;
}
/**
* 获取 增加 场景维度
* @return sceneDepthIncrement
* 设置 页面名称
* @param secondNameNotList
*/
public Integer getSceneDepthIncrement(){
return this.sceneDepthIncrement;
public void setSecondNameNotList(List<String> secondNameNotList){
this.secondNameNotList = secondNameNotList;
}
/**
* 设置 增加 场景维度
* @param sceneDepthIncrement
* 获取 页面编码(页面路由)
* @return thirdCodeList
*/
public void setSceneDepthIncrement(Integer sceneDepthIncrement){
this.sceneDepthIncrement = sceneDepthIncrement;
public List<String> getThirdCodeList(){
return this.thirdCodeList;
}
/**
* 获取 场景维度
* @return sceneDepthList
* 设置 页面编码(页面路由)
* @param thirdCodeList
*/
public List<Integer> getSceneDepthList(){
return this.sceneDepthList;
public void setThirdCodeList(List<String> thirdCodeList){
this.thirdCodeList = thirdCodeList;
}
/**
* 设置 场景维度
* @param sceneDepthList
* 获取 页面编码(页面路由)
* @return thirdCodeNotList
*/
public void setSceneDepthList(List<Integer> sceneDepthList){
this.sceneDepthList = sceneDepthList;
public List<String> getThirdCodeNotList(){
return this.thirdCodeNotList;
}
/**
* 获取 场景维度
* @return sceneDepthNotList
* 设置 页面编码(页面路由)
* @param thirdCodeNotList
*/
public List<Integer> getSceneDepthNotList(){
return this.sceneDepthNotList;
public void setThirdCodeNotList(List<String> thirdCodeNotList){
this.thirdCodeNotList = thirdCodeNotList;
}
/**
* 设置 场景维度
* @param sceneDepthNotList
* 获取 页面名称
* @return thirdNameList
*/
public void setSceneDepthNotList(List<Integer> sceneDepthNotList){
this.sceneDepthNotList = sceneDepthNotList;
public List<String> getThirdNameList(){
return this.thirdNameList;
}
/**
* 设置 页面名称
* @param thirdNameList
*/
public void setThirdNameList(List<String> thirdNameList){
this.thirdNameList = thirdNameList;
}
/**
* 获取 页面名称
* @return thirdNameNotList
*/
public List<String> getThirdNameNotList(){
return this.thirdNameNotList;
}
/**
* 设置 页面名称
* @param thirdNameNotList
*/
public void setThirdNameNotList(List<String> thirdNameNotList){
this.thirdNameNotList = thirdNameNotList;
}
/**
* 获取 页面编码(页面路由)
* @return fourthCodeList
*/
public List<String> getFourthCodeList(){
return this.fourthCodeList;
}
/**
* 设置 页面编码(页面路由)
* @param fourthCodeList
*/
public void setFourthCodeList(List<String> fourthCodeList){
this.fourthCodeList = fourthCodeList;
}
/**
* 获取 页面编码(页面路由)
* @return fourthCodeNotList
*/
public List<String> getFourthCodeNotList(){
return this.fourthCodeNotList;
}
/**
* 设置 页面编码(页面路由)
* @param fourthCodeNotList
*/
public void setFourthCodeNotList(List<String> fourthCodeNotList){
this.fourthCodeNotList = fourthCodeNotList;
}
/**
* 获取 页面名称
* @return fourthNameList
*/
public List<String> getFourthNameList(){
return this.fourthNameList;
}
/**
* 设置 页面名称
* @param fourthNameList
*/
public void setFourthNameList(List<String> fourthNameList){
this.fourthNameList = fourthNameList;
}
/**
* 获取 页面名称
* @return fourthNameNotList
*/
public List<String> getFourthNameNotList(){
return this.fourthNameNotList;
}
/**
* 设置 页面名称
* @param fourthNameNotList
*/
public void setFourthNameNotList(List<String> fourthNameNotList){
this.fourthNameNotList = fourthNameNotList;
}
/**
* 获取 完整路径
* @return accessContentList
*/
public List<String> getAccessContentList(){
return this.accessContentList;
}
/**
* 设置 完整路径
* @param accessContentList
*/
public void setAccessContentList(List<String> accessContentList){
this.accessContentList = accessContentList;
}
/**
* 获取 完整路径
* @return accessContentNotList
*/
public List<String> getAccessContentNotList(){
return this.accessContentNotList;
}
/**
* 设置 完整路径
* @param accessContentNotList
*/
public void setAccessContentNotList(List<String> accessContentNotList){
this.accessContentNotList = accessContentNotList;
}
/**
* 获取 开始 页面深度
* @return pageDepthStart
*/
public Integer getPageDepthStart(){
return this.pageDepthStart;
}
/**
* 设置 开始 页面深度
* @param pageDepthStart
*/
public void setPageDepthStart(Integer pageDepthStart){
this.pageDepthStart = pageDepthStart;
}
/**
* 获取 结束 页面深度
* @return $pageDepthEnd
*/
public Integer getPageDepthEnd(){
return this.pageDepthEnd;
}
/**
* 设置 结束 页面深度
* @param pageDepthEnd
*/
public void setPageDepthEnd(Integer pageDepthEnd){
this.pageDepthEnd = pageDepthEnd;
}
/**
* 获取 增加 页面深度
* @return pageDepthIncrement
*/
public Integer getPageDepthIncrement(){
return this.pageDepthIncrement;
}
/**
* 设置 增加 页面深度
* @param pageDepthIncrement
*/
public void setPageDepthIncrement(Integer pageDepthIncrement){
this.pageDepthIncrement = pageDepthIncrement;
}
/**
* 获取 页面深度
* @return pageDepthList
*/
public List<Integer> getPageDepthList(){
return this.pageDepthList;
}
/**
* 设置 页面深度
* @param pageDepthList
*/
public void setPageDepthList(List<Integer> pageDepthList){
this.pageDepthList = pageDepthList;
}
/**
* 获取 页面深度
* @return pageDepthNotList
*/
public List<Integer> getPageDepthNotList(){
return this.pageDepthNotList;
}
/**
* 设置 页面深度
* @param pageDepthNotList
*/
public void setPageDepthNotList(List<Integer> pageDepthNotList){
this.pageDepthNotList = pageDepthNotList;
}
......@@ -738,6 +1034,25 @@ public class PageAccessQuery extends PageAccessEntity {
return this;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public PageAccessQuery deviceNum(String deviceNum){
setDeviceNum(deviceNum);
return this;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public PageAccessQuery deviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
return this;
}
/**
* 设置 产品id
* @param productId
......@@ -814,92 +1129,225 @@ public class PageAccessQuery extends PageAccessEntity {
/**
* 设置 页面编码(页面路由)
* @param pageCode
* @param firstCode
*/
public PageAccessQuery firstCode(String firstCode){
setFirstCode(firstCode);
return this;
}
/**
* 设置 页面编码(页面路由)
* @param firstCodeList
*/
public PageAccessQuery firstCodeList(List<String> firstCodeList){
this.firstCodeList = firstCodeList;
return this;
}
/**
* 设置 页面名称
* @param firstName
*/
public PageAccessQuery firstName(String firstName){
setFirstName(firstName);
return this;
}
/**
* 设置 页面名称
* @param firstNameList
*/
public PageAccessQuery firstNameList(List<String> firstNameList){
this.firstNameList = firstNameList;
return this;
}
/**
* 设置 页面编码(页面路由)
* @param secondCode
*/
public PageAccessQuery secondCode(String secondCode){
setSecondCode(secondCode);
return this;
}
/**
* 设置 页面编码(页面路由)
* @param secondCodeList
*/
public PageAccessQuery secondCodeList(List<String> secondCodeList){
this.secondCodeList = secondCodeList;
return this;
}
/**
* 设置 页面名称
* @param secondName
*/
public PageAccessQuery secondName(String secondName){
setSecondName(secondName);
return this;
}
/**
* 设置 页面名称
* @param secondNameList
*/
public PageAccessQuery secondNameList(List<String> secondNameList){
this.secondNameList = secondNameList;
return this;
}
/**
* 设置 页面编码(页面路由)
* @param thirdCode
*/
public PageAccessQuery thirdCode(String thirdCode){
setThirdCode(thirdCode);
return this;
}
/**
* 设置 页面编码(页面路由)
* @param thirdCodeList
*/
public PageAccessQuery thirdCodeList(List<String> thirdCodeList){
this.thirdCodeList = thirdCodeList;
return this;
}
/**
* 设置 页面名称
* @param thirdName
*/
public PageAccessQuery thirdName(String thirdName){
setThirdName(thirdName);
return this;
}
/**
* 设置 页面名称
* @param thirdNameList
*/
public PageAccessQuery thirdNameList(List<String> thirdNameList){
this.thirdNameList = thirdNameList;
return this;
}
/**
* 设置 页面编码(页面路由)
* @param fourthCode
*/
public PageAccessQuery pageCode(String pageCode){
setPageCode(pageCode);
public PageAccessQuery fourthCode(String fourthCode){
setFourthCode(fourthCode);
return this;
}
/**
* 设置 页面编码(页面路由)
* @param pageCodeList
* @param fourthCodeList
*/
public PageAccessQuery pageCodeList(List<String> pageCodeList){
this.pageCodeList = pageCodeList;
public PageAccessQuery fourthCodeList(List<String> fourthCodeList){
this.fourthCodeList = fourthCodeList;
return this;
}
/**
* 设置 页面名称
* @param pageName
* @param fourthName
*/
public PageAccessQuery pageName(String pageName){
setPageName(pageName);
public PageAccessQuery fourthName(String fourthName){
setFourthName(fourthName);
return this;
}
/**
* 设置 页面名称
* @param pageNameList
* @param fourthNameList
*/
public PageAccessQuery fourthNameList(List<String> fourthNameList){
this.fourthNameList = fourthNameList;
return this;
}
/**
* 设置 完整路径
* @param accessContent
*/
public PageAccessQuery accessContent(String accessContent){
setAccessContent(accessContent);
return this;
}
/**
* 设置 完整路径
* @param accessContentList
*/
public PageAccessQuery pageNameList(List<String> pageNameList){
this.pageNameList = pageNameList;
public PageAccessQuery accessContentList(List<String> accessContentList){
this.accessContentList = accessContentList;
return this;
}
/**
* 设置 场景维
* @param sceneDepth
* 设置 页面深
* @param pageDepth
*/
public PageAccessQuery sceneDepth(Integer sceneDepth){
setSceneDepth(sceneDepth);
public PageAccessQuery pageDepth(Integer pageDepth){
setPageDepth(pageDepth);
return this;
}
/**
* 设置 开始 场景维
* @param sceneDepthStart
* 设置 开始 页面深
* @param pageDepthStart
*/
public PageAccessQuery sceneDepthStart(Integer sceneDepthStart){
this.sceneDepthStart = sceneDepthStart;
public PageAccessQuery pageDepthStart(Integer pageDepthStart){
this.pageDepthStart = pageDepthStart;
return this;
}
/**
* 设置 结束 场景维
* @param sceneDepthEnd
* 设置 结束 页面深
* @param pageDepthEnd
*/
public PageAccessQuery sceneDepthEnd(Integer sceneDepthEnd){
this.sceneDepthEnd = sceneDepthEnd;
public PageAccessQuery pageDepthEnd(Integer pageDepthEnd){
this.pageDepthEnd = pageDepthEnd;
return this;
}
/**
* 设置 增加 场景维
* @param sceneDepthIncrement
* 设置 增加 页面深
* @param pageDepthIncrement
*/
public PageAccessQuery sceneDepthIncrement(Integer sceneDepthIncrement){
this.sceneDepthIncrement = sceneDepthIncrement;
public PageAccessQuery pageDepthIncrement(Integer pageDepthIncrement){
this.pageDepthIncrement = pageDepthIncrement;
return this;
}
/**
* 设置 场景维
* @param sceneDepthList
* 设置 页面深
* @param pageDepthList
*/
public PageAccessQuery sceneDepthList(List<Integer> sceneDepthList){
this.sceneDepthList = sceneDepthList;
public PageAccessQuery pageDepthList(List<Integer> pageDepthList){
this.pageDepthList = pageDepthList;
return this;
}
/**
* 设置 场景维
* @param sceneDepthNotList
* 设置 页面深
* @param pageDepthNotList
*/
public PageAccessQuery sceneDepthNotList(List<Integer> sceneDepthNotList){
this.sceneDepthNotList = sceneDepthNotList;
public PageAccessQuery pageDepthNotList(List<Integer> pageDepthNotList){
this.pageDepthNotList = pageDepthNotList;
return this;
}
......
......@@ -10,12 +10,16 @@ import com.mortals.xhx.module.page.model.vo.PageEventVo;
* 页面事件记录实体对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageEventEntity extends PageEventVo {
private static final long serialVersionUID = 1L;
/**
* 设备编码
*/
private String deviceNum;
/**
* 产品id
*/
......@@ -61,6 +65,20 @@ public class PageEventEntity extends PageEventVo {
public PageEventEntity(){}
/**
* 获取 设备编码
* @return String
*/
public String getDeviceNum(){
return deviceNum;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum;
}
/**
* 获取 产品id
* @return Long
*/
......@@ -222,6 +240,7 @@ public class PageEventEntity extends PageEventVo {
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",businessCode:").append(getBusinessCode());
......@@ -237,6 +256,8 @@ public class PageEventEntity extends PageEventVo {
public void initAttrValue(){
this.deviceNum = "";
this.productId = null;
this.productName = "";
......
......@@ -6,7 +6,7 @@ import com.mortals.xhx.module.page.model.PageEventEntity;
* 页面事件记录查询对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageEventQuery extends PageEventEntity {
/** 开始 序号,主键,自增长 */
......@@ -24,6 +24,11 @@ public class PageEventQuery extends PageEventEntity {
/** 序号,主键,自增长排除列表 */
private List <Long> idNotList;
/** 设备编码 */
private List<String> deviceNumList;
/** 设备编码排除列表 */
private List <String> deviceNumNotList;
/** 开始 产品id */
private Long productIdStart;
......@@ -225,6 +230,38 @@ public class PageEventQuery extends PageEventEntity {
}
/**
* 获取 设备编码
* @return deviceNumList
*/
public List<String> getDeviceNumList(){
return this.deviceNumList;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public void setDeviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
}
/**
* 获取 设备编码
* @return deviceNumNotList
*/
public List<String> getDeviceNumNotList(){
return this.deviceNumNotList;
}
/**
* 设置 设备编码
* @param deviceNumNotList
*/
public void setDeviceNumNotList(List<String> deviceNumNotList){
this.deviceNumNotList = deviceNumNotList;
}
/**
* 获取 开始 产品id
* @return productIdStart
......@@ -923,6 +960,25 @@ public class PageEventQuery extends PageEventEntity {
return this;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public PageEventQuery deviceNum(String deviceNum){
setDeviceNum(deviceNum);
return this;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public PageEventQuery deviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
return this;
}
/**
* 设置 产品id
* @param productId
......
......@@ -10,12 +10,16 @@ import com.mortals.xhx.module.page.model.vo.PageInfoVo;
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageInfoEntity extends PageInfoVo {
private static final long serialVersionUID = 1L;
/**
* 设备编码
*/
private String deviceNum;
/**
* 产品id
*/
......@@ -41,6 +45,20 @@ public class PageInfoEntity extends PageInfoVo {
public PageInfoEntity(){}
/**
* 获取 设备编码
* @return String
*/
public String getDeviceNum(){
return deviceNum;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum;
}
/**
* 获取 产品id
* @return Long
*/
......@@ -132,6 +150,7 @@ public class PageInfoEntity extends PageInfoVo {
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
......@@ -142,6 +161,8 @@ public class PageInfoEntity extends PageInfoVo {
public void initAttrValue(){
this.deviceNum = "";
this.productId = null;
this.productName = "";
......
......@@ -6,7 +6,7 @@ import com.mortals.xhx.module.page.model.PageInfoEntity;
* 产品页面配置查询对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageInfoQuery extends PageInfoEntity {
/** 开始 序号,主键,自增长 */
......@@ -24,6 +24,11 @@ public class PageInfoQuery extends PageInfoEntity {
/** 序号,主键,自增长排除列表 */
private List <Long> idNotList;
/** 设备编码 */
private List<String> deviceNumList;
/** 设备编码排除列表 */
private List <String> deviceNumNotList;
/** 开始 产品id */
private Long productIdStart;
......@@ -190,6 +195,38 @@ public class PageInfoQuery extends PageInfoEntity {
}
/**
* 获取 设备编码
* @return deviceNumList
*/
public List<String> getDeviceNumList(){
return this.deviceNumList;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public void setDeviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
}
/**
* 获取 设备编码
* @return deviceNumNotList
*/
public List<String> getDeviceNumNotList(){
return this.deviceNumNotList;
}
/**
* 设置 设备编码
* @param deviceNumNotList
*/
public void setDeviceNumNotList(List<String> deviceNumNotList){
this.deviceNumNotList = deviceNumNotList;
}
/**
* 获取 开始 产品id
* @return productIdStart
......@@ -679,6 +716,25 @@ public class PageInfoQuery extends PageInfoEntity {
return this;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public PageInfoQuery deviceNum(String deviceNum){
setDeviceNum(deviceNum);
return this;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public PageInfoQuery deviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
return this;
}
/**
* 设置 产品id
* @param productId
......
......@@ -10,12 +10,16 @@ import com.mortals.xhx.module.page.model.vo.PageRouteVo;
* 页面路径记录实体对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageRouteEntity extends PageRouteVo {
private static final long serialVersionUID = 1L;
/**
* 设备编码
*/
private String deviceNum;
/**
* 产品id
*/
......@@ -45,6 +49,20 @@ public class PageRouteEntity extends PageRouteVo {
public PageRouteEntity(){}
/**
* 获取 设备编码
* @return String
*/
public String getDeviceNum(){
return deviceNum;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum;
}
/**
* 获取 产品id
* @return Long
*/
......@@ -116,7 +134,7 @@ public class PageRouteEntity extends PageRouteVo {
}
/**
* 获取 目标页面名称
* @return Integer
* @return String
*/
public String getTargetName(){
return targetName;
......@@ -150,6 +168,7 @@ public class PageRouteEntity extends PageRouteVo {
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",sourceCode:").append(getSourceCode());
......@@ -161,6 +180,8 @@ public class PageRouteEntity extends PageRouteVo {
public void initAttrValue(){
this.deviceNum = "";
this.productId = null;
this.productName = "";
......
......@@ -6,7 +6,7 @@ import com.mortals.xhx.module.page.model.PageRouteEntity;
* 页面路径记录查询对象
*
* @author zxfei
* @date 2023-04-10
* @date 2023-04-12
*/
public class PageRouteQuery extends PageRouteEntity {
/** 开始 序号,主键,自增长 */
......@@ -24,6 +24,11 @@ public class PageRouteQuery extends PageRouteEntity {
/** 序号,主键,自增长排除列表 */
private List <Long> idNotList;
/** 设备编码 */
private List<String> deviceNumList;
/** 设备编码排除列表 */
private List <String> deviceNumNotList;
/** 开始 产品id */
private Long productIdStart;
......@@ -59,13 +64,11 @@ public class PageRouteQuery extends PageRouteEntity {
/** 目标页面编码(路由)排除列表 */
private List <String> targetCodeNotList;
/** 目标页面名称列表 */
private List <String> targetNameList;
/** 目标页面名称 */
private List<String> targetNameList;
/** 目标页面名称排除列表 */
private List <String> targetNameNotList;
/** 开始 创建用户 */
private Long createUserIdStart;
......@@ -197,6 +200,38 @@ public class PageRouteQuery extends PageRouteEntity {
}
/**
* 获取 设备编码
* @return deviceNumList
*/
public List<String> getDeviceNumList(){
return this.deviceNumList;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public void setDeviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
}
/**
* 获取 设备编码
* @return deviceNumNotList
*/
public List<String> getDeviceNumNotList(){
return this.deviceNumNotList;
}
/**
* 设置 设备编码
* @param deviceNumNotList
*/
public void setDeviceNumNotList(List<String> deviceNumNotList){
this.deviceNumNotList = deviceNumNotList;
}
/**
* 获取 开始 产品id
* @return productIdStart
......@@ -406,7 +441,6 @@ public class PageRouteQuery extends PageRouteEntity {
this.targetCodeNotList = targetCodeNotList;
}
/**
* 获取 目标页面名称
* @return targetNameList
......@@ -439,7 +473,6 @@ public class PageRouteQuery extends PageRouteEntity {
this.targetNameNotList = targetNameNotList;
}
/**
* 获取 开始 创建用户
* @return createUserIdStart
......@@ -720,6 +753,25 @@ public class PageRouteQuery extends PageRouteEntity {
return this;
}
/**
* 设置 设备编码
* @param deviceNum
*/
public PageRouteQuery deviceNum(String deviceNum){
setDeviceNum(deviceNum);
return this;
}
/**
* 设置 设备编码
* @param deviceNumList
*/
public PageRouteQuery deviceNumList(List<String> deviceNumList){
this.deviceNumList = deviceNumList;
return this;
}
/**
* 设置 产品id
* @param productId
......@@ -850,6 +902,7 @@ public class PageRouteQuery extends PageRouteEntity {
return this;
}
/**
* 设置 目标页面名称
* @param targetName
......@@ -868,15 +921,6 @@ public class PageRouteQuery extends PageRouteEntity {
return this;
}
/**
* 设置 目标页面名称
* @param targetNameNotList
*/
public PageRouteQuery targetNameNotList(List<String> targetNameNotList){
this.targetNameNotList = targetNameNotList;
return this;
}
/**
* 设置 创建用户
* @param createUserId
......
package com.mortals.xhx.module.page.model.pdu;
import lombok.Data;
@Data
public class AccessPdu {
/*** 页面编码(页面路由) */
private String pageCode;
/** 页面名称 */
private String pageName;
}
package com.mortals.xhx.module.page.model.pdu;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.*;
import lombok.Data;
import java.util.List;
/***
* 页面数据埋点信息
*/
@Data
public class BuryPointPdu {
/** 设备编号 */
private String deviceNum;
/*** 产品id */
private Long productId;
/*** 产品名称 */
......@@ -27,4 +28,6 @@ public class BuryPointPdu {
private PageEventEntity eventInfo;
/** 产品页面访问深度 **/
private PageRouteEntity routeInfo;
/** 场景深度 **/
private List<PageRouteEntity> depthArr;
}
package com.mortals.xhx.module.page.model.pdu;
import lombok.Data;
import java.util.List;
/**
* 页面统计查询
*/
@Data
public class PageCensusPdu {
/*** 产品id */
private Long productId;
/** 查询日期开始 **/
private String dateTimeStart;
/** 查询日期结束 **/
private String dateTimeEnd;
/** 页面编码 **/
private String pageCode;
/** 颗粒度 **/
private Integer particleSize;
/** 颗粒度 **/
private Integer particleType;
/** 是否开启对比 **/
private Integer isRatio;
/** 业务编码 **/
private String businessCode;
private List<String> businessCodeList;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 页面访问指标趋势
*/
@Data
public class AccessTrendCensusVo {
/**
* 页面编码(页面路由)
*/
private String pageCode;
/**
* 页面名称
*/
private String pageName;
/** 访问日期 */
private String accessDay;
/** 访问次数 */
private Integer accessCount;
/** 人均访问深度 */
private Float depthAvg;
/** 次均访问深度 */
private Float singleDepth;
}
package com.mortals.xhx.module.page.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
/**
* 产品页面配置视图对象
*
* @author zxfei
* @date 2023-04-10
*/
@Data
public class PageAccessVo extends BaseEntityLong {
/** 访问次数 */
private Integer accessCount;
/** 统计显示日期 */
private String dateStr;
/** 统计显示时间 */
private String timeStr;
/** 访问人数增长度 */
private float accessRatio;
/** 页面数量增长度 */
private float depthRatio;
}
\ No newline at end of file
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 事件分析
*/
@Data
public class PageEventCensusVo {
/**
* 事件编码
*/
private String eventCode;
/**
* 事件名称
*/
private String eventName;
/**
* 事件日均数量
*/
private Integer dayAvg;
/**
* 事件平均耗时(单位毫秒)
*/
private Float takeTimeAvg;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 路径
*/
@Data
public class PageWayCensusVo {
/**
* 开始页面编码(路由)
*/
private String source;
/**
* 开始页面名称
*/
private String sourceName;
/**
* 目标页面编码(路由)
*/
private String target;
/**
* 目标页面名称
*/
private String targetName;
/**
* 点击次数
*/
private Integer value;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 产品热力图
*/
@Data
public class ProductHotCensusVo {
/**
* 业务场景编码
*/
private String businessCode;
/**
* 业务场景名称
*/
private String businessName;
/**
* 事件坐标
*/
private String coordinate;
/**
* 点击次数
*/
private Integer value;
/** 页面x坐标 */
private Float x;
/** 页面y坐标 */
private Float y;
/** 事件占比 */
private String proportion;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
@Data
public class UsageCensusVo {
/*** 业务场景编码 */
private String businessCode;
/*** 业务场景名称 */
private String businessName;
/** 点击次数 */
private Integer accessCount;
/** 点击占比 */
private String proportion;
/** 点击占比 */
private float propValue;
}
......@@ -2,6 +2,9 @@ package com.mortals.xhx.module.page.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import java.util.List;
/**
* PageAccessService
......@@ -14,4 +17,11 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
public interface PageAccessService extends ICRUDService<PageAccessEntity,Long>{
PageAccessEntity saveByPdu(BuryPointPdu pdu);
/**
* 信息流分析
* @param pdu
* @return
*/
List<PageAccessEntity> getInformationFlow(PageCensusPdu pdu);
}
\ No newline at end of file
package com.mortals.xhx.module.page.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import com.mortals.xhx.module.page.model.vo.UsageCensusVo;
import java.util.List;
import java.util.Map;
/**
* PageEventService
......@@ -14,4 +22,33 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
public interface PageEventService extends ICRUDService<PageEventEntity,Long>{
PageEventEntity saveByPdu(BuryPointPdu pdu);
/**
* 事件分析
* @param pdu
* @return
*/
List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) throws AppException;
/**
* 产品热力图
* @param pdu
* @return
*/
Map<String,Object> getProductHotCensus(PageCensusPdu pdu) throws AppException;
/**
* 页面访问分析
* @param pdu
* @return
*/
Map<String,Object> getPageAccessAnalyse(PageCensusPdu pdu) throws AppException;
/**
* 使用习惯
* @param pdu
* @return
*/
List<UsageCensusVo> getUsageCensus(PageCensusPdu pdu) throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.page.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageInfoEntity;
/**
......@@ -11,4 +13,12 @@ import com.mortals.xhx.module.page.model.PageInfoEntity;
*/
public interface PageInfoService extends ICRUDService<PageInfoEntity,Long>{
/**
* 埋点设备截图
* @param entity
* @param context
* @return
* @throws AppException
*/
PageInfoEntity saveScreen(PageInfoEntity entity, Context context) throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.page.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import java.util.Map;
/**
* PageRouteService
......@@ -14,4 +18,11 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
public interface PageRouteService extends ICRUDService<PageRouteEntity,Long>{
PageRouteEntity saveByPdu(BuryPointPdu pdu);
/**
* 页面路径访问分析
* @param pdu
* @return
*/
Map<String,Object> getWayAccessAnalyse(PageCensusPdu pdu) throws AppException;
}
\ No newline at end of file
......@@ -37,6 +37,7 @@ public class PageAccessDepthServiceImpl extends AbstractCRUDServiceImpl<PageAcce
return null;
}
PageAccessDepthEntity entity = new PageAccessDepthEntity();
entity.setDeviceNum(pdu.getDeviceNum());
entity.setProductId(pdu.getProductId());
entity.setProductName(pdu.getProductName());
entity.setPageCode(pdu.getPageCode());
......
package com.mortals.xhx.module.page.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -9,7 +13,10 @@ import com.mortals.xhx.module.page.dao.PageAccessDao;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.service.PageAccessService;
import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* PageAccessService
......@@ -23,26 +30,131 @@ public class PageAccessServiceImpl extends AbstractCRUDServiceImpl<PageAccessDao
@Override
protected void validData(PageAccessEntity entity, Context context) throws AppException {
if(StringUtils.isEmpty(entity.getPageCode())){
throw new AppException("页面编码(路由)不能为空");
}
if(StringUtils.isEmpty(entity.getPageName())){
throw new AppException("页面名称不能为空");
}
// if(StringUtils.isEmpty(entity.getPageCode())){
// throw new AppException("页面编码(路由)不能为空");
// }
// if(StringUtils.isEmpty(entity.getPageName())){
// throw new AppException("页面名称不能为空");
// }
}
@Override
public PageAccessEntity saveByPdu(BuryPointPdu pdu) {
if(pdu.getSceneDepth()==null){
if(CollectionUtils.isEmpty(pdu.getDepthArr())){
return null;
}
PageAccessEntity entity = new PageAccessEntity();
entity.setDeviceNum(pdu.getDeviceNum());
entity.setProductId(pdu.getProductId());
entity.setProductName(pdu.getProductName());
entity.setPageCode(pdu.getPageCode());
entity.setPageName(pdu.getPageName());
entity.setSceneDepth(pdu.getSceneDepth());
if(pdu.getDepthArr().size()==1) {
entity.setFirstCode(pdu.getDepthArr().get(0).getSourceCode());
entity.setFirstName(pdu.getDepthArr().get(0).getSourceName());
entity.setSecondCode(pdu.getDepthArr().get(0).getTargetCode());
entity.setSecondName(pdu.getDepthArr().get(0).getTargetName());
}
if(pdu.getDepthArr().size()==2){
entity.setSecondCode(pdu.getDepthArr().get(1).getSourceCode());
entity.setSecondName(pdu.getDepthArr().get(1).getSourceCode());
entity.setThirdCode(pdu.getDepthArr().get(1).getTargetCode());
entity.setThirdName(pdu.getDepthArr().get(1).getTargetName());
}
if(pdu.getDepthArr().size()==3){
entity.setThirdCode(pdu.getDepthArr().get(2).getSourceCode());
entity.setThirdName(pdu.getDepthArr().get(2).getSourceCode());
entity.setFourthCode(pdu.getDepthArr().get(2).getTargetCode());
entity.setFourthName(pdu.getDepthArr().get(2).getTargetName());
}
if(pdu.getDepthArr().size()==4){
entity.setFourthCode(pdu.getDepthArr().get(3).getSourceCode());
entity.setFourthName(pdu.getDepthArr().get(3).getSourceCode());
}
entity.setPageDepth(pdu.getDepthArr().size()+1);
entity.setAccessContent(JSONObject.toJSONString(pdu.getDepthArr()));
entity.setCreateTime(new Date());
return this.save(entity);
}
@Override
public List<PageAccessEntity> getInformationFlow(PageCensusPdu pdu) {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
if(pdu.getParticleType()==null){
pdu.setParticleSize(60*60);
}else if(pdu.getParticleType()==1){
pdu.setParticleSize(10*60); //时间间隔10分钟
}else if(pdu.getParticleType()==2){
pdu.setParticleSize(30*60); //时间间隔30分钟
}else {
pdu.setParticleSize(60*60); //时间间隔1小时
}
String lastDay ="";
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
Calendar cd = Calendar.getInstance();
cd.setTime(date1);
cd.add(Calendar.DATE, -1);
lastDay = sdf.format(cd.getTime());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
if(pdu.getIsRatio()!=null && pdu.getIsRatio()==1){
List<PageAccessEntity> todayList = dao.getInformationFlow(pdu);
pdu.setDateTimeStart(lastDay);
pdu.setDateTimeEnd(lastDay);
List<PageAccessEntity> lastList = dao.getInformationFlow(pdu);
Map<String,PageAccessEntity> mp = new HashMap<>();
if(CollectionUtils.isNotEmpty(lastList)){
for (PageAccessEntity item:lastList){
String key = item.getTimeStr()+"_"+item.getFirstCode()+"_"+item.getSecondCode()+"_"+item.getThirdCode()+"_"+item.getFourthCode();
mp.put(key,item);
}
}
if(CollectionUtils.isNotEmpty(todayList)){
for (PageAccessEntity item:todayList){
if(item!=null) {
DecimalFormat decimalFormat=new DecimalFormat(".00");
String key = item.getTimeStr() + "_" + item.getFirstCode() + "_" + item.getSecondCode() + "_" + item.getThirdCode() + "_" + item.getFourthCode();
if (mp.containsKey(key)) {
PageAccessEntity last = mp.get(key);
if (last != null && last.getAccessCount() != null) {
float ac = (float)(item.getAccessCount() - last.getAccessCount());
float lc = (float)last.getAccessCount();
float p = ac/lc;
String s = decimalFormat.format(p);
item.setAccessRatio(Float.valueOf(s));
}else {
item.setAccessRatio(Float.valueOf("0.00"));
}
if (last != null && last.getAccessCount() != null) {
float ad = (float)(item.getPageDepth() - last.getPageDepth());
float ld = (float)last.getPageDepth();
float pd = ad/ld;
String sd = decimalFormat.format(pd);
item.setDepthRatio(Float.valueOf(sd));
}else {
item.setDepthRatio(Float.valueOf("0.00"));
}
}else {
item.setAccessRatio(Float.valueOf("0.00"));
item.setDepthRatio(Float.valueOf("0.00"));
}
}
}
}
return todayList;
}else {
//无需对比
return dao.getInformationFlow(pdu);
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.service.impl;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.dao.PageAccessDepthDao;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import com.mortals.xhx.module.page.model.PageInfoQuery;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import com.mortals.xhx.module.page.model.vo.UsageCensusVo;
import com.mortals.xhx.module.page.service.PageInfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -9,7 +20,10 @@ import com.mortals.xhx.module.page.dao.PageEventDao;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.service.PageEventService;
import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* PageEventService
......@@ -21,6 +35,13 @@ import java.util.Date;
@Service("pageEventService")
public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao, PageEventEntity, Long> implements PageEventService {
@Autowired
private PageInfoService pageInfoService;
@Autowired
private PageAccessDepthDao pageAccessDepthDao;
@Override
protected void validData(PageEventEntity entity, Context context) throws AppException {
if(StringUtils.isEmpty(entity.getPageCode())){
......@@ -37,6 +58,7 @@ public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao,
return null;
}
PageEventEntity entity = new PageEventEntity();
entity.setDeviceNum(pdu.getDeviceNum());
entity.setProductId(pdu.getProductId());
entity.setProductName(pdu.getProductName());
entity.setPageCode(pdu.getPageCode());
......@@ -50,4 +72,174 @@ public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao,
entity.setCreateTime(new Date());
return this.save(entity);
}
@Override
public List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
return dao.getPageEventCensus(pdu);
}
@Override
public Map<String, Object> getProductHotCensus(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
if(StringUtils.isEmpty(pdu.getPageCode())){
throw new AppException("页面编码不能为空");
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
Map<String,Object> result = new HashMap<>();
List<ProductHotCensusVo> list = dao.getProductHotCensus(pdu);
Long clickSum = 0l;
if(CollectionUtils.isNotEmpty(list)){
for (ProductHotCensusVo vo:list){
clickSum+=vo.getValue();
}
for (ProductHotCensusVo vo:list){
float a = (float)vo.getValue();
float b = (float)clickSum;
float p = a/b;
DecimalFormat decimalFormat=new DecimalFormat(".00%");
String s = decimalFormat.format(p);
vo.setProportion(s);
}
}
result.put("data",list);
result.put("clickSum", clickSum);
PageInfoEntity pageInfoEntity = pageInfoService.selectOne(new PageInfoQuery().pageCode(pdu.getPageCode()).productId(pdu.getProductId()));
if(pageInfoEntity!=null) {
result.put("screenUrl", pageInfoEntity.getScreenUrl());
}else {
result.put("screenUrl", "");
}
return result;
}
@Override
public Map<String, Object> getPageAccessAnalyse(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
Map<String,Object> result = new HashMap<>();
List<AccessTrendCensusVo> trendCensusVos = dao.getPageAccessTrend(pdu);
Long clickSum = 0l;
float dayAccessAvg = 0;
if(CollectionUtils.isNotEmpty(trendCensusVos)) {
for(AccessTrendCensusVo vo:trendCensusVos){
clickSum+=vo.getAccessCount();
}
float a = (float)clickSum;
float b = (float)trendCensusVos.size();
float p = b/a;
DecimalFormat decimalFormat=new DecimalFormat(".00");
String s = decimalFormat.format(p);
dayAccessAvg = Float.valueOf(s);
}
result.put("accessTrend", trendCensusVos); //页面访问指标趋势
result.put("accessSum", clickSum); //页面累计访问次数
result.put("dayAccessAvg", dayAccessAvg); //日均访问次数
List<AccessTrendCensusVo> pageAccessTop = dao.getPageAccessTop(pdu);
result.put("pageAccessTop", pageAccessTop); //页面访问次数TOP10
List<AccessTrendCensusVo> depthAvg = pageAccessDepthDao.getDepthAvg(pdu);
if(CollectionUtils.isNotEmpty(depthAvg)){
result.put("depthAvg", depthAvg.get(0).getDepthAvg()); //人均访问深度
result.put("singleDepth", depthAvg.get(0).getSingleDepth()); //次均访问深度
}else {
result.put("depthAvg", 0);
result.put("singleDepth", 0);
}
return result;
}
@Override
public List<UsageCensusVo> getUsageCensus(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
if(StringUtils.isNotEmpty(pdu.getBusinessCode())){
List<String> codeList = new ArrayList<>();
for(String s:pdu.getBusinessCode().split(",")){
codeList.add(s);
}
pdu.setBusinessCodeList(codeList);
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
List<UsageCensusVo> list = dao.getUsageCensus(pdu);
if(CollectionUtils.isNotEmpty(list)){
Integer clickSum = 0;
for (UsageCensusVo item:list){
if(item!=null && item.getAccessCount()!=null) {
clickSum += item.getAccessCount();
}
}
for (UsageCensusVo item:list){
if(item!=null && item.getAccessCount()!=null) {
float a = (float)clickSum;
float b = (float)item.getAccessCount();
float p = b/a;
DecimalFormat decimalFormat=new DecimalFormat(".00%");
DecimalFormat df=new DecimalFormat(".00");
String s = decimalFormat.format(p);
String s1 = df.format(p);
item.setProportion(s);
item.setPropValue(Float.valueOf(s1));
}
}
}
return list;
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.service.impl;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.utils.ImageBase64;
import com.mortals.xhx.module.page.model.PageInfoQuery;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -6,6 +11,9 @@ import com.mortals.framework.model.Context;
import com.mortals.xhx.module.page.dao.PageInfoDao;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import com.mortals.xhx.module.page.service.PageInfoService;
import java.util.Date;
/**
* PageInfoService
* 产品页面配置 service实现
......@@ -16,4 +24,80 @@ import com.mortals.xhx.module.page.service.PageInfoService;
@Service("pageInfoService")
public class PageInfoServiceImpl extends AbstractCRUDServiceImpl<PageInfoDao, PageInfoEntity, Long> implements PageInfoService {
@Value("${upload.path}")
@Getter
private String filePath;
@Override
protected void saveBefore(PageInfoEntity entity, Context context) throws AppException {
this.validData(entity, context);
if(StringUtils.isEmpty(entity.getPageCode())){
throw new AppException("页面编码(路由)不能为空");
}
if(StringUtils.isEmpty(entity.getDeviceNum())){
throw new AppException("设备编码不能为空");
}
if(entity.getProductId()==null){
throw new AppException("产品ID不能为空");
}
if(StringUtils.isEmpty(entity.getScreenUrl())){
throw new AppException("截图内容不能为空");
}
}
@Override
public PageInfoEntity saveScreen(PageInfoEntity entity, Context context) throws AppException {
this.saveBefore(entity, context);
PageInfoQuery query = new PageInfoQuery();
query.setPageCode(entity.getPageCode());
query.setProductId(entity.getProductId());
query.setDeviceNum(entity.getDeviceNum());
PageInfoEntity pageInfoEntity = this.selectOne(query);
if(pageInfoEntity==null){
doSaveImageBase64(entity,"");
entity.setCreateTime(new Date());
int iRet = this.dao.insert(entity);
if (iRet == 0) {
throw new AppException(-1001, "写入数据库失败!");
}else {
this.saveAfter(entity, context);
return entity;
}
}else {
doSaveImageBase64(entity,pageInfoEntity.getScreenUrl());
PageInfoEntity updateEntity = new PageInfoEntity();
updateEntity.setId(pageInfoEntity.getId());
updateEntity.setScreenUrl(pageInfoEntity.getScreenUrl());
updateEntity.setUpdateTime(new Date());
int iRet = this.dao.update(updateEntity);
if (iRet == 0) {
throw new AppException(-1002, "更新失败!");
} else {
this.updateAfter(updateEntity, context);
entity.setId(pageInfoEntity.getId());
return entity;
}
}
}
private void doSaveImageBase64(PageInfoEntity entity,String oldName){
String base64 = String.valueOf(entity.getScreenUrl());
base64 = base64.replaceAll("data:image/png;base64,","");
if(StringUtils.isEmpty(base64)){
throw new AppException("图片不能为空");
}
String imageName = new Date().getTime() + ".png";
String imagePath = "/file/uploadfile/"+imageName;
if(StringUtils.isNotEmpty(oldName)){
imagePath = oldName;
}
String filePath = this.filePath.endsWith("/") ? this.filePath : this.filePath + "/" + imagePath;
try{
ImageBase64.convertImg(base64.trim(),filePath);
entity.setScreenUrl(imagePath);
}catch (Exception e){
log.error("base64图片转换异常",e.fillInStackTrace());
entity.setScreenUrl("");
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.service.impl;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -9,7 +12,7 @@ import com.mortals.xhx.module.page.dao.PageRouteDao;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.service.PageRouteService;
import java.util.Date;
import java.util.*;
/**
* PageRouteService
......@@ -39,17 +42,42 @@ public class PageRouteServiceImpl extends AbstractCRUDServiceImpl<PageRouteDao,
@Override
public PageRouteEntity saveByPdu(BuryPointPdu pdu) {
if(pdu.getRouteInfo()==null){
return null;
}
if(CollectionUtils.isNotEmpty(pdu.getDepthArr())){
List<PageRouteEntity> list = new ArrayList<>();
for(PageRouteEntity item:pdu.getDepthArr()) {
PageRouteEntity entity = new PageRouteEntity();
entity.setDeviceNum(pdu.getDeviceNum());
entity.setProductId(pdu.getProductId());
entity.setProductName(pdu.getProductName());
entity.setSourceCode(pdu.getRouteInfo().getSourceCode());
entity.setSourceName(pdu.getRouteInfo().getSourceName());
entity.setTargetCode(pdu.getRouteInfo().getTargetCode());
entity.setTargetName(pdu.getRouteInfo().getTargetName());
entity.setSourceCode(item.getSourceCode());
entity.setSourceName(item.getSourceName());
entity.setTargetCode(item.getTargetCode());
entity.setTargetName(item.getTargetName());
entity.setCreateTime(new Date());
return this.save(entity);
list.add(entity);
}
this.save(list);
}
return null;
}
@Override
public Map<String, Object> getWayAccessAnalyse(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
Map<String,Object> result = new HashMap<>();
List<PageWayCensusVo> pageWayCensusVos = dao.getPageWayCensus(pdu);
result.put("links",pageWayCensusVos);
List<Map<String, Object>> pageCodes = dao.getPageWayCode(pdu);
result.put("data",pageCodes);
return result;
}
}
\ No newline at end of file
......@@ -8,20 +8,19 @@ import com.mortals.framework.model.Context;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.StringUtils;
import com.mortals.framework.web.BaseJsonBodyController;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.pdu.AccessPdu;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.service.PageAccessDepthService;
import com.mortals.xhx.module.page.service.PageAccessService;
import com.mortals.xhx.module.page.service.PageEventService;
import com.mortals.xhx.module.page.service.PageRouteService;
import com.mortals.xhx.module.page.service.*;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
* 页面埋点
......@@ -38,9 +37,10 @@ public class BuryPointController extends BaseJsonBodyController {
private PageEventService pageEventService;
@Autowired
private PageRouteService pageRouteService;
@Autowired
private PageInfoService pageInfoService;
@PostMapping({"save"})
@RepeatSubmit
@UnAuth
public String save(@RequestBody BuryPointPdu pdu) {
Map<String, Object> model = new HashMap();
......@@ -74,6 +74,88 @@ public class BuryPointController extends BaseJsonBodyController {
if(StringUtils.isEmpty(pdu.getProductName())){
throw new AppException("产品名称不能为空");
}
if(CollectionUtils.isNotEmpty(pdu.getDepthArr())){
List<PageRouteEntity> list = new ArrayList<>();
Map<String,String> source = new HashMap<>();
for(PageRouteEntity item:pdu.getDepthArr()){
source.put(item.getSourceCode(),item.getSourceName());
if(!source.containsKey(item.getTargetCode())){
list.add(item);
}
}
pdu.setDepthArr(list);
}
}
@PostMapping({"screen/save"})
@UnAuth
public String saveScreen(@RequestBody PageInfoEntity pdu) {
Map<String, Object> model = new HashMap();
Context context = this.getContext();
int code = 1;
String busiDesc = "保存页面截图";
try {
PageInfoEntity entity = pageInfoService.saveScreen(pdu,context);
model.put("entity", entity);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var7) {
this.doException(this.request, busiDesc, model, var7);
code = -1;
model.put("entity", pdu);
}
JSONObject ret = new JSONObject();
ret.put("code", code);
ret.put("msg", model.remove("message_info"));
ret.put("data", model);
return ret.toJSONString();
}
// public static void main(String[] args){
// List<PageRouteEntity> arrayList = new ArrayList<>();
// PageRouteEntity r1 = new PageRouteEntity();
// r1.setSourceCode("1111");
// r1.setSourceName("1111");
// r1.setTargetCode("2222");
// r1.setTargetName("2222");
// arrayList.add(r1);
// PageRouteEntity r2 = new PageRouteEntity();
// r2.setSourceCode("2222");
// r2.setSourceName("2222");
// r2.setTargetCode("1111");
// r2.setTargetName("1111");
// arrayList.add(r2);
// PageRouteEntity r3 = new PageRouteEntity();
// r3.setSourceCode("1111");
// r3.setSourceName("1111");
// r3.setTargetCode("3333");
// r3.setTargetName("3333");
// arrayList.add(r3);
// PageRouteEntity r4 = new PageRouteEntity();
// r4.setSourceCode("3333");
// r4.setSourceName("3333");
// r4.setTargetCode("2222");
// r4.setTargetName("2222");
// arrayList.add(r4);
// PageRouteEntity r5 = new PageRouteEntity();
// r5.setSourceCode("2222");
// r5.setSourceName("2222");
// r5.setTargetCode("4444");
// r5.setTargetName("4444");
// arrayList.add(r5);
// List<PageRouteEntity> list = new ArrayList<>();
// Map<String,String> source = new HashMap<>();
// for(PageRouteEntity item:arrayList){
// System.out.println(item.getSourceCode()+"-->"+item.getTargetCode());
// source.put(item.getSourceCode(),item.getSourceName());
// if(!source.containsKey(item.getTargetCode())){
// list.add(item);
// }
// }
// System.out.println("---------------------------------------");
// for(PageRouteEntity item:list){
// System.out.println(item.getSourceCode()+"-->"+item.getTargetCode());
// }
//
// }
}
package com.mortals.xhx.module.page.web;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.web.BaseJsonBodyController;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.UsageCensusVo;
import com.mortals.xhx.module.page.service.PageAccessService;
import com.mortals.xhx.module.page.service.PageEventService;
import com.mortals.xhx.module.page.service.PageRouteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 用户行为分析
*/
@RestController
@RequestMapping("act/analyse")
public class PageCensusController extends BaseJsonBodyController {
@Autowired
private PageEventService pageEventService;
@Autowired
private PageRouteService pageRouteService;
@Autowired
private PageAccessService pageAccessService;
/**
* 事件分析
* @param query
* @return
*/
@PostMapping({"pageEventCensus"})
@UnAuth
public Rest<Object> getPageEventCensus(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询事件分析结果";
int code=1;
try {
List<PageEventCensusVo> result = pageEventService.getPageEventCensus(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model);
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 产品热力图
* @param query
* @return
*/
@PostMapping({"productHotCensus"})
@UnAuth
public Rest<Object> getProductHotCensus(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询产品热力图";
int code=1;
try {
Map<String,Object> result = pageEventService.getProductHotCensus(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 页面访问分析
* @param query
* @return
*/
@PostMapping({"accessAnalyse"})
@UnAuth
public Rest<Object> getPageAccessAnalyse(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询页面访问分析";
int code=1;
try {
Map<String,Object> result = pageEventService.getPageAccessAnalyse(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 页面路径访问分析
* @param query
* @return
*/
@PostMapping({"wayAccessAnalyse"})
@UnAuth
public Rest<Object> getPageWayAnalyse(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询页面路径访问分析";
int code=1;
try {
Map<String,Object> result = pageRouteService.getWayAccessAnalyse(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 页面使用习惯分析
* @param query
* @return
*/
@PostMapping({"usageCensus"})
@UnAuth
public Rest<Object> getUsageCensus(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询页面使用习惯分析";
int code=1;
try {
List<UsageCensusVo> result = pageEventService.getUsageCensus(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 信息流分析
* @param query
* @return
*/
@PostMapping({"informationFlow"})
@UnAuth
public Rest<Object> getInformationFlow(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询信息流分析";
int code=1;
try {
List<PageAccessEntity> result = pageAccessService.getInformationFlow(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
}
......@@ -6,6 +6,7 @@
<!-- 字段和属性映射 -->
<resultMap type="PageAccessDepthEntity" id="PageAccessDepthEntity-Map">
<id property="id" column="id" />
<result property="deviceNum" column="deviceNum" />
<result property="productId" column="productId" />
<result property="productName" column="productName" />
<result property="pageCode" column="pageCode" />
......@@ -25,6 +26,9 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('deviceNum') or colPickMode == 1 and data.containsKey('deviceNum')))">
a.deviceNum,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productId') or colPickMode == 1 and data.containsKey('productId')))">
a.productId,
</if>
......@@ -57,18 +61,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="PageAccessDepthEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_page_access_depth
(productId,productName,pageCode,pageName,depthValue,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,pageCode,pageName,depthValue,createUserId,createTime,updateUserId,updateTime)
VALUES
(#{productId},#{productName},#{pageCode},#{pageName},#{depthValue},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
(#{deviceNum},#{productId},#{productName},#{pageCode},#{pageName},#{depthValue},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_page_access_depth
(productId,productName,pageCode,pageName,depthValue,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,pageCode,pageName,depthValue,createUserId,createTime,updateUserId,updateTime)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.productId},#{item.productName},#{item.pageCode},#{item.pageName},#{item.depthValue},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
(#{item.deviceNum},#{item.productId},#{item.productName},#{item.pageCode},#{item.pageName},#{item.depthValue},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
</foreach>
</insert>
......@@ -78,6 +82,9 @@
update mortals_xhx_page_access_depth as a
set
<trim suffixOverrides="," suffix="">
<if test="(colPickMode==0 and data.containsKey('deviceNum')) or (colPickMode==1 and !data.containsKey('deviceNum'))">
a.deviceNum=#{data.deviceNum},
</if>
<if test="(colPickMode==0 and data.containsKey('productId')) or (colPickMode==1 and !data.containsKey('productId'))">
a.productId=#{data.productId},
</if>
......@@ -96,6 +103,9 @@
<if test="(colPickMode==0 and data.containsKey('depthValue')) or (colPickMode==1 and !data.containsKey('depthValue'))">
a.depthValue=#{data.depthValue},
</if>
<if test="(colPickMode==0 and data.containsKey('depthValueIncrement')) or (colPickMode==1 and !data.containsKey('depthValueIncrement'))">
a.depthValue=ifnull(a.depthValue,0) + #{data.depthValueIncrement},
</if>
<if test="(colPickMode==0 and data.containsKey('createUserId')) or (colPickMode==1 and !data.containsKey('createUserId'))">
a.createUserId=#{data.createUserId},
</if>
......@@ -126,6 +136,13 @@
<update id="updateBatch" parameterType="paramDto">
update mortals_xhx_page_access_depth as a
<trim prefix="set" suffixOverrides=",">
<trim prefix="deviceNum=(case" suffix="ELSE deviceNum end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('deviceNum')) or (colPickMode==1 and !item.containsKey('deviceNum'))">
when a.id=#{item.id} then #{item.deviceNum}
</if>
</foreach>
</trim>
<trim prefix="productId=(case" suffix="ELSE productId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
......@@ -161,9 +178,14 @@
</trim>
<trim prefix="depthValue=(case" suffix="ELSE depthValue end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('depthValue')) or (colPickMode==1 and !item.containsKey('depthValue'))">
<choose>
<when test="(colPickMode==0 and item.containsKey('depthValue')) or (colPickMode==1 and !item.containsKey('depthValue'))">
when a.id=#{item.id} then #{item.depthValue}
</if>
</when>
<when test="(colPickMode==0 and item.containsKey('depthValueIncrement')) or (colPickMode==1 and !item.containsKey('depthValueIncrement'))">
when a.id=#{item.id} then ifnull(a.depthValue,0) + #{item.depthValueIncrement}
</when>
</choose>
</foreach>
</trim>
<trim prefix="createUserId=(case" suffix="ELSE createUserId end),">
......@@ -328,13 +350,13 @@
${_conditionType_} a.id is null
</if>
</if>
<if test="conditionParamRef.containsKey('idList')">
<if test="conditionParamRef.containsKey('idList') and conditionParamRef.idList.size() > 0">
${_conditionType_} a.id in
<foreach collection="conditionParamRef.idList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('idNotList')">
<if test="conditionParamRef.containsKey('idNotList') and conditionParamRef.idNotList.size() > 0">
${_conditionType_} a.id not in
<foreach collection="conditionParamRef.idNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -347,6 +369,27 @@
${_conditionType_} a.id <![CDATA[ <= ]]> #{${_conditionParam_}.idEnd}
</if>
<if test="conditionParamRef.containsKey('deviceNum')">
<if test="conditionParamRef.deviceNum != null and conditionParamRef.deviceNum != ''">
${_conditionType_} a.deviceNum like #{${_conditionParam_}.deviceNum}
</if>
<if test="conditionParamRef.deviceNum == null">
${_conditionType_} a.deviceNum is null
</if>
</if>
<if test="conditionParamRef.containsKey('deviceNumList') and conditionParamRef.deviceNumList.size() > 0">
${_conditionType_} a.deviceNum in
<foreach collection="conditionParamRef.deviceNumList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('deviceNumNotList') and conditionParamRef.deviceNumNotList.size() > 0">
${_conditionType_} a.deviceNum not in
<foreach collection="conditionParamRef.deviceNumNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productId')">
<if test="conditionParamRef.productId != null ">
${_conditionType_} a.productId = #{${_conditionParam_}.productId}
......@@ -355,13 +398,13 @@
${_conditionType_} a.productId is null
</if>
</if>
<if test="conditionParamRef.containsKey('productIdList')">
<if test="conditionParamRef.containsKey('productIdList') and conditionParamRef.productIdList.size() > 0">
${_conditionType_} a.productId in
<foreach collection="conditionParamRef.productIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productIdNotList')">
<if test="conditionParamRef.containsKey('productIdNotList') and conditionParamRef.productIdNotList.size() > 0">
${_conditionType_} a.productId not in
<foreach collection="conditionParamRef.productIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -383,13 +426,13 @@
${_conditionType_} a.productName is null
</if>
</if>
<if test="conditionParamRef.containsKey('productNameList')">
<if test="conditionParamRef.containsKey('productNameList') and conditionParamRef.productNameList.size() > 0">
${_conditionType_} a.productName in
<foreach collection="conditionParamRef.productNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productNameNotList')">
<if test="conditionParamRef.containsKey('productNameNotList') and conditionParamRef.productNameNotList.size() > 0">
${_conditionType_} a.productName not in
<foreach collection="conditionParamRef.productNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -404,13 +447,13 @@
${_conditionType_} a.pageCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageCodeList')">
<if test="conditionParamRef.containsKey('pageCodeList') and conditionParamRef.pageCodeList.size() > 0">
${_conditionType_} a.pageCode in
<foreach collection="conditionParamRef.pageCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageCodeNotList')">
<if test="conditionParamRef.containsKey('pageCodeNotList') and conditionParamRef.pageCodeNotList.size() > 0">
${_conditionType_} a.pageCode not in
<foreach collection="conditionParamRef.pageCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -425,39 +468,45 @@
${_conditionType_} a.pageName is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageNameList')">
<if test="conditionParamRef.containsKey('pageNameList') and conditionParamRef.pageNameList.size() > 0">
${_conditionType_} a.pageName in
<foreach collection="conditionParamRef.pageNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageNameNotList')">
<if test="conditionParamRef.containsKey('pageNameNotList') and conditionParamRef.pageNameNotList.size() > 0">
${_conditionType_} a.pageName not in
<foreach collection="conditionParamRef.pageNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('depthValue')">
<if test="conditionParamRef.depthValue != null and conditionParamRef.depthValue != ''">
${_conditionType_} a.depthValue like #{${_conditionParam_}.depthValue}
<if test="conditionParamRef.depthValue != null ">
${_conditionType_} a.depthValue = #{${_conditionParam_}.depthValue}
</if>
<if test="conditionParamRef.depthValue == null">
${_conditionType_} a.depthValue is null
</if>
</if>
<if test="conditionParamRef.containsKey('depthValueList')">
<if test="conditionParamRef.containsKey('depthValueList') and conditionParamRef.depthValueList.size() > 0">
${_conditionType_} a.depthValue in
<foreach collection="conditionParamRef.depthValueList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('depthValueNotList')">
<if test="conditionParamRef.containsKey('depthValueNotList') and conditionParamRef.depthValueNotList.size() > 0">
${_conditionType_} a.depthValue not in
<foreach collection="conditionParamRef.depthValueNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('depthValueStart') and conditionParamRef.depthValueStart != null">
${_conditionType_} a.depthValue <![CDATA[ >= ]]> #{${_conditionParam_}.depthValueStart}
</if>
<if test="conditionParamRef.containsKey('depthValueEnd') and conditionParamRef.depthValueEnd != null">
${_conditionType_} a.depthValue <![CDATA[ <= ]]> #{${_conditionParam_}.depthValueEnd}
</if>
<if test="conditionParamRef.containsKey('createUserId')">
<if test="conditionParamRef.createUserId != null ">
${_conditionType_} a.createUserId = #{${_conditionParam_}.createUserId}
......@@ -466,13 +515,13 @@
${_conditionType_} a.createUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('createUserIdList')">
<if test="conditionParamRef.containsKey('createUserIdList') and conditionParamRef.createUserIdList.size() > 0">
${_conditionType_} a.createUserId in
<foreach collection="conditionParamRef.createUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('createUserIdNotList')">
<if test="conditionParamRef.containsKey('createUserIdNotList') and conditionParamRef.createUserIdNotList.size() > 0">
${_conditionType_} a.createUserId not in
<foreach collection="conditionParamRef.createUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -508,13 +557,13 @@
${_conditionType_} a.updateUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('updateUserIdList')">
<if test="conditionParamRef.containsKey('updateUserIdList') and conditionParamRef.updateUserIdList.size() > 0">
${_conditionType_} a.updateUserId in
<foreach collection="conditionParamRef.updateUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('updateUserIdNotList')">
<if test="conditionParamRef.containsKey('updateUserIdNotList') and conditionParamRef.updateUserIdNotList.size() > 0">
${_conditionType_} a.updateUserId not in
<foreach collection="conditionParamRef.updateUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -560,6 +609,11 @@
<if test='orderCol.id != null and "DESC".equalsIgnoreCase(orderCol.id)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('deviceNum')">
a.deviceNum
<if test='orderCol.deviceNum != null and "DESC".equalsIgnoreCase(orderCol.deviceNum)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('productId')">
a.productId
<if test='orderCol.productId != null and "DESC".equalsIgnoreCase(orderCol.productId)'>DESC</if>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.page.dao.ibatis.PageAccessDepthDaoImpl">
<!-- 人均访问深度 -->
<select id="getDepthAvg" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT
IFNULL(FORMAT(AVG(t.depthValue),2),0) AS depthAvg,
IFNULL(FORMAT(sum(t.depthValue)/count(t.id),2),0) AS singleDepth
FROM
mortals_xhx_page_access_depth t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.page.dao.ibatis.PageAccessDaoImpl">
<!-- 字段和属性映射 -->
<resultMap type="PageAccessEntity" id="PageAccessEntity-Map">
<id property="id" column="id" />
<result property="deviceNum" column="deviceNum" />
<result property="productId" column="productId" />
<result property="productName" column="productName" />
<result property="pageCode" column="pageCode" />
<result property="pageName" column="pageName" />
<result property="sceneDepth" column="sceneDepth" />
<result property="firstCode" column="firstCode" />
<result property="firstName" column="firstName" />
<result property="secondCode" column="secondCode" />
<result property="secondName" column="secondName" />
<result property="thirdCode" column="thirdCode" />
<result property="thirdName" column="thirdName" />
<result property="fourthCode" column="fourthCode" />
<result property="fourthName" column="fourthName" />
<result property="accessContent" column="accessContent" />
<result property="pageDepth" column="pageDepth" />
<result property="createUserId" column="createUserId" />
<result property="createTime" column="createTime" />
<result property="updateUserId" column="updateUserId" />
......@@ -25,20 +33,44 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('deviceNum') or colPickMode == 1 and data.containsKey('deviceNum')))">
a.deviceNum,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productId') or colPickMode == 1 and data.containsKey('productId')))">
a.productId,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productName') or colPickMode == 1 and data.containsKey('productName')))">
a.productName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('pageCode') or colPickMode == 1 and data.containsKey('pageCode')))">
a.pageCode,
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('firstCode') or colPickMode == 1 and data.containsKey('firstCode')))">
a.firstCode,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('firstName') or colPickMode == 1 and data.containsKey('firstName')))">
a.firstName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('secondCode') or colPickMode == 1 and data.containsKey('secondCode')))">
a.secondCode,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('secondName') or colPickMode == 1 and data.containsKey('secondName')))">
a.secondName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('thirdCode') or colPickMode == 1 and data.containsKey('thirdCode')))">
a.thirdCode,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('pageName') or colPickMode == 1 and data.containsKey('pageName')))">
a.pageName,
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('thirdName') or colPickMode == 1 and data.containsKey('thirdName')))">
a.thirdName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('sceneDepth') or colPickMode == 1 and data.containsKey('sceneDepth')))">
a.sceneDepth,
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('fourthCode') or colPickMode == 1 and data.containsKey('fourthCode')))">
a.fourthCode,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('fourthName') or colPickMode == 1 and data.containsKey('fourthName')))">
a.fourthName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('accessContent') or colPickMode == 1 and data.containsKey('accessContent')))">
a.accessContent,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('pageDepth') or colPickMode == 1 and data.containsKey('pageDepth')))">
a.pageDepth,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createUserId') or colPickMode == 1 and data.containsKey('createUserId')))">
a.createUserId,
......@@ -57,18 +89,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="PageAccessEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_page_access
(productId,productName,pageCode,pageName,sceneDepth,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,firstCode,firstName,secondCode,secondName,thirdCode,thirdName,fourthCode,fourthName,accessContent,pageDepth,createUserId,createTime,updateUserId,updateTime)
VALUES
(#{productId},#{productName},#{pageCode},#{pageName},#{sceneDepth},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
(#{deviceNum},#{productId},#{productName},#{firstCode},#{firstName},#{secondCode},#{secondName},#{thirdCode},#{thirdName},#{fourthCode},#{fourthName},#{accessContent},#{pageDepth},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_page_access
(productId,productName,pageCode,pageName,sceneDepth,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,firstCode,firstName,secondCode,secondName,thirdCode,thirdName,fourthCode,fourthName,accessContent,pageDepth,createUserId,createTime,updateUserId,updateTime)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.productId},#{item.productName},#{item.pageCode},#{item.pageName},#{item.sceneDepth},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
(#{item.deviceNum},#{item.productId},#{item.productName},#{item.firstCode},#{item.firstName},#{item.secondCode},#{item.secondName},#{item.thirdCode},#{item.thirdName},#{item.fourthCode},#{item.fourthName},#{item.accessContent},#{item.pageDepth},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
</foreach>
</insert>
......@@ -78,6 +110,9 @@
update mortals_xhx_page_access as a
set
<trim suffixOverrides="," suffix="">
<if test="(colPickMode==0 and data.containsKey('deviceNum')) or (colPickMode==1 and !data.containsKey('deviceNum'))">
a.deviceNum=#{data.deviceNum},
</if>
<if test="(colPickMode==0 and data.containsKey('productId')) or (colPickMode==1 and !data.containsKey('productId'))">
a.productId=#{data.productId},
</if>
......@@ -87,17 +122,38 @@
<if test="(colPickMode==0 and data.containsKey('productName')) or (colPickMode==1 and !data.containsKey('productName'))">
a.productName=#{data.productName},
</if>
<if test="(colPickMode==0 and data.containsKey('pageCode')) or (colPickMode==1 and !data.containsKey('pageCode'))">
a.pageCode=#{data.pageCode},
<if test="(colPickMode==0 and data.containsKey('firstCode')) or (colPickMode==1 and !data.containsKey('firstCode'))">
a.firstCode=#{data.firstCode},
</if>
<if test="(colPickMode==0 and data.containsKey('pageName')) or (colPickMode==1 and !data.containsKey('pageName'))">
a.pageName=#{data.pageName},
<if test="(colPickMode==0 and data.containsKey('firstName')) or (colPickMode==1 and !data.containsKey('firstName'))">
a.firstName=#{data.firstName},
</if>
<if test="(colPickMode==0 and data.containsKey('sceneDepth')) or (colPickMode==1 and !data.containsKey('sceneDepth'))">
a.sceneDepth=#{data.sceneDepth},
<if test="(colPickMode==0 and data.containsKey('secondCode')) or (colPickMode==1 and !data.containsKey('secondCode'))">
a.secondCode=#{data.secondCode},
</if>
<if test="(colPickMode==0 and data.containsKey('sceneDepthIncrement')) or (colPickMode==1 and !data.containsKey('sceneDepthIncrement'))">
a.sceneDepth=ifnull(a.sceneDepth,0) + #{data.sceneDepthIncrement},
<if test="(colPickMode==0 and data.containsKey('secondName')) or (colPickMode==1 and !data.containsKey('secondName'))">
a.secondName=#{data.secondName},
</if>
<if test="(colPickMode==0 and data.containsKey('thirdCode')) or (colPickMode==1 and !data.containsKey('thirdCode'))">
a.thirdCode=#{data.thirdCode},
</if>
<if test="(colPickMode==0 and data.containsKey('thirdName')) or (colPickMode==1 and !data.containsKey('thirdName'))">
a.thirdName=#{data.thirdName},
</if>
<if test="(colPickMode==0 and data.containsKey('fourthCode')) or (colPickMode==1 and !data.containsKey('fourthCode'))">
a.fourthCode=#{data.fourthCode},
</if>
<if test="(colPickMode==0 and data.containsKey('fourthName')) or (colPickMode==1 and !data.containsKey('fourthName'))">
a.fourthName=#{data.fourthName},
</if>
<if test="(colPickMode==0 and data.containsKey('accessContent')) or (colPickMode==1 and !data.containsKey('accessContent'))">
a.accessContent=#{data.accessContent},
</if>
<if test="(colPickMode==0 and data.containsKey('pageDepth')) or (colPickMode==1 and !data.containsKey('pageDepth'))">
a.pageDepth=#{data.pageDepth},
</if>
<if test="(colPickMode==0 and data.containsKey('pageDepthIncrement')) or (colPickMode==1 and !data.containsKey('pageDepthIncrement'))">
a.pageDepth=ifnull(a.pageDepth,0) + #{data.pageDepthIncrement},
</if>
<if test="(colPickMode==0 and data.containsKey('createUserId')) or (colPickMode==1 and !data.containsKey('createUserId'))">
a.createUserId=#{data.createUserId},
......@@ -129,6 +185,13 @@
<update id="updateBatch" parameterType="paramDto">
update mortals_xhx_page_access as a
<trim prefix="set" suffixOverrides=",">
<trim prefix="deviceNum=(case" suffix="ELSE deviceNum end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('deviceNum')) or (colPickMode==1 and !item.containsKey('deviceNum'))">
when a.id=#{item.id} then #{item.deviceNum}
</if>
</foreach>
</trim>
<trim prefix="productId=(case" suffix="ELSE productId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
......@@ -148,28 +211,77 @@
</if>
</foreach>
</trim>
<trim prefix="pageCode=(case" suffix="ELSE pageCode end),">
<trim prefix="firstCode=(case" suffix="ELSE firstCode end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('firstCode')) or (colPickMode==1 and !item.containsKey('firstCode'))">
when a.id=#{item.id} then #{item.firstCode}
</if>
</foreach>
</trim>
<trim prefix="firstName=(case" suffix="ELSE firstName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('firstName')) or (colPickMode==1 and !item.containsKey('firstName'))">
when a.id=#{item.id} then #{item.firstName}
</if>
</foreach>
</trim>
<trim prefix="secondCode=(case" suffix="ELSE secondCode end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('secondCode')) or (colPickMode==1 and !item.containsKey('secondCode'))">
when a.id=#{item.id} then #{item.secondCode}
</if>
</foreach>
</trim>
<trim prefix="secondName=(case" suffix="ELSE secondName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('secondName')) or (colPickMode==1 and !item.containsKey('secondName'))">
when a.id=#{item.id} then #{item.secondName}
</if>
</foreach>
</trim>
<trim prefix="thirdCode=(case" suffix="ELSE thirdCode end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('pageCode')) or (colPickMode==1 and !item.containsKey('pageCode'))">
when a.id=#{item.id} then #{item.pageCode}
<if test="(colPickMode==0 and item.containsKey('thirdCode')) or (colPickMode==1 and !item.containsKey('thirdCode'))">
when a.id=#{item.id} then #{item.thirdCode}
</if>
</foreach>
</trim>
<trim prefix="pageName=(case" suffix="ELSE pageName end),">
<trim prefix="thirdName=(case" suffix="ELSE thirdName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('pageName')) or (colPickMode==1 and !item.containsKey('pageName'))">
when a.id=#{item.id} then #{item.pageName}
<if test="(colPickMode==0 and item.containsKey('thirdName')) or (colPickMode==1 and !item.containsKey('thirdName'))">
when a.id=#{item.id} then #{item.thirdName}
</if>
</foreach>
</trim>
<trim prefix="sceneDepth=(case" suffix="ELSE sceneDepth end),">
<trim prefix="fourthCode=(case" suffix="ELSE fourthCode end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('fourthCode')) or (colPickMode==1 and !item.containsKey('fourthCode'))">
when a.id=#{item.id} then #{item.fourthCode}
</if>
</foreach>
</trim>
<trim prefix="fourthName=(case" suffix="ELSE fourthName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('fourthName')) or (colPickMode==1 and !item.containsKey('fourthName'))">
when a.id=#{item.id} then #{item.fourthName}
</if>
</foreach>
</trim>
<trim prefix="accessContent=(case" suffix="ELSE accessContent end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('accessContent')) or (colPickMode==1 and !item.containsKey('accessContent'))">
when a.id=#{item.id} then #{item.accessContent}
</if>
</foreach>
</trim>
<trim prefix="pageDepth=(case" suffix="ELSE pageDepth end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
<when test="(colPickMode==0 and item.containsKey('sceneDepth')) or (colPickMode==1 and !item.containsKey('sceneDepth'))">
when a.id=#{item.id} then #{item.sceneDepth}
<when test="(colPickMode==0 and item.containsKey('pageDepth')) or (colPickMode==1 and !item.containsKey('pageDepth'))">
when a.id=#{item.id} then #{item.pageDepth}
</when>
<when test="(colPickMode==0 and item.containsKey('sceneDepthIncrement')) or (colPickMode==1 and !item.containsKey('sceneDepthIncrement'))">
when a.id=#{item.id} then ifnull(a.sceneDepth,0) + #{item.sceneDepthIncrement}
<when test="(colPickMode==0 and item.containsKey('pageDepthIncrement')) or (colPickMode==1 and !item.containsKey('pageDepthIncrement'))">
when a.id=#{item.id} then ifnull(a.pageDepth,0) + #{item.pageDepthIncrement}
</when>
</choose>
</foreach>
......@@ -336,13 +448,13 @@
${_conditionType_} a.id is null
</if>
</if>
<if test="conditionParamRef.containsKey('idList')">
<if test="conditionParamRef.containsKey('idList') and conditionParamRef.idList.size() > 0">
${_conditionType_} a.id in
<foreach collection="conditionParamRef.idList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('idNotList')">
<if test="conditionParamRef.containsKey('idNotList') and conditionParamRef.idNotList.size() > 0">
${_conditionType_} a.id not in
<foreach collection="conditionParamRef.idNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -355,6 +467,27 @@
${_conditionType_} a.id <![CDATA[ <= ]]> #{${_conditionParam_}.idEnd}
</if>
<if test="conditionParamRef.containsKey('deviceNum')">
<if test="conditionParamRef.deviceNum != null and conditionParamRef.deviceNum != ''">
${_conditionType_} a.deviceNum like #{${_conditionParam_}.deviceNum}
</if>
<if test="conditionParamRef.deviceNum == null">
${_conditionType_} a.deviceNum is null
</if>
</if>
<if test="conditionParamRef.containsKey('deviceNumList') and conditionParamRef.deviceNumList.size() > 0">
${_conditionType_} a.deviceNum in
<foreach collection="conditionParamRef.deviceNumList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('deviceNumNotList') and conditionParamRef.deviceNumNotList.size() > 0">
${_conditionType_} a.deviceNum not in
<foreach collection="conditionParamRef.deviceNumNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productId')">
<if test="conditionParamRef.productId != null ">
${_conditionType_} a.productId = #{${_conditionParam_}.productId}
......@@ -363,13 +496,13 @@
${_conditionType_} a.productId is null
</if>
</if>
<if test="conditionParamRef.containsKey('productIdList')">
<if test="conditionParamRef.containsKey('productIdList') and conditionParamRef.productIdList.size() > 0">
${_conditionType_} a.productId in
<foreach collection="conditionParamRef.productIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productIdNotList')">
<if test="conditionParamRef.containsKey('productIdNotList') and conditionParamRef.productIdNotList.size() > 0">
${_conditionType_} a.productId not in
<foreach collection="conditionParamRef.productIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -391,85 +524,232 @@
${_conditionType_} a.productName is null
</if>
</if>
<if test="conditionParamRef.containsKey('productNameList')">
<if test="conditionParamRef.containsKey('productNameList') and conditionParamRef.productNameList.size() > 0">
${_conditionType_} a.productName in
<foreach collection="conditionParamRef.productNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productNameNotList')">
<if test="conditionParamRef.containsKey('productNameNotList') and conditionParamRef.productNameNotList.size() > 0">
${_conditionType_} a.productName not in
<foreach collection="conditionParamRef.productNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageCode')">
<if test="conditionParamRef.pageCode != null and conditionParamRef.pageCode != ''">
${_conditionType_} a.pageCode like #{${_conditionParam_}.pageCode}
<if test="conditionParamRef.containsKey('firstCode')">
<if test="conditionParamRef.firstCode != null and conditionParamRef.firstCode != ''">
${_conditionType_} a.firstCode like #{${_conditionParam_}.firstCode}
</if>
<if test="conditionParamRef.firstCode == null">
${_conditionType_} a.firstCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('firstCodeList') and conditionParamRef.firstCodeList.size() > 0">
${_conditionType_} a.firstCode in
<foreach collection="conditionParamRef.firstCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('firstCodeNotList') and conditionParamRef.firstCodeNotList.size() > 0">
${_conditionType_} a.firstCode not in
<foreach collection="conditionParamRef.firstCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('firstName')">
<if test="conditionParamRef.firstName != null and conditionParamRef.firstName != ''">
${_conditionType_} a.firstName like #{${_conditionParam_}.firstName}
</if>
<if test="conditionParamRef.firstName == null">
${_conditionType_} a.firstName is null
</if>
</if>
<if test="conditionParamRef.containsKey('firstNameList') and conditionParamRef.firstNameList.size() > 0">
${_conditionType_} a.firstName in
<foreach collection="conditionParamRef.firstNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('firstNameNotList') and conditionParamRef.firstNameNotList.size() > 0">
${_conditionType_} a.firstName not in
<foreach collection="conditionParamRef.firstNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('secondCode')">
<if test="conditionParamRef.secondCode != null and conditionParamRef.secondCode != ''">
${_conditionType_} a.secondCode like #{${_conditionParam_}.secondCode}
</if>
<if test="conditionParamRef.secondCode == null">
${_conditionType_} a.secondCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('secondCodeList') and conditionParamRef.secondCodeList.size() > 0">
${_conditionType_} a.secondCode in
<foreach collection="conditionParamRef.secondCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('secondCodeNotList') and conditionParamRef.secondCodeNotList.size() > 0">
${_conditionType_} a.secondCode not in
<foreach collection="conditionParamRef.secondCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('secondName')">
<if test="conditionParamRef.secondName != null and conditionParamRef.secondName != ''">
${_conditionType_} a.secondName like #{${_conditionParam_}.secondName}
</if>
<if test="conditionParamRef.secondName == null">
${_conditionType_} a.secondName is null
</if>
</if>
<if test="conditionParamRef.containsKey('secondNameList') and conditionParamRef.secondNameList.size() > 0">
${_conditionType_} a.secondName in
<foreach collection="conditionParamRef.secondNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('secondNameNotList') and conditionParamRef.secondNameNotList.size() > 0">
${_conditionType_} a.secondName not in
<foreach collection="conditionParamRef.secondNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('thirdCode')">
<if test="conditionParamRef.thirdCode != null and conditionParamRef.thirdCode != ''">
${_conditionType_} a.thirdCode like #{${_conditionParam_}.thirdCode}
</if>
<if test="conditionParamRef.thirdCode == null">
${_conditionType_} a.thirdCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('thirdCodeList') and conditionParamRef.thirdCodeList.size() > 0">
${_conditionType_} a.thirdCode in
<foreach collection="conditionParamRef.thirdCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('thirdCodeNotList') and conditionParamRef.thirdCodeNotList.size() > 0">
${_conditionType_} a.thirdCode not in
<foreach collection="conditionParamRef.thirdCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('thirdName')">
<if test="conditionParamRef.thirdName != null and conditionParamRef.thirdName != ''">
${_conditionType_} a.thirdName like #{${_conditionParam_}.thirdName}
</if>
<if test="conditionParamRef.pageCode == null">
${_conditionType_} a.pageCode is null
<if test="conditionParamRef.thirdName == null">
${_conditionType_} a.thirdName is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageCodeList')">
${_conditionType_} a.pageCode in
<foreach collection="conditionParamRef.pageCodeList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('thirdNameList') and conditionParamRef.thirdNameList.size() > 0">
${_conditionType_} a.thirdName in
<foreach collection="conditionParamRef.thirdNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageCodeNotList')">
${_conditionType_} a.pageCode not in
<foreach collection="conditionParamRef.pageCodeNotList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('thirdNameNotList') and conditionParamRef.thirdNameNotList.size() > 0">
${_conditionType_} a.thirdName not in
<foreach collection="conditionParamRef.thirdNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageName')">
<if test="conditionParamRef.pageName != null and conditionParamRef.pageName != ''">
${_conditionType_} a.pageName like #{${_conditionParam_}.pageName}
<if test="conditionParamRef.containsKey('fourthCode')">
<if test="conditionParamRef.fourthCode != null and conditionParamRef.fourthCode != ''">
${_conditionType_} a.fourthCode like #{${_conditionParam_}.fourthCode}
</if>
<if test="conditionParamRef.pageName == null">
${_conditionType_} a.pageName is null
<if test="conditionParamRef.fourthCode == null">
${_conditionType_} a.fourthCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageNameList')">
${_conditionType_} a.pageName in
<foreach collection="conditionParamRef.pageNameList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('fourthCodeList') and conditionParamRef.fourthCodeList.size() > 0">
${_conditionType_} a.fourthCode in
<foreach collection="conditionParamRef.fourthCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageNameNotList')">
${_conditionType_} a.pageName not in
<foreach collection="conditionParamRef.pageNameNotList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('fourthCodeNotList') and conditionParamRef.fourthCodeNotList.size() > 0">
${_conditionType_} a.fourthCode not in
<foreach collection="conditionParamRef.fourthCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('sceneDepth')">
<if test="conditionParamRef.sceneDepth != null ">
${_conditionType_} a.sceneDepth = #{${_conditionParam_}.sceneDepth}
<if test="conditionParamRef.containsKey('fourthName')">
<if test="conditionParamRef.fourthName != null and conditionParamRef.fourthName != ''">
${_conditionType_} a.fourthName like #{${_conditionParam_}.fourthName}
</if>
<if test="conditionParamRef.fourthName == null">
${_conditionType_} a.fourthName is null
</if>
</if>
<if test="conditionParamRef.containsKey('fourthNameList') and conditionParamRef.fourthNameList.size() > 0">
${_conditionType_} a.fourthName in
<foreach collection="conditionParamRef.fourthNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('fourthNameNotList') and conditionParamRef.fourthNameNotList.size() > 0">
${_conditionType_} a.fourthName not in
<foreach collection="conditionParamRef.fourthNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('accessContent')">
<if test="conditionParamRef.accessContent != null and conditionParamRef.accessContent != ''">
${_conditionType_} a.accessContent like #{${_conditionParam_}.accessContent}
</if>
<if test="conditionParamRef.accessContent == null">
${_conditionType_} a.accessContent is null
</if>
</if>
<if test="conditionParamRef.containsKey('accessContentList') and conditionParamRef.accessContentList.size() > 0">
${_conditionType_} a.accessContent in
<foreach collection="conditionParamRef.accessContentList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('accessContentNotList') and conditionParamRef.accessContentNotList.size() > 0">
${_conditionType_} a.accessContent not in
<foreach collection="conditionParamRef.accessContentNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageDepth')">
<if test="conditionParamRef.pageDepth != null ">
${_conditionType_} a.pageDepth = #{${_conditionParam_}.pageDepth}
</if>
<if test="conditionParamRef.sceneDepth == null">
${_conditionType_} a.sceneDepth is null
<if test="conditionParamRef.pageDepth == null">
${_conditionType_} a.pageDepth is null
</if>
</if>
<if test="conditionParamRef.containsKey('sceneDepthList')">
${_conditionType_} a.sceneDepth in
<foreach collection="conditionParamRef.sceneDepthList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('pageDepthList') and conditionParamRef.pageDepthList.size() > 0">
${_conditionType_} a.pageDepth in
<foreach collection="conditionParamRef.pageDepthList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('sceneDepthNotList')">
${_conditionType_} a.sceneDepth not in
<foreach collection="conditionParamRef.sceneDepthNotList" open="(" close=")" index="index" item="item" separator=",">
<if test="conditionParamRef.containsKey('pageDepthNotList') and conditionParamRef.pageDepthNotList.size() > 0">
${_conditionType_} a.pageDepth not in
<foreach collection="conditionParamRef.pageDepthNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('sceneDepthStart') and conditionParamRef.sceneDepthStart != null">
${_conditionType_} a.sceneDepth <![CDATA[ >= ]]> #{${_conditionParam_}.sceneDepthStart}
<if test="conditionParamRef.containsKey('pageDepthStart') and conditionParamRef.pageDepthStart != null">
${_conditionType_} a.pageDepth <![CDATA[ >= ]]> #{${_conditionParam_}.pageDepthStart}
</if>
<if test="conditionParamRef.containsKey('sceneDepthEnd') and conditionParamRef.sceneDepthEnd != null">
${_conditionType_} a.sceneDepth <![CDATA[ <= ]]> #{${_conditionParam_}.sceneDepthEnd}
<if test="conditionParamRef.containsKey('pageDepthEnd') and conditionParamRef.pageDepthEnd != null">
${_conditionType_} a.pageDepth <![CDATA[ <= ]]> #{${_conditionParam_}.pageDepthEnd}
</if>
<if test="conditionParamRef.containsKey('createUserId')">
......@@ -480,13 +760,13 @@
${_conditionType_} a.createUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('createUserIdList')">
<if test="conditionParamRef.containsKey('createUserIdList') and conditionParamRef.createUserIdList.size() > 0">
${_conditionType_} a.createUserId in
<foreach collection="conditionParamRef.createUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('createUserIdNotList')">
<if test="conditionParamRef.containsKey('createUserIdNotList') and conditionParamRef.createUserIdNotList.size() > 0">
${_conditionType_} a.createUserId not in
<foreach collection="conditionParamRef.createUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -522,13 +802,13 @@
${_conditionType_} a.updateUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('updateUserIdList')">
<if test="conditionParamRef.containsKey('updateUserIdList') and conditionParamRef.updateUserIdList.size() > 0">
${_conditionType_} a.updateUserId in
<foreach collection="conditionParamRef.updateUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('updateUserIdNotList')">
<if test="conditionParamRef.containsKey('updateUserIdNotList') and conditionParamRef.updateUserIdNotList.size() > 0">
${_conditionType_} a.updateUserId not in
<foreach collection="conditionParamRef.updateUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -574,6 +854,11 @@
<if test='orderCol.id != null and "DESC".equalsIgnoreCase(orderCol.id)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('deviceNum')">
a.deviceNum
<if test='orderCol.deviceNum != null and "DESC".equalsIgnoreCase(orderCol.deviceNum)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('productId')">
a.productId
<if test='orderCol.productId != null and "DESC".equalsIgnoreCase(orderCol.productId)'>DESC</if>
......@@ -584,19 +869,54 @@
<if test='orderCol.productName != null and "DESC".equalsIgnoreCase(orderCol.productName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('pageCode')">
a.pageCode
<if test='orderCol.pageCode != null and "DESC".equalsIgnoreCase(orderCol.pageCode)'>DESC</if>
<if test="orderCol.containsKey('firstCode')">
a.firstCode
<if test='orderCol.firstCode != null and "DESC".equalsIgnoreCase(orderCol.firstCode)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('firstName')">
a.firstName
<if test='orderCol.firstName != null and "DESC".equalsIgnoreCase(orderCol.firstName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('secondCode')">
a.secondCode
<if test='orderCol.secondCode != null and "DESC".equalsIgnoreCase(orderCol.secondCode)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('secondName')">
a.secondName
<if test='orderCol.secondName != null and "DESC".equalsIgnoreCase(orderCol.secondName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('thirdCode')">
a.thirdCode
<if test='orderCol.thirdCode != null and "DESC".equalsIgnoreCase(orderCol.thirdCode)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('thirdName')">
a.thirdName
<if test='orderCol.thirdName != null and "DESC".equalsIgnoreCase(orderCol.thirdName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('fourthCode')">
a.fourthCode
<if test='orderCol.fourthCode != null and "DESC".equalsIgnoreCase(orderCol.fourthCode)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('fourthName')">
a.fourthName
<if test='orderCol.fourthName != null and "DESC".equalsIgnoreCase(orderCol.fourthName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('pageName')">
a.pageName
<if test='orderCol.pageName != null and "DESC".equalsIgnoreCase(orderCol.pageName)'>DESC</if>
<if test="orderCol.containsKey('accessContent')">
a.accessContent
<if test='orderCol.accessContent != null and "DESC".equalsIgnoreCase(orderCol.accessContent)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('sceneDepth')">
a.sceneDepth
<if test='orderCol.sceneDepth != null and "DESC".equalsIgnoreCase(orderCol.sceneDepth)'>DESC</if>
<if test="orderCol.containsKey('pageDepth')">
a.pageDepth
<if test='orderCol.pageDepth != null and "DESC".equalsIgnoreCase(orderCol.pageDepth)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('createUserId')">
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.page.dao.ibatis.PageAccessDaoImpl">
<!-- 信息流分析 -->
<select id="getInformationFlow" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.PageAccessEntity">
SELECT
FROM_UNIXTIME(floor(unix_timestamp(t.createTime)/(#{particleSize}))*#{particleSize},'%Y-%m-%d %k:%i:%s') AS dateStr,
FROM_UNIXTIME(floor(unix_timestamp(t.createTime)/(#{particleSize}))*#{particleSize},'%k:%i:%s') AS timeStr,
t.productId,
t.productName,
t.firstCode,
t.firstName,
IFNULL(t.secondCode,'--') as secondCode,
IFNULL(t.secondName,'--') as secondName,
IFNULL(t.thirdCode,'--') as thirdCode,
IFNULL(t.thirdName,'--') as thirdName,
IFNULL(t.fourthCode,'--') as fourthCode,
IFNULL(t.fourthName,'--') as fourthName,
COUNT(t.id) as accessCount,
MAX(t.pageDepth) as pageDepth
FROM
mortals_xhx_page_access t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
t.firstCode,
t.firstName,
IFNULL(t.secondCode,'--'),
IFNULL(t.secondName,'--'),
IFNULL(t.thirdCode,'--'),
IFNULL(t.thirdName,'--'),
IFNULL(t.fourthCode,'--'),
IFNULL(t.fourthName,'--'),
FLOOR(unix_timestamp(t.createTime)/#{particleSize})
</select>
</mapper>
\ No newline at end of file
......@@ -6,6 +6,7 @@
<!-- 字段和属性映射 -->
<resultMap type="PageEventEntity" id="PageEventEntity-Map">
<id property="id" column="id" />
<result property="deviceNum" column="deviceNum" />
<result property="productId" column="productId" />
<result property="productName" column="productName" />
<result property="businessCode" column="businessCode" />
......@@ -30,6 +31,9 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('deviceNum') or colPickMode == 1 and data.containsKey('deviceNum')))">
a.deviceNum,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productId') or colPickMode == 1 and data.containsKey('productId')))">
a.productId,
</if>
......@@ -77,18 +81,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="PageEventEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_page_event
(productId,productName,businessCode,businessName,eventCode,eventName,takeTime,pageCode,pageName,coordinate,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,businessCode,businessName,eventCode,eventName,takeTime,pageCode,pageName,coordinate,createUserId,createTime,updateUserId,updateTime)
VALUES
(#{productId},#{productName},#{businessCode},#{businessName},#{eventCode},#{eventName},#{takeTime},#{pageCode},#{pageName},#{coordinate},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
(#{deviceNum},#{productId},#{productName},#{businessCode},#{businessName},#{eventCode},#{eventName},#{takeTime},#{pageCode},#{pageName},#{coordinate},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_page_event
(productId,productName,businessCode,businessName,eventCode,eventName,takeTime,pageCode,pageName,coordinate,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,businessCode,businessName,eventCode,eventName,takeTime,pageCode,pageName,coordinate,createUserId,createTime,updateUserId,updateTime)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.productId},#{item.productName},#{item.businessCode},#{item.businessName},#{item.eventCode},#{item.eventName},#{item.takeTime},#{item.pageCode},#{item.pageName},#{item.coordinate},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
(#{item.deviceNum},#{item.productId},#{item.productName},#{item.businessCode},#{item.businessName},#{item.eventCode},#{item.eventName},#{item.takeTime},#{item.pageCode},#{item.pageName},#{item.coordinate},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
</foreach>
</insert>
......@@ -98,6 +102,9 @@
update mortals_xhx_page_event as a
set
<trim suffixOverrides="," suffix="">
<if test="(colPickMode==0 and data.containsKey('deviceNum')) or (colPickMode==1 and !data.containsKey('deviceNum'))">
a.deviceNum=#{data.deviceNum},
</if>
<if test="(colPickMode==0 and data.containsKey('productId')) or (colPickMode==1 and !data.containsKey('productId'))">
a.productId=#{data.productId},
</if>
......@@ -164,6 +171,13 @@
<update id="updateBatch" parameterType="paramDto">
update mortals_xhx_page_event as a
<trim prefix="set" suffixOverrides=",">
<trim prefix="deviceNum=(case" suffix="ELSE deviceNum end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('deviceNum')) or (colPickMode==1 and !item.containsKey('deviceNum'))">
when a.id=#{item.id} then #{item.deviceNum}
</if>
</foreach>
</trim>
<trim prefix="productId=(case" suffix="ELSE productId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
......@@ -406,13 +420,13 @@
${_conditionType_} a.id is null
</if>
</if>
<if test="conditionParamRef.containsKey('idList')">
<if test="conditionParamRef.containsKey('idList') and conditionParamRef.idList.size() > 0">
${_conditionType_} a.id in
<foreach collection="conditionParamRef.idList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('idNotList')">
<if test="conditionParamRef.containsKey('idNotList') and conditionParamRef.idNotList.size() > 0">
${_conditionType_} a.id not in
<foreach collection="conditionParamRef.idNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -425,6 +439,27 @@
${_conditionType_} a.id <![CDATA[ <= ]]> #{${_conditionParam_}.idEnd}
</if>
<if test="conditionParamRef.containsKey('deviceNum')">
<if test="conditionParamRef.deviceNum != null and conditionParamRef.deviceNum != ''">
${_conditionType_} a.deviceNum like #{${_conditionParam_}.deviceNum}
</if>
<if test="conditionParamRef.deviceNum == null">
${_conditionType_} a.deviceNum is null
</if>
</if>
<if test="conditionParamRef.containsKey('deviceNumList') and conditionParamRef.deviceNumList.size() > 0">
${_conditionType_} a.deviceNum in
<foreach collection="conditionParamRef.deviceNumList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('deviceNumNotList') and conditionParamRef.deviceNumNotList.size() > 0">
${_conditionType_} a.deviceNum not in
<foreach collection="conditionParamRef.deviceNumNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productId')">
<if test="conditionParamRef.productId != null ">
${_conditionType_} a.productId = #{${_conditionParam_}.productId}
......@@ -433,13 +468,13 @@
${_conditionType_} a.productId is null
</if>
</if>
<if test="conditionParamRef.containsKey('productIdList')">
<if test="conditionParamRef.containsKey('productIdList') and conditionParamRef.productIdList.size() > 0">
${_conditionType_} a.productId in
<foreach collection="conditionParamRef.productIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productIdNotList')">
<if test="conditionParamRef.containsKey('productIdNotList') and conditionParamRef.productIdNotList.size() > 0">
${_conditionType_} a.productId not in
<foreach collection="conditionParamRef.productIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -461,13 +496,13 @@
${_conditionType_} a.productName is null
</if>
</if>
<if test="conditionParamRef.containsKey('productNameList')">
<if test="conditionParamRef.containsKey('productNameList') and conditionParamRef.productNameList.size() > 0">
${_conditionType_} a.productName in
<foreach collection="conditionParamRef.productNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productNameNotList')">
<if test="conditionParamRef.containsKey('productNameNotList') and conditionParamRef.productNameNotList.size() > 0">
${_conditionType_} a.productName not in
<foreach collection="conditionParamRef.productNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -482,13 +517,13 @@
${_conditionType_} a.businessCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('businessCodeList')">
<if test="conditionParamRef.containsKey('businessCodeList') and conditionParamRef.businessCodeList.size() > 0">
${_conditionType_} a.businessCode in
<foreach collection="conditionParamRef.businessCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('businessCodeNotList')">
<if test="conditionParamRef.containsKey('businessCodeNotList') and conditionParamRef.businessCodeNotList.size() > 0">
${_conditionType_} a.businessCode not in
<foreach collection="conditionParamRef.businessCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -503,13 +538,13 @@
${_conditionType_} a.businessName is null
</if>
</if>
<if test="conditionParamRef.containsKey('businessNameList')">
<if test="conditionParamRef.containsKey('businessNameList') and conditionParamRef.businessNameList.size() > 0">
${_conditionType_} a.businessName in
<foreach collection="conditionParamRef.businessNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('businessNameNotList')">
<if test="conditionParamRef.containsKey('businessNameNotList') and conditionParamRef.businessNameNotList.size() > 0">
${_conditionType_} a.businessName not in
<foreach collection="conditionParamRef.businessNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -524,13 +559,13 @@
${_conditionType_} a.eventCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('eventCodeList')">
<if test="conditionParamRef.containsKey('eventCodeList') and conditionParamRef.eventCodeList.size() > 0">
${_conditionType_} a.eventCode in
<foreach collection="conditionParamRef.eventCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('eventCodeNotList')">
<if test="conditionParamRef.containsKey('eventCodeNotList') and conditionParamRef.eventCodeNotList.size() > 0">
${_conditionType_} a.eventCode not in
<foreach collection="conditionParamRef.eventCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -545,13 +580,13 @@
${_conditionType_} a.eventName is null
</if>
</if>
<if test="conditionParamRef.containsKey('eventNameList')">
<if test="conditionParamRef.containsKey('eventNameList') and conditionParamRef.eventNameList.size() > 0">
${_conditionType_} a.eventName in
<foreach collection="conditionParamRef.eventNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('eventNameNotList')">
<if test="conditionParamRef.containsKey('eventNameNotList') and conditionParamRef.eventNameNotList.size() > 0">
${_conditionType_} a.eventName not in
<foreach collection="conditionParamRef.eventNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -565,13 +600,13 @@
${_conditionType_} a.takeTime is null
</if>
</if>
<if test="conditionParamRef.containsKey('takeTimeList')">
<if test="conditionParamRef.containsKey('takeTimeList') and conditionParamRef.takeTimeList.size() > 0">
${_conditionType_} a.takeTime in
<foreach collection="conditionParamRef.takeTimeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('takeTimeNotList')">
<if test="conditionParamRef.containsKey('takeTimeNotList') and conditionParamRef.takeTimeNotList.size() > 0">
${_conditionType_} a.takeTime not in
<foreach collection="conditionParamRef.takeTimeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -593,13 +628,13 @@
${_conditionType_} a.pageCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageCodeList')">
<if test="conditionParamRef.containsKey('pageCodeList') and conditionParamRef.pageCodeList.size() > 0">
${_conditionType_} a.pageCode in
<foreach collection="conditionParamRef.pageCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageCodeNotList')">
<if test="conditionParamRef.containsKey('pageCodeNotList') and conditionParamRef.pageCodeNotList.size() > 0">
${_conditionType_} a.pageCode not in
<foreach collection="conditionParamRef.pageCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -614,13 +649,13 @@
${_conditionType_} a.pageName is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageNameList')">
<if test="conditionParamRef.containsKey('pageNameList') and conditionParamRef.pageNameList.size() > 0">
${_conditionType_} a.pageName in
<foreach collection="conditionParamRef.pageNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageNameNotList')">
<if test="conditionParamRef.containsKey('pageNameNotList') and conditionParamRef.pageNameNotList.size() > 0">
${_conditionType_} a.pageName not in
<foreach collection="conditionParamRef.pageNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -635,13 +670,13 @@
${_conditionType_} a.coordinate is null
</if>
</if>
<if test="conditionParamRef.containsKey('coordinateList')">
<if test="conditionParamRef.containsKey('coordinateList') and conditionParamRef.coordinateList.size() > 0">
${_conditionType_} a.coordinate in
<foreach collection="conditionParamRef.coordinateList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('coordinateNotList')">
<if test="conditionParamRef.containsKey('coordinateNotList') and conditionParamRef.coordinateNotList.size() > 0">
${_conditionType_} a.coordinate not in
<foreach collection="conditionParamRef.coordinateNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -655,13 +690,13 @@
${_conditionType_} a.createUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('createUserIdList')">
<if test="conditionParamRef.containsKey('createUserIdList') and conditionParamRef.createUserIdList.size() > 0">
${_conditionType_} a.createUserId in
<foreach collection="conditionParamRef.createUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('createUserIdNotList')">
<if test="conditionParamRef.containsKey('createUserIdNotList') and conditionParamRef.createUserIdNotList.size() > 0">
${_conditionType_} a.createUserId not in
<foreach collection="conditionParamRef.createUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -697,13 +732,13 @@
${_conditionType_} a.updateUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('updateUserIdList')">
<if test="conditionParamRef.containsKey('updateUserIdList') and conditionParamRef.updateUserIdList.size() > 0">
${_conditionType_} a.updateUserId in
<foreach collection="conditionParamRef.updateUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('updateUserIdNotList')">
<if test="conditionParamRef.containsKey('updateUserIdNotList') and conditionParamRef.updateUserIdNotList.size() > 0">
${_conditionType_} a.updateUserId not in
<foreach collection="conditionParamRef.updateUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -749,6 +784,11 @@
<if test='orderCol.id != null and "DESC".equalsIgnoreCase(orderCol.id)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('deviceNum')">
a.deviceNum
<if test='orderCol.deviceNum != null and "DESC".equalsIgnoreCase(orderCol.deviceNum)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('productId')">
a.productId
<if test='orderCol.productId != null and "DESC".equalsIgnoreCase(orderCol.productId)'>DESC</if>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.page.dao.ibatis.PageEventDaoImpl">
<!-- 事件分析 -->
<select id="getPageEventCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.PageEventCensusVo">
SELECT
t.eventCode,
t.eventName,
FLOOR(count(id)/(DATEDIFF(MAX(t.createTime),MIN(t.createTime))+1)) as dayAvg,
FORMAT(AVG(t.takeTime)/1000,2) as takeTimeAvg
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
AND t.eventCode IS NOT NULL
GROUP BY
t.eventCode,
t.eventName
</select>
<!-- 产品热力图 -->
<select id="getProductHotCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.ProductHotCensusVo">
SELECT * FROM (
SELECT
t.businessCode,
t.businessName,
t.coordinate,
SUBSTRING_INDEX(t.coordinate,',',1) AS x,
SUBSTRING_INDEX(t.coordinate,',',-1) AS y,
COUNT(t.id) AS `value`
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
AND t.businessCode IS NOT NULL
AND t.businessCode !=''
AND t.coordinate IS NOT NULL
AND t.coordinate !=''
AND t.pageCode = #{pageCode}
GROUP BY
t.businessCode,
t.businessName,
t.coordinate
) as a ORDER BY `value` DESC LIMIT 10
</select>
<!-- 页面访问指标趋势 -->
<select id="getPageAccessTrend" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT
date_format(createTime, '%m-%d') AS accessDay,
COUNT(t.id) AS accessCount
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
date_format(createTime, '%m-%d')
</select>
<!-- 页面访问次数TOP10 -->
<select id="getPageAccessTop" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT * FROM (
SELECT
t.pageCode,
t.pageName,
COUNT(t.id) AS accessCount
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
t.pageCode,
t.pageName
) as a ORDER BY accessCount DESC LIMIT 10
</select>
<!-- 使用习惯 -->
<select id="getUsageCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.UsageCensusVo">
SELECT
t.businessCode,
t.businessName,
COUNT(t.id) as accessCount
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
AND t.businessCode IS NOT NULL
AND t.businessCode !=''
<if test="businessCodeList != null and businessCodeList.size() > 0">
AND t.businessCode in
<foreach collection="businessCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
GROUP BY
t.businessCode,
t.businessName
</select>
</mapper>
\ No newline at end of file
......@@ -6,6 +6,7 @@
<!-- 字段和属性映射 -->
<resultMap type="PageInfoEntity" id="PageInfoEntity-Map">
<id property="id" column="id" />
<result property="deviceNum" column="deviceNum" />
<result property="productId" column="productId" />
<result property="productName" column="productName" />
<result property="pageCode" column="pageCode" />
......@@ -25,6 +26,9 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('deviceNum') or colPickMode == 1 and data.containsKey('deviceNum')))">
a.deviceNum,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productId') or colPickMode == 1 and data.containsKey('productId')))">
a.productId,
</if>
......@@ -57,18 +61,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="PageInfoEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_page_info
(productId,productName,pageCode,pageName,screenUrl,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,pageCode,pageName,screenUrl,createUserId,createTime,updateUserId,updateTime)
VALUES
(#{productId},#{productName},#{pageCode},#{pageName},#{screenUrl},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
(#{deviceNum},#{productId},#{productName},#{pageCode},#{pageName},#{screenUrl},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_page_info
(productId,productName,pageCode,pageName,screenUrl,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,pageCode,pageName,screenUrl,createUserId,createTime,updateUserId,updateTime)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.productId},#{item.productName},#{item.pageCode},#{item.pageName},#{item.screenUrl},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
(#{item.deviceNum},#{item.productId},#{item.productName},#{item.pageCode},#{item.pageName},#{item.screenUrl},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
</foreach>
</insert>
......@@ -78,6 +82,9 @@
update mortals_xhx_page_info as a
set
<trim suffixOverrides="," suffix="">
<if test="(colPickMode==0 and data.containsKey('deviceNum')) or (colPickMode==1 and !data.containsKey('deviceNum'))">
a.deviceNum=#{data.deviceNum},
</if>
<if test="(colPickMode==0 and data.containsKey('productId')) or (colPickMode==1 and !data.containsKey('productId'))">
a.productId=#{data.productId},
</if>
......@@ -126,6 +133,13 @@
<update id="updateBatch" parameterType="paramDto">
update mortals_xhx_page_info as a
<trim prefix="set" suffixOverrides=",">
<trim prefix="deviceNum=(case" suffix="ELSE deviceNum end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('deviceNum')) or (colPickMode==1 and !item.containsKey('deviceNum'))">
when a.id=#{item.id} then #{item.deviceNum}
</if>
</foreach>
</trim>
<trim prefix="productId=(case" suffix="ELSE productId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
......@@ -328,13 +342,13 @@
${_conditionType_} a.id is null
</if>
</if>
<if test="conditionParamRef.containsKey('idList')">
<if test="conditionParamRef.containsKey('idList') and conditionParamRef.idList.size() > 0">
${_conditionType_} a.id in
<foreach collection="conditionParamRef.idList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('idNotList')">
<if test="conditionParamRef.containsKey('idNotList') and conditionParamRef.idNotList.size() > 0">
${_conditionType_} a.id not in
<foreach collection="conditionParamRef.idNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -347,6 +361,27 @@
${_conditionType_} a.id <![CDATA[ <= ]]> #{${_conditionParam_}.idEnd}
</if>
<if test="conditionParamRef.containsKey('deviceNum')">
<if test="conditionParamRef.deviceNum != null and conditionParamRef.deviceNum != ''">
${_conditionType_} a.deviceNum like #{${_conditionParam_}.deviceNum}
</if>
<if test="conditionParamRef.deviceNum == null">
${_conditionType_} a.deviceNum is null
</if>
</if>
<if test="conditionParamRef.containsKey('deviceNumList') and conditionParamRef.deviceNumList.size() > 0">
${_conditionType_} a.deviceNum in
<foreach collection="conditionParamRef.deviceNumList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('deviceNumNotList') and conditionParamRef.deviceNumNotList.size() > 0">
${_conditionType_} a.deviceNum not in
<foreach collection="conditionParamRef.deviceNumNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productId')">
<if test="conditionParamRef.productId != null ">
${_conditionType_} a.productId = #{${_conditionParam_}.productId}
......@@ -355,13 +390,13 @@
${_conditionType_} a.productId is null
</if>
</if>
<if test="conditionParamRef.containsKey('productIdList')">
<if test="conditionParamRef.containsKey('productIdList') and conditionParamRef.productIdList.size() > 0">
${_conditionType_} a.productId in
<foreach collection="conditionParamRef.productIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productIdNotList')">
<if test="conditionParamRef.containsKey('productIdNotList') and conditionParamRef.productIdNotList.size() > 0">
${_conditionType_} a.productId not in
<foreach collection="conditionParamRef.productIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -383,13 +418,13 @@
${_conditionType_} a.productName is null
</if>
</if>
<if test="conditionParamRef.containsKey('productNameList')">
<if test="conditionParamRef.containsKey('productNameList') and conditionParamRef.productNameList.size() > 0">
${_conditionType_} a.productName in
<foreach collection="conditionParamRef.productNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productNameNotList')">
<if test="conditionParamRef.containsKey('productNameNotList') and conditionParamRef.productNameNotList.size() > 0">
${_conditionType_} a.productName not in
<foreach collection="conditionParamRef.productNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -404,13 +439,13 @@
${_conditionType_} a.pageCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageCodeList')">
<if test="conditionParamRef.containsKey('pageCodeList') and conditionParamRef.pageCodeList.size() > 0">
${_conditionType_} a.pageCode in
<foreach collection="conditionParamRef.pageCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageCodeNotList')">
<if test="conditionParamRef.containsKey('pageCodeNotList') and conditionParamRef.pageCodeNotList.size() > 0">
${_conditionType_} a.pageCode not in
<foreach collection="conditionParamRef.pageCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -425,13 +460,13 @@
${_conditionType_} a.pageName is null
</if>
</if>
<if test="conditionParamRef.containsKey('pageNameList')">
<if test="conditionParamRef.containsKey('pageNameList') and conditionParamRef.pageNameList.size() > 0">
${_conditionType_} a.pageName in
<foreach collection="conditionParamRef.pageNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('pageNameNotList')">
<if test="conditionParamRef.containsKey('pageNameNotList') and conditionParamRef.pageNameNotList.size() > 0">
${_conditionType_} a.pageName not in
<foreach collection="conditionParamRef.pageNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -446,13 +481,13 @@
${_conditionType_} a.screenUrl is null
</if>
</if>
<if test="conditionParamRef.containsKey('screenUrlList')">
<if test="conditionParamRef.containsKey('screenUrlList') and conditionParamRef.screenUrlList.size() > 0">
${_conditionType_} a.screenUrl in
<foreach collection="conditionParamRef.screenUrlList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('screenUrlNotList')">
<if test="conditionParamRef.containsKey('screenUrlNotList') and conditionParamRef.screenUrlNotList.size() > 0">
${_conditionType_} a.screenUrl not in
<foreach collection="conditionParamRef.screenUrlNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -466,13 +501,13 @@
${_conditionType_} a.createUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('createUserIdList')">
<if test="conditionParamRef.containsKey('createUserIdList') and conditionParamRef.createUserIdList.size() > 0">
${_conditionType_} a.createUserId in
<foreach collection="conditionParamRef.createUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('createUserIdNotList')">
<if test="conditionParamRef.containsKey('createUserIdNotList') and conditionParamRef.createUserIdNotList.size() > 0">
${_conditionType_} a.createUserId not in
<foreach collection="conditionParamRef.createUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -508,13 +543,13 @@
${_conditionType_} a.updateUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('updateUserIdList')">
<if test="conditionParamRef.containsKey('updateUserIdList') and conditionParamRef.updateUserIdList.size() > 0">
${_conditionType_} a.updateUserId in
<foreach collection="conditionParamRef.updateUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('updateUserIdNotList')">
<if test="conditionParamRef.containsKey('updateUserIdNotList') and conditionParamRef.updateUserIdNotList.size() > 0">
${_conditionType_} a.updateUserId not in
<foreach collection="conditionParamRef.updateUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -560,6 +595,11 @@
<if test='orderCol.id != null and "DESC".equalsIgnoreCase(orderCol.id)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('deviceNum')">
a.deviceNum
<if test='orderCol.deviceNum != null and "DESC".equalsIgnoreCase(orderCol.deviceNum)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('productId')">
a.productId
<if test='orderCol.productId != null and "DESC".equalsIgnoreCase(orderCol.productId)'>DESC</if>
......
......@@ -6,6 +6,7 @@
<!-- 字段和属性映射 -->
<resultMap type="PageRouteEntity" id="PageRouteEntity-Map">
<id property="id" column="id" />
<result property="deviceNum" column="deviceNum" />
<result property="productId" column="productId" />
<result property="productName" column="productName" />
<result property="sourceCode" column="sourceCode" />
......@@ -26,6 +27,9 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('deviceNum') or colPickMode == 1 and data.containsKey('deviceNum')))">
a.deviceNum,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('productId') or colPickMode == 1 and data.containsKey('productId')))">
a.productId,
</if>
......@@ -61,18 +65,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="PageRouteEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_page_route
(productId,productName,sourceCode,sourceName,targetCode,targetName,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,sourceCode,sourceName,targetCode,targetName,createUserId,createTime,updateUserId,updateTime)
VALUES
(#{productId},#{productName},#{sourceCode},#{sourceName},#{targetCode},#{targetName},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
(#{deviceNum},#{productId},#{productName},#{sourceCode},#{sourceName},#{targetCode},#{targetName},#{createUserId},#{createTime},#{updateUserId},#{updateTime})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_page_route
(productId,productName,sourceCode,sourceName,targetCode,targetName,createUserId,createTime,updateUserId,updateTime)
(deviceNum,productId,productName,sourceCode,sourceName,targetCode,targetName,createUserId,createTime,updateUserId,updateTime)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.productId},#{item.productName},#{item.sourceCode},#{item.sourceName},#{item.targetCode},#{item.targetName},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
(#{item.deviceNum},#{item.productId},#{item.productName},#{item.sourceCode},#{item.sourceName},#{item.targetCode},#{item.targetName},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime})
</foreach>
</insert>
......@@ -82,6 +86,9 @@
update mortals_xhx_page_route as a
set
<trim suffixOverrides="," suffix="">
<if test="(colPickMode==0 and data.containsKey('deviceNum')) or (colPickMode==1 and !data.containsKey('deviceNum'))">
a.deviceNum=#{data.deviceNum},
</if>
<if test="(colPickMode==0 and data.containsKey('productId')) or (colPickMode==1 and !data.containsKey('productId'))">
a.productId=#{data.productId},
</if>
......@@ -103,9 +110,6 @@
<if test="(colPickMode==0 and data.containsKey('targetName')) or (colPickMode==1 and !data.containsKey('targetName'))">
a.targetName=#{data.targetName},
</if>
<if test="(colPickMode==0 and data.containsKey('targetNameIncrement')) or (colPickMode==1 and !data.containsKey('targetNameIncrement'))">
a.targetName=ifnull(a.targetName,0) + #{data.targetNameIncrement},
</if>
<if test="(colPickMode==0 and data.containsKey('createUserId')) or (colPickMode==1 and !data.containsKey('createUserId'))">
a.createUserId=#{data.createUserId},
</if>
......@@ -136,6 +140,13 @@
<update id="updateBatch" parameterType="paramDto">
update mortals_xhx_page_route as a
<trim prefix="set" suffixOverrides=",">
<trim prefix="deviceNum=(case" suffix="ELSE deviceNum end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('deviceNum')) or (colPickMode==1 and !item.containsKey('deviceNum'))">
when a.id=#{item.id} then #{item.deviceNum}
</if>
</foreach>
</trim>
<trim prefix="productId=(case" suffix="ELSE productId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
......@@ -178,14 +189,9 @@
</trim>
<trim prefix="targetName=(case" suffix="ELSE targetName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
<when test="(colPickMode==0 and item.containsKey('targetName')) or (colPickMode==1 and !item.containsKey('targetName'))">
<if test="(colPickMode==0 and item.containsKey('targetName')) or (colPickMode==1 and !item.containsKey('targetName'))">
when a.id=#{item.id} then #{item.targetName}
</when>
<when test="(colPickMode==0 and item.containsKey('targetNameIncrement')) or (colPickMode==1 and !item.containsKey('targetNameIncrement'))">
when a.id=#{item.id} then ifnull(a.targetName,0) + #{item.targetNameIncrement}
</when>
</choose>
</if>
</foreach>
</trim>
<trim prefix="createUserId=(case" suffix="ELSE createUserId end),">
......@@ -350,13 +356,13 @@
${_conditionType_} a.id is null
</if>
</if>
<if test="conditionParamRef.containsKey('idList')">
<if test="conditionParamRef.containsKey('idList') and conditionParamRef.idList.size() > 0">
${_conditionType_} a.id in
<foreach collection="conditionParamRef.idList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('idNotList')">
<if test="conditionParamRef.containsKey('idNotList') and conditionParamRef.idNotList.size() > 0">
${_conditionType_} a.id not in
<foreach collection="conditionParamRef.idNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -369,6 +375,27 @@
${_conditionType_} a.id <![CDATA[ <= ]]> #{${_conditionParam_}.idEnd}
</if>
<if test="conditionParamRef.containsKey('deviceNum')">
<if test="conditionParamRef.deviceNum != null and conditionParamRef.deviceNum != ''">
${_conditionType_} a.deviceNum like #{${_conditionParam_}.deviceNum}
</if>
<if test="conditionParamRef.deviceNum == null">
${_conditionType_} a.deviceNum is null
</if>
</if>
<if test="conditionParamRef.containsKey('deviceNumList') and conditionParamRef.deviceNumList.size() > 0">
${_conditionType_} a.deviceNum in
<foreach collection="conditionParamRef.deviceNumList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('deviceNumNotList') and conditionParamRef.deviceNumNotList.size() > 0">
${_conditionType_} a.deviceNum not in
<foreach collection="conditionParamRef.deviceNumNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productId')">
<if test="conditionParamRef.productId != null ">
${_conditionType_} a.productId = #{${_conditionParam_}.productId}
......@@ -377,13 +404,13 @@
${_conditionType_} a.productId is null
</if>
</if>
<if test="conditionParamRef.containsKey('productIdList')">
<if test="conditionParamRef.containsKey('productIdList') and conditionParamRef.productIdList.size() > 0">
${_conditionType_} a.productId in
<foreach collection="conditionParamRef.productIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productIdNotList')">
<if test="conditionParamRef.containsKey('productIdNotList') and conditionParamRef.productIdNotList.size() > 0">
${_conditionType_} a.productId not in
<foreach collection="conditionParamRef.productIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -405,13 +432,13 @@
${_conditionType_} a.productName is null
</if>
</if>
<if test="conditionParamRef.containsKey('productNameList')">
<if test="conditionParamRef.containsKey('productNameList') and conditionParamRef.productNameList.size() > 0">
${_conditionType_} a.productName in
<foreach collection="conditionParamRef.productNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('productNameNotList')">
<if test="conditionParamRef.containsKey('productNameNotList') and conditionParamRef.productNameNotList.size() > 0">
${_conditionType_} a.productName not in
<foreach collection="conditionParamRef.productNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -426,13 +453,13 @@
${_conditionType_} a.sourceCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('sourceCodeList')">
<if test="conditionParamRef.containsKey('sourceCodeList') and conditionParamRef.sourceCodeList.size() > 0">
${_conditionType_} a.sourceCode in
<foreach collection="conditionParamRef.sourceCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('sourceCodeNotList')">
<if test="conditionParamRef.containsKey('sourceCodeNotList') and conditionParamRef.sourceCodeNotList.size() > 0">
${_conditionType_} a.sourceCode not in
<foreach collection="conditionParamRef.sourceCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -447,13 +474,13 @@
${_conditionType_} a.sourceName is null
</if>
</if>
<if test="conditionParamRef.containsKey('sourceNameList')">
<if test="conditionParamRef.containsKey('sourceNameList') and conditionParamRef.sourceNameList.size() > 0">
${_conditionType_} a.sourceName in
<foreach collection="conditionParamRef.sourceNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('sourceNameNotList')">
<if test="conditionParamRef.containsKey('sourceNameNotList') and conditionParamRef.sourceNameNotList.size() > 0">
${_conditionType_} a.sourceName not in
<foreach collection="conditionParamRef.sourceNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -468,45 +495,39 @@
${_conditionType_} a.targetCode is null
</if>
</if>
<if test="conditionParamRef.containsKey('targetCodeList')">
<if test="conditionParamRef.containsKey('targetCodeList') and conditionParamRef.targetCodeList.size() > 0">
${_conditionType_} a.targetCode in
<foreach collection="conditionParamRef.targetCodeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('targetCodeNotList')">
<if test="conditionParamRef.containsKey('targetCodeNotList') and conditionParamRef.targetCodeNotList.size() > 0">
${_conditionType_} a.targetCode not in
<foreach collection="conditionParamRef.targetCodeNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('targetName')">
<if test="conditionParamRef.targetName != null ">
${_conditionType_} a.targetName = #{${_conditionParam_}.targetName}
<if test="conditionParamRef.targetName != null and conditionParamRef.targetName != ''">
${_conditionType_} a.targetName like #{${_conditionParam_}.targetName}
</if>
<if test="conditionParamRef.targetName == null">
${_conditionType_} a.targetName is null
</if>
</if>
<if test="conditionParamRef.containsKey('targetNameList')">
<if test="conditionParamRef.containsKey('targetNameList') and conditionParamRef.targetNameList.size() > 0">
${_conditionType_} a.targetName in
<foreach collection="conditionParamRef.targetNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('targetNameNotList')">
<if test="conditionParamRef.containsKey('targetNameNotList') and conditionParamRef.targetNameNotList.size() > 0">
${_conditionType_} a.targetName not in
<foreach collection="conditionParamRef.targetNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('targetNameStart') and conditionParamRef.targetNameStart != null">
${_conditionType_} a.targetName <![CDATA[ >= ]]> #{${_conditionParam_}.targetNameStart}
</if>
<if test="conditionParamRef.containsKey('targetNameEnd') and conditionParamRef.targetNameEnd != null">
${_conditionType_} a.targetName <![CDATA[ <= ]]> #{${_conditionParam_}.targetNameEnd}
</if>
<if test="conditionParamRef.containsKey('createUserId')">
<if test="conditionParamRef.createUserId != null ">
${_conditionType_} a.createUserId = #{${_conditionParam_}.createUserId}
......@@ -515,13 +536,13 @@
${_conditionType_} a.createUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('createUserIdList')">
<if test="conditionParamRef.containsKey('createUserIdList') and conditionParamRef.createUserIdList.size() > 0">
${_conditionType_} a.createUserId in
<foreach collection="conditionParamRef.createUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('createUserIdNotList')">
<if test="conditionParamRef.containsKey('createUserIdNotList') and conditionParamRef.createUserIdNotList.size() > 0">
${_conditionType_} a.createUserId not in
<foreach collection="conditionParamRef.createUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -557,13 +578,13 @@
${_conditionType_} a.updateUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('updateUserIdList')">
<if test="conditionParamRef.containsKey('updateUserIdList') and conditionParamRef.updateUserIdList.size() > 0">
${_conditionType_} a.updateUserId in
<foreach collection="conditionParamRef.updateUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('updateUserIdNotList')">
<if test="conditionParamRef.containsKey('updateUserIdNotList') and conditionParamRef.updateUserIdNotList.size() > 0">
${_conditionType_} a.updateUserId not in
<foreach collection="conditionParamRef.updateUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
......@@ -609,6 +630,11 @@
<if test='orderCol.id != null and "DESC".equalsIgnoreCase(orderCol.id)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('deviceNum')">
a.deviceNum
<if test='orderCol.deviceNum != null and "DESC".equalsIgnoreCase(orderCol.deviceNum)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('productId')">
a.productId
<if test='orderCol.productId != null and "DESC".equalsIgnoreCase(orderCol.productId)'>DESC</if>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.page.dao.ibatis.PageRouteDaoImpl">
<!-- 路径图 -->
<select id="getPageWayCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.PageWayCensusVo">
SELECT
t.sourceCode AS source,
t.sourceName,
t.targetCode AS target,
t.targetName,
count(t.id) AS `value`
FROM
mortals_xhx_page_route t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
t.sourceCode,
t.sourceName,
t.targetCode,
t.targetName
</select>
<!-- 路径图 -->
<select id="getPageWayCode" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="java.util.HashMap">
SELECT DISTINCT a.* FROM
(
SELECT DISTINCT
sourceCode AS `code`,
sourceName AS `name`
FROM
mortals_xhx_page_route
WHERE
productId = #{productId}
AND createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
UNION
SELECT DISTINCT
targetCode AS `code`,
targetName AS `name`
FROM
mortals_xhx_page_route
WHERE
productId = #{productId}
AND createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
) AS a
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment