事件汇总

This commit is contained in:
shijingjing
2022-08-12 11:50:37 +08:00
parent ffc5682a36
commit b0b3193457
2 changed files with 211 additions and 51 deletions

View File

@@ -25,8 +25,8 @@
</div>
</div>
<div class="bar_Box">
<div id="chartDom" style="height: 230px; width: 100%;"></div>
<ai-empty v-if="false" style="height: 200px; width: 100%;"></ai-empty>
<div id="chartDom" style="height: 230px; width: 100%;" v-show="xData.length && yData.length"></div>
<ai-empty style="height: 200px; width: 100%;" v-show="!xData.length && !yData.length"></ai-empty>
</div>
</el-row>
<ai-card>
@@ -45,7 +45,7 @@
</template>
</ai-search-bar>
<ai-table :tableData="tableData" :total="search.total" :current.sync="search.current" :size.sync="search.size"
@getList="getTableData" :col-configs="colConfigs" :dict="dict">
@getList="getIntegralChange" :col-configs="colConfigs" :dict="dict">
<el-table-column slot="eventDesc" label="事件" align="center">
<template slot-scope="{ row }">
@@ -79,6 +79,8 @@ export default {
data: {},
startTime: '',
endTime: '',
xData: [],
yData: [],
}
},
props: {
@@ -104,6 +106,7 @@ export default {
this.$dict.load('integralType')
this.getDetail()
this.getIntegralChange()
this.getEventSummary()
},
methods: {
// 详情
@@ -120,7 +123,21 @@ export default {
},
// 事件汇总 暂定
getEventSummary() {
this.instance.post(`/app/appintegraluser/eventSummary`,null,{
params: {
id: this.$route.query.id,
startTime: this.startTime,
endTime: this.endTime,
}
}).then(res=>{
if(res?.data) {
this.xData = res.data.map(x=> x.eventName)
this.yData = res.data.map(y=> y.totalIntegral)
this.getColEcherts(this.xData, this.yData)
}
})
},
// 余额变动明细
getIntegralChange() {
@@ -143,7 +160,7 @@ export default {
}
},
getColEcherts() {
getColEcherts(xData, yData) {
let chartDom = document.getElementById('chartDom');
chartDom.style.width = window.innerWidth - 335 + "px";
this.myChart = echarts.init(chartDom);
@@ -164,14 +181,14 @@ export default {
},
xAxis: {
type: 'category',
data: ['每日签到', '事件上报', '特殊人员跟进', '群发任务', '邀请居民进群']
data: xData,
},
yAxis: {
type: 'value'
},
series: [
{
data: [120, 200, 150, 80, 70,],
data: yData,
type: 'bar',
showBackground: true,
backgroundStyle: {

View File

@@ -7,10 +7,8 @@
<ai-search-bar>
<template #left>
<el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button>
</template>
<template slot="right">
<el-cascader size="small" v-model="search.eventType" placeholder="请选择事件/类型" clearable
:props="{...etOps,checkStrictly:true}" @change="handleTypeSearch" ref="eventTypeSearch" />
<el-cascader size="small" v-model="search.eventType" :options="rulesOps" placeholder="请选择事件/类型" clearable
:props="rulesProps" @change="handleTypeSearch" ref="eventTypeSearch" />
<ai-select
v-model="search.status"
@change="page.current = 1, getList()"
@@ -52,14 +50,23 @@
</template>
</ai-list>
<!-- <ai-empty v-else>暂无应用权限</ai-empty> -->
<ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @closed="form={ladderRule: []}" width="700px">
<ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @closed="form={ladderRule: []}" width="900px" >
<div class="form_div">
<el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix="" label-width="100px">
<el-form-item label="事件/类型" prop="eventType">
<el-cascader v-model="form.eventType" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm"
:options="cacheOps"/>
<el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix="" label-width="150px">
<el-form-item label="事件类型" prop="systemRuleId">
<el-cascader v-model="form.systemRuleId" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm"
:options="rulesOps"/>
</el-form-item>
<el-form-item label="规则" prop="ruleType" v-if="form.ruleType>-1" required>
<el-form-item label="自定义事件">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model="form.ruleName" clearable/>
</el-form-item>
<el-form-item label="规则">
<div>常规</div>
</el-form-item>
<!-- <el-form-item label="规则" prop="ruleType" v-if="form.ruleType>-1" required>
<el-row type="flex" justify="space-between">
<div v-text="$dict.getLabel('integralRuleRuleType',form.ruleType)"/>
<el-button v-if="form.ruleType==1" type="text" icon="iconfont iconAdd"
@@ -84,20 +91,52 @@
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form-item> -->
<el-form-item label="周期范围" prop="scoringCycle">
<ai-select v-model="form.scoringCycle" :selectList="$dict.getDict('integralRuleScoringCycle')"/>
</el-form-item>
<template v-if="form.ruleType==0">
<el-form-item label="奖励次数" prop="numberLimit">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/>
</el-form-item>
<el-form-item label="积分分值" prop="integral">
<el-input placeholder="请输入" v-model="form.integral" clearable/>
</el-form-item>
</template>
<el-form-item label="奖励次数">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/>
</el-form-item>
<el-form-item label="积分分值" prop="integral">
<el-input placeholder="请输入" v-model="form.integral" clearable/>
</el-form-item>
<el-form-item label="有效范围" prop="validRangeType" required>
<el-radio-group v-model="form.validRangeType">
<el-radio label="0">全局</el-radio>
<el-radio label="1">指定网格</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="生效网格" prop="ruleType" required>
<el-button type="text" @click="showGrid = true,beforeSelectTree()">请选择</el-button>
</el-form-item> -->
</el-form>
</div>
<ai-dialog title="选择网格" :visible.sync="showGrid" :customFooter="true" :destroyOnClose="true" border width="720px" append-to-body>
<div class="grid">
<el-tree
:data="treeObj.treeList"
:props="treeObj.defaultProps"
node-key="id"
ref="tree"
:check-strictly="true"
show-checkbox
default-expand-all
:default-checked-keys="currCheckedKeys"
@check="onCheckChange">
</el-tree>
</div>
<div class="dialog-footer" slot="footer">
<el-button size="medium" @click="showGrid=false">取消</el-button>
<el-button type="primary" size="medium" @click="getCheckedTree()">确认</el-button>
</div>
</ai-dialog>
</ai-dialog>
</section>
</template>
@@ -127,19 +166,47 @@ export default {
],
tableData: [],
dialog: false,
form: {ladderRule: []},
formRules: {
eventType: [{required: true, message: "请选择事件/类型", trigger: "change"}],
scoringCycle: [{required: true, message: "请选择周期范围", trigger: "change"}],
integral: [{required: true, pattern: /^\d*[.\d]\d?$/, message: "请输入积分分值,最多保留一位小数"}],
numberLimit: [{pattern: /^\d*$/, message: "请输入正整数"}]
form: {
systemRuleId: '',
ruleName: '',
scoringCycle: '',
numberLimit: '',
integral: '',
validRangeType: '0',
validRangeData: ''
},
cacheOps: []
formRules: {
systemRuleId: [{required: true, message: "请选择事件/类型", trigger: "change"}],
scoringCycle: [{required: true, message: "请选择周期范围", trigger: "change"}],
// numberLimit: [{pattern: /^\d*$/, message: "请输入正整数"}],
integral: [{required: true, pattern: /^\d*[.\d]\d?$/, message: "请输入积分分值,最多保留一位小数"}],
validRangeType: [{required: true, message: "请选择事件有效范围", trigger: "change"}],
},
rulesOps: [],
rulesProps: {
label: "ruleName",
value: "id",
checkStrictly:true,
},
radio: 0,
showGrid: false,
treeObj: {
treeList: [],
defaultProps: {
label: "girdName",
value: "id",
},
checkedKeys: [],
},
girdInfoList: [],
currCheckedKeys: []
};
},
created() {
this.$dict.load("integralRuleStatus", "integralRuleRuleType", 'integralRuleScoringCycle', 'integralRuleEvent', 'integralRuleEventType').then(() => {
this.getList();
this.getList()
this.getRulesList()
this.beforeSelectTree()
});
},
methods: {
@@ -231,9 +298,11 @@ export default {
},
handleTypeForm(v) {
if (this.dialog) {
this.form.event = v?.[0]
this.form.type = v?.[1]
this.form.ruleType = !this.form.event ? null : this.form.event == 3 ? 1 : 0
console.log(v);
// this.form.event = v?.[0]
this.form.systemRuleId = v?.[v.length - 1]
console.log(this.form.systemRuleId);
// this.form.ruleType = !this.form.event ? null : this.form.event == 3 ? 1 : 0
}
},
handleDelete(i) {
@@ -243,7 +312,86 @@ export default {
},
checkIntegral(v) {
return /\.\d{2,}$/.test(v) ? Math.abs(v).toFixed(1) : Math.abs(v)
}
},
getRulesList() {
this.instance.post(`/app/appintegralsystemrule/list?current=1&sizes=3000`).then(res=> {
if(res?.data) {
this.rulesOps = this.toTree(res.data.records)
}
})
},
// 转树形结构
toTree(data) {
let result = [];
if (!Array.isArray(data)) {
return result
}
let map = {};
data.forEach(item => {
map[item.id] = item;
});
data.forEach(item => {
let parent = map[item.parentRuleId];
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
result.push(item);
}
});
return result;
},
girdToTree(data) {
let result = [];
if (!Array.isArray(data)) {
return result
}
let map = {};
data.forEach(item => {
map[item.id] = item;
});
data.forEach(item => {
let parent = map[item.parentGirdId];
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
result.push(item);
}
});
return result;
},
getCheckedTree() {
if (!this.$refs.tree.getCheckedNodes().length) {
return this.$message.error('请选择网格')
}
this.$set(this.girdInfoList, this.currIndex, {
...this.$refs.tree.getCheckedNodes(),
checkType: true
})
// this.girdInfoList = this.$refs.tree.getCheckedNodes()
this.showGrid = false;
},
beforeSelectTree() {
this.treeObj.checkedKeys = [];
this.instance.post(`/app/appgirdinfo/listAll3`, null, null).then((res) => {
if (res.code == 0) {
this.treeObj.treeList = this.girdToTree(res.data)
this.girdInfoList.map((e) => {
this.treeObj.checkedKeys.push(e.id);
});
}
});
},
onCheckChange(e) {
this.$refs.tree.setChecked(e.id, true)
},
},
computed: {
isEdit() {
@@ -254,21 +402,16 @@ export default {
},
etOps() {
return {
lazy: true,
value: "dictValue",
label: "dictName",
lazyLoad: (node, resolve) => {
if (node.level == 0) resolve(this.$dict.getDict('integralRuleEvent'))
else if (node.level == 1) {
let dict = 'integralRuleEvent' + node.value
this.$dict.load(dict).then(() => {
let nodes = this.$dict.getDict(dict).map(e => ({...e, leaf: true}))
resolve(nodes)
})
}
}
value: "id",
label: "ruleName",
}
},
// currCheckedKeys() {
// if (this.girdInfoList && this.girdInfoList[this.currIndex] && this.girdInfoList[this.currIndex].id) {
// return [this.girdInfoList[this.currIndex].id]
// }
// return []
// },
},
}