事件汇总

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> </div>
<div class="bar_Box"> <div class="bar_Box">
<div id="chartDom" style="height: 230px; width: 100%;"></div> <div id="chartDom" style="height: 230px; width: 100%;" v-show="xData.length && yData.length"></div>
<ai-empty v-if="false" style="height: 200px; width: 100%;"></ai-empty> <ai-empty style="height: 200px; width: 100%;" v-show="!xData.length && !yData.length"></ai-empty>
</div> </div>
</el-row> </el-row>
<ai-card> <ai-card>
@@ -45,7 +45,7 @@
</template> </template>
</ai-search-bar> </ai-search-bar>
<ai-table :tableData="tableData" :total="search.total" :current.sync="search.current" :size.sync="search.size" <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"> <el-table-column slot="eventDesc" label="事件" align="center">
<template slot-scope="{ row }"> <template slot-scope="{ row }">
@@ -79,6 +79,8 @@ export default {
data: {}, data: {},
startTime: '', startTime: '',
endTime: '', endTime: '',
xData: [],
yData: [],
} }
}, },
props: { props: {
@@ -104,6 +106,7 @@ export default {
this.$dict.load('integralType') this.$dict.load('integralType')
this.getDetail() this.getDetail()
this.getIntegralChange() this.getIntegralChange()
this.getEventSummary()
}, },
methods: { 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() { getIntegralChange() {
@@ -143,7 +160,7 @@ export default {
} }
}, },
getColEcherts() { getColEcherts(xData, yData) {
let chartDom = document.getElementById('chartDom'); let chartDom = document.getElementById('chartDom');
chartDom.style.width = window.innerWidth - 335 + "px"; chartDom.style.width = window.innerWidth - 335 + "px";
this.myChart = echarts.init(chartDom); this.myChart = echarts.init(chartDom);
@@ -164,14 +181,14 @@ export default {
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['每日签到', '事件上报', '特殊人员跟进', '群发任务', '邀请居民进群'] data: xData,
}, },
yAxis: { yAxis: {
type: 'value' type: 'value'
}, },
series: [ series: [
{ {
data: [120, 200, 150, 80, 70,], data: yData,
type: 'bar', type: 'bar',
showBackground: true, showBackground: true,
backgroundStyle: { backgroundStyle: {

View File

@@ -7,10 +7,8 @@
<ai-search-bar> <ai-search-bar>
<template #left> <template #left>
<el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button> <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button>
</template> <el-cascader size="small" v-model="search.eventType" :options="rulesOps" placeholder="请选择事件/类型" clearable
<template slot="right"> :props="rulesProps" @change="handleTypeSearch" ref="eventTypeSearch" />
<el-cascader size="small" v-model="search.eventType" placeholder="请选择事件/类型" clearable
:props="{...etOps,checkStrictly:true}" @change="handleTypeSearch" ref="eventTypeSearch" />
<ai-select <ai-select
v-model="search.status" v-model="search.status"
@change="page.current = 1, getList()" @change="page.current = 1, getList()"
@@ -52,14 +50,23 @@
</template> </template>
</ai-list> </ai-list>
<!-- <ai-empty v-else>暂无应用权限</ai-empty> --> <!-- <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"> <div class="form_div">
<el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix="" label-width="100px"> <el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix="" label-width="150px">
<el-form-item label="事件/类型" prop="eventType"> <el-form-item label="事件类型" prop="systemRuleId">
<el-cascader v-model="form.eventType" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm" <el-cascader v-model="form.systemRuleId" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm"
:options="cacheOps"/> :options="rulesOps"/>
</el-form-item> </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"> <el-row type="flex" justify="space-between">
<div v-text="$dict.getLabel('integralRuleRuleType',form.ruleType)"/> <div v-text="$dict.getLabel('integralRuleRuleType',form.ruleType)"/>
<el-button v-if="form.ruleType==1" type="text" icon="iconfont iconAdd" <el-button v-if="form.ruleType==1" type="text" icon="iconfont iconAdd"
@@ -84,20 +91,52 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form-item> </el-form-item> -->
<el-form-item label="周期范围" prop="scoringCycle"> <el-form-item label="周期范围" prop="scoringCycle">
<ai-select v-model="form.scoringCycle" :selectList="$dict.getDict('integralRuleScoringCycle')"/> <ai-select v-model="form.scoringCycle" :selectList="$dict.getDict('integralRuleScoringCycle')"/>
</el-form-item> </el-form-item>
<template v-if="form.ruleType==0">
<el-form-item label="奖励次数" prop="numberLimit"> <el-form-item label="奖励次数">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/> <el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/>
</el-form-item> </el-form-item>
<el-form-item label="积分分值" prop="integral"> <el-form-item label="积分分值" prop="integral">
<el-input placeholder="请输入" v-model="form.integral" clearable/> <el-input placeholder="请输入" v-model="form.integral" clearable/>
</el-form-item> </el-form-item>
</template>
<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> </el-form>
</div> </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> </ai-dialog>
</section> </section>
</template> </template>
@@ -127,19 +166,47 @@ export default {
], ],
tableData: [], tableData: [],
dialog: false, dialog: false,
form: {ladderRule: []}, form: {
formRules: { systemRuleId: '',
eventType: [{required: true, message: "请选择事件/类型", trigger: "change"}], ruleName: '',
scoringCycle: [{required: true, message: "请选择周期范围", trigger: "change"}], scoringCycle: '',
integral: [{required: true, pattern: /^\d*[.\d]\d?$/, message: "请输入积分分值,最多保留一位小数"}], numberLimit: '',
numberLimit: [{pattern: /^\d*$/, message: "请输入正整数"}] 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() { created() {
this.$dict.load("integralRuleStatus", "integralRuleRuleType", 'integralRuleScoringCycle', 'integralRuleEvent', 'integralRuleEventType').then(() => { this.$dict.load("integralRuleStatus", "integralRuleRuleType", 'integralRuleScoringCycle', 'integralRuleEvent', 'integralRuleEventType').then(() => {
this.getList(); this.getList()
this.getRulesList()
this.beforeSelectTree()
}); });
}, },
methods: { methods: {
@@ -231,9 +298,11 @@ export default {
}, },
handleTypeForm(v) { handleTypeForm(v) {
if (this.dialog) { if (this.dialog) {
this.form.event = v?.[0] console.log(v);
this.form.type = v?.[1] // this.form.event = v?.[0]
this.form.ruleType = !this.form.event ? null : this.form.event == 3 ? 1 : 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) { handleDelete(i) {
@@ -243,7 +312,86 @@ export default {
}, },
checkIntegral(v) { checkIntegral(v) {
return /\.\d{2,}$/.test(v) ? Math.abs(v).toFixed(1) : Math.abs(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: { computed: {
isEdit() { isEdit() {
@@ -254,21 +402,16 @@ export default {
}, },
etOps() { etOps() {
return { return {
lazy: true, value: "id",
value: "dictValue", label: "ruleName",
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)
})
}
}
} }
}, },
// currCheckedKeys() {
// if (this.girdInfoList && this.girdInfoList[this.currIndex] && this.girdInfoList[this.currIndex].id) {
// return [this.girdInfoList[this.currIndex].id]
// }
// return []
// },
}, },
} }