Browse Source

筹建+工器具

hfxc226 2 years ago
parent
commit
accd98fe4b

+ 127 - 0
src/api/preparation/preparation.js

@@ -0,0 +1,127 @@
+import { axios } from '@/utils/request'
+import { stringify } from 'qs'
+
+/**
+ * page func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getPreparationPage (parameter) {
+  return axios({
+    url: '/preparation/preparations/page?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * add func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function addPreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations',
+    method: 'POST',
+    headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    data: parameter
+  })
+}
+
+/**
+ * update func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function updatePreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations/' + parameter.id,
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+ * fetch single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function fetchPreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations/' + parameter.id,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function queryPreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * delete batch func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deletePreparations (parameter) {
+  return axios({
+    url: '/preparation/preparations',
+    method: 'DELETE',
+    data: parameter
+  })
+}
+
+/**
+ * delete single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deletePreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations/' + parameter.id,
+    method: 'DELETE',
+    data: parameter
+  })
+}
+
+/**
+ * export file
+ * parameter: { }
+ * @param parameter :
+ * @returns {*}
+ */
+export function exportPreparation (parameter) {
+  return axios({
+    url: '/preparation/preparations/export?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    responseType: 'blob'
+  })
+}

+ 129 - 0
src/api/tool/tool-log.js

@@ -0,0 +1,129 @@
+import { axios } from '@/utils/request'
+import { stringify } from 'qs'
+
+/**
+ * page func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getToolLogPage (parameter) {
+    return axios({
+        url: '/tool/tool-logs/page?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * add func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function addToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs',
+        method: 'POST',
+        headers: {
+            'Accept': 'application/json',
+            'Content-Type': 'application/json;charset=UTF-8'
+        },
+        data: parameter
+    })
+}
+
+/**
+ * update func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function updateToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs/' + parameter.id,
+        method: 'PUT',
+        data: parameter
+    })
+}
+
+                                                        
+/**
+ * fetch single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function fetchToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs/' + parameter.id,
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function queryToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * delete batch func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteToolLogs (parameter) {
+    return axios({
+        url: '/tool/tool-logs',
+        method: 'DELETE',
+        data: parameter
+    })
+}
+
+/**
+ * delete single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs/' + parameter.id,
+        method: 'DELETE',
+        data: parameter
+    })
+}
+
+
+/**
+ * export file
+ * parameter: { }
+ * @param parameter :
+ * @returns {*}
+ */
+export function exportToolLog (parameter) {
+    return axios({
+        url: '/tool/tool-logs/export?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        },
+        responseType: 'blob'
+    })
+}

+ 129 - 0
src/api/tool/tool.js

@@ -0,0 +1,129 @@
+import { axios } from '@/utils/request'
+import { stringify } from 'qs'
+
+/**
+ * page func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getToolPage (parameter) {
+    return axios({
+        url: '/tool/tools/page?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * add func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function addTool (parameter) {
+    return axios({
+        url: '/tool/tools',
+        method: 'POST',
+        headers: {
+            'Accept': 'application/json',
+            'Content-Type': 'application/json;charset=UTF-8'
+        },
+        data: parameter
+    })
+}
+
+/**
+ * update func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function updateTool (parameter) {
+    return axios({
+        url: '/tool/tools/' + parameter.id,
+        method: 'PUT',
+        data: parameter
+    })
+}
+
+                                                                                        
+/**
+ * fetch single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function fetchTool (parameter) {
+    return axios({
+        url: '/tool/tools/' + parameter.id,
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function queryTool (parameter) {
+    return axios({
+        url: '/tool/tools?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        }
+    })
+}
+
+/**
+ * delete batch func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteTools (parameter) {
+    return axios({
+        url: '/tool/tools',
+        method: 'DELETE',
+        data: parameter
+    })
+}
+
+/**
+ * delete single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteTool (parameter) {
+    return axios({
+        url: '/tool/tools/' + parameter.id,
+        method: 'DELETE',
+        data: parameter
+    })
+}
+
+
+/**
+ * export file
+ * parameter: { }
+ * @param parameter :
+ * @returns {*}
+ */
+export function exportTool (parameter) {
+    return axios({
+        url: '/tool/tools/export?' + stringify(parameter),
+        method: 'get',
+        headers: {
+            'Content-Type': 'application/json;charset=UTF-8'
+        },
+        responseType: 'blob'
+    })
+}

+ 5 - 0
src/router/generator-platform-routers.js

@@ -378,6 +378,11 @@ const constantRouterComponents = {
   'HotspotHelp': () => import('@/views/qykh/hotspot-help/HotspotHelp'),
   'Information': () => import('@/views/qykh/information/Information'),
   'InformationHelp': () => import('@/views/qykh/information-help/InformationHelp'),
+  // 筹建管理
+  'Preparation': () => import('@/views/preparation/preparation/Preparation'),
+  // 工器具管理
+  'Tool': () => import('@/views/tool/tool/Tool'),
+  'ToolLog': () => import('@/views/tool/tool-log/ToolLog'),
   // 日历
   'Calendar': () => import('@/views/calendar/Calendar')
 }

+ 311 - 0
src/views/preparation/preparation/Preparation.vue

@@ -0,0 +1,311 @@
+<template>
+  <a-card :bordered="false">
+    <div v-show="visible">
+      <div class="table-page-search-wrapper" @keyup.enter="handleEnter">
+        <a-form layout="inline">
+          <a-row :gutter="48" v-show="advanced">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="关键字">
+                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="48">
+            <a-col :md="24 || 24" :sm="24" style="text-align: right">
+              <span class="table-page-search-submitButtons">
+                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                  {{ advanced ? '收起' : '展开' }}
+                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                </a>
+              </span>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+
+      <div class="table-operator" style="margin-bottom: 8px;">
+        <a-row>
+          <a-col :md="16">
+            <a-button v-if="$auth('preparation-preparations-add')" type="primary" icon="plus" @click="handleAdd()">新增</a-button>
+            <a-button style="margin-left: 8px" v-if="$auth('preparation-preparations-export')" type="primary" icon="download" @click="doExport">导出</a-button>
+            <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('preparation-preparations-del')">
+              <a-menu slot="overlay">
+                <a-popconfirm title="是否要删除所选数据?" @confirm="batchDelete()">
+                  <a-menu-item key="1"><a-icon type="delete" /><a>删除</a></a-menu-item>
+                </a-popconfirm>
+              </a-menu>
+              <a-button style="margin-left: 8px">
+                批量操作 <a-icon type="down" />
+              </a-button>
+            </a-dropdown>
+          </a-col>
+        </a-row>
+      </div>
+
+      <s-table
+        ref="table"
+        size="default"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :alert="options.alert"
+        :rowSelection="options.rowSelection"
+        showPagination="auto"
+      >
+        <span slot="action" slot-scope="record">
+          <template>
+            <a @click="handleView(record)">查看</a>
+            <operation-button
+              v-if="$auth('preparation-preparations-edit')"
+              @click="handleEdit(record)"
+            >修改</operation-button>
+            <operation-button
+              v-if="$auth('preparation-preparations-del')"
+              :type="2"
+              title="是否要删除该条数据?"
+              @confirm="batchDelete(record.id)">删除</operation-button>
+          </template>
+        </span>
+      </s-table>
+    </div>
+    <base-form ref="baseModal" @ok="handleOk"/>
+    <detail ref="detailModal" @ok="handleOk"/>
+  </a-card>
+</template>
+
+<script>
+import { STable, Ellipsis } from '@/components'
+import BaseForm from './modules/BaseForm'
+import Detail from './modules/Detail'
+import { getPreparationPage, deletePreparations, fetchPreparation, exportPreparation } from '@/api/preparation/preparation'
+
+export default {
+  name: 'PreparationList',
+  components: {
+    STable,
+    Ellipsis,
+    BaseForm,
+    Detail
+  },
+  data () {
+    return {
+      advanced: false,
+      visible: true,
+      // 查询参数
+      queryParam: {
+      },
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+          }
+        },
+        {
+          title: '设备型号',
+          dataIndex: 'positionId'
+        },
+        {
+          title: '申请人id',
+          dataIndex: 'userId'
+        },
+        {
+          title: '申请部门',
+          dataIndex: 'departId'
+        },
+        {
+          title: '报修时间',
+          dataIndex: 'applyTime'
+        },
+        {
+          title: '问题描述',
+          dataIndex: 'content'
+        },
+        {
+          title: '报修状态',
+          dataIndex: 'status'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '创建日期',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '创建人名称',
+          dataIndex: 'createdUserName'
+        },
+        {
+          title: '维修开始时间',
+          dataIndex: 'repairStartTime'
+        },
+        {
+          title: '维修结束时间',
+          dataIndex: 'repairEndTime'
+        },
+        {
+          title: '维修耗时',
+          dataIndex: 'repairMinutes',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Amount.formatter(text)
+          }
+        },
+        {
+          title: '维修人员id',
+          dataIndex: 'repairUserId'
+        },
+        {
+          title: '维修描述',
+          dataIndex: 'repairContent'
+        },
+        {
+          title: '要求完成日期',
+          dataIndex: 'limitHours'
+        },
+        {
+          title: '费用预算',
+          dataIndex: 'fee',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Amount.formatter(text)
+          }
+        },
+        {
+          title: '预算明细表',
+          dataIndex: 'feeFile'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        parameter = {
+          ...parameter,
+          ...this.queryParam,
+          dataScope: {
+            sortBy: 'desc',
+            sortName: 'update_time'
+          }
+        }
+        return getPreparationPage(Object.assign(parameter, this.queryParam))
+          .then(res => {
+            return res.data
+          })
+      },
+      selectedRowKeys: [],
+      selectedRows: [],
+
+      options: {
+        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+        rowSelection: {
+          selectedRowKeys: this.selectedRowKeys,
+          onChange: this.onSelectChange
+        }
+      },
+      optionAlertShow: false
+    }
+  },
+  created () {
+    // 下拉框map
+    this.tableOption()
+  },
+  methods: {
+    tableOption () {
+      if (!this.optionAlertShow) {
+        this.options = {
+          alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+          rowSelection: {
+            selectedRowKeys: this.selectedRowKeys,
+            onChange: this.onSelectChange,
+            getCheckboxProps: record => ({
+              props: {
+                disabled: false,
+                name: record.id
+              }
+            })
+          }
+        }
+        this.optionAlertShow = true
+      } else {
+        this.options = {
+          alert: false,
+          rowSelection: null
+        }
+        this.optionAlertShow = false
+      }
+    },
+    batchDelete (id) {
+      let ids = []
+      if (this.BaseTool.String.isBlank(id)) {
+        const length = this.selectedRows.length
+        if (length === 0) {
+          this.$message.info('请选择要删除的记录')
+          return
+        }
+        ids = this.selectedRows.map(item => item.id)
+      } else {
+        ids = [id]
+      }
+      deletePreparations(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+        this.$refs.table.clearSelected()
+      })
+    },
+    handleAdd () {
+      this.visible = false
+      const modal = this.$refs.baseModal
+      modal.base()
+    },
+    handleEdit (record) {
+      this.visible = false
+      fetchPreparation({ id: record.id }).then(res => {
+        const modal = this.$refs.baseModal
+        modal.base(res.data)
+      })
+    },
+    handleView (record) {
+      this.visible = false
+      fetchPreparation({ id: record.id }).then(res => {
+        const modal = this.$refs.detailModal
+        modal.base(res.data)
+      })
+    },
+    handleOk (values) {
+      this.visible = true
+      this.$refs.table.refresh()
+    },
+    onSelectChange (selectedRowKeys, selectedRows) {
+      this.selectedRowKeys = selectedRowKeys
+      this.selectedRows = selectedRows
+    },
+    resetSearchForm () {
+      this.queryParam = {
+      }
+      this.$refs.table.refresh(true)
+    },
+    doExport () {
+      const parameter = {
+        ...this.queryParam
+      }
+      exportPreparation(parameter).then(file => {
+        this.BaseTool.Util.downLoadExportExcel(file)
+      })
+    },
+    handleEnter () {
+      this.$refs.table.refresh(true)
+    }
+  }
+}
+</script>

+ 302 - 0
src/views/preparation/preparation/modules/BaseForm.vue

@@ -0,0 +1,302 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <a-form :form="form">
+
+            <a-form-item v-show="false">
+                <a-input v-decorator="['id']" type="hidden"/>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </a-form-item>
+
+            <row-list :col="2">
+                                                                                                <row-item>
+
+                            <a-form-item
+                                    label="设备型号"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['positionId', {rules: [{required: true, message: '设备型号不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="申请人id"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['userId', {rules: [{required: true, message: '申请人id不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="申请部门"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['departId', {rules: [{required: true, message: '申请部门不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="报修时间"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            showTime
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['applyTime', {rules: [{required: true, message: '报修时间不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="问题描述"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['content', {rules: [{required: true, message: '问题描述不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="报修状态"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="备注"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['remark', {rules: [{required: true, message: '备注不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                                                                                                                                                                                                                                        <row-item>
+
+                            <a-form-item
+                                    label="维修开始时间"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            showTime
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['repairStartTime', {rules: [{required: true, message: '维修开始时间不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="维修结束时间"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            showTime
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['repairEndTime', {rules: [{required: true, message: '维修结束时间不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="维修耗时"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input-number
+                                            style="width: 100%"
+                                            :min="0"
+                                            :formatter="BaseTool.Amount.formatter"
+                                            :parser="BaseTool.Amount.parser"
+                                            v-decorator="['repairMinutes', {rules: [{required: true, message: '维修耗时不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="维修人员id"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['repairUserId', {rules: [{required: true, message: '维修人员id不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="维修描述"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['repairContent', {rules: [{required: true, message: '维修描述不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="要求完成日期"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['limitHours', {rules: [{required: true, message: '要求完成日期不能为空'}]}]"/>
+
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="费用预算"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input-number
+                                            style="width: 100%"
+                                            :min="0"
+                                            :formatter="BaseTool.Amount.formatter"
+                                            :parser="BaseTool.Amount.parser"
+                                            v-decorator="['fee', {rules: [{required: true, message: '费用预算不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="预算明细表"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['feeFile', {rules: [{required: true, message: '预算明细表不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                </row-list>
+        </a-form>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </a-card>
+</template>
+
+<script>
+    import pick from 'lodash.pick'
+    import {addPreparation, updatePreparation } from '@/api/preparation/preparation'
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        export default {
+        name: 'BasePreparation',
+        data() {
+            return {
+                confirmLoading: false,
+                modalTitle: null,
+                form: this.$form.createForm(this),
+                visible: false,
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+        },
+        props: {},
+        created() {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base(record) {
+                this.visible = true
+                // 如果是空标识添加
+                if (this.BaseTool.Object.isBlank(record)) {
+                    this.modalTitle = '添加'
+                    return
+                }
+                this.modalTitle = '编辑'
+                const {form: {setFieldsValue}} = this
+                // 日期处理
+                                    record.applyTime = this.BaseTool.Moment(record.applyTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                    record.repairStartTime = this.BaseTool.Moment(record.repairStartTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                    record.repairEndTime = this.BaseTool.Moment(record.repairEndTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                    record.limitHours = this.BaseTool.Moment(record.limitHours, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                this.$nextTick(() => {
+                    setFieldsValue(Object.assign(pick(record, [
+                                                                                    'id',
+                                                                                                                'positionId',
+                                                                                                                'userId',
+                                                                                                                'departId',
+                                                                                                                'applyTime',
+                                                                                                                'content',
+                                                                                                                'status',
+                                                                                                                'remark',
+                                                                                                                                                                                                                                                                                                                                                                                                                                        'repairStartTime',
+                                                                                                                'repairEndTime',
+                                                                                                                'repairMinutes',
+                                                                                                                'repairUserId',
+                                                                                                                'repairContent',
+                                                                                                                'limitHours',
+                                                                                                                'fee',
+                                                                                                                'feeFile',
+                                                    ])))
+                })
+            },
+            save() {
+                const {form: {validateFieldsAndScroll}} = this
+                this.confirmLoading = true
+                validateFieldsAndScroll((errors, values) => {
+                    if (errors) {
+                        this.confirmLoading = false
+                        return
+                    }
+                    // 日期处理
+                                            values.applyTime = this.BaseTool.Date.formatter(values.applyTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                            values.repairStartTime = this.BaseTool.Date.formatter(values.repairStartTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                            values.repairEndTime = this.BaseTool.Date.formatter(values.repairEndTime, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                            values.limitHours = this.BaseTool.Date.formatter(values.limitHours, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                        if (this.BaseTool.String.isBlank(values.id)) {
+                        addPreparation(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    } else {
+                        updatePreparation(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    }
+                })
+            },
+            handleCancel(values) {
+                this.visible = false
+                this.confirmLoading = false
+                this.form.resetFields()
+                if (this.BaseTool.Object.isNotBlank(values)) {
+                    this.$emit('ok', values)
+                } else {
+                    this.$emit('ok')
+                }
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }
+    }
+</script>

+ 90 - 0
src/views/preparation/preparation/modules/Detail.vue

@@ -0,0 +1,90 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <detail-list title="" :col="2">
+                                                                                                    <detail-list-item term="设备型号">{{ model.positionId }}</detail-list-item>
+                                                                                                            <detail-list-item term="申请人id">{{ model.userId }}</detail-list-item>
+                                                                                                            <detail-list-item term="申请部门">{{ model.departId }}</detail-list-item>
+                                                                                                            <detail-list-item term="报修时间">{{ model.applyTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="问题描述">{{ model.content }}</detail-list-item>
+                                                                                                            <detail-list-item term="报修状态">{{ model.status }}</detail-list-item>
+                                                                                                            <detail-list-item term="备注">{{ model.remark }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新日期">{{ model.updateTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="创建人">{{ model.createdUserId }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新人">{{ model.updateUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="更新人名称">{{ model.updateUserName }}</detail-list-item>
+                                                                                                            <detail-list-item term="维修开始时间">{{ model.repairStartTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="维修结束时间">{{ model.repairEndTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="维修耗时">{{ model.repairMinutes }}</detail-list-item>
+                                                                                                            <detail-list-item term="维修人员id">{{ model.repairUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="维修描述">{{ model.repairContent }}</detail-list-item>
+                                                                                                            <detail-list-item term="要求完成日期">{{ model.limitHours }}</detail-list-item>
+                                                                                                            <detail-list-item term="费用预算">{{ model.fee }}</detail-list-item>
+                                                                                                            <detail-list-item term="预算明细表">{{ model.feeFile }}</detail-list-item>
+                                                        </detail-list>
+    </a-card>
+</template>
+
+<script>
+    import DetailList from '@/components/tools/DetailList'
+    const DetailListItem = DetailList.Item
+
+    export default {
+        name: 'PreparationDetail',
+        components: {
+            DetailList,
+            DetailListItem
+        },
+        data () {
+            return {
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            model: {
+                                                                                                                    'positionId': null,
+                                                                                                'userId': null,
+                                                                                                'departId': null,
+                                                                                                'applyTime': null,
+                                                                                                'content': null,
+                                                                                                'status': null,
+                                                                                                'remark': null,
+                                                                                                                                            'updateTime': null,
+                                                                                                'createdUserId': null,
+                                                                                                                                            'updateUserId': null,
+                                                                                                'updateUserName': null,
+                                                                                                'repairStartTime': null,
+                                                                                                'repairEndTime': null,
+                                                                                                'repairMinutes': null,
+                                                                                                'repairUserId': null,
+                                                                                                'repairContent': null,
+                                                                                                'limitHours': null,
+                                                                                                'fee': null,
+                                                                                                'feeFile': null,
+                                                            }
+            }
+        },
+        created () {
+            // 下拉框map
+            
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base (record) {
+                this.visible = true
+                this.modalTitle = '详情'
+                this.model = record
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+    }
+</script>

+ 336 - 0
src/views/preparation/preparation/modules/PreparationSelectModal.vue

@@ -0,0 +1,336 @@
+<template>
+    <a-modal
+            :title="modalTitle"
+            :width="1000"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            class="ant-modal2"
+            @cancel="handleCancel"
+    >
+        <a-card :bordered="false">
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline">
+                    <a-row :gutter="48">
+                        <a-col :md="6" :sm="24">
+                            <a-form-item label="关键字">
+                                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+                            </a-form-item>
+                        </a-col>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <a-col :md="6 || 24" :sm="24">
+                            <span class="table-page-search-submitButtons">
+                                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                                  {{ advanced ? '收起' : '展开' }}
+                                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                                </a>
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+
+            <div class="table-operator">
+            </div>
+
+            <s-table
+                    ref="table"
+                    size="default"
+                    rowKey="id"
+                    :columns="columns"
+                    :data="loadData"
+                    :alert="options.alert"
+                    :customRow="options.customRow"
+                    :rowSelection="options.rowSelection"
+                    showPagination="auto"
+            >
+                <span slot="action" slot-scope="record1">
+                  <template>
+                    <a @click="handleView(record1)">查看</a>
+                  </template>
+                </span>
+            </s-table>
+            <detail ref="detailModal"/>
+        </a-card>
+        <template slot="footer">
+            <a-button :loading="confirmLoading" type="primary" @click="handleCancel()">取消</a-button>
+            <a-button :loading="confirmLoading" type="primary" @click="handleSelect()">确定</a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script>
+    import { STable, Ellipsis } from '@/components'
+    import Detail from './Detail'
+    import { getPreparationPage, fetchPreparation } from '@/api/preparation/preparation'
+
+    export default {
+        name: 'PreparationSelectModal',
+        components: {
+            STable,
+            Ellipsis,
+            Detail
+        },
+        props: {
+            type: {
+                type: String,
+                default: 'radio'
+            },
+            selectedRowKey: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            },
+            selectedRow: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            }
+        },
+        data () {
+            return {
+                advanced: false,
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                record: null,
+                // 查询参数
+                queryParam: {
+                },
+                extraQueryParam: {
+                },
+                // 表头
+                columns: [
+                    {
+                        title: '序号',
+                        dataIndex: 'index',
+                        customRender: (text, record, index) => {
+                            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+                        }
+                    },
+                                                                                                                                                {
+                                title: '设备型号',
+                                dataIndex: 'positionId'
+                            },
+                                                                                                                                                        {
+                                title: '申请人id',
+                                dataIndex: 'userId'
+                            },
+                                                                                                                                                        {
+                                title: '申请部门',
+                                dataIndex: 'departId'
+                            },
+                                                                                                                                                        {
+                                title: '报修时间',
+                                dataIndex: 'applyTime'
+                            },
+                                                                                                                                                        {
+                                title: '问题描述',
+                                dataIndex: 'content'
+                            },
+                                                                                                                                                        {
+                                title: '报修状态',
+                                dataIndex: 'status'
+                            },
+                                                                                                                                                        {
+                                title: '备注',
+                                dataIndex: 'remark'
+                            },
+                                                                                                                                                        {
+                                title: '创建日期',
+                                dataIndex: 'createdTime'
+                            },
+                                                                                                                                                                                                                                                {
+                                title: '创建人名称',
+                                dataIndex: 'createdUserName'
+                            },
+                                                                                                                                                                                                                                                {
+                                title: '维修开始时间',
+                                dataIndex: 'repairStartTime'
+                            },
+                                                                                                                                                        {
+                                title: '维修结束时间',
+                                dataIndex: 'repairEndTime'
+                            },
+                                                                                                                                                            {
+                                    title: '维修耗时',
+                                    dataIndex: 'repairMinutes',
+                                    customRender: (text, record, index) => {
+                                        return this.BaseTool.Amount.formatter(text)
+                                    }                                ,
+                                },
+                                                                                                                                                        {
+                                title: '维修人员id',
+                                dataIndex: 'repairUserId'
+                            },
+                                                                                                                                                        {
+                                title: '维修描述',
+                                dataIndex: 'repairContent'
+                            },
+                                                                                                                                                        {
+                                title: '要求完成日期',
+                                dataIndex: 'limitHours'
+                            },
+                                                                                                                                                            {
+                                    title: '费用预算',
+                                    dataIndex: 'fee',
+                                    customRender: (text, record, index) => {
+                                        return this.BaseTool.Amount.formatter(text)
+                                    }                                ,
+                                },
+                                                                                                                                                        {
+                                title: '预算明细表',
+                                dataIndex: 'feeFile'
+                            },
+                                                                                            {
+                        title: '操作',
+                        key: 'action',
+                        width: '200px',
+                        align: 'center',
+                        scopedSlots: { customRender: 'action' }
+                    }
+                ],
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            // 加载数据方法 必须为 Promise 对象
+                loadData: parameter => {
+                    parameter = {
+                        ...parameter,
+                        ...this.queryParam,
+                        ...this.extraQueryParam,
+                        dataScope: {
+                            sortBy: 'desc',
+                            sortName: 'update_time'
+                        }
+                    }
+                    return getPreparationPage(Object.assign(parameter, this.queryParam))
+                            .then(res => {
+                                return res.data
+                            })
+                },
+                selectedRowKeys: [],
+                selectedRows: [],
+
+                options: {
+                    alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                    rowSelection: {
+                        selectedRowKeys: this.selectedRowKeys,
+                        onChange: this.onSelectChange
+                    }
+                },
+                optionAlertShow: false,
+                isCreated: false
+            }
+        },
+        created () {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            tableOption () {
+                if (!this.optionAlertShow) {
+                    this.options = {
+                        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                        rowSelection: {
+                            selectedRowKeys: this.selectedRowKeys,
+                            onChange: this.onSelectChange,
+                            type: this.type,
+                            getCheckboxProps: record => ({
+                                props: {
+                                    disabled: false,
+                                    name: record.id
+                                }
+                            })
+                        },
+                        customRow: (record) => {
+                            return {
+                                on: { // 事件
+                                    click: (event) => { // 点击行
+                                        // 选择对象
+                                        this.mySelect([record.id], [record])
+                                    },
+                                    dblclick: (event) => {
+                                        this.mySelect([record.id], [record])
+                                        this.handleSelect()
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    this.optionAlertShow = true
+                } else {
+                    this.options = {
+                        alert: false,
+                        rowSelection: null
+                    }
+                    this.optionAlertShow = false
+                }
+            },
+            handleView (record) {
+                fetchPreparation({ id: record.id }).then(res => {
+                    const modal = this.$refs.detailModal
+                    modal.base(res.data)
+                })
+            },
+            handleOk () {
+                this.$refs.table.refresh()
+            },
+            onSelectChange (selectedRowKeys, selectedRows) {
+                this.selectedRowKeys = selectedRowKeys
+                this.selectedRows = selectedRows
+            },
+            resetSearchForm () {
+                this.queryParam = {
+                }
+                this.$refs.table.refresh(true)
+            },
+            base (record, queryParam = {}) {
+                this.visible = true
+                this.modalTitle = '选择信息'
+                this.extraQueryParam = queryParam
+                this.record = record
+                if (this.isCreated) {
+                    this.$refs.table.clearSelected()
+                    this.options.rowSelection.type = this.type
+                    this.handleOk()
+                } else {
+                    this.tableOption()
+                    this.isCreated = true
+                }
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            },
+            handleSelect () {
+                if (this.selectedRowKeys.length === 0) {
+                    this.$message.warn('请至少选择一项信息')
+                } else {
+                    this.confirmLoading = true
+                    this.$emit('selected', this.record, this.selectedRowKeys, this.selectedRows)
+                    this.confirmLoading = false
+                    this.visible = false
+                }
+            },
+            mySelect(selectedRowKeys, selectedRows) {
+                if (this.type === 'radio') {
+                    this.$refs.table.updateSelect(selectedRowKeys, selectedRows)
+                            this.$refs.table.rowSelection.onChange(selectedRowKeys, selectedRows)
+                } else {
+                    let mySelectedRowKeys
+                    let mySelectedRows = this.selectedRows.filter(item => item.id !== selectedRowKeys[0])
+                    if (this.selectedRowKeys.includes(selectedRowKeys[0])) {
+                        mySelectedRowKeys = this.selectedRowKeys.filter(item => item !== selectedRowKeys[0])
+                    } else {
+                        mySelectedRowKeys = [...selectedRowKeys, ...this.selectedRowKeys]
+                        mySelectedRows = [...mySelectedRows, ...selectedRows]
+                    }
+                    this.$refs.table.updateSelect(mySelectedRowKeys, mySelectedRows)
+                            this.$refs.table.rowSelection.onChange(mySelectedRowKeys, mySelectedRows)
+                }
+
+            }
+        }
+    }
+</script>

+ 273 - 0
src/views/tool/tool-log/ToolLog.vue

@@ -0,0 +1,273 @@
+<template>
+  <a-card :bordered="false">
+    <div v-show="visible">
+      <div class="table-page-search-wrapper" @keyup.enter="handleEnter">
+        <a-form layout="inline">
+          <a-row :gutter="48" v-show="advanced">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="关键字">
+                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="48">
+            <a-col :md="24 || 24" :sm="24" style="text-align: right">
+              <span class="table-page-search-submitButtons">
+                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                  {{ advanced ? '收起' : '展开' }}
+                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                </a>
+              </span>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+
+      <div class="table-operator" style="margin-bottom: 8px;">
+        <a-row>
+          <a-col :md="16">
+            <a-button v-if="$auth('tool-tool-logs-add')" type="primary" icon="plus" @click="handleAdd()">新增</a-button>
+            <a-button style="margin-left: 8px" v-if="$auth('tool-tool-logs-export')" type="primary" icon="download" @click="doExport">导出</a-button>
+            <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('tool-tool-logs-del')">
+              <a-menu slot="overlay">
+                <a-popconfirm title="是否要删除所选数据?" @confirm="batchDelete()">
+                  <a-menu-item key="1"><a-icon type="delete" /><a>删除</a></a-menu-item>
+                </a-popconfirm>
+              </a-menu>
+              <a-button style="margin-left: 8px">
+                批量操作 <a-icon type="down" />
+              </a-button>
+            </a-dropdown>
+          </a-col>
+        </a-row>
+      </div>
+
+      <s-table
+        ref="table"
+        size="default"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :alert="options.alert"
+        :rowSelection="options.rowSelection"
+        showPagination="auto"
+      >
+        <span slot="action" slot-scope="record">
+          <template>
+            <a @click="handleView(record)">查看</a>
+            <operation-button
+              v-if="$auth('tool-tool-logs-edit')"
+              @click="handleEdit(record)"
+            >修改</operation-button>
+            <operation-button
+              v-if="$auth('tool-tool-logs-del')"
+              :type="2"
+              title="是否要删除该条数据?"
+              @confirm="batchDelete(record.id)">删除</operation-button>
+          </template>
+        </span>
+      </s-table>
+    </div>
+    <base-form ref="baseModal" @ok="handleOk"/>
+    <detail ref="detailModal" @ok="handleOk"/>
+  </a-card>
+</template>
+
+<script>
+import { STable, Ellipsis } from '@/components'
+import BaseForm from './modules/BaseForm'
+import Detail from './modules/Detail'
+import { getToolLogPage, deleteToolLogs, fetchToolLog, exportToolLog } from '@/api/tool/tool-log'
+
+export default {
+  name: 'ToolLogList',
+  components: {
+    STable,
+    Ellipsis,
+    BaseForm,
+    Detail
+  },
+  data () {
+    return {
+      advanced: false,
+      visible: true,
+      // 查询参数
+      queryParam: {
+      },
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+          }
+        },
+        {
+          title: '检验人',
+          dataIndex: 'checkUserId'
+        },
+        {
+          title: '检验说明',
+          dataIndex: 'requirement'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '创建人名称',
+          dataIndex: 'createdUserName'
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '工器具id',
+          dataIndex: 'toolId'
+        },
+        {
+          title: '检测日期',
+          dataIndex: 'checkDate'
+        },
+        {
+          title: '检定图片路径',
+          dataIndex: 'imgPath'
+        },
+        {
+          title: '检定文件路径',
+          dataIndex: 'filePath'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        parameter = {
+          ...parameter,
+          ...this.queryParam,
+          dataScope: {
+            sortBy: 'desc',
+            sortName: 'update_time'
+          }
+        }
+        return getToolLogPage(Object.assign(parameter, this.queryParam))
+          .then(res => {
+            return res.data
+          })
+      },
+      selectedRowKeys: [],
+      selectedRows: [],
+
+      options: {
+        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+        rowSelection: {
+          selectedRowKeys: this.selectedRowKeys,
+          onChange: this.onSelectChange
+        }
+      },
+      optionAlertShow: false
+    }
+  },
+  created () {
+    // 下拉框map
+    this.tableOption()
+  },
+  methods: {
+    tableOption () {
+      if (!this.optionAlertShow) {
+        this.options = {
+          alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+          rowSelection: {
+            selectedRowKeys: this.selectedRowKeys,
+            onChange: this.onSelectChange,
+            getCheckboxProps: record => ({
+              props: {
+                disabled: false,
+                name: record.id
+              }
+            })
+          }
+        }
+        this.optionAlertShow = true
+      } else {
+        this.options = {
+          alert: false,
+          rowSelection: null
+        }
+        this.optionAlertShow = false
+      }
+    },
+    batchDelete (id) {
+      let ids = []
+      if (this.BaseTool.String.isBlank(id)) {
+        const length = this.selectedRows.length
+        if (length === 0) {
+          this.$message.info('请选择要删除的记录')
+          return
+        }
+        ids = this.selectedRows.map(item => item.id)
+      } else {
+        ids = [id]
+      }
+      deleteToolLogs(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+        this.$refs.table.clearSelected()
+      })
+    },
+    handleAdd () {
+      this.visible = false
+      const modal = this.$refs.baseModal
+      modal.base()
+    },
+    handleEdit (record) {
+      this.visible = false
+      fetchToolLog({ id: record.id }).then(res => {
+        const modal = this.$refs.baseModal
+        modal.base(res.data)
+      })
+    },
+    handleView (record) {
+      this.visible = false
+      fetchToolLog({ id: record.id }).then(res => {
+        const modal = this.$refs.detailModal
+        modal.base(res.data)
+      })
+    },
+    handleOk (values) {
+      this.visible = true
+      this.$refs.table.refresh()
+    },
+    onSelectChange (selectedRowKeys, selectedRows) {
+      this.selectedRowKeys = selectedRowKeys
+      this.selectedRows = selectedRows
+    },
+    resetSearchForm () {
+      this.queryParam = {
+      }
+      this.$refs.table.refresh(true)
+    },
+    doExport () {
+      const parameter = {
+        ...this.queryParam
+      }
+      exportToolLog(parameter).then(file => {
+        this.BaseTool.Util.downLoadExportExcel(file)
+      })
+    },
+    handleEnter () {
+      this.$refs.table.refresh(true)
+    }
+  }
+}
+</script>

+ 185 - 0
src/views/tool/tool-log/modules/BaseForm.vue

@@ -0,0 +1,185 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <a-form :form="form">
+
+            <a-form-item v-show="false">
+                <a-input v-decorator="['id']" type="hidden"/>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </a-form-item>
+
+            <row-list :col="2">
+                                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检验人"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['checkUserId', {rules: [{required: true, message: '检验人不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检验说明"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['requirement', {rules: [{required: true, message: '检验说明不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="备注"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['remark', {rules: [{required: true, message: '备注不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                                                                                                                                                                                                                                        <row-item>
+
+                            <a-form-item
+                                    label="工器具id"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['toolId', {rules: [{required: true, message: '工器具id不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检测日期"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['checkDate', {rules: [{required: true, message: '检测日期不能为空'}]}]"/>
+
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检定图片路径"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['imgPath', {rules: [{required: true, message: '检定图片路径不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检定文件路径"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['filePath', {rules: [{required: true, message: '检定文件路径不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                </row-list>
+        </a-form>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </a-card>
+</template>
+
+<script>
+    import pick from 'lodash.pick'
+    import {addToolLog, updateToolLog } from '@/api/tool/tool-log'
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        export default {
+        name: 'BaseToolLog',
+        data() {
+            return {
+                confirmLoading: false,
+                modalTitle: null,
+                form: this.$form.createForm(this),
+                visible: false,
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+        },
+        props: {},
+        created() {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base(record) {
+                this.visible = true
+                // 如果是空标识添加
+                if (this.BaseTool.Object.isBlank(record)) {
+                    this.modalTitle = '添加'
+                    return
+                }
+                this.modalTitle = '编辑'
+                const {form: {setFieldsValue}} = this
+                // 日期处理
+                                    record.checkDate = this.BaseTool.Moment(record.checkDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                this.$nextTick(() => {
+                    setFieldsValue(Object.assign(pick(record, [
+                                                                                    'id',
+                                                                                                                'checkUserId',
+                                                                                                                'requirement',
+                                                                                                                'remark',
+                                                                                                                                                                                                                                                                                                                                                                                                                                        'toolId',
+                                                                                                                'checkDate',
+                                                                                                                'imgPath',
+                                                                                                                'filePath',
+                                                    ])))
+                })
+            },
+            save() {
+                const {form: {validateFieldsAndScroll}} = this
+                this.confirmLoading = true
+                validateFieldsAndScroll((errors, values) => {
+                    if (errors) {
+                        this.confirmLoading = false
+                        return
+                    }
+                    // 日期处理
+                                            values.checkDate = this.BaseTool.Date.formatter(values.checkDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                        if (this.BaseTool.String.isBlank(values.id)) {
+                        addToolLog(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    } else {
+                        updateToolLog(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    }
+                })
+            },
+            handleCancel(values) {
+                this.visible = false
+                this.confirmLoading = false
+                this.form.resetFields()
+                if (this.BaseTool.Object.isNotBlank(values)) {
+                    this.$emit('ok', values)
+                } else {
+                    this.$emit('ok')
+                }
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                            }
+    }
+</script>

+ 74 - 0
src/views/tool/tool-log/modules/Detail.vue

@@ -0,0 +1,74 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <detail-list title="" :col="2">
+                                                                                                    <detail-list-item term="检验人">{{ model.checkUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="检验说明">{{ model.requirement }}</detail-list-item>
+                                                                                                            <detail-list-item term="备注">{{ model.remark }}</detail-list-item>
+                                                                                                            <detail-list-item term="创建人">{{ model.createdUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="更新人">{{ model.updateUserId }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新人名称">{{ model.updateUserName }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新时间">{{ model.updateTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="工器具id">{{ model.toolId }}</detail-list-item>
+                                                                                                            <detail-list-item term="检测日期">{{ model.checkDate }}</detail-list-item>
+                                                                                                            <detail-list-item term="检定图片路径">{{ model.imgPath }}</detail-list-item>
+                                                                                                            <detail-list-item term="检定文件路径">{{ model.filePath }}</detail-list-item>
+                                                        </detail-list>
+    </a-card>
+</template>
+
+<script>
+    import DetailList from '@/components/tools/DetailList'
+    const DetailListItem = DetailList.Item
+
+    export default {
+        name: 'ToolLogDetail',
+        components: {
+            DetailList,
+            DetailListItem
+        },
+        data () {
+            return {
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            model: {
+                                                                                                                    'checkUserId': null,
+                                                                                                'requirement': null,
+                                                                                                'remark': null,
+                                                                                                'createdUserId': null,
+                                                                                                'updateUserId': null,
+                                                                                                                                            'updateUserName': null,
+                                                                                                                                            'updateTime': null,
+                                                                                                'toolId': null,
+                                                                                                'checkDate': null,
+                                                                                                'imgPath': null,
+                                                                                                'filePath': null,
+                                                            }
+            }
+        },
+        created () {
+            // 下拉框map
+            
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base (record) {
+                this.visible = true
+                this.modalTitle = '详情'
+                this.model = record
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+    }
+</script>

+ 298 - 0
src/views/tool/tool-log/modules/ToolLogSelectModal.vue

@@ -0,0 +1,298 @@
+<template>
+    <a-modal
+            :title="modalTitle"
+            :width="1000"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            class="ant-modal2"
+            @cancel="handleCancel"
+    >
+        <a-card :bordered="false">
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline">
+                    <a-row :gutter="48">
+                        <a-col :md="6" :sm="24">
+                            <a-form-item label="关键字">
+                                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+                            </a-form-item>
+                        </a-col>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <a-col :md="6 || 24" :sm="24">
+                            <span class="table-page-search-submitButtons">
+                                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                                  {{ advanced ? '收起' : '展开' }}
+                                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                                </a>
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+
+            <div class="table-operator">
+            </div>
+
+            <s-table
+                    ref="table"
+                    size="default"
+                    rowKey="id"
+                    :columns="columns"
+                    :data="loadData"
+                    :alert="options.alert"
+                    :customRow="options.customRow"
+                    :rowSelection="options.rowSelection"
+                    showPagination="auto"
+            >
+                <span slot="action" slot-scope="record1">
+                  <template>
+                    <a @click="handleView(record1)">查看</a>
+                  </template>
+                </span>
+            </s-table>
+            <detail ref="detailModal"/>
+        </a-card>
+        <template slot="footer">
+            <a-button :loading="confirmLoading" type="primary" @click="handleCancel()">取消</a-button>
+            <a-button :loading="confirmLoading" type="primary" @click="handleSelect()">确定</a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script>
+    import { STable, Ellipsis } from '@/components'
+    import Detail from './Detail'
+    import { getToolLogPage, fetchToolLog } from '@/api/tool/tool-log'
+
+    export default {
+        name: 'ToolLogSelectModal',
+        components: {
+            STable,
+            Ellipsis,
+            Detail
+        },
+        props: {
+            type: {
+                type: String,
+                default: 'radio'
+            },
+            selectedRowKey: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            },
+            selectedRow: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            }
+        },
+        data () {
+            return {
+                advanced: false,
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                record: null,
+                // 查询参数
+                queryParam: {
+                },
+                extraQueryParam: {
+                },
+                // 表头
+                columns: [
+                    {
+                        title: '序号',
+                        dataIndex: 'index',
+                        customRender: (text, record, index) => {
+                            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+                        }
+                    },
+                                                                                                                                                {
+                                title: '检验人',
+                                dataIndex: 'checkUserId'
+                            },
+                                                                                                                                                        {
+                                title: '检验说明',
+                                dataIndex: 'requirement'
+                            },
+                                                                                                                                                        {
+                                title: '备注',
+                                dataIndex: 'remark'
+                            },
+                                                                                                                                                                                                                                                {
+                                title: '创建人名称',
+                                dataIndex: 'createdUserName'
+                            },
+                                                                                                                                                                                                    {
+                                title: '创建时间',
+                                dataIndex: 'createdTime'
+                            },
+                                                                                                                                                                                                    {
+                                title: '工器具id',
+                                dataIndex: 'toolId'
+                            },
+                                                                                                                                                        {
+                                title: '检测日期',
+                                dataIndex: 'checkDate'
+                            },
+                                                                                                                                                        {
+                                title: '检定图片路径',
+                                dataIndex: 'imgPath'
+                            },
+                                                                                                                                                        {
+                                title: '检定文件路径',
+                                dataIndex: 'filePath'
+                            },
+                                                                                            {
+                        title: '操作',
+                        key: 'action',
+                        width: '200px',
+                        align: 'center',
+                        scopedSlots: { customRender: 'action' }
+                    }
+                ],
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            // 加载数据方法 必须为 Promise 对象
+                loadData: parameter => {
+                    parameter = {
+                        ...parameter,
+                        ...this.queryParam,
+                        ...this.extraQueryParam,
+                        dataScope: {
+                            sortBy: 'desc',
+                            sortName: 'update_time'
+                        }
+                    }
+                    return getToolLogPage(Object.assign(parameter, this.queryParam))
+                            .then(res => {
+                                return res.data
+                            })
+                },
+                selectedRowKeys: [],
+                selectedRows: [],
+
+                options: {
+                    alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                    rowSelection: {
+                        selectedRowKeys: this.selectedRowKeys,
+                        onChange: this.onSelectChange
+                    }
+                },
+                optionAlertShow: false,
+                isCreated: false
+            }
+        },
+        created () {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            tableOption () {
+                if (!this.optionAlertShow) {
+                    this.options = {
+                        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                        rowSelection: {
+                            selectedRowKeys: this.selectedRowKeys,
+                            onChange: this.onSelectChange,
+                            type: this.type,
+                            getCheckboxProps: record => ({
+                                props: {
+                                    disabled: false,
+                                    name: record.id
+                                }
+                            })
+                        },
+                        customRow: (record) => {
+                            return {
+                                on: { // 事件
+                                    click: (event) => { // 点击行
+                                        // 选择对象
+                                        this.mySelect([record.id], [record])
+                                    },
+                                    dblclick: (event) => {
+                                        this.mySelect([record.id], [record])
+                                        this.handleSelect()
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    this.optionAlertShow = true
+                } else {
+                    this.options = {
+                        alert: false,
+                        rowSelection: null
+                    }
+                    this.optionAlertShow = false
+                }
+            },
+            handleView (record) {
+                fetchToolLog({ id: record.id }).then(res => {
+                    const modal = this.$refs.detailModal
+                    modal.base(res.data)
+                })
+            },
+            handleOk () {
+                this.$refs.table.refresh()
+            },
+            onSelectChange (selectedRowKeys, selectedRows) {
+                this.selectedRowKeys = selectedRowKeys
+                this.selectedRows = selectedRows
+            },
+            resetSearchForm () {
+                this.queryParam = {
+                }
+                this.$refs.table.refresh(true)
+            },
+            base (record, queryParam = {}) {
+                this.visible = true
+                this.modalTitle = '选择信息'
+                this.extraQueryParam = queryParam
+                this.record = record
+                if (this.isCreated) {
+                    this.$refs.table.clearSelected()
+                    this.options.rowSelection.type = this.type
+                    this.handleOk()
+                } else {
+                    this.tableOption()
+                    this.isCreated = true
+                }
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            },
+            handleSelect () {
+                if (this.selectedRowKeys.length === 0) {
+                    this.$message.warn('请至少选择一项信息')
+                } else {
+                    this.confirmLoading = true
+                    this.$emit('selected', this.record, this.selectedRowKeys, this.selectedRows)
+                    this.confirmLoading = false
+                    this.visible = false
+                }
+            },
+            mySelect(selectedRowKeys, selectedRows) {
+                if (this.type === 'radio') {
+                    this.$refs.table.updateSelect(selectedRowKeys, selectedRows)
+                            this.$refs.table.rowSelection.onChange(selectedRowKeys, selectedRows)
+                } else {
+                    let mySelectedRowKeys
+                    let mySelectedRows = this.selectedRows.filter(item => item.id !== selectedRowKeys[0])
+                    if (this.selectedRowKeys.includes(selectedRowKeys[0])) {
+                        mySelectedRowKeys = this.selectedRowKeys.filter(item => item !== selectedRowKeys[0])
+                    } else {
+                        mySelectedRowKeys = [...selectedRowKeys, ...this.selectedRowKeys]
+                        mySelectedRows = [...mySelectedRows, ...selectedRows]
+                    }
+                    this.$refs.table.updateSelect(mySelectedRowKeys, mySelectedRows)
+                            this.$refs.table.rowSelection.onChange(mySelectedRowKeys, mySelectedRows)
+                }
+
+            }
+        }
+    }
+</script>

+ 308 - 0
src/views/tool/tool/Tool.vue

@@ -0,0 +1,308 @@
+<template>
+  <a-card :bordered="false">
+    <div v-show="visible">
+      <div class="table-page-search-wrapper" @keyup.enter="handleEnter">
+        <a-form layout="inline">
+          <a-row :gutter="48" v-show="advanced">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="关键字">
+                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="48">
+            <a-col :md="24 || 24" :sm="24" style="text-align: right">
+              <span class="table-page-search-submitButtons">
+                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                  {{ advanced ? '收起' : '展开' }}
+                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                </a>
+              </span>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+
+      <div class="table-operator" style="margin-bottom: 8px;">
+        <a-row>
+          <a-col :md="16">
+            <a-button v-if="$auth('tool-tools-add')" type="primary" icon="plus" @click="handleAdd()">新增</a-button>
+            <a-button style="margin-left: 8px" v-if="$auth('tool-tools-export')" type="primary" icon="download" @click="doExport">导出</a-button>
+            <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('tool-tools-del')">
+              <a-menu slot="overlay">
+                <a-popconfirm title="是否要删除所选数据?" @confirm="batchDelete()">
+                  <a-menu-item key="1"><a-icon type="delete" /><a>删除</a></a-menu-item>
+                </a-popconfirm>
+              </a-menu>
+              <a-button style="margin-left: 8px">
+                批量操作 <a-icon type="down" />
+              </a-button>
+            </a-dropdown>
+          </a-col>
+        </a-row>
+      </div>
+
+      <s-table
+        ref="table"
+        size="default"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :alert="options.alert"
+        :rowSelection="options.rowSelection"
+        showPagination="auto"
+      >
+        <span slot="action" slot-scope="record">
+          <template>
+            <a @click="handleView(record)">查看</a>
+            <operation-button
+              v-if="$auth('tool-tools-edit')"
+              @click="handleEdit(record)"
+            >修改</operation-button>
+            <operation-button
+              v-if="$auth('tool-tools-del')"
+              :type="2"
+              title="是否要删除该条数据?"
+              @confirm="batchDelete(record.id)">删除</operation-button>
+          </template>
+        </span>
+      </s-table>
+    </div>
+    <base-form ref="baseModal" @ok="handleOk"/>
+    <detail ref="detailModal" @ok="handleOk"/>
+  </a-card>
+</template>
+
+<script>
+import { STable, Ellipsis } from '@/components'
+import BaseForm from './modules/BaseForm'
+import Detail from './modules/Detail'
+import { getToolPage, deleteTools, fetchTool, exportTool } from '@/api/tool/tool'
+
+export default {
+  name: 'ToolList',
+  components: {
+    STable,
+    Ellipsis,
+    BaseForm,
+    Detail
+  },
+  data () {
+    return {
+      advanced: false,
+      visible: true,
+      // 查询参数
+      queryParam: {
+      },
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+          }
+        },
+        {
+          title: '工器具名称',
+          dataIndex: 'name'
+        },
+        {
+          title: '工器具型号',
+          dataIndex: 'ggxh'
+        },
+        {
+          title: '编号',
+          dataIndex: 'no'
+        },
+        {
+          title: '数量',
+          dataIndex: 'num'
+        },
+        {
+          title: '负责人',
+          dataIndex: 'checkUserId'
+        },
+        {
+          title: '生产厂家',
+          dataIndex: 'producer'
+        },
+        {
+          title: '是否合格:0否,1是',
+          dataIndex: 'hgFlag'
+        },
+        {
+          title: '是否需要检验:0否,1是',
+          dataIndex: 'checkFlag'
+        },
+        {
+          title: '检测内容',
+          dataIndex: 'content'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '创建日期',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '创建人名称',
+          dataIndex: 'createdUserName'
+        },
+        {
+          title: '存放地点',
+          dataIndex: 'position'
+        },
+        {
+          title: '检测日期',
+          dataIndex: 'checkDate'
+        },
+        {
+          title: '下次检测日期',
+          dataIndex: 'nextCheckDate'
+        },
+        {
+          title: '检测周期',
+          dataIndex: 'period',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Amount.formatter(text)
+          }
+        },
+        {
+          title: '预警天数',
+          dataIndex: 'warnDay'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        parameter = {
+          ...parameter,
+          ...this.queryParam,
+          dataScope: {
+            sortBy: 'desc',
+            sortName: 'update_time'
+          }
+        }
+        return getToolPage(Object.assign(parameter, this.queryParam))
+          .then(res => {
+            return res.data
+          })
+      },
+      selectedRowKeys: [],
+      selectedRows: [],
+
+      options: {
+        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+        rowSelection: {
+          selectedRowKeys: this.selectedRowKeys,
+          onChange: this.onSelectChange
+        }
+      },
+      optionAlertShow: false
+    }
+  },
+  created () {
+    // 下拉框map
+    this.tableOption()
+  },
+  methods: {
+    tableOption () {
+      if (!this.optionAlertShow) {
+        this.options = {
+          alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+          rowSelection: {
+            selectedRowKeys: this.selectedRowKeys,
+            onChange: this.onSelectChange,
+            getCheckboxProps: record => ({
+              props: {
+                disabled: false,
+                name: record.id
+              }
+            })
+          }
+        }
+        this.optionAlertShow = true
+      } else {
+        this.options = {
+          alert: false,
+          rowSelection: null
+        }
+        this.optionAlertShow = false
+      }
+    },
+    batchDelete (id) {
+      let ids = []
+      if (this.BaseTool.String.isBlank(id)) {
+        const length = this.selectedRows.length
+        if (length === 0) {
+          this.$message.info('请选择要删除的记录')
+          return
+        }
+        ids = this.selectedRows.map(item => item.id)
+      } else {
+        ids = [id]
+      }
+      deleteTools(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+        this.$refs.table.clearSelected()
+      })
+    },
+    handleAdd () {
+      this.visible = false
+      const modal = this.$refs.baseModal
+      modal.base()
+    },
+    handleEdit (record) {
+      this.visible = false
+      fetchTool({ id: record.id }).then(res => {
+        const modal = this.$refs.baseModal
+        modal.base(res.data)
+      })
+    },
+    handleView (record) {
+      this.visible = false
+      fetchTool({ id: record.id }).then(res => {
+        const modal = this.$refs.detailModal
+        modal.base(res.data)
+      })
+    },
+    handleOk (values) {
+      this.visible = true
+      this.$refs.table.refresh()
+    },
+    onSelectChange (selectedRowKeys, selectedRows) {
+      this.selectedRowKeys = selectedRowKeys
+      this.selectedRows = selectedRows
+    },
+    resetSearchForm () {
+      this.queryParam = {
+      }
+      this.$refs.table.refresh(true)
+    },
+    doExport () {
+      const parameter = {
+        ...this.queryParam
+      }
+      exportTool(parameter).then(file => {
+        this.BaseTool.Util.downLoadExportExcel(file)
+      })
+    },
+    handleEnter () {
+      this.$refs.table.refresh(true)
+    }
+  }
+}
+</script>

+ 301 - 0
src/views/tool/tool/modules/BaseForm.vue

@@ -0,0 +1,301 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <a-form :form="form">
+
+            <a-form-item v-show="false">
+                <a-input v-decorator="['id']" type="hidden"/>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </a-form-item>
+
+            <row-list :col="2">
+                                                                                                <row-item>
+
+                            <a-form-item
+                                    label="工器具名称"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['name', {rules: [{required: true, message: '工器具名称不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="工器具型号"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['ggxh', {rules: [{required: true, message: '工器具型号不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="编号"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            showTime
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['no', {rules: [{required: true, message: '编号不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="数量"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input-number
+                                            style="width: 100%"
+                                            :min="0"
+                                            :formatter="BaseTool.Amount.formatter"
+                                            :parser="BaseTool.Amount.parser"
+                                            v-decorator="['num', {rules: [{required: true, message: '数量不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="负责人"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['checkUserId', {rules: [{required: true, message: '负责人不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="生产厂家"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['producer', {rules: [{required: true, message: '生产厂家不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="是否合格:0否,1是"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['hgFlag', {rules: [{required: true, message: '是否合格:0否,1是不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="是否需要检验:0否,1是"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检测内容"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            showTime
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['content', {rules: [{required: true, message: '检测内容不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="备注"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['remark', {rules: [{required: true, message: '备注不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                                                                                                                                                                                                                                        <row-item>
+
+                            <a-form-item
+                                    label="存放地点"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['position', {rules: [{required: true, message: '存放地点不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检测日期"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input
+                                            v-decorator="['checkDate', {rules: [{required: true, message: '检测日期不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="下次检测日期"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-date-picker
+                                            style="width: 100%"
+                                            :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+                                            v-decorator="['nextCheckDate', {rules: [{required: true, message: '下次检测日期不能为空'}]}]"/>
+
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="检测周期"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input-number
+                                            style="width: 100%"
+                                            :min="0"
+                                            :formatter="BaseTool.Amount.formatter"
+                                            :parser="BaseTool.Amount.parser"
+                                            v-decorator="['period', {rules: [{required: true, message: '检测周期不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                                                <row-item>
+
+                            <a-form-item
+                                    label="预警天数"
+                                    :labelCol="BaseTool.Constant.labelCol"
+                                    :wrapperCol="BaseTool.Constant.wrapperCol"
+                            >
+                                                                    <a-input-number
+                                            style="width: 100%"
+                                            :min="0"
+                                            :formatter="BaseTool.Amount.formatter"
+                                            :parser="BaseTool.Amount.parser"
+                                            v-decorator="['warnDay', {rules: [{required: true, message: '预警天数不能为空'}]}]"/>
+                                                            </a-form-item>
+                        </row-item>
+                                                </row-list>
+        </a-form>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </a-card>
+</template>
+
+<script>
+    import pick from 'lodash.pick'
+    import {addTool, updateTool } from '@/api/tool/tool'
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        export default {
+        name: 'BaseTool',
+        data() {
+            return {
+                confirmLoading: false,
+                modalTitle: null,
+                form: this.$form.createForm(this),
+                visible: false,
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+        },
+        props: {},
+        created() {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base(record) {
+                this.visible = true
+                // 如果是空标识添加
+                if (this.BaseTool.Object.isBlank(record)) {
+                    this.modalTitle = '添加'
+                    return
+                }
+                this.modalTitle = '编辑'
+                const {form: {setFieldsValue}} = this
+                // 日期处理
+                                    record.no = this.BaseTool.Moment(record.no, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                    record.content = this.BaseTool.Moment(record.content, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                    record.nextCheckDate = this.BaseTool.Moment(record.nextCheckDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                this.$nextTick(() => {
+                    setFieldsValue(Object.assign(pick(record, [
+                                                                                    'id',
+                                                                                                                'name',
+                                                                                                                'ggxh',
+                                                                                                                'no',
+                                                                                                                'num',
+                                                                                                                'checkUserId',
+                                                                                                                'producer',
+                                                                                                                'hgFlag',
+                                                                                                                'checkFlag',
+                                                                                                                'content',
+                                                                                                                'remark',
+                                                                                                                                                                                                                                                                                                                                                                                                                                        'position',
+                                                                                                                'checkDate',
+                                                                                                                'nextCheckDate',
+                                                                                                                'period',
+                                                                                                                'warnDay',
+                                                    ])))
+                })
+            },
+            save() {
+                const {form: {validateFieldsAndScroll}} = this
+                this.confirmLoading = true
+                validateFieldsAndScroll((errors, values) => {
+                    if (errors) {
+                        this.confirmLoading = false
+                        return
+                    }
+                    // 日期处理
+                                            values.no = this.BaseTool.Date.formatter(values.no, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                            values.content = this.BaseTool.Date.formatter(values.content, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                            values.nextCheckDate = this.BaseTool.Date.formatter(values.nextCheckDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+                                        if (this.BaseTool.String.isBlank(values.id)) {
+                        addTool(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    } else {
+                        updateTool(values)
+                                .then(() => {
+                                    this.handleCancel(values)
+                                }).catch(() => {
+                            this.confirmLoading = false
+                        })
+                    }
+                })
+            },
+            handleCancel(values) {
+                this.visible = false
+                this.confirmLoading = false
+                this.form.resetFields()
+                if (this.BaseTool.Object.isNotBlank(values)) {
+                    this.$emit('ok', values)
+                } else {
+                    this.$emit('ok')
+                }
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }
+    }
+</script>

+ 90 - 0
src/views/tool/tool/modules/Detail.vue

@@ -0,0 +1,90 @@
+<template>
+    <a-card :bordered="false" v-show="visible" class="card" :title="modalTitle">
+        <a-row :gutter="48" slot="extra">
+            <a-col :md="48" :sm="48">
+              <span class="table-page-search-submitButtons" style="float: right">
+                <a-button style="margin-left: 8px" type="default" @click="handleCancel()">返回</a-button>
+              </span>
+            </a-col>
+        </a-row>
+        <detail-list title="" :col="2">
+                                                                                                    <detail-list-item term="工器具名称">{{ model.name }}</detail-list-item>
+                                                                                                            <detail-list-item term="工器具型号">{{ model.ggxh }}</detail-list-item>
+                                                                                                            <detail-list-item term="编号">{{ model.no }}</detail-list-item>
+                                                                                                            <detail-list-item term="数量">{{ model.num }}</detail-list-item>
+                                                                                                            <detail-list-item term="负责人">{{ model.checkUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="生产厂家">{{ model.producer }}</detail-list-item>
+                                                                                                            <detail-list-item term="是否合格:0否,1是">{{ model.hgFlag }}</detail-list-item>
+                                                                                                            <detail-list-item term="是否需要检验:0否,1是">{{ model.checkFlag }}</detail-list-item>
+                                                                                                            <detail-list-item term="检测内容">{{ model.content }}</detail-list-item>
+                                                                                                            <detail-list-item term="备注">{{ model.remark }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新日期">{{ model.updateTime }}</detail-list-item>
+                                                                                                            <detail-list-item term="创建人">{{ model.createdUserId }}</detail-list-item>
+                                                                                                                                        <detail-list-item term="更新人">{{ model.updateUserId }}</detail-list-item>
+                                                                                                            <detail-list-item term="更新人名称">{{ model.updateUserName }}</detail-list-item>
+                                                                                                            <detail-list-item term="存放地点">{{ model.position }}</detail-list-item>
+                                                                                                            <detail-list-item term="检测日期">{{ model.checkDate }}</detail-list-item>
+                                                                                                            <detail-list-item term="下次检测日期">{{ model.nextCheckDate }}</detail-list-item>
+                                                                                                            <detail-list-item term="检测周期">{{ model.period }}</detail-list-item>
+                                                                                                            <detail-list-item term="预警天数">{{ model.warnDay }}</detail-list-item>
+                                                        </detail-list>
+    </a-card>
+</template>
+
+<script>
+    import DetailList from '@/components/tools/DetailList'
+    const DetailListItem = DetailList.Item
+
+    export default {
+        name: 'ToolDetail',
+        components: {
+            DetailList,
+            DetailListItem
+        },
+        data () {
+            return {
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            model: {
+                                                                                                                    'name': null,
+                                                                                                'ggxh': null,
+                                                                                                'no': null,
+                                                                                                'num': null,
+                                                                                                'checkUserId': null,
+                                                                                                'producer': null,
+                                                                                                'hgFlag': null,
+                                                                                                'checkFlag': null,
+                                                                                                'content': null,
+                                                                                                'remark': null,
+                                                                                                                                            'updateTime': null,
+                                                                                                'createdUserId': null,
+                                                                                                                                            'updateUserId': null,
+                                                                                                'updateUserName': null,
+                                                                                                'position': null,
+                                                                                                'checkDate': null,
+                                                                                                'nextCheckDate': null,
+                                                                                                'period': null,
+                                                                                                'warnDay': null,
+                                                            }
+            }
+        },
+        created () {
+            // 下拉框map
+            
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            base (record) {
+                this.visible = true
+                this.modalTitle = '详情'
+                this.model = record
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            }
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
+    }
+</script>

+ 339 - 0
src/views/tool/tool/modules/ToolSelectModal.vue

@@ -0,0 +1,339 @@
+<template>
+    <a-modal
+            :title="modalTitle"
+            :width="1000"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            class="ant-modal2"
+            @cancel="handleCancel"
+    >
+        <a-card :bordered="false">
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline">
+                    <a-row :gutter="48">
+                        <a-col :md="6" :sm="24">
+                            <a-form-item label="关键字">
+                                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+                            </a-form-item>
+                        </a-col>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <a-col :md="6 || 24" :sm="24">
+                            <span class="table-page-search-submitButtons">
+                                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                                <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
+                                <a @click="()=>{ this.advanced = !this.advanced}" style="margin-left: 8px">
+                                  {{ advanced ? '收起' : '展开' }}
+                                  <a-icon :type="advanced ? 'up' : 'down'"/>
+                                </a>
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+
+            <div class="table-operator">
+            </div>
+
+            <s-table
+                    ref="table"
+                    size="default"
+                    rowKey="id"
+                    :columns="columns"
+                    :data="loadData"
+                    :alert="options.alert"
+                    :customRow="options.customRow"
+                    :rowSelection="options.rowSelection"
+                    showPagination="auto"
+            >
+                <span slot="action" slot-scope="record1">
+                  <template>
+                    <a @click="handleView(record1)">查看</a>
+                  </template>
+                </span>
+            </s-table>
+            <detail ref="detailModal"/>
+        </a-card>
+        <template slot="footer">
+            <a-button :loading="confirmLoading" type="primary" @click="handleCancel()">取消</a-button>
+            <a-button :loading="confirmLoading" type="primary" @click="handleSelect()">确定</a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script>
+    import { STable, Ellipsis } from '@/components'
+    import Detail from './Detail'
+    import { getToolPage, fetchTool } from '@/api/tool/tool'
+
+    export default {
+        name: 'ToolSelectModal',
+        components: {
+            STable,
+            Ellipsis,
+            Detail
+        },
+        props: {
+            type: {
+                type: String,
+                default: 'radio'
+            },
+            selectedRowKey: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            },
+            selectedRow: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            }
+        },
+        data () {
+            return {
+                advanced: false,
+                confirmLoading: false,
+                mdl: {},
+                modalTitle: null,
+                visible: false,
+                record: null,
+                // 查询参数
+                queryParam: {
+                },
+                extraQueryParam: {
+                },
+                // 表头
+                columns: [
+                    {
+                        title: '序号',
+                        dataIndex: 'index',
+                        customRender: (text, record, index) => {
+                            return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
+                        }
+                    },
+                                                                                                                                                {
+                                title: '工器具名称',
+                                dataIndex: 'name'
+                            },
+                                                                                                                                                        {
+                                title: '工器具型号',
+                                dataIndex: 'ggxh'
+                            },
+                                                                                                                                                        {
+                                title: '编号',
+                                dataIndex: 'no'
+                            },
+                                                                                                                                                            {
+                                    title: '数量',
+                                    dataIndex: 'num',
+                                    customRender: (text, record, index) => {
+                                        return this.BaseTool.Amount.formatter(text)
+                                    }                                ,
+                                },
+                                                                                                                                                        {
+                                title: '负责人',
+                                dataIndex: 'checkUserId'
+                            },
+                                                                                                                                                        {
+                                title: '生产厂家',
+                                dataIndex: 'producer'
+                            },
+                                                                                                                                                        {
+                                title: '是否合格:0否,1是',
+                                dataIndex: 'hgFlag'
+                            },
+                                                                                                                                                        {
+                                title: '是否需要检验:0否,1是',
+                                dataIndex: 'checkFlag'
+                            },
+                                                                                                                                                        {
+                                title: '检测内容',
+                                dataIndex: 'content'
+                            },
+                                                                                                                                                        {
+                                title: '备注',
+                                dataIndex: 'remark'
+                            },
+                                                                                                                                                        {
+                                title: '创建日期',
+                                dataIndex: 'createdTime'
+                            },
+                                                                                                                                                                                                                                                {
+                                title: '创建人名称',
+                                dataIndex: 'createdUserName'
+                            },
+                                                                                                                                                                                                                                                {
+                                title: '存放地点',
+                                dataIndex: 'position'
+                            },
+                                                                                                                                                        {
+                                title: '检测日期',
+                                dataIndex: 'checkDate'
+                            },
+                                                                                                                                                        {
+                                title: '下次检测日期',
+                                dataIndex: 'nextCheckDate'
+                            },
+                                                                                                                                                            {
+                                    title: '检测周期',
+                                    dataIndex: 'period',
+                                    customRender: (text, record, index) => {
+                                        return this.BaseTool.Amount.formatter(text)
+                                    }                                ,
+                                },
+                                                                                                                                                            {
+                                    title: '预警天数',
+                                    dataIndex: 'warnDay',
+                                    customRender: (text, record, index) => {
+                                        return this.BaseTool.Amount.formatter(text)
+                                    }                                ,
+                                },
+                                                                                            {
+                        title: '操作',
+                        key: 'action',
+                        width: '200px',
+                        align: 'center',
+                        scopedSlots: { customRender: 'action' }
+                    }
+                ],
+                // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            // 加载数据方法 必须为 Promise 对象
+                loadData: parameter => {
+                    parameter = {
+                        ...parameter,
+                        ...this.queryParam,
+                        ...this.extraQueryParam,
+                        dataScope: {
+                            sortBy: 'desc',
+                            sortName: 'update_time'
+                        }
+                    }
+                    return getToolPage(Object.assign(parameter, this.queryParam))
+                            .then(res => {
+                                return res.data
+                            })
+                },
+                selectedRowKeys: [],
+                selectedRows: [],
+
+                options: {
+                    alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                    rowSelection: {
+                        selectedRowKeys: this.selectedRowKeys,
+                        onChange: this.onSelectChange
+                    }
+                },
+                optionAlertShow: false,
+                isCreated: false
+            }
+        },
+        created () {
+            // 下拉框map
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        },
+        methods: {
+            tableOption () {
+                if (!this.optionAlertShow) {
+                    this.options = {
+                        alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
+                        rowSelection: {
+                            selectedRowKeys: this.selectedRowKeys,
+                            onChange: this.onSelectChange,
+                            type: this.type,
+                            getCheckboxProps: record => ({
+                                props: {
+                                    disabled: false,
+                                    name: record.id
+                                }
+                            })
+                        },
+                        customRow: (record) => {
+                            return {
+                                on: { // 事件
+                                    click: (event) => { // 点击行
+                                        // 选择对象
+                                        this.mySelect([record.id], [record])
+                                    },
+                                    dblclick: (event) => {
+                                        this.mySelect([record.id], [record])
+                                        this.handleSelect()
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    this.optionAlertShow = true
+                } else {
+                    this.options = {
+                        alert: false,
+                        rowSelection: null
+                    }
+                    this.optionAlertShow = false
+                }
+            },
+            handleView (record) {
+                fetchTool({ id: record.id }).then(res => {
+                    const modal = this.$refs.detailModal
+                    modal.base(res.data)
+                })
+            },
+            handleOk () {
+                this.$refs.table.refresh()
+            },
+            onSelectChange (selectedRowKeys, selectedRows) {
+                this.selectedRowKeys = selectedRowKeys
+                this.selectedRows = selectedRows
+            },
+            resetSearchForm () {
+                this.queryParam = {
+                }
+                this.$refs.table.refresh(true)
+            },
+            base (record, queryParam = {}) {
+                this.visible = true
+                this.modalTitle = '选择信息'
+                this.extraQueryParam = queryParam
+                this.record = record
+                if (this.isCreated) {
+                    this.$refs.table.clearSelected()
+                    this.options.rowSelection.type = this.type
+                    this.handleOk()
+                } else {
+                    this.tableOption()
+                    this.isCreated = true
+                }
+            },
+            handleCancel () {
+                this.visible = false
+                this.confirmLoading = false
+            },
+            handleSelect () {
+                if (this.selectedRowKeys.length === 0) {
+                    this.$message.warn('请至少选择一项信息')
+                } else {
+                    this.confirmLoading = true
+                    this.$emit('selected', this.record, this.selectedRowKeys, this.selectedRows)
+                    this.confirmLoading = false
+                    this.visible = false
+                }
+            },
+            mySelect(selectedRowKeys, selectedRows) {
+                if (this.type === 'radio') {
+                    this.$refs.table.updateSelect(selectedRowKeys, selectedRows)
+                            this.$refs.table.rowSelection.onChange(selectedRowKeys, selectedRows)
+                } else {
+                    let mySelectedRowKeys
+                    let mySelectedRows = this.selectedRows.filter(item => item.id !== selectedRowKeys[0])
+                    if (this.selectedRowKeys.includes(selectedRowKeys[0])) {
+                        mySelectedRowKeys = this.selectedRowKeys.filter(item => item !== selectedRowKeys[0])
+                    } else {
+                        mySelectedRowKeys = [...selectedRowKeys, ...this.selectedRowKeys]
+                        mySelectedRows = [...mySelectedRows, ...selectedRows]
+                    }
+                    this.$refs.table.updateSelect(mySelectedRowKeys, mySelectedRows)
+                            this.$refs.table.rowSelection.onChange(mySelectedRowKeys, mySelectedRows)
+                }
+
+            }
+        }
+    }
+</script>