员工积分完成
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