fangq vor 4 Jahren
Ursprung
Commit
2c2fb09348

+ 9 - 2
src/api/ship/cable.js

@@ -34,7 +34,7 @@ export const remove = (ids) => {
 
 export const add = (row) => {
   return request({
-    url: '/api/ship/cable/submit',
+    url: '/api/ship/cable/save',
     method: 'post',
     data: row
   })
@@ -42,9 +42,16 @@ export const add = (row) => {
 
 export const update = (row) => {
   return request({
-    url: '/api/ship/cable/submit',
+    url: '/api/ship/cable/update',
     method: 'post',
     data: row
   })
 }
 
+export const getCableList = () => {
+  return request({
+    url: '/api/ship/cable/getCableList',
+    method: 'get',
+  })
+}
+

+ 50 - 0
src/api/ship/ship.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/ship/ship/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/ship/ship/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/ship/ship/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/ship/ship/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/ship/ship/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/ship/shipyard.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/ship/shipyard/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/ship/shipyard/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/ship/shipyard/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/ship/shipyard/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/ship/shipyard/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 695 - 151
src/views/ship/cable.vue

@@ -19,6 +19,12 @@
                @refresh-change="refreshChange"
                @on-load="onLoad">
       <template slot="menuLeft">
+        <el-button type="primary"
+                   size="small"
+                   icon="el-icon-plus"
+                   v-if="permission.cable_add"
+                   @click="$refs.crudForm.rowAdd()">新 增
+        </el-button>
         <el-button type="danger"
                    size="small"
                    icon="el-icon-delete"
@@ -26,6 +32,18 @@
                    v-if="permission.cable_delete"
                    @click="handleDelete">删 除
         </el-button>
+        <el-button type="success"
+                   size="small"
+                   plain
+                   icon="el-icon-upload2"
+                   @click="excelBox = true">导入
+        </el-button>
+        <el-button type="warning"
+                   size="small"
+                   plain
+                   icon="el-icon-download"
+                   @click="handleExport">导出
+        </el-button>
       </template>
 
       <template slot-scope="{type,size}" slot="createTimeSearch">
@@ -58,7 +76,50 @@
           <el-radio-button :label="select.dictKey" v-for="(select,index) in modelList" :key="index">{{ select.dictValue }}</el-radio-button>
         </el-radio-group>
       </template>
+
+      <template slot-scope="{row}" slot="menu" >
+        <el-button style="margin-left:10px;" size="small" type="text" icon="el-icon-view" @click="$refs.crudForm.rowView(row, row.$index)"> 查 看</el-button>
+        <el-button style="margin-left:10px;" size="small" type="text" icon="el-icon-edit" v-if="permission.cable_edit && row.status == 1" @click="$refs.crudForm.rowEdit(row, row.$index)"> 编 辑</el-button>
+        <el-button style="margin-left:10px;color: red" size="small" type="text" icon="el-icon-remove-outline" v-if="row.status == 1" @click="rowDisabled(row, true)">停用</el-button>
+        <el-button style="margin-left:10px;" size="small" type="text" icon="el-icon-document-checked" v-else @click="rowDisabled(row, false)">启用</el-button>
+        <el-button style="margin-left:10px;" size="small" type="text" icon="el-icon-paperclip" @click.native="bindTag(row)">标签绑定</el-button>
+      </template>
     </avue-crud>
+
+    <el-dialog title="数据导入"
+               append-to-body
+               :visible.sync="excelBox"
+               width="555px">
+      <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="handleTemplate">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+    </el-dialog>
+
+    <div v-show="false">
+      <avue-crud :option="optionForm"
+                 :table-loading="loading"
+                 :data="data"
+                 :page.sync="page"
+                 :permission="permissionList"
+                 :before-open="beforeOpen"
+                 v-model="form"
+                 ref="crudForm"
+                 @row-update="rowUpdate"
+                 @row-save="rowSave"
+                 @row-del="rowDel"
+                 @search-change="searchChange"
+                 @search-reset="searchReset"
+                 @selection-change="selectionChange"
+                 @current-change="currentChange"
+                 @size-change="sizeChange"
+                 @refresh-change="refreshChange"
+                 @on-load="onLoad">
+      </avue-crud>
+    </div>
   </basic-container>
 </template>
 
@@ -66,10 +127,66 @@
   import {getList, getDetail, add, update, remove} from "@/api/ship/cable";
   import {mapGetters} from "vuex";
   import moment from "moment";
+  import {getToken} from '@/util/auth';
 
   export default {
     data() {
       return {
+        excelBox: false,
+
+        excelForm: {},
+        excelOption: {
+          submitBtn: false,
+          emptyBtn: false,
+          column: [
+            {
+              label: '模板上传',
+              prop: 'excelFile',
+              type: 'upload',
+              drag: true,
+              loadText: '模板上传中,请稍等',
+              span: 24,
+              propsHttp: {
+                res: 'data'
+              },
+              tip: '请上传 .xls,.xlsx 标准格式文件',
+              action: "/api/ship/cable/import-cable"
+            },
+            {
+              label: "数据覆盖",
+              prop: "isCovered",
+              type: "switch",
+              align: "center",
+              width: 80,
+              dicData: [
+                {
+                  label: "否",
+                  value: 0
+                },
+                {
+                  label: "是",
+                  value: 1
+                }
+              ],
+              value: 0,
+              slot: true,
+              rules: [
+                {
+                  required: true,
+                  message: "请选择是否覆盖",
+                  trigger: "blur"
+                }
+              ]
+            },
+            {
+              label: '模板下载',
+              prop: 'excelTemplate',
+              formslot: true,
+              span: 24,
+            }
+          ]
+        },
+
         categoryList: [],
         modelList: [],
 
@@ -86,6 +203,7 @@
         },
         selectionList: [],
         option: {
+          indexLabel: "序号",
           height:'auto',
           calcHeight: 30,
           tip: false,
@@ -93,11 +211,36 @@
           searchMenuSpan: 6,
           border: true,
           index: true,
-          viewBtn: true,
+          viewBtn: false,
+          editBtn: false,
+          addBtn: false,
           selection: true,
           dialogClickModal: false,
           searchSize: "mini",
+          align: "center",
           column: [
+            {
+              label: "船号",
+              prop: "shipNo",
+              search: true,
+              searchSpan: 4,
+              rules: [{
+                required: true,
+                message: "请输入船号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "图号",
+              prop: "pictureNo",
+              search: true,
+              searchSpan: 4,
+              rules: [{
+                required: true,
+                message: "请输入图号",
+                trigger: "blur"
+              }]
+            },
             {
               label: "电缆代号",
               prop: "alias",
@@ -118,10 +261,11 @@
                 label: "dictValue",
                 value: "dictKey"
               },
-              dicData: [],
+              // dicData: [],
               searchslot: true,
               dicFormatter: (res) => {
                 this.categoryList = res.data;
+                // this.findObject(this.option.column, 'category').dicData = res.data;
                 return res.data;
               },
               search: true,
@@ -134,205 +278,345 @@
               }]
             },
             {
-              label: "型号",
-              prop: "model",
-              type: "select",
-              dicUrl: `/api/blade-system/dict/dictionary?code=cable_model`,
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              dicData: [],
-              searchslot: true,
-              dicFormatter: (res) => {
-                this.modelList = res.data;
-                return res.data;
-              },
-              search: true,
-              searchSpan: 24,
-              searchOrder: 1,
-              rules: [{
-                required: true,
-                message: "请输入型号",
-                trigger: "blur"
-              }]
+              label: "电缆",
+              children: [
+                {
+                  label: "型号",
+                  prop: "model",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=cable_model`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  // dicData: [],
+                  searchslot: true,
+                  dicFormatter: (res) => {
+                    this.modelList = res.data;
+                    // this.findObject(this.option.column, 'model').dicData = res.data;
+                    return res.data;
+                  },
+                  search: true,
+                  searchSpan: 24,
+                  searchOrder: 1,
+                  rules: [{
+                    required: true,
+                    message: "请输入型号",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "规格",
+                  prop: "specs",
+                  search: true,
+                  searchSpan: 4,
+                  rules: [{
+                    required: true,
+                    message: "请输入规格",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "直径",
+                  prop: "diameter",
+                  rules: [{
+                    required: true,
+                    message: "请输入直径",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
             {
-              label: "规格",
-              prop: "specs",
-              search: true,
-              searchSpan: 4,
-              rules: [{
-                required: true,
-                message: "请输入规格",
-                trigger: "blur"
-              }]
+              label: "电缆从何处起点",
+              children: [
+                {
+                  label: "舱室",
+                  prop: "beginCabin",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入舱室",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "设备名称",
+                  prop: "beginName",
+                  rules: [{
+                    required: true,
+                    message: "请输入设备名称",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "甲板",
+                  prop: "beginDeck",
+                  rules: [{
+                    required: true,
+                    message: "请输入甲板",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "船舷",
+                  prop: "beginShipSide",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入船舷",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "肋位",
+                  prop: "beginRibPosition",
+                  rules: [{
+                    required: true,
+                    message: "请输入肋位",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
+
             {
-              label: "直径",
-              prop: "diameter",
+              label: "经过节点",
+              prop: "passNode",
               rules: [{
                 required: true,
-                message: "请输入直径",
+                message: "请输入经过节点",
                 trigger: "blur"
               }]
             },
             {
-              label: "起点舱室",
-              prop: "beginCabin",
-              type: "select",
-              dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              rules: [{
-                required: true,
-                message: "请输入起点舱室",
-                trigger: "blur"
-              }]
+              label: "电缆到何处终点",
+              children: [
+                {
+                  label: "舱室",
+                  prop: "endCabin",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入舱室",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "设备名称",
+                  prop: "endName",
+                  rules: [{
+                    required: true,
+                    message: "请输入设备名称",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "甲板",
+                  prop: "endDeck",
+                  rules: [{
+                    required: true,
+                    message: "请输入甲板",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "船舷",
+                  prop: "endShipSide",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入船舷",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "肋位",
+                  prop: "endRibPosition",
+                  rules: [{
+                    required: true,
+                    message: "请输入肋位",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
             {
-              label: "起点设备名称",
-              prop: "beginName",
-              rules: [{
-                required: true,
-                message: "请输入起点设备名称",
-                trigger: "blur"
-              }]
+              label: "电缆长度(米)",
+              children: [
+                {
+                  label: "停止点",
+                  prop: "stopPoint",
+                  rules: [{
+                    required: false,
+                    message: "请输入停止点",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "前长度",
+                  prop: "frontLen",
+                  rules: [{
+                    required: false,
+                    message: "请输入前长度",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "总长",
+                  prop: "len",
+                  rules: [{
+                    required: true,
+                    message: "请输入总长",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
+
             {
-              label: "起点甲板",
-              prop: "beginDeck",
+              label: "系统图号",
+              prop: "drawingNo",
               rules: [{
                 required: true,
-                message: "请输入起点甲板",
+                message: "请输入系统图号",
                 trigger: "blur"
               }]
             },
+
             {
-              label: "起点船舷",
-              prop: "beginShipSide",
-              type: "select",
-              dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
+              label: "备注",
+              prop: "remark",
               rules: [{
-                required: true,
-                message: "请输入起点船舷",
+                required: false,
+                message: "请输入备注",
                 trigger: "blur"
               }]
             },
             {
-              label: "起点肋位",
-              prop: "beginRibPosition",
+              label: "标签",
+              prop: "label",
+              addDisplay: false,
+              editDisplay: false,
               rules: [{
                 required: true,
-                message: "请输入起点肋位",
+                message: "请输入标签",
                 trigger: "blur"
               }]
             },
             {
-              label: "经过节点",
-              prop: "passNode",
-              rules: [{
-                required: true,
-                message: "请输入经过节点",
-                trigger: "blur"
-              }]
+              label: "创建时间",
+              prop: "createTime",
+              type: "datetime",
+              format: "yyyy-MM-dd HH:mm:ss",
+              valueFormat: "yyyy-MM-dd HH:mm:ss",
+              searchRange:true,
+              addDisplay: false,
+              editDisplay: false,
+              search: true,
+              searchSpan: 24,
+              searchOrder: 0,
+              searchslot: true,
             },
+          ]
+        },
+        optionForm: {
+          tabs: true,
+          column: [
             {
-              label: "终点舱室",
-              prop: "endCabin",
-              type: "select",
-              dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
+              label: "船号",
+              prop: "shipNo",
+              search: true,
+              searchSpan: 4,
               rules: [{
                 required: true,
-                message: "请输入终点舱室",
+                message: "请输入船号",
                 trigger: "blur"
               }]
             },
             {
-              label: "终点设备名称",
-              prop: "endName",
+              label: "图号",
+              prop: "pictureNo",
+              search: true,
+              searchSpan: 4,
               rules: [{
                 required: true,
-                message: "请输入终点设备名称",
+                message: "请输入图号",
                 trigger: "blur"
               }]
             },
             {
-              label: "终点甲板",
-              prop: "endDeck",
+              label: "电缆代号",
+              prop: "alias",
+              search: true,
+              searchSpan: 4,
               rules: [{
                 required: true,
-                message: "请输入终点甲板",
+                message: "请输入电缆代号",
                 trigger: "blur"
               }]
             },
             {
-              label: "终点船舷",
-              prop: "endShipSide",
+              label: "类别",
+              prop: "category",
               type: "select",
-              dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
+              dicUrl: `/api/blade-system/dict/dictionary?code=cable_category`,
               props: {
                 label: "dictValue",
                 value: "dictKey"
               },
+              // dicData: [],
+              searchslot: true,
+              dicFormatter: (res) => {
+                this.categoryList = res.data;
+                // this.findObject(this.option.column, 'category').dicData = res.data;
+                return res.data;
+              },
+              search: true,
+              searchSpan: 24,
+              searchOrder: 1,
               rules: [{
                 required: true,
-                message: "请输入终点船舷",
+                message: "请输入类别",
                 trigger: "blur"
               }]
             },
             {
-              label: "终点肋位",
-              prop: "endRibPosition",
+              label: "系统图号",
+              prop: "drawingNo",
               rules: [{
                 required: true,
-                message: "请输入终点肋位",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "停止点",
-              prop: "stopPoint",
-              rules: [{
-                required: false,
-                message: "请输入停止点",
+                message: "请输入系统图号",
                 trigger: "blur"
               }]
             },
+
             {
-              label: "前长度",
-              prop: "frontLen",
+              label: "备注",
+              prop: "remark",
               rules: [{
                 required: false,
-                message: "请输入前长度",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "总长",
-              prop: "len",
-              rules: [{
-                required: true,
-                message: "请输入总长",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "系统图号",
-              prop: "drawingNo",
-              rules: [{
-                required: true,
-                message: "请输入系统图号",
+                message: "请输入备注",
                 trigger: "blur"
               }]
             },
@@ -347,30 +631,230 @@
                 trigger: "blur"
               }]
             },
+          ],
+          group: [
             {
-              label: "备注",
-              prop: "remark",
-              rules: [{
-                required: false,
-                message: "请输入备注",
-                trigger: "blur"
-              }]
+              label: "电缆",
+              column: [
+                {
+                  label: "型号",
+                  prop: "model",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=cable_model`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  // dicData: [],
+                  searchslot: true,
+                  dicFormatter: (res) => {
+                    this.modelList = res.data;
+                    // this.findObject(this.option.column, 'model').dicData = res.data;
+                    return res.data;
+                  },
+                  search: true,
+                  searchSpan: 24,
+                  searchOrder: 1,
+                  rules: [{
+                    required: true,
+                    message: "请输入型号",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "规格",
+                  prop: "specs",
+                  search: true,
+                  searchSpan: 4,
+                  rules: [{
+                    required: true,
+                    message: "请输入规格",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "直径",
+                  prop: "diameter",
+                  rules: [{
+                    required: true,
+                    message: "请输入直径",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
             {
-              label: "创建时间",
-              prop: "createTime",
-              type: "datetime",
-              format: "yyyy-MM-dd HH:mm:ss",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              searchRange:true,
-              addDisplay: false,
-              editDisplay: false,
-              search: true,
-              searchSpan: 24,
-              searchOrder: 0,
-              searchslot: true,
+              label: "电缆从何处起点",
+              column: [
+                {
+                  label: "舱室",
+                  prop: "beginCabin",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入舱室",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "设备名称",
+                  prop: "beginName",
+                  rules: [{
+                    required: true,
+                    message: "请输入设备名称",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "甲板",
+                  prop: "beginDeck",
+                  rules: [{
+                    required: true,
+                    message: "请输入甲板",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "船舷",
+                  prop: "beginShipSide",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入船舷",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "肋位",
+                  prop: "beginRibPosition",
+                  rules: [{
+                    required: true,
+                    message: "请输入肋位",
+                    trigger: "blur"
+                  }]
+                },
+              ]
             },
-          ]
+            {
+              label: "电缆经过主要部位",
+              column: [
+                {
+                  label: "经过节点",
+                  prop: "passNode",
+                  rules: [{
+                    required: true,
+                    message: "请输入经过节点",
+                    trigger: "blur"
+                  }]
+                },
+              ]
+            },
+            {
+              label: "电缆到何处终点",
+              column: [
+                {
+                  label: "舱室",
+                  prop: "endCabin",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_cabin`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入舱室",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "设备名称",
+                  prop: "endName",
+                  rules: [{
+                    required: true,
+                    message: "请输入设备名称",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "甲板",
+                  prop: "endDeck",
+                  rules: [{
+                    required: true,
+                    message: "请输入甲板",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "船舷",
+                  prop: "endShipSide",
+                  type: "select",
+                  dicUrl: `/api/blade-system/dict/dictionary?code=ship_side`,
+                  props: {
+                    label: "dictValue",
+                    value: "dictKey"
+                  },
+                  rules: [{
+                    required: true,
+                    message: "请输入船舷",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "肋位",
+                  prop: "endRibPosition",
+                  rules: [{
+                    required: true,
+                    message: "请输入肋位",
+                    trigger: "blur"
+                  }]
+                },
+              ]
+            },
+            {
+              label: "电缆长度(米)",
+              column: [
+                {
+                  label: "停止点",
+                  prop: "stopPoint",
+                  rules: [{
+                    required: false,
+                    message: "请输入停止点",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "前长度",
+                  prop: "frontLen",
+                  rules: [{
+                    required: false,
+                    message: "请输入前长度",
+                    trigger: "blur"
+                  }]
+                },
+                {
+                  label: "总长",
+                  prop: "len",
+                  rules: [{
+                    required: true,
+                    message: "请输入总长",
+                    trigger: "blur"
+                  }]
+                },
+              ]
+            },
+
+          ],
         },
         data: []
       };
@@ -448,6 +932,47 @@
       },
     },
     methods: {
+      bindTag(row){
+        let _this = this;
+        this.$prompt("请输入标签号?", {
+          confirmButtonText: "提交",
+          cancelButtonText: "取消",
+          inputValue: row.label || "",
+          inputErrorMessage:'请输入标签号',
+          inputValidator:function(v){
+            return !!v;
+            },
+          // type: "warning"
+        })
+        .then(({value}) => {
+          row.label = value;
+          update(row).then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+        })
+      },
+      handleExport() {
+        this.$confirm("是否导出电缆数据?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          window.open(`/api/ship/cable/export-cable?${this.website.tokenHeader}=${getToken()}`);
+        });
+      },
+      handleTemplate() {
+        window.open(`/api/ship/cable/export-template?${this.website.tokenHeader}=${getToken()}`);
+      },
+      uploadAfter(res, done, loading, column) {
+        window.console.log(column);
+        this.excelBox = false;
+        this.refreshChange();
+        done();
+      },
       searchStateChange(){
         setTimeout(() => {
           this.onLoad(this.page, this.query);
@@ -479,6 +1004,25 @@
           console.log(error);
         });
       },
+      rowDisabled(row, disabled){
+        let text = disabled ? "停用" : "启用";
+        this.$confirm("确定将选择数据" + text +"?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: disabled ? "warning" : "success"
+        })
+          .then(() => {
+            row.status = disabled ? 0 : 1;
+            return update(row);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
       rowDel(row) {
         this.$confirm("确定将选择数据删除?", {
           confirmButtonText: "确定",

+ 191 - 0
src/views/ship/ship.vue

@@ -0,0 +1,191 @@
+<template>
+  <basic-container>
+
+  </basic-container>
+</template>
+
+<script>
+  import {getList as getListShip, getDetail as getDetailShip, add as addShip, update as updateShip, remove as removeShip} from "@/api/ship/ship";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        formShip: {},
+        queryShip: {},
+        loadingShip: true,
+        pageShip: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionListShip: [],
+        optionShip: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "编号",
+              prop: "code",
+              rules: [{
+                required: true,
+                message: "请输入编号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "名称",
+              prop: "name",
+              rules: [{
+                required: true,
+                message: "请输入名称",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        dataShip: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionListShip() {
+        return {
+          addBtn: this.vaildData(this.permission.ship_add, false),
+          viewBtn: this.vaildData(this.permission.ship_view, false),
+          delBtn: this.vaildData(this.permission.ship_delete, false),
+          editBtn: this.vaildData(this.permission.ship_edit, false)
+        };
+      },
+      idsShip() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSaveShip(row, done, loading) {
+        addShip(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdateShip(row, index, done, loading) {
+        updateShip(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDelShip(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return removeShip(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDeleteShip() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return removeShip(this.ids);
+          })
+          .then(() => {
+            this.onLoadShip(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crudShip.toggleSelection();
+          });
+      },
+      beforeOpenShip(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetailShip(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchResetShip() {
+        this.query = {};
+        this.onLoadShip(this.page);
+      },
+      searchChangeShip(params, done) {
+        this.queryShip = params;
+        this.pageShip.currentPage = 1;
+        this.onLoadShip(this.pageShip, params);
+        done();
+      },
+      selectionChangeShip(list) {
+        this.selectionListShip = list;
+      },
+      selectionClearShip() {
+        this.selectionListShip = [];
+        this.$refs.crudShip.toggleSelection();
+      },
+      currentChangeShip(currentPage){
+        this.pageShip.currentPage = currentPage;
+      },
+      sizeChangeShip(pageSize){
+        this.pageShip.pageSize = pageSize;
+      },
+      refreshChangeShip() {
+        this.onLoadShip(this.pageShip, this.queryShip);
+      },
+      onLoadShip(page, params = {}) {
+        this.loadingShip = true;
+        getListShip(page.currentPage, page.pageSize, Object.assign(params, this.queryShip)).then(res => {
+          const data = res.data.data;
+          this.pageShip.total = data.total;
+          this.dataShip = data.records;
+          this.loadingShip = false;
+          this.selectionClearShip();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 454 - 0
src/views/ship/shipyard.vue

@@ -0,0 +1,454 @@
+<template>
+  <basic-container>
+    <el-row>
+      <el-col :span="12">
+        <avue-crud :option="option"
+                   :table-loading="loading"
+                   :data="data"
+                   :page.sync="page"
+                   :permission="permissionList"
+                   :before-open="beforeOpen"
+                   v-model="form"
+                   ref="crud"
+                   @row-update="rowUpdate"
+                   @row-save="rowSave"
+                   @row-del="rowDel"
+                   @row-click="rowClick"
+                   @search-change="searchChange"
+                   @search-reset="searchReset"
+                   @selection-change="selectionChange"
+                   @current-change="currentChange"
+                   @size-change="sizeChange"
+                   @refresh-change="refreshChange"
+                   @on-load="onLoad">
+          <template slot="menuLeft">
+            <el-button type="danger"
+                       size="small"
+                       icon="el-icon-delete"
+                       plain
+                       v-if="permission.shipyard_delete"
+                       @click="handleDelete">删 除
+            </el-button>
+          </template>
+        </avue-crud>
+      </el-col>
+      <el-col :span="12">
+        <avue-crud :option="optionShip"
+                   :table-loading="loadingShip"
+                   :data="dataShip"
+                   :page.sync="pageShip"
+                   :permission="permissionListShip"
+                   :before-open="beforeOpenShip"
+                   v-model="formShip"
+                   ref="crudShip"
+                   @row-update="rowUpdateShip"
+                   @row-save="rowSaveShip"
+                   @row-del="rowDelShip"
+                   @search-change="searchChangeShip"
+                   @search-reset="searchResetShip"
+                   @selection-change="selectionChangeShip"
+                   @current-change="currentChangeShip"
+                   @size-change="sizeChangeShip"
+                   @refresh-change="refreshChangeShip"
+                   >
+          <template slot="menuLeft">
+            <el-button type="danger"
+                       size="small"
+                       icon="el-icon-delete"
+                       plain
+                       v-if="permission.ship_delete"
+                       @click="handleDeleteShip">删 除
+            </el-button>
+            <span>【{{yardName}}】</span>
+          </template>
+
+        </avue-crud>
+      </el-col>
+
+    </el-row>
+
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/ship/shipyard";
+  import {mapGetters} from "vuex";
+  import {getList as getListShip, getDetail as getDetailShip, add as addShip, update as updateShip, remove as removeShip} from "@/api/ship/ship";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "船厂编号",
+              prop: "code",
+              rules: [{
+                required: true,
+                message: "请输入船厂编号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "船厂名称",
+              prop: "name",
+              rules: [{
+                required: true,
+                message: "请输入船厂名称",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: [],
+
+        yardId: '',
+
+        formShip: {},
+        queryShip: {},
+        loadingShip: true,
+        pageShip: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionListShip: [],
+        optionShip: {
+          addTitle:'',
+          editTitle:'',
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "船只编号",
+              prop: "code",
+              rules: [{
+                required: true,
+                message: "请输入船只编号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "船只名称",
+              prop: "name",
+              rules: [{
+                required: true,
+                message: "请输入船只名称",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        dataShip: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.shipyard_add, false),
+          viewBtn: this.vaildData(this.permission.shipyard_view, false),
+          delBtn: this.vaildData(this.permission.shipyard_delete, false),
+          editBtn: this.vaildData(this.permission.shipyard_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      },
+      permissionListShip() {
+        return {
+          addBtn: this.vaildData(this.permission.ship_add, false),
+          viewBtn: this.vaildData(this.permission.ship_view, false),
+          delBtn: this.vaildData(this.permission.ship_delete, false),
+          editBtn: this.vaildData(this.permission.ship_edit, false)
+        };
+      },
+      idsShip() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowClick(row, column, event){
+        this.yardId = row.id;
+        this.yardName = row.name;
+        this.onLoadShip(this.pageShip)
+      },
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+
+          if (this.data.length > 0){
+            this.yardId = this.data[0].id;
+            this.yardName = this.data[0].name;
+            this.onLoadShip(this.pageShip)
+          }
+
+          this.loading = false;
+          this.selectionClear();
+        });
+      },
+
+      //*********************** 右组件 ***************************************//
+
+      rowSaveShip(row, done, loading) {
+        row.yardId = this.yardId;
+        addShip(row).then(() => {
+          this.onLoadShip(this.pageShip);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdateShip(row, index, done, loading) {
+        row.yardId = this.yardId;
+        updateShip(row).then(() => {
+          this.onLoadShip(this.pageShip);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDelShip(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return removeShip(row.id);
+          })
+          .then(() => {
+            this.onLoadShip(this.pageShip);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDeleteShip() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return removeShip(this.ids);
+          })
+          .then(() => {
+            this.onLoadShip(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crudShip.toggleSelection();
+          });
+      },
+      beforeOpenShip(done, type) {
+        if (type == 'add'){
+          this.optionShip.addTitle = "新增【" + this.yardName + "】";
+        }
+        if (type == 'edit'){
+          this.optionShip.editTitle = "编辑【" + this.yardName + "】";
+        }
+
+        if (["edit", "view"].includes(type)) {
+          getDetailShip(this.formShip.id).then(res => {
+            this.formShip = res.data.data;
+          });
+        }
+        done();
+      },
+      searchResetShip() {
+        this.queryShip = {};
+        this.onLoadShip(this.pageShip);
+      },
+      searchChangeShip(params, done) {
+        this.queryShip = params;
+        this.pageShip.currentPage = 1;
+        this.onLoadShip(this.pageShip, params);
+        done();
+      },
+      selectionChangeShip(list) {
+        this.selectionListShip = list;
+      },
+      selectionClearShip() {
+        this.selectionListShip = [];
+        this.$refs.crudShip.toggleSelection();
+      },
+      currentChangeShip(currentPage){
+        this.pageShip.currentPage = currentPage;
+      },
+      sizeChangeShip(pageSize){
+        this.pageShip.pageSize = pageSize;
+      },
+      refreshChangeShip() {
+        this.onLoadShip(this.pageShip, this.queryShip);
+      },
+      onLoadShip(page, params = {}) {
+        this.loadingShip = true;
+        params.yardId = this.yardId;
+        getListShip(page.currentPage, page.pageSize, Object.assign(params, this.queryShip)).then(res => {
+          const data = res.data.data;
+          this.pageShip.total = data.total;
+          this.dataShip = data.records;
+          this.loadingShip = false;
+          this.selectionClearShip();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 89 - 0
src/views/wel/index.vue

@@ -30,6 +30,13 @@
         <div ref="tenantAddTrend" style="height: 500px;width: 100%"></div>
       </basic-container>
     </el-col>
+
+    <el-col :span="12">
+      <basic-container>
+        <h3>标签绑定</h3>
+        <div id="labelBind" style="height: 500px;width: 100%"></div>
+      </basic-container>
+    </el-col>
   </div>
 </template>
 
@@ -38,6 +45,7 @@
   import moment from "moment";
   import * as echarts from 'echarts';
   import {getTotalData, getTodayData, getMonthData} from "../../api/ship/home";
+  import {getCableList} from "@/api/ship/cable";
 
   export default {
     name: "wel",
@@ -167,6 +175,44 @@
             ]
           }
         },
+        labelBindOption: {
+          dom: null,
+          option: {
+            legend: {},
+            tooltip: {
+              trigger: 'axis',
+              showContent: false
+            },
+            dataset: {
+              source: [
+                ['已绑定'],
+                ['未绑定'],
+              ],
+            },
+            xAxis: {type: 'category'},
+            yAxis: {gridIndex: 0, splitNumber: 2},
+            grid: {top: '55%'},
+            series: [
+              {
+                type: 'pie',
+                id: 'pie',
+                radius: '30%',
+                center: ['50%', '25%'],
+                emphasis: {
+                  focus: 'self'
+                },
+                label: {
+                  formatter: '{b}: {@2012} ({d}%)'
+                },
+                encode: {
+                  itemName: 'trend',
+                  value: moment(Date.now()).format("yyyy-MM-DD"),
+                  tooltip: moment(Date.now()).format("yyyy-MM-DD")
+                }
+              }
+            ]
+          }
+        }
       };
     },
     computed: {
@@ -187,8 +233,51 @@
       });
 
       this.getTenantAddTrend();
+
+
+    },
+    mounted() {
+      this.initLabelBind();
     },
     methods: {
+      initLabelBind(){
+        getCableList().then(res => {
+          debugger
+          const data = res.data.data;
+          let binded = 0 ,unbind = 0;
+          for (let i = 0; i < data.length; i++) {
+            if (!data[i].label){
+              unbind++;
+            }else {
+              binded++;
+            }
+          }
+
+          var myChart = echarts.init(document.getElementById("labelBind"));
+          myChart.setOption({
+            tooltip: {
+              trigger: 'item'
+            },
+            legend: {
+              orient: 'vertical',
+              left: 'left'
+            },
+            color:['#67c23a', '#FF0033'],
+            series : [
+              {
+                name: '绑定情况',
+                type: 'pie',    // 设置图表类型为饼图
+                radius: '55%',  // 饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。
+                data:[          // 数据数组,name 为数据项名称,value 为数据项值
+                  {value:binded, name:'已绑定'},
+                  {value:unbind, name:'未绑定'},
+                ],
+              }
+            ]
+          })
+        });
+
+      },
       handleChange(val) {
         window.console.log(val);
       },