| <template> | 
|   <GlobalWindow | 
|     :title="title" | 
|     width="50%" | 
|     :visible.sync="visible" | 
|     :confirm-working="isWorking" | 
|     @confirm="confirm" | 
|   > | 
|     <p class="tip-warn"><i class="el-icon-warning"></i>操作说明:<br> | 
|       1.请按需配置推送规则,配送多个规则时,即为多个规则满足时才推送;<br> | 
|       2.发生区域非必填,不填则表示该规则下所有区域的相应报警类型均通知;<br> | 
|     </p> | 
|     <el-form :model="form" ref="form" :rules="rules"> | 
|       <el-form-item label="选择签到通知人员" prop="memberIds" style="margin-bottom: 30px" > | 
|         <el-select v-model="memberSelect" filterable multiple clearable  placeholder="请选择" @change="changeMembers"> | 
|           <el-option v-for="item in memberList" :key="'member_'+item.id" :label="item.name+'-'+item.companyName" :value="item.id+''"> | 
|           </el-option> | 
|         </el-select> | 
|       </el-form-item> | 
|       <div style="display: flex;" v-for="(item,index) in form.detailList" :key="'region_'+item.random" > | 
|         <span style="line-height: 32px;font-size: 14px;"><b style="color: #F56C6C;margin-right: 4px;font-size: 11px;">*</b>{{'规则'+(index +1)}}</span> | 
|         <el-form-item label=""   style="display: inline-block;margin-left: 10px; " > | 
|           <el-select v-model="item.warningId" filterable      placeholder="请选择报警类型"    > | 
|             <el-option v-for="item in warningList"   :label="item.name" :value="item.id">  </el-option> | 
|           </el-select> | 
|         </el-form-item> | 
|         <el-form-item label=""  style="display: inline-block;margin-left: 10px"> | 
| <!--          <el-select v-model="item.regionId" filterable multiple clearable  placeholder="请选择发生区域" > | 
|             <el-option v-for="item in regionList" :key="item.id" :label="item.name" :value="item.id"> | 
|             </el-option> | 
|           </el-select>--> | 
|           <treeselect | 
|               style="width: 200px;height:32px;display: inline-block" | 
|               @input="changeSel(index)" | 
|               v-model="item.regionId" | 
|               placeholder="请选择发生区域" | 
|               :options="regionList" | 
|               :normalizer="normalizeOptions" | 
|               :default-expand-level="1" | 
|               noChildrenText="没有子选项" | 
|               noOptionsText="没有可选项" | 
|               noResultsText="没有匹配的结果" /> | 
|         </el-form-item> | 
|         <el-button type="danger" style="margin-left: 10px;height: 32px; " @click="delDo(index)" v-if="index>0 || form.detailList.length>1">删除</el-button> | 
|       </div> | 
|       <el-button type="primary" style="margin-left: 10px;margin-bottom: 20px;" @click="addDo">增加规则</el-button> | 
|       <el-form-item label="状态" prop="status"> | 
|         <el-radio-group v-model="form.status"> | 
|           <el-radio :label="0" :value="0">禁用</el-radio> | 
|           <el-radio :label="1" :value="1">启用</el-radio> | 
|         </el-radio-group> | 
|       </el-form-item> | 
|       <el-form-item label="发生间隔时间(秒)" prop="intervalSec"> | 
|         <el-input type="number" v-model="form.intervalSec" placeholder="请输入多规则间隔时间(秒)" v-trim/> | 
|       </el-form-item> | 
|     </el-form> | 
|   </GlobalWindow> | 
| </template> | 
|   | 
| <script> | 
| import BaseOpera from '@/components/base/BaseOpera' | 
| import GlobalWindow from '@/components/common/GlobalWindow' | 
| import { allList } from '@/api/business/member' | 
| import { allList as warningList, regionList } from '@/api/business/warning' | 
| export default { | 
|   name: 'OperaWarningRuleWindow', | 
|   extends: BaseOpera, | 
|   components: { GlobalWindow }, | 
|   data () { | 
|     return { | 
|       // 表单数据 | 
|       form: { | 
|         id: null, | 
|         memberIds: '', | 
|         intervalSec: '', | 
|         sortnum: '', | 
|         status: 0, | 
|         detailList: [{ random:Math.random(),regionId: null, regionName: null, regionCode: null ,warningId:null}] | 
|       }, | 
|       memberSelect: [], | 
|       memberList: [], | 
|       warningList: [], | 
|       regionList: [], | 
|       // 验证规则 | 
|       rules: { | 
|         memberIds: [{ required: true, message: '请选择通知人员', tigger: 'blur' }], | 
|         status: [{ required: true, message: '请选择状态'}] | 
|       } | 
|     } | 
|   }, | 
|   created () { | 
|     this.config({ | 
|       api: '/business/warningRule', | 
|       'field.id': 'id' | 
|     }) | 
|   }, | 
|   methods: { | 
|     normalizeOptions (node) { | 
|       if (!node.childList || !node.childList.length) { | 
|         // 去掉children=[]的children属性 | 
|         delete node.childList | 
|       } | 
|       return { | 
|         id: node.indexCode, | 
|         label: node.name, | 
|         children: node.childList | 
|       } | 
|     }, | 
|     changeSel(opt){ | 
|       var item = this.form.detailList[opt] | 
|       this.form.detailList[opt].regionCode = null | 
|       this.form.detailList[opt].regionName = null | 
|       if(item.regionId){ | 
|         var reg = this.getSelectedObject(item.regionId) | 
|         if(reg){ | 
|           this.form.detailList[opt].regionCode = reg.indexCode | 
|           this.form.detailList[opt].regionName = reg.name | 
|         } | 
|       } | 
|       console.log(" this.form.detailList[opt]",reg, this.form.detailList[opt]) | 
|     }, | 
|     getSelectedObject(id) { | 
|       if (!id) { | 
|         return null  // 没有选中项时返回 null 或 {} 根据需要处理 | 
|       } | 
|       const findSelected = (options) => { | 
|         for (const option of options) { | 
|           if (option.indexCode === id) { | 
|             return option // 返回匹配的完整对象 | 
|           } else if (option.childList && option.childList.length > 0) { | 
|             const found = findSelected(option.childList) // 递归搜索子选项 | 
|             if (found) return found // 如果找到返回该对象 | 
|           } | 
|         } | 
|         return null; // 未找到返回 null 或 {} 根据需要处理 | 
|       } | 
|       return findSelected(this.regionList); // 开始搜索并返回结果 | 
|     }, | 
|     addDo () { | 
|       this.form.detailList.push({random:Math.random(), regionId: null, regionName: null, regionCode: null,warningId:null }) | 
|     }, | 
|     delDo (index) { | 
|       if (this.form.detailList.length > 1 && this.form.detailList.length > index) { | 
|         this.form.detailList.splice(index, 1) | 
|       } | 
|     }, | 
|     changeMembers () { | 
|       console.log(this.memberSelect) | 
|       this.form.memberIds = '' | 
|       if (!this.memberSelect || !this.memberSelect.length) { | 
|         return | 
|       } | 
|       this.form.memberIds = this.memberSelect.join(',') | 
|     }, | 
|     open (title, target) { | 
|       this.memberSelect =[] | 
|       this.title = title | 
|       this.loadMember() | 
|       this.loadRegions() | 
|       this.loadWarning() | 
|       this.visible = true | 
|       this.form = { | 
|         id: null, | 
|         memberIds: '', | 
|         intervalSec: '', | 
|         sortnum: '', | 
|         status: 0, | 
|         detailList: [{ random:Math.random(),regionId: null, regionName: null, regionCode: null,warningId:null }] | 
|       } | 
|       // 新建 | 
|       if (target == null) { | 
|         this.$nextTick(() => { | 
|           this.$refs.form.resetFields() | 
|           this.form[this.configData['field.id']] = null | 
|         }) | 
|         return | 
|       } | 
|       // 编辑 | 
|       this.$nextTick(() => { | 
|         for (const key in this.form) { | 
|           this.form[key] = target[key] | 
|         } | 
|         if (!this.form.detailList || !this.form.detailList.length) { | 
|           this.form.detailList = [{ random:Math.random(),regionId: null, regionName: null, regionCode: null,warningId:null }] | 
|         } | 
|         if(this.form.memberIds){ | 
|           this.memberSelect = this.form.memberIds.split(",") | 
|         } | 
|       }) | 
|     }, | 
|     loadMember () { | 
|       allList({ | 
|         type: 2 | 
|       }).then(res => { | 
|         this.memberList = res | 
|       }) | 
|     }, | 
|     loadWarning () { | 
|       warningList({ | 
|       }).then(res => { | 
|         this.warningList = res | 
|       }) | 
|     }, | 
|     loadRegions () { | 
|       regionList({ | 
|       }).then(res => { | 
|         this.regionList = res | 
|       }) | 
|     } | 
|   } | 
| } | 
| </script> | 
| <style scoped lang="scss"> | 
| .inline { | 
|   width: 178px; | 
| } | 
| .vue-treeselect { | 
|   line-height: 30px; | 
|   ::v-deep .vue-treeselect__control { | 
|     height: 32px; | 
|     .vue-treeselect__single-value { | 
|       line-height: 30px; | 
|     } | 
|   } | 
| } | 
| </style> |