279 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
|   <section class="AppWhereabouts">
 | ||
|     <ai-list>
 | ||
|       <ai-title slot="title" title="工作去向" isShowBottomBorder/>
 | ||
| 
 | ||
|       <template #custom>
 | ||
|         <el-row type="flex" class="staDataPane">
 | ||
|           <div class="boxItem" v-for="(op,i) in staData" :key="i">
 | ||
|             <div>{{ op.name }}</div>
 | ||
|             <b>{{ op.v1 }}</b>
 | ||
|           </div>
 | ||
|         </el-row>
 | ||
| 
 | ||
|         <div class="mainPane">
 | ||
|           <ai-search-bar>
 | ||
|             <template #left>
 | ||
|               <!--              <el-select v-model="search.village" placeholder="请选择联村" size="small"-->
 | ||
|               <!--                         @change="page.current=1,getTableData()" clearable>-->
 | ||
|               <!--                <el-option v-for="(op,i) in dict.getDict('villageCadresDirectionArea')" :key="i" :label="op.dictName"-->
 | ||
|               <!--                           :value="op.dictValue"/>-->
 | ||
|               <!--              </el-select>-->
 | ||
|               <ai-select placeholder="请选择工作去向" v-model="search.direction"
 | ||
|                          :selectList="dict.getDict('villageCadresDirectionChoice')"
 | ||
|                          @change="page.current=1,getTableData()"/>
 | ||
|             </template>
 | ||
|             <template #right>
 | ||
|               <el-input suffix-icon="iconfont iconSearch" v-model="search.name" placeholder="姓名/手机号码" clearable
 | ||
|                         @change="page.current=1,getTableData()" size="small"/>
 | ||
|             </template>
 | ||
|           </ai-search-bar>
 | ||
| 
 | ||
|           <ai-search-bar>
 | ||
|             <template #left>
 | ||
|               <el-button type="primary" icon="iconfont iconAdd" size="small" @click="dialog=true">添加</el-button>
 | ||
|               <el-button icon="iconfont iconDelete" size="small" @click="handleDelete()" :disabled="ids.length==0">删除
 | ||
|               </el-button>
 | ||
|             </template>
 | ||
|             <template #right>
 | ||
|               <ai-import :instance="instance" :dict="dict" type="appvillagecadresdirection" name="工作去向"
 | ||
|                          @success="getTableData()">
 | ||
|                 <el-button icon="iconfont iconImport">导入</el-button>
 | ||
|               </ai-import>
 | ||
|               <ai-download :instance="instance" url="/app/appvillagecadresdirection/listExport" :params="params"
 | ||
|                            fileName="工作去向数据导出"/>
 | ||
|             </template>
 | ||
|           </ai-search-bar>
 | ||
| 
 | ||
|           <ai-table :tableData="tableData" :colConfigs="colConfigs" :total="page.total"
 | ||
|                     @selection-change="v=>ids=v.map(e=>e.id)"
 | ||
|                     :current.sync="page.current" :size.sync="page.size" @getList="getTableData">
 | ||
|             <el-table-column slot="options" label="操作" align="center">
 | ||
|               <div class="tableOptions" slot-scope="{row}">
 | ||
|                 <el-button type="text" @click="editItem(row)">编辑</el-button>
 | ||
|                 <el-button type="text" @click="handleDelete(row.id)">删除</el-button>
 | ||
|               </div>
 | ||
|             </el-table-column>
 | ||
|           </ai-table>
 | ||
|         </div>
 | ||
|       </template>
 | ||
|     </ai-list>
 | ||
| 
 | ||
| 
 | ||
|     <ai-dialog :visible.sync="dialog" title="工作去向" @closed="form={},getTableData(),getStaData()"
 | ||
|                @onConfirm="submitForm" @opened="$refs.WhereaboutsConfigForm.clearValidate()">
 | ||
|       <el-form size="small" ref="WhereaboutsConfigForm" :model="form" :rules="rules" label-suffix=":"
 | ||
|                label-width="100px">
 | ||
|         <el-row type="flex" class="WhereaboutsConfigForm" justify="space-between">
 | ||
|           <el-form-item v-for="(op,i) in colConfigs.slice(1,9)" :key="i" v-bind="op" style="width: 48%">
 | ||
| 
 | ||
|             <!--            <el-select v-if="op.prop=='village'" v-model="form[op.prop]" placeholder="请选择联村" clearable multiple>-->
 | ||
|             <!--              <el-option v-for="(op,i) in dict.getDict('villageCadresDirectionArea')" :key="i" :label="op.dictName"-->
 | ||
|             <!--                         :value="op.dictValue"/>-->
 | ||
|             <!--            </el-select>-->
 | ||
|             <ai-select v-if="op.prop=='direction'" placeholder="请选择工作去向" v-model="form[op.prop]"
 | ||
|                        :selectList="dict.getDict('villageCadresDirectionChoice')"/>
 | ||
|             <el-input v-else v-model="form[op.prop]" placeholder="请输入"/>
 | ||
|           </el-form-item>
 | ||
|         </el-row>
 | ||
|       </el-form>
 | ||
|     </ai-dialog>
 | ||
|   </section>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| export default {
 | ||
|   name: "AppWhereabouts",
 | ||
|   label: "工作去向",
 | ||
|   props: {
 | ||
|     instance: Function,
 | ||
|     dict: Object,
 | ||
|     permissions: Function
 | ||
|   },
 | ||
|   computed: {
 | ||
|     colConfigs() {
 | ||
|       const required = true
 | ||
|       return [
 | ||
|         {type: "selection"},
 | ||
|         {label: "姓名", prop: "name", align: "center", required},
 | ||
|         {
 | ||
|           label: "联村", prop: "village", align: "center", required,
 | ||
|           render: (h, {row}) => h('span', null, row?.village?.split(",")
 | ||
|           ?.map(e => this.dict.getLabel("villageCadresDirectionArea", e)).join(","))
 | ||
|         },
 | ||
|         {label: "联系片", prop: "connect", align: "center"},
 | ||
|         {label: "包保网络", prop: "net", align: "center"},
 | ||
|         {label: "手机号码", prop: "phone", align: "center", required},
 | ||
|         {label: "备注", prop: "remark", align: "center"},
 | ||
|         {
 | ||
|           label: "工作去向", prop: "direction", align: "center", required,
 | ||
|           render: (h, {row}) => h('span', null, this.dict.getLabel("villageCadresDirectionChoice", row?.direction))
 | ||
|         },
 | ||
|         {label: "排序编号", prop: "sort", align: "center"},
 | ||
|         {slot: "options"},
 | ||
|       ]
 | ||
|     },
 | ||
|     params() {
 | ||
|       let params = {}
 | ||
|       //导出搜索条件
 | ||
|       if (this.ids.length) {
 | ||
|         params = {
 | ||
|           ...params,
 | ||
|           ids: this.ids
 | ||
|         }
 | ||
|       } else {
 | ||
|         params = {
 | ||
|           ...params,
 | ||
|           ...this.search
 | ||
|         }
 | ||
|       }
 | ||
|       return params
 | ||
|     },
 | ||
|     formConfigs() {
 | ||
|       return this.colConfigs.slice(1, 9).map(e => ({
 | ||
|         ...e, comp: ['village', 'direction'].includes(e.prop) ? 'select' : 'input'
 | ||
|       }))
 | ||
|     },
 | ||
|     rules() {
 | ||
|       let rules = {}
 | ||
|       //调整columns要慎重
 | ||
|       this.formConfigs.filter(e => e.required).map(e => {
 | ||
|         rules[e.prop] = [
 | ||
|           {message: `请${e.comp == 'select' ? '选择' : '输入'}${e.label}`, required: true}
 | ||
|         ]
 | ||
|         if (e.prop == 'phone') {
 | ||
|           rules[e.prop]?.push({pattern: /^1[1356789][0-9]\d{8}$/, message: '手机格式有误!'})
 | ||
|         }
 | ||
|       })
 | ||
|       return rules
 | ||
|     }
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       staData: [],
 | ||
|       search: {name: null, direction: null, village: null},
 | ||
|       page: {size: 10, current: 1, total: 0},
 | ||
|       dialog: false,
 | ||
|       tableData: [],
 | ||
|       form: {},
 | ||
|       ids: []
 | ||
|     }
 | ||
|   },
 | ||
|   methods: {
 | ||
|     getStaData() {
 | ||
|       this.instance.post("/app/appvillagecadresdirection/queryDataStatistics").then(res => {
 | ||
|         if (res?.data) {
 | ||
|           this.staData = res.data
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     getTableData() {
 | ||
|       this.instance.post("/app/appvillagecadresdirection/list", null, {
 | ||
|         params: {...this.search, ...this.page}
 | ||
|       }).then(res => {
 | ||
|         if (res?.data) {
 | ||
|           this.tableData = res.data.records
 | ||
|           this.page.total = res.data.total
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     submitForm() {
 | ||
|       this.$refs.WhereaboutsConfigForm.validate(v => {
 | ||
|         if (v) {
 | ||
|           this.instance.post("/app/appvillagecadresdirection/addOrUpdate", {
 | ||
|             ...this.form
 | ||
|           }).then(res => {
 | ||
|             if (res?.code == 0) {
 | ||
|               this.$message.success("提交成功!")
 | ||
|               this.dialog = false
 | ||
|             }
 | ||
|           })
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     handleDelete(id) {
 | ||
|       this.$confirm("是否删除该联村镇干?").then(() => {
 | ||
|         this.instance.post("/app/appvillagecadresdirection/delete", null, {
 | ||
|           params: {ids: id || this.ids.join(",")}
 | ||
|         }).then(res => {
 | ||
|           if (res?.code == 0) {
 | ||
|             this.$message.success("删除成功!")
 | ||
|             this.getTableData()
 | ||
|             this.getStaData()
 | ||
|           }
 | ||
|         })
 | ||
|       }).catch(() => 0)
 | ||
|     },
 | ||
|     editItem(row) {
 | ||
|       this.dialog = true
 | ||
|       this.form = JSON.parse(JSON.stringify({...row}))
 | ||
|     }
 | ||
|   },
 | ||
|   created() {
 | ||
|     this.dict.load("villageCadresDirectionChoice", "villageCadresDirectionArea")
 | ||
|     this.getStaData()
 | ||
|     this.getTableData()
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
| .AppWhereabouts {
 | ||
|   height: 100%;
 | ||
| 
 | ||
|   ::v-deep .ai-list__content {
 | ||
|     padding: 0 16px 16px !important;
 | ||
|     box-sizing: border-box;
 | ||
| 
 | ||
|     .ai-list__content--wrapper {
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
|       gap: 10px;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   ::v-deep .staDataPane {
 | ||
|     width: 100%;
 | ||
|     gap: 16px;
 | ||
|     padding-top: 16px;
 | ||
| 
 | ||
|     .boxItem {
 | ||
|       flex: 1;
 | ||
|       min-width: 0;
 | ||
|       height: 64px;
 | ||
|       display: flex;
 | ||
|       justify-content: space-between;
 | ||
|       align-items: center;
 | ||
|       padding: 0 16px;
 | ||
|       font-size: 14px;
 | ||
|       color: #333;
 | ||
|       border: 1px solid #eee;
 | ||
|       background: #fff;
 | ||
| 
 | ||
|       b {
 | ||
|         font-size: 20px;
 | ||
|         font-family: DINAlternate-Bold, DINAlternate, serif;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   ::v-deep .mainPane {
 | ||
|     background: #fff;
 | ||
|     border: 1px solid #eee;
 | ||
|     padding: 12px 16px;
 | ||
|   }
 | ||
| 
 | ||
|   .WhereaboutsConfigForm {
 | ||
|     flex-wrap: wrap;
 | ||
| 
 | ||
|     .el-select {
 | ||
|       width: 100%;
 | ||
| 
 | ||
|       ::v-deep .el-tag__close.el-icon-close {
 | ||
|         background: transparent;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </style>
 |