diff --git a/src/api/dev/devicePlanDetailItemApi.js b/src/api/dev/devicePlanDetailItemApi.js
index 52d2f1cd..9de36b1b 100644
--- a/src/api/dev/devicePlanDetailItemApi.js
+++ b/src/api/dev/devicePlanDetailItemApi.js
@@ -1,40 +1,53 @@
 import axios from "@/utils/request";
 
 export function devicePlanDetailItemPage(query) {
-    return axios(
-        {
-            url: "/udi/device/plan/detail/item/page",
-            method: "POST",
-            data: query
-        }
-    )
+  return axios(
+    {
+      url: "/udi/device/plan/detail/item/page",
+      method: "POST",
+      data: query
+    }
+  )
 }
 
 export function devicePlanDetailItemAdd(query) {
-    return axios(
-        {
-            url: "/udi/device/plan/detail/item/add",
-            method: "POST",
-            data: query
-        }
-    )
+  return axios(
+    {
+      url: "/udi/device/plan/detail/item/add",
+      method: "POST",
+      data: query
+    }
+  )
 }
 
-export function devicePlanDetailItemDel(planId,productId,itemCode) {
-    return axios(
-        {
-            url: `/udi/device/plan/detail/item/delByProductId/${planId}/${productId}/${itemCode}`,
-            method: "DELETE"
-        }
-    )
+export function devicePlanDetailItemBatchAdd(query) {
+  return axios(
+    {
+      url: "/udi/device/plan/detail/item/batch/add",
+      method: "POST",
+      data: query
+    }
+  )
 }
 
-export function devicePlanDetailItemByDeviceCodeDel(planId,deviceCode,itemCode) {
-    return axios(
-        {
-            url: `/udi/device/plan/detail/item/delByDeviceCode/${planId}/${deviceCode}/${itemCode}`,
-            method: "DELETE"
-        }
-    )
+
+export function devicePlanDetailItemDel(planId, productId, itemCode) {
+  return axios(
+    {
+      url: `/udi/device/plan/detail/item/delByProduct/${planId}/${productId}/${itemCode}`,
+      method: "DELETE"
+    }
+  )
+}
+
+export function devicePlanDetailItemByDeviceCodeDel(planId, deviceCode, itemCode) {
+  return axios(
+    {
+      url: `/udi/device/plan/detail/item/delByDevice/${planId}/${deviceCode}/${itemCode}`,
+      method: "DELETE"
+    }
+  )
 }
 
+
+
diff --git a/src/views/dev/deviceAdd.vue b/src/views/dev/deviceAdd.vue
new file mode 100644
index 00000000..002ee706
--- /dev/null
+++ b/src/views/dev/deviceAdd.vue
@@ -0,0 +1,158 @@
+<template>
+  <div>
+    <el-card>
+      <el-form :model="query" v-if="showSearch" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="设备编码">
+              <el-input v-model="query.deviceCode" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="设备名称">
+              <el-input v-model="query.productName" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div class="top-right-btn">
+        <el-button-group>
+          <el-button icon="el-icon-view" type="primary" @click="showSearch = !showSearch">显示/隐藏搜索栏</el-button>
+          <el-button
+            type="primary"
+            icon="el-icon-refresh"
+            @click="onReset"
+          >重置
+          </el-button>
+          <el-button type="primary" icon="el-icon-search" @click="query.page=1;getList()"
+          >查询
+          </el-button>
+          <el-button type="primary" icon="el-icon-plus" @click="chooseDevice"
+          >选入
+          </el-button>
+        </el-button-group>
+      </div>
+      <el-divider style="margin: 15px"></el-divider>
+      <el-table :data="list" v-loading="loading" @selection-change="(val)=>{selectChangeFunc(val)}"
+                @row-click="(row)=>{$refs.table.toggleRowSelection(row)}" ref="table" row-key="deviceCode">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column label="序号" width="50" type="index"/>
+        <el-table-column label="科室" width="150" prop="deptName"/>
+        <el-table-column label="设备编码" width="150" prop="deviceCode"/>
+        <el-table-column label="最小销售标识" width="150" prop="nameCode"/>
+        <el-table-column label="名称" width="150" prop="productName"/>
+        <el-table-column label="规格型号" width="160" prop="ggxh"/>
+        <el-table-column label="变更次数" width="100" prop="changeCount"/>
+        <el-table-column label="维修次数" width="100" prop="repairCount"/>
+        <el-table-column label="巡检次数" width="100" prop="checkCount"/>
+        <el-table-column label="计量单位" width="100" prop="measname"/>
+        <el-table-column label="生产企业" width="180" prop="manufactory"/>
+        <el-table-column label="批次号" width="100" prop="batchNo"/>
+        <el-table-column label="序列号" width="100" prop="serialNo"/>
+        <el-table-column label="生产日期" width="140" prop="productionDate"/>
+        <el-table-column label="过期时间" width="140" prop="expireDate"/>
+        <el-table-column label="供应商" width="100" prop="supName"/>
+        <el-table-column label="udi码" width="150" prop="udi"/>
+        <el-table-column label="注册/备案号" width="150" prop="zczbhhzbapzbh"/>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="query.page"
+        :limit.sync="query.limit"
+        @pagination="getList"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script>
+import {deviceDetailInfo} from "@/api/dev/deviceInfoApi";
+import {getLoading} from "@/utils";
+import {devicePlanDetailAdd} from "@/api/dev/devicePlanDetailApi";
+
+let query = {
+  page: 1,
+  limit: 10,
+  productName: null,
+  deviceCode: null,
+  planId: null,
+}
+export default {
+  name: "deviceAdd",
+  props: {
+    planId: {required: true},
+    selectChangeFunc: {required: true, type: Function},
+    closeAddDevice: {required: true, type: Function},
+    planData: {
+      type: Object,
+      required: true
+    },
+  },
+  data() {
+    return {
+      showSearch: true,
+      loading: false,
+      query: {...query},
+      list: [],
+      total: 0,
+    }
+  },
+  created() {
+    this.query = {...query, planId: this.planId}
+    this.getList()
+  },
+  methods: {
+    onReset() {
+      this.query = {...query, planId: this.planId}
+      this.getList()
+    },
+    chooseDevice() {
+      let selectList = this.$refs.table.selection
+      if (selectList.length == 0) {
+        this.$message.error("请选择设备")
+        return
+      }
+      let deviceCodes = selectList.map(item => item.deviceCode)
+      let param = {
+        planId: this.planId,
+        deviceCodes: deviceCodes,
+        devicePlanParam: this.planData
+      }
+      devicePlanDetailAdd(param).then(res => {
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.$message.success(res.message)
+        this.closeAddDevice(res.data);
+      }).catch(e => {
+      })
+    },
+    getList() {
+      this.loading = true
+      deviceDetailInfo(this.query)
+        .then((res) => {
+          this.loading = false
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.list = res.data.list || [];
+          this.total = res.data.total || 0;
+        })
+        .catch(() => {
+          this.loading = false
+          this.list = [];
+          this.total = 0;
+        });
+    },
+
+  },
+}
+
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/dev/devicePlan.vue b/src/views/dev/devicePlan.vue
index bb2e2681..a8e75c05 100644
--- a/src/views/dev/devicePlan.vue
+++ b/src/views/dev/devicePlan.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
+    <!--    巡检计划主表-->
     <el-card>
-
       <el-form :model="query" v-if="showSearch" label-width="auto">
         <el-row :gutter="20">
           <el-col :span="6">
@@ -28,48 +28,51 @@
           <el-button type="primary" icon="el-icon-search" @click="search"
           >查询
           </el-button>
-          <el-button type="primary" icon="el-icon-plus" @click="openCreate(null)"
+          <el-button type="primary" icon="el-icon-plus" @click="openCreate(null,null)"
           >新增
           </el-button>
         </el-button-group>
       </div>
       <el-divider style="margin: 15px"></el-divider>
-
       <el-table :data="list" @row-click="rowClick" v-loading="loading" click-row-light
                 highlight-current-row>
         <el-table-column label="序号" width="50" type="index"/>
         <el-table-column label="计划名称" width="150" prop="name"/>
-        <el-table-column label="负责部门" width="150" prop="chargeDeptName"/>
-        <el-table-column label="设备数量" width="150" prop="deviceCount"/>
-        <el-table-column label="执行情况" width="150" prop="chargeDeptName">
+        <el-table-column label="负责部门" width="120" prop="chargeDeptName"/>
+        <el-table-column label="设备数量" width="120" prop="deviceCount"/>
+        <el-table-column label="单据状态" width="120" prop="chargeDeptName">
+          <template slot-scope="scope">
+            <el-tag v-if="scope.row.status==1" type="warning">草稿</el-tag>
+            <el-tag v-if="scope.row.status==2" type="success">已提交</el-tag>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="执行状态" width="120" prop="chargeDeptName">
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.isActive==true" type="success">已进入周期</el-tag>
-            <el-tag v-if="scope.row.isActive==false" type="info">未进入周期</el-tag>
+            <el-tag v-if="scope.row.isActive==true" type="success">执行中</el-tag>
+            <el-tag v-if="scope.row.isActive==false" type="info">未执行</el-tag>
           </template>
         </el-table-column>
         <el-table-column label="开始日期" width="150" prop="startDate"/>
         <el-table-column label="结束日期" width="150" prop="endDate"/>
-        <el-table-column label="执行周期(次)" width="160" prop="frequency">
+        <el-table-column label="执行频率" width="160" prop="frequency">
           <template slot-scope="scope">
             {{ `${scope.row.frequency}天` }}
           </template>
         </el-table-column>
         <el-table-column label="已执行次数" width="200" prop="execCount"/>
         <el-table-column label="备注" width="200" prop="remark"/>
-        <el-table-column label="操作" width="240" fixed="right">
+        <el-table-column label="操作" width="200" fixed="right">
           <template slot-scope="scope">
-            <el-button type="text" @click.stop="openCreate(scope.row.planId)">
+            <el-button type="text" @click.stop="openCreate(scope.row.planId,scope.row)">
               编辑
             </el-button>
-            <el-button type="text" @click.stop="openCreate(scope.row.planId,null,1)">
-              添加巡检设备
+            <el-button type="text" @click="deviceCheckGenFunc(scope.row)"
+            >生成任务单
             </el-button>
             <el-button type="text" @click.stop="delplan(scope.row)">
               删除
             </el-button>
-            <el-button type="text" @click="deviceCheckGenFunc(scope.row)"
-            >生成任务单
-            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -82,91 +85,32 @@
       />
     </el-card>
 
+    <!--    巡检计划设备明细-->
     <el-card>
       <div slot="header" class="clearfix">
         <div class="fl">
           {{ `计划详情 ${clickRow ? '——' + clickRow.name : ''}` }}
         </div>
-        <div class="fr" v-if="clickRow">
-          <el-button type="primary" @click="openCreate(clickRow.planId,null,1)">选择设备</el-button>
-          <el-button type="" @click="getDetailList">刷新</el-button>
-        </div>
       </div>
-      <el-table :data="detailList" v-loading="detailLoading" ref="table" row-key="productId"
-                @row-click="(row)=>{$refs.table.toggleRowExpansion(row)}" @expand-change="handleExpendRow"
-                :expandRowKeys="expandRowKeys">
-        <el-table-column type="expand">
-          <template slot-scope="scope">
-            <el-card class="mb10" v-if="scope.row.detailData!=null">
-              <el-form :model="scope.row.detailData.query" inline>
-                <el-row :gutter="20">
-                  <el-col :span="24">
-                    <el-form-item label="设备编号">
-                      <el-input v-model="scope.row.detailData.query.deviceCode" clearable/>
-                    </el-form-item>
-                    <el-button-group>
-                      <el-button
-                        type="primary"
-                        icon="el-icon-refresh"
-                        @click="onReset"
-                      >重置
-                      </el-button>
-                      <el-button type="primary" icon="el-icon-search"
-                                 @click="scope.row.detailData.query.page=1;getRowDetailList(scope.row.detailData)"
-                      >查询
-                      </el-button>
-                    </el-button-group>
-                  </el-col>
-                </el-row>
-              </el-form>
-              <el-table :data="scope.row.detailData.list"
-                        v-loading="scope.row.detailData.loading">
-                <el-table-column label="序号" width="50" type="index"/>
-                <el-table-column label="科室名称" prop="deptName"/>
-                <el-table-column label="设备编号" prop="deviceCode"/>
-                <el-table-column label="最小销售标识" prop="nameCode"/>
-                <el-table-column label="名称" prop="productName"/>
-                <el-table-column label="规格型号" prop="ggxh"/>
-                <el-table-column label="计量单位" prop="measname"/>
-                <el-table-column label="生产企业" prop="manufactory"/>
-                <el-table-column label="注册/备案号" prop="zczbhhzbapzbh"/>
-                <el-table-column label="操作" width="120">
-                  <template slot-scope="prop">
-                    <el-button type="text" @click="openCreate(prop.row.planId,prop.row,2,true)"
-                    >巡检项目
-                    </el-button>
-                    <el-button type="text" @click="delDetail(prop.row)"
-                    >删除
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-              <pagination
-                v-show="scope.row.detailData.total>0"
-                :total="scope.row.detailData.total"
-                :page.sync="scope.row.detailData.query.page"
-                :limit.sync="scope.row.detailData.query.limit"
-                @pagination="getRowDetailList(scope.row.detailData)"
-              />
-            </el-card>
-          </template>
-        </el-table-column>
+      <el-table :data="detailList" @row-click="rowClick" v-loading="detailLoading" click-row-light
+                highlight-current-row>
         <el-table-column label="序号" width="50" type="index"/>
+        <el-table-column label="科室名称" prop="deptName"/>
+        <el-table-column label="设备编号" prop="deviceCode"/>
         <el-table-column label="最小销售标识" prop="nameCode"/>
         <el-table-column label="名称" prop="productName"/>
         <el-table-column label="规格型号" prop="ggxh"/>
         <el-table-column label="计量单位" prop="measname"/>
-        <el-table-column label="数量" prop="count"/>
         <el-table-column label="生产企业" prop="manufactory"/>
         <el-table-column label="注册/备案号" prop="zczbhhzbapzbh"/>
         <el-table-column label="操作" width="120">
-          <template slot-scope="scope">
-            <el-button type="text" @click.stop="openCreate(scope.row.planId,scope.row,2)"
+          <template slot-scope="prop">
+            <el-button type="text" @click="setProject(prop.row)"
             >巡检项目
             </el-button>
-            <el-button type="text" @click.stop="delDetail(scope.row)"
-            >删除
-            </el-button>
+            <!--            <el-button type="text" @click="delDetail(prop.row)"-->
+            <!--            >移除-->
+            <!--            </el-button>-->
           </template>
         </el-table-column>
       </el-table>
@@ -177,253 +121,572 @@
         :limit.sync="detailQuery.limit"
         @pagination="getDetailList"
       />
-
     </el-card>
 
+
     <el-dialog
-      :title="`编辑巡检计划信息${planData.planId?'--('+planData.name+')':''}`"
+      :title="planEditTitle"
       :visible="true"
       v-if="createFlag"
       @close="createFlag = false"
       width="80%"
     >
-      <el-card>
-        <div slot="header" class="clearfix">
-          <div class="fl"><span style="color: red;">* 巡检任务单将于执行周期的00:05分生成</span></div>
-          <div class="fr">
-            <el-button v-if="createActive==0" @click="changeActive(true)" type="primary">保存</el-button>
-            <el-button v-else @click="changeActive(false)" type="primary">上一步</el-button>
-            <el-button @click="createFlag = false;query.page=1;getList()">关闭</el-button>
-            <el-button type="success" v-if="createActive==2" @click="changeActive(false)">完成</el-button>
-          </div>
-        </div>
-        <div>
-          <el-steps align-center :active="createActive" finish-status="success" process-status="finish">
-            <el-step title="基础信息"/>
-            <el-step title="选择设备"/>
-            <el-step title="选择巡检项目" :description="createActive==2?itemQuery.title:''"/>
-          </el-steps>
-        </div>
-        <el-form v-if="createActive==0" :model="planData" :rules="formRule" ref="saveForm" label-width="auto">
-          <el-row :gutter="20">
-            <el-col>
-              <el-form-item label="计划名称" prop="name">
-                <el-input v-model.trim="planData.name" show-word-limit maxlength="100" clearable/>
-              </el-form-item>
-            </el-col>
-            <el-col>
-              <el-form-item label="负责部门" prop="chargeDeptCode">
-                <deptSelect :value.sync="planData.chargeDeptCode"/>
-              </el-form-item>
-            </el-col>
-            <el-col :span="24">
-              <el-form-item label="执行区间" prop="dateInterval">
-                <el-date-picker
-                  style="width: 100%"
-                  v-model.trim="planData.dateInterval"
-                  type="daterange"
-                  align="right"
-                  editable
-                  value-format="yyyy-MM-dd"
-                  range-separator="至"
-                  start-placeholder="开始日期"
-                  end-placeholder="结束日期"
-                  :picker-options="pickerOptions">
-                </el-date-picker>
-              </el-form-item>
-            </el-col>
-            <el-col>
-              <el-form-item prop="frequency">
-                <template slot="label">
-                  执行周期(次)
-                  <el-tooltip class="item" effect="dark" content="执行周期(次),例:每30天执行一次"
-                              placement="top">
-                    <el-icon class="el-icon-question"/>
-                  </el-tooltip>
-                </template>
-                <el-input-number :min="1" :max="999999" v-model.trim="planData.frequency"/>
-                <span class="ml10">天</span>
-                <span class="ml10">快捷选项:</span>
-                <el-button type="" @click="planData.frequency=30">一个月</el-button>
-                <el-button type="" @click="planData.frequency=30*3">三个月</el-button>
-                <el-button type="" @click="planData.frequency=30*6">半年</el-button>
-                <el-button type="" @click="planData.frequency=365">一年</el-button>
-                <el-button type="" @click="planData.frequency=365*2">两年</el-button>
-                <el-button type="" @click="planData.frequency=365*3">三年</el-button>
-              </el-form-item>
-            </el-col>
-            <el-col>
-              <el-form-item label="备注">
-                <el-input type="textarea" v-model.trim="planData.remark" resize="none" :autosize="{minRows:8,maxRows:8}"
-                          show-word-limit maxlength="500" clearable/>
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </el-form>
-        <el-card v-show="createActive==1">
-          <div slot="header" class="clearfix">
-            <div class="fr">
-              <el-button type="primary" @click="chooseDeviceFlag=true">选择设备</el-button>
-              <el-button type="" @click="getDetailList">刷新</el-button>
-            </div>
-          </div>
-          <el-table :data="detailList" v-loading="detailLoading" ref="dialogTable"
-                    :row-key="row=>{return row.productId+'_'+row.planId}"
-                    @row-click="(row)=>{$refs.dialogTable.toggleRowExpansion(row)}" @expand-change="handleExpendRow"
-                    :expandRowKeys="dialogExpandRowKeys">
-            <el-table-column type="expand">
-              <template slot-scope="scope">
-                <el-card class="mb10" v-if="scope.row.detailData">
-                  <el-form :model="scope.row.detailData.query" inline>
-                    <el-row :gutter="20">
-                      <el-col :span="24">
-                        <el-form-item label="设备编号">
-                          <el-input v-model="scope.row.detailData.query.deviceCode" clearable/>
-                        </el-form-item>
-                        <el-button-group>
-                          <el-button
-                            type="primary"
-                            icon="el-icon-refresh"
-                            @click="onReset"
-                          >重置
-                          </el-button>
-                          <el-button type="primary" icon="el-icon-search"
-                                     @click="scope.row.detailData.query.page=1;getRowDetailList(scope.row.detailData)"
-                          >查询
-                          </el-button>
-                        </el-button-group>
-                      </el-col>
-
-                    </el-row>
-                  </el-form>
-                  <el-table :data="scope.row.detailData.list"
-                            v-loading="scope.row.detailData.loading" row-key="deviceCode">
-                    <el-table-column label="序号" width="50" type="index"/>
-                    <el-table-column label="科室名称" prop="deptName"/>
-                    <el-table-column label="设备编号" prop="deviceCode"/>
-                    <el-table-column label="最小销售标识" prop="nameCode"/>
-                    <el-table-column label="名称" prop="productName"/>
-                    <el-table-column label="规格型号" prop="ggxh"/>
-                    <el-table-column label="计量单位" prop="measname"/>
-                    <el-table-column label="生产企业" prop="manufactory"/>
-                    <el-table-column label="注册/备案号" prop="zczbhhzbapzbh"/>
-                    <el-table-column label="操作" width="120">
-                      <template slot-scope="prop">
-                        <el-button type="text" @click="openCreate(prop.row.planId,prop.row,2,true)"
-                        >巡检项目
-                        </el-button>
-                        <el-button type="text" @click="delDetail(prop.row)"
-                        >删除
-                        </el-button>
-                      </template>
-                    </el-table-column>
-                  </el-table>
-                  <pagination
-                    v-show="scope.row.detailData.total>0"
-                    :total="scope.row.detailData.total"
-                    :page.sync="scope.row.detailData.query.page"
-                    :limit.sync="scope.row.detailData.query.limit"
-                    @pagination="getRowDetailList(scope.row.detailData)"
-                  />
-                </el-card>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="序号" width="50" type="index"/>
-            <el-table-column label="最小销售标识" prop="nameCode"/>
-            <el-table-column label="名称" prop="productName"/>
-            <el-table-column label="规格型号" prop="ggxh"/>
-            <el-table-column label="计量单位" prop="measname"/>
-            <el-table-column label="数量" prop="count"/>
-            <el-table-column label="生产企业" prop="manufactory"/>
-            <el-table-column label="注册/备案号" prop="zczbhhzbapzbh"/>
-            <el-table-column label="操作" width="120">
-              <template slot-scope="scope">
-                <el-button type="text" @click.stop="changeActive(true,scope.row)"
-                >巡检项目
-                </el-button>
-                <el-button type="text" @click.stop="delDetail(scope.row)"
-                >删除
-                </el-button>
-              </template>
-            </el-table-column>
-          </el-table>
-          <pagination
-            v-show="detailTotal>0"
-            :total="detailTotal"
-            :page.sync="detailQuery.page"
-            :limit.sync="detailQuery.limit"
-            @pagination="getDetailList"
-          />
-        </el-card>
-        <el-card v-show="createActive == 2">
-          <div slot="header" class="clearfix">
-            <div class="fr">
-              <el-button type="primary" @click="chooseItemList=[];chooseDetailItemFlag=true">选入巡检项目</el-button>
-              <el-button type="" @click="getDetailItemList">刷新</el-button>
-            </div>
-          </div>
-          <el-table :data="itemList" ref="itemTable" v-loading="itemLoading" row-key="itemCode">
-            <el-table-column label="序号" width="50" type="index"/>
-            <el-table-column label="项目编码" width="150" prop="itemCode"/>
-            <el-table-column label="项目名称" width="150" prop="name"/>
-            <el-table-column label="项目内容" width="500" prop="content"/>
-            <el-table-column label="操作" width="50">
-              <template slot-scope="scope">
-                <el-button type="text"
-                           v-if="!itemQuery.deviceCode&&!scope.row.deviceCode || itemQuery.deviceCode&&scope.row.deviceCode"
-                           @click="delDetailItem(scope.row)"
-                >删除
-                </el-button>
-              </template>
-            </el-table-column>
-          </el-table>
-          <pagination
-            v-show="itemTotal>0"
-            :total="itemTotal"
-            :page.sync="itemQuery.page"
-            :limit.sync="itemQuery.limit"
-            @pagination="getDetailItemList"
-          />
-        </el-card>
-      </el-card>
-
+      <devicePlanEdit :originData="planData"
+                      :closePlanEdit="closePlanEdit"
+                      :createFlag="createFlag"/>
     </el-dialog>
 
 
-    <el-dialog width="80%" title="选择设备"
-               :visible="true"
-               v-if="chooseDeviceFlag"
-               @close="chooseDeviceFlag = false"
+    <el-dialog
+      title="编辑巡检项目"
+      :visible="true"
+      v-if="projectVisible"
+      @close="projectVisible = false"
+      width="80%"
     >
-      <el-card>
-        <div class="align-right" v-if="chooseDeviceList&&chooseDeviceList.length>0">
-          <el-button class="mr20" style="font-size: 20px" type="primary" @click="chooseDevice">确定选入</el-button>
-        </div>
-        <planChooseDevice style="margin: 0" :planId="detailQuery.planId" :selectChangeFunc="deviceSelectChangFunc"/>
-      </el-card>
-
+      <DevicePlanProject style="margin: 0"
+                         :planId="detailQuery.planId"
+                         :projectItem="projectItem"
+                         :closeAddDevice="closeAddDevice"/>
     </el-dialog>
 
 
-    <el-dialog width="80%" title="选择巡检项目"
-               :visible="true"
-               v-if="chooseDetailItemFlag"
-               @close="chooseDetailItemFlag = false"
-    >
-      <el-card>
-        <div class="align-right" v-if="chooseItemList&&chooseItemList.length>0">
-          <el-button class="mr20" style="font-size: 20px" type="primary" @click="chooseDetailItem">确定选入</el-button>
-        </div>
-        <DeviceCheckItemDict style="margin: 0" :is-choose="true" :selectChangFunc="itemSelectChangFunc"/>
-      </el-card>
-
-    </el-dialog>
   </div>
 
 </template>
 
-<script src="./js/devicePlan.js"/>
+
+<script>
+import {devicePlanDel, devicePlanInfo, devicePlanPage, devicePlanSave} from "@/api/dev/devicePlanApi";
+import {
+  devicePlanDetailDel,
+  devicePlanDetailPage, devicePlanDetailDelByDeviceCode
+} from "@/api/dev/devicePlanDetailApi";
+import {getLoading} from "@/utils";
+import product from "@/views/basic/product/product.vue";
+import {
+  devicePlanDetailItemAdd, devicePlanDetailItemByDeviceCodeDel,
+  devicePlanDetailItemDel,
+  devicePlanDetailItemPage
+} from "@/api/dev/devicePlanDetailItemApi";
+import DeviceCheckItemDict from "@/views/dev/deviceCheckItemDict";
+import {deviceCheckGenByPlanId} from "@/api/dev/deviceCheckApi";
+
+import DevicePlanProject from "@/views/dev/devicePlanProject";
+import devicePlanEdit from "@/views/dev/devicePlanEdit";
+
+
+let query = {
+  page: 1,
+  limit: 10,
+  name: null,
+  chargeDeptCode: null,
+}
+
+let detailQuery = {
+  page: 1,
+  limit: 10,
+  planId: null,
+}
+let rowDeltailQuery = {
+  page: 1,
+  limit: 10,
+  planId: null,
+  productId: null,
+}
+
+let itemQuery = {
+  page: 1,
+  limit: 10,
+  planId: null,
+  productId: null,
+}
+
+let planData = {
+  name: null,
+  chargeDeptCode: null,
+  startDate: null,
+  endDate: null,
+  frequency: 1,
+  dateInterval: null,
+  remark: null,
+}
+
+export default {
+  name: "devicePlan",
+  components: {DeviceCheckItemDict, product, devicePlanEdit, DevicePlanProject},
+  computed: {},
+  data() {
+    return {
+      clickRow: null,
+      showSearch: true,
+      loading: false,
+      total: .0,
+      list: [],
+      query: {...query},
+      //计划设备明细=============================================
+      detailLoading: false,
+      detailQuery: {...detailQuery},
+      detailList: [],
+      detailTotal: 0,
+      //巡检项目=============================================
+      itemQuery: {...itemQuery},
+      itemList: [],
+      itemTotal: 0,
+      itemLoading: false,
+      chooseDetailItemFlag: false,
+      chooseDeviceList: [],
+      chooseItemList: [],
+      //新增/编辑计划===================================================
+      planEditTitle: "新增计划",
+      createActive: 0,
+      createFlag: false,
+      chooseDeviceFlag: false,
+      expandRowKeys: [],
+      dialogExpandRowKeys: [],
+      planData: {...planData},
+      formRule: {
+        name: [{required: true, message: "计划名称不能为空", trigger: ["change", "blur"]}],
+        chargeDeptCode: [{required: true, message: "负责部门不能为空", trigger: ["change", "blur"]}],
+        dateInterval: [{required: true, message: "计划执行区间不能为空", trigger: ["change", "blur"]}],
+        frequency: [{
+          required: true,
+          message: "计划执行频率不能为空",
+          trigger: ["change", "blur"]
+        }],
+      },
+      dateInterval: null,
+      pickerOptions: {
+        disabledDate: time => {
+          let nowDate = new Date().getTime();
+          let pickDate = new Date(time).getTime();
+          return (nowDate >= pickDate);
+        },
+        shortcuts: [{
+          text: '一个月(30天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '三个月(90天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30 * 3);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '半年(180天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30 * 6);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '一年(365天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 365);
+            picker.$emit('pick', [start, end]);
+          }
+        }]
+      },
+
+      projectVisible: false,
+      projectItem: null,
+    }
+  },
+  watch: {
+    planData(v) {
+      if (v.planId != null) {
+        this.$set(v, "dateInterval", [v.startDate, v.endDate])
+      }
+    },
+    "planData.dateInterval"(v) {
+      if (v != null && v.length > 0) {
+        this.planData.startDate = v[0]
+        this.planData.endDate = v[1]
+      }
+    },
+    "$refs.dialogTable"(v) {
+
+      this.$refs.dialogTable?.doLayout()
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    handleExpendRow(row, expandedRows) {
+      if (expandedRows.length == 0) {
+        return
+      }
+      this.$set(row, "detailData", {
+        loading: false,
+        showSearch: true,
+        list: [],
+        total: 0,
+        query: {...rowDeltailQuery, planId: row.planId, productId: row.productId}
+      })
+      this.getRowDetailList(row.detailData)
+    },
+    getRowDetailList(data) {
+      data.loading = true
+      devicePlanDetailPage(data.query).then(res => {
+        data.loading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        data.list = res.data.list || []
+        data.total = res.data.total || 0
+
+      }).catch(() => {
+        data.loading = false
+        data.list = []
+        data.total = 0
+      })
+    },
+    deviceCheckGenFunc(row) {
+      this.$confirm("此操作将会创建一个任务单,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        deviceCheckGenByPlanId(row.planId).then(res => {
+          load.close()
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.getList()
+
+        }).catch(() => {
+          load.close()
+        })
+      })
+    },
+    delplan(row) {
+      this.$confirm("此操作将会永久删除该计划,现有任务不受影响,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        devicePlanDel(row.planId).then(res => {
+          load.close()
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.query.page = 1
+          this.getList()
+          if (this.clickRow && this.clickRow.planId == row.planId) {
+            this.clickRow = null
+            this.detailTotal = 0
+            this.detailList = []
+          }
+        }).catch(() => {
+          load.close()
+        })
+      })
+    },
+    openItem(row) {
+      this.itemQuery = {
+        ...itemQuery,
+        planId: row.planId,
+        productId: row.productId,
+        deviceCode: row.deviceCode,
+        title: `${row.deviceCode ? row.deviceCode + '--' : ''}${row.productName}(${row.nameCode})`
+      }
+      this.getDetailItemList()
+    },
+    getDetailItemList() {
+      this.itemLoading = true
+      devicePlanDetailItemPage(this.itemQuery).then(res => {
+        this.itemLoading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.itemList = res.data.list || []
+        this.itemTotal = res.data.total || 0
+      }).catch(e => {
+        this.itemList = []
+        this.itemTotal = 0
+        this.itemLoading = false
+      })
+    },
+    delDetailItem(row) {
+      this.$confirm("此操作将会永久删除该条明细,且将在下一次任务生效,现有任务不受影响,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        if (!row.deviceCode) {
+          devicePlanDetailItemDel(row.planId, row.productId, row.itemCode).then(res => {
+            load.close()
+            if (res.code != 20000) {
+              this.$message.error(res.message)
+              return
+            }
+            this.$message.success(res.message)
+            this.itemQuery.page = 1
+            this.getDetailItemList()
+          }).catch(() => {
+            load.close()
+          })
+        } else {
+          devicePlanDetailItemByDeviceCodeDel(row.planId, row.deviceCode, row.itemCode).then(res => {
+            load.close()
+            if (res.code != 20000) {
+              this.$message.error(res.message)
+              return
+            }
+            this.$message.success(res.message)
+            this.itemQuery.page = 1
+            this.getDetailItemList()
+          }).catch(() => {
+            load.close()
+          })
+        }
+      })
+    },
+    delDetail(row) {
+      this.$confirm("此操作将会永久删除该条明细,且将在下一次任务生效,现有任务不受影响,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        if (row.deviceCode) {
+          devicePlanDetailDelByDeviceCode(row.planId, row.deviceCode).then(res => {
+            load.close()
+            if (res.code != 20000) {
+              this.$message.error(res.message)
+              return
+            }
+            this.$message.success(res.message)
+            this.detailQuery.page = 1
+            this.getDetailList()
+          }).catch(() => {
+            load.close()
+          })
+        } else {
+          devicePlanDetailDel(row.planId, row.productId).then(res => {
+            load.close()
+            if (res.code != 20000) {
+              this.$message.error(res.message)
+              return
+            }
+            this.$message.success(res.message)
+            this.detailQuery.page = 1
+            this.getDetailList()
+          }).catch(() => {
+            load.close()
+          })
+        }
+
+      })
+    },
+    rowClick(row) {
+      this.clickRow = row
+      this.detailQuery = {...detailQuery, planId: row.planId}
+      this.getDetailList()
+    },
+    getDetailList() {
+      this.detailLoading = true
+      this.expandRowKeys = []
+      this.dialogExpandRowKeys = []
+      devicePlanDetailPage(this.detailQuery).then(res => {
+        this.detailLoading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.detailList = res.data.list || []
+        this.detailTotal = res.data.total || 0
+      }).catch(e => {
+        this.detailList = []
+        this.detailTotal = 0
+        this.detailLoading = false
+      })
+    },
+    changeActive(isNext, row) {
+      let load = getLoading(this)
+      if (isNext) {
+        if (this.createActive == 0) {
+          this.$refs.saveForm.validate(b => {
+            if (!b) {
+              load.close()
+              return
+            }
+            devicePlanSave(this.planData).then(res => {
+              load.close()
+              if (res.code != 20000) {
+                this.$message.error(res.message)
+                return
+              }
+              this.planData.planId = res.data
+              this.detailQuery = {...detailQuery, planId: this.planData.planId}
+              this.getDetailList()
+              this.createActive += 1
+            }).catch(e => {
+              load.close()
+            })
+          })
+        } else if (this.createActive == 1) {
+          this.openItem(row)
+          load.close()
+          this.createActive += 1
+        }
+
+      } else {
+        if (this.createActive == 2) {
+          this.planData = {...this.planData}
+          this.detailQuery = {...detailQuery, planId: this.itemQuery.planId}
+          this.getDetailList()
+          load.close()
+          this.createActive -= 1
+        } else if (this.createActive == 1) {
+          devicePlanInfo(this.planData.planId).then(res => {
+            load.close()
+            if (res.code != 20000) {
+              this.$message.error(res.message)
+              return
+            }
+            this.planData = {...res.data}
+            this.createActive -= 1
+          }).catch(e => {
+            load.close()
+          })
+        }
+      }
+      load.close()
+    },
+    itemSelectChangFunc(list) {
+      this.chooseItemList = list.map(i => i.code)
+    },
+    chooseDetailItem() {
+      let loading = getLoading(this)
+      let param = {
+        planId: this.itemQuery.planId,
+        productId: this.itemQuery.productId,
+        deviceCode: this.itemQuery.deviceCode,
+        itemCodes: this.chooseItemList
+      }
+      devicePlanDetailItemAdd(param).then(res => {
+        loading.close()
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.chooseItemList = []
+        this.$message.success(res.message)
+        this.chooseDetailItemFlag = false
+        this.itemQuery.page = 1
+        this.getDetailItemList()
+
+      }).catch(e => {
+        loading.close()
+      })
+    },
+
+    closePlanEdit() {
+      this.createFlag = false;
+      this.getList()
+    },
+
+
+    deviceSelectChangFunc(list) {
+      this.chooseDeviceList = list.map(i => i.deviceCode)
+    },
+
+    //新增编辑计划
+    openCreate(planId, row) {
+      if (planId != null) {
+        this.planEditTitle = `编辑巡检计划信息${row.planId ? '--(' + row.name + ')' : ''}`;
+        this.planData = row;
+      } else {
+        this.planEditTitle = "新增计划";
+        this.planData = {};
+      }
+      this.createFlag = true;
+
+
+      // this.createActive = 0
+      // if (createActive != null) {
+      //   this.createActive = createActive
+      // }
+      // if (planId != null) {
+      //   devicePlanInfo(planId).then(res => {
+      //     if (res.code != 20000) {
+      //       this.$message.error(res.message)
+      //       return
+      //     }
+      //     this.planData = {...res.data}
+      //     this.createFlag = true
+      //     if (createActive == 1) {
+      //       this.detailQuery = {...detailQuery, planId: planId}
+      //       this.getDetailList()
+      //     } else if (createActive == 2) {
+      //       this.itemQuery = {
+      //         ...detailQuery,
+      //         planId: planId,
+      //         productId: row.productId,
+      //         deviceCode: row.deviceCode,
+      //         title: `${row.deviceCode ? row.deviceCode + '--' : ''}${row.productName}(${row.nameCode})`
+      //       }
+      //       this.getDetailItemList()
+      //     }
+      //   })
+      // } else {
+      //   this.planData = {...planData}
+      //   this.createFlag = true
+      // }
+    },
+    search() {
+      this.query.page = 1
+      this.getList()
+    },
+    onReset() {
+      this.query = {...query}
+      this.getList()
+    },
+    getList() {
+      this.loading = true
+      devicePlanPage(this.query).then(res => {
+        this.loading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.list = res.data.list || []
+        this.total = res.data.total || 0
+
+      }).catch(e => {
+        this.loading = false
+      })
+    },
+    setProject(row) {
+      this.projectVisible = true
+      this.projectItem = row
+    },
+  }
+}
+
+
+</script>
+
 
 <style scoped>
 
diff --git a/src/views/dev/devicePlanEdit.vue b/src/views/dev/devicePlanEdit.vue
new file mode 100644
index 00000000..3e2c9e71
--- /dev/null
+++ b/src/views/dev/devicePlanEdit.vue
@@ -0,0 +1,387 @@
+<template>
+  <div>
+    <el-card>
+      <div slot="header" class="clearfix">
+        <div class="fr">
+          <el-button size="mini" type="primary" @click.native="saveOrder(1)"
+          >草稿保存
+          </el-button>
+          <el-button size="mini" type="primary" @click.native="saveOrder(2)"
+          >立即提交
+          </el-button>
+        </div>
+      </div>
+      <el-form :model="planData" :rules="formRule" ref="dataForm" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="11">
+            <el-form-item label="计划名称" prop="name">
+              <el-input v-model.trim="planData.name" show-word-limit maxlength="100" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="11">
+            <el-form-item label="负责部门" prop="chargeDeptCode">
+              <deptSelect :value.sync="planData.chargeDeptCode"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="11">
+            <el-form-item label="执行区间" prop="dateInterval">
+              <el-date-picker
+                style="width: 100%"
+                v-model.trim="planData.dateInterval"
+                type="daterange"
+                align="right"
+                editable
+                value-format="yyyy-MM-dd"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                :picker-options="pickerOptions">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="11">
+            <el-form-item prop="frequency">
+              <template slot="label">
+                执行频率
+              </template>
+              <el-input-number :min="1" :max="999999" v-model.trim="planData.frequency"/>
+              <span class="ml10">天
+                 <el-tooltip class="item" effect="dark" content="执行频率(次),例:每30天执行一次"
+                             placement="top">
+                  <el-icon class="el-icon-question"/>
+                </el-tooltip></span>
+              <!--              <span class="ml10">快捷选项:</span>-->
+              <!--              <el-button type="" @click="planData.frequency=30">一个月</el-button>-->
+              <!--              <el-button type="" @click="planData.frequency=30*3">三个月</el-button>-->
+              <!--              <el-button type="" @click="planData.frequency=30*6">半年</el-button>-->
+              <!--              <el-button type="" @click="planData.frequency=365">一年</el-button>-->
+              <!--              <el-button type="" @click="planData.frequency=365*2">两年</el-button>-->
+              <!--              <el-button type="" @click="planData.frequency=365*3">三年</el-button>-->
+            </el-form-item>
+          </el-col>
+          <el-col :span="11">
+            <el-form-item label="备注">
+              <el-input type="textarea" v-model.trim="planData.remark" resize="none" :autosize="{minRows:1,maxRows:8}"
+                        show-word-limit maxlength="500" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+
+    <el-card>
+      <div slot="header" class="clearfix">
+        <div class="fr">
+          <el-button type="primary" @click="addDevice()">添加设备</el-button>
+          <el-button type="primary" @click="batchSetProject()">批量设置巡检项目</el-button>
+          <el-button type="" @click="getDetailList">刷新</el-button>
+        </div>
+      </div>
+      <el-table :data="detailList" v-loading="detailLoading" click-row-light
+                highlight-current-row>
+        <el-table-column label="序号" width="50" type="index"/>
+        <el-table-column label="科室名称" prop="deptName"/>
+        <el-table-column label="设备编号" prop="deviceCode"/>
+        <el-table-column label="最小销售标识" prop="nameCode"/>
+        <el-table-column label="名称" prop="productName"/>
+        <el-table-column label="规格型号" prop="ggxh"/>
+        <el-table-column label="计量单位" prop="measname"/>
+        <el-table-column label="生产企业" prop="manufactory"/>
+        <el-table-column label="注册/备案号" prop="zczbhhzbapzbh"/>
+        <el-table-column label="操作" width="120">
+          <template slot-scope="scope">
+            <el-button type="text" @click="setProject(scope.row)"
+            >巡检项目
+            </el-button>
+            <el-button type="text" @click="delProject(scope.row)"
+            >移除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="detailTotal>0"
+        :total="detailTotal"
+        :page.sync="detailQuery.page"
+        :limit.sync="detailQuery.limit"
+        @pagination="getDetailList"
+      />
+    </el-card>
+
+    <el-dialog
+      title="添加设备"
+      :visible="true"
+      v-if="chooseDeviceFlag"
+      @close="chooseDeviceFlag = false"
+      width="80%"
+    >
+      <DeviceAdd style="margin: 0"
+                 :planId="detailQuery.planId"
+                 :planData="planData"
+                 :closeAddDevice="closeAddDevice"/>
+    </el-dialog>
+
+    <el-dialog
+      title="编辑巡检项目"
+      :visible="true"
+      v-if="projectVisible"
+      @close="projectVisible = false"
+      width="80%"
+    >
+      <DevicePlanProject style="margin: 0"
+                         :planId="detailQuery.planId"
+                         :projectItem="projectItem"
+                         :closeAddDevice="closeAddDevice"/>
+    </el-dialog>
+
+
+    <el-dialog
+      title="批量设置巡检项目"
+      :visible="true"
+      v-if="chooseDetailItemFlag"
+      @close="chooseDetailItemFlag = false"
+      width="80%"
+    >
+      <deviceProjectAdd style="margin: 0"
+                        :planId="planData.planId"
+                        :type="2"
+                        :closeAddDevice="closeBatchSetProject"/>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  devicePlanDetailAdd, devicePlanDetailDel,
+  devicePlanDetailDelByDeviceCode,
+  devicePlanDetailPage
+} from "@/api/dev/devicePlanDetailApi";
+import {getLoading} from "@/utils";
+import DeviceAdd from "@/views/dev/deviceAdd";
+import {devicePlanDetailItemAdd} from "@/api/dev/devicePlanDetailItemApi";
+import DevicePlanProject from "@/views/dev/devicePlanProject";
+import {devicePlanSave} from "@/api/dev/devicePlanApi";
+import deviceProjectAdd from "@/views/dev/deviceProjectAdd";
+
+export default {
+  name: "devicePlanEdit",
+  components: {DevicePlanProject, DeviceAdd, deviceProjectAdd},
+  props: {
+    originData: {
+      type: Object,
+      required: true
+    },
+    closePlanEdit: {required: false, type: Function}
+  },
+  data() {
+    return {
+      planData: {},
+      formRule: {
+        name: [{required: true, message: "计划名称不能为空", trigger: ["change", "blur"]}],
+        chargeDeptCode: [{required: true, message: "负责部门不能为空", trigger: ["change", "blur"]}],
+        dateInterval: [{required: true, message: "计划执行区间不能为空", trigger: ["change", "blur"]}],
+        frequency: [{
+          required: true,
+          message: "计划执行频率不能为空",
+          trigger: ["change", "blur"]
+        }],
+      },
+      detailList: [],
+      detailTotal: 0,
+      detailQuery: {},
+      detailLoading: false,
+      chooseDeviceList: [],
+      chooseDeviceFlag: false,
+      pickerOptions: {
+        disabledDate: time => {
+          let nowDate = new Date().getTime();
+          let pickDate = new Date(time).getTime();
+          return (nowDate >= pickDate);
+        },
+        shortcuts: [{
+          text: '一个月(30天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '三个月(90天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30 * 3);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '半年(180天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 30 * 6);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '一年(365天)',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() + 3600 * 1000 * 24);
+            end.setTime(start.getTime() + 3600 * 1000 * 24 * 365);
+            picker.$emit('pick', [start, end]);
+          }
+        }]
+      },
+      chooseItemList: [],
+
+      //巡检项目
+      projectVisible: false,
+      projectItem: null,
+      chooseDetailItemFlag: false,
+    }
+  },
+
+  methods: {
+    getDetailList() {
+      this.detailLoading = true
+      devicePlanDetailPage(this.detailQuery).then(res => {
+        this.detailLoading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.detailList = res.data.list || []
+        this.detailTotal = res.data.total || 0
+      }).catch(e => {
+        this.detailList = []
+        this.detailTotal = 0
+        this.detailLoading = false
+      })
+    },
+
+    addDevice() {
+      this.$refs["dataForm"].validate(valid => {
+        if (valid) {
+          this.chooseDeviceFlag = true
+        }
+      });
+    },
+    closeAddDevice(data) {
+      this.chooseDeviceFlag = false
+      this.planData = data
+      this.getDetailList()
+    },
+
+    batchSetProject() {
+      this.chooseDetailItemFlag = true;
+    },
+    closeBatchSetProject() {
+      this.chooseDetailItemFlag = false;
+    },
+
+
+    setProject(row) {
+      this.projectVisible = true
+      this.projectItem = row
+    },
+
+    delProject(row) {
+      this.$confirm("此操作将会永久删除该条明细,且将在下一次任务生效,现有任务不受影响,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        devicePlanDetailDelByDeviceCode(row.planId, row.deviceCode).then(res => {
+          load.close()
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.detailQuery.page = 1
+          this.getDetailList()
+        }).catch(() => {
+          load.close()
+        })
+      })
+    },
+
+    saveOrder(status) {
+      this.planData.status = status;
+      devicePlanSave(this.planData).then(res => {
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.closePlanEdit();
+        this.$message.success("保存成功!")
+      }).catch(e => {
+      })
+    },
+
+    chooseDevice(multiData) {
+      let loading = getLoading(this)
+      let param = {
+        planId: this.planData.planId,
+        deviceCodes: multiData
+      }
+      devicePlanDetailAdd(param).then(res => {
+        loading.close()
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.chooseDeviceList = []
+        this.$message.success(res.message)
+        this.chooseDeviceFlag = false
+        this.detailQuery.page = 1
+        this.getDetailList()
+
+      }).catch(e => {
+        loading.close()
+      })
+    },
+
+
+  },
+
+  created() {
+    if (this.originData != null) {
+      this.planData = this.originData;
+    }
+    this.detailQuery = {
+      planId: this.planData.planId,
+      page: 1,
+      limit: 10
+    }
+    this.getDetailList()
+  },
+
+  watch: {
+    planData(v) {
+      if (v.planId != null) {
+        this.$set(v, "dateInterval", [v.startDate, v.endDate])
+      }
+    },
+    "planData.dateInterval"(v) {
+      if (v != null && v.length > 0) {
+        this.planData.startDate = v[0]
+        this.planData.endDate = v[1]
+      }
+    },
+    "$refs.dialogTable"(v) {
+
+      this.$refs.dialogTable?.doLayout()
+    }
+  },
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/dev/devicePlanProject.vue b/src/views/dev/devicePlanProject.vue
new file mode 100644
index 00000000..a565a01f
--- /dev/null
+++ b/src/views/dev/devicePlanProject.vue
@@ -0,0 +1,175 @@
+<template>
+  <div>
+    <el-card>
+      <div slot="header" class="clearfix">
+        <div class="fr">
+          <el-button type="primary" @click="chooseItemList=[];chooseDetailItemFlag=true">添加巡检项目</el-button>
+          <el-button type="" @click="getDetailItemList">刷新</el-button>
+        </div>
+      </div>
+      <el-table :data="itemList" ref="itemTable" v-loading="itemLoading" row-key="itemCode">
+        <el-table-column label="序号" width="50" type="index"/>
+        <el-table-column label="项目编码" width="150" prop="itemCode"/>
+        <el-table-column label="项目名称" width="200" prop="name"/>
+        <el-table-column label="项目内容" width="250" prop="content"/>
+        <el-table-column label="操作" width="150">
+          <template slot-scope="scope">
+            <el-button type="text"
+                       @click="delDetailItem(scope.row)"
+            >移除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--      <pagination-->
+      <!--        v-show="itemTotal>0"-->
+      <!--        :total="itemTotal"-->
+      <!--        :page.sync="itemQuery.page"-->
+      <!--        :limit.sync="itemQuery.limit"-->
+      <!--        @pagination="getDetailItemList"-->
+      <!--      />-->
+    </el-card>
+
+    <el-dialog
+      title="添加巡检项目"
+      :visible="true"
+      v-if="chooseDetailItemFlag"
+      @close="chooseDetailItemFlag = false"
+      width="80%"
+    >
+      <deviceProjectAdd style="margin: 0"
+                        :planId="projectItem.planId"
+                        :projectItem="projectItem"
+                        :closeAddDevice="closeAddDevice"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  devicePlanDetailItemAdd,
+  devicePlanDetailItemByDeviceCodeDel,
+  devicePlanDetailItemDel,
+  devicePlanDetailItemPage
+} from "@/api/dev/devicePlanDetailItemApi";
+import {getLoading} from "@/utils";
+import deviceProjectAdd from "@/views/dev/deviceProjectAdd";
+
+export default {
+  name: "devicePlanProject",
+  props: {
+    projectItem: {
+      type: Object,
+      required: true
+    },
+    planId: {
+      type: Object,
+      required: true
+    },
+  },
+  data() {
+    return {
+      itemList: [],
+      itemTotal: 0,
+      itemLoading: false,
+      itemQuery: {
+        planId: null,
+        page: 1,
+        limit: 10,
+        deviceCode: '',
+        itemCode: '',
+        name: '',
+        content: '',
+      },
+      chooseItemList: [],
+      chooseDetailItemFlag: false,
+    }
+  },
+  methods: {
+    getDetailItemList() {
+      this.itemLoading = true
+      this.itemQuery.deviceCode = this.projectItem.deviceCode
+      this.itemQuery.planId = this.projectItem.planId
+      devicePlanDetailItemPage(this.itemQuery).then(res => {
+        this.itemLoading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.itemList = res.data.list || []
+        this.itemTotal = res.data.total || 0
+      }).catch(e => {
+        this.itemList = []
+        this.itemTotal = 0
+        this.itemLoading = false
+      })
+    },
+    delDetailItem(row) {
+      this.$confirm("此操作将会永久删除该条明细,且将在下一次任务生效,现有任务不受影响,是否继续", "提示", {
+        confirmButtonText: "继续",
+        cancelButtonText: "取消"
+      }).then(() => {
+        let load = getLoading(this)
+        devicePlanDetailItemByDeviceCodeDel(row.planId, row.deviceCode, row.itemCode).then(res => {
+          load.close()
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.itemQuery.page = 1
+          this.getDetailItemList()
+        }).catch(() => {
+          load.close()
+        })
+      })
+    },
+    chooseDetailItem() {
+      let loading = getLoading(this)
+      let param = {
+        planId: this.itemQuery.planId,
+        productId: this.itemQuery.productId,
+        deviceCode: this.itemQuery.deviceCode,
+        itemCodes: this.chooseItemList
+      }
+      devicePlanDetailItemAdd(param).then(res => {
+        loading.close()
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.chooseItemList = []
+        this.$message.success(res.message)
+        this.chooseDetailItemFlag = false
+        this.itemQuery.page = 1
+        this.getDetailItemList()
+
+      }).catch(e => {
+        loading.close()
+      })
+    },
+    itemSelectChangFunc(list) {
+      this.chooseItemList = list.map(i => i.code)
+    },
+
+
+    closeAddDevice() {
+      this.chooseDetailItemFlag = false;
+      this.getDetailItemList()
+    },
+  },
+
+  created() {
+    this.getDetailItemList()
+  },
+
+  components: {
+    deviceProjectAdd
+  }
+  ,
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/dev/deviceProjectAdd.vue b/src/views/dev/deviceProjectAdd.vue
new file mode 100644
index 00000000..2d78c677
--- /dev/null
+++ b/src/views/dev/deviceProjectAdd.vue
@@ -0,0 +1,219 @@
+<template>
+  <div>
+    <el-card>
+
+      <el-form :model="query" v-if="showSearch" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="项目编码">
+              <el-input v-model="query.code" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="项目名称">
+              <el-input v-model="query.name" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div class="top-right-btn">
+        <el-button-group>
+          <el-button icon="el-icon-view" type="primary" @click="showSearch = !showSearch">显示/隐藏搜索栏</el-button>
+          <el-button
+            type="primary"
+            icon="el-icon-refresh"
+            @click="onReset"
+          >重置
+          </el-button>
+          <el-button type="primary" icon="el-icon-search" @click="search"
+          >查询
+          </el-button>
+          <el-button type="primary" icon="el-icon-plus" @click="combine"
+          >选入
+          </el-button>
+        </el-button-group>
+      </div>
+      <el-divider style="margin: 15px"></el-divider>
+
+      <el-table :data="list"
+                v-loading="loading" ref="table"
+                click-row-light>
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column label="序号" width="50" type="index"/>
+        <el-table-column label="项目编码" width="150" prop="code"/>
+        <el-table-column label="项目名称" width="200" prop="name"/>
+        <el-table-column label="项目内容" width="250" prop="content"/>
+        <el-table-column label="创建人" width="120" prop="createUserName"/>
+        <el-table-column label="创建时间" width="140" prop="createTime"/>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="query.page"
+        :limit.sync="query.limit"
+        @pagination="getList"
+      />
+    </el-card>
+
+  </div>
+</template>
+
+<script>
+import {
+  deviceCheckItemDictPage,
+} from "@/api/dev/deviceCheckItemDictApi";
+import {devicePlanDetailItemAdd, devicePlanDetailItemBatchAdd} from "@/api/dev/devicePlanDetailItemApi";
+import {getLoading} from "@/utils";
+import {devicePlanDetailDelByDeviceCode} from "@/api/dev/devicePlanDetailApi";
+
+let query = {
+  page: 1,
+  limit: 10,
+  name: null,
+  code: null,
+}
+
+let saveData = {
+  code: null,
+  name: null,
+  content: null,
+}
+
+export default {
+  name: "deviceCheckItemDict",
+  props: {
+    projectItem: {
+      type: Object,
+      required: true
+    },
+    planId: {
+      type: Object,
+      required: true
+    },
+    type: {
+      type: Object,
+      required: true
+    },
+    isChoose: {required: false, default: false, type: Boolean},
+    closeAddDevice: {required: false, type: Function}
+  },
+  data() {
+    return {
+      showSearch: true,
+      loading: false,
+      total: .0,
+      list: [],
+      query: {...query},
+      createFlag: false,
+      saveData: {...saveData},
+      formRule: {
+        code: [{required: true, message: "项目编码不能为空", trigger: "change"}],
+        name: [{required: true, message: "项目名称不能为空", trigger: "change"}],
+        content: [{required: true, message: "项目内容不能为空", trigger: "change"}]
+      },
+      chooseItemList: [],
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    search() {
+      this.query.page = 1
+      this.getList()
+    },
+    onReset() {
+      this.query = {...query}
+      this.getList()
+    },
+    getList() {
+      this.loading = true
+      deviceCheckItemDictPage(this.query).then(res => {
+        this.loading = false
+        if (res.code != 20000) {
+          this.$message.error(res.message)
+          return
+        }
+        this.list = res.data.list || []
+        this.total = res.data.total || 0
+
+      }).catch(e => {
+        this.loading = false
+      })
+    },
+
+    combine() {
+      let selectList = this.$refs.table.selection
+      if (selectList.length == 0) {
+        this.$message.error("请选择巡检项目")
+        return
+      }
+      if (this.type == 2) {
+        this.$confirm("此操作将会批量添加或覆盖该计划下所有设备巡检项目,是否继续", "提示", {
+          confirmButtonText: "继续",
+          cancelButtonText: "取消"
+        }).then(() => {
+          this.addProject()
+        })
+      } else {
+        this.addProject()
+      }
+    },
+
+
+    addProject() {
+      let selectList = this.$refs.table.selection
+      if (selectList.length == 0) {
+        this.$message.error("请选择巡检项目")
+        return
+      }
+      this.chooseItemList = selectList.map(item => item.code)
+
+
+      if (this.type == 2) {
+        let param = {
+          planId: this.planId,
+          itemCodes: this.chooseItemList
+        }
+        devicePlanDetailItemBatchAdd(param).then(res => {
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.closeAddDevice()
+        }).catch(e => {
+        })
+      } else {
+
+        let param = {
+          planId: this.projectItem.planId,
+          productId: this.projectItem.productId,
+          deviceCode: this.projectItem.deviceCode,
+          itemCodes: this.chooseItemList
+        }
+        devicePlanDetailItemAdd(param).then(res => {
+          if (res.code != 20000) {
+            this.$message.error(res.message)
+            return
+          }
+          this.$message.success(res.message)
+          this.closeAddDevice()
+        }).catch(e => {
+        })
+      }
+    },
+  }
+}
+
+
+</script>
+
+
+<style scoped>
+
+/deep/ .el-dialog__body {
+  padding: 0 0 20px 0;
+}
+
+</style>
diff --git a/src/views/dev/js/devicePlan.js b/src/views/dev/js/devicePlan.js
index 7f6456b5..104ace2e 100644
--- a/src/views/dev/js/devicePlan.js
+++ b/src/views/dev/js/devicePlan.js
@@ -370,7 +370,7 @@ export default {
       this.detailLoading = true
       this.expandRowKeys = []
       this.dialogExpandRowKeys = []
-      devicePlanDetailGroupPage(this.detailQuery).then(res => {
+      devicePlanDetailPage(this.detailQuery).then(res => {
         this.detailLoading = false
         if (res.code != 20000) {
           this.$message.error(res.message)
@@ -490,36 +490,41 @@ export default {
       })
     },
     openCreate(planId, row, createActive) {
-      this.createActive = 0
-      if (createActive != null) {
-        this.createActive = createActive
-      }
-      if (planId != null) {
-        devicePlanInfo(planId).then(res => {
-          if (res.code != 20000) {
-            this.$message.error(res.message)
-            return
-          }
-          this.planData = {...res.data}
-          this.createFlag = true
-          if (createActive == 1) {
-            this.detailQuery = {...detailQuery, planId: planId}
-            this.getDetailList()
-          } else if (createActive == 2) {
-            this.itemQuery = {
-              ...detailQuery,
-              planId: planId,
-              productId: row.productId,
-              deviceCode: row.deviceCode,
-              title: `${row.deviceCode ? row.deviceCode + '--' : ''}${row.productName}(${row.nameCode})`
-            }
-            this.getDetailItemList()
-          }
-        })
-      } else {
-        this.planData = {...planData}
-        this.createFlag = true
-      }
+
+
+
+
+
+      // this.createActive = 0
+      // if (createActive != null) {
+      //   this.createActive = createActive
+      // }
+      // if (planId != null) {
+      //   devicePlanInfo(planId).then(res => {
+      //     if (res.code != 20000) {
+      //       this.$message.error(res.message)
+      //       return
+      //     }
+      //     this.planData = {...res.data}
+      //     this.createFlag = true
+      //     if (createActive == 1) {
+      //       this.detailQuery = {...detailQuery, planId: planId}
+      //       this.getDetailList()
+      //     } else if (createActive == 2) {
+      //       this.itemQuery = {
+      //         ...detailQuery,
+      //         planId: planId,
+      //         productId: row.productId,
+      //         deviceCode: row.deviceCode,
+      //         title: `${row.deviceCode ? row.deviceCode + '--' : ''}${row.productName}(${row.nameCode})`
+      //       }
+      //       this.getDetailItemList()
+      //     }
+      //   })
+      // } else {
+      //   this.planData = {...planData}
+      //   this.createFlag = true
+      // }
     },
     search() {
       this.query.page = 1
diff --git a/src/views/myLogin.vue b/src/views/myLogin.vue
index 558ee32d..2a3a4f43 100644
--- a/src/views/myLogin.vue
+++ b/src/views/myLogin.vue
@@ -24,6 +24,8 @@
             placeholder="账号"
             name="username"
             autocomplete="on"
+            readonly
+            onfocus="this.removeAttribute('readonly');"
             v-model="loginForm.username"
           >
             <i slot="prefix" class="el-input__icon">