员工积分完成
This commit is contained in:
36
packages/conv/creditScore/scoreSysUser/AppScoreSysUser.vue
Normal file
36
packages/conv/creditScore/scoreSysUser/AppScoreSysUser.vue
Normal file
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<section class="AppScoreSysUser">
|
||||
<component :is="currentPage" v-bind="$props"/>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import SsuList from "./ssuList";
|
||||
import SsuDetail from "./ssuDetail";
|
||||
|
||||
export default {
|
||||
name: "AppScoreSysUser",
|
||||
label: "员工积分",
|
||||
components: {SsuDetail, SsuList},
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
currentPage() {
|
||||
return this.$route.query.id ? SsuDetail : SsuList
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.dict.load("yesOrNo", "integralGiveObjType")
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppScoreSysUser {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
189
packages/conv/creditScore/scoreSysUser/ssuDetail.vue
Normal file
189
packages/conv/creditScore/scoreSysUser/ssuDetail.vue
Normal file
@@ -0,0 +1,189 @@
|
||||
<template>
|
||||
<section class="ssuDetail">
|
||||
<ai-detail>
|
||||
<template slot="title">
|
||||
<ai-title title="积分明细" isShowBack isShowBottomBorder @onBackClick="$router.push({})"/>
|
||||
</template>
|
||||
<template slot="content">
|
||||
<div class="detail-info">
|
||||
<div class="detail-info__item">
|
||||
<h2>姓名</h2>
|
||||
<span v-text=" detail.sysUserName"/>
|
||||
</div>
|
||||
<div class="detail-info__item">
|
||||
<h2>员工积分</h2>
|
||||
<el-row type="flex" align="middle">
|
||||
<span class="color-26f fill" v-text="detail.sysUserIntegral || 0"/>
|
||||
<el-button type="text" @click="dialog=true" v-if="user.info.id==detail.sysUserId">积分赠送</el-button>
|
||||
</el-row>
|
||||
</div>
|
||||
<div class="detail-info__item">
|
||||
<h2>已用积分</h2>
|
||||
<span>{{ detail.sysUserUsedIntegral || 0 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<ai-card title="积分变动明细">
|
||||
<template slot="right">
|
||||
<ai-download
|
||||
:instance="instance"
|
||||
url="/app/appvillagerintegraldetail/export"
|
||||
:disabled="!Boolean(tableData.length)"
|
||||
:params="{userId:detail.sysUserId,type}"
|
||||
fileName="积分变动明细">
|
||||
<el-button type="text" icon="iconfont iconExported">导出</el-button>
|
||||
</ai-download>
|
||||
</template>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #left>
|
||||
<ai-select v-model="type" placeholder="请选择类型" @change="page.current=1,getDetail()"
|
||||
:selectList="dict.getDict('integralDetailType')"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :col-configs="colConfigs" :total="page.total" border :dict="dict" :current.sync="page.current"
|
||||
:size.sync="page.size"
|
||||
@getDetail="getDetail"/>
|
||||
</template>
|
||||
</ai-card>
|
||||
</template>
|
||||
</ai-detail>
|
||||
<ai-dialog title="积分赠送" width="600px" :visible.sync="dialog" @onConfirm="handleGiveScore" @closed="form={}">
|
||||
<el-alert type="warning" show-icon title="请注意,确认赠送对象和分值,积分赠送后,不可撤回。" :closable="false"/>
|
||||
<el-form class="mt10" size="small" ref="DialogForm" label-width="100px" label-suffix=":" :rules="rules" :model="form">
|
||||
<el-form-item label="选择对象" prop="objectType">
|
||||
<ai-select v-model="form.objectType" :selectList="dict.getDict('integralGiveObjType')" @change="form.userId=null"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="选择人员" prop="userId" v-if="form.objectType">
|
||||
<ai-person-select v-if="form.objectType==1" :instance="instance" url="/admin/user/userIntegralList" customClicker @selectPerson="handleResidentSelect"/>
|
||||
<ai-person-select v-if="form.objectType==0" :instance="instance" @selectPerson="handleResidentSelect" customClicker/>
|
||||
</el-form-item>
|
||||
<el-form-item label="赠送分值" prop="integral">
|
||||
<el-input v-model="form.integral" clearable placeholder="请输入">
|
||||
<span slot="append">积分总额:{{ detail.sysUserIntegral || 0 }}</span>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</ai-dialog>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: 'ssuDetail',
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
type: "",
|
||||
detail: {},
|
||||
tableData: [],
|
||||
form: {},
|
||||
dialog: false,
|
||||
rules: {
|
||||
integral: {required: true, message: "请输入赠送分值"},
|
||||
objectType: {required: true, message: "请选择对象"},
|
||||
userId: {required: true, message: "请选择人员"},
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.dict.load('integralDetailType')
|
||||
this.getDetail()
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
colConfigs() {
|
||||
return [
|
||||
{prop: 'doTime', label: '时间', width: 200},
|
||||
{prop: "type", label: "类型", dict: "integralDetailType", align: 'center'},
|
||||
{prop: 'changeIntegral', align: 'center', label: '变动积分', formart: v => v > 0 ? `+${v}` : `-${v}`},
|
||||
{prop: 'nowIntegral', align: 'center', label: '剩余积分'},
|
||||
{prop: 'eventDesc', label: '事件', width: 500}
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getDetail() {
|
||||
let {id: userId} = this.$route.query, {type} = this
|
||||
this.instance.post('/app/appvillagerintegraldetail/sysUserIntegralList', null, {
|
||||
params: {userId, ...this.page, type}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.detail = res.data
|
||||
this.tableData = res.data.details?.records || []
|
||||
this.page.total = res.data.details?.total || 0
|
||||
}
|
||||
})
|
||||
},
|
||||
handleGiveScore() {
|
||||
this.$refs.DialogForm.validate(v => {
|
||||
if (v) {
|
||||
this.instance.post("/admin/user/giveIntegral", null, {
|
||||
params: {...this.form}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("提交成功!")
|
||||
this.dialog = false
|
||||
this.getDetail()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleResidentSelect(v) {
|
||||
this.form.userId = v?.id || ""
|
||||
this.form.userName = v?.name || ""
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.ssuDetail {
|
||||
height: 100%;
|
||||
|
||||
.detail-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.detail-info__item {
|
||||
flex: 1;
|
||||
height: 96px;
|
||||
margin-right: 20px;
|
||||
padding: 16px 24px;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0 4px 6px -2px rgba(15, 15, 21, 0.15);
|
||||
border-radius: 4px;
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-bottom: 8px;
|
||||
color: #888888;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span {
|
||||
display: block;
|
||||
line-height: 32px;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
color: #222;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.color-26f {
|
||||
color: #26f !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
112
packages/conv/creditScore/scoreSysUser/ssuList.vue
Normal file
112
packages/conv/creditScore/scoreSysUser/ssuList.vue
Normal file
@@ -0,0 +1,112 @@
|
||||
<template>
|
||||
<section class="ssuList">
|
||||
<ai-list>
|
||||
<template slot="title">
|
||||
<ai-title title="员工积分" isShowBottomBorder/>
|
||||
</template>
|
||||
<template slot="content">
|
||||
<ai-search-bar bottomBorder>
|
||||
<template slot="left">
|
||||
<ai-select v-model="searchObj.integralNotEmpty" placeholder="积分是否大于0" :selectList="dict.getDict('yesOrNo')"
|
||||
@change="page.current = 1,getList()"/>
|
||||
</template>
|
||||
<template slot="right">
|
||||
<el-input v-model="searchObj.name" size="small" placeholder="姓名、联系方式" @change="page.current=1,getList()"
|
||||
clearable suffix-icon="iconfont iconSearch"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-search-bar class="mt10">
|
||||
<template slot="left">
|
||||
<ai-download :instance="instance" type="primary" url="/admin/user/exportUserIntegralList" :params="searchObj" fileName="员工积分"></ai-download>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :col-configs="colConfigs" :total="page.total" :current.sync="page.current" :size.sync="page.size" :dict="dict"
|
||||
@getList="getList">
|
||||
<el-table-column label="操作" slot="options" fixed="right" align="center" width="180">
|
||||
<template v-slot="{row}">
|
||||
<div class="table-options">
|
||||
<el-button type="text" :disabled="!permissions('app_appvillagerintegralfamily_detail')" title="详情" @click="goDetail(row)">详情</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-list>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from 'vuex';
|
||||
|
||||
export default {
|
||||
name: 'ssuList',
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
searchObj: {},
|
||||
page: {
|
||||
current: 1,
|
||||
size: 10,
|
||||
total: 0
|
||||
},
|
||||
tableData: [],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
colConfigs() {
|
||||
return [
|
||||
{prop: 'name', label: '姓名'},
|
||||
{prop: 'phone', label: '联系电话', align: 'center'},
|
||||
{prop: 'areaName', align: 'center', label: '所在区域'},
|
||||
{prop: 'integral', align: 'center', label: '员工积分'},
|
||||
{prop: 'usedIntegral', align: 'center', label: '已用积分'},
|
||||
]
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
getList() {
|
||||
this.instance.post("/admin/user/userIntegralList", null, {
|
||||
params: {
|
||||
...this.searchObj,
|
||||
...this.page,
|
||||
}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data.records
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
},
|
||||
goDetail(row) {
|
||||
let {id} = row
|
||||
this.$router.push({query: {id}})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.ssuList {
|
||||
height: 100%;
|
||||
background: #f3f6f9;
|
||||
overflow: auto;
|
||||
|
||||
.iconfont {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.family-list {
|
||||
::v-deep .el-table--small {
|
||||
font-size: 14px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user