事件汇总
This commit is contained in:
@@ -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: {
|
||||
|
||||
@@ -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 []
|
||||
// },
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user