积分规则 积分维护
This commit is contained in:
		| @@ -34,19 +34,19 @@ | ||||
|                   @getList="getTableData" :col-configs="colConfigs" :dict="dict"> | ||||
|           <el-table-column slot="options" label="操作" fixed="right" align="center"> | ||||
|             <template slot-scope="{row}"> | ||||
|               <el-button type="text" @click="getFamilyByPartyId(row.idNumber)">家庭成员</el-button> | ||||
|               <!-- <el-button type="text" @click="getFamilyByPartyId(row.idNumber)">家庭成员</el-button> --> | ||||
|               <el-button type="text" @click="showDetail(row.id)">详情</el-button> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog :visible.sync="dialog" title="家庭成员" :customFooter="true" width="780px" @close="familyList=[]"> | ||||
|     <!-- <ai-dialog :visible.sync="dialog" title="家庭成员" :customFooter="true" width="780px" @close="familyList=[]"> | ||||
|       <ai-table :tableData="familyList" :isShowPagination="false" :col-configs="familyCols" :dict="dict"/> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog=false">关 闭</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|     </ai-dialog> --> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| @@ -67,9 +67,6 @@ export default { | ||||
|         {label: "党员姓名", prop: "name", align: "center"}, | ||||
|         {label: "党员类型", prop: "name", align: "center"}, | ||||
|         {label: "获得积分", prop: "name", align: "center"}, | ||||
|         // {label: "个人积分", prop: "integral", align: "center"}, | ||||
|         // {label: "家庭积分", prop: "familySurplusIntegral", align: "center"}, | ||||
|         // {label: "学习强国", prop: "learningIntegral", align: "center"}, | ||||
|         {slot: "options"} | ||||
|       ] | ||||
|     }, | ||||
|   | ||||
| @@ -1,34 +0,0 @@ | ||||
| <template> | ||||
|   <section class="AppPartyScoreFlow"> | ||||
|     <component :is="currentPage" v-bind="$props"/> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import PsfList from "./psfList"; | ||||
|  | ||||
| export default { | ||||
|   name: "AppPartyScoreFlow", | ||||
|   components: {PsfList}, | ||||
|   label: "积分明细(三涧溪)", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function | ||||
|   }, | ||||
|   computed: { | ||||
|     currentPage() { | ||||
|       return PsfList | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict.load("partyIntegralType") | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppPartyScoreFlow { | ||||
|   height: 100%; | ||||
| } | ||||
| </style> | ||||
| @@ -1,156 +0,0 @@ | ||||
| <template> | ||||
|   <section class="psfList"> | ||||
|     <ai-list> | ||||
|       <ai-title slot="title" title="党员积分明细" isShowBottomBorder/> | ||||
|       <template #content> | ||||
|         <ai-search-bar> | ||||
|           <template #left> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button> | ||||
|             <el-date-picker type="daterange" placeholder="日期" size="small" clearable v-model="createTime" | ||||
|                             @change="handleSearchTime" start-placeholder="开始时间" end-placeholder="结束时间" | ||||
|                             value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00','23:59:59']"/> | ||||
|           </template> | ||||
|           <template #right> | ||||
|             <el-input size="small" placeholder="搜索党员" v-model="search.partyName" clearable | ||||
|                       @change="page.current=1,getTableData()" suffix-icon="iconfont iconSearch"/> | ||||
|             <ai-import :instance="instance" :dict="dict" importUrl="/appcollectiveeconomyequity/import" url="/appcollectiveeconomyequity/downloadTemplate" name="集体经济组织股权管理信息" @success="getTableData(), $message.success('导入成功!')"> | ||||
|               <el-button size="small">导入</el-button> | ||||
|             </ai-import> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size" | ||||
|                   @getList="getTableData" :col-configs="colConfigs" :dict="dict"> | ||||
|           <el-table-column slot="options" label="操作" fixed="right" align="center"> | ||||
|             <template slot-scope="{row}"> | ||||
|               <el-button type="text" @click="showDetail(row)">详情</el-button> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog :visible.sync="dialog" title="积分对象" width="600px" @close="form={}" @onConfirm="submit" | ||||
|                :customFooter="!isAdd"> | ||||
|       <el-form v-if="isAdd" :model="form" size="small" ref="DialogForm" :rules="rules" label-width="80px"> | ||||
|         <el-form-item label="选择人员" prop="partyId"> | ||||
|           <ai-select v-model="form.partyId" action="/app/appparty/list" :instance="instance" | ||||
|                      :prop="{label:'name'}"/> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="调整说明" prop="remark"> | ||||
|           <el-input type="textarea" placeholder="请输入" v-model="form.remark" maxlength="100" show-word-limit rows="3" | ||||
|                     clearable/> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="类型" prop="integralType"> | ||||
|           <ai-select v-model="form.integralType" :selectList="dict.getDict('partyIntegralType')"/> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="积分" prop="integral"> | ||||
|           <el-input v-model.number="form.integral" placeholder="请输入正整数" clearable/> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|       <ai-wrapper v-else> | ||||
|         <ai-info-item label="对象" :value="form.partyName"/> | ||||
|         <ai-info-item label="调整说明" :value="form.remark" isLine/> | ||||
|         <ai-info-item label="类型" :value="dict.getLabel('partyIntegralType',form.integralType)"/> | ||||
|         <ai-info-item label="积分" :value="form.integral"/> | ||||
|       </ai-wrapper> | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "psfList", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     colConfigs() { | ||||
|       return [ | ||||
|         {label: "对象", prop: "partyName"}, | ||||
|         {label: "调整说明", prop: "remark", align: "center"}, | ||||
|         {label: "时间", prop: "createTime"}, | ||||
|         {label: "类型", prop: "integralType", align: "center", dict: "partyIntegralType"}, | ||||
|         {label: "积分", prop: "integral", align: "center"}, | ||||
|         {slot: "options"} | ||||
|       ] | ||||
|     }, | ||||
|     isAdd() { | ||||
|       return !this.form.id | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       search: {}, | ||||
|       page: {current: 1, size: 10, total: 0}, | ||||
|       tableData: [], | ||||
|       dialog: false, | ||||
|       form: {}, | ||||
|       rules: { | ||||
|         partyId: {required: true, message: "请选择人员"}, | ||||
|         remark: {required: true, message: "请输入调整说明"}, | ||||
|         integralType: {required: true, message: "请选择类型"}, | ||||
|         integral: [ | ||||
|           {required: true, message: "请输入分数"}, | ||||
|           {pattern: /^\d+$/g, message: "请输入正整数"} | ||||
|         ], | ||||
|       }, | ||||
|       createTime: "", | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     getTableData() { | ||||
|       this.instance.post("/app/apppartyintegralinfo/list", null, { | ||||
|         params: {...this.page, ...this.search} | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data?.records?.map(e => ({ | ||||
|             ...e, | ||||
|             integral: (e.integralType == 0 ? "-" : '+') + e.integral | ||||
|           })) | ||||
|           this.page.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|      | ||||
|     showDetail(row) { | ||||
|       this.form = JSON.parse(JSON.stringify(row)) | ||||
|       this.dialog = true | ||||
|     }, | ||||
|     submit() { | ||||
|       this.$refs.DialogForm.validate(v => { | ||||
|         if (v) { | ||||
|           let loading = this.$loading({text: "提交中..."}) | ||||
|           this.instance.post("/app/apppartyintegralinfo/addOrUpdate", this.form).then(res => { | ||||
|             loading.close() | ||||
|             if (res?.code == 0) { | ||||
|               this.$message.success("提交成功!") | ||||
|               this.dialog = false | ||||
|               this.getTableData() | ||||
|             } | ||||
|           }).catch(() => loading.close()) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     handleSearchTime(v) { | ||||
|       this.page.current = 1 | ||||
|       this.search.startTime = v?.[0] | ||||
|       this.search.endTime = v?.[1] | ||||
|       this.getTableData() | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.getTableData() | ||||
|      | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .psfList { | ||||
|   height: 100%; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										75
									
								
								project/sanjianxi/apps/AppScoreManage/AppScoreManage.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								project/sanjianxi/apps/AppScoreManage/AppScoreManage.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="积分维护" :isShowBottomBorder="false" :instance="instance" :isShowArea="false" v-model="areaId" | ||||
|                 @change="changeArea"></ai-title> | ||||
|     </template> | ||||
|     <template slot="tabs"> | ||||
|       <el-tabs v-model="currIndex"> | ||||
|         <el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label"> | ||||
|           <component :is="tab.comp" v-if="currIndex === String(i)" :ref="tab.name" | ||||
|                      :areaId="areaId" :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|                      <!--  --> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import pointsDetails from "./pointsDetails.vue" | ||||
| import { mapState } from 'vuex' | ||||
| import scoreChange from "./scoreChange"; | ||||
|  | ||||
| export default { | ||||
|   name: 'AppScoreManage', | ||||
|   label: "积分维护(三涧溪)", | ||||
|   components: { pointsDetails, scoreChange}, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     tabs() { | ||||
|       return [ | ||||
|         { | ||||
|           label: "积分明细", | ||||
|           name: "pointsDetails", | ||||
|           comp: pointsDetails, | ||||
|           permission: "app_apppartyfee_statistics", | ||||
|         }, | ||||
|         { | ||||
|           label: "积分调整", | ||||
|           name: "scoreChange", | ||||
|           comp: scoreChange, | ||||
|           permission: "", | ||||
|         }, | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.areaId = this.user.info.areaId | ||||
|     this.dict.load("integralCalcType") | ||||
|   }, | ||||
|   methods: { | ||||
|     changeArea() { | ||||
|       this.$nextTick(() => { | ||||
|         this.$refs[this.tabs[Number(this.currIndex)].name][0].getList() | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       activeName: "pointsDetails", | ||||
|       currIndex: '0', | ||||
|       areaId: '' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										212
									
								
								project/sanjianxi/apps/AppScoreManage/pointsDetails.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								project/sanjianxi/apps/AppScoreManage/pointsDetails.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | ||||
| <template> | ||||
|   <section class="pointsDetails"> | ||||
|     <ai-list isTabs> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <el-date-picker size="small" v-model="searchDotime" type="daterange" range-separator="至" @change="timeChange" | ||||
|                             start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd"></el-date-picker> | ||||
|           </template> | ||||
|           <template slot="right"> | ||||
|             <el-input | ||||
|                 v-model="search.partyName" | ||||
|                 class="search-input" | ||||
|                 size="small" | ||||
|                 placeholder="搜索党员" | ||||
|                 clearable | ||||
|                 v-throttle="() => {search.current = 1, getList()}" | ||||
|                 @clear="search.current = 1, getList()" | ||||
|                 suffix-icon="iconfont iconSearch"/> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="total" :dict="dict" | ||||
|             :current.sync="search.current" | ||||
|             :size.sync="search.size" | ||||
|             @getList="getList"> | ||||
|           <el-table-column slot="integral" label="积分" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{ row.integralType == 1 ? '+' : '-' }}{{ row.integral }}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center" fixed="right" width="120"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <el-button | ||||
|                   type="text" | ||||
|                   title="详情" | ||||
|                   :disabled="!$permissions('app_appvillagerintegraldetail_detail')" | ||||
|                   @click="viewItem(row)"> | ||||
|                 详情 | ||||
|               </el-button> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog title="详情" :visible.sync="dialog" :customFooter="true" :destroyOnClose="true" width="720px"> | ||||
|       <ai-wrapper> | ||||
|         <ai-info-item label="户主:" :value="dialogInfo.familyName"/> | ||||
|         <ai-info-item label="对象:" :value="dialogInfo.residentName"/> | ||||
|         <ai-info-item label="事件:" :value="dialogInfo.eventDesc" isLine/> | ||||
|         <ai-info-item label="时间:" :value="dialogInfo.doTime" isLine/> | ||||
|         <ai-info-item label="积分:"> | ||||
|           {{ dialogInfo.changeIntegral >= 0 ? '增加' : '减少' }} | ||||
|           <span style="color:#26f" v-text="Math.abs(dialogInfo.changeIntegral)"/>分 | ||||
|         </ai-info-item> | ||||
|         <ai-info-item label="积分余额:" :value="dialogInfo.nowIntegral"/> | ||||
|       </ai-wrapper> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog=false">关闭</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: "pointsDeclaration", | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     areaId: String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       searchDotime: [], | ||||
|       search: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         partyName: '', | ||||
|         startTime: null, | ||||
|         endTime: null, | ||||
|       }, | ||||
|       total: 10, | ||||
|       colConfigs: [ | ||||
|         {prop: "partyName", label: "对象", align: "center"}, | ||||
|         {prop: "remark", label: "调整说明", align: "center"}, | ||||
|         {prop: "createTime", label: "时间", align: "center"}, | ||||
|         {prop: "integralType", label: "类型", align: "center", render: (h, {row}) => h('span', `${row.integralType == 0 ? '减分' : '加分'}`)}, | ||||
|         {slot: "integral", label: "积分", align: "center",}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: false, | ||||
|       dialogInfo: {}, | ||||
|     }; | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.$dict.load(["integralDeclareDoType","integralDetailType",]).then(() => { | ||||
|       this.getList(); | ||||
|     }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/apppartyintegralinfo/list`, null, { | ||||
|         params: { | ||||
|           ...this.search, | ||||
|         }, | ||||
|       }) | ||||
|       .then((res) => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records; | ||||
|           this.total = res.data.total; | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|  | ||||
|     timeChange() { | ||||
|       if (this.searchDotime) { | ||||
|         this.search.doTimeStart = this.searchDotime[0] | ||||
|         this.search.doTimeEnd = this.searchDotime[1] | ||||
|       } else { | ||||
|         this.search.doTimeStart = null | ||||
|         this.search.doTimeEnd = null | ||||
|       } | ||||
|       this.search.current = 1 | ||||
|       this.getList() | ||||
|     }, | ||||
|  | ||||
|     viewItem(row) { | ||||
|       this.dialog = true | ||||
|       this.instance.post(`/app/apppartyintegralinfo/queryDetailById?id=${row.id}`).then((res) => { | ||||
|         if (res?.data) { | ||||
|           this.dialogInfo = res.data | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|  | ||||
|     onReset() { | ||||
|       this.search.current = 1 | ||||
|       this.search.doTimeStart = null | ||||
|       this.search.doTimeEnd = null | ||||
|       this.search.familyName = '' | ||||
|       this.searchDotime = [] | ||||
|       this.getList(); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .pointsDetails { | ||||
|   height: 100%; | ||||
|   background: #f3f6f9; | ||||
|   overflow: auto; | ||||
|  | ||||
|   .form_content { | ||||
|     .form_flex { | ||||
|       display: flex; | ||||
|  | ||||
|       div { | ||||
|         flex: 1; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .form_info { | ||||
|       margin-bottom: 8px; | ||||
|     } | ||||
|  | ||||
|     .form_label { | ||||
|       display: inline-block; | ||||
|       color: #999; | ||||
|       vertical-align: top; | ||||
|       width: 70px; | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .form_value { | ||||
|       display: inline-block; | ||||
|       color: #333; | ||||
|       width: calc(100% - 70px); | ||||
|       // img { | ||||
|       //   width: 100px; | ||||
|       //   height: 100px; | ||||
|       //   margin: 0 8px 8px 0; | ||||
|       // } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .form_div { | ||||
|     padding-top: 24px; | ||||
|     border-top: 1px solid #eee; | ||||
|   } | ||||
|  | ||||
|   .status-0 { | ||||
|     color: #FF4466; | ||||
|   } | ||||
|  | ||||
|   .status-1 { | ||||
|     color: #2EA222; | ||||
|   } | ||||
|  | ||||
|   .status-2 { | ||||
|     color: #999999; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										147
									
								
								project/sanjianxi/apps/AppScoreManage/scoreChange.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								project/sanjianxi/apps/AppScoreManage/scoreChange.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| <template> | ||||
|   <div class="scoreChange"> | ||||
|     <ai-list isTabs> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true" | ||||
|                        :disabled="!permissions('app_appvillagerintegraldetail_change')">添加 | ||||
|             </el-button> | ||||
|             <ai-import :instance="instance" :dict="dict" name="积分调整" type="appvillagerintegraldetail" | ||||
|                        v-if="permissions('app_appvillagerintegraldetail_change')" @success="getList"/> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" :dict="dict" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             @getList="getList"> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog | ||||
|         title="添加积分调整" | ||||
|         :visible.sync="dialog" | ||||
|         :destroyOnClose="true" | ||||
|         width="720px" | ||||
|         @onConfirm="onConfirm" | ||||
|         @closed="form={}"> | ||||
|       <el-form ref="form" :model="form" :rules="rules" label-width="80px"> | ||||
|         <el-form-item label="选择人员" prop="residentId"> | ||||
|           <ai-person-select :instance="instance" :customClicker="true" | ||||
|                             :url="'/app/appresident/list?areaId=' + user.info.areaId" | ||||
|                             :isMultiple="false" dialogTitle="选择" @selectPerson="selectPerson"> | ||||
|             <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> | ||||
|         </el-form-item> | ||||
|         <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="类型" prop="integralCalcType"> | ||||
|           <ai-select v-model="form.integralCalcType" :selectList="dict.getDict('integralCalcType')"/> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="积分" prop="changeIntegral"> | ||||
|           <el-input v-model.trim.num="form.changeIntegral" placeholder="请输入正数" size="small"></el-input> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|     </ai-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from "vuex" | ||||
|  | ||||
| export default { | ||||
|   name: "scoreChange", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function, | ||||
|     areaId: String | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       tableData: [], | ||||
|       page: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         total: 10 | ||||
|       }, | ||||
|       form: {}, | ||||
|       dialog: false, | ||||
|       personList: [], | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(["user"]), | ||||
|     rules() { | ||||
|       return { | ||||
|         residentId: [{required: true, message: '请选择人员', trigger: 'blur'},], | ||||
|         eventDesc: [{required: true, message: '请输入调整说明', trigger: 'blur'},], | ||||
|         integralCalcType: [{required: true, message: '请选择类型', trigger: 'change'},], | ||||
|         changeIntegral: [{required: true, validator: (r, v, cb) => v > 0 ? cb() : cb("请输入正数")}], | ||||
|       } | ||||
|     }, | ||||
|     colConfigs() { | ||||
|       return [ | ||||
|         {prop: "residentName", label: "姓名"}, | ||||
|         {prop: "eventDesc", label: "调整说明"}, | ||||
|         {prop: "integralCalcType", label: "类型", dict: "integralCalcType", align: 'center'}, | ||||
|         {prop: "changeIntegral", label: "积分", align: "center", render: (h, {row}) => h('p',{textAlign:'center'}, `${row.integralCalcType > 0 ? '+' : '-'}${row.changeIntegral}`)}, | ||||
|         {prop: "doTime", label: "操作时间"}, | ||||
|         {prop: "createUserName", label: "操作人", align: "center"}, | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     selectPerson(val) { | ||||
|       if (val) { | ||||
|         this.form.residentId = val.id | ||||
|         this.personList = [{...val}] | ||||
|       } else { | ||||
|         this.form.residentId = "" | ||||
|         this.personList = [] | ||||
|       } | ||||
|     }, | ||||
|     onConfirm() { | ||||
|       this.$refs['form'].validate(valid => { | ||||
|         if (valid) { | ||||
|           this.instance.post(`/app/appvillagerintegraldetail/changeIntegral`, this.form).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success("添加成功") | ||||
|               this.dialog = false | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegraldetail/list`, null, { | ||||
|         params: {...this.page, areaId: this.areaId, type: 0} | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records | ||||
|           this.page.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.getList() | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .scoreChange { | ||||
|   height: 100%; | ||||
|   overflow: auto; | ||||
| } | ||||
| </style> | ||||
| @@ -1,350 +1,74 @@ | ||||
| <template> | ||||
|   <section class="AppScoreRules"> | ||||
|     <ai-list v-if="permissions('app_appvillagerintegralrule_detail')"> | ||||
|   <ai-list> | ||||
|     <template slot="title"> | ||||
|         <ai-title title="积分规则" isShowBottomBorder></ai-title> | ||||
|       <ai-title title="积分维护" :isShowBottomBorder="false" :instance="instance" :isShowArea="false" v-model="areaId" | ||||
|                 @change="changeArea"></ai-title> | ||||
|     </template> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <ai-select | ||||
|                 v-model="search.status" | ||||
|                 @change="page.current = 1, getList()" | ||||
|                 placeholder="请选择状态" | ||||
|                 :selectList="dict.getDict('integralRuleStatus')"> | ||||
|             </ai-select> | ||||
|           </template> | ||||
|           <template slot="right"> | ||||
|             <el-input size="small" placeholder="事件名称" v-model="search.partyName" clearable | ||||
|                       @change="page.current=1,getTableData()" suffix-icon="iconfont iconSearch"/> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|  | ||||
|         <ai-search-bar style="margin-top: 16px;"> | ||||
|           <template #left> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|  | ||||
|         <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" :dict="dict" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             @getList="getList"> | ||||
|           <el-table-column slot="integral" label="分值" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|             <span | ||||
|                 v-if="row.integralValueType == 1"> | ||||
|               {{ row.integralStart > 0 ? '+' + row.integralStart : row.integralStart }} ~ {{ row.integralEnd > 0 ? '+' + row.integralEnd : row.integralEnd }} | ||||
|             </span> | ||||
|               <span v-else>{{ row.integral > 0 ? '+' : '' }}{{ row.integral }}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center" fixed="right" width="200"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <div class="table-options"> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 0)" v-if="row.status == 1"> | ||||
|                   停用 | ||||
|                 </el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 1)" v-else>启用</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="toEdit(row)">编辑</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_del')" @click="remove(row.id)">删除</el-button> | ||||
|               </div> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|  | ||||
|     <template slot="tabs"> | ||||
|       <el-tabs v-model="currIndex"> | ||||
|         <el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label"> | ||||
|           <component :is="tab.comp" v-if="currIndex === String(i)" :ref="tab.name" | ||||
|                      :areaId="areaId" :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
|  | ||||
|     <ai-empty v-else>暂无应用权限</ai-empty> | ||||
|  | ||||
|     <ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @closed="form={ladderRule: [],pass: 0}" width="800px"> | ||||
|       <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-input v-model="form.name" clearable placeholder="请输入事件名称" type="text" maxlength="30" show-word-limit/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="简介说明" prop="eventType"> | ||||
|             <el-input v-model="form.name" clearable placeholder="请输入简介说明" type="text" maxlength="100" show-word-limit/> | ||||
|           </el-form-item> | ||||
|  | ||||
|           <el-form-item label="规则" prop="ruleType" required> | ||||
|             <el-radio-group v-model="form.pass" @change="typeChange"> | ||||
|               <el-radio :label="0">常规</el-radio> | ||||
|               <el-radio :label="1">区间</el-radio> | ||||
|               <el-radio :label="2">阶梯</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="周期范围" prop="scoringCycle"> | ||||
|             <ai-select v-model="form.scoringCycle" :selectList="dict.getDict('integralRuleScoringCycle')"/> | ||||
|           </el-form-item> | ||||
|  | ||||
|           <el-form-item label="奖励次数"> | ||||
|             <el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/> | ||||
|           </el-form-item> | ||||
|           <!-- 常规 --> | ||||
|           <el-form-item label="积分分值" prop="integral" v-if="form.pass == 0"> | ||||
|             <el-input placeholder="请输入" v-model="form.integral" clearable/> | ||||
|           </el-form-item> | ||||
|           <!-- 区间 --> | ||||
|           <el-form-item label="积分分值" prop="integral" v-if="form.pass == 1"> | ||||
|             <ai-range v-model="form.num" ref="resetagefoo" /> | ||||
|           </el-form-item> | ||||
|           <!-- 阶梯 --> | ||||
|           <el-form-item label="积分分值" prop="integral" v-if="form.pass == 2"> | ||||
|             <el-button type="text" @click="innerVisible  = true" style="float: right;">添加</el-button> | ||||
|             <ai-table :tableData="integralData" :isShowPagination="false" :col-configs="integralConfigs" :dict="dict"> | ||||
|               <el-table-column slot="options" align="center" label="操作" fixed="right" width="160px"> | ||||
|                 <el-row type="flex" justify="center" align="middle" slot-scope="{row}"> | ||||
|                   <el-button v-if="$permissions('admin_sysuser_distribute')&&!!row.sysUserId" | ||||
|                             type="text" @click="appAllot(row)">删除 | ||||
|                   </el-button> | ||||
|                 </el-row> | ||||
|               </el-table-column> | ||||
|             </ai-table> | ||||
|           </el-form-item> | ||||
|  | ||||
|           <el-dialog width="30%" title="添加积分分值" :visible.sync="innerVisible" append-to-body> | ||||
|             <el-form ref="innerForm" :model="table" :rules="formRules" size="small" label-suffix=":" label-width="100px"> | ||||
|               <el-form-item label="加分项" prop="integral"> | ||||
|                 <ai-select v-model="form.scoringCycle" :selectList="dict.getDict('integralRuleScoringCycle')"/> | ||||
|               </el-form-item> | ||||
|               <el-form-item label="获得积分"> | ||||
|                 <el-input placeholder="请输入" v-model="form.integral" disabled/> | ||||
|               </el-form-item> | ||||
|             </el-form> | ||||
|  | ||||
|             <div slot="footer" class="dialog-footer"> | ||||
|               <el-button @click="innerVisible = false">取 消</el-button> | ||||
|               <el-button type="primary" @click="save">保存</el-button> | ||||
|             </div> | ||||
|           </el-dialog> | ||||
|         </el-form> | ||||
|       </div> | ||||
|  | ||||
|        | ||||
|  | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import applyForIntegral from "./components/applyForIntegral.vue" | ||||
| import automaticallyAddCent from "./components/automaticallyAddCent.vue"; | ||||
| import { mapState } from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: "AppScoreRules", | ||||
|   label: "积分规则(三涧溪)", | ||||
|   name: 'AppScoreManage', | ||||
|   label: "积分维护(三涧溪)", | ||||
|   components: { applyForIntegral, automaticallyAddCent}, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     isEdit() { | ||||
|       return !!this.form.id | ||||
|     ...mapState(['user']), | ||||
|     tabs() { | ||||
|       return [ | ||||
|         { | ||||
|           label: "积分申请", | ||||
|           name: "applyForIntegral", | ||||
|           comp: applyForIntegral, | ||||
|           permission: "app_apppartyfee_statistics", | ||||
|         }, | ||||
|     dialogTitle() { | ||||
|       return this.isEdit ? "编辑积分规则" : "添加积分规则" | ||||
|         { | ||||
|           label: "自动加分", | ||||
|           name: "automaticallyAddCent", | ||||
|           comp: automaticallyAddCent, | ||||
|           permission: "", | ||||
|         }, | ||||
|     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) | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.areaId = this.user.info.areaId | ||||
|     this.dict.load("integralCalcType") | ||||
|   }, | ||||
|   methods: { | ||||
|     changeArea() { | ||||
|       this.$nextTick(() => { | ||||
|         this.$refs[this.tabs[Number(this.currIndex)].name][0].getList() | ||||
|       }) | ||||
|     } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       search: {status: "", eventType: null}, | ||||
|       page: {current: 1, size: 10, total: 0}, | ||||
|       colConfigs: [ | ||||
|         {prop: "event", label: "事件名称", dict: "integralRuleEvent"}, | ||||
|         {prop: "type", label: "简介", dict: "integralRuleEventType"}, | ||||
|         {prop: "ruleType", label: "规则", dict: "integralRuleRuleType"}, | ||||
|         {prop: "scoringCycle", label: "周期范围", dict: "integralRuleScoringCycle"}, | ||||
|         {prop: "status", label: "状态", align: "center", width: 96, dict: "integralRuleStatus"}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       integralConfigs: [ | ||||
|         {prop: "event", label: "加分项", dict: "integralRuleEvent"}, | ||||
|         {prop: "event", label: "获得积分", dict: "integralRuleEvent"}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: false, | ||||
|       form: { | ||||
|         ladderRule: [], | ||||
|         pass: 0, | ||||
|       }, | ||||
|       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: "请输入正整数"}] | ||||
|       }, | ||||
|       cacheOps: [], | ||||
|       integralFrom: '', | ||||
|       integralTo: '', | ||||
|       integralData: [], | ||||
|       innerVisible: false, | ||||
|       table: {}, | ||||
|        | ||||
|     }; | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict.load("integralRuleStatus", "integralRuleRuleType", 'integralRuleScoringCycle', 'integralRuleEvent', 'integralRuleEventType').then(() => { | ||||
|       this.getList(); | ||||
|     }); | ||||
|   }, | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegralrule/list`, null, { | ||||
|         params: {...this.search, ...this.page}, | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records; | ||||
|           this.page.total = res.data.total; | ||||
|       activeName: "pointsDetails", | ||||
|       currIndex: '0', | ||||
|       areaId: '' | ||||
|     } | ||||
|       }); | ||||
|     }, | ||||
|     toEdit(row) { | ||||
|       this.form = this.$copy(row) | ||||
|       let {ladderRule, event, type} = this.form, | ||||
|           dict = 'integralRuleEvent' + event | ||||
|       this.dict.load(dict).then(() => { | ||||
|         this.form.eventType = [event, type] | ||||
|         this.form.ladderRule = JSON.parse(ladderRule || "[]") | ||||
|         this.cacheOps = this.dict.getDict('integralRuleEvent').map(e => { | ||||
|           if (e.dictValue == event) { | ||||
|             e.children = this.dict.getDict(dict).map(d => ({...d, leaf: true})) | ||||
|   } | ||||
|           return e | ||||
|         }) | ||||
|         this.$nextTick(() => { | ||||
|           this.dialog = true | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|     // 保存 | ||||
|     save() { | ||||
|       this.$refs.innerForm.validate((valid)=>{ | ||||
|         if (valid) { | ||||
|           this.innerData.push(this.table) | ||||
| } | ||||
|         this.innerVisible = false | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     typeChange(val) { | ||||
|       this.form.pass = val | ||||
|     }, | ||||
|  | ||||
|     handleInputFrom(event) { | ||||
|       this.$emit('focusfrom', event) | ||||
|     }, | ||||
|  | ||||
|     handleInputTo(event) { | ||||
|       this.$emit('blurto', event) | ||||
|     }, | ||||
|  | ||||
|     remove(id) { | ||||
|       this.$confirm("删除后不可恢复,是否要删除该事项?", { | ||||
|         type: 'error' | ||||
|       }).then(() => { | ||||
|         this.instance | ||||
|         .post(`/app/appvillagerintegralrule/delete?ids=${id}`) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success("删除成功!"); | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     changeStatus(id, status) { | ||||
|       let text = status == 1 ? '启用' : '停用' | ||||
|       this.$confirm(`确定${text}该条规则?`).then(() => { | ||||
|         this.instance.post(`/app/appvillagerintegralrule/enableOrDisable?id=${id}`).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success(`${text}成功!`) | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     onReset() { | ||||
|       this.page.current = 1 | ||||
|       this.search.classification = "" | ||||
|       this.search.integralType = "" | ||||
|       this.search.ruleStatus = "" | ||||
|       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) | ||||
|           formData.ladderRule = JSON.stringify(formData.ladderRule) | ||||
|           formData.integral = formData.integral || 0 | ||||
|           this.instance.post(`/app/appvillagerintegralrule/addOrUpdate`, formData).then((res) => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success(`${this.isEdit ? '编辑成功' : '添加成功'}`) | ||||
|               this.onReset() | ||||
|               this.dialog = false; | ||||
|             } | ||||
|           }); | ||||
|         } else { | ||||
|           return false; | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|     handleTypeSearch(v) { | ||||
|       this.search.event = v?.[0] | ||||
|       this.search.type = v?.[1] | ||||
|       this.page.current = 1 | ||||
|       this.$refs.eventTypeSearch.dropDownVisible = false | ||||
|       this.getList() | ||||
|     }, | ||||
|     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 | ||||
|       } | ||||
|     }, | ||||
|     handleDelete(i) { | ||||
|       this.$confirm("是否要删除该规则?").then(() => { | ||||
|         this.form.ladderRule.splice(i, 1) | ||||
|       }).catch(() => 0) | ||||
|     }, | ||||
|     checkIntegral(v) { | ||||
|       return /\.\d{2,}$/.test(v) ? Math.abs(v).toFixed(1) : Math.abs(v) | ||||
|     } | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppScoreRules { | ||||
|   height: 100%; | ||||
|   background: #f3f6f9; | ||||
|  | ||||
|    | ||||
|  | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -0,0 +1,377 @@ | ||||
| <template> | ||||
|   <section class="applyForIntegral"> | ||||
|     <ai-list v-if="permissions('app_appvillagerintegralrule_detail')"> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <ai-select | ||||
|                 v-model="search.status" | ||||
|                 @change="page.current = 1, getList()" | ||||
|                 placeholder="请选择状态" | ||||
|                 :selectList="dict.getDict('integralRuleStatus')"> | ||||
|             </ai-select> | ||||
|           </template> | ||||
|           <template slot="right"> | ||||
|             <el-input size="small" placeholder="事件名称" v-model="search.partyName" clearable | ||||
|                       @change="page.current=1,getTableData()" suffix-icon="iconfont iconSearch"/> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|  | ||||
|         <ai-search-bar style="margin-top: 16px;"> | ||||
|           <template #left> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|  | ||||
|         <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" :dict="dict" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             @getList="getList"> | ||||
|           <el-table-column slot="integral" label="分值" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|             <span | ||||
|                 v-if="row.integralValueType == 1"> | ||||
|               {{ row.integralStart > 0 ? '+' + row.integralStart : row.integralStart }} ~ {{ row.integralEnd > 0 ? '+' + row.integralEnd : row.integralEnd }} | ||||
|             </span> | ||||
|               <span v-else>{{ row.integral > 0 ? '+' : '' }}{{ row.integral }}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center" fixed="right" width="200"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <div class="table-options"> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 0)" v-if="row.status == 1"> | ||||
|                   停用 | ||||
|                 </el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 1)" v-else>启用</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="toEdit(row)">编辑</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_del')" @click="remove(row.id)">删除</el-button> | ||||
|               </div> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|  | ||||
|       </template> | ||||
|     </ai-list> | ||||
|  | ||||
|     <ai-empty v-else>暂无应用权限</ai-empty> | ||||
|  | ||||
|     <ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @closed="close" width="800px"> | ||||
|       <div class="form_div"> | ||||
|         <el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix=":" label-width="100px"> | ||||
|  | ||||
|           <el-form-item label="事件名称" prop="eventName"> | ||||
|             <el-input v-model="form.eventName" clearable placeholder="请输入事件名称" type="text" maxlength="30" show-word-limit/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="简介说明" prop="eventDesc"> | ||||
|             <el-input v-model="form.eventDesc" clearable placeholder="请输入简介说明" type="text" maxlength="100" show-word-limit/> | ||||
|           </el-form-item> | ||||
|  | ||||
|           <el-form-item label="规则" prop="ruleType" required> | ||||
|             <el-radio-group v-model="form.ruleType" @change="typeChange"> | ||||
|               <el-radio :label="0">常规</el-radio> | ||||
|               <el-radio :label="2">区间</el-radio> | ||||
|               <el-radio :label="1">阶梯</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="周期范围" prop="scoringCycle"> | ||||
|             <ai-select v-model="form.scoringCycle" :selectList="dict.getDict('integralRuleScoringCycle')"/> | ||||
|           </el-form-item> | ||||
|  | ||||
|           <el-form-item label="奖励次数"> | ||||
|             <el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable/> | ||||
|           </el-form-item> | ||||
|           <!-- 常规 --> | ||||
|           <el-form-item label="积分分值" prop="integral" v-if="form.ruleType == 0"> | ||||
|             <el-input placeholder="请输入" v-model="form.integral" clearable/> | ||||
|           </el-form-item> | ||||
|           <!-- 区间 --> | ||||
|           <el-form-item label="积分分值" prop="integralArr" v-if="form.ruleType == 2"> | ||||
|             <ai-range v-model="form.integralArr" clearable/> | ||||
|           </el-form-item> | ||||
|           <!-- 阶梯 --> | ||||
|           <el-form-item label="积分分值" prop="ladderIntegral" v-if="form.ruleType == 1"> | ||||
|             <el-row type="flex" justify="space-between"> | ||||
|               <div></div> | ||||
|               <el-button v-if="form.ruleType==1" type="text" icon="iconfont iconAdd" | ||||
|                          @click="form.ladderIntegral.push({ viewCount: null, integral: null })">添加 | ||||
|               </el-button> | ||||
|             </el-row> | ||||
|             <el-table v-if="form.ruleType==1" :data="form.ladderIntegral" size="mini" border stripe> | ||||
|               <el-table-column label="加分项" align="center"> | ||||
|                 <template slot-scope="{row}"> | ||||
|                   <el-input class="tableInput" v-model.number="row.viewCount" clearable placeholder="请输入"/> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|               <el-table-column label="获得积分" align="center"> | ||||
|                 <template slot-scope="{row}"> | ||||
|                   <el-input class="tableInput" v-model="row.integral" clearable placeholder="请输入" type="number" | ||||
|                             @keyup.native="row.integral=checkIntegral(row.integral)"/> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|               <el-table-column label="操作" align="center"> | ||||
|                 <template slot-scope="{ $index }"> | ||||
|                   <el-button type="text" @click="handleDelete($index)">删除</el-button> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|             </el-table> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </div> | ||||
|  | ||||
|        | ||||
|  | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: "applyForIntegral", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function | ||||
|   }, | ||||
|   computed: { | ||||
|     isEdit() { | ||||
|       return !!this.form.id | ||||
|     }, | ||||
|     dialogTitle() { | ||||
|       return this.isEdit ? "编辑积分规则" : "添加积分规则" | ||||
|     }, | ||||
|     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) | ||||
|             }) | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       search: {status: "", eventType: null}, | ||||
|       page: {current: 1, size: 10, total: 0}, | ||||
|       colConfigs: [ | ||||
|         {prop: "event", label: "事件名称", dict: "integralRuleEvent"}, | ||||
|         {prop: "type", label: "简介", dict: "integralRuleEventType"}, | ||||
|         {prop: "ruleType", label: "规则", dict: "integralRuleRuleType"}, | ||||
|         {prop: "scoringCycle", label: "周期范围", dict: "integralRuleScoringCycle"}, | ||||
|         {prop: "status", label: "状态", align: "center", width: 96, dict: "integralRuleStatus"}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       integralConfigs: [ | ||||
|         {prop: "event", label: "加分项", dict: "integralRuleEvent"}, | ||||
|         {prop: "event", label: "获得积分", dict: "integralRuleEvent"}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: false, | ||||
|       form: { | ||||
|         eventName: '', | ||||
|         eventDesc: '', | ||||
|         ruleType: 0, | ||||
|         scoringCycle: '', | ||||
|         numberLimit: '', //奖励次数 | ||||
|         integral: '',  // 常规 | ||||
|         integralMin: '', // 区间 | ||||
|         integralMax: '', | ||||
|         integralArr: [], | ||||
|         ladderRule: '', // 阶梯 | ||||
|         ladderIntegral: [], | ||||
|       }, | ||||
|       formRules: { | ||||
|         eventName: [{required: true, message: "请输入事件名称" }], | ||||
|         eventDesc: [{required: true, message: "请输入简介说明" }], | ||||
|         ruleType: [{required: true, message: "请选择规则" }], | ||||
|         scoringCycle: [{required: true, message: "请选择周期范围" }], | ||||
|         integral: [{required: true, pattern: /^\d*[.\d]\d?$/, message: "请输入积分分值,最多保留一位小数"}], | ||||
|         numberLimit: [{pattern: /^\d*$/, message: "请输入正整数"}], | ||||
|         integralArr: [{required: true, message: "请输入积分分值"}], | ||||
|         ladderIntegral: [{required: true, message: "请输入积分分值"}] | ||||
|       }, | ||||
|       cacheOps: [], | ||||
|       integralFrom: '', | ||||
|       integralTo: '', | ||||
|       integralData: [], | ||||
|       innerVisible: false, | ||||
|       table: {}, | ||||
|        | ||||
|     }; | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict.load("integralRuleStatus", "integralRuleRuleType", 'integralRuleScoringCycle', 'integralRuleEvent', 'integralRuleEventType').then(() => { | ||||
|       this.getList(); | ||||
|     }); | ||||
|   }, | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegralrule/list`, null, { | ||||
|         params: {...this.search, ...this.page}, | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records; | ||||
|           this.page.total = res.data.total; | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|     toEdit(row) { | ||||
|       this.form = this.$copy(row) | ||||
|       let {ladderRule, event, type} = this.form, | ||||
|           dict = 'integralRuleEvent' + event | ||||
|       this.dict.load(dict).then(() => { | ||||
|         this.form.eventType = [event, type] | ||||
|         this.form.ladderRule = JSON.parse(ladderRule || "[]") | ||||
|         this.cacheOps = this.dict.getDict('integralRuleEvent').map(e => { | ||||
|           if (e.dictValue == event) { | ||||
|             e.children = this.dict.getDict(dict).map(d => ({...d, leaf: true})) | ||||
|           } | ||||
|           return e | ||||
|         }) | ||||
|         this.$nextTick(() => { | ||||
|           this.dialog = true | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|     // 保存 | ||||
|     save() { | ||||
|       this.$refs.innerForm.validate((valid)=>{ | ||||
|         if (valid) { | ||||
|           this.innerData.push(this.table) | ||||
|         } | ||||
|         this.innerVisible = false | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     close() { | ||||
|       this.form = { | ||||
|         eventName: '', | ||||
|         eventDesc: '', | ||||
|         ruleType: 0, | ||||
|         scoringCycle: '', | ||||
|         numberLimit: '', | ||||
|         integral: '', | ||||
|         integralMin: '', | ||||
|         integralMax: '', | ||||
|         ladderRule: [], | ||||
|         integralArr: [], | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     typeChange(val) { | ||||
|       this.form.ruleType = val | ||||
|       this.form.scoringCycle = '' | ||||
|       this.form.numberLimit = '' | ||||
|       this.form.integral = '' | ||||
|       this.form.integralArr = [] | ||||
|       this.form.ladderRule = [] | ||||
|     }, | ||||
|  | ||||
|     handleInputFrom(event) { | ||||
|       this.$emit('focusfrom', event) | ||||
|     }, | ||||
|  | ||||
|     handleInputTo(event) { | ||||
|       this.$emit('blurto', event) | ||||
|     }, | ||||
|  | ||||
|     remove(id) { | ||||
|       this.$confirm("删除后不可恢复,是否要删除该事项?", { | ||||
|         type: 'error' | ||||
|       }).then(() => { | ||||
|         this.instance | ||||
|         .post(`/app/appvillagerintegralrule/delete?ids=${id}`) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success("删除成功!"); | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     changeStatus(id, status) { | ||||
|       let text = status == 1 ? '启用' : '停用' | ||||
|       this.$confirm(`确定${text}该条规则?`).then(() => { | ||||
|         this.instance.post(`/app/appvillagerintegralrule/enableOrDisable?id=${id}`).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success(`${text}成功!`) | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     onReset() { | ||||
|       this.page.current = 1 | ||||
|       this.search.classification = "" | ||||
|       this.search.integralType = "" | ||||
|       this.search.ruleStatus = "" | ||||
|       this.getList(); | ||||
|     }, | ||||
|     onConfirm() { | ||||
|       this.$refs.DialogForm.validate((valid) => { | ||||
|         if (valid) { | ||||
|           this.form.integralMin = this.form.integralArr[0] | ||||
|           this.form.integralMax = this.form.integralArr[1] | ||||
|           this.form.ladderRule = JSON.stringify(this.form.ladderIntegral) | ||||
|            | ||||
|           this.instance.post(`/app/apppartyintegralrule/addOrUpdate`, { | ||||
|             ...this.form, | ||||
|           }).then((res) => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success(`${this.isEdit ? '编辑成功' : '添加成功'}`) | ||||
|               this.onReset() | ||||
|               this.dialog = false; | ||||
|             } | ||||
|           }); | ||||
|         } else { | ||||
|           return false; | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|     handleTypeSearch(v) { | ||||
|       this.search.event = v?.[0] | ||||
|       this.search.type = v?.[1] | ||||
|       this.page.current = 1 | ||||
|       this.$refs.eventTypeSearch.dropDownVisible = false | ||||
|       this.getList() | ||||
|     }, | ||||
|     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 | ||||
|       } | ||||
|     }, | ||||
|     handleDelete(i) { | ||||
|       this.$confirm("是否要删除该规则?").then(() => { | ||||
|         this.form.ladderRule.splice(i, 1) | ||||
|       }).catch(() => 0) | ||||
|     }, | ||||
|     checkIntegral(v) { | ||||
|       return /\.\d{2,}$/.test(v) ? Math.abs(v).toFixed(1) : Math.abs(v) | ||||
|     } | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .applyForIntegral { | ||||
|   height: 100%; | ||||
|   background: #f3f6f9; | ||||
|  | ||||
|    | ||||
|  | ||||
| } | ||||
| </style> | ||||
| @@ -0,0 +1,122 @@ | ||||
| <template> | ||||
|   <div class=""> | ||||
|     <template> | ||||
|       <ai-search-bar style="margin-top: 16px;"> | ||||
|         <template #left> | ||||
|           <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">添加</el-button> | ||||
|         </template> | ||||
|         <template #content> | ||||
|           <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" :dict="dict" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             @getList="getList"> | ||||
|           <el-table-column slot="integral" label="分值" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|             <span | ||||
|                 v-if="row.integralValueType == 1"> | ||||
|               {{ row.integralStart > 0 ? '+' + row.integralStart : row.integralStart }} ~ {{ row.integralEnd > 0 ? '+' + row.integralEnd : row.integralEnd }} | ||||
|             </span> | ||||
|               <span v-else>{{ row.integral > 0 ? '+' : '' }}{{ row.integral }}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center" fixed="right" width="200"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <div class="table-options"> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 0)" v-if="row.status == 1"> | ||||
|                   停用 | ||||
|                 </el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="changeStatus(row.id, 1)" v-else>启用</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_edit')" @click="toEdit(row)">编辑</el-button> | ||||
|                 <el-button type="text" :disabled="!permissions('app_appvillagerintegralrule_del')" @click="remove(row.id)">删除</el-button> | ||||
|               </div> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|     </template> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: "applyForIntegral", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       tableData: [], | ||||
|       page: {current: 1, size: 10, total: 0}, | ||||
|       colConfigs: [ | ||||
|         {prop: "event", label: "事件名称", dict: "integralRuleEvent"}, | ||||
|         {prop: "type", label: "简介", dict: "integralRuleEventType"}, | ||||
|         {prop: "ruleType", label: "规则", dict: "integralRuleRuleType"}, | ||||
|         {prop: "scoringCycle", label: "周期范围", dict: "integralRuleScoringCycle"}, | ||||
|         {prop: "status", label: "状态", align: "center", width: 96, dict: "integralRuleStatus"}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|     } | ||||
|   },  | ||||
|   create() { | ||||
|  | ||||
|   }, | ||||
|   methods: { | ||||
|     getList() { | ||||
|  | ||||
|     }, | ||||
|     toEdit(row) { | ||||
|       this.form = this.$copy(row) | ||||
|       let {ladderRule, event, type} = this.form, | ||||
|           dict = 'integralRuleEvent' + event | ||||
|       this.dict.load(dict).then(() => { | ||||
|         this.form.eventType = [event, type] | ||||
|         this.form.ladderRule = JSON.parse(ladderRule || "[]") | ||||
|         this.cacheOps = this.dict.getDict('integralRuleEvent').map(e => { | ||||
|           if (e.dictValue == event) { | ||||
|             e.children = this.dict.getDict(dict).map(d => ({...d, leaf: true})) | ||||
|           } | ||||
|           return e | ||||
|         }) | ||||
|         this.$nextTick(() => { | ||||
|           this.dialog = true | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|     remove(id) { | ||||
|       this.$confirm("删除后不可恢复,是否要删除该事项?", { | ||||
|         type: 'error' | ||||
|       }).then(() => { | ||||
|         this.instance | ||||
|         .post(`/app/appvillagerintegralrule/delete?ids=${id}`) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success("删除成功!"); | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     changeStatus(id, status) { | ||||
|       let text = status == 1 ? '启用' : '停用' | ||||
|       this.$confirm(`确定${text}该条规则?`).then(() => { | ||||
|         this.instance.post(`/app/appvillagerintegralrule/enableOrDisable?id=${id}`).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success(`${text}成功!`) | ||||
|             this.getList(); | ||||
|           } | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										57
									
								
								project/xiushan/apps/AppCreditInquiry/AppCreditInquiry.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								project/xiushan/apps/AppCreditInquiry/AppCreditInquiry.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <template> | ||||
|   <section class="AppCreditInquiry"> | ||||
|     <!-- <keep-alive :include="['List']"> | ||||
|       <component ref="component" :is="component" :instance="instance" :params="params" :dict="dict" @change="onChange"/> | ||||
|     </keep-alive> --> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| // import List from "./components/List.vue"; | ||||
| // import Add from "./components/Add.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "AppCreditInquiry", | ||||
|   label: "信用查询", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|   }, | ||||
|   // components: {Add, List}, | ||||
|   data() { | ||||
|     return { | ||||
|       component: "List", | ||||
|       params: {}, | ||||
|       include: [], | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     onChange(data) { | ||||
|       if (data.type === "Add") { | ||||
|         this.component = "Add"; | ||||
|         this.params = data.params; | ||||
|       } | ||||
|  | ||||
|       if (data.type === "List") { | ||||
|         this.component = "List"; | ||||
|         this.params = data.params; | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           if (data.isRefresh) { | ||||
|             this.$refs.component.getTableData(); | ||||
|           } | ||||
|         }); | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict.load("portalUserStatus", "enterpriseStatus", "userEnterpriseStatus","enterpriseType") | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppCreditInquiry { | ||||
|   height: 100%; | ||||
| } | ||||
| </style> | ||||
		Reference in New Issue
	
	Block a user