newAddPlan.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923
  1. <template>
  2. <div class="newAddPlan">
  3. <div class="newAddPlan-title-box">
  4. <p>定制预案</p>
  5. <p class="add-button-two-90" @click="backButton">返回</p>
  6. <!--<p class="inquire-button-one" @click="upDataButton(1)">不关联仅保存</p>-->
  7. <p class="inquire-button-one" @click="associatedDialogClick">关联实验室</p>
  8. </div>
  9. <div class="plan-for-max-box scrollbar-box">
  10. <el-form :model="form" ref="form" :rules="rules" :inline="true" label-width="90px" class="form-box">
  11. <div class="plan-for-max-box-name-box">
  12. <el-form-item label="预案名称:" prop="name" style="margin:40px 0;">
  13. <el-input
  14. v-model="form.name"
  15. placeholder="请输入预案名称"
  16. size="small"
  17. maxLength="15"
  18. :disabled="inputType"
  19. />
  20. </el-form-item>
  21. <p v-if="inputType" class="plan-for-max-box-name-button-one add-button-two-90" @click="setNameButton(1)">编辑</p>
  22. <p v-if="!inputType" class="plan-for-max-box-name-button-two reset-button-one" @click="setNameButton(2)">取消</p>
  23. <p v-if="!inputType" class="plan-for-max-box-name-button-three add-button-two-90" @click="setNameButton(3)">保存</p>
  24. </div>
  25. <div class="for-plan-box" v-for="(item,index) in form.labRiskPlanLevels" :key="index">
  26. <p class="position-title-type" :class="item.riskPlanLevel==1?'type-color-a':(item.riskPlanLevel==2?'type-color-b':(item.riskPlanLevel==3?'type-color-c':(item.riskPlanLevel==4?'type-color-d':'')))">
  27. {{item.riskPlanLevel==1?'低风险':(item.riskPlanLevel==2?'中风险':(item.riskPlanLevel==3?'较高风险':(item.riskPlanLevel==4?'高风险':'')))}}
  28. </p>
  29. <div class="for-plan-img-box">
  30. <p class="for-plan-img-null-p"></p>
  31. <div class="for-plan-img-box-big">
  32. <div class="for-plan-img-box-one" v-if="item.ifExit == 1">
  33. <img src="@/assets/ZDimages/evacuation3_2/img_dzya_ldss.png">
  34. <p>联动疏散</p>
  35. </div>
  36. <!--<div class="for-plan-img-box-two">-->
  37. <!--<img src="@/assets/ZDimages/evacuation3_2/img_dzya_hzyj.png">-->
  38. <!--<p>火灾预案</p>-->
  39. <!--</div>-->
  40. </div>
  41. <p class="for-plan-img-null-p"></p>
  42. </div>
  43. <div class="min-for-text-box">
  44. <div>
  45. <div class="min-for-text-box-one" v-for="(minItemOne,minIndexOne) in item.riskPlanSensorList" :key="minItemOne.sensorType">
  46. <div>
  47. <p>启动条件:<span v-for="(sensorItem,sensorIndex) in sensorList" :key="'sensor'+sensorIndex" v-if="sensorItem.hardwareTypeCode == minItemOne.sensorType">{{sensorItem.hardwareTypeName}}</span></p>
  48. <p>监测区间:{{minItemOne.minMonitor}}-{{minItemOne.maxMonitor}}</p>
  49. </div>
  50. </div>
  51. </div>
  52. <div>
  53. <div class="min-for-text-box-two" v-for="(minItemTwo,minIndexTwo) in item.riskPlanHardwareList" :key="minIndexTwo">
  54. <div v-for="(hardwareItem,hardwareIndex) in hardwareList" :key="hardwareIndex" v-if="hardwareItem.hardwareTypeEnum.code == minItemTwo.hardwareType">
  55. <p>执行动作:{{hardwareItem.hardwareTypeEnum.hardwareTypeName}}</p>
  56. <p>执行办法:<span v-for="(functionItem,functionIndex) in hardwareItem.functionStatusList" :key="functionIndex" v-if="functionItem.code == minItemTwo.operate">{{functionItem.code == 0?'关闭':'开启'}}</span></p>
  57. <p>结束操作:<span v-for="(functionItem,functionIndex) in hardwareItem.functionStatusList" :key="functionIndex" v-if="functionItem.code == minItemTwo.overAct">{{functionItem.code == 0?'关闭':'开启'}}</span></p>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. <div class="for-button-max-box">
  63. <div @click="buttonClick(2,item,index)">
  64. <img src="@/assets/ZDimages/evacuation3_2/icon_znwl_bj.png">
  65. <p>编辑</p>
  66. </div>
  67. <div @click="buttonClick(3,item,index)">
  68. <img src="@/assets/ZDimages/evacuation3_2/icon_znwl_sc.png">
  69. <p>删除</p>
  70. </div>
  71. </div>
  72. </div>
  73. </el-form>
  74. <div class="plan-for-max-button-box">
  75. <p class="plan-for-max-button-null"></p>
  76. <p class="plan-for-max-button" v-if="!form.labRiskPlanLevels[3]" @click="buttonClick(1)">+ 新增预案规则</p>
  77. <p class="plan-for-max-button-null"></p>
  78. </div>
  79. </div>
  80. <el-dialog :title='dialogTitle' v-if="dialogOpen" :visible.sync="dialogOpen" width="800px">
  81. <div class="scrollbar-box" style="height:600px;">
  82. <el-form :model="dialogForm" ref="dialogForm" :rules="rules" label-width="100px">
  83. <el-form-item label="预案等级:" prop="riskPlanLevel">
  84. <el-radio-group v-model="dialogForm.riskPlanLevel" style="width:500px;">
  85. <el-radio :label="1">低风险</el-radio>
  86. <el-radio :label="2">中风险</el-radio>
  87. <el-radio :label="3">较高风险</el-radio>
  88. <el-radio :label="4">高风险</el-radio>
  89. </el-radio-group>
  90. </el-form-item>
  91. <div style="display: flex">
  92. <el-form-item label="执行疏散:" prop="ifExit">
  93. <el-radio-group v-model="dialogForm.ifExit" style="width:500px;">
  94. <el-radio :label="0">否</el-radio>
  95. <el-radio :label="1">是</el-radio>
  96. </el-radio-group>
  97. </el-form-item>
  98. <!--<el-form-item label="火灾预案:" prop="name" style="margin-left:220px;">-->
  99. <!--<el-radio-group v-model="dialogForm.type3">-->
  100. <!--<el-radio :label="1">否</el-radio>-->
  101. <!--<el-radio :label="2">是</el-radio>-->
  102. <!--</el-radio-group>-->
  103. <!--</el-form-item>-->
  104. </div>
  105. <div style="border-top:1px solid #e0e0e0;">
  106. <p style="line-height:60px;font-size:14px;margin-left:19px;">启动条件:</p>
  107. <div style="display: flex" v-for="(item,index) in dialogForm.riskPlanSensorList" :key="index">
  108. <div style="flex:1;">
  109. <el-form-item label="监测设备:" :prop="'riskPlanSensorList.'+index+'.sensorType'" :rules="rules.sensorType">
  110. <el-select v-model="item.sensorType" placeholder="请选择监测设备" @change="(val)=>sensorChange(val,index)">
  111. <el-option
  112. v-for="item in sensorList"
  113. :key="item.hardwareTypeCode"
  114. :label="item.hardwareTypeName"
  115. :value="item.hardwareTypeCode">
  116. </el-option>
  117. </el-select>
  118. </el-form-item>
  119. </div>
  120. <div style="flex:1;display: flex">
  121. <el-form-item label="监测区间:" :prop="'riskPlanSensorList.'+index+'.minMonitor'" :rules="rules.minMonitor">
  122. <el-input-number v-model="item.minMonitor" style="width:90px;" :disabled="item.suoType"
  123. :min="1" :max="99999" :controls="false" placeholder="监测区间"></el-input-number>
  124. </el-form-item>
  125. <p style="width:30px;text-align: center;line-height:40px;">-</p>
  126. <el-form-item label="" :prop="'riskPlanSensorList.'+index+'.maxMonitor'" :rules="rules.maxMonitor" label-width="0">
  127. <el-input-number v-model="item.maxMonitor" style="width:90px;" :disabled="item.suoType"
  128. :min="1" :max="99999" :controls="false" placeholder="监测区间"></el-input-number>
  129. </el-form-item>
  130. <p class="el-icon-delete"
  131. @click="delMinData(1,index)"
  132. style="cursor: pointer;line-height:30px;width:30px;text-align:center;margin:5px 0 0 20px;"></p>
  133. </div>
  134. </div>
  135. <p style="cursor: pointer;width:200px;line-height:30px;border-radius:4px;border: 1px dashed #E0E0E0;color:#333333;text-align: center;margin:20px auto;"
  136. @click="addMinData(1)" :class="dialogForm.riskPlanSensorList.length>8?'add-plan-max-button-color':''">+ 新增监测规则</p>
  137. </div>
  138. <div style="border-top:1px solid #e0e0e0;">
  139. <p style="line-height:60px;font-size:14px;margin-left:19px;">执行动作:</p>
  140. <div style="display: flex" v-for="(item,index) in dialogForm.riskPlanHardwareList" :key="index">
  141. <div style="flex:1;display: flex">
  142. <el-form-item label="执行设备:" :prop="'riskPlanHardwareList.'+index+'.hardwareType'" :rules="rules.hardwareType">
  143. <el-select v-model="item.hardwareType" placeholder="选择执行设备" style="width:130px;" @change="(val)=>controlTypeList(val,index)">
  144. <el-option
  145. v-for="optionItem in hardwareList"
  146. :key="optionItem.hardwareTypeEnum.code"
  147. :label="optionItem.hardwareTypeEnum.hardwareTypeName"
  148. :value="optionItem.hardwareTypeEnum.code">
  149. </el-option>
  150. </el-select>
  151. </el-form-item>
  152. <el-form-item label="执行办法:" :prop="'riskPlanHardwareList.'+index+'.operate'" :rules="rules.operate">
  153. <el-select v-model="item.operate" placeholder="选择执行办法" style="width:130px;">
  154. <el-option
  155. v-for="optionItem in item.hardwareList"
  156. :key="optionItem.code"
  157. :label="optionItem.describe"
  158. :value="optionItem.code">
  159. </el-option>
  160. </el-select>
  161. </el-form-item>
  162. <el-form-item label="结束操作:" :prop="'riskPlanHardwareList.'+index+'.overAct'" :rules="rules.overAct">
  163. <el-select v-model="item.overAct" placeholder="选择结束操作" style="width:130px;">
  164. <el-option
  165. v-for="optionItem in item.hardwareList"
  166. :key="optionItem.code"
  167. :label="optionItem.describe"
  168. :value="optionItem.code">
  169. </el-option>
  170. </el-select>
  171. </el-form-item>
  172. <p class="el-icon-delete"
  173. @click="delMinData(2,index)"
  174. style="cursor: pointer;line-height:30px;width:30px;text-align:center;margin:5px 0 0 20px;"></p>
  175. </div>
  176. </div>
  177. <p style="cursor: pointer;width:200px;line-height:30px;border-radius:4px;border: 1px dashed #E0E0E0;color:#333333;text-align: center;margin:20px auto;"
  178. @click="addMinData(2)" :class="dialogForm.riskPlanHardwareList.length>8?'add-plan-max-button-color':''">+ 新增执行动作</p>
  179. </div>
  180. </el-form>
  181. </div>
  182. <div slot="footer" class="dialog-footer">
  183. <div style="display: flex">
  184. <p style="flex:1;"></p>
  185. <p style="cursor: pointer;border-radius:6px;width:70px;line-height:30px;font-size:12px;text-align:center;margin-right:17px;color:#999999;background:#E0E0E0;" @click="cancel">取消</p>
  186. <p style="cursor: pointer;border-radius:6px;width:70px;line-height:30px;font-size:12px;text-align:center;color:#fff;background:#0045AF;" @click="submitForm">确定</p>
  187. <p style="flex:1;"></p>
  188. </div>
  189. </div>
  190. </el-dialog>
  191. </div>
  192. </template>
  193. <script>
  194. import { listClassifiedAll } from "@/api/laboratory/classified";
  195. import { listClasstypeAll } from "@/api/laboratory/classtype";
  196. import { optionHardware } from "@/api/laboratory/hardware";
  197. import { getSensorList } from "@/api/laboratory/sensor";
  198. import { selectRiskPlanLeveListRiskPlanId,putPlan,planLevelAdd,planLevelPut,planLevelDel,getLabRiskPlanJoinSub } from "@/api/evacuation3_2/index";
  199. export default {
  200. name: "newAddPlan",
  201. props:{
  202. addPlanData:{},
  203. },
  204. data() {
  205. const exportconstvalidateContacts = (rule, value, callback) => {
  206. if(!/^[\u0391-\uFFE5_a-zA-Z0-9]+$/.test(value)) {
  207. callback(new Error("只可输入中文/英文与数字"));
  208. } else {
  209. callback()
  210. }
  211. };
  212. return {
  213. form:{
  214. name:"",
  215. labRiskPlanLevels:[],
  216. },
  217. dialogTitle:'',
  218. dialogIndex:null,
  219. dialogOpen:false,
  220. dialogForm:{},
  221. // 表单校验
  222. rules: {
  223. name: [
  224. { required: true, message: "请输入预案名称", trigger: "change" },
  225. { required: true, message: "请输入预案名称", validator: this.spaceJudgment, trigger: "change" },
  226. { required: true, validator: exportconstvalidateContacts, trigger: "blur" },
  227. ],
  228. riskPlanLevel: [
  229. { required: true, message: "请选择预案等级", trigger: "change" },
  230. ],
  231. ifExit: [
  232. { required: true, message: "请选择是否执行疏散", trigger: "change" },
  233. ],
  234. sensorType: [
  235. { required: true, message: "请选择监测设备", trigger: "change" },
  236. ],
  237. minMonitor: [
  238. { required: true, message: "请选择监测区间", trigger: "blur" },
  239. ],
  240. maxMonitor: [
  241. { required: true, message: "请选择监测区间", trigger: "blur" },
  242. ],
  243. hardwareType: [
  244. { required: true, message: "请选择执行设备", trigger: "change" },
  245. ],
  246. operate: [
  247. { required: true, message: "请选择执行办法", trigger: "change" },
  248. ],
  249. overAct: [
  250. { required: true, message: "请选择结束操作", trigger: "change" },
  251. ],
  252. },
  253. //检测设备列表
  254. options:[{value: '选项1', label: '黄金糕'},{value: '选项1', label: '黄金糕'},],
  255. //选择数据
  256. //传感器
  257. sensorList:[],
  258. sensorListData:[],
  259. //设备
  260. hardwareList:[],
  261. //分类
  262. typeList:[],
  263. //分级
  264. levelList:[],
  265. // 关联实验室本地数据
  266. labSensorHazardRelations:[],
  267. // 新增/编辑时本地数据
  268. labRiskPlanLevels:[],
  269. //名称修改状态锁
  270. inputType:true,
  271. inputName:"",
  272. }
  273. },
  274. created(){
  275. },
  276. mounted(){
  277. this.getOptionData();
  278. },
  279. methods: {
  280. //传感器选中事件
  281. sensorChange(val,index){
  282. let self = this;
  283. for(let i=0;i<self.sensorList.length;i++){
  284. if(self.sensorList[i].hardwareTypeCode == val){
  285. this.$set(self.dialogForm.riskPlanSensorList[index],'funNum',self.sensorList[i].hardwareTypeName);
  286. if(self.sensorList[i].enumName == "FLAME"){
  287. console.log('self.sensorList[i].enumName',self.sensorList[i].enumName)
  288. self.dialogForm.riskPlanSensorList[index].minMonitor = 1;
  289. self.dialogForm.riskPlanSensorList[index].maxMonitor = 2;
  290. self.$set(self.dialogForm.riskPlanSensorList[index],'minMonitor',1);
  291. self.$set(self.dialogForm.riskPlanSensorList[index],'maxMonitor',2);
  292. self.$set(self.dialogForm.riskPlanSensorList[index],'suoType',true);
  293. console.log('self.dialogForm.riskPlanSensorList.riskPlanSensorList',self.dialogForm.riskPlanSensorList)
  294. }else{
  295. self.$set(self.dialogForm.riskPlanSensorList[index],'suoType',false);
  296. }
  297. }
  298. }
  299. },
  300. //修改预案名称
  301. setNameButton(type){
  302. if(type == 1){
  303. this.$set(this,'inputType',false);
  304. this.$set(this,'inputName',this.form.name);
  305. }else if(type == 2){
  306. this.$set(this,'inputType',true);
  307. this.$set(this.form,'name',this.inputName);
  308. }else if(type == 3){
  309. this.$refs["form"].validate(valid => {
  310. if (valid) {
  311. putPlan({ id:this.addPlanData.id, name:this.form.name }).then((response) => {
  312. this.msgSuccess(response.msg)
  313. this.$set(this,'inputType',true);
  314. });
  315. }
  316. })
  317. }
  318. },
  319. //提交
  320. upDataButton(){
  321. this.$refs["form"].validate(valid => {
  322. if (valid) {
  323. if(!this.form.labRiskPlanLevels[0]){
  324. this.msgError('请添加至少一个预案规则')
  325. return
  326. }
  327. setPlanData(this.form).then(response => {
  328. this.msgSuccess(response.msg);
  329. this.$parent.tableClickButton(5);
  330. });
  331. }
  332. })
  333. },
  334. //查询设备功能
  335. controlTypeList(val,index) {
  336. let self = this;
  337. for(let i=0;i<self.hardwareList.length;i++){
  338. if(self.hardwareList[i].hardwareTypeEnum.code == val){
  339. this.$set(self.dialogForm.riskPlanHardwareList[index],'hardwareList',self.hardwareList[i].functionStatusList);
  340. return
  341. }
  342. }
  343. },
  344. //查询传感器/设备下啦列表
  345. getOptionData(){
  346. getSensorList({}).then(response => {
  347. this.sensorList = response.data;
  348. this.sensorListData = JSON.parse(JSON.stringify(response.data))
  349. });
  350. optionHardware({}).then(response => {
  351. this.hardwareList = response.data;
  352. });
  353. listClassifiedAll().then(response=>{
  354. if(response.code==200){
  355. this.levelList=response.data
  356. }
  357. })
  358. listClasstypeAll().then(response=>{
  359. if(response.code==200){
  360. this.typeList=response.data;
  361. }
  362. })
  363. this.selectRiskPlanLeveListRiskPlanId(1);
  364. },
  365. selectRiskPlanLeveListRiskPlanId(type){
  366. selectRiskPlanLeveListRiskPlanId(this.addPlanData.id).then((response) => {
  367. if(type == 1){
  368. this.$set(this.form,'name',this.addPlanData.name);
  369. this.$set(this,'inputType',true);
  370. }
  371. this.$set(this.form,'labRiskPlanLevels',response.data);
  372. });
  373. },
  374. //返回
  375. backButton(){
  376. this.$parent.tableClickButton(5)
  377. },
  378. //实验室关联开关
  379. associatedDialogClick(type){
  380. this.$parent.tableClickButton(1,{id:this.addPlanData.id,type:1,})
  381. },
  382. //查询
  383. onSearch(){
  384. },
  385. //重置
  386. resetForm(){
  387. },
  388. addMinData(type){
  389. if(type == 1){
  390. if(this.dialogForm.riskPlanSensorList.length>8){
  391. this.msgError('新增失败,最多只能新增九条监测规则')
  392. return
  393. }
  394. this.dialogForm.riskPlanSensorList.push({
  395. sensorType:null,
  396. })
  397. }else if(type == 2){
  398. if(this.dialogForm.riskPlanHardwareList.length>8){
  399. this.msgError('新增失败,最多只能新增九条处置规则')
  400. return
  401. }
  402. this.dialogForm.riskPlanHardwareList.push({
  403. hardwareType:null,
  404. operate:null,
  405. overAct:null,
  406. })
  407. }
  408. },
  409. delMinData(type,index){
  410. if(type == 1){
  411. this.dialogForm.riskPlanSensorList.splice(index,1);
  412. }else if (type == 2){
  413. this.dialogForm.riskPlanHardwareList.splice(index,1);
  414. }
  415. },
  416. //提交
  417. submitForm(){
  418. let self = this;
  419. this.$refs["dialogForm"].validate(valid => {
  420. if (valid) {
  421. if(!this.dialogForm.riskPlanSensorList[0]){
  422. this.msgError('请添加至少一个启动条件')
  423. return
  424. }
  425. //提交数据检测条件区间是否重复(dialog本身数据查重)
  426. for(let i=0;i<self.dialogForm.riskPlanSensorList.length;i++){
  427. if(self.dialogForm.riskPlanSensorList[i].minMonitor >= self.dialogForm.riskPlanSensorList[i].maxMonitor){
  428. self.msgError('监测区间数值异常,请重新输入');
  429. return
  430. }
  431. for(let x=0;x<self.dialogForm.riskPlanSensorList.length;x++){
  432. if(self.dialogForm.riskPlanSensorList[i].sensorType == self.dialogForm.riskPlanSensorList[x].sensorType && i != x){
  433. if(self.dialogForm.riskPlanSensorList[i].minMonitor >= self.dialogForm.riskPlanSensorList[x].minMonitor &&
  434. self.dialogForm.riskPlanSensorList[i].minMonitor <= self.dialogForm.riskPlanSensorList[x].maxMonitor){
  435. self.msgError('监测区间不能重复,请重新输入');
  436. return
  437. }
  438. if(self.dialogForm.riskPlanSensorList[i].maxMonitor >= self.dialogForm.riskPlanSensorList[x].minMonitor &&
  439. self.dialogForm.riskPlanSensorList[i].maxMonitor <= self.dialogForm.riskPlanSensorList[x].maxMonitor){
  440. self.msgError('监测区间不能重复,请重新输入');
  441. return
  442. }
  443. }
  444. }
  445. }
  446. //判断 当前为修改还是新增
  447. if(this.dialogIndex != null){
  448. //编辑
  449. //判断是否已有同等级预案
  450. for(let i=0;i<self.labRiskPlanLevels.length;i++){
  451. if(self.labRiskPlanLevels[i].riskPlanLevel == self.dialogForm.riskPlanLevel){
  452. this.msgError('无法添加多个相同等级的预案.')
  453. return
  454. }
  455. }
  456. for(let i=0;i<self.labRiskPlanLevels.length;i++){
  457. if(self.labRiskPlanLevels[i].riskPlanSensorList.length == self.dialogForm.riskPlanSensorList.length){
  458. let age = 0;
  459. for(let o=0;o<self.labRiskPlanLevels[i].riskPlanSensorList.length;o++){
  460. for(let x=0;x<self.dialogForm.riskPlanSensorList.length;x++){
  461. if(self.dialogForm.riskPlanSensorList[x].sensorType==self.labRiskPlanLevels[i].riskPlanSensorList[o].sensorType){
  462. if(self.dialogForm.riskPlanSensorList[x].minMonitor>=self.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor&&
  463. self.dialogForm.riskPlanSensorList[x].minMonitor<=self.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor){
  464. age++
  465. }else if(self.dialogForm.riskPlanSensorList[x].maxMonitor>=self.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor&&
  466. self.dialogForm.riskPlanSensorList[x].maxMonitor<=self.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor){
  467. age++
  468. }else if(self.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor>=self.dialogForm.riskPlanSensorList[x].minMonitor&&
  469. self.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor<=self.dialogForm.riskPlanSensorList[x].maxMonitor){
  470. age++
  471. }else if(self.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor>=self.dialogForm.riskPlanSensorList[x].minMonitor&&
  472. self.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor<=self.dialogForm.riskPlanSensorList[x].maxMonitor){
  473. age++
  474. }
  475. }
  476. }
  477. }
  478. if(self.dialogForm.riskPlanSensorList.length == age){
  479. self.msgError('监测区间不能与其他级别检测条件完全重复,请重新输入');
  480. return
  481. }
  482. }
  483. }
  484. }else{
  485. //新增
  486. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  487. if(self.form.labRiskPlanLevels[i].riskPlanLevel == self.dialogForm.riskPlanLevel){
  488. this.msgError('无法添加多个相同等级的预案.')
  489. return
  490. }
  491. }
  492. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  493. if(self.form.labRiskPlanLevels[i].riskPlanSensorList.length == self.dialogForm.riskPlanSensorList.length){
  494. let age = 0;
  495. for(let o=0;o<self.form.labRiskPlanLevels[i].riskPlanSensorList.length;o++){
  496. for(let x=0;x<self.dialogForm.riskPlanSensorList.length;x++){
  497. if(self.dialogForm.riskPlanSensorList[x].sensorType==self.form.labRiskPlanLevels[i].riskPlanSensorList[o].sensorType){
  498. if(self.dialogForm.riskPlanSensorList[x].minMonitor>=self.form.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor&&
  499. self.dialogForm.riskPlanSensorList[x].minMonitor<=self.form.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor){
  500. age++
  501. console.log('1')
  502. }else if(self.dialogForm.riskPlanSensorList[x].maxMonitor>=self.form.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor&&
  503. self.dialogForm.riskPlanSensorList[x].maxMonitor<=self.form.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor){
  504. age++
  505. console.log('2')
  506. }else if(self.form.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor>=self.dialogForm.riskPlanSensorList[x].minMonitor&&
  507. self.form.labRiskPlanLevels[i].riskPlanSensorList[o].minMonitor<=self.dialogForm.riskPlanSensorList[x].maxMonitor){
  508. age++
  509. console.log('3')
  510. }else if(self.form.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor>=self.dialogForm.riskPlanSensorList[x].minMonitor&&
  511. self.form.labRiskPlanLevels[i].riskPlanSensorList[o].maxMonitor<=self.dialogForm.riskPlanSensorList[x].maxMonitor){
  512. age++
  513. console.log('4')
  514. }
  515. }
  516. }
  517. }
  518. if(self.dialogForm.riskPlanSensorList.length == age){
  519. self.msgError('监测区间不能与其他级别检测条件完全重复,请重新输入');
  520. return
  521. }
  522. }
  523. }
  524. }
  525. // this.$refs["dialogForm"].validate(valid => {
  526. // if (valid) {
  527. if(this.dialogIndex != null){
  528. //修改预案级别数据
  529. let text = [];
  530. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  531. if(this.dialogIndex != i){
  532. for(let o=0;o<self.form.labRiskPlanLevels[i].riskPlanSensorList.length;o++){
  533. for(let x=0;x<self.sensorList.length;x++){
  534. if(self.form.labRiskPlanLevels[i].riskPlanSensorList[o].sensorType == self.sensorList[x].hardwareTypeCode){
  535. text.push(self.sensorList[x].hardwareTypeName);
  536. }
  537. }
  538. }
  539. }
  540. }
  541. for(let i=0;i<self.dialogForm.riskPlanSensorList.length;i++){
  542. for(let x=0;x<self.sensorList.length;x++){
  543. if(self.dialogForm.riskPlanSensorList[i].sensorType == self.sensorList[x].hardwareTypeCode){
  544. text.push(self.sensorList[x].hardwareTypeName);
  545. }
  546. }
  547. }
  548. text = Array.from(new Set(text));
  549. text = text+''
  550. text = text.replace(",","+")
  551. console.log(text);
  552. let obj = JSON.parse(JSON.stringify(this.dialogForm))
  553. obj.startCondition = text+'';
  554. planLevelPut(obj).then((response) => {
  555. this.msgSuccess(response.msg)
  556. this.selectRiskPlanLeveListRiskPlanId();
  557. this.$set(this,'dialogOpen',false);
  558. });
  559. }else{
  560. //新增预案级别数据
  561. let text = [];
  562. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  563. for(let o=0;o<self.form.labRiskPlanLevels[i].riskPlanSensorList.length;o++){
  564. for(let x=0;x<self.sensorList.length;x++){
  565. if(self.form.labRiskPlanLevels[i].riskPlanSensorList[o].sensorType == self.sensorList[x].hardwareTypeCode){
  566. text.push(self.sensorList[x].hardwareTypeName);
  567. }
  568. }
  569. }
  570. }
  571. for(let i=0;i<self.dialogForm.riskPlanSensorList.length;i++){
  572. for(let x=0;x<self.sensorList.length;x++){
  573. if(self.dialogForm.riskPlanSensorList[i].sensorType == self.sensorList[x].hardwareTypeCode){
  574. text.push(self.sensorList[x].hardwareTypeName);
  575. }
  576. }
  577. }
  578. text = Array.from(new Set(text));
  579. text = text+''
  580. text = text.replace(",","+")
  581. console.log(text);
  582. let obj = JSON.parse(JSON.stringify(this.dialogForm))
  583. obj.riskPlanId = this.addPlanData.id;
  584. obj.startCondition = text+'';
  585. planLevelAdd(obj).then((response) => {
  586. this.msgSuccess(response.msg)
  587. this.selectRiskPlanLeveListRiskPlanId();
  588. this.$set(this,'dialogOpen',false);
  589. });
  590. }
  591. // }
  592. // })
  593. }
  594. })
  595. },
  596. //取消
  597. cancel(){
  598. this.$set(this,'dialogOpen',false);
  599. },
  600. //新增/编辑预案
  601. buttonClick(type,item,index){
  602. let self = this;
  603. if(type == 1){
  604. let a = 0;
  605. let b = 0;
  606. let c = 0;
  607. let d = 0;
  608. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  609. if(self.form.labRiskPlanLevels[i].riskPlanLevel == 1){
  610. a++
  611. }else if(self.form.labRiskPlanLevels[i].riskPlanLevel == 2){
  612. b++
  613. }else if(self.form.labRiskPlanLevels[i].riskPlanLevel == 3){
  614. c++
  615. }else if(self.form.labRiskPlanLevels[i].riskPlanLevel == 4){
  616. d++
  617. }
  618. }
  619. this.$set(this,'dialogIndex',null);
  620. this.$set(this,'dialogTitle','新增预案规则');
  621. this.$set(this,'dialogForm',{
  622. riskPlanLevel:a==0?1:(b==0?2:(c==0?3:(d==0?4:''))),
  623. ifExit:null,
  624. riskPlanSensorList:[],
  625. riskPlanHardwareList:[],
  626. });
  627. this.$set(this,'dialogOpen',true);
  628. }else if(type == 2){
  629. this.$set(this,'dialogTitle','编辑预案规则');
  630. this.$set(this,'dialogIndex',index);
  631. let obj = JSON.parse(JSON.stringify(item))
  632. for(let i=0;i<obj.riskPlanHardwareList.length;i++){
  633. for(let o=0;o<self.hardwareList.length;o++){
  634. if(obj.riskPlanHardwareList[i].hardwareType == self.hardwareList[o].hardwareTypeEnum.code){
  635. obj.riskPlanHardwareList[i].hardwareList = self.hardwareList[o].functionStatusList
  636. }
  637. }
  638. }
  639. this.$set(this,'dialogForm',{
  640. id:obj.id,
  641. riskPlanId:obj.riskPlanId,
  642. riskPlanLevel:obj.riskPlanLevel,
  643. ifExit:obj.ifExit,
  644. riskPlanSensorList:obj.riskPlanSensorList,
  645. riskPlanHardwareList:obj.riskPlanHardwareList,
  646. });
  647. let list = [];
  648. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  649. if(i!=index){
  650. list.push(self.form.labRiskPlanLevels[i]);
  651. }
  652. }
  653. this.$set(this,'labRiskPlanLevels',JSON.parse(JSON.stringify(list)));
  654. this.$set(this,'dialogOpen',true);
  655. }else if(type == 3){
  656. this.$confirm('确定要删除该预案规则吗?', "警告", {
  657. confirmButtonText: "确定",
  658. cancelButtonText: "取消",
  659. type: "warning"
  660. }).then(function() {
  661. let text = [];
  662. for(let i=0;i<self.form.labRiskPlanLevels.length;i++){
  663. if(index != i){
  664. for(let o=0;o<self.form.labRiskPlanLevels[i].riskPlanSensorList.length;o++){
  665. for(let x=0;x<self.sensorList.length;x++){
  666. if(self.form.labRiskPlanLevels[i].riskPlanSensorList[o].sensorType == self.sensorList[x].hardwareTypeCode){
  667. text.push(self.sensorList[x].hardwareTypeName);
  668. }
  669. }
  670. }
  671. }
  672. }
  673. text = Array.from(new Set(text));
  674. text = text+''
  675. text = text.replace(",","+")
  676. let obj = {
  677. id:item.id,
  678. startCondition:text,
  679. riskPlanId:item.riskPlanId
  680. }
  681. planLevelDel(obj).then((response) => {
  682. self.msgSuccess(response.msg)
  683. self.selectRiskPlanLeveListRiskPlanId();
  684. });
  685. }).then(() => {
  686. }).catch(() => {});
  687. }
  688. },
  689. }
  690. }
  691. </script>
  692. <style lang="scss">
  693. .add-plan-max-button-color{
  694. color:#dedede!important;
  695. }
  696. </style>
  697. <style scoped lang="scss">
  698. .newAddPlan {
  699. flex: 1;
  700. display: flex !important;
  701. flex-direction: column;
  702. overflow: hidden;
  703. p {
  704. margin: 0;
  705. font-weight: 500;
  706. }
  707. .newAddPlan-title-box {
  708. height: 80px;
  709. display: flex;
  710. border-bottom: 1px solid #E0E0E0;
  711. p:nth-child(1) {
  712. flex: 1;
  713. margin-left: 20px;
  714. font-size: 16px;
  715. color: #0045AF;
  716. line-height: 80px;
  717. font-weight: 700;
  718. }
  719. p:nth-child(2) {
  720. font-size: 14px;
  721. margin-top: 20px;
  722. margin-right: 20px;
  723. }
  724. p:nth-child(3) {
  725. font-size: 14px;
  726. width: 130px;
  727. margin-top: 20px;
  728. margin-right: 20px;
  729. }
  730. p:nth-child(4) {
  731. font-size: 14px;
  732. width: 150px;
  733. margin: 20px;
  734. }
  735. }
  736. .plan-for-max-box {
  737. flex: 1;
  738. padding:0 20px 20px 20px;
  739. .plan-for-max-box-name-box{
  740. display: flex;
  741. .plan-for-max-box-name-button-one{
  742. width:80px;
  743. text-align: center;
  744. font-size:14px;
  745. line-height:40px;
  746. margin:40px 0 0 40px;
  747. }
  748. .plan-for-max-box-name-button-two{
  749. width:80px;
  750. text-align: center;
  751. font-size:14px;
  752. line-height:40px;
  753. margin:40px 0 0 40px;
  754. }
  755. .plan-for-max-box-name-button-three{
  756. width:80px;
  757. text-align: center;
  758. font-size:14px;
  759. line-height:40px;
  760. margin:40px 0 0 20px;
  761. }
  762. }
  763. .for-plan-box{
  764. position: relative;
  765. border-radius:10px;
  766. overflow: hidden;
  767. box-shadow: 0px 4px 10px 0px rgba(0,0,0,0.302);
  768. margin-bottom:24px;
  769. display: flex;
  770. .position-title-type{
  771. position:absolute;
  772. left:0;
  773. top:0;
  774. border-bottom-right-radius: 10px;
  775. width:84px;
  776. line-height:30px;
  777. font-size:14px;
  778. text-align: center;
  779. }
  780. .type-color-a{
  781. color:#0183FA;
  782. background: #CCE6FE;
  783. }
  784. .type-color-b{
  785. color:#FF9900;
  786. background: rgb(256,232,206);
  787. }
  788. .type-color-c{
  789. color:#FF4800;
  790. background: rgb(251,228,206);
  791. }
  792. .type-color-d{
  793. color:#FF0000;
  794. background: rgba(248,206,205);;
  795. }
  796. .for-plan-img-box{
  797. width:284px;
  798. display: flex;
  799. flex-direction: column;
  800. .for-plan-img-null-p{
  801. flex:1;
  802. }
  803. .for-plan-img-box-big{
  804. display: flex;
  805. .for-plan-img-box-one{
  806. margin-left:81px;
  807. width:168px;
  808. display: flex;
  809. img{
  810. height:50px;
  811. width:50px;
  812. }
  813. p{
  814. margin-left:20px;
  815. line-height:50px;
  816. font-size:14px;
  817. color:#333;
  818. }
  819. }
  820. .for-plan-img-box-two{
  821. display: flex;
  822. img{
  823. height:50px;
  824. width:50px;
  825. }
  826. p{
  827. line-height:50px;
  828. font-size:14px;
  829. color:#333;
  830. }
  831. }
  832. }
  833. }
  834. .min-for-text-box{
  835. width:1030px;
  836. padding-top:21px;
  837. .min-for-text-box-one{
  838. width:460px;
  839. line-height:30px;
  840. margin-bottom:21px;
  841. margin-right:40px;
  842. border-radius:6px;
  843. color:#0183FA;
  844. background:rgb(209,229,253);
  845. display: inline-block;
  846. div{
  847. display: flex;
  848. p:nth-child(1){
  849. margin-right:15px;
  850. margin-left:9px;
  851. }
  852. }
  853. }
  854. .min-for-text-box-two{
  855. width:460px;
  856. line-height:30px;
  857. margin-bottom:21px;
  858. margin-right:40px;
  859. border-radius:6px;
  860. color:#333;
  861. background:rgb(253,242,227);
  862. display: inline-block;
  863. div{
  864. display: flex;
  865. p:nth-child(1){
  866. margin-right:15px;
  867. margin-left:9px;
  868. }
  869. p:nth-child(2){
  870. margin-right:15px;
  871. }
  872. }
  873. }
  874. }
  875. .for-button-max-box{
  876. flex:1;
  877. margin:19px 0;
  878. border-left:1px dashed #D8D8D8;
  879. display: flex;
  880. div{
  881. margin:auto 0 auto 34px;
  882. width:85px;
  883. display: flex;
  884. height:20px;
  885. cursor: pointer;
  886. img{
  887. height:14px;
  888. margin-top:3px;
  889. }
  890. p{
  891. font-size:14px;
  892. margin-left:9px;
  893. }
  894. }
  895. }
  896. }
  897. .plan-for-max-button-box{
  898. margin:30px auto;
  899. display: flex;
  900. .plan-for-max-button-null{
  901. flex:1;
  902. }
  903. .plan-for-max-button{
  904. cursor: pointer;
  905. color:#0183FA;
  906. border:1px dashed #0183FA;
  907. border-radius:4px;
  908. width:300px;
  909. line-height:40px;
  910. text-align: center;
  911. font-size:14px;
  912. }
  913. }
  914. }
  915. }
  916. </style>