hfxc226 преди 2 години
родител
ревизия
7b5b84b5be

+ 71 - 0
src/api/activiti/activiti-sb-scrap.js

@@ -0,0 +1,71 @@
+import { axios } from '@/utils/request'
+
+/**
+ * update func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function startSbInfoScrap (parameter) {
+  return axios({
+    url: '/activiti/sb/scrap/start',
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+ * update func 终止提交审批
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function stopSbInfoScrapForAudit (parameter) {
+  return axios({
+    url: '/activiti/sb/scrap/stop',
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+ * update func 审批开始
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function auditSbInfoScrapForAudit (parameter) {
+  return axios({
+    url: '/activiti/sb/scrap/audit',
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+ * update func 审批开始
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function historySbInfoScrapForAudit (parameter) {
+  return axios({
+    url: '/activiti/sb/scrap/history/' + parameter.id,
+    method: 'GET',
+    data: parameter
+  })
+}
+
+/**
+ * update func 审批开始
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function changeSbInfoScrapForAudit (parameter) {
+  return axios({
+    url: '/activiti/sb/scrap/assign',
+    method: 'PUT',
+    data: parameter
+  })
+}

+ 1 - 71
src/api/sb/info.js

@@ -445,74 +445,4 @@ export function auditProcess (parameter) {
     method: 'PUT',
     data: parameter
   })
-}
-
-/**
- * update func
- * parameter: { }
- * @param parameter
- * @returns {*}
- */
-export function startSbInfoScrap (parameter) {
-  return axios({
-    url: '/activiti/sb/start',
-    method: 'PUT',
-    data: parameter
-  })
-}
-
-/**
- * update func 终止提交审批
- * parameter: { }
- * @param parameter
- * @returns {*}
- */
-export function stopSbInfoScrapForAudit (parameter) {
-  return axios({
-    url: '/activiti/sb/stop',
-    method: 'PUT',
-    data: parameter
-  })
-}
-
-/**
- * update func 审批开始
- * parameter: { }
- * @param parameter
- * @returns {*}
- */
-export function auditSbInfoScrapForAudit (parameter) {
-  return axios({
-    url: '/activiti/sb/audit',
-    method: 'PUT',
-    data: parameter
-  })
-}
-
-/**
- * update func 审批开始
- * parameter: { }
- * @param parameter
- * @returns {*}
- */
-export function historySbInfoScrapForAudit (parameter) {
-  return axios({
-    url: '/activiti/sb/history/' + parameter.id,
-    method: 'GET',
-    data: parameter
-  })
-}
-
-/**
- * update func 审批开始
- * parameter: { }
- * @param parameter
- * @returns {*}
- */
-export function changeSbInfoScrapForAudit (parameter) {
-  return axios({
-    url: '/activiti/sb/assign',
-    method: 'PUT',
-    data: parameter
-  })
-}
+}

+ 141 - 0
src/api/sb/scraps.js

@@ -0,0 +1,141 @@
+import { axios } from '@/utils/request'
+import { stringify } from 'qs'
+
+/**
+ * page func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getSbScrapFormPage (parameter) {
+  return axios({
+    url: '/sb/scraps/page?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * add func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function addSbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps',
+    method: 'POST',
+    headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    data: parameter
+  })
+}
+
+/**
+ * update func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function updateSbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps/' + parameter.id,
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+     * update func
+     * parameter: { }
+     * @param parameter
+     * @returns {*}
+     */
+export function updateStatus (parameter) {
+  return axios({
+    url: '/status/scraps/status/' + parameter.id,
+    method: 'PUT',
+    data: parameter
+  })
+}
+
+/**
+ * fetch single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function fetchSbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps/' + parameter.id,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function querySbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * delete batch func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteSbScrapForms (parameter) {
+  return axios({
+    url: '/sb/scraps',
+    method: 'DELETE',
+    data: parameter
+  })
+}
+
+/**
+ * delete single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function deleteSbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps/' + parameter.id,
+    method: 'DELETE',
+    data: parameter
+  })
+}
+
+/**
+ * export file
+ * parameter: { }
+ * @param parameter :
+ * @returns {*}
+ */
+export function exportSbScrapForm (parameter) {
+  return axios({
+    url: '/sb/scraps/export?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    responseType: 'blob'
+  })
+}

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

@@ -260,6 +260,8 @@ const constantRouterComponents = {
   'SbCheckDetail': () => import('@/views/sb/sbcheckdetail/SbCheckDetail'),
   'Article': () => import('@/views/operate/article/Article'),
 
+  // 设备变动
+  'SbScrapForm': () => import('@/views/sb/scraps/SbScrapForm'), // 报废单
   // 备件盘点
   'StoreCheckPlan': () => import('@/views/store/storecheckplan/StoreCheckPlan'),
   'StoreCheckJob': () => import('@/views/store/storecheckjob/StoreCheckJob'),

+ 2 - 1
src/utils/dict.js

@@ -150,7 +150,8 @@ DictCache.TYPE = {
   CHECK_PLAN_LEVEL: 'CHECK_PLAN_LEVEL', // 等级1:现场,2,维修,3厂家
   CHECK_JOB_STATUS: 'CHECK_JOB_STATUS', // 任务状态,
   SPARE_PART_USED_SOURCE: 'SPARE_PART_USED_SOURCE', // 1 维修 2 保养
-
+  /* 设备变动 */
+  SB_SCRAP_FORM_STATUS: 'SB_SCRAP_FORM_STATUS', // 设备报废单状态
   /* 保养润滑模块 */
   MAINTAIN_STANDARD_PARAM_TYPE: 'MAINTAIN_STANDARD_PARAM_TYPE', // 标准参数类型
   MAINTAIN_STANDARD_TYPE: 'MAINTAIN_STANDARD_TYPE', // 检查类型

+ 107 - 2
src/views/activiti/user-model/modules/BaseForm.vue

@@ -80,6 +80,65 @@
             <a-button type="default" style="width: 20%" @click="clearUserSelect">清空</a-button>
           </a-form-item>
         </row-item>
+<!--        <row-item>
+          <a-form-item
+            label="指定部门"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-tree-select
+              style="width: 70%"
+              :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
+              :treeData="treeData"
+              :treeNodeFilterProp="'title'"
+              :showSearch="true"
+              v-decorator="['deptId', {rules: [{required: false, message: '不能为空'}]}]"
+              placeholder="请选择"
+            >
+            </a-tree-select>
+            <a-button type="default" style="width: 30%" @click="clearDeptSelect">清空</a-button>
+          </a-form-item>
+        </row-item>-->
+        <row-item>
+          <a-form-item
+            label="指定角色"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol">
+            <a-select
+              style="width: 70%"
+              v-decorator="['roleId', { rules: [{required: false, message: '指定角色不能为空'}]}]"
+              placeholder="请选择">
+              <a-select-option
+                v-for="item in roleList"
+                :key="item.roleId"
+                :label="item.roleName"
+                :value="item.roleId">{{ item.roleName }}</a-select-option>
+            </a-select>
+            <a-button style="width: 30%" type="default" @click="clearRoleSelect">清空</a-button>
+          </a-form-item>
+        </row-item>
+        <row-item>
+          <a-form-item
+            label="多个角色"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-select
+              style="width: 70%"
+              :show-search="true"
+              :filter-option="BaseTool.ANTD.selectFilterOption"
+              v-model="roleIdList"
+              mode="multiple">
+              <a-select-option
+                v-for="item in roleList"
+                :key="item.roleId"
+                :label="item.roleName"
+                :value="item.roleId">{{ item.roleName }}</a-select-option>
+            </a-select>
+            <a-button style="width: 30%" type="default" @click="clearRoleListSelect">清空</a-button>
+          </a-form-item>
+        </row-item>
+
         <row-item>
 
           <a-form-item
@@ -114,6 +173,8 @@
 import pick from 'lodash.pick'
 import { addActivitiUserModel, updateActivitiUserModel } from '@/api/activiti/user-model'
 import UserSelectModal from '@/views/upms/user/modules/UserSelectModal'
+import { getDeptTree } from '@/api/upms/dept'
+import { queryRole } from '@/api/upms/role'
 export default {
   name: 'BaseActivitiUserModel',
   components: {
@@ -125,6 +186,13 @@ export default {
       modalTitle: null,
       form: this.$form.createForm(this),
       visible: false,
+      treeData: [],
+      roleIdList: [],
+      checkedKeys: [],
+      autoExpandParent: true,
+      expandedKeys: [],
+      selectedKeys: [],
+      roleList: [],
       // 下拉框map
       typeMap: {}
     }
@@ -133,6 +201,12 @@ export default {
   created () {
     // 下拉框map
     this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.ACTIVITI_USER_MODEL_TYPE)
+    getDeptTree().then(res => {
+      this.treeData = res.data
+    })
+    queryRole({ status: 1 }).then(res => {
+      this.roleList = res.data
+    })
   },
   methods: {
     base (record) {
@@ -144,6 +218,9 @@ export default {
       }
       this.modalTitle = '编辑'
       const { form: { setFieldsValue } } = this
+      if (!this.BaseTool.Object.isBlank(record.sbList)) {
+        this.sbList = JSON.parse(record.sbList)
+      }
       // 日期处理
       this.$nextTick(() => {
         setFieldsValue(Object.assign(pick(record, [
@@ -152,9 +229,9 @@ export default {
           'name',
           'type',
           'assignee',
-          'realName',
           'roleId',
-          'roleName',
+          'deptId',
+          'realName',
           'formVariable',
           'remark'
         ])))
@@ -169,6 +246,7 @@ export default {
           return
         }
         // 日期处理
+        values.roleIdList = JSON.stringify(this.roleIdList)
         if (this.BaseTool.String.isBlank(values.id)) {
           addActivitiUserModel(values)
             .then(() => {
@@ -211,6 +289,33 @@ export default {
         }))
       })
     },
+    clearRoleSelect () {
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'roleId': null
+        }))
+      })
+    },
+    clearRoleListSelect () {
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'roleIdList': null
+        }))
+      })
+    },
+    clearDeptSelect () {
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'deptId': null
+        }))
+      })
+    },
     handleCancel (values) {
       this.visible = false
       this.confirmLoading = false

+ 371 - 0
src/views/sb/scraps/SbScrapForm.vue

@@ -0,0 +1,371 @@
+<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-col :md="6" :sm="24">
+              <a-form-item label="设备Id">
+                <a-input v-model="queryParam.sbInfoName" placeholder="设备Id" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="状态">
+                <a-select
+                  v-model="queryParam.status"
+                  placeholder="请选择">
+                  <a-select-option
+                    v-for="(label,value) in statusMap"
+                    :key="value"
+                    :label="label"
+                    :value="parseInt(value)">{{ label }}
+                  </a-select-option>
+                </a-select>
+              </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('sb-scraps-add')" type="primary" icon="plus" @click="handleAdd()">新增</a-button>
+            <a-button
+              style="margin-left: 8px"
+              v-if="$auth('sb-scraps-export')"
+              type="primary"
+              icon="download"
+              @click="doExport">导出
+            </a-button>
+            <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('sb-scraps-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('sb-scraps-edit')"
+              @click="handleEdit(record)"
+            >修改</operation-button>
+            <operation-button
+              v-if="$auth('sb-scraps-del')"
+              :type="2"
+              title="是否要删除该条数据?"
+              @confirm="batchDelete(record.id)">删除</operation-button>
+            <a-divider type="vertical" />
+            <a v-if="record.status == 1" @click="handleStart(record)">提交</a>
+            <a-divider type="vertical" />
+            <a v-if="record.status == 4" @click="handleStart(record)">再次提交</a>
+            <a-divider type="vertical" />
+            <a @click="handleViewImage(record)">流程图</a>
+            <a-divider type="vertical" />
+            <a @click="handleViewHistory(record)">审批历史</a>
+            <a-divider type="vertical" />
+            <a @click="handleStop(record)">终止审批</a>
+          </template>
+        </span>
+      </s-table>
+    </div>
+    <base-form ref="baseModal" @ok="handleOk" />
+    <detail ref="detailModal" @ok="handleOk" />
+    <image-modal ref="imageModal"/>
+    <history-table ref="historyModal"/>
+  </a-card>
+</template>
+
+<script>
+import { STable, Ellipsis } from '@/components'
+import BaseForm from './modules/BaseForm'
+import Detail from './modules/Detail'
+import ImageModal from '@/views/activiti/ImageModal'
+import HistoryTable from '@/views/activiti/HistoryTable'
+import { getSbScrapFormPage, deleteSbScrapForms, fetchSbScrapForm, exportSbScrapForm } from '@/api/sb/scraps'
+import { startSbInfoScrap, stopSbInfoScrapForAudit } from '@/api/activiti/activiti-sb-scrap'
+
+export default {
+  name: 'SbScrapFormList',
+  components: {
+    STable,
+    Ellipsis,
+    BaseForm,
+    Detail,
+    ImageModal,
+    HistoryTable
+  },
+  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: 'no'
+        },
+        {
+          title: '设备Id',
+          dataIndex: 'sbId',
+          customRender: (text, record, index) => {
+            return record.sbIdName
+          }
+        },
+        {
+          title: '设备编号',
+          dataIndex: 'sbNo'
+        },
+        {
+          title: '报废原因',
+          dataIndex: 'reason'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.statusMap, text)
+          }
+        },
+        {
+          title: '申请人',
+          dataIndex: 'applyUserId'
+        },
+        {
+          title: '申请人名称',
+          dataIndex: 'applyUserName'
+        },
+        {
+          title: '创建人名称',
+          dataIndex: 'createdUserName'
+        },
+        {
+          title: '创建日期',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      statusMap: {},
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        parameter = {
+          ...parameter,
+          ...this.queryParam,
+          dataScope: {
+            sortBy: 'desc',
+            sortName: 'update_time'
+          }
+        }
+        return getSbScrapFormPage(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.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SB_SCRAP_FORM_STATUS)
+    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]
+      }
+      deleteSbScrapForms(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
+      fetchSbScrapForm({ id: record.id }).then(res => {
+        const modal = this.$refs.baseModal
+        modal.base(res.data)
+      })
+    },
+    handleView (record) {
+      this.visible = false
+      fetchSbScrapForm({ 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
+      }
+      exportSbScrapForm(parameter).then(file => {
+        this.BaseTool.Util.downLoadExportExcel(file)
+      })
+    },
+    handleStart (record) {
+      startSbInfoScrap(record).then(res => {
+        this.$message.info(res.data)
+      })
+    },
+    handleViewImage (record) {
+      const modal = this.$refs.imageModal
+      modal.base(record.processInstanceId)
+    },
+    handleViewHistory (record) {
+      const modal = this.$refs.historyModal
+      modal.base(record)
+    },
+    handleStop (record) {
+      this.$message.info('正在终止审批流程,请勿重复点击')
+      this.confirmLoading = true
+      stopSbInfoScrapForAudit(record)
+        .then(() => {
+          this.$message.info('已成功终止审批流程,可以重新发起审批')
+          this.confirmLoading = false
+          this.handleOk()
+        }).catch(() => {
+          this.confirmLoading = false
+        })
+    },
+    handleEnter () {
+      this.$refs.table.refresh(true)
+    },
+    sbIdhandleDetail () {
+      const text = this.$router.resolve({
+        name: 'sbInfo',
+        query: { id: this.model.sbId }
+      })
+      // 打开一个新的页面
+      window.open(text.href, '_blank')
+    }
+  }
+}
+</script>

+ 278 - 0
src/views/sb/scraps/modules/BaseForm.vue

@@ -0,0 +1,278 @@
+<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-input v-decorator="['sbId']" 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
+              disabled
+              v-decorator="['no', {rules: [{required: false, message: '入库单号不能为空'}]}]"/>
+          </a-form-item>
+        </row-item>
+        <row-item>
+
+          <a-form-item
+            label="报废设备"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-input
+              style="width: 70%"
+              disabled
+              v-decorator="['sbNo', {rules: [{required: true, message: '设备编号不能为空'}]}]" />
+            <a-button style="width: 30%" type="primary" @click="sbInfoHandleSelect">选择</a-button>
+          </a-form-item>
+        </row-item>
+        <row-item>
+
+          <a-form-item
+            label="设备编号"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-input
+              disabled
+              v-decorator="['sbNo', {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="['initialValue', {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="['currentValue', {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="['startDate', {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="['workYear', {rules: [{required: true, message: '不能为空'}]}]"/>
+          </a-form-item>
+        </row-item>
+        <row-item>
+          <a-form-item
+            label="报废原因"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-textarea
+              v-decorator="['reason', {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-select
+              v-decorator="['status', {rules: [{required: true, message: '状态不能为空'}]}]"
+              placeholder="请选择">
+              <a-select-option
+                v-for="(label,value) in statusMap"
+                :key="value"
+                :label="label"
+                :value="parseInt(value)">{{ label }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </row-item>
+<!--        <row-item>
+          <a-form-item
+            label="申请人"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-input
+              v-decorator="['applyUserId', {initValue:userId, 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
+              disabled
+              v-decorator="['applyUserName', {initValue:realName, rules: [{required: true, message: '申请人不能为空'}]}]"/>
+          </a-form-item>
+        </row-item>-->
+      </row-list>
+    </a-form>
+    <sb-info-select-modal ref="sbInfoSelectModal" @selected="sbInfoHandleSelected"/>
+  </a-card>
+</template>
+
+<script>
+import pick from 'lodash.pick'
+import { addSbScrapForm, updateSbScrapForm } from '@/api/sb/scraps'
+import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
+export default {
+  name: 'BaseSbScrapForm',
+  components: {
+    SbInfoSelectModal
+  },
+  data () {
+    return {
+      userId: this.$store.getters.userInfo.userId,
+      realName: this.$store.getters.userInfo.realName,
+      confirmLoading: false,
+      modalTitle: null,
+      form: this.$form.createForm(this),
+      visible: false,
+      // 下拉框map
+      statusMap: {}
+    }
+  },
+  props: {},
+  created () {
+    // 下拉框map
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SB_SCRAP_FORM_STATUS)
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      // 如果是空标识添加
+      if (this.BaseTool.Object.isBlank(record)) {
+        this.modalTitle = '添加'
+        return
+      }
+      this.modalTitle = '编辑'
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign(pick(record, [
+          'id',
+          'no',
+          'sbId',
+          'sbNo',
+          'reason',
+          'remark',
+          'status',
+          'applyUserId',
+          'applyUserName'
+        ])))
+      })
+    },
+    save () {
+      const { form: { validateFieldsAndScroll } } = this
+      this.confirmLoading = true
+      validateFieldsAndScroll((errors, values) => {
+        if (errors) {
+          console.log(errors)
+          this.confirmLoading = false
+          return
+        }
+        // 日期处理
+        if (this.BaseTool.String.isBlank(values.id)) {
+          addSbScrapForm(values)
+            .then(() => {
+              this.handleCancel(values)
+            }).catch(() => {
+              this.confirmLoading = false
+            })
+        } else {
+          updateSbScrapForm(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')
+      }
+    },
+    sbInfoHandleSelect () {
+      this.$refs.sbInfoSelectModal.base({}, {})
+    },
+    sbInfoHandleSelected (keys, rows) {
+      const [ key ] = keys
+      const [ row ] = rows
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'sbId': key,
+          'sbNo': row.no,
+          'sbName': row.name,
+          'initialValue': row.initialValue,
+          'currentValue': row.currentValue,
+          'startDate': row.startDate,
+          'workYear': row.workYear
+        }))
+      })
+    }
+  }
+}
+</script>

+ 87 - 0
src/views/sb/scraps/modules/Detail.vue

@@ -0,0 +1,87 @@
+<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.no }}</detail-list-item>
+      <detail-list-item term="设备Id"><a @click="sbIdhandleDetail">{{ model.sbId }}</a></detail-list-item>
+      <detail-list-item term="设备编号">{{ model.sbNo }}</detail-list-item>
+      <detail-list-item term="设备编号">{{ model.sbName }}</detail-list-item>
+      <detail-list-item term="报废原因">{{ model.reason }}</detail-list-item>
+      <detail-list-item term="备注">{{ model.remark }}</detail-list-item>
+      <detail-list-item term="状态">{{ BaseTool.Object.getField(this.statusMap,model.status) }}</detail-list-item>
+      <detail-list-item term="申请人">{{ model.applyUserId }}</detail-list-item>
+      <detail-list-item term="申请人名称">{{ model.applyUserName }}</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>
+  </a-card>
+</template>
+
+<script>
+import DetailList from '@/components/tools/DetailList'
+const DetailListItem = DetailList.Item
+
+export default {
+  name: 'SbScrapFormDetail',
+  components: {
+    DetailList,
+    DetailListItem
+  },
+  data () {
+    return {
+      confirmLoading: false,
+      mdl: {},
+      modalTitle: null,
+      visible: false,
+      // 下拉框map
+      statusMap: {},
+      model: {
+        'no': null,
+        'sbId': null,
+        'sbNo': null,
+        'reason': null,
+        'remark': null,
+        'status': null,
+        'applyUserId': null,
+        'applyUserName': null,
+        'createdUserId': null,
+        'updateUserId': null,
+        'updateUserName': null,
+        'updateTime': null
+      }
+    }
+  },
+  created () {
+    // 下拉框map
+
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SB_SCRAP_FORM_STATUS)
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      this.modalTitle = '详情'
+      this.model = record
+    },
+    handleCancel () {
+      this.visible = false
+      this.confirmLoading = false
+    },
+    sbIdhandleDetail () {
+      const text = this.$router.resolve({
+        name: sbInfo,
+        query: { id: this.model.sbId }
+      })
+      // 打开一个新的页面
+      window.open(text.href, '_blank')
+    }
+  }
+}
+</script>

+ 324 - 0
src/views/sb/scraps/modules/SbScrapFormSelectModal.vue

@@ -0,0 +1,324 @@
+<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" :sm="24">
+              <a-form-item label="设备Id">
+                <a-input v-model="queryParam.sbInfoName" placeholder="设备Id"/>
+              </a-form-item>
+            </a-col>
+            <a-select
+              v-model="queryParam.status"
+              placeholder="请选择">
+              <a-select-option
+                v-for="(label,value) in statusMap"
+                :key="value"
+                :label="label"
+                :value="parseInt(value)">{{ label }}
+              </a-select-option>
+            </a-select>
+            <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 { getSbScrapFormPage, fetchSbScrapForm } from '@/api/sb/scraps'
+
+export default {
+  name: 'SbScrapFormSelectModal',
+  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: 'no'
+        },
+        {
+          title: '设备Id',
+          dataIndex: 'sbId',
+          customRender: (text, record, index) => {
+            return record.sbIdName
+          }
+        },
+        {
+          title: '设备编号',
+          dataIndex: 'sbNo'
+        },
+        {
+          title: '报废原因',
+          dataIndex: 'reason'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.statusMap, text)
+          }
+        },
+        {
+          title: '申请人',
+          dataIndex: 'applyUserId'
+        },
+        {
+          title: '申请人名称',
+          dataIndex: 'applyUserName'
+        },
+        {
+          title: '创建人名称',
+          dataIndex: 'createdUserName'
+        },
+        {
+          title: '创建日期',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      statusMap: {},
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        parameter = {
+          ...parameter,
+          ...this.queryParam,
+          ...this.extraQueryParam,
+          dataScope: {
+            sortBy: 'desc',
+            sortName: 'update_time'
+          }
+        }
+        return getSbScrapFormPage(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
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SB_SCRAP_FORM_STATUS)
+  },
+  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) {
+      fetchSbScrapForm({ 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>