Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
aixianling
2022-08-17 08:44:17 +08:00
4 changed files with 202 additions and 100 deletions

View File

@@ -5,12 +5,12 @@
<ai-search-bar>
<template #left>
<el-button type="primary" size="small" icon="iconfont iconAdd" @click="changeIntegral('',0)">&nbsp;批量调整积分</el-button>
<el-cascader ref="cascader1" clearable v-model="search.girdId" :options="girdOptions" placeholder="所属网格" size="small"
<el-cascader ref="cascader1" clearable v-model="girdIdList" :options="girdOptions" placeholder="所属网格" size="small"
:props="defaultProps" :show-all-levels="false" @change="gridChange"></el-cascader>
</template>
<template #right>
<el-input size="small" placeholder="姓名" v-model="search.name" clearable
@clear="current = 1, search.name = '', getTableData()" suffix-icon="iconfont iconSearch"
<el-input size="small" placeholder="姓名" v-model="search.userName" clearable
@clear="current = 1, search.userName = '', getTableData()" suffix-icon="iconfont iconSearch"
v-throttle="() => {(current = 1), getTableData();}"/>
<ai-download :instance="instance" url="`/app/appintegraluser/girdIntegralExport" :params="search" fileName="网格员积分"
:disabled="tableData.length == 0">
@@ -20,21 +20,6 @@
</ai-search-bar>
<ai-table :tableData="tableData" :total="page.total" :current.sync="current" :size.sync="page.size"
@getList="getTableData()" :col-configs="colConfigs" :dict="dict" @sort-change="changeTableSort">
<el-table-column slot="integral" label="积分余额" align="center" prop="integral" :sortable="'custom'">
<template slot-scope="{ row }">
<span>{{ row.integral }}</span>
</template>
</el-table-column>
<el-table-column slot="totalIntegral" label="累计积分" align="center" prop="totalIntegral" :sortable="'custom'">
<template slot-scope="{ row }">
<span>{{ row.totalIntegral }}</span>
</template>
</el-table-column>
<el-table-column slot="usedIntegral" label="已用积分" align="center" prop="usedIntegral" :sortable="'custom'">
<template slot-scope="{ row }">
<span>{{ row.usedIntegral }}</span>
</template>
</el-table-column>
<el-table-column slot="options" label="操作" align="center">
<template slot-scope="{ row }">
<el-button type="text" @click="changeIntegral(row,1)">调整积分</el-button>
@@ -52,27 +37,27 @@
@onConfirm="onConfirm"
@closed="form={},chooseUserList=[]">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="选择人员" prop="ids" required>
<!-- <ai-person-select :instance="instance" :customClicker="true" :chooseUserList="chooseUserList"
:url="'/app/appgirdmemberinfo/list?size=10'"
:isMultiple="true" dialogTitle="选择" @selectPerson="selectPerson">
<el-form-item label="选择人员" prop="ids">
<ai-person-select :instance="instance" :customClicker="true" :chooseUserList="chooseUserList"
:url="'/app/appgirdmemberinfo/list?size=10'" headerTitle="网格员列表"
:isMultiple="true" dialogTitle="选择" @selectPerson="selectPerson" class="aipersonselect">
<template name="option" v-slot:option="{ item }">
<span class="iconfont iconProlife">{{ item.name }}</span>
<ai-id mode="show" :show-eyes="false" :value="item.idNumber"/>
</template>
</ai-person-select> -->
</ai-person-select>
</el-form-item>
<el-form-item label="调整说明" prop="eventDesc" required>
<el-form-item label="调整说明" prop="eventDesc">
<el-input v-model.trim="form.eventDesc" placeholder="请输入..." type="textarea" :rows="4" show-word-limit
maxlength="100"></el-input>
</el-form-item>
<el-form-item label="上传凭证">
<ai-uploader :instance="instance" fileType="file" v-model="form.file" :limit="1"></ai-uploader>
</el-form-item>
<el-form-item label="类型" prop="integralCalcType" required>
<el-form-item label="类型" prop="integralCalcType">
<ai-select v-model="form.integralCalcType" :selectList="dict.getDict('integralCalcType')"/>
</el-form-item>
<el-form-item label="积分" prop="integral" required>
<el-form-item label="积分" prop="integral">
<el-input v-model.trim="form.integral" placeholder="请输入正数" size="small"></el-input>
</el-form-item>
</el-form>
@@ -94,13 +79,14 @@ export default {
data() {
return {
search: {
name: '',
userName: '',
girdId: '',
current: 1,
size: 10,
sortFiled: '',
sortRule: '',
},
girdIdList: [],
tableData: [],
page: {size: 10, total: 0},
current: 1,
@@ -135,10 +121,10 @@ export default {
colConfigs() {
return [
{ prop: "userName", label: '姓名', align: "left", },
{ prop: "girdName", label: '所属网格', align: "center", },
{ slot: "integral", label: '积分余额', align: "center", },
{ slot: "totalIntegral", label: '累计积分', align: "center", },
{ slot: "usedIntegral", label: '已用积分', align: "center", },
{ prop: "girdName", label: '所属网格' },
{ prop: "integral", label: '积分余额', align: "center", sortable: true },
{ prop: "totalIntegral", label: '累计积分', align: "center", sortable: true },
{ prop: "usedIntegral", label: '已用积分', align: "center", sortable: true },
{ slot: "options" },
]
},
@@ -147,7 +133,8 @@ export default {
ids: [{required: true, message: '请选择人员', trigger: 'blur'}],
eventDesc: [{required: true, message: '请输入调整说明', trigger: 'blur'}],
integralCalcType: [{required: true, message: '请选择类型', trigger: 'change'}],
integral: [{required: true, validator: (r, v, cb) => v > 0 ? cb() : cb("请输入正数")}],
integral: [{required: true, message: '请输入积分', trigger: 'blur' },
{pattern: /^([1-9]\d*|0)(\.\d{1,2})?$/, message: '请输入正数且最多只能保留两位小数'}],
}
},
},
@@ -218,6 +205,7 @@ export default {
},
gridChange(val) {
this.girdIdList = val
this.search.girdId = val?.[val.length - 1]
this.$refs.cascader1.dropDownVisible = false;
this.getTableData()
@@ -225,36 +213,30 @@ export default {
changeTableSort(col) {
if(col.prop === 'integral') { // 剩余积分
this.search.sortFiled = 0
if(col.order === 'ascending') {
this.search.sortFiled = 0
this.search.sortRule = true
} else if(col.order === 'descending') {
this.search.sortFiled = 0
this.search.sortRule = false
} else if(col.order === null) {
this.search.sortFiled = ''
this.search.sortRule = ''
}
} else if(col.prop === 'totalIntegral') { // 累计积分
this.search.sortFiled = 1
if(col.order === 'ascending') {
this.search.sortFiled = 1
this.search.sortRule = true
} else if(col.order === 'descending') {
this.search.sortFiled = 1
this.search.sortRule = false
} else if(col.order === null) {
this.search.sortFiled = ''
this.search.sortRule = ''
}
} else if(col.prop === 'usedIntegral') { // 已用积分
this.search.sortFiled = 2
if(col.order === 'ascending') {
this.search.sortFiled = 2
this.search.sortRule = true
} else if(col.order === 'descending') {
this.search.sortFiled = 2
this.search.sortRule = false
} else if(col.order === null) {
this.search.sortFiled = ''
this.search.sortRule = ''
}
}
@@ -277,12 +259,15 @@ export default {
integralCalcType: this.form.integralCalcType,
integral: this.form.integral,
}).then(res => {
if(res.code == 0) {
if(res?.code == 0) {
this.$message.success('调整积分成功')
setTimeout(() =>{
this.getTableData()
this.dialog = false
})
this.getTableData()
this.flag = false
}, 600)
} else {
this.flag = false
}
})
}
@@ -309,5 +294,65 @@ export default {
::v-deep .ai-dialog .ai-dialog__content {
overflow-y: hidden;
}
.userlist {
display: inline-block;
}
.userlist, .user {
display: inline-block;
}
.user {
position: relative;
width: 70px;
text-align: center;
.remove-icon {
position: absolute;
right: 7px;
top: -4px;
line-height: 1;
padding: 6px 0;
font-size: 16px;
cursor: pointer;
&:hover {
color: crimson;
}
}
img, h2 {
display: block;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
margin: 0 auto 4px;
font-size: 14px;
color: #fff;
border-radius: 50%;
}
h2 {
background-color: $primaryColor;
}
span {
color: #666;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
word-break: break-all;
text-overflow: ellipsis;
}
}
::v-deep .selectCont .pagination {
width: 100%!important;
background: pink;
}
}
</style>

View File

@@ -7,7 +7,7 @@
<ai-search-bar>
<template #left>
<el-button type="primary" icon="iconfont iconAdd" @click="dialog = true">&nbsp;添加</el-button>
<el-cascader size="small" v-model="search.systemRuleId" :options="rulesOps" placeholder="请选择事件/类型" clearable :props="rulesProps" @change="handleTypeSearch" ref="eventTypeSearch"/>
<el-cascader size="small" v-model="systemRuleIdList" :options="rulesOps" placeholder="请选择事件/类型" clearable :props="rulesProps" @change="handleTypeSearch" ref="eventTypeSearch"/>
<ai-select v-model="search.status" @change="(page.current = 1), getList()" placeholder="请选择状态" :selectList="$dict.getDict('integralRuleStatus')">
</ai-select>
</template>
@@ -42,8 +42,8 @@
<el-cascader v-model="form.systemRuleId" ref="cascaderArr" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm" :options="rulesOps"/>
</el-form-item>
<el-form-item label="自定义事件" v-if="form.systemRuleId == '自定义'">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model="form.ruleName" clearable/>
<el-form-item label="自定义事件" v-if="form.systemRuleId == '自定义'" prop="ruleName" :required="form.systemRuleId == '自定义'">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model="form.ruleName" clearable maxlength="10" show-word-limit />
</el-form-item>
<el-form-item label="规则">
@@ -82,7 +82,7 @@
</el-form-item>
<el-form-item label="奖励次数">
<el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/>
<el-input type="number" placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/>
</el-form-item>
<el-form-item label="积分分值" prop="integral">
@@ -97,13 +97,18 @@
</el-form-item>
<el-form-item label="生效网格" :prop="form.validRangeType == 1 ? 'validRangeData' : ''" :rules="[{ required: true, message: '请选择生效网格', trigger: 'change' }, ]" v-if="form.validRangeType == 1">
<el-button type="text" @click="(showGrid = true), beforeSelectTree()" >{{ girdInfoList.length ? "选择" : "请选择" }}</el-button>
<el-button type="text" @click="(showGrid = true), beforeSelectTree()" >{{ girdInfoList.length ? "重新选择" : "请选择" }}</el-button>
<div v-if="girdInfoList.length">
<span v-for="(e,index) in girdNameList" :key="index" style="margin-right: 8px;">{{e}}</span>
</div>
</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 :data="treeObj.treeList" :props="treeObj.defaultProps" node-key="id" ref="tree"
show-checkbox lazy :check-strictly="true" :load="loadNode" :default-expanded-keys="currCheckedKeys"
:default-checked-keys="currCheckedKeys" @check="onCheckChange">
</el-tree>
</div>
<div class="dialog-footer" slot="footer">
@@ -125,12 +130,28 @@ export default {
permissions: Function,
},
data() {
var validcode = (rule, value, callback) => {
if(value) {
if (value != 0) {
if(!/^([+-]?([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/.test(value)) {
callback(new Error('请输入积分分值,可输入正数、负数、最多保留两位小数'))
}else{
callback();
}
} else {
callback(new Error('请输入有效的积分分值'));
}
} else {
callback(new Error('请输入积分分值'));
}
}
return {
search: {
status: "",
systemRuleId: "",
ruleName: ""
},
systemRuleIdList: [],
page: { current: 1, size: 10, total: 0 },
colConfigs: [
{
@@ -187,16 +208,13 @@ export default {
systemRuleId: [
{ required: true, message: "请选择事件/类型", trigger: "change" },
],
ruleName: [
{ required: true, message: "请输入自定义事件", trigger: "change" },
],
scoringCycle: [
{ required: true, message: "请选择周期范围", trigger: "change" },
],
integral: [
{
required: true,
pattern: /^\d*[.\d]\d?$/,
message: "请输入积分分值,最多保留一位小数",
},
],
integral: [{required: true, validator: validcode, trigger: "blur"},],
validRangeType: [
{ required: true, message: "请选择有效范围", trigger: "change" },
],
@@ -214,19 +232,24 @@ export default {
defaultProps: {
label: "girdName",
value: "id",
children: 'children',
isLeaf: 'leaf'
},
checkedKeys: [],
},
girdInfoList: [],
currCheckedKeys: [],
rulueType: "0",
girdNameList: [],
};
},
created() {
this.$dict.load("integralRuleStatus","integralRuleRuleType","integralRuleScoringCycle","integralRuleEvent","integralRuleEventType").then(() => {
this.$dict.load("integralRuleStatus","integralRuleRuleType","integralRuleScoringCycle",
"integralRuleEvent","integralRuleEventType").then(() => {
this.getList();
this.getRulesList();
this.beforeSelectTree();
// this.getList12()
});
},
methods: {
@@ -256,16 +279,22 @@ export default {
validRangeType: "0",
validRangeData: "",
};
if(!this.isEdit) {
this.girdInfoList = []
}
},
toEdit(row) {
this.form = {...row}
this.girdInfoList = this.form?.validRangeData?.split(",");
if(this.form?.validRangeData) {
this.girdInfoList = JSON.parse(this.form.validRangeData)
this.girdNameList = this.girdInfoList.map(e=>e.girdName)
}
this.$nextTick(() => {
this.dialog = true;
});
},
remove(id) {
this.$confirm("删除后不可恢复,是否要删除该事项", {
this.$confirm("删除后不可恢复,是否要删除该规则", {
type: "error",
}).then(() => {
this.instance
@@ -299,9 +328,6 @@ export default {
this.getList();
},
onConfirm() {
// if(this.form.ruleType==1 && !this.form.ladderRule.length) {
// return this.$message.error('请添加规则')
// }
this.$refs.DialogForm.validate((valid) => {
if (valid) {
let formData = this.$copy(this.form);
@@ -324,6 +350,7 @@ export default {
});
},
handleTypeSearch(v) {
this.systemRuleIdList = v
this.search.systemRuleId = v?.[v.length - 1];
this.search.ruleName = this.$refs.eventTypeSearch.getCheckedNodes()[0]?.label
this.page.current = 1;
@@ -403,58 +430,85 @@ export default {
if (!this.$refs.tree.getCheckedNodes().length) {
return this.$message.error("请选择网格");
}
// console.log(this.girdInfoList, this.$refs.tree.getCheckedNodes());
this.girdInfoList = this.$refs.tree.getCheckedNodes().map((item) => {
return { ...item, checkType: true };
});
// this.$set(this.girdInfoList, this.currIndex, {
// ...this.$refs.tree.getCheckedNodes(),
// checkType: true
// })
this.form.validRangeData = this.$refs.tree
.getCheckedNodes()
.map((e) => e.id)
.toString();
let validRangeData = this.$refs.tree.getCheckedNodes().map((e) => {
return {
id: e.id,
girdName: e.girdName
}
}
)
this.girdNameList = validRangeData.map(e=>e.girdName)
this.form.validRangeData = JSON.stringify(validRangeData)
this.showGrid = false;
},
beforeSelectTree() {
this.treeObj.checkedKeys = [];
this.instance
.post(`/app/appgirdinfo/listAll3`, null, null)
.then((res) => {
this.instance.post(`/app/appgirdinfo/listAll3`, null, null).then((res) => {
if (res.code == 0) {
// res.data.forEach((item)=>{
// const isChecked = this.girdInfoList.find((checkedId)=>{
// return item.id === checkedId
// })
// if(isChecked) item.checkType = true
// })
// console.log(res.data)
let tree = this.girdToTree(res.data);
this.treeObj.treeList = this.addKey(tree)
this.treeObj.treeList = this.girdToTree(res.data);
this.girdInfoList.map((e) => {
this.treeObj.checkedKeys.push(e.id);
});
this.$nextTick(() => {
this.currCheckedKeys = this.girdInfoList;
this.currCheckedKeys = this.girdInfoList.map(v=>v.id)
this.$nextTick(() => {
this.$refs.tree?.getCheckedKeys(this.currCheckedKeys);
this.$refs.tree?.setCheckedKeys(this.currCheckedKeys);
});
});
}
});
},
// 最后一级追加属性
addKey(arr) {
for (let index = 0; index < arr.length; index++) {
const item = arr[index]
if (!item.children || !item.children.length) {
item.leaf = true
} else {
this.addKey(item.children)
}
}
return arr
},
// el-tree懒加载
loadNode(node, resolve) {
if (node.level === 0) {
return resolve(this.treeObj.treeList);
}
if (node.level >= 1 || node.data.children && node.data.children.length) {
return resolve(node.data.children)
} else {
return resolve({
name: 'girdName',
isLeaf: true
})
}
},
onCheckChange(e) {
// this.$nextTick(() => {
// this.$refs.tree.getCheckedKeys().forEach(v => {
// this.$refs.tree.setChecked(v, false)
// })
// this.$refs.tree.setChecked(e.id, true)
// })
// console.log(e);
this.$refs.tree.setChecked(e.id, true);
this.girdInfoList.forEach((item) => {
if(item.id == e.id) {
console.log(111);
this.$refs.tree.setChecked(e.id, false);
} else {
console.log(222);
this.$refs.tree.setChecked(e.id, true);
}
})
},
},
computed: {

View File

@@ -8,7 +8,7 @@
<span v-for="(item,index) in timeCheck" :key="index" :class="type == index? 'active':''"
@click="timeChange(index)">{{ item }}</span>
</div>
<el-cascader ref="cascader1" v-model="girdId" :options="girdOptions" placeholder="所属网格" size="small"
<el-cascader ref="cascader1" v-model="girdArr" :options="girdOptions" placeholder="所属网格" size="small"
:props="defaultProps" :show-all-levels="false" @change="gridChange" clearable></el-cascader>
</div>
</div>
@@ -56,7 +56,7 @@
<template #content>
<ai-search-bar>
<template #left>
<el-cascader ref="cascader2" v-model="search.girdId" :options="girdOptions" placeholder="所属网格" size="small"
<el-cascader ref="cascader2" v-model="girdIdArr" :options="girdOptions" placeholder="所属网格" size="small"
:props="defaultProps" :show-all-levels="false" clearable @change="gridChangeOpt"></el-cascader>
<ai-select v-model="search.integralType" placeholder="请选择类型" @change="current=1, getTableData()"
:selectList="dict.getDict('integralType')"/>
@@ -103,7 +103,7 @@
</template>
</ai-detail>
<span slot="footer" class="dialog-footer" center>
<el-button @click="dialog = false">关闭</el-button>
<el-button @click="dialog = false" style="width: 92px">关闭</el-button>
</span>
</el-dialog>
@@ -140,6 +140,7 @@ export default {
startTime: '',
endTime: '',
},
girdIdArr:[],
page: {
size: 10,
total: 0,
@@ -156,10 +157,12 @@ export default {
endTime: '',
data: {},
girdId: '',
girdArr: [],
girdOptions: [],
defaultProps: {
label: 'girdName',
value: 'id',
children: 'children',
checkStrictly: true,
},
details: {},
@@ -247,6 +250,7 @@ export default {
},
gridChangeOpt(val) {
this.girdIdArr = val
this.search.girdId = val?.[val.length - 1]
this.$refs.cascader2.dropDownVisible = false;
this.getTableData()
@@ -387,6 +391,7 @@ export default {
this.myChart2.resize()
},
gridChange(val) {
this.girdArr = val
this.girdId = val?.[val.length - 1]
this.$refs.cascader1.dropDownVisible = false;
this.getStatistics()

View File

@@ -103,10 +103,8 @@ export default {
return [
{prop: 'doTime', label: '时间', width: 200},
{prop: "type", label: "类型", dict: "integralDetailType", align: 'center'},
{
prop: 'changeIntegral', align: 'center', label: '变动积分',
render: (h, {row}) => h('p', `${row.integralCalcType == 1 ? '+' : '-'}${row.changeIntegral}`)
},
{prop: 'changeIntegral', align: 'center', label: '变动积分',render:
(h, {row}) => h('p', `${row.integralCalcType == 1 ? '+' : '-'}${row.changeIntegral}`)},
{prop: 'nowIntegral', align: 'center', label: '剩余积分'},
{prop: 'eventDesc', label: '事件', width: 500}
]