Merge branch 'dev' of http://git.sinoecare.com/sinoecare/digital_village_v2/dvcp_v2_webapp into dev
This commit is contained in:
		
							
								
								
									
										76
									
								
								packages/conv/creditScore/AppScoreManage/AppScoreManage.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								packages/conv/creditScore/AppScoreManage/AppScoreManage.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="积分维护" :isShowBottomBorder="false" :instance="instance" :isShowArea="true" 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 pointsDeclaration from "./pointsDeclaration.vue" | ||||
| import pointsDetails from "./pointsDetails.vue" | ||||
| import pointsAppeal from './pointsAppeal' | ||||
| import {mapState} from 'vuex' | ||||
| import scoreChange from "./scoreChange"; | ||||
|  | ||||
| export default { | ||||
|   name: 'AppScoreManage', | ||||
|   label: "积分维护", | ||||
|   components: {pointsDeclaration, pointsDetails, pointsAppeal, 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: "pointsDeclaration", | ||||
|       currIndex: '0', | ||||
|       areaId: '' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										219
									
								
								packages/conv/creditScore/AppScoreManage/pointsDetails.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								packages/conv/creditScore/AppScoreManage/pointsDetails.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| <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.familyName" | ||||
|                 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="changeIntegral" label="积分" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{ row.changeIntegral > 0 ? '+' : '' }}{{ row.changeIntegral }}</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, | ||||
|         familyName: '', | ||||
|         doTimeStart: null, | ||||
|         doTimeEnd: null | ||||
|       }, | ||||
|       total: 10, | ||||
|       colConfigs: [ | ||||
|         {prop: "residentName", label: "对象", width: 160}, | ||||
|         {prop: "familyName", label: "户主", align: "center", width: 160}, | ||||
|         {prop: "eventDesc", label: "事件", "show-overflow-tooltip": true, width: 420}, | ||||
|         {prop: "doTime", label: "时间", width: 200}, | ||||
|         {prop: "type", label: "类型", width: 100, dict: "integralDetailType"}, | ||||
|         {slot: "changeIntegral", label: "积分", width: 100}, | ||||
|         {slot: "options", label: "操作", align: "center"}, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: false, | ||||
|       dialogInfo: {}, | ||||
|     }; | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.$dict | ||||
|     .load([ | ||||
|       "integralDeclareDoType", | ||||
|       "integralDetailType", | ||||
|     ]) | ||||
|     .then(() => { | ||||
|       this.getList(); | ||||
|     }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegraldetail/list`, null, { | ||||
|         params: { | ||||
|           ...this.search, | ||||
|           areaId: this.areaId, | ||||
|         }, | ||||
|       }) | ||||
|       .then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           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/appvillagerintegraldetail/queryDetailById?id=${row.id}`, null, {}).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> | ||||
| @@ -14,7 +14,7 @@ | ||||
|         <ai-table | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" | ||||
|             :total="page.total" :dict="dict" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             @getList="getList"> | ||||
| @@ -40,14 +40,11 @@ | ||||
|           </ai-person-select> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="调整说明" prop="description"> | ||||
|           <el-input v-model.trim="form.description" placeholder="请输入..." type="textarea" :rows="4" show-word-limit | ||||
|           <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="doType"> | ||||
|           <el-radio-group v-model="form.doType"> | ||||
|             <el-radio label="0">加分</el-radio> | ||||
|             <el-radio label="1">减分</el-radio> | ||||
|           </el-radio-group> | ||||
|         <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> | ||||
| @@ -86,38 +83,19 @@ export default { | ||||
|     rules() { | ||||
|       return { | ||||
|         residentId: [{required: true, message: '请选择人员', trigger: 'blur'},], | ||||
|         description: [{required: true, message: '请输入调整说明', trigger: 'blur'},], | ||||
|         doType: [{required: true, message: '请输入调整说明', trigger: 'change'},], | ||||
|         changeIntegral: [ | ||||
|           { | ||||
|             required: true, validator: (rule, value, callback) => { | ||||
|               if (!/^[1-9]\d*$/.test(value)) { | ||||
|                 callback(new Error('请输入正整数')) | ||||
|               } else { | ||||
|                 callback(); | ||||
|               } | ||||
|             }, 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: "description", label: "调整说明"}, | ||||
|         { | ||||
|           prop: "changeIntegral", label: "类型", align: "center", | ||||
|           render: (h, {row}) => [< span> {+row.changeIntegral > 0 ? "加分" : '减分' | ||||
|           } < /span>] | ||||
|         }, | ||||
|         { | ||||
|           prop: "changeIntegral", | ||||
|           label: "积分", | ||||
|           align: "center", | ||||
|           render: (h, {row}) => [ | ||||
|             <span>{row.changeIntegral > 0 ? `+${row.changeIntegral}` : `${row.changeIntegral}`}</span>] | ||||
|         }, | ||||
|         {prop: "eventDesc", label: "调整说明"}, | ||||
|         {prop: "integralCalcType", label: "类型", dict: "integralCalcType", align: 'center'}, | ||||
|         {prop: "changeIntegral", label: "积分", align: "center", render: (h, {row}) => h('p', `${row.integralCalcType > 0 ? '+' : '-'}${row.changeIntegral}`)}, | ||||
|         {prop: "doTime", label: "操作时间"}, | ||||
|         {prop: "declareObjName", label: "操作人", align: "center"}, | ||||
|         {prop: "createUserName", label: "操作人", align: "center"}, | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
| @@ -134,10 +112,7 @@ export default { | ||||
|     onConfirm() { | ||||
|       this.$refs['form'].validate(valid => { | ||||
|         if (valid) { | ||||
|           this.instance.post(`/app/appvillagerintegraldetail/changeIntegral`, { | ||||
|             ...this.form, | ||||
|             changeIntegral: this.form.doType == 0 ? `+${this.form.changeIntegral}` : `-${this.form.changeIntegral}` | ||||
|           }).then(res => { | ||||
|           this.instance.post(`/app/appvillagerintegraldetail/changeIntegral`, this.form).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success("添加成功") | ||||
|               this.dialog = false | ||||
| @@ -149,11 +124,7 @@ export default { | ||||
|     }, | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegraldetail/list`, null, { | ||||
|         params: { | ||||
|           ...this.page, | ||||
|           areaId: this.areaId, | ||||
|           doType: 2 | ||||
|         } | ||||
|         params: {...this.page, areaId: this.areaId, type: 0} | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records | ||||
| @@ -28,31 +28,20 @@ | ||||
|               :instance="instance" | ||||
|               url="/app/appvillagerintegraldetail/export" | ||||
|               :disabled="!Boolean(tableData.length)" | ||||
|               :params="{familyId:detailInfo.id,bizType:doType}" | ||||
|               :params="{familyId:detailInfo.id,type}" | ||||
|               fileName="余额变动明细"> | ||||
|             <span class="iconfont iconExported">导出</span> | ||||
|             <el-button type="text" icon="iconfont iconExported">导出</el-button> | ||||
|           </ai-download> | ||||
|         </template> | ||||
|         <template #content> | ||||
|           <el-select v-model="doType" placeholder="请选择类型" size='small' clearable @change="page.current=1,getList()"> | ||||
|             <el-option | ||||
|                 v-for="(item,i) in dict.getDict('integralDetailType')" | ||||
|                 :label="item.dictName" | ||||
|                 :key="i" | ||||
|                 :value="item.dictValue"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|           <ai-table | ||||
|               style="margin-top: 16px;" | ||||
|               :tableData="tableData" | ||||
|               :col-configs="colConfigs" | ||||
|               :total="page.total" | ||||
|               :border="true" | ||||
|               :stripe="false" | ||||
|               :current.sync="page.current" | ||||
|               :size.sync="page.size" | ||||
|               @getList="getList"> | ||||
|           </ai-table> | ||||
|           <ai-search-bar> | ||||
|             <template #left> | ||||
|               <ai-select v-model="type" placeholder="请选择类型" @change="page.current=1,getList()" | ||||
|                          :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" @getList="getList"/> | ||||
|         </template> | ||||
|       </ai-card> | ||||
|     </template> | ||||
| @@ -62,7 +51,6 @@ | ||||
| <script> | ||||
| export default { | ||||
|   name: 'balance', | ||||
|  | ||||
|   props: { | ||||
|     detailInfo: { | ||||
|       type: Object, | ||||
| @@ -79,61 +67,31 @@ export default { | ||||
|         size: 10, | ||||
|         total: 0 | ||||
|       }, | ||||
|       doType: '', | ||||
|       type: "", | ||||
|       tableData: [] | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load('integralDetailType') | ||||
|     this.getList() | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     colConfigs() { | ||||
|       const _this = this | ||||
|       return [ | ||||
|         { | ||||
|           prop: 'doTime', | ||||
|           label: '时间' | ||||
|         }, | ||||
|         { | ||||
|           prop: 'bizType', | ||||
|           align: 'center', | ||||
|           label: '类型', | ||||
|           render(h, {row}) { | ||||
|             return h('span', {}, _this.dict.getLabel('integralDetailType', row.bizType)) | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           prop: 'changeIntegral', | ||||
|           align: 'center', | ||||
|           label: '变动积分', | ||||
|           formart: v => v > 0 ? `+${v}` : v | ||||
|         }, | ||||
|         { | ||||
|           prop: 'nowIntegral', | ||||
|           align: 'center', | ||||
|           label: '剩余积分' | ||||
|         }, | ||||
|         { | ||||
|           prop: 'description', | ||||
|           label: '事件类型', | ||||
|         } | ||||
|         {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: { | ||||
|     getList() { | ||||
|       this.instance.post('/app/appvillagerintegraldetail/list', null, { | ||||
|         params: { | ||||
|           ...this.page, | ||||
|           familyId: this.detailInfo.id, | ||||
|           bizType: this.doType | ||||
|         } | ||||
|         params: {...this.page, familyId: this.detailInfo.id} | ||||
|       }).then(res => { | ||||
|         if (res.code === 0) { | ||||
|         if (res?.data) { | ||||
|           this.tableData = res.data.records | ||||
|           this.page.total = res.data.total | ||||
|         } | ||||
| @@ -148,11 +106,6 @@ export default { | ||||
|   height: 100%; | ||||
|   background-color: #fff; | ||||
|  | ||||
|   ::v-deep .ai-card__body { | ||||
|     padding: 12px 16px 20px !important; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   .detail-info { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
| @@ -187,25 +140,5 @@ export default { | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .iconExported { | ||||
|     color: #5088FF; | ||||
|     font-size: 12px; | ||||
|     cursor: pointer; | ||||
|   } | ||||
|  | ||||
|   .info { | ||||
|     padding: 16px 0 16px 0; | ||||
|   } | ||||
|  | ||||
|   .do_type { | ||||
|     height: 56px; | ||||
|   } | ||||
|  | ||||
|   .fs-14 { | ||||
|     ::v-deep .el-table--small { | ||||
|       font-size: 14px !important; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,84 +0,0 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="积分管理" :isShowBottomBorder="false" :instance="instance" :isShowArea="true" 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)" :bizType="tab.bizType" :ref="tab.name" | ||||
|                      :areaId="areaId" :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import pointsDeclaration from "./pointsDeclaration.vue" | ||||
| import pointsDetails from "./pointsDetails.vue" | ||||
| import pointsAppeal from './pointsAppeal' | ||||
| import {mapState} from 'vuex' | ||||
| import scoreChange from "./scoreChange"; | ||||
|  | ||||
| export default { | ||||
|     name: 'AppScoreManage', | ||||
|     label: "积分管理", | ||||
|     components: {pointsDeclaration, pointsDetails, pointsAppeal, scoreChange}, | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|       tabs() { | ||||
|         return [ | ||||
|           // { | ||||
|           //   label: "积分申报", | ||||
|           //   name: "pointsDeclaration", | ||||
|           //   comp: pointsDeclaration, | ||||
|           //   permission: "app_apppartyfee_record", | ||||
|           //   bizType: '0' | ||||
|           // }, | ||||
|           // { label: "积分申诉", name: "pointsAppeal", comp: pointsAppeal, permission: "app_apppartyfee_config", bizType: '1'}, | ||||
|           { | ||||
|             label: "积分明细", | ||||
|             name: "pointsDetails", | ||||
|             comp: pointsDetails, | ||||
|             permission: "app_apppartyfee_statistics", | ||||
|             bizType: '2' | ||||
|           }, | ||||
|           { | ||||
|             label: "积分调整", | ||||
|             name: "scoreChange", | ||||
|             comp: scoreChange, | ||||
|             permission: "", | ||||
|           }, | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     created() { | ||||
|       this.areaId = this.user.info.areaId | ||||
|     }, | ||||
|     methods: { | ||||
|       changeArea() { | ||||
|         this.$nextTick(() => { | ||||
|           this.$refs[this.tabs[Number(this.currIndex)].name][0].getList() | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     data() { | ||||
|       return { | ||||
|         activeName: "pointsDeclaration", | ||||
|         currIndex: '0', | ||||
|         areaId: '' | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
| @@ -1,265 +0,0 @@ | ||||
| <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.familyName" | ||||
|               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" | ||||
|           ref="aitableex" | ||||
|           :current.sync="search.current" | ||||
|           :size.sync="search.size" | ||||
|           @getList="getList"> | ||||
|           <el-table-column slot="changeIntegral" label="积分" align= "center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{row.changeIntegral > 0 ? '+' : ''}}{{row.changeIntegral}}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="doType" label="类型" align= "center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{ dict.getLabel('integralDetailType', row.bizType) }}</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.visible" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|     > | ||||
|       <div class="form_content"> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">户主:</span> | ||||
|           <span class="form_value">{{dialogInfo.familyName}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">事项:</span> | ||||
|           <span class="form_value">{{dialogInfo.ruleName}}</span> | ||||
|         </div> | ||||
|         <div class="form_flex form_info"> | ||||
|           <div> | ||||
|             <span class="form_label">积分:</span> | ||||
|             <span class="form_value">{{dialogInfo.changeIntegral >= 0 ? '增加' : '减少'}}<span style="color:#2266FF">{{Math.abs(dialogInfo.changeIntegral)}}</span>分</span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog.visible=false" size="medium">关闭</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, | ||||
|         familyName: '', | ||||
|         doTimeStart: null, | ||||
|         doTimeEnd: null | ||||
|       }, | ||||
|       total: 10, | ||||
|       colConfigs: [ | ||||
|         { prop: "residentName", label: "对象", width:160 }, | ||||
|         { prop: "familyName", label: "户主", align: "center", width:160 }, | ||||
|         { | ||||
|           prop: "ruleName", | ||||
|           label: "事件类型", | ||||
|           "show-overflow-tooltip": true, | ||||
|           width:420 | ||||
|         }, | ||||
|         { | ||||
|           prop: "doTime", | ||||
|           label: "时间", | ||||
|           width:200 | ||||
|         }, | ||||
|         // { | ||||
|         //   prop: "doType", | ||||
|         //   label: "类型", | ||||
|         //   align: "center", | ||||
|         //   width: 100, | ||||
|         //   render: (h, params) => { | ||||
|         //     return h( | ||||
|         //       "span", | ||||
|         //       { | ||||
|         //         class: "status-" + params.row.doType, | ||||
|         //       }, | ||||
|         //       this.$dict.getLabel("integralIntegralType", params.row.doType) | ||||
|         //     ); | ||||
|         //   }, | ||||
|         // }, | ||||
|         { slot: "doType", label: "类型", width: 100}, | ||||
|         { slot: "changeIntegral", label: "积分", width: 100}, | ||||
|         // { | ||||
|         //   prop: "bizType", | ||||
|         //   label: "途径", | ||||
|         //   align: "center", | ||||
|         //   width: 100, | ||||
|         //   formart: (bizType) => | ||||
|         //   this.$dict.getLabel("integralDetailBizType", bizType) || '-', | ||||
|         // }, | ||||
|         { slot: "options", label: "操作", align: "center" }, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: { | ||||
|         visible: false, | ||||
|       }, | ||||
|       dialogInfo: {}, | ||||
|     }; | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.$dict | ||||
|       .load([ | ||||
|         "integralDeclareDoType", | ||||
|         "integralDetailType", | ||||
|       ]) | ||||
|       .then(() => { | ||||
|         this.getList(); | ||||
|       }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance | ||||
|         .post(`/app/appvillagerintegraldetail/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             areaId: this.areaId, | ||||
|           }, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             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.visible = true | ||||
|       this.instance.post(`/app/appvillagerintegraldetail/queryDetailById?id=${row.id}`, null, {}).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.dialogInfo = res.data | ||||
|             console.log(this.dialogInfo) | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     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> | ||||
| @@ -1,176 +0,0 @@ | ||||
| <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" | ||||
|             :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?auditType=1areaId=' + 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="description"> | ||||
|           <el-input v-model.trim="form.description" placeholder="请输入..." type="textarea" :rows="4" show-word-limit | ||||
|                     maxlength="100"></el-input> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="类型" prop="doType"> | ||||
|           <el-radio-group v-model="form.doType"> | ||||
|             <el-radio label="0">加分</el-radio> | ||||
|             <el-radio label="1">减分</el-radio> | ||||
|           </el-radio-group> | ||||
|         </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'},], | ||||
|         description: [{required: true, message: '请输入调整说明', trigger: 'blur'},], | ||||
|         doType: [{required: true, message: '请输入调整说明', trigger: 'change'},], | ||||
|         changeIntegral: [ | ||||
|           { | ||||
|             required: true, validator: (rule, value, callback) => { | ||||
|               if (!/^[1-9]\d*$/.test(value)) { | ||||
|                 callback(new Error('请输入正整数')) | ||||
|               } else { | ||||
|                 callback(); | ||||
|               } | ||||
|             }, trigger: 'blur' | ||||
|           },], | ||||
|       } | ||||
|     }, | ||||
|     colConfigs() { | ||||
|       return [ | ||||
|         {prop: "residentName", label: "姓名"}, | ||||
|         {prop: "description", label: "调整说明"}, | ||||
|         { | ||||
|           prop: "changeIntegral", label: "类型", align: "center", | ||||
|           render: (h, {row}) => [< span> {+row.changeIntegral > 0 ? "加分" : '减分' | ||||
|           } < /span>] | ||||
|         }, | ||||
|         { | ||||
|           prop: "changeIntegral", | ||||
|           label: "积分", | ||||
|           align: "center", | ||||
|           render: (h, {row}) => [ | ||||
|             <span>{row.changeIntegral > 0 ? `+${row.changeIntegral}` : `${row.changeIntegral}`}</span>] | ||||
|         }, | ||||
|         {prop: "doTime", label: "操作时间"}, | ||||
|         {prop: "declareObjName", 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, | ||||
|             changeIntegral: this.form.doType == 0 ? `+${this.form.changeIntegral}` : `-${this.form.changeIntegral}` | ||||
|           }).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, | ||||
|           doType: 2 | ||||
|         } | ||||
|       }).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,7 +1,7 @@ | ||||
| <template> | ||||
|   <ai-detail class="family_detail"> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="个人积分明细" :isShowBack="true" :isShowBottomBorder="true" @onBackClick="$emit('goBack')" ></ai-title> | ||||
|       <ai-title title="个人积分明细" :isShowBack="true" :isShowBottomBorder="true" @onBackClick="$emit('goBack')"></ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <div class="detail-info"> | ||||
| @@ -19,37 +19,15 @@ | ||||
|         </div> | ||||
|       </div> | ||||
|       <ai-card title="余额变动明细"> | ||||
|         <template slot="right"> | ||||
|           <!-- <ai-download | ||||
|             :instance="instance" | ||||
|             url="/app/appvillagerintegraldetail/export" | ||||
|             :disabled="!Boolean(tableData.length)" | ||||
|             :params="{familyName:detailInfo.name,doType:doType}" | ||||
|             fileName="余额变动明细"> | ||||
|             <span class="iconfont iconExported">导出</span> | ||||
|           </ai-download> --> | ||||
|         </template> | ||||
|         <template #content> | ||||
|           <el-select v-model="doType" placeholder="请选择类型" size='small' clearable  @change="page.current=1,getList()"> | ||||
|             <el-option | ||||
|               v-for="(item,i) in dict.getDict('integralDetailType')" | ||||
|               :label="item.dictName" | ||||
|               :key="i" | ||||
|               :value="item.dictValue"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|           <ai-table class="fs-14" | ||||
|             style="margin-top: 16px;" | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="page.total" | ||||
|             :current.sync="page.current" | ||||
|             :size.sync="page.size" | ||||
|             :isShowPagination="false" | ||||
|             tableSize="small" | ||||
|             :border="true" | ||||
|             @getList="getList"> | ||||
|           </ai-table> | ||||
|           <ai-search-bar> | ||||
|             <template #left> | ||||
|               <ai-select v-model="type" placeholder="请选择类型" @change="page.current=1,getList()" | ||||
|                          :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" @getList="getList"/> | ||||
|         </template> | ||||
|       </ai-card> | ||||
|     </template> | ||||
| @@ -57,151 +35,124 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'balance', | ||||
| export default { | ||||
|   name: 'balance', | ||||
|  | ||||
|     props: { | ||||
|       detailInfo: { | ||||
|         type: Object, | ||||
|         require: true | ||||
|   props: { | ||||
|     detailInfo: { | ||||
|       type: Object, | ||||
|       require: true | ||||
|     }, | ||||
|     instance: Function, | ||||
|     dict: Object | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       page: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         total: 0 | ||||
|       }, | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|       info: {}, | ||||
|       type: '', | ||||
|       tableData: [] | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         page: { | ||||
|           current: 1, | ||||
|           size: 10, | ||||
|           total: 0 | ||||
|         }, | ||||
|         info: {}, | ||||
|         doType: '', | ||||
|         tableData: [] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.dict.load('integralDetailType') | ||||
|       this.getList() | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       colConfigs () { | ||||
|         const _this = this | ||||
|         return [ | ||||
|           { | ||||
|             prop: 'doTime', | ||||
|             align: 'center', | ||||
|             label: '时间', | ||||
|             align:'left' | ||||
|           }, | ||||
|           { | ||||
|             prop: 'doType', | ||||
|             align: 'center', | ||||
|             label: '类型', | ||||
|             render (h, {row}) { | ||||
|               return h('span',{}, _this.dict.getLabel('integralDetailType', row.bizType)) | ||||
|   created() { | ||||
|     this.dict.load('integralDetailType') | ||||
|     this.getList() | ||||
|   }, | ||||
|   computed: { | ||||
|     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: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appresident/detail?id=${this.detailInfo.id}`).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.info = res.data.resident | ||||
|           let {type, info: {id: residentId}} = this | ||||
|           this.instance.post(`/app/appvillagerintegraldetail/IntegralList`, null, { | ||||
|             params: {...this.page, queryType: 1, type, residentId} | ||||
|           }).then(res => { | ||||
|             if (res?.data) { | ||||
|               this.tableData = res.data.records | ||||
|             } | ||||
|           }, | ||||
|           { | ||||
|             prop: 'changeIntegral', | ||||
|             align: 'center', | ||||
|             label: '变动积分' | ||||
|           }, | ||||
|           { | ||||
|             prop: 'nowIntegral', | ||||
|             align: 'center', | ||||
|             label: '剩余积分' | ||||
|           }, | ||||
|           { | ||||
|             prop: 'description', | ||||
|             align: 'center', | ||||
|             label: '事件类型', | ||||
|             align:'left' | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appresident/detail?id=${this.detailInfo.id}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             this.info = res.data.resident | ||||
|             this.instance.post(`/app/appvillagerintegraldetail/IntegralList?bizType=${this.doType}&type=1&residentId=${res.data.resident.id}`, null, { | ||||
|               params: this.page | ||||
|             }).then(res => { | ||||
|               if (res.code === 0) { | ||||
|                 this.tableData = res.data.records | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .family_detail{ | ||||
|     height: 100%; | ||||
|     background-color: #fff; | ||||
| .family_detail { | ||||
|   height: 100%; | ||||
|   background-color: #fff; | ||||
|  | ||||
|     ::v-deep .ai-card__body { | ||||
|       padding: 12px 16px 20px!important; | ||||
|     } | ||||
|   .detail-info { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     margin-bottom: 20px; | ||||
|  | ||||
|     .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: 0px 4px 6px -2px rgba(15, 15, 21, 0.15); | ||||
|       border-radius: 4px; | ||||
|  | ||||
|       .detail-info__item { | ||||
|         flex: 1; | ||||
|         height: 96px; | ||||
|         margin-right: 20px; | ||||
|         padding: 16px 24px; | ||||
|         background: #FFFFFF; | ||||
|         box-shadow: 0px 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; | ||||
|         } | ||||
|       &:last-child { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|     .iconExported{ | ||||
|       color:#5088FF; | ||||
|       font-size: 12px; | ||||
|       cursor: pointer; | ||||
|     } | ||||
|     .info{ | ||||
|       padding: 16px 0 16px 0; | ||||
|     } | ||||
|     .do_type{ | ||||
|       height: 56px; | ||||
|     } | ||||
|     .fs-14{ | ||||
|       ::v-deep .el-table--small{ | ||||
|         font-size: 14px!important; | ||||
|  | ||||
|       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; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
|  | ||||
|   .iconExported { | ||||
|     color: #5088FF; | ||||
|     font-size: 12px; | ||||
|     cursor: pointer; | ||||
|   } | ||||
|  | ||||
|   .info { | ||||
|     padding: 16px 0 16px 0; | ||||
|   } | ||||
|  | ||||
|   .do_type { | ||||
|     height: 56px; | ||||
|   } | ||||
|  | ||||
|   .fs-14 { | ||||
|     ::v-deep .el-table--small { | ||||
|       font-size: 14px !important; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,84 +0,0 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="积分维护" :isShowBottomBorder="false" :instance="instance" :isShowArea="true" 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)" :bizType="tab.bizType" :ref="tab.name" | ||||
|                      :areaId="areaId" :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import pointsDeclaration from "./pointsDeclaration.vue" | ||||
| import pointsDetails from "./pointsDetails.vue" | ||||
| import pointsAppeal from './pointsAppeal' | ||||
| import {mapState} from 'vuex' | ||||
| import scoreChange from "./scoreChange"; | ||||
|  | ||||
| export default { | ||||
|     name: 'AppScoreManage', | ||||
|     label: "积分维护", | ||||
|     components: {pointsDeclaration, pointsDetails, pointsAppeal, scoreChange}, | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|       tabs() { | ||||
|         return [ | ||||
|           // { | ||||
|           //   label: "积分申报", | ||||
|           //   name: "pointsDeclaration", | ||||
|           //   comp: pointsDeclaration, | ||||
|           //   permission: "app_apppartyfee_record", | ||||
|           //   bizType: '0' | ||||
|           // }, | ||||
|           // { label: "积分申诉", name: "pointsAppeal", comp: pointsAppeal, permission: "app_apppartyfee_config", bizType: '1'}, | ||||
|           { | ||||
|             label: "积分明细", | ||||
|             name: "pointsDetails", | ||||
|             comp: pointsDetails, | ||||
|             permission: "app_apppartyfee_statistics", | ||||
|             bizType: '2' | ||||
|           }, | ||||
|           { | ||||
|             label: "积分调整", | ||||
|             name: "scoreChange", | ||||
|             comp: scoreChange, | ||||
|             permission: "", | ||||
|           }, | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     created() { | ||||
|       this.areaId = this.user.info.areaId | ||||
|     }, | ||||
|     methods: { | ||||
|       changeArea() { | ||||
|         this.$nextTick(() => { | ||||
|           this.$refs[this.tabs[Number(this.currIndex)].name][0].getList() | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     data() { | ||||
|       return { | ||||
|         activeName: "pointsDeclaration", | ||||
|         currIndex: '0', | ||||
|         areaId: '' | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
| @@ -1,611 +0,0 @@ | ||||
| <template> | ||||
|   <section class="pointsDeclaration"> | ||||
|     <ai-list isTabs> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="onAdd" v-if="$permissions('app_appvillagerintegraldeclare_edit')">代申诉</el-button> | ||||
|             <el-button icon="iconfont iconEdit" @click="batchAduit()" :disabled="!Boolean(selectionList.length)" v-if="$permissions('app_appvillagerintegraldeclare_edit')">批量审核</el-button> | ||||
|             <ai-select | ||||
|               v-model="search.status" | ||||
|               @change="page.current = 1, getList()" | ||||
|               placeholder="发布状态" | ||||
|               :selectList="dict.getDict('integralDeclareStatus')"> | ||||
|             </ai-select> | ||||
|             <div class="times_div"> | ||||
|               <p class="times">申诉时间</p> | ||||
|               <el-date-picker | ||||
|                 v-model="search.declareTimeStart" | ||||
|                 type="date" | ||||
|                 size="small" | ||||
|                 @change="page.current = 1,getList()" | ||||
|                 value-format="yyyy-MM-dd HH:mm:ss" | ||||
|                 placeholder="开始日期"> | ||||
|               </el-date-picker> | ||||
|               <el-date-picker | ||||
|                 v-model="search.declareTimeEnd" | ||||
|                 type="date" | ||||
|                 size="small" | ||||
|                 @change="page.current = 1,getList()" | ||||
|                 value-format="yyyy-MM-dd HH:mm:ss" | ||||
|                 placeholder="结束日期"> | ||||
|               </el-date-picker> | ||||
|             </div> | ||||
|           </template> | ||||
|           <template slot="right"> | ||||
|             <el-input | ||||
|               v-model="search.familyName" | ||||
|               class="search-input" | ||||
|               size="mini" | ||||
|               placeholder="申诉人/申诉对象/..." | ||||
|               clearable | ||||
|               v-throttle="() => {page.current = 1, getList()}" | ||||
|               @clear="page.current = 1, getList()" | ||||
|               suffix-icon="iconfont iconSearch" /> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table | ||||
|           :tableData="tableData" | ||||
|           :col-configs="colConfigs" | ||||
|           :total="page.total" | ||||
|           :current.sync="page.current" | ||||
|           :size.sync="page.size" | ||||
|           @getList="getList" | ||||
|           @selection-change="handleSelectionChange" | ||||
|         > | ||||
|           <el-table-column slot="selection" type="selection" width="55" :selectable="(row, index)=>{ | ||||
|               if(row.status==0){ | ||||
|                 return true | ||||
|               }else{ | ||||
|                 return false | ||||
|               }                   | ||||
|           }"></el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span | ||||
|                 class="iconfont iconEdit icon-color89B" | ||||
|                 v-if="row.status === '0'&&$permissions('app_appvillagerintegraldeclare_edit')" | ||||
|                 title="编辑" | ||||
|                 @click="toEdit(row)" | ||||
|               ></span> | ||||
|               <span | ||||
|                 class="iconfont iconShow icon-color89B" | ||||
|                 v-if="row.status !== '0'&&$permissions('app_appvillagerintegraldeclare_detail')" | ||||
|                 title="详情" | ||||
|                 @click="toEdit(row)" | ||||
|               ></span> | ||||
|               <!-- <span | ||||
|                 class="iconfont iconDelete icon-color89B" | ||||
|                 v-if="$permissions('app_appofficialdocumentinfo_del')" | ||||
|                 title="删除" | ||||
|                 @click="remove(row.id)" | ||||
|               ></span> --> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog | ||||
|       title="积分代申诉" | ||||
|       :visible.sync="dialog.visibleAdd" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|       @close="init('ruleForm')" | ||||
|     > | ||||
|       <div class="form_div"> | ||||
|         <el-form | ||||
|           ref="ruleForm" | ||||
|           :model="dialogInfo" | ||||
|           :rules="formRules" | ||||
|           size="small" | ||||
|           label-suffix=":" | ||||
|           label-width="140px" | ||||
|         > | ||||
|           <el-form-item label="代申诉家庭" prop="users">             | ||||
|               <ai-person-select :customClicker="true" :isMultiple="true" :chooseUserList.sync="dialogInfo.users" :instance="instance" url="/app/appvillagerintegralfamilymember/list" > | ||||
|                     <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="declareDescription"> | ||||
|             <el-input type="textarea" :rows="3" placeholder="请输入…" maxlength="100" show-word-limit v-model="dialogInfo.declareDescription"></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="照片" prop="fileList"> | ||||
|             <div class="upload"> | ||||
|               <ai-uploader :instance="instance" v-model="dialogInfo.fileList" :limit="9" ></ai-uploader> | ||||
|             </div> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog.visibleAdd=false" size="medium">取消</el-button> | ||||
|         <el-button @click="declare('ruleForm')" type="primary" size="medium">提交</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|     <ai-dialog | ||||
|       title="申诉审核" | ||||
|       :visible.sync="dialog.visibleDetail" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|       @close="init('rules')" | ||||
|     > | ||||
|       <div class="form_content" v-if="!isBatch"> | ||||
|         <div class="form_flex form_info"> | ||||
|           <div> | ||||
|             <span class="form_label">申诉人:</span> | ||||
|             <span class="form_value">{{rowInfo.declareName}}</span> | ||||
|           </div> | ||||
|           <div> | ||||
|             <span class="form_label">申诉对象:</span> | ||||
|             <span class="form_value">{{rowInfo.declareObjName}}</span> | ||||
|           </div> | ||||
|           <div> | ||||
|             <span class="form_label">户主:</span> | ||||
|             <span class="form_value">{{rowInfo.familyName}}</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">申诉说明:</span> | ||||
|           <span class="form_value">{{rowInfo.declareDescription}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">申诉时间:</span> | ||||
|           <span class="form_value">{{rowInfo.declareTime}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">照片:</span> | ||||
|           <span class="form_value"> | ||||
|               <ai-uploader  :disabled="true" :instance="instance" v-model="rowInfo.fileList" :limit="9" ></ai-uploader> | ||||
|           </span> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="form_div"> | ||||
|         <el-form | ||||
|           ref="rules" | ||||
|           :model="dialogDetail" | ||||
|           :rules="formRules" | ||||
|           size="small" | ||||
|           label-suffix=":" | ||||
|           v-show="rowInfo.status==0" | ||||
|           label-width="90px" | ||||
|         > | ||||
|           <el-form-item label="类型" prop="doType"> | ||||
|             <el-radio-group v-model="dialogDetail.doType" @change="changeDoType"> | ||||
|               <el-radio label="1">加分</el-radio> | ||||
|               <el-radio label="0">扣分</el-radio> | ||||
|               <el-radio label="2">拒绝</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="事项" prop="ruleId" v-if='dialogDetail.doType!=2'> | ||||
|             <el-select v-model="dialogDetail.ruleId" placeholder="请选择..." @change="ruleChange"> | ||||
|                   <el-option | ||||
|                       v-for="(item,i) in rulesList" | ||||
|                       :key="i" | ||||
|                       :label="item.ruleName" | ||||
|                       :value="item.id" | ||||
|                   ></el-option> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="积分" prop="doIntegral" v-if='dialogDetail.doType!=2'> | ||||
|             <el-col :span="1.5" style="margin-right: 8px;">{{dialogDetail.doType==0? '减少' :'增加'}}</el-col> | ||||
|             <el-col :span="6" style="margin-right: 8px;width:120px;"><el-input type="number" v-model="dialogDetail.doIntegral" :placeholder="placeholder" :disabled="integralEdit"></el-input></el-col> | ||||
|             <el-col :span="1" style="margin-right: 8px;">分</el-col>             | ||||
|           </el-form-item> | ||||
|           <el-form-item label="备注说明"> | ||||
|             <el-input type="textarea" :rows="3" maxlength="100" placeholder="请输入…" show-word-limit v-model="dialogDetail.remark"></el-input> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|         <ai-wrapper | ||||
|             label-width="70px" | ||||
|             v-if="rowInfo.status!=0" | ||||
|             :columnsNumber="1"> | ||||
|             <ai-info-item label="类型:"><span  :style="{color:colorList[rowInfo.status]}" >{{dict.getLabel('integralDeclareStatus', rowInfo.status)}}</span></ai-info-item> | ||||
|             <ai-info-item label="事项:" v-if='rowInfo.doType!=2'><span >{{rowInfo.ruleName}}</span></ai-info-item> | ||||
|             <ai-info-item label="积分:" v-if='rowInfo.doType!=2'>{{rowInfo.doType==0? '减少' :'增加'}}<span style="color:#2266FF">{{Math.abs(rowInfo.doIntegral)}}</span>分</ai-info-item> | ||||
|             <ai-info-item label="备注说明:"><span>{{rowInfo.remark||'-'}}</span></ai-info-item> | ||||
|         </ai-wrapper> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer" v-if="rowInfo.status==0"> | ||||
|         <el-button @click="dialog.visibleDetail=false" size="medium">取消</el-button> | ||||
|         <el-button @click="onConfirm('rules')" type="primary" size="medium">提交</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from 'vuex'; | ||||
| export default { | ||||
|   name: "pointsAppeal", | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     bizType:String, | ||||
|     areaId:String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|      var integral = (rule, value, callback) => { | ||||
|       if (value) { | ||||
|         if (/^[1-9]\d*$/.test(value)) { | ||||
|           if(!this.integralEdit){ | ||||
|               if(Number(value)>=this.sectionNum.min&&Number(value)<=this.sectionNum.max){ | ||||
|                   callback(); | ||||
|               }else{ | ||||
|                   callback(new Error(`请输入${this.sectionNum.min}至${this.sectionNum.max}之间的正整数积分`)); | ||||
|               } | ||||
|           }else{ | ||||
|             callback(); | ||||
|           } | ||||
|            | ||||
|         } else { | ||||
|           callback(new Error('请输入正整数')); | ||||
|         } | ||||
|       } else { | ||||
|           callback(new Error('请输入正整数')); | ||||
|       } | ||||
|     }; | ||||
|     return { | ||||
|       search: { | ||||
|           status:'', | ||||
|           familyName:'', | ||||
|           declareTimeStart:null, | ||||
|           declareTimeEnd:null | ||||
|       }, | ||||
|       page:{ | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         total:0 | ||||
|       }, | ||||
|       colConfigs: [ | ||||
|         { slot: "selection", label: "", align: "center" }, | ||||
|         { prop: "declareName", label: "申诉人", align: "center" }, | ||||
|         { prop: "declareObjName", label: "申诉对象", align: "center",hide:this.bizType==1 }, | ||||
|         { | ||||
|           prop: "familyName", | ||||
|           label: "户主", | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareDescription", | ||||
|           label: "申诉说明", | ||||
|           align: "left", | ||||
|           width:300 | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareTime", | ||||
|           label: "申诉时间", | ||||
|           align: "left", | ||||
|           width:150 | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareName", | ||||
|           label: "操作人", | ||||
|           align: "center", | ||||
|         }, | ||||
|         { | ||||
|           prop: "status", | ||||
|           label: "状态", | ||||
|           align: "center", | ||||
|           render: (h, {row}) => { | ||||
|               return h('span', {style: {color: this.dict.getColor('integralDeclareStatus', row.status)}}, this.dict.getLabel('integralDeclareStatus', row.status)) | ||||
|           }, | ||||
|         }, | ||||
|         { slot: "options", label: "操作", align: "center" }, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: { | ||||
|         visibleAdd: false, | ||||
|         visibleDetail: false, | ||||
|         title:'积分代申诉' | ||||
|       }, | ||||
|       dialogInfo: { | ||||
|         users: [], | ||||
|         reportIds:[], | ||||
|         declareDescription: "", | ||||
|         fileList: [], | ||||
|       }, | ||||
|       dialogDetail: { | ||||
|         doType: '1', | ||||
|         ruleId: '', | ||||
|         doIntegral: '', | ||||
|         remark: '', | ||||
|         aduitIds:[], | ||||
|         ruleName:'' | ||||
|       }, | ||||
|       isBatch:false, | ||||
|       rulesList:[], | ||||
|       rowInfo:{}, | ||||
|       formRules: { | ||||
|         users: [{ required: true, message: "请选择人员", trigger: "change" },], | ||||
|         declareDescription: [{ required: true, message: "代申诉说明", trigger: "blur" }], | ||||
|         // fileList: [{ required: true, message: "请上传照片", trigger: "blur" },], | ||||
|         ruleId: [{ required: true, message: "请选择事项", trigger: "blur" }], | ||||
|         doIntegral: [{ required: true, validator: integral, trigger: "blur" }], | ||||
|         doType:[{ required: true, message: "请选择类型", trigger: "change" }] | ||||
|       }, | ||||
|       selectionList:[], | ||||
|       integralEdit:false, | ||||
|       sectionNum:{ | ||||
|         min:null, | ||||
|         max:null | ||||
|       }, | ||||
|       placeholder:'请输入...' | ||||
|     }; | ||||
|   }, | ||||
|   computed:{ | ||||
|       colorList(){ | ||||
|           return { | ||||
|               '0':'#FF8822', | ||||
|               '1':'#2EA222', | ||||
|               '2':'#FF4466' | ||||
|           } | ||||
|       } | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict | ||||
|       .load([ | ||||
|         'integralDeclareStatus', | ||||
|         'integralDeclareDoType' | ||||
|       ]).then(() => { | ||||
|         this.getList(); | ||||
|       }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegraldeclare/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             ...this.page, | ||||
|              bizType:this.bizType, | ||||
|              areaId:this.areaId | ||||
|           }, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records; | ||||
|             this.page.total = res.data.total; | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     handleSelectionChange(val){ | ||||
|       this.selectionList=val | ||||
|       this.dialogDetail.aduitIds=[]; | ||||
|         val.forEach(e=>{ | ||||
|             this.dialogDetail.aduitIds.push(e.id); | ||||
|         }) | ||||
|     }, | ||||
|     // getSelect(val){ | ||||
|     //     for(let e of val){ | ||||
|     //         this.dialogInfo.reportIds.push(e.id) | ||||
|     //     } | ||||
|     // }, | ||||
|     getColor(status){ | ||||
|         return this.dict.getColor('integralDeclareStatus', status) | ||||
|     }, | ||||
|     onChange(val){ | ||||
|  | ||||
|     }, | ||||
|     declare(formName){ | ||||
|         this.dialogInfo.reportIds=[]; | ||||
|         for(let e of this.dialogInfo.users){ | ||||
|             this.dialogInfo.reportIds.push(e.id) | ||||
|         }; | ||||
|         this.$refs[formName].validate((valid) => { | ||||
|             if (valid) { | ||||
|                   this.instance.post("/app/appvillagerintegraldeclare/addOrUpdate", { | ||||
|                         ...this.dialogInfo, | ||||
|                          bizType:this.bizType | ||||
|                     }, null).then(res => { | ||||
|                         if (res.code==0) { | ||||
|                             this.dialog.visibleAdd=false; | ||||
|                             this.getList(); | ||||
|                         } | ||||
|                     }) | ||||
|             } else { | ||||
|                 return false; | ||||
|             } | ||||
|         }); | ||||
|     }, | ||||
|     init(formName){ | ||||
|         this.$refs[formName].clearValidate(); | ||||
|         this.dialogDetail = { | ||||
|                             doType: '1', | ||||
|                             ruleId: '', | ||||
|                             doIntegral: '', | ||||
|                             remark: '', | ||||
|                             aduitIds:[], | ||||
|                             ruleName:'' | ||||
|                           } | ||||
|           this.dialogInfo=  { | ||||
|             users: [], | ||||
|             reportIds:[], | ||||
|             declareDescription: "", | ||||
|             fileList: [], | ||||
|           }; | ||||
|           this.rulesList = []; | ||||
|     }, | ||||
|     //批量审核 | ||||
|     batchAduit(){ | ||||
|         this.isBatch=true; | ||||
|         this.rowInfo.status=0; | ||||
|         this.dialog.visibleDetail = true; | ||||
|         this.getRules('1') | ||||
|     }, | ||||
|     getRowDetail(row){ | ||||
|          this.instance.post(`/app/appvillagerintegraldeclare/queryDetailById`, null, { | ||||
|           params: { | ||||
|               id:row.id | ||||
|           }, | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|               this.rowInfo = {...res.data} | ||||
|               this.dialog.visibleDetail = true; | ||||
|               this.dialogDetail.aduitIds=[]; | ||||
|               this.dialogDetail.aduitIds.push(row.id); | ||||
|  | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     toEdit(row) { | ||||
|         this.isBatch=false; | ||||
|         this.getRowDetail(row); | ||||
|         this.getRules('1') | ||||
|     }, | ||||
|     changeDoType(val){ | ||||
|         this.dialogDetail.ruleId=""; | ||||
|         this.dialogDetail.ruleName = ""; | ||||
|         this.dialogDetail.doIntegral = ""; | ||||
|         this.placeholder = '请输入...'; | ||||
|         this.$refs.rules.clearValidate(); | ||||
|         this.getRules(val) | ||||
|     }, | ||||
|     ruleChange(val){ | ||||
|         let item = this.rulesList.find(e => e.id == val); | ||||
|         this.dialogDetail.doIntegral=''; | ||||
|         this.$refs.rules.clearValidate(); | ||||
|         if(item){ | ||||
|           //固定区间 | ||||
|             this.dialogDetail.ruleName = item.ruleName; | ||||
|             if(item.integralValueType==0){ | ||||
|                 this.dialogDetail.doIntegral = Math.abs(item.integral); | ||||
|                 this.integralEdit = true; | ||||
|             }else{ | ||||
|                 this.integralEdit = false; | ||||
|                 if(Math.abs(item.integralEnd)>Math.abs(item.integralStart)){ | ||||
|                     this.sectionNum.min = Math.abs(item.integralStart); | ||||
|                     this.sectionNum.max = Math.abs(item.integralEnd); | ||||
|                 }else{ | ||||
|                     this.sectionNum.max = Math.abs(item.integralStart); | ||||
|                     this.sectionNum.min = Math.abs(item.integralEnd); | ||||
|                 } | ||||
|                 this.placeholder = `${this.sectionNum.min}~${this.sectionNum.max}` | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     //事项查询 | ||||
|     getRules(integralType){ | ||||
|         this.instance.post(`/app/appvillagerintegralrule/list`, null, { | ||||
|           params: { | ||||
|               integralType, | ||||
|               size:10000000 | ||||
|           }, | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|               this.rulesList = res.data.records.filter(e=> e.ruleStatus == 1); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     remove(id) { | ||||
|       this.$confirm("确定删除该公文及其相关的流转信息?").then(() => { | ||||
|         this.instance | ||||
|           .post(`/app/appofficialdocumentinfo/delete?ids=${id}`) | ||||
|           .then((res) => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success("删除成功!"); | ||||
|               this.getList(); | ||||
|             } | ||||
|           }); | ||||
|       }); | ||||
|     }, | ||||
|     onReset() { | ||||
|       Object.keys(this.search).forEach(e => { | ||||
|           this.search[e] = ""; | ||||
|       }); | ||||
|       this.search.declareTimeStart = null; | ||||
|       this.search.declareTimeEnd = null; | ||||
|       this.getList(); | ||||
|     }, | ||||
|  | ||||
|     onAdd() { | ||||
|       this.dialog.visibleAdd = true; | ||||
|     }, | ||||
|  | ||||
|     onConfirm(formName) { | ||||
|       this.$refs[formName].validate(v =>{ | ||||
|          if(v){ | ||||
|             this.instance.post("/app/appvillagerintegraldeclare/aduit", { | ||||
|                         ...this.dialogDetail, | ||||
|                 }, null).then(res => { | ||||
|                   if (res.code==0) { | ||||
|                       this.dialog.visibleDetail=false; | ||||
|                       this.$message.success("提交成功!"); | ||||
|                       this.dialogDetail.aduitIds=[]; | ||||
|                       this.getList(); | ||||
|                   } | ||||
|             }) | ||||
|          }else{ | ||||
|             return false | ||||
|          } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|  | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .pointsDeclaration { | ||||
|   height: 100%; | ||||
|   overflow: auto; | ||||
|   background: #f3f6f9; | ||||
|   .times_div{ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     .times{ | ||||
|       display: block; | ||||
|       width: 72px; | ||||
|       height: 30px; | ||||
|       line-height: 30px; | ||||
|       text-align: center; | ||||
|       background: #F5F5F5; | ||||
|       border-radius: 2px 0px 0px 2px; | ||||
|       border: 1px solid #D0D4DC; | ||||
|       font-size: 14px; | ||||
|       color:#666666; | ||||
|     } | ||||
|   } | ||||
|   .form_content{ | ||||
|     border-bottom:1px solid #eee; | ||||
|     .form_flex{ | ||||
|       display: flex; | ||||
|       div{ | ||||
|         flex: 1; | ||||
|       } | ||||
|     } | ||||
|     .form_info{ | ||||
|       margin-bottom: 8px; | ||||
|     } | ||||
|     .form_label{ | ||||
|       display: inline-block; | ||||
|       color: #999; | ||||
|       vertical-align: top; | ||||
|     } | ||||
|     .form_value{ | ||||
|       display: inline-block; | ||||
|       color: #333; | ||||
|       width: calc(100% - 80px); | ||||
|     } | ||||
|   } | ||||
|   .form_div{ | ||||
|     padding-top:24px; | ||||
|   } | ||||
|   .status-0 { | ||||
|     color: #ff8822; | ||||
|   } | ||||
|  | ||||
|   .status-1 { | ||||
|     color: #2266ff; | ||||
|   } | ||||
|  | ||||
|   .status-2 { | ||||
|     color: #999999; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -1,603 +0,0 @@ | ||||
| <template> | ||||
|   <section class="pointsDeclaration"> | ||||
|     <ai-list isTabs> | ||||
|       <template slot="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template slot="left"> | ||||
|             <el-button type="primary" icon="iconfont iconAdd" @click="onAdd" v-if="$permissions('app_appvillagerintegraldeclare_edit')">代申报</el-button> | ||||
|             <el-button icon="iconfont iconEdit" @click="batchAduit()" :disabled="!Boolean(selectionList.length)"v-if="$permissions('app_appvillagerintegraldeclare_edit')">批量审核</el-button> | ||||
|             <ai-select | ||||
|               v-model="search.status" | ||||
|               @change="page.current = 1, getList()" | ||||
|               placeholder="发布状态" | ||||
|               :selectList="dict.getDict('integralDeclareStatus')"> | ||||
|             </ai-select> | ||||
|             <div class="times_div"> | ||||
|               <p class="times">申报时间</p> | ||||
|               <el-date-picker | ||||
|                 v-model="search.declareTimeStart" | ||||
|                 type="date" | ||||
|                 size="small" | ||||
|                 @change="page.current = 1,getList()" | ||||
|                 value-format="yyyy-MM-dd HH:mm:ss" | ||||
|                 placeholder="开始日期"> | ||||
|               </el-date-picker> | ||||
|               <el-date-picker | ||||
|                 v-model="search.declareTimeEnd" | ||||
|                 type="date" | ||||
|                 size="small" | ||||
|                 @change="page.current = 1,getList()" | ||||
|                 value-format="yyyy-MM-dd HH:mm:ss" | ||||
|                 placeholder="结束日期"> | ||||
|               </el-date-picker> | ||||
|             </div> | ||||
|           </template> | ||||
|           <template slot="right"> | ||||
|             <el-input | ||||
|               v-model="search.familyName" | ||||
|               class="search-input" | ||||
|               size="mini" | ||||
|               placeholder="申诉人/申诉对象/..." | ||||
|               clearable | ||||
|               v-throttle="() => {page.current = 1, getList()}" | ||||
|               @clear="page.current = 1, getList()" | ||||
|               suffix-icon="iconfont iconSearch" /> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table | ||||
|           :tableData="tableData" | ||||
|           :col-configs="colConfigs" | ||||
|           :total="page.total" | ||||
|           :current.sync="page.current" | ||||
|           :size.sync="page.size" | ||||
|           @getList="getList" | ||||
|           @selection-change="handleSelectionChange"> | ||||
|           <el-table-column slot="selection" type="selection" width="55" :selectable="(row, index)=>{ | ||||
|               if(row.status==0){ | ||||
|                 return true | ||||
|               }else{ | ||||
|                 return false | ||||
|               }                   | ||||
|           }"></el-table-column> | ||||
|           <el-table-column slot="options" label="操作" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <div class="table-options"> | ||||
|                 <el-button | ||||
|                   type="text" | ||||
|                   :disabled="row.status === '0' || $permissions('app_appvillagerintegraldeclare_edit')" | ||||
|                   title="编辑" | ||||
|                   @click="toEdit(row)"> | ||||
|                   编辑 | ||||
|                 </el-button> | ||||
|                 <el-button | ||||
|                   type="text" | ||||
|                   :disabled="$permissions('app_appvillagerintegraldeclare_detail')" | ||||
|                   title="详情" | ||||
|                   @click="toEdit(row)"> | ||||
|                   详情 | ||||
|                 </el-button> | ||||
|               </div> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </template> | ||||
|     </ai-list> | ||||
|     <ai-dialog | ||||
|       title="积分代申报" | ||||
|       :visible.sync="dialog.visibleAdd" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|       @close="init('ruleForm')"> | ||||
|       <div class="form_div"> | ||||
|         <el-form | ||||
|           ref="ruleForm" | ||||
|           :model="dialogInfo" | ||||
|           :rules="formRules" | ||||
|           size="small" | ||||
|           label-suffix=":" | ||||
|           label-width="140px"> | ||||
|           <el-form-item label="代申报家庭" prop="users">             | ||||
|             <ai-person-select :customClicker="true" :isMultiple="true" :chooseUserList.sync="dialogInfo.users" :instance="instance" url="/app/appvillagerintegralfamilymember/list" > | ||||
|               <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="declareDescription"> | ||||
|             <el-input type="textarea" :rows="3" placeholder="请输入…" maxlength="100" show-word-limit v-model="dialogInfo.declareDescription"></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="照片" prop="fileList"> | ||||
|             <div class="upload"> | ||||
|               <ai-uploader :instance="instance" v-model="dialogInfo.fileList" :limit="9" ></ai-uploader> | ||||
|             </div> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog.visibleAdd=false" size="medium">取消</el-button> | ||||
|         <el-button @click="declare('ruleForm')" type="primary" size="medium">提交</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|     <ai-dialog | ||||
|       title="申报审核" | ||||
|       :visible.sync="dialog.visibleDetail" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|       @close="init('rules')"> | ||||
|       <div class="form_content" v-if="!isBatch"> | ||||
|         <div class="form_flex form_info"> | ||||
|           <div> | ||||
|             <span class="form_label">申报人:</span> | ||||
|             <span class="form_value">{{rowInfo.declareName}}</span> | ||||
|           </div> | ||||
|           <div> | ||||
|             <span class="form_label">申报对象:</span> | ||||
|             <span class="form_value">{{rowInfo.declareObjName}}</span> | ||||
|           </div> | ||||
|           <div> | ||||
|             <span class="form_label">户主:</span> | ||||
|             <span class="form_value">{{rowInfo.familyName}}</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">申报说明:</span> | ||||
|           <span class="form_value">{{rowInfo.declareDescription}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">申报时间:</span> | ||||
|           <span class="form_value">{{rowInfo.declareTime}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">照片:</span> | ||||
|           <span class="form_value"> | ||||
|               <ai-uploader  :disabled="true" :instance="instance" v-model="rowInfo.fileList" :limit="9" ></ai-uploader> | ||||
|           </span> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="form_div"> | ||||
|         <el-form | ||||
|           ref="rules" | ||||
|           :model="dialogDetail" | ||||
|           :rules="formRules" | ||||
|           size="small" | ||||
|           label-suffix=":" | ||||
|           v-show="rowInfo.status==0" | ||||
|           label-width="90px" | ||||
|         > | ||||
|           <el-form-item label="类型" prop="doType"> | ||||
|             <el-radio-group v-model="dialogDetail.doType" @change="changeDoType"> | ||||
|               <el-radio label="1">加分</el-radio> | ||||
|               <el-radio label="0">扣分</el-radio> | ||||
|               <el-radio label="2">拒绝</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="事项" prop="ruleId" v-if='dialogDetail.doType!=2'> | ||||
|             <el-select v-model="dialogDetail.ruleId" placeholder="请选择..." @change="ruleChange"> | ||||
|                   <el-option | ||||
|                       v-for="(item,i) in rulesList" | ||||
|                       :key="i" | ||||
|                       :label="item.ruleName" | ||||
|                       :value="item.id" | ||||
|                   ></el-option> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="积分" prop="doIntegral" v-if='dialogDetail.doType!=2'> | ||||
|             <el-col :span="1.5" style="margin-right: 8px;">{{dialogDetail.doType==0? '减少' :'增加'}}</el-col> | ||||
|             <el-col :span="6" style="margin-right: 8px;width:120px;"><el-input type="number" v-model="dialogDetail.doIntegral" :placeholder="placeholder" :disabled="integralEdit"></el-input></el-col> | ||||
|             <el-col :span="1" style="margin-right: 8px;">分</el-col>             | ||||
|           </el-form-item> | ||||
|           <el-form-item label="备注说明"> | ||||
|             <el-input type="textarea" :rows="3" maxlength="100" placeholder="请输入…" show-word-limit v-model="dialogDetail.remark"></el-input> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|         <ai-wrapper | ||||
|             label-width="70px" | ||||
|             v-if="rowInfo.status!=0" | ||||
|             :columnsNumber="1"> | ||||
|             <ai-info-item label="类型:"><span  :style="{color:colorList[rowInfo.status]}" >{{dict.getLabel('integralDeclareStatus', rowInfo.status)}}</span></ai-info-item> | ||||
|             <ai-info-item label="事项:" v-if='rowInfo.doType!=2'><span >{{rowInfo.ruleName}}</span></ai-info-item> | ||||
|             <ai-info-item label="积分:" v-if='rowInfo.doType!=2'>{{rowInfo.doType==0? '减少' :'增加'}}<span style="color:#2266FF">{{Math.abs(rowInfo.doIntegral)}}</span>分</ai-info-item> | ||||
|             <ai-info-item label="备注说明:"><span>{{rowInfo.remark||'-'}}</span></ai-info-item> | ||||
|         </ai-wrapper> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer" v-if="rowInfo.status==0"> | ||||
|         <el-button @click="dialog.visibleDetail=false" size="medium">取消</el-button> | ||||
|         <el-button @click="onConfirm('rules')" type="primary" size="medium">提交</el-button> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from 'vuex'; | ||||
| export default { | ||||
|   name: "pointsDeclaration", | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     bizType:String, | ||||
|     areaId:String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|      var integral = (rule, value, callback) => { | ||||
|       if (value) { | ||||
|         if (/^[1-9]\d*$/.test(value)) { | ||||
|           if(!this.integralEdit){ | ||||
|               if(Number(value)>=this.sectionNum.min&&Number(value)<=this.sectionNum.max){ | ||||
|                   callback(); | ||||
|               }else{ | ||||
|                   callback(new Error(`请输入${this.sectionNum.min}至${this.sectionNum.max}之间的正整数积分`)); | ||||
|               } | ||||
|           }else{ | ||||
|             callback(); | ||||
|           } | ||||
|            | ||||
|         } else { | ||||
|           callback(new Error('请输入正整数')); | ||||
|         } | ||||
|       } else { | ||||
|           callback(new Error('请输入正整数')); | ||||
|       } | ||||
|     }; | ||||
|     return { | ||||
|       search: { | ||||
|           status:'', | ||||
|           familyName:'', | ||||
|           declareTimeStart:null, | ||||
|           declareTimeEnd:null | ||||
|       }, | ||||
|       page:{ | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         total:0 | ||||
|       }, | ||||
|       colConfigs: [ | ||||
|         { slot: "selection", label: "" }, | ||||
|         { prop: "declareName", label: "申报人", align: "center" }, | ||||
|         { prop: "declareObjName", label: "申报对象", align: "center",hide:this.bizType==1 }, | ||||
|         { | ||||
|           prop: "familyName", | ||||
|           label: "户主", | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareDescription", | ||||
|           label: "申诉说明", | ||||
|           align: "left", | ||||
|           width:300 | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareTime", | ||||
|           label: "申报时间", | ||||
|           align: "left", | ||||
|           width:150 | ||||
|         }, | ||||
|         { | ||||
|           prop: "declareName", | ||||
|           label: "操作人", | ||||
|           align: "center", | ||||
|         }, | ||||
|         { | ||||
|           prop: "status", | ||||
|           label: "状态", | ||||
|           align: "center", | ||||
|           render: (h, {row}) => { | ||||
|               return h('span', {style: {color: this.dict.getColor('integralDeclareStatus', row.status)}}, this.dict.getLabel('integralDeclareStatus', row.status)) | ||||
|           }, | ||||
|         }, | ||||
|         { slot: "options", label: "操作", align: "center" }, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: { | ||||
|         visibleAdd: false, | ||||
|         visibleDetail: false, | ||||
|         title:'积分代申报' | ||||
|       }, | ||||
|       dialogInfo: { | ||||
|         users: [], | ||||
|         reportIds:[], | ||||
|         declareDescription: "", | ||||
|         fileList: [], | ||||
|       }, | ||||
|       dialogDetail: { | ||||
|         doType: '1', | ||||
|         ruleId: '', | ||||
|         doIntegral: '', | ||||
|         remark: '', | ||||
|         aduitIds:[], | ||||
|         ruleName:'' | ||||
|       }, | ||||
|       isBatch:false, | ||||
|       rulesList:[], | ||||
|       rowInfo:{}, | ||||
|       formRules: { | ||||
|         users: [{ required: true, message: "请选择人员", trigger: "change" },], | ||||
|         declareDescription: [{ required: true, message: "代申报说明", trigger: "blur" }], | ||||
|         // fileList: [{ required: true, message: "请上传照片", trigger: "blur" },], | ||||
|         ruleId: [{ required: true, message: "请选择事项", trigger: "blur" }], | ||||
|         doIntegral: [{ required: true, validator: integral, trigger: "blur" }], | ||||
|         doType:[{ required: true, message: "请选择类型", trigger: "change" }] | ||||
|       }, | ||||
|       selectionList:[], | ||||
|       integralEdit:false, | ||||
|       sectionNum:{ | ||||
|         min:null, | ||||
|         max:null | ||||
|       }, | ||||
|       placeholder:'请输入...' | ||||
|     }; | ||||
|   }, | ||||
|   computed:{ | ||||
|       colorList(){ | ||||
|           return { | ||||
|               '0':'#FF8822', | ||||
|               '1':'#2EA222', | ||||
|               '2':'#FF4466' | ||||
|           } | ||||
|       } | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict | ||||
|       .load([ | ||||
|         'integralDeclareStatus', | ||||
|         'integralDeclareDoType' | ||||
|       ]).then(() => { | ||||
|         this.getList(); | ||||
|       }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appvillagerintegraldeclare/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             ...this.page, | ||||
|              bizType:this.bizType, | ||||
|              areaId:this.areaId | ||||
|           }, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records; | ||||
|             this.page.total = res.data.total; | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     handleSelectionChange(val){ | ||||
|       this.selectionList=val | ||||
|       this.dialogDetail.aduitIds=[]; | ||||
|         val.forEach(e=>{ | ||||
|             this.dialogDetail.aduitIds.push(e.id); | ||||
|         }) | ||||
|     }, | ||||
|     // getSelect(val){ | ||||
|     //     for(let e of val){ | ||||
|     //         this.dialogInfo.reportIds.push(e.id) | ||||
|     //     } | ||||
|     // }, | ||||
|     getColor(status){ | ||||
|         return this.dict.getColor('integralDeclareStatus', status) | ||||
|     }, | ||||
|     onChange(val){ | ||||
|  | ||||
|     }, | ||||
|     declare(formName){ | ||||
|         this.dialogInfo.reportIds=[]; | ||||
|         for(let e of this.dialogInfo.users){ | ||||
|             this.dialogInfo.reportIds.push(e.id) | ||||
|         }; | ||||
|         this.$refs[formName].validate((valid) => { | ||||
|             if (valid) { | ||||
|                   this.instance.post("/app/appvillagerintegraldeclare/addOrUpdate", { | ||||
|                         ...this.dialogInfo, | ||||
|                          bizType:this.bizType | ||||
|                     }, null).then(res => { | ||||
|                         if (res.code==0) { | ||||
|                             this.dialog.visibleAdd=false; | ||||
|                             this.getList(); | ||||
|                         } | ||||
|                     }) | ||||
|             } else { | ||||
|                 return false; | ||||
|             } | ||||
|         }); | ||||
|     }, | ||||
|     init(formName){ | ||||
|         this.$refs[formName].clearValidate(); | ||||
|         this.dialogDetail = { | ||||
|                             doType: '1', | ||||
|                             ruleId: '', | ||||
|                             doIntegral: '', | ||||
|                             remark: '', | ||||
|                             aduitIds:[], | ||||
|                             ruleName:'' | ||||
|                           } | ||||
|           this.dialogInfo=  { | ||||
|             users: [], | ||||
|             reportIds:[], | ||||
|             declareDescription: "", | ||||
|             fileList: [], | ||||
|           }; | ||||
|           this.rulesList = []; | ||||
|     }, | ||||
|     //批量审核 | ||||
|     batchAduit(){ | ||||
|         this.isBatch=true; | ||||
|         this.rowInfo.status=0; | ||||
|         this.dialog.visibleDetail = true; | ||||
|         this.getRules('1') | ||||
|     }, | ||||
|     getRowDetail(row){ | ||||
|          this.instance.post(`/app/appvillagerintegraldeclare/queryDetailById`, null, { | ||||
|           params: { | ||||
|               id:row.id | ||||
|           }, | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|               this.rowInfo = {...res.data} | ||||
|               this.dialog.visibleDetail = true; | ||||
|               this.dialogDetail.aduitIds=[]; | ||||
|               this.dialogDetail.aduitIds.push(row.id); | ||||
|  | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     toEdit(row) { | ||||
|         this.isBatch=false; | ||||
|         this.getRowDetail(row); | ||||
|         this.getRules('1') | ||||
|     }, | ||||
|     changeDoType(val){ | ||||
|         this.dialogDetail.ruleId=""; | ||||
|         this.dialogDetail.ruleName = ""; | ||||
|         this.dialogDetail.doIntegral = ""; | ||||
|         this.placeholder = '请输入...'; | ||||
|         this.$refs.rules.clearValidate(); | ||||
|         this.getRules(val) | ||||
|     }, | ||||
|     ruleChange(val){ | ||||
|         let item = this.rulesList.find(e => e.id == val); | ||||
|         this.dialogDetail.doIntegral=''; | ||||
|         this.$refs.rules.clearValidate(); | ||||
|         if(item){ | ||||
|           //固定区间 | ||||
|             this.dialogDetail.ruleName = item.ruleName; | ||||
|             if(item.integralValueType==0){ | ||||
|                 this.dialogDetail.doIntegral = Math.abs(item.integral); | ||||
|                 this.integralEdit = true; | ||||
|             }else{ | ||||
|                 this.integralEdit = false; | ||||
|                 if(Math.abs(item.integralEnd)>Math.abs(item.integralStart)){ | ||||
|                     this.sectionNum.min = Math.abs(item.integralStart); | ||||
|                     this.sectionNum.max = Math.abs(item.integralEnd); | ||||
|                 }else{ | ||||
|                     this.sectionNum.max = Math.abs(item.integralStart); | ||||
|                     this.sectionNum.min = Math.abs(item.integralEnd); | ||||
|                 } | ||||
|                 this.placeholder = `${this.sectionNum.min}~${this.sectionNum.max}` | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     //事项查询 | ||||
|     getRules(integralType){ | ||||
|         this.instance.post(`/app/appvillagerintegralrule/list`, null, { | ||||
|           params: { | ||||
|               integralType, | ||||
|               size:10000000 | ||||
|           }, | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|               this.rulesList = res.data.records.filter(e=> e.ruleStatus == 1); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     remove(id) { | ||||
|       this.$confirm("确定删除该公文及其相关的流转信息?").then(() => { | ||||
|         this.instance | ||||
|           .post(`/app/appofficialdocumentinfo/delete?ids=${id}`) | ||||
|           .then((res) => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success("删除成功!"); | ||||
|               this.getList(); | ||||
|             } | ||||
|           }); | ||||
|       }); | ||||
|     }, | ||||
|     onReset() { | ||||
|       Object.keys(this.search).forEach(e => { | ||||
|           this.search[e] = ""; | ||||
|       }); | ||||
|       this.search.declareTimeStart = null; | ||||
|       this.search.declareTimeEnd = null; | ||||
|       this.getList(); | ||||
|     }, | ||||
|  | ||||
|     onAdd() { | ||||
|       this.dialog.visibleAdd = true; | ||||
|     }, | ||||
|  | ||||
|     onConfirm(formName) { | ||||
|       this.$refs[formName].validate(v =>{ | ||||
|          if(v){ | ||||
|             this.instance.post("/app/appvillagerintegraldeclare/aduit", { | ||||
|                         ...this.dialogDetail, | ||||
|                 }, null).then(res => { | ||||
|                   if (res.code==0) { | ||||
|                       this.dialog.visibleDetail=false; | ||||
|                       this.$message.success("提交成功!"); | ||||
|                       this.dialogDetail.aduitIds=[]; | ||||
|                       this.getList(); | ||||
|                   } | ||||
|             }) | ||||
|          }else{ | ||||
|             return false | ||||
|          } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|  | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .pointsDeclaration { | ||||
|   height: 100%; | ||||
|   overflow: auto; | ||||
|   background: #f3f6f9; | ||||
|   .times_div{ | ||||
|         .times{ | ||||
|             display: block; | ||||
|             width: 72px; | ||||
|             height: 30px; | ||||
|             line-height: 30px; | ||||
|             text-align: center; | ||||
|             background: #F5F5F5; | ||||
|             border-radius: 2px 0px 0px 2px; | ||||
|             border: 1px solid #D0D4DC; | ||||
|             font-size: 14px; | ||||
|             color:#666666; | ||||
|         } | ||||
|     } | ||||
|   .form_content{ | ||||
|     border-bottom:1px solid #eee; | ||||
|     .form_flex{ | ||||
|       display: flex; | ||||
|       div{ | ||||
|         flex: 1; | ||||
|       } | ||||
|     } | ||||
|     .form_info{ | ||||
|       margin-bottom: 8px; | ||||
|     } | ||||
|     .form_label{ | ||||
|       display: inline-block; | ||||
|       color: #999; | ||||
|       vertical-align: top; | ||||
|     } | ||||
|     .form_value{ | ||||
|       display: inline-block; | ||||
|       color: #333; | ||||
|       width: calc(100% - 80px); | ||||
|     } | ||||
|   } | ||||
|   .form_div{ | ||||
|     padding-top:24px; | ||||
|   } | ||||
|   .status-0 { | ||||
|     color: #ff8822; | ||||
|   } | ||||
|  | ||||
|   .status-1 { | ||||
|     color: #2266ff; | ||||
|   } | ||||
|  | ||||
|   .status-2 { | ||||
|     color: #999999; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -1,265 +0,0 @@ | ||||
| <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.familyName" | ||||
|               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" | ||||
|           ref="aitableex" | ||||
|           :current.sync="search.current" | ||||
|           :size.sync="search.size" | ||||
|           @getList="getList"> | ||||
|           <el-table-column slot="changeIntegral" label="积分" align= "center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{row.changeIntegral > 0 ? '+' : ''}}{{row.changeIntegral}}</span> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="doType" label="类型" align= "center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <span>{{ dict.getLabel('integralDetailType', row.bizType) }}</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.visible" | ||||
|       :customFooter="true" | ||||
|       :destroyOnClose="true" | ||||
|       width="720px" | ||||
|     > | ||||
|       <div class="form_content"> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">户主:</span> | ||||
|           <span class="form_value">{{dialogInfo.familyName}}</span> | ||||
|         </div> | ||||
|         <div class="form_info"> | ||||
|           <span class="form_label">事项:</span> | ||||
|           <span class="form_value">{{dialogInfo.ruleName}}</span> | ||||
|         </div> | ||||
|         <div class="form_flex form_info"> | ||||
|           <div> | ||||
|             <span class="form_label">积分:</span> | ||||
|             <span class="form_value">{{dialogInfo.changeIntegral >= 0 ? '增加' : '减少'}}<span style="color:#2266FF">{{Math.abs(dialogInfo.changeIntegral)}}</span>分</span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="dialog-footer" slot="footer"> | ||||
|         <el-button @click="dialog.visible=false" size="medium">关闭</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, | ||||
|         familyName: '', | ||||
|         doTimeStart: null, | ||||
|         doTimeEnd: null | ||||
|       }, | ||||
|       total: 10, | ||||
|       colConfigs: [ | ||||
|         { prop: "residentName", label: "对象", width:160 }, | ||||
|         { prop: "familyName", label: "户主", align: "center", width:160 }, | ||||
|         { | ||||
|           prop: "ruleName", | ||||
|           label: "事件类型", | ||||
|           "show-overflow-tooltip": true, | ||||
|           width:420 | ||||
|         }, | ||||
|         { | ||||
|           prop: "doTime", | ||||
|           label: "时间", | ||||
|           width:200 | ||||
|         }, | ||||
|         // { | ||||
|         //   prop: "doType", | ||||
|         //   label: "类型", | ||||
|         //   align: "center", | ||||
|         //   width: 100, | ||||
|         //   render: (h, params) => { | ||||
|         //     return h( | ||||
|         //       "span", | ||||
|         //       { | ||||
|         //         class: "status-" + params.row.doType, | ||||
|         //       }, | ||||
|         //       this.$dict.getLabel("integralIntegralType", params.row.doType) | ||||
|         //     ); | ||||
|         //   }, | ||||
|         // }, | ||||
|         { slot: "doType", label: "类型", width: 100}, | ||||
|         { slot: "changeIntegral", label: "积分", width: 100}, | ||||
|         // { | ||||
|         //   prop: "bizType", | ||||
|         //   label: "途径", | ||||
|         //   align: "center", | ||||
|         //   width: 100, | ||||
|         //   formart: (bizType) => | ||||
|         //   this.$dict.getLabel("integralDetailBizType", bizType) || '-', | ||||
|         // }, | ||||
|         { slot: "options", label: "操作", align: "center" }, | ||||
|       ], | ||||
|       tableData: [], | ||||
|       dialog: { | ||||
|         visible: false, | ||||
|       }, | ||||
|       dialogInfo: {}, | ||||
|     }; | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.$dict | ||||
|       .load([ | ||||
|         "integralDeclareDoType", | ||||
|         "integralDetailType", | ||||
|       ]) | ||||
|       .then(() => { | ||||
|         this.getList(); | ||||
|       }); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance | ||||
|         .post(`/app/appvillagerintegraldetail/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             areaId: this.areaId, | ||||
|           }, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             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.visible = true | ||||
|       this.instance.post(`/app/appvillagerintegraldetail/queryDetailById?id=${row.id}`, null, {}).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.dialogInfo = res.data | ||||
|             console.log(this.dialogInfo) | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     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> | ||||
		Reference in New Issue
	
	Block a user