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

Merge remote-tracking branch 'origin/master'

parents 4d6aa33a ae855c32
......@@ -14,6 +14,7 @@ public class RespData<T> {
private T data;
private T entity;
private PageInfo pageInfo;
private Object dict;
public static void main(String[] args) {
......
package com.mortals.xhx.common.pdu.product;
import com.mortals.framework.model.BaseEntityLong;
public class ProductPdu extends BaseEntityLong {
private static final long serialVersionUID = 1L;
/**
* 关联平台
*/
private Long platformId;
/**
* 产品名称,名称唯一
*/
private String productName;
/**
* 产品编码
*/
private String productCode;
/**
* 皮肤id
*/
private Long skinId;
/**
* 皮肤名称
*/
private String skinName;
/**
* 首页地址
*/
private String homeUrl;
/**
* 事件地址,评价器使用
*/
private String eventUrl;
/**
* 备注
*/
private String productRemark;
public ProductPdu(){}
/**
* 获取 关联平台
* @return Long
*/
public Long getPlatformId(){
return platformId;
}
/**
* 设置 关联平台
* @param platformId
*/
public void setPlatformId(Long platformId){
this.platformId = platformId;
}
/**
* 获取 产品名称,名称唯一
* @return String
*/
public String getProductName(){
return productName;
}
/**
* 设置 产品名称,名称唯一
* @param productName
*/
public void setProductName(String productName){
this.productName = productName;
}
/**
* 获取 产品编码
* @return String
*/
public String getProductCode(){
return productCode;
}
/**
* 设置 产品编码
* @param productCode
*/
public void setProductCode(String productCode){
this.productCode = productCode;
}
/**
* 获取 皮肤id
* @return Long
*/
public Long getSkinId(){
return skinId;
}
/**
* 设置 皮肤id
* @param skinId
*/
public void setSkinId(Long skinId){
this.skinId = skinId;
}
/**
* 获取 皮肤名称
* @return String
*/
public String getSkinName(){
return skinName;
}
/**
* 设置 皮肤名称
* @param skinName
*/
public void setSkinName(String skinName){
this.skinName = skinName;
}
/**
* 获取 首页地址
* @return String
*/
public String getHomeUrl(){
return homeUrl;
}
/**
* 设置 首页地址
* @param homeUrl
*/
public void setHomeUrl(String homeUrl){
this.homeUrl = homeUrl;
}
/**
* 获取 事件地址,评价器使用
* @return String
*/
public String getEventUrl(){
return eventUrl;
}
/**
* 设置 事件地址,评价器使用
* @param eventUrl
*/
public void setEventUrl(String eventUrl){
this.eventUrl = eventUrl;
}
/**
* 获取 备注
* @return String
*/
public String getProductRemark(){
return productRemark;
}
/**
* 设置 备注
* @param productRemark
*/
public void setProductRemark(String productRemark){
this.productRemark = productRemark;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof ProductPdu) {
ProductPdu tmp = (ProductPdu) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",platformId:").append(getPlatformId());
sb.append(",productName:").append(getProductName());
sb.append(",productCode:").append(getProductCode());
sb.append(",skinId:").append(getSkinId());
sb.append(",skinName:").append(getSkinName());
sb.append(",homeUrl:").append(getHomeUrl());
sb.append(",eventUrl:").append(getEventUrl());
sb.append(",productRemark:").append(getProductRemark());
return sb.toString();
}
public void initAttrValue(){
this.platformId = null;
this.productName = "";
this.productCode = "";
this.skinId = null;
this.skinName = "";
this.homeUrl = "";
this.eventUrl = "";
this.productRemark = "";
}
}
package com.mortals.xhx.feign.product;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.product.ProductPdu;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@FeignClient(name = "device-manager", path = "/m", fallbackFactory = ProductFeignFallbackFactory.class)
public interface IProductFeign extends IFeign {
/**
* 查看产品列表
*
* @param productPdu
* @return
*/
@PostMapping(value = "/product/list")
Rest<RespData<List<ProductPdu>>> list(@RequestBody ProductPdu productPdu);
}
@Slf4j
@Component
class ProductFeignFallbackFactory implements FallbackFactory<IProductFeign> {
@Override
public IProductFeign create(Throwable throwable) {
return new IProductFeign(){
@Override
public Rest<RespData<List<ProductPdu>>> list(ProductPdu productPdu) {
return Rest.fail("暂时无法获取产品列表,请稍后再试!");
}
};
}
}
......@@ -18,4 +18,12 @@ export function getAccessAnalyse(params) {
//路径分析
export function getWayAccessAnalyse(params) {
return http.post(`${baseURL}/zwfw/act/analyse/wayAccessAnalyse`, params);
}
//使用习惯
export function getUsageCensus(params) {
return http.post(`${baseURL}/zwfw/act/analyse/usageCensus`, params);
}
//信息流分析
export function getInformationFlow(params) {
return http.post(`${baseURL}/zwfw/act/analyse/informationFlow`, params);
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -93,7 +93,6 @@ export default {
this.menuListData = data.data;
this.menuTreeData = toTreeData(data.data, -1, "id", "parentId");
this.SET_menuList_X(deepClone(this.menuListData));
this.SET_menuTree_X(deepClone(this.menuTreeData));
......
......@@ -6,7 +6,7 @@ const routes = [
redirect: "/home/dataManagement",
component: () =>
import(/* webpackChunkName: "home" */ "@/views/home/home.vue"),
meta: { title: "首页" },
meta: { title: "政务一体化平台" },
children: [
{
path: "dataManagement",
......@@ -232,27 +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: "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",
......@@ -436,6 +436,75 @@ const routes = [
),
meta: { title: "数据精算" },
},
{
path: "dataActuary/business",
name: "business",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/business/index.vue"
),
meta: { title: "业务数据分析" },
redirect: 'dataActuary/business/basecontent',
children: [
{
path: "basecontent",
name: "basecontent",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/business/basecontent/index.vue"
),
meta: { title: "基本分析" },
},
{
path: "analysiscontent",
name: "analysiscontent",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/business/analysiscontent/index.vue"
),
meta: { title: "分析结果" },
},
]
},
{
path: "dataActuary/portrayal",
name: "portrayal",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/portrayal/index.vue"
),
meta: { title: "群众画像图谱" },
redirect: 'dataActuary/portrayal/portrayalbase',
children: [
{
path: "portrayalbase",
name: "portrayalbase",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/portrayal/portrayalBase/index.vue"
),
meta: { title: "基本分析" },
},
{
path: "portrayalanalysis",
name: "portrayalanalysis",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/portrayal/portrayalAnalysis/index.vue"
),
meta: { title: "分析结果" },
},
]
},
{
path: "dataActuary/portrayal/register",
name: "register",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/portrayal/register/index.vue"
),
meta: { title: "群众注册列表" },
},
{
path: "dataActuary/behaviour",
name: "behaviour",
......
<template>
<!-- 事件分析 -->
<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.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="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary" @click="getList">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="mt20">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="false">
</a-table>
</div>
</div>
<!-- 事件分析 -->
<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.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="time"
style="width: 300px"
:allowClear="false"
/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary" @click="getList"> 开始分析 </a-button>
</a-form-model-item>
</a-form-model>
<div class="mt20">
<a-table
:columns="columns"
:data-source="data"
:scroll="{ y: 590 }"
:pagination="false"
>
</a-table>
</div>
</div>
</template>
<script>
import {getEventCensus} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
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",
customRender: (text, record, index) => `${index+1}`,
align: "center",
},
{
title: "事件",
dataIndex: "eventName",
align: "center",
},
{
title: '事件ID',
dataIndex: 'eventCode',
align: "center",
},
{
title: '事件数量(日均)',
dataIndex: 'dayAvg',
align: "center",
},
{
title: '事件平均使用时长(单次)',
dataIndex: 'takeTimeAvg',
align: "center",
}
],
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
})
}
}
};
<script>
import { getEventCensus } from "@/api/dataActuary.js";
import moment from "moment";
export default {
data() {
return {
queryform: {
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",
customRender: (text, record, index) => `${index + 1}`,
align: "center",
},
{
title: "事件",
dataIndex: "eventName",
align: "center",
},
{
title: "事件ID",
dataIndex: "eventCode",
align: "center",
},
{
title: "事件数量(日均)",
dataIndex: "dayAvg",
align: "center",
},
{
title: "事件平均使用时长(单次)",
dataIndex: "takeTimeAvg",
align: "center",
},
],
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;
});
},
},
};
</script>
<style lang="less" scoped>
.page{
padding: 15px;
}
<style lang="less" scoped>
.page {
padding: 15px;
}
</style>
\ No newline at end of file
......@@ -3,38 +3,39 @@
<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-option>
<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-date-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 200px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.particleType" style="width: 200px" placeholder="选择时间粒度">
<a-select-option value="1">10分钟</a-select-option>
<a-select-option value="2">30分钟</a-select-option>
<a-select-option value="3">1小时</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择一级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择二级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择三级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
......@@ -42,33 +43,56 @@
<div class="table-box">
<div class="mb">
<span style="margin-right: 30px;">指标筛选</span>
<a-checkbox-group v-model="queryform.value">
<a-checkbox value="1">访问人数</a-checkbox>
<a-checkbox value="2">打开次数</a-checkbox>
<a-checkbox value="3">访问页面数</a-checkbox>
<a-checkbox-group @change="changeIndex" v-model="indexList">
<a-checkbox value="accessCount">访问人数</a-checkbox>
<a-checkbox value="accessCount1">打开次数</a-checkbox>
<a-checkbox value="pageDepth">访问页面数</a-checkbox>
</a-checkbox-group>
</div>
<div class="mb">
<span style="margin-right: 30px;">对比筛选</span>
<a-checkbox-group v-model="queryform.value">
<a-checkbox value="1">日对比</a-checkbox>
</a-checkbox-group>
<a-checkbox @change="onChange">
日对比
</a-checkbox>
</div>
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="pagination">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="false">
<template slot="访问人数" slot-scope="text, record, index">
<div>{{record.accessCount}}</div>
<div v-show="queryform.isRatio == 1">日对比:{{(record.accessRatio * 100).toFixed(2)}}%</div>
</template>
<template slot="打开次数" slot-scope="text, record, index">
<div>{{record.accessCount}}</div>
<div v-show="queryform.isRatio == 1">日对比:{{(record.accessRatio * 100).toFixed(2)}}%</div>
</template>
<template slot="访问页面数" slot-scope="text, record, index">
<div>{{record.pageDepth}}</div>
<div v-show="queryform.isRatio == 1">日对比:{{(record.depthRatio * 100).toFixed(2)}}%</div>
</template>
</a-table>
</div>
</div>
</template>
<script>
<script>
import {getInformationFlow} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
},
queryform: {
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD'),
particleType:'1',
isRatio:0
},
time:moment().format('yyyy-MM-DD'),
product:[{
title:'排队机',
id:1
}],
indexList:['accessCount','accessCount1','pageDepth'],
labelCol: {
span: 1
},
......@@ -78,45 +102,55 @@
columns: [{
title: "序号",
width: "70px",
dataIndex: 'index',
customRender: (text, record, index) => `${index+1}`,
align: "center",
},
{
title: "时间",
dataIndex: "title",
dataIndex: "dateStr",
align: "center",
},
{
title: '产品名称',
dataIndex: 'address',
dataIndex: 'productName',
align: "center",
},
{
title: '一级场景',
dataIndex: 'address1',
dataIndex: 'firstName',
align: "center",
},
{
title: '二级场景',
dataIndex: 'address2',
dataIndex: 'secondName',
align: "center",
},
{
title: '三级场景',
dataIndex: 'address3',
dataIndex: 'thirdName',
align: "center",
},{
title: '访问人数',
dataIndex: 'address5',
dataIndex: 'accessCount',
align: "center",
scopedSlots: {
customRender: "访问人数",
},
},{
title: '打开次数',
dataIndex: 'address4',
dataIndex: 'accessCount1',
align: "center",
scopedSlots: {
customRender: "打开次数",
},
},{
title: '访问页面数',
dataIndex: 'address8',
dataIndex: 'pageDepth',
align: "center",
scopedSlots: {
customRender: "访问页面数",
},
}
],
data: [],
......@@ -126,8 +160,31 @@
showSizeChanger: true,
pageSizeOptions: ["10", "20", "50", "100"], //每页中显示的数据
showTotal: total => `共有 ${total} 条数据`, //分页中显示总的数据
},
},
filterColumns:[]
}
},
mounted() {
this.filterColumns = this.columns
this.getData()
},
methods:{
onChange(e){
this.queryform.isRatio = e.target.checked ? 1 : 0
this.getData()
},
changeIndex(e) {
e = e.concat(['index','dateStr','productName','firstName','secondName','thirdName'])
let columns = JSON.parse(JSON.stringify(this.filterColumns))
this.columns = columns.filter(item=> e.some(items=> item.dataIndex == items))
},
getData() {
this.queryform.dateTimeStart = this.time ? this.time : null
this.queryform.dateTimeStart = this.time ? this.time : null
getInformationFlow(this.queryform).then(res=>{
this.data = res.data
})
},
}
};
</script>
......
<template>
<!-- 使用习惯分析 -->
<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-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-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<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="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="charts-box">
<div id="canal"></div>
<!-- <div id="canal"></div> -->
<div id="type"></div>
<div id="way"></div>
<!-- <div id="way"></div> -->
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
import * as echarts from 'echarts'
import moment from 'moment';
import {getUsageCensus} from '@/api/dataActuary.js'
export default {
data() {
return {
queryform: {
value: null
},
queryform: {
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
}],
labelCol: {
span: 1
},
......@@ -42,12 +52,18 @@
},
}
},
mounted() {
this.initCanal()
this.initType()
this.initWay()
mounted() {
this.getData()
},
methods: {
getData() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getUsageCensus(this.queryform).then(res=>{
let data = res.data.map(({businessName,propValue})=>({name:businessName,value:propValue * 100}))
this.initType(data)
})
},
initWay(){
let chartDom = document.getElementById('way')
let myChart = echarts.init(chartDom);
......@@ -104,7 +120,8 @@
}]
})
},
initType() {
initType(data) {
console.log(data)
let chartDom = document.getElementById('type')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -123,7 +140,6 @@
},
color: ['#6395F9', '#64DAAB', '#647798', '#F6C02D', '#7567FA', '#75CBED'],
series: [{
name: 'Access From',
type: 'pie',
radius: '65%',
label: {
......@@ -136,27 +152,7 @@
length: 1
}
},
data: [{
value: 1048,
name: 'Search Engine'
},
{
value: 735,
name: 'Direct'
},
{
value: 580,
name: 'Email'
},
{
value: 484,
name: 'Union Ads'
},
{
value: 300,
name: 'Video Ads'
}
],
data: data
}]
})
},
......@@ -221,7 +217,7 @@
.charts-box {
flex: 1;
display: flex;
justify-content: space-between;
justify-content: center;
padding: 50px 0;
#canal,#type,#way {
......
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: {
type: String
},
height:{
type: String | Number,
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj) {
let arr= []
if(obj) {
obj.data.map((item)=>{
let objData= {
data: [],
name: '',
type: ''
}
if(item){
objData.data= item.data
objData.name= item.name
objData.type= item.type
arr.push(objData)
}
})
this.barInit(obj.title, obj.xData, arr)
}
}
},
methods: {
barInit(name, xData, data) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
title: {
text: name,
textStyle: {
fontSize: '14'
}
},
legend:{},
xAxis: {
type: 'category',
data: xData
},
yAxis: {
type: 'value'
},
series: data
}
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: {
type: String
},
height:{
type: String | Number,
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj){
if(obj) {
this.pieInit(obj.title, obj.pieName, obj.firstName, obj.firstVal, obj.firstTotal, obj.secondName, obj.secondVal, obj.secondTotal)
}
}
},
methods: {
pieInit(title, pieName, firstName, firstVal, firstTotal, secondName, secondVal, secondTotal) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
title: {
text: title,
textStyle: {
fontSize: '14'
}
},
series: [
{
name: pieName,
type: 'pie',
radius: ["55%", '70%'],
center: ['25%', '50%'],
label: {
show: false
},
data: [
{
value: firstVal,
name: firstName,
label: {
show: true,
position: 'center',
formatter: '{b|{b}}\n{d|{d}}%',
rich: {
b: {
fontSize: 14,
lineHeight: 30,
color: "#333"
},
d: {
fontSize: 14,
color: "#333",
lineHeight: 30,
fontWeight: "bold"
}
},
color: "#333"
},
itemStyle: {
color: '#04CA8F'
}
},
{
value: firstTotal - firstVal,
//不需要显示的数据,颜色设置成和背景一样
itemStyle: {
color: '#F0F2F5'
}
}
]
},
{
name: pieName,
type: 'pie',
radius: ["55%", '70%'],
center: ['75%', '50%'],
label: {
show: false
},
data: [
{
value: secondVal,
name: secondName,
label: {
show: true,
position: 'center',
formatter: '{b|{b}}\n{d|{d}}%',
rich: {
b: {
fontSize: 14,
lineHeight: 30,
color: "#333"
},
d: {
fontSize: 14,
color: "#333",
lineHeight: 30,
fontWeight: "bold"
}
},
color: "#333"
},
itemStyle: {
color: '#6394f9'
}
},
{
value: secondTotal - secondVal,
//不需要显示的数据,颜色设置成和背景一样
itemStyle: {
color: '#F0F2F5'
}
}
]
}
]
}
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: height+'px', width: width+'px'}"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: String,
height: {
type: String | Number
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj){
if(obj){
this.pieInit(obj.name, obj.val, obj.total, obj.color)
}
}
},
created() {
},
methods: {
pieInit(name, val, total, color) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
series: [
{
name: name,
type: 'pie',
radius: ["65%", '80%'],
center: ['50%', '50%'],
label: {
show: false
},
data: [
{
value: val,
name: name,
label: {
show: true,
position: 'center',
formatter: '{b|{b}}\n{d|{d}}%',
rich: {
b: {
fontSize: 14,
lineHeight: 30,
color: "#333"
},
d: {
fontSize: 14,
color: "#333",
lineHeight: 30,
fontWeight: "bold"
}
},
color: "#333"
},
itemStyle: {
color: color
}
},
{
value: total - val,
//不需要显示的数据,颜色设置成和背景一样
itemStyle: {
color: '#F0F2F5'
}
}]
}]
}
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: {
type: String
},
height: {
type: String | Number
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj){
let arr= []
if(obj){
obj.dataList.map((item)=>{
let obj= {
name: '',
type: 'line',
emphasis: {
focus: 'series'
},
data: []
}
if(item){
obj.name= item.name
obj.data= item.data
arr.push(obj)
}
})
this.lineInit(obj.title, obj.legend, obj.xData, arr)
}
}
},
methods: {
lineInit(title, legend, xData, data) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
title: {
text: title,
textStyle: {
fontSize: '14'
}
},
tooltip: {
trigger: 'axis'
},
legend: {
data: legend
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: xData
}
],
yAxis: [
{
type: 'value'
}
],
series: data
}
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script>
import axios from 'axios'
import * as echarts from 'echarts'
import china from "@/assets/json/china.json";
let myChart= null
export default {
props: {
id: {
type: String
},
height:{
type: String | Number,
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
created(){
echarts.registerMap('china', china);
},
watch:{
datas: function(obj) {
if(obj){
this.mapInit(obj.title, obj.data)
}
}
},
methods: {
mapInit(name, data) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
title: {
text: name,
textStyle: {
fontSize: '14'
}
},
tooltip: {
trigger: 'item',
formatter: '{b}: {c}'
},
series: [
{
name: 'china',
type: 'map',
map: 'china',
label: {
show: false
},
data: data
}
]
}
// axios.get('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json').then((chinaJson)=>{
// echarts.registerMap('china', chinaJson.data);
// myChart.setOption(option)
// })
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: {
type: String
},
height:{
type: String | Number,
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj){
if(obj){
this.pieInit(obj.title, obj.type, obj.legend, obj.data)
}
}
},
methods: {
pieInit(name, type, legend, data) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
title: {
text: name,
textStyle: {
fontSize: '14'
},
left: 'left'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
type: type,
orient: 'vertical',
right: 10,
top: 20,
bottom: 20,
data: legend
},
series: [
{
name: name,
type: 'pie',
radius: '45%',
center: ['50%', '50%'],
data: data,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div :id="id" :style="{height: this.height+'px', width: this.width+'px'}"></div>
</div>
</template>
<script >
import * as echarts from 'echarts'
let myChart= null
export default {
props: {
id: {
type: String
},
height:{
type: String | Number,
},
width:{
type: String | Number,
},
datas: Object
},
data() {
return {
}
},
watch:{
datas: function(obj){
if(obj){
this.pieInit(obj.data)
}
}
},
methods: {
pieInit(data) {
myChart = echarts.init(document.getElementById(this.id))
let option = {
radar: {
// shape: 'circle',
indicator: [
{ name: '在线预约', max: 100 },
{ name: '现场取号', max: 100 },
{ name: '个人申报', max: 100 },
{ name: '评价次数', max: 100 },
{ name: '意见建议', max: 100 },
{ name: '办不成事', max: 100 }
]
},
series: [
{
type: 'radar',
data: data
}
]
};
myChart.setOption(option)
// 让图表跟随屏幕自动的去适应
window.addEventListener('resize', function () {
myChart.resize()
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">分析结果</div>
</div>
</template>
<a-row type="flex" align="middle">
<a-col :span="4">
<div class="f_40 f_center">{{ formState.name }}</div>
<div class="f_center">业务名称</div>
</a-col>
<a-col :span="10">
<a-form layout="horizontal" :model="formState" :label-col="{span: 4}" :wrapper-col="{span: 20}">
<a-form-item label="流水号:">{{ formState.flownum }}</a-form-item>
<a-form-item label="关联排号:">{{ formState.device_name }}</a-form-item>
<a-form-item label="受理区域:">
<a-tag v-for="(item, index) in formState.region" :key="index">{{ item }}</a-tag>
</a-form-item>
<a-form-item label="是否延时:">{{ formState.isweek_work ? '是' : '否' }}</a-form-item>
<a-form-item label="优先叫号:">{{ formState.first ? '是' : '否' }}</a-form-item>
</a-form>
</a-col>
<a-col :span="10">
<a-form layout="horizontal" :model="formState" :label-col="{span: 4}" :wrapper-col="{span: 20}">
<a-form-item label="业务级别:">{{ formState.level }}</a-form-item>
<a-form-item label="父级业务:">{{ formState.parent_name }}</a-form-item>
<a-form-item label="关联事项:">
<a-tag v-for="(item, index) in formState.matter" :key="index">{{ item.matterName }}</a-tag>
</a-form-item>
<a-form-item label="是否预约:">{{ formState.canorder ? '允许' : '不允许'}}</a-form-item>
<a-form-item label="验证方式:">{{ }}</a-form-item>
</a-form>
</a-col>
</a-row>
</a-card>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">使用趋势</div>
</div>
</template>
<template #extra>
<a-select
ref="select"
v-model:value="useNumber"
:options="options"
style="width: 120px"
@change="handleChange"
>
</a-select>
</template>
<LineChart
:id="`one_line`"
:datas="lineData"
:height="200"
:width="1700"
/>
</a-card>
</div>
</template>
<script >
import axios from 'axios'
import LineChart from "../Component/line/index.vue";
export default {
components:{
LineChart
},
props:{
},
data(){
return{
options:[
{
value: '0',
label: '今天',
},
{
value: '1',
label: '近7日',
},
{
value: '2',
label: '近30日',
},
{
value: '3',
label: '近3个月',
},
{
value: '4',
label: '本年度',
},
],
lineData: {},
useNumber: '0',
checkName: '',
formState: {}
}
},
mounted(){
// this.getAnalysisData()
},
watch:{
'$route.query': {
immediate: true,
handler(newVal, oldVal){
this.checkName= newVal
this.getAnalysisData(newVal.name)
}
}
},
methods: {
async getAnalysisData(name, val) {
if(val == undefined) {
val= 0
}
await axios.get('http://192.168.0.98:8090/inter/statistic/busInfoById',{ params: {bus_name: name, selected: val }}).then((res)=>{
if(res && res.status == 200){
this.formState= res.data.data
console.log(this.formState)
}
})
},
handleChange(val){
this.getAnalysisData(this.checkName, val)
}
},
}
</script>
<style lang="less" scoped>
/deep/ .ant-form-item{
margin-bottom: 0
}
.head{
display: flex;
justify-content: flex-start;
align-items: center;
.head_title{
font-weight: 700;
font-style: normal;
font-size: 1.125rem;
color: #0595FD;
margin-right: 1.25rem;
}
.head_desc{
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #888888;
}
}
.mb_15{
margin-bottom: .9375rem;
}
.f_40{
font-size: 2.5rem;
}
.f_center{
text-align: center;
}
</style>
\ No newline at end of file
<template>
<div>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">整体情况</div>
<div class="head_desc">更新时间:{{ nowDate }}</div>
</div>
</template>
<a-row type="flex" align="middle">
<a-col :span="4">
<div class="f_40 f_center warning">{{ situation.lev1_nums }}</div>
<div class="f_center">一级业务总量</div>
</a-col>
<a-col :span="8">
<a-row type="flex" align="middle">
<a-col :span="12">
<div class="f_40 f_center success">{{ situation.lev1_not_child_nums }}</div>
<div class="f_center">一级业务(无子业务)</div>
</a-col>
<a-col :span="12">
<Pie
:id="`one_pie`"
:height=200
:width=200
:datas="firstPie"
/>
</a-col>
</a-row>
</a-col>
<a-col :span="12">
<a-row type="flex" align="middle">
<a-col :span="8">
<div class="f_40 f_center prima">{{ situation.lev1_has_child_nums }}</div>
<div class=" f_center">一级业务(有子业务)</div>
</a-col>
<a-col :span="8">
<div class="f_40 f_center prima">{{ situation.child_nums }}</div>
<div class=" f_center">子级业务</div>
</a-col>
<a-col :span="8">
<Pie
:id="`two_pie`"
:height=200
:width=200
:datas="secondPie"
/>
</a-col>
</a-row>
</a-col>
</a-row>
</a-card>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">排队取号情况</div>
<div class="head_desc"></div>
</div>
</template>
<a-row type="flex" align="middle">
<a-col :span="4">
<a-row>
<a-col :span="12">
<div class="f_20 f_center success">{{ takeLineTotal }}</div>
<div class="f_center">排队业务总量</div>
</a-col>
<a-col :span="12">
<div class="f_20 f_center success">{{ noTakeLine }}</div>
<div class="f_center">未排队业务</div>
</a-col>
</a-row>
<Pie
:id="`three_pie`"
:height="200"
:width="280"
:datas="thirdPie"
/>
</a-col>
<a-col :span="20">
<div class="table_title">排队业务分布情况</div>
<a-table :row-key="record => record.key" :dataSource="lineUp" :columns="lineUpColumns" :pagination="false" :scroll="{ x: 1400, y: 0 }"/>
</a-col>
</a-row>
</a-card>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">预约情况</div>
<div class="head_desc"></div>
</div>
</template>
<a-row type="flex" align="middle">
<a-col :span="4">
<a-row>
<a-col :span="12">
<div class="f_20 f_center success">{{ appointmentTotal }}</div>
<div class="f_center">预约业务总量</div>
</a-col>
<a-col :span="12">
<div class="f_20 f_center success">{{ noAppointment }}</div>
<div class="f_center">未预约业务</div>
</a-col>
</a-row>
<Pie
:id="`four_pie`"
:height="200"
:width="280"
:datas="fourthPie"
/>
</a-col>
<a-col :span="20">
<div>预约业务分布情况</div>
<a-table :row-key="record => record.id" :dataSource="appointment" :columns="appointmentColumns" :pagination="false" :scroll="{ x: 1400, y: 0 }"/>
</a-col>
</a-row>
</a-card>
<a-row>
<a-col :span="12">
<a-card :bordered="false" class="mb_15" style="margin-right: .625rem; min-height: 44.125rem">
<template slot="title">
<div class="head">
<div class="head_title">取号最多业务Top10</div>
</div>
</template>
<template #extra>
<a-select
ref="select"
v-model:value="takeNumberTopDate"
:options="options"
style="width: 120px"
@change="changeTakeNumberTopDate"
>
</a-select>
</template>
<a-table :row-key="record => record.index" :dataSource="takeNumberTop" :columns="takeNumberTopColumns" :pagination="false">
<span slot="index" slot-scope="text, record, index">
{{ index + 1 }}
</span>
<span slot="nums" slot-scope="text, record, index" style="display: flex;">
<a-progress :percent="text" :showInfo="false" strokeColor="#87d068"/>
<div style="min-width: 3.125rem;text-align: right;">{{ text }}件</div>
</span>
</a-table>
</a-card>
</a-col>
<a-col :span="12">
<a-card :bordered="false" class="mb_15" style="margin-left: .625rem; min-height: 44.125rem">
<template slot="title">
<div class="head">
<div class="head_title">预约最多业务Top10</div>
</div>
</template>
<template #extra>
<a-select
ref="select"
v-model:value="appointmentTopDate"
:options="options"
style="width: 120px"
@change="changeAppointmentTopDate"
>
</a-select>
</template>
<a-table :row-key="record => record.index" :dataSource="appointmentTop" :columns="appointmentTopColumns" :pagination="false">
<span slot="index" slot-scope="text, record, index">
{{ index + 1 }}
</span>
<span slot="nums" slot-scope="text, record, index" style="display: flex;">
<a-progress :percent="text" :showInfo="false" strokeColor="#87d068"/>
<div style="min-width: 3.125rem;text-align: right;">{{ text }}件</div>
</span>
</a-table>
</a-card>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-card :bordered="false" class="mb_15" style="margin-right: .625rem; min-height: 44.125rem">
<template slot="title">
<div class="head">
<div class="head_title">取号最少业务Top10</div>
</div>
</template>
<template #extra>
<a-select
ref="select"
v-model:value="takeNumberLessDate"
:options="options"
style="width: 120px"
@change="changeTakeNumberLessDate"
>
</a-select>
</template>
<a-table :row-key="record => record.index" :dataSource="takeNumberLess" :columns="takeNumberLessColumns" :pagination="false">
<span slot="index" slot-scope="text, record, index">
{{ index + 1 }}
</span>
<span slot="nums" slot-scope="text, record, index" style="display: flex;">
<a-progress :percent="text" :showInfo="false" strokeColor="#87d068"/>
<div style="min-width: 3.125rem;text-align: right;">{{ text }}件</div>
</span>
</a-table>
</a-card>
</a-col>
<a-col :span="12">
<a-card :bordered="false" class="mb_15" style="margin-left: .625rem; min-height: 44.125rem">
<template slot="title">
<div class="head">
<div class="head_title">预约最少业务Top10</div>
</div>
</template>
<template #extra>
<a-select
ref="select"
v-model:value="appointmentLessDate"
:options="options"
style="width: 120px"
@change="changeAppointmentLessDate"
>
</a-select>
</template>
<a-table :row-key="record => record.index" :dataSource="appointmentLess" :columns="appointmentLessColumns" :pagination="false">
<span slot="index" slot-scope="text, record, index">
{{ index + 1 }}
</span>
<span slot="nums" slot-scope="text, record, index" style="display: flex;">
<a-progress :percent="text" :showInfo="false" strokeColor="#87d068"/>
<div style="min-width: 3.125rem;text-align: right;">{{ text }}件</div>
</span>
</a-table>
</a-card>
</a-col>
</a-row>
</div>
</template>
<script >
import Pie from "../Component/emptyPie/index.vue"
import axios from 'axios'
import moment from "moment"
export default {
components:{
Pie
},
data(){
return{
nowDate: '',
// 基本情况
situation: {},
// 第一个饼状图
firstPie: {},
// 第二个饼状图
secondPie: {},
// 第三个饼状图
thirdPie: {},
// 第四个饼状图
fourthPie: {},
takeLineTotal: '', // 排队业务总数
noTakeLine: '', // 未排队业务
appointmentTotal: '', // 预约业务总数
noAppointment: '', // 未预约业务
// 下拉框选项
options:[
{
value: '0',
label: '今天',
},
{
value: '1',
label: '近7日',
},
{
value: '2',
label: '近30日',
},
{
value: '3',
label: '近3个月',
},
{
value: '4',
label: '本年度',
},
],
// 排队表格数据
lineUp:[
{
key: '1',
info: '绑定一级业务数量',
title: '排队机名称',
},
{
key: '2',
info: '占比',
title: '排队机名称',
},
{
key: '3',
info: '绑定二级业务数量',
title: '排队机名称',
},
{
key: '4',
info: '占比',
title: '排队机名称',
},
],
// 排队表格列
lineUpColumns:[
{
key: 'key',
title: '排队机名称',
width: 200,
dataIndex: 'info',
fixed: 'left'
},
],
// 预约表格数据
appointment:[
{
key: '1',
info: '预约一级业务数量',
title: '排队机名称',
},
{
key: '2',
info: '占比',
title: '排队机名称',
},
{
key: '3',
info: '预约二级业务数量',
title: '排队机名称',
},
{
key: '4',
info: '占比',
title: '排队机名称',
},
],
// 预约表格列
appointmentColumns:[
{
key: 'key',
title: '排队机名称',
width: 200,
dataIndex: 'info',
fixed: 'left'
},
],
// 排队TOP
takeNumberTop:[],
// 排队TOP列
takeNumberTopColumns: [
{
key:'index',
title: '排名',
dataIndex: 'index',
scopedSlots: { customRender: 'index' },
},
{
key:'businessName',
title: '业务名称',
dataIndex: 'name',
},
{
key:'number',
title: '办理数量',
dataIndex: 'nums',
scopedSlots: { customRender: 'nums' },
},
],
// 预约TOP数据
appointmentTop:[],
// 预约TOP列
appointmentTopColumns: [
{
key:'index',
title: '排名',
dataIndex: 'index',
scopedSlots: { customRender: 'index' },
},
{
key:'businessName',
title: '业务名称',
dataIndex: 'name',
},
{
key:'number',
title: '办理数量',
dataIndex: 'nums',
scopedSlots: { customRender: 'nums' },
},
],
// 排队Less
takeNumberLess:[],
// 排队Less列
takeNumberLessColumns: [
{
key:'index',
title: '排名',
dataIndex: 'index',
scopedSlots: { customRender: 'index' },
},
{
key:'businessName',
title: '业务名称',
dataIndex: 'name',
},
{
key:'number',
title: '办理数量',
dataIndex: 'nums',
scopedSlots: { customRender: 'nums' },
},
],
// 预约Less数据
appointmentLess:[],
// 预约Less列
appointmentLessColumns: [
{
key:'index',
title: '排名',
dataIndex: 'index',
scopedSlots: { customRender: 'index' },
},
{
key:'businessName',
title: '业务名称',
dataIndex: 'name',
},
{
key:'number',
title: '办理数量',
dataIndex: 'nums',
scopedSlots: { customRender: 'nums' },
},
],
takeNumberTopDate: '0',
appointmentTopDate: '0',
takeNumberLessDate: '0',
appointmentLessDate: '0',
}
},
mounted(){
this.getAllData()
this.getTakeLineData()
this.getAppointmentData()
this.getTakeNumberTop()
this.getAppointmentTop()
this.getTakeNumberLess()
this.getAppointmentLess()
},
methods:{
//获取全部基本数据
async getAllData() {
this.nowDate= moment(new Date()).format('YYYY-MM-DD h:mm:ss')
await axios.get('http://192.168.0.98:8090/inter/statistic/allInfo',{ params: { siteid: '1' }}).then((res)=>{
if(res && res.status == 200){
this.situation= res.data.data
this.firstPie= {
name: '占比',
val: res.data.data.lev1_nums,
total: res.data.data.lev1_not_child_nums,
color: '#04CA8F'
}
this.secondPie= {
name: '占比',
val: res.data.data.lev1_has_child_nums,
total: res.data.data.child_nums,
color: '#6394f9'
}
}
})
},
// 排队取号
async getTakeLineData() {
await axios.get('http://192.168.0.98:8090/inter/statistic/businessInfo',{ params: { siteid: '1' }}).then((res)=>{
if(res && res.status == 200){
let arr= res.data.data.info
let newArr= []
arr.forEach((item ,index)=>{
let obj={
id: item.id,
dataIndex: item.id,
title: item.name,
}
newArr.push(obj)
this.lineUp[0][item.id]= item.lev1_nums
this.lineUp[1][item.id]= (item.lev1_rate * 100).toFixed(2) + '%'
this.lineUp[2][item.id]= item.lev2_nums
this.lineUp[3][item.id]= (item.lev2_rate * 100).toFixed(2) + '%'
})
this.lineUpColumns= [...this.lineUpColumns, ...newArr]
this.takeLineTotal=res.data.data.use_bus_nums
this.noTakeLine=res.data.data.not_use_bus_nums
this.thirdPie= {
name: '占比',
val: res.data.data.not_use_bus_nums,
total: res.data.data.use_bus_nums,
color: '#04CA8F'
}
}
})
},
// 预约情况
async getAppointmentData() {
await axios.get('http://192.168.0.98:8090/inter/statistic/wyInfo',{ params: { siteid: '1' }}).then((res)=>{
if(res && res.status == 200){
let arr= res.data.data.info
let newArr= []
arr.forEach((item ,index)=>{
let obj={
id: item.id,
dataIndex: item.id,
title: item.name,
}
newArr.push(obj)
this.appointment[0][item.id]= item.lev1_nums
this.appointment[1][item.id]= (item.lev1_rate * 100).toFixed(2) + '%'
this.appointment[2][item.id]= item.lev2_nums
this.appointment[3][item.id]= (item.lev2_rate * 100).toFixed(2) + '%'
})
this.appointmentColumns= [...this.appointmentColumns, ...newArr]
this.appointmentTotal=res.data.data.use_bus_nums
this.noAppointment=res.data.data.not_use_bus_nums
this.fourthPie= {
name: '占比',
val: res.data.data.not_use_bus_nums,
total: res.data.data.use_bus_nums,
color: '#04CA8F'
}
}
})
},
// 取号TOP
async getTakeNumberTop(val){
if(val== undefined){
val = 0
}
await axios.get('http://192.168.0.98:8090/inter/statistic/topBusiness',{ params: { siteid: '1', selected: val, sort: 'DESC' }}).then((res)=>{
if(res && res.status == 200) {
this.takeNumberTop= res.data.data
}
})
},
// 取号Less
async getTakeNumberLess(val){
if(val== undefined){
val = 0
}
await axios.get('http://192.168.0.98:8090/inter/statistic/topBusiness',{ params: { siteid: '1', selected: val, sort: 'ASC' }}).then((res)=>{
if(res && res.status == 200) {
this.takeNumberLess= res.data.data
}
})
},
// 预约TOP
async getAppointmentTop(val){
if(val== undefined){
val = 0
}
await axios.get('http://192.168.0.98:8090/inter/statistic/topWy',{ params: { siteid: '1', selected: val, sort: 'DESC' }}).then((res)=>{
if(res && res.status == 200) {
this.appointmentTop= res.data.data
}
})
},
// 预约LESS
async getAppointmentLess(val){
if(val== undefined){
val = 0
}
await axios.get('http://192.168.0.98:8090/inter/statistic/topWy',{ params: { siteid: '1', selected: val, sort: 'ASC' }}).then((res)=>{
if(res && res.status == 200) {
this.appointmentLess= res.data.data
}
})
},
changeTakeNumberTopDate(val){
this.getTakeNumberTop(val)
},
changeAppointmentTopDate(val){
this.getAppointmentTop(val)
},
changeTakeNumberLessDate(val){
this.getTakeNumberLess(val)
},
changeAppointmentLessDate(val){
this.getAppointmentLess(val)
},
}
}
</script>
<style scoped lang="less">
.head{
display: flex;
justify-content: flex-start;
align-items: center;
.head_title{
font-weight: 700;
font-style: normal;
font-size: 1.125rem;
color: #0595FD;
margin-right: 1.25rem;
}
.head_desc{
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #888888;
}
}
/deep/ .ant-table{
width: 100% !important;
}
.table_title{
color: #333;
font-weight: 700;
font-style: normal;
font-size: .875rem;
margin-bottom: .625rem;
}
.f_20{
font-size: 1.25rem;
}
.f_40{
font-size: 2.5rem;
}
.f_center{
text-align: center;
}
.warning{
color: #FD6805
}
.primary{
color: #0595FD
}
.success{
color: #04CA8F
}
.h_200{
height: 12.5rem;
}
.mb_15{
margin-bottom: .9375rem;
}
</style>
\ No newline at end of file
<template>
<div>
<a-breadcrumb separator=" > " class="bread">
<a-breadcrumb-item v-for="(item) in breadArr" :key="item.path">
<span>{{ item.title }}</span>
<!-- <router-link :to="{ path: item.path}">{{ item.title }}</router-link> -->
</a-breadcrumb-item>
</a-breadcrumb>
</div>
</template>
<script>
export default {
data(){
return{
// 面包屑导航
breadArr: []
}
},
mounted(){
this.filterBread()
},
methods:{
// 面包屑
filterBread(){
let newArr= []
this.$route.matched.forEach(item=>{
if(item.path!= ''){
newArr.push({
path:item.path,
title:item.meta.title
})
}
})
this.breadArr= newArr
},
}
}
</script>
<style scoped>
.bread{
height: 2.8125rem;
line-height: 2.8125rem;
}
</style>
\ No newline at end of file
<template>
<div class="Container">
<div class="main">
<div class="first_card">
<div class="breadMenu">
<Breadcrumb/>
</div>
<div class="searchBox">
<a-auto-complete
v-model="businessName"
:data-source="dataSource"
optionLabelProp="value"
style="width: 35.625rem"
placeholder="请输入业务名称搜索"
@select="onSelect"
@search="onSearch"
/>
<a-button type="primary" @click="startAnalysis">开始分析</a-button>
<a-button type="primary" v-if="btnShow" @click="backBase">返回</a-button>
</div>
</div>
<div class="content_view">
<router-view />
</div>
</div>
</div>
</template>
<script>
import _ from 'lodash'
import axios from 'axios'
import Breadcrumb from "./breadcrumb/index.vue";
export default {
components:{
Breadcrumb
},
data() {
return {
// 搜索框
businessName: '',
dataSource: [],
dataList: [],
btnShow: false,
}
},
mounted() {
this.getList()
},
methods:{
startAnalysis() {
if(!this.businessName){
this.$message.error('请输入业务名称搜索')
}else{
this.$router.push({ path: 'analysiscontent', query:{name: this.businessName}})
this.btnShow= true
}
},
backBase() {
this.$router.push({ path: 'basecontent'})
this.btnShow= false
this.businessName= ''
},
async getList(){
await axios.get('http://192.168.0.98:8090/inter/statistic/busList',{params: {siteid: 1}}).then((res)=>{
if(res && res.status==200){
res.data.data.forEach(item=>{
this.dataList.push(item.name)
})
}
})
},
onSearch: _.debounce(function(val){
this.dataSource= []
this.dataList.forEach(item=>{
if(item.indexOf(val) !== -1){
this.dataSource.push(item)
}
})
}, 1000),
onSelect(val){
this.businessName= val
}
}
}
</script>
<style lang="less" scoped>
@headerH: 4.5rem;
.Container {
height: 100% !important;
// background: #fac;
background: #f5f5f5;
display: flex;
flex-direction: column;
.main {
// background: #afc;
border-radius: 6px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
&::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;
}
}
/deep/.ant-tabs-bar{
margin: 0;
}
}
.first_card{
background: #FFF;
margin-bottom: .9375rem;
}
.breadMenu{
height: 2.8125rem;
line-height: 2.8125rem;
padding: 0 5rem;
border-bottom: 1px solid rgba(226, 226, 226, 1);
}
.searchBox{
height: 6.25rem;
display: flex;
justify-content: center;
align-items: center;
}
.content_view{
padding: 0 5rem;
}
</style>
\ No newline at end of file
<template>
<div>
<a-breadcrumb separator=" > " class="bread">
<a-breadcrumb-item v-for="(item) in breadArr" :key="item.path">
<span>{{ item.title }}</span>
<!-- <router-link :to="{ path: item.path}">{{ item.title }}</router-link> -->
</a-breadcrumb-item>
</a-breadcrumb>
</div>
</template>
<script>
export default {
data(){
return{
// 面包屑导航
breadArr: []
}
},
mounted(){
this.filterBread()
},
methods:{
// 面包屑
filterBread(){
let newArr= []
this.$route.matched.forEach(item=>{
if(item.path!= ''){
newArr.push({
path:item.path,
title:item.meta.title
})
}
})
this.breadArr= newArr
},
}
}
</script>
<style scoped>
.bread{
height: 2.8125rem;
line-height: 2.8125rem;
}
</style>
\ No newline at end of file
<template>
<div class="Container">
<div class="main">
<div class="first_card">
<div class="breadMenu">
<Breadcrumb/>
</div>
<div class="searchBox">
<a-input v-model="peopleName" placeholder="请输入群众名称搜索" style="width: 35.625rem"></a-input>
<a-button type="primary" @click="startAnalysis()">开始分析</a-button>
<a-button type="primary" v-if="btnShow" @click="backBase()">返回</a-button>
</div>
</div>
<div class="content_view">
<router-view />
</div>
</div>
</div>
</template>
<script>
import Breadcrumb from "./breadcrumb/index.vue";
export default {
components:{
Breadcrumb
},
data() {
return {
// 搜索框
peopleName: '',
btnShow: false,
}
},
methods:{
startAnalysis() {
this.peopleName= ''
this.$router.push({ path: 'portrayalAnalysis'})
this.btnShow= true
},
backBase() {
this.peopleName= ''
this.$router.push({ path: 'portrayalBase'})
this.btnShow= false
},
}
}
</script>
<style lang="less" scoped>
@headerH: 4.5rem;
.Container {
height: 100% !important;
// background: #fac;
background: #f5f5f5;
display: flex;
flex-direction: column;
.main {
// background: #afc;
border-radius: 6px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
&::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;
}
}
/deep/.ant-tabs-bar{
margin: 0;
}
}
.first_card{
background: #FFF;
margin-bottom: .9375rem;
}
.breadMenu{
height: 2.8125rem;
line-height: 2.8125rem;
padding: 0 5rem;
border-bottom: 1px solid rgba(226, 226, 226, 1);
}
.searchBox{
height: 6.25rem;
display: flex;
justify-content: center;
align-items: center;
}
.content_view{
padding: 0 5rem;
}
</style>
\ No newline at end of file
<template>
<div>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">分析结果</div>
</div>
</template>
<a-row>
<a-col :span="8">
<div class="inside_card">
<div class="head_title mb_15">用户信息</div>
<a-form layout="horizontal" :model="formState" :label-col="{span: 4}" :wrapper-col="{span: 20}">
<a-form-item label="openID:">{{ formState.openId }}</a-form-item>
<a-form-item label="微信昵称:">{{ formState.name }}</a-form-item>
<a-form-item label="城市:">{{ formState.city }}</a-form-item>
<a-form-item label="联系电话:">{{ formState.phone }}</a-form-item>
<a-form-item label="身份证号:">{{ formState.ID }}</a-form-item>
<a-form-item label="注册时间:">{{ formState.registerTime }}</a-form-item>
<a-form-item label="注册来源:">{{ formState.source }}</a-form-item>
<a-form-item label="户籍地址:">{{ formState.address }}</a-form-item>
</a-form>
</div>
<div class="inside_card">
<div class="head_title mb_15">关键数据</div>
<a-form layout="horizontal" :model="formState" :label-col="{span: 4}" :wrapper-col="{span: 20}">
<a-form-item label="预约最多:">{{ formState.appointment.name }}({{ formState.appointment.value }})</a-form-item>
<a-form-item label="取号最多:">{{ formState.appointment.name }}({{ formState.appointment.value }})</a-form-item>
<a-form-item label="申报最多:">{{ formState.appointment.name }}({{ formState.appointment.value }})</a-form-item>
<a-form-item label="小程序最多:">{{ formState.appointment.name }}({{ formState.appointment.value }})</a-form-item>
</a-form>
<div class="evaluate_box">
<div class="good_box">
<div class="good_title">{{ formState.good.value }}({{ formState.good.percent }}%)</div>
<div class="good_desc">好评次数</div>
</div>
<div class="bad_box">
<div class="bad_title">{{ formState.bad.value }}({{ formState.bad.percent }}%)</div>
<div class="bad_desc">差评次数</div>
</div>
</div>
</div>
</a-col>
<a-col :span="8" class="f_center">
<img src="http://sy.scsmile.cn/YX-4.0/03-02YHHXTP/images/%E7%BE%A4%E4%BC%97%E5%88%86%E6%9E%90/u1433.png" alt="" style="height: 31.25rem">
<div class="information">
<div class="info_name">
神奇小伙<a-tag color="green" class="info_tag">实名认证</a-tag>
</div>
<a-row>
<a-col :span="8">年龄:18</a-col>
<a-col :span="8">性别:未知</a-col>
<a-col :span="8">民族:氪族</a-col>
</a-row>
<div>点击查看区块链信息</div>
</div>
</a-col>
<a-col :span="8">
<div class="inside_card">
<Radar
:id="`radar`"
:height="350"
:width="500"
:datas="radarData"
/>
</div>
<div>
</div>
</a-col>
</a-row>
</a-card>
</div>
</template>
<script >
import Radar from "../../business/Component/radar/index.vue";
export default {
components: {
Radar
},
data(){
return{
options:[
{
value: '0',
label: '今天',
},
{
value: '1',
label: '近7日',
},
{
value: '2',
label: '近30日',
},
{
value: '3',
label: '近3个月',
},
{
value: '4',
label: '本年度',
},
],
radarData: {},
useNumber: '0',
formState: {
openId: '4568782121245',
name: '张张那个张',
city: '四川省成都市',
phone: '13088088888',
ID: '513822199302034567',
registerTime: '2023-03-01 10:00:00',
source: '排队叫号系统',
address: '四川省宜宾市叙州区林南路23号',
appointment: {name: '机动车违章业务办理', value: '25'},
good: {value: '36', percent: '20'},
bad: {value: '2', percent: '10'}
}
}
},
mounted(){
this.getRadarData()
},
methods: {
handleChange() {},
getRadarData() {
this.radarData= {
data: [
{
value: [42, 30, 20, 35, 50, 18],
name: '偏好',
areaStyle: {
color: '#a6c5fc'
}
},
]
}
}
},
}
</script>
<style lang="less" scoped>
/deep/ .ant-form-item{
margin-bottom: 0
}
.head{
display: flex;
justify-content: flex-start;
align-items: center;
}
.head_title{
font-weight: 700;
font-style: normal;
font-size: 1.125rem;
color: #0595FD;
margin-right: 1.25rem;
}
.head_desc{
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #888888;
}
.inside_card{
background: #f3faff;
margin: .9375rem;
padding: .9375rem;
}
.evaluate_box{
display: flex;
justify-content: space-around;
align-items: center;
margin-top: 1.25rem;
}
.good_box{
width: 10rem;
background: #d0f3ee;
text-align: center;
padding: .9375rem;
.good_title{
font-size: 1.25rem;
font-weight: 400;
font-style: normal;
color: #04CA8F;
margin-bottom: .625rem;
}
.good_desc{
font-size: .875rem;
font-weight: 400;
font-style: normal;
color: #04CA8F;
}
}
.bad_box{
width: 10rem;
background: #f5e3e7;
text-align: center;
padding: .9375rem;
.bad_title{
font-size: 1.25rem;
font-weight: 400;
font-style: normal;
color: #FF5F5F;
margin-bottom: .625rem;
}
.bad_desc{
font-size: .875rem;
font-weight: 400;
font-style: normal;
color: #FF5F5F;
}
}
.information{
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: space-around;
height: 200px;
}
.info_name{
position: relative;
font-size: 2.5rem;
}
.info_tag{
position: absolute;
top: .9375rem;
margin-left: .9375rem;
}
.mb_15{
margin-bottom: .9375rem;
}
.f_40{
font-size: 2.5rem;
}
.f_center{
text-align: center;
}
</style>
\ No newline at end of file
<template>
<div>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">整体情况</div>
<div class="head_desc">更新时间:{{ nowDate }}</div>
</div>
</template>
<a-row type="flex" align="middle">
<a-col :span="4">
<div class="f_40 f_center warning">111</div>
<div class="f_center">群众注册总量</div>
<div class="f_center primary" @click="toTable">点击查看报表</div>
</a-col>
<a-col :span="20">
<lineChart
:id="`one_line`"
:title="`近30日注册情况分析`"
:datas="oneLineData"
:height="200"
:width="1420"/>
</a-col>
</a-row>
</a-card>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">注册用户理解</div>
<div class="head_desc"></div>
</div>
</template>
<a-row>
<a-col :span="8">
<map-chart
:id="`one_map`"
:datas="oneMapData"
:height="400"
:width="550"
/>
</a-col>
<a-col :span="8">
<a-table
:row-key="record => record.ranking" :dataSource="provinces" :columns="provincesColumns" :pagination="false">
</a-table>
</a-col>
<a-col :span="8">
<pieChart
:id="`one_pie`"
:height="400"
:width="550"
:datas="onePieData"
/>
</a-col>
<a-col :span="12">
<doublePieChart
:id="`two_pie`"
:height="300"
:width="800"
:datas="twoPieData"
/>
</a-col>
<a-col :span="12">
<barChart
:id="`one_bar`"
:height="300"
:width="800"
:datas="oneBarData"
/>
</a-col>
<a-col :span="12">
<barChart
:id="`two_bar`"
:height="300"
:width="800"
:datas="twoBarData"
/>
</a-col>
<a-col :span="12">
<pieChart
:id="`three_pie`"
:height="300"
:width="800"
:datas="threePieData"
/>
</a-col>
<a-col :span="12">
</a-col>
<a-col :span="12">
</a-col>
</a-row>
</a-card>
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">办件用户理解</div>
<div class="head_desc"></div>
</div>
</template>
<a-row type="flex" align="middle">
<a-row>
<a-col :span="8">
<map-chart
:id="`two_map`"
:datas="oneMapData"
:height="400"
:width="550"
/>
</a-col>
<a-col :span="8">
<a-table
:row-key="record => record.ranking" :dataSource="provinces" :columns="provincesColumns" :pagination="false">
</a-table>
</a-col>
<a-col :span="8">
<pieChart
:id="`four_pie`"
:height="400"
:width="550"
:datas="onePieData"
/>
</a-col>
<a-col :span="12">
<doublePieChart
:id="`five_pie`"
:height="300"
:width="800"
:datas="twoPieData"
/>
</a-col>
<a-col :span="12">
<barChart
:id="`six_bar`"
:height="300"
:width="800"
:datas="oneBarData"
/>
</a-col>
<a-col :span="12">
<barChart
:id="`three_bar`"
:height="300"
:width="800"
:datas="twoBarData"
/>
</a-col>
<a-col :span="12">
<pieChart
:id="`six_pie`"
:height="300"
:width="800"
:datas="threePieData"
/>
</a-col>
<a-col :span="12">
</a-col>
<a-col :span="12">
</a-col>
</a-row>
</a-row>
</a-card>
</div>
</template>
<script >
import barChart from '../../business/Component/bar/index.vue'
import doublePieChart from "../../business/Component/doublePie/index.vue"
import pieChart from "../../business/Component/pie/index.vue"
import lineChart from "../../business/Component/line/index.vue"
import mapChart from "../../business/Component/map/index.vue"
import moment from "moment"
export default {
components:{
mapChart, pieChart, lineChart, doublePieChart, barChart
},
data(){
return{
options:[
{
value: '0',
label: '今天',
},
{
value: '1',
label: '近7日',
},
{
value: '2',
label: '近30日',
},
{
value: '3',
label: '近3个月',
},
{
value: '4',
label: '本年度',
},
],
oneLineData: {},
oneMapData: {},
onePieData: {},
twoPieData: {},
oneBarData: {},
twoBarData: {},
threePieData: {},
provinces: [
{
ranking: 1,
province: '四川省',
people: '999',
percent: '2'
},
{
ranking: 2,
province: '四川省',
people: '999',
percent: '2'
},
],
provincesColumns: [
{
key:'ranking',
title: '序号',
dataIndex: 'ranking',
},
{
key:'province',
title: '省份',
dataIndex: 'province',
},
{
key:'people',
title: '注册人数',
dataIndex: 'people',
},
{
key:'percent',
title: '注册占比',
dataIndex: 'percent',
},
],
takeNumber: '0',
nowDate: ''
}
},
mounted(){
this.test()
},
methods:{
handleChange(){},
toTable(){
this.$router.push({path:'register'})
},
test(){
this.nowDate= moment(new Date()).format('YYYY-MM-DD h:mm:ss')
this.oneLineData= {
title: '近30日注册情况分析:',
legend: ['自助服务系统注册人数','微官网注册人数','排队系统注册人数'],
xData: ['3-15', '3-16', '3-17', '3-18', '3-19', '3-20'],
dataList: [
{name: '自助服务系统注册人数', data: [120, 132, 101, 134, 90, 230, 210]},
{name: '微官网注册人数', data: [220, 182, 191, 234, 290, 330, 310]},
{name: '排队系统注册人数', data: [150, 232, 201, 154, 190, 330, 410]},
]
}
this.oneMapData={
title: "注册用户地域分析",
data:[
{ name: '四川省', value: 20057.34 },
{ name: '广东省', value: 15477.48 },
{ name: '福建省', value: 31686.1 },
{ name: '河北省', value: 6992.6 },
{ name: '河南省', value: 44045.49 },
{ name: '江苏省', value: 40689.64 },
]
}
this.onePieData={
title: '',
type: 'scroll',
legend: ['四川省', '广东省', '福建省','河北省','河南省','江苏省',],
data: [
{ name: '四川省', value: 20057.34 },
{ name: '广东省', value: 15477.48 },
{ name: '福建省', value: 31686.1 },
{ name: '河北省', value: 6992.6 },
{ name: '河南省', value: 44045.49 },
{ name: '江苏省', value: 40689.64 },
]
}
this.twoPieData={
title: '本地人与外地人注册分布',
pieName: '分布详情',
firstName: '宜宾市本地人注册占比',
firstVal: '1',
firstTotal: '10',
secondName: '外地人注册占比',
secondVal: '1',
secondTotal: '10',
}
this.oneBarData={
title: '性别分布',
xData: ['', ''],
data: [
{name: '自助服务系统注册人数', type: 'bar' ,data: [150, 232, 201, 154, 190, 330, 410]},
{name: '微官网注册人数', type: 'bar' ,data: [220, 182, 191, 234, 290, 330, 310]},
{name: '排队系统注册人数', type: 'bar' ,data: [120, 132, 101, 134, 90, 230, 210]},
]
}
this.twoBarData= {
title: '年龄分布',
xData: ['1-10', '10-20', '20-30', '30-40', '40-50'],
data: [
{name: '办理次数', type: 'bar' ,data: [150, 232, 201, 154, 190, 330, 410]},
{name: '占比', type: 'line' ,data: [220, 182, 191, 234, 290, 330, 310]},
]
}
this.threePieData={
title: '民族分布',
type: '',
legend: ['四川省', '广东省', '福建省','河北省','河南省','江苏省',],
data: [
{ name: '四川省', value: 20057.34 },
{ name: '广东省', value: 15477.48 },
{ name: '福建省', value: 31686.1 },
{ name: '河北省', value: 6992.6 },
{ name: '河南省', value: 44045.49 },
{ name: '江苏省', value: 40689.64 },
]
}
}
}
}
</script>
<style scoped lang="less">
.head{
display: flex;
justify-content: flex-start;
align-items: center;
.head_title{
font-weight: 700;
font-style: normal;
font-size: 1.125rem;
color: #0595FD;
margin-right: 1.25rem;
}
.head_desc{
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #888888;
}
}
/deep/ .ant-table{
width: 100% !important;
}
.f_20{
font-size: 1.25rem;
}
.f_40{
font-size: 2.5rem;
}
.f_center{
text-align: center;
}
.warning{
color: #FD6805
}
.primary{
color: #0595FD
}
.success{
color: #04CA8F
}
.h_200{
height: 12.5rem;
}
.mb_15{
margin-bottom: .9375rem;
}
</style>
\ No newline at end of file
<template>
<div class="Container">
<div class="main">
<div class="first_card">
<div class="breadMenu">
<Breadcrumb/>
</div>
</div>
<div class="content_view">
<a-card :bordered="false" class="mb_15">
<template slot="title">
<div class="head">
<div class="head_title">注册列表</div>
<div class="head_desc">更新时间:</div>
</div>
</template>
<template #extra>
<a-button @click="">返回</a-button>
</template>
<div style="display: flex;justify-content: space-between;align-items: center;">
<a-button type="primary">导出</a-button>
<diV>
<a-form layout="inline" :model="seacrhForm">
<a-form-item>
<a-select v-model="selectVal" :options="options"></a-select>
</a-form-item>
<a-form-item>
<a-range-picker :locale="locale"/>
</a-form-item>
<a-form-item>
<a-input placeholder="请输入昵称关键字查询" />
</a-form-item>
<a-form-item>
<a-button type="primary">搜索</a-button>
</a-form-item>
</a-form>
</diV>
</div>
<a-table
:rowSelection="rowSelection"
:dataSource="peopleList"
:columns="peopleListColumns">
</a-table>
</a-card>
</div>
</div>
</div>
</template>
<script >
import locale from 'ant-design-vue/es/date-picker/locale/zh_CN';
import Breadcrumb from "../breadcrumb/index.vue";
export default {
components:{
Breadcrumb
},
data(){
return{
locale,
selectVal: 'all',
options:[
{
value: 'all',
label: '全部',
},
{
value: 'yes',
label: '实名认证',
},
{
value: 'no',
label: '未实名认证',
},
],
seacrhForm: {},
rowSelection: {},
peopleList: [],
peopleListColumns: [
{
key:'',
dataIndex: '',
title: '序号',
align: 'center',
width: 100,
fixed: 'left'
},
{
key:'',
dataIndex: '',
title: '真实姓名',
align: 'center',
width: 100,
fixed: 'left'
},
{
key:'',
dataIndex: '',
title: '注册来源',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '身份证号',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '手机号码',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '性别',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '民族',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '户籍地址',
align: 'center',
},
{
key:'',
dataIndex: '',
title: 'openID',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '普通用户昵称',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '普通用户城市',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '用户头像',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '授权时间',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '是否实名认证',
align: 'center',
},
{
key:'',
dataIndex: '',
title: '操作',
align: 'center',
width: 200,
fixed: 'right'
},
]
}
},
methods:{
}
}
</script>
<style lang="less" scoped>
@headerH: 4.5rem;
.Container {
height: 100% !important;
// background: #fac;
background: #f5f5f5;
display: flex;
flex-direction: column;
.main {
// background: #afc;
border-radius: 6px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
&::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;
}
}
/deep/.ant-tabs-bar{
margin: 0;
}
}
/deep/ .ant-table{
width: 100% !important;
}
.first_card{
background: #FFF;
margin-bottom: .9375rem;
}
.breadMenu{
height: 2.8125rem;
line-height: 2.8125rem;
padding: 0 5rem;
border-bottom: 1px solid rgba(226, 226, 226, 1);
}
.searchBox{
height: 6.25rem;
display: flex;
justify-content: center;
align-items: center;
}
.content_view{
padding: 0 5rem;
}
.head{
display: flex;
justify-content: flex-start;
align-items: center;
.head_title{
font-weight: 700;
font-style: normal;
font-size: 1.125rem;
color: #0595FD;
margin-right: 1.25rem;
}
.head_desc{
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #888888;
}
}
</style>
\ No newline at end of file
......@@ -144,6 +144,13 @@ let statusItem = {
2: "超时未取号",
3: "预约取消",
};
const style = {
0: "排队中",
1: "办理中",
2: "办理中",
3: "办理中",
4: "办理完成",
}
export default {
name: "PortalAdminVueMakeRecordReport",
data() {
......@@ -231,6 +238,7 @@ export default {
filterVal,
tableHeaders,
statusItem,
style,
btnLoading: false,
searchForm: {
status: "",
......@@ -268,10 +276,11 @@ export default {
this.getOrderList();
}
this.tableSourceData = data.map((v) => {
delete v.people.id;
v.people && delete v.people.id;
return { ...v, ...v.people };
});
this.total = total;
return this.tableSourceData;
}
},
......@@ -339,7 +348,7 @@ export default {
for (let item of data) {
Object.keys(this.statusItem).forEach((key) => {
if (item.status == key) {
item.status = this.statusItem[key];
item.status = item.status==1?this.style[item.style]:this.statusItem[key];
}
});
}
......@@ -351,7 +360,7 @@ export default {
for (let item of data) {
Object.keys(this.statusItem).forEach((key) => {
if (item.status == key) {
item.status = this.statusItem[key];
item.status = item.status==1?this.style[item.style]:this.statusItem[key];
}
});
}
......
......@@ -48,8 +48,8 @@
<!-- <p v-for="item of 3">事项1:生育证津贴办理</p> -->
</div>
<div class="right_">
<span class="status1" v-if="orderInfo.status != 1">未签到</span>
<span class="status2" v-else>排队中</span>
<span class="status2" v-if="orderInfo.status == 1">{{style[orderInfo.style]}}</span>
<span class="status1" v-else>{{statusItem[orderInfo.status]}}</span>
</div>
</div>
<div class="box2">
......@@ -130,12 +130,20 @@ let statusItem = {
2: "超时未取号",
3: "预约取消",
};
const style = {
0: "排队中",
1: "办理中",
2: "办理中",
3: "办理中",
4: "办理完成",
}
export default {
name: "PortalAdminVueRecordReportdetails",
data() {
return {
orderStatus,
statusItem,
style,
orderInfo: {}, // 预约信息
};
},
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -5465,13 +5465,15 @@ data|object|数据对象
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
businessCode|String|否|业务功能code,多个code使用","隔开
**请求样例:**
```
{
"productId":1,
"dateTimeStart":"2023-04-10",
"dateTimeEnd":"2023-05-11"
"dateTimeEnd":"2023-05-11",
"businessCode":"非必填,业务功能code,多个code使用逗号隔开"
}
```
......@@ -5537,6 +5539,8 @@ data|array|数据对象
productId|Long|是|产品id
dateTimeStart|String|是|开始时间
dateTimeStart|String|是|结束时间
particleType|int|是|时间颗粒度 1:10分钟,2:30分钟,3:1小时
isRatio|int|是|是否开启日对比1是0否
**请求样例:**
```
......
package com.mortals.xhx.module.page.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.RepeatSubmit;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.exception.AppException;
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.*;
import org.apache.commons.collections4.CollectionUtils;
......@@ -20,7 +17,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 页面埋点
......
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.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.product.ProductPdu;
import com.mortals.xhx.feign.product.IProductFeign;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import com.mortals.xhx.module.page.service.PageInfoService;
import com.mortals.xhx.module.param.service.ParamService;
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;
/**
*
......@@ -23,6 +32,8 @@ public class PageInfoController extends BaseCRUDJsonBodyMappingController<PageIn
@Autowired
private ParamService paramService;
@Autowired
private IProductFeign productFeign;
public PageInfoController(){
super.setModuleDesc( "产品页面配置");
......@@ -34,5 +45,35 @@ public class PageInfoController extends BaseCRUDJsonBodyMappingController<PageIn
super.init(model, context);
}
@PostMapping({"product/list"})
@UnAuth
public Rest<Object> list(@RequestBody ProductPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
Context context = this.getContext();
String busiDesc = "查询产品列表";
int code;
try {
Rest<RespData<List<ProductPdu>>> result = productFeign.list(query);
code = result.getCode();
if(code > 0) {
model.put("data", result.getData().getData());
model.put("pageInfo", result.getData().getPageInfo());
model.put("dict", result.getData().getDict());
}
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.setDict(model.get("dict"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
}
\ 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