chenyuehu 4 yıl önce
ebeveyn
işleme
1210816b44

+ 1 - 0
src/utils/dict.js

@@ -115,6 +115,7 @@ DictCache.TYPE = {
   REPAIR_FORM_STATUS: 'REPAIR_FORM_STATUS', // 维修状态
   REPAIR_CHECK_STATUS: 'REPAIR_CHECK_STATUS', // 验收状态
   REPAIR_FEE_TYPE: 'REPAIR_FEE_TYPE', // 费用类别
+  REPAIR_OUT_TYPE: 'REPAIR_OUT_TYPE', // 费用类别
   REPAIR_PROJECT_TYPE: 'REPAIR_PROJECT_TYPE', // 费用类别
   REPAIR_TECHNOLOGY_TYPE: 'REPAIR_TECHNOLOGY_TYPE', // 费用类别
   /* 点巡检模块 */

+ 8 - 3
src/views/repair/application-form/MyRepairForm.vue

@@ -20,7 +20,8 @@
       </div>
 
       <div class="table-operator">
-<!--        <a-button v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseModal.base({},{filter: -1})">新增</a-button>-->
+        <!--        <a-button v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseModal.base({},{filter: -1})">新增</a-button>-->
+        <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseOutModal.base()">新增委外</a-button>
         <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-export')" type="primary" icon="download" @click="doExport">导出</a-button>
         <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('repair-application-forms-del')">
           <a-menu slot="overlay">
@@ -71,6 +72,7 @@
     </div>
     <base-form ref="baseModal" @ok="handleOk"/>
     <detail ref="detailModal" @ok="handleOk"/>
+    <detail-out ref="detailOutModal" @ok="handleOk"/>
     <dispatch-base-form ref="dispatchBaseForm" @ok="handleOk" />
   </a-card>
 </template>
@@ -79,6 +81,7 @@
 import { STable, Ellipsis } from '@/components'
 import BaseForm from './modules/BaseForm'
 import Detail from './modules/DetailRepair'
+import DetailOut from './modules/DetailRepairOut'
 import { getRepairApplicationFormPage, deleteRepairApplicationForms, fetchRepairApplicationForm, exportRepairApplicationForm } from '@/api/repair/application-form'
 import DispatchBaseForm from '@/views/repair/application-form/modules/DispatchBaseForm'
 
@@ -89,6 +92,7 @@ export default {
     Ellipsis,
     BaseForm,
     Detail,
+    DetailOut,
     DispatchBaseForm
   },
   data () {
@@ -148,7 +152,7 @@ export default {
           checked: true,
           dataIndex: 'needStop',
           customRender: (text, record, index) => {
-            return this.BaseTool.Object.getField(this.needStopMap,text)
+            return this.BaseTool.Object.getField(this.needStopMap, text)
           }
         },
         {
@@ -265,7 +269,8 @@ export default {
     handleView (record) {
       fetchRepairApplicationForm({ id: record.id }).then(res => {
         this.visible = false
-        const modal = this.$refs.detailModal
+        const type = res.data.type
+        const modal = type === 2 ? this.$refs.detailOutModal : this.$refs.detailModal
         modal.base(res.data)
       })
     },

+ 1 - 0
src/views/repair/application-form/RepairApplicationForm.vue

@@ -186,6 +186,7 @@ export default {
         parameter = {
           ...parameter,
           ...this.queryParam,
+          type: 1,
           dataScope: {
             sortBy: 'desc',
             sortName: 'update_time'

+ 19 - 10
src/views/repair/application-form/RepairForm.vue

@@ -21,6 +21,7 @@
 
       <div class="table-operator">
         <a-button v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseModal.base({},{filter: -1})">新增</a-button>
+        <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseOutModal.base()">新增委外</a-button>
         <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-export')" type="primary" icon="download" @click="doExport">导出</a-button>
         <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('repair-application-forms-del')">
           <a-menu slot="overlay">
@@ -50,17 +51,17 @@
             <operation-button
               v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-edit')"
               @click="handleEdit(record)" >修改</operation-button>
-<!--            <operation-button-->
-<!--              v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-del')"-->
-<!--              :type="2"-->
-<!--              title="是否要删除该条数据?"-->
-<!--              @confirm="batchDelete(record.id)">删除</operation-button>-->
+            <!--            <operation-button-->
+            <!--              v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-del')"-->
+            <!--              :type="2"-->
+            <!--              title="是否要删除该条数据?"-->
+            <!--              @confirm="batchDelete(record.id)">删除</operation-button>-->
             <!--<operation-button
               v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-dispatch')"
               @click="handleDispatching(record)" >派工</operation-button>-->
-             <operation-button
-               v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-edit')"
-               @click="handleAssign(record)" >派工</operation-button>
+            <operation-button
+              v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status && $auth('repair-application-forms-edit')"
+              @click="handleAssign(record)" >派工</operation-button>
           </template>
         </span>
         <span slot="status" slot-scope="text">
@@ -72,7 +73,9 @@
       </s-table>
     </div>
     <base-form ref="baseModal" @ok="handleOk"/>
+    <base-out-form ref="baseOutModal" @ok="handleOk"/>
     <detail ref="detailModal" @ok="handleOk"/>
+    <detail-out ref="detailOutModal" @ok="handleOk"/>
     <assign-form ref="assignForm" @ok="handleOk" />
     <dispatch-base-form ref="dispatchBaseForm" @ok="handleOk" />
   </a-card>
@@ -81,8 +84,10 @@
 <script>
 import { STable, Ellipsis } from '@/components'
 import BaseForm from './modules/BaseForm'
+import BaseOutForm from './modules/BaseOutForm'
 import AssignForm from './modules/AssignForm'
 import Detail from './modules/DetailRepair'
+import DetailOut from './modules/DetailRepairOut'
 import { getRepairApplicationFormPage, deleteRepairApplicationForms, fetchRepairApplicationForm, exportRepairApplicationForm } from '@/api/repair/application-form'
 import DispatchBaseForm from '@/views/repair/application-form/modules/DispatchBaseForm'
 
@@ -92,6 +97,8 @@ export default {
     STable,
     Ellipsis,
     BaseForm,
+    BaseOutForm,
+    DetailOut,
     AssignForm,
     Detail,
     DispatchBaseForm
@@ -263,14 +270,16 @@ export default {
     },
     handleEdit (record) {
       fetchRepairApplicationForm({ id: record.id }).then(res => {
-        const modal = this.$refs.baseModal
+        const type = res.data.type
+        const modal = type === 2 ? this.$refs.baseOutModal : this.$refs.baseModal
         modal.base(res.data)
       })
     },
     handleView (record) {
       fetchRepairApplicationForm({ id: record.id }).then(res => {
         this.visible = false
-        const modal = this.$refs.detailModal
+        const type = res.data.type
+        const modal = type === 2 ? this.$refs.detailOutModal : this.$refs.detailModal
         modal.base(res.data)
       })
     },

+ 205 - 0
src/views/repair/application-form/modules/BaseOutForm.vue

@@ -0,0 +1,205 @@
+<template>
+  <a-modal
+    :title="modalTitle"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    class="ant-modal2"
+    @cancel="handleCancel"
+  >
+    <a-form :form="form">
+
+      <a-form-item v-show="false" >
+        <a-input v-decorator="['id']" type="hidden"/>
+        <a-input v-decorator="['mainRepairId']" 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="['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-select v-decorator="['outType']" placeholder="请选择">
+              <a-select-option
+                v-for="(label,value) in outTypeMap"
+                :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-select v-decorator="['repairUserId', {rules: [{required: true, message: '维修人负责人不能为空'}]}]" placeholder="请选择">
+              <a-select-option
+                v-for="item in deptUserList"
+                :key="item.userId"
+                :label="item.realName"
+                :value="item.userId">{{ item.realName }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </row-item>
+      </row-list>
+      <row-list :col="1">
+        <row-item>
+          <a-form-item
+            label="故障描述"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-textarea
+              :rows="4"
+              v-decorator="['content']"/>
+          </a-form-item>
+        </row-item>
+      </row-list>
+    </a-form>
+    <template slot="footer">
+      <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+    </template>
+  </a-modal>
+</template>
+
+<script>
+import pick from 'lodash.pick'
+import { queryUserDept } from '@/api/upms/user-dept'
+import { addRepairApplicationForm, updateRepairApplicationForm } from '@/api/repair/application-form'
+import PartInfoSelectModal from '@/views/part/info/modules/PartInfoSelectModal'
+import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
+
+export default {
+  name: 'BaseRepairApplicationForm',
+  data () {
+    return {
+      confirmLoading: false,
+      modalTitle: null,
+      form: this.$form.createForm(this),
+      visible: false,
+      // 下拉框map
+      sourceMap: {},
+      outTypeMap: {},
+      levelMap: {},
+      questionMap: {},
+      needStopMap: {},
+      statusMap: {},
+      userInfo: this.$store.getters.userInfo,
+      deptUserList: []
+    }
+  },
+  components: {
+    SbInfoSelectModal,
+    PartInfoSelectModal
+  },
+  props: {
+  },
+  created () {
+    // 下拉框map
+    this.sourceMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_SOURCE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_LEVEL)
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_STATUS)
+    this.questionMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_QUESTION)
+    this.needStopMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
+    this.outTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_OUT_TYPE)
+    this.getDeptUsers()
+  },
+  methods: {
+    base (record, mainForm = {}) {
+      this.visible = true
+      // 如果是空标识添加
+      const { form: { setFieldsValue } } = this
+      if (this.BaseTool.Object.isBlank(record)) {
+        this.modalTitle = '添加'
+        if (mainForm != null && mainForm.id != null) {
+          this.$nextTick(() => {
+            setFieldsValue({
+              mainRepairId: mainForm.id
+            })
+          })
+        }
+        return
+      }
+      this.modalTitle = '编辑'
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign(pick(record, [
+          'id',
+          'sbId',
+          'partId',
+          'type',
+          'outType',
+          'mainRepairId',
+          'repairUserId',
+          'no',
+          'source',
+          'level',
+          'content',
+          'status',
+          'sbName',
+          'partName',
+          'remark'
+        ])))
+      })
+    },
+    getDeptUsers () {
+      queryUserDept({ deptCode: this.DictCache.VALUE.SYS_DEPT_CODE.XIAN_CHANG_WEI_XIU_ZU, userStatus: 1 }).then(res => {
+        queryUserDept({ deptCode: this.DictCache.VALUE.SYS_DEPT_CODE.CHANG_NEI_WEI_XIU_ZU, userStatus: 1 }).then(res2 => {
+          this.deptUserList = res.data.concat(res2.data)
+        })
+      })
+    },
+    save () {
+      const { form: { validateFieldsAndScroll } } = this
+      this.confirmLoading = true
+      validateFieldsAndScroll((errors, values) => {
+        if (errors) {
+          this.confirmLoading = false
+          return
+        }
+        values.type = 2
+        if (this.BaseTool.String.isBlank(values.id)) {
+          addRepairApplicationForm(values)
+            .then(() => {
+              this.handleCancel(values)
+            }).catch(() => {
+              this.confirmLoading = false
+            })
+        } else {
+          updateRepairApplicationForm(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)
+      }
+    }
+
+  }
+}
+</script>

+ 8 - 0
src/views/repair/application-form/modules/DetailRepair.vue

@@ -8,6 +8,7 @@
             <a-popconfirm v-if="$auth('repair-application-forms-deal') && (DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.ALLOCATED === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)" title="是否要接收?" @confirm="receive">
               <a-button>接收</a-button>
             </a-popconfirm>
+            <a-button v-if="$auth('repair-application-forms-out') && (DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING >= model.status) && model.type != 2" style="margin-left: 8px" type="primary" @click="handleOut">委外</a-button>
             <a-button v-if="$auth('repair-application-forms-dispatch') && (DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.ALLOCATED === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)" style="margin-left: 8px" type="primary" @click="handleDispatch">转派</a-button>
             <a-button v-if="$auth('repair-application-forms-finish') && DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status" style="margin-left: 8px" type="primary" @click="handleFinish()">维修完成</a-button>
             <!--          <a-button v-if="$auth('repair-application-forms-finish') && DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status" style="margin-left: 8px" type="primary" @click="handleSparePick">领用备件</a-button>-->
@@ -188,6 +189,7 @@
 
     </a-card>
     <check-form ref="checkForm" @ok="handleOk" />
+    <base-out-form ref="outForm" @ok="handleOk" />
     <finish-form ref="finishForm" @ok="handleOk" />
     <dispatch-form ref="dispatchForm" @ok="handleCancel" />
     <assign-form ref="assignForm" @ok="handleCancel" />
@@ -207,6 +209,7 @@
 import DetailList from '@/components/tools/DetailList'
 import { fetchRepairApplicationForm, approve, receive } from '@/api/repair/application-form'
 import CheckForm from './CheckForm'
+import BaseOutForm from './BaseOutForm'
 import FinishForm from './FinishForm'
 import DispatchForm from './DispatchForm'
 import AssignForm from './AssignForm'
@@ -238,6 +241,7 @@ export default {
     ReasonDetail,
     DetailListItem,
     FinishForm,
+    BaseOutForm,
     DispatchForm,
     FeeDetail,
     AssignForm,
@@ -534,6 +538,10 @@ export default {
         this.handleOk()
       })
     },
+    handleOut () {
+      const modal = this.$refs.outForm
+      modal.base(null, this.model)
+    },
     handleAddFee () {
       const modal = this.$refs.feeForm
       modal.base(null, this.model)

+ 544 - 0
src/views/repair/application-form/modules/DetailRepairOut.vue

@@ -0,0 +1,544 @@
+<template>
+  <div>
+    <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-popconfirm v-if="$auth('repair-application-forms-deal') && (DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.ALLOCATED === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)" title="是否要接收?" @confirm="receive">
+              <a-button>接收</a-button>
+            </a-popconfirm>
+<!--            <a-button v-if="DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status" style="margin-left: 8px" type="primary" @click="handleEdit()">编辑</a-button>-->
+            <a-button v-if="$auth('repair-application-forms-finish') && DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status" style="margin-left: 8px" type="primary" @click="handleFinish()">委外维修完成</a-button>
+            <!--          <a-button v-if="$auth('repair-application-forms-finish') && DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status" style="margin-left: 8px" type="primary" @click="handleSparePick">领用备件</a-button>-->
+            <a-button style="margin-left: 8px" @click="handleCancel">返回</a-button>
+          </span>
+        </a-col>
+      </a-row>
+      <a-layout>
+        <a-layout-content style="background-color: rgb(255, 255, 255)">
+          <a-divider orientation="left">委外详情</a-divider>
+          <detail-list title="" :col="3">
+            <detail-list-item term="委外单号">{{ model.no }}</detail-list-item>
+            <detail-list-item term="委外单号">{{ outTypeMap[model.outType] }}</detail-list-item>
+            <detail-list-item term="委外时间">{{ model.applyTime }}</detail-list-item>
+            <detail-list-item term="委外状态"><badge :text="BaseTool.Object.getField(statusMap,model.status)" :status="DictCache.COLOR.REPAIR_APPLICATION_FORM_STATUS[model.status]"/></detail-list-item>
+          </detail-list>
+          <detail-list title="" :col="1">
+            <!--<detail-list-item term="故障描述">{{ BaseTool.Object.getField(this.descripitionMap, model.content) }}</detail-list-item>-->
+            <detail-list-item term="故障描述">{{ model.content }}</detail-list-item>
+          </detail-list>
+          <detail-list title="" :col="1">
+            <detail-list-item term="维修描述">{{ model.repairContent }}</detail-list-item>
+          </detail-list>
+          <detail-list title="维修图片:" :col="6">
+            <upload-image-detail :images-list="model.repairFileList"/>
+          </detail-list>
+          <a-divider orientation="left">验收详情</a-divider>
+          <detail-list title="" :col="3">
+            <detail-list-item term="验收开始时间">{{ model.checkStartTime }}</detail-list-item>
+            <detail-list-item term="验收结束时间">{{ model.checkEndTime }}</detail-list-item>
+            <detail-list-item term="验收人员">{{ model.checkUserName }}</detail-list-item>
+            <detail-list-item term="验收描述">{{ model.checkContent }}</detail-list-item>
+          </detail-list>
+          <detail-list title="验收图片:" :col="6">
+            <upload-image-detail :images-list="model.checkFileList"/>
+          </detail-list>
+        </a-layout-content>
+      </a-layout>
+      <title-divider title="费用清单" width="90px"></title-divider>
+      <div class="table-operator" v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)">
+        <a-button type="primary" @click="handleAddFee">
+          <a-icon type="plus"/>
+          添加
+        </a-button>
+      </div>
+      <a-table
+        :data-source="dataFee"
+        :columns="columnsFee"
+        tableLayout="auto"
+        rowKey="id">
+        <span slot="action" slot-scope="record">
+          <template>
+            <a @click="handleViewFee(record)">查看</a>
+            <operation-button
+              v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)"
+              @click="handleEditFee(record)" >修改</operation-button>
+
+            <operation-button
+              v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)"
+              :type="2"
+              title="确认删除该笔费用?"
+              @confirm="batchDeleteFee(record.id)" >删除</operation-button>
+          </template>
+        </span>
+      </a-table>
+      <title-divider title="原因分析" width="90px"></title-divider>
+      <div class="table-operator" v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)">
+        <a-button type="primary" @click="handleAddReason">
+          <a-icon type="plus"/>
+          添加
+        </a-button>
+      </div>
+      <a-table
+        :data-source="dataReason"
+        :columns="columnsReason"
+        tableLayout="fixed"
+        rowKey="id">
+        <span slot="action" slot-scope="record">
+          <template>
+            <a @click="handleViewReason(record)">查看</a>
+            <operation-button
+              v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)"
+              @click="handleEditReason(record)" >修改</operation-button>
+
+            <operation-button
+              v-if="$auth('repair-application-forms-finish') && ( DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.PROCESSING === model.status || DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.REBACK === model.status)"
+              :type="2"
+              title="确认删除该记录?"
+              @confirm="batchDeleteReason(record.id)" >删除</operation-button>
+          </template>
+        </span>
+      </a-table>
+
+    </a-card>
+    <check-form ref="checkForm" @ok="handleOk" />
+    <base-out-form ref="outForm" @ok="handleOk" />
+    <finish-form ref="finishForm" @ok="handleOk" />
+    <dispatch-form ref="dispatchForm" @ok="handleCancel" />
+    <assign-form ref="assignForm" @ok="handleCancel" />
+    <spare-pick-base-form ref="baseModal" @ok="handleOk"/>
+    <repair-project-select-Modal :type="'checkbox'" ref="repairProjectSelectModal" @selected="handleRepairProjectSelected"/>
+    <!--    <spare-part-info-select-modal :type="'checkbox'" ref="spareSelectModal" @selected="handleSpareSelected"/>-->
+    <base-form-for-repair ref="baseFormForRepair" @ok="handleOk" />
+    <spare-store-select-modal ref="spareStoreSelectModal" @selected="handleSpareStoreSelected"/>
+    <fee-base-form ref="feeForm" @ok="handleOk" />
+    <fee-detail ref="feeDetail" @ok="handleOk" />
+    <reason-base-form ref="reasonForm" @ok="handleOk" />
+    <reason-detail ref="reasonDetail" @ok="handleOk" />
+  </div>
+</template>
+
+<script>
+import DetailList from '@/components/tools/DetailList'
+import { fetchRepairApplicationForm, approve, receive } from '@/api/repair/application-form'
+import CheckForm from './CheckForm'
+import BaseOutForm from './BaseOutForm'
+import FinishForm from './FinishOutForm'
+import DispatchForm from './DispatchForm'
+import AssignForm from './AssignForm'
+import SparePickBaseForm from '../../../store/sparepickform/modules/BaseForm'
+import SparePartUsedSelectTable from '@/views/sqarepartmanage/sparepartused/modules/SparePartUsedSelectTable'
+import SparePickFormSelectTable from '@/views/store/sparepickform/modules/SparePickFormSelectTable'
+import RepairProjectSelectModal from '@/views/repair/repairproject/modules/RepairProjectSelectModal'
+import { selectRepairProjectListByRepairId, addRepairProjectRelationBatch, deleteRepairProjectRelations } from '@/api/repair/repairprojectrelation'
+import SparePartInfoSelectModal from '@/views/sqarepartmanage/sparepartinfo/modules/SparePartInfoSelectModal'
+import BaseFormForRepair from '@/views/sqarepartmanage/sparepartused/modules/BaseFormForRepair'
+import { selectSparePartUsedListByRepairId, addSparePartUsedBatch, deleteSparePartUseds } from '@/api/sqarepartmanage/sparepartused'
+import SpareStoreSelectModal from '@/views/store/sparestore/modules/SpareStoreSelectModal'
+import BaseTool from '@/utils/tool'
+import FeeBaseForm from '@/views/repair/fee/modules/BaseForm'
+import FeeDetail from '@/views/repair/fee/modules/Detail'
+import { deleteRepairFees, fetchRepairFee, queryRepairFee } from '@/api/repair/fee'
+import ReasonBaseForm from '@/views/repair/repair-reason/modules/BaseForm'
+import ReasonDetail from '@/views/repair/repair-reason/modules/Detail'
+import { deleteRepairReasons, fetchRepairReason, queryRepairReason } from '@/api/repair/repair-reason'
+
+const DetailListItem = DetailList.Item
+
+export default {
+  name: 'RepairApplicationFormDetail',
+  components: {
+    CheckForm,
+    DetailList,
+    ReasonBaseForm,
+    ReasonDetail,
+    DetailListItem,
+    FinishForm,
+    BaseOutForm,
+    DispatchForm,
+    FeeDetail,
+    AssignForm,
+    FeeBaseForm,
+    SparePickBaseForm,
+    SparePartUsedSelectTable,
+    SparePickFormSelectTable,
+    RepairProjectSelectModal,
+    SparePartInfoSelectModal,
+    BaseFormForRepair,
+    SpareStoreSelectModal
+  },
+  data () {
+    return {
+      confirmLoading: false,
+      mdl: {},
+      modalTitle: null,
+      needStopMap: {},
+      dispatchList: [],
+      visible: false,
+      // 下拉框map
+      sourceMap: {},
+      outTypeMap: {},
+      typeMap: {},
+      levelMap: {},
+      descripitionMap: {},
+      selectedRowKeys: [],
+      statusMap: {},
+      repairProjectMap: {},
+      repairTechnologyMap: {},
+      activeKey: 'a',
+      data: [],
+      dataSpare: [],
+      dataFee: [],
+      dataReason: [],
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${index + 1}`
+          }
+        },
+        {
+          title: '编码',
+          dataIndex: 'no'
+        },
+        {
+          title: '名称',
+          dataIndex: 'name'
+        },
+        {
+          title: '维修类别',
+          dataIndex: 'type',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.repairProjectMap, text)
+          }
+        },
+        {
+          title: '维修工艺',
+          dataIndex: 'technology',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.repairTechnologyMap, text)
+          }
+        },
+        {
+          title: '标准工时',
+          dataIndex: 'standardHours'
+        },
+        {
+          title: '标准费用',
+          dataIndex: 'standardMoney'
+        },
+        {
+          title: '考核工时',
+          dataIndex: 'checkHours'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      columnsSpare: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${index + 1}`
+          }
+        },
+        {
+          title: '备件名称',
+          dataIndex: 'spareId',
+          customRender: (text, record, index) => {
+            return record.spareName
+          }
+        },
+        {
+          title: '数量',
+          dataIndex: 'num'
+        },
+        {
+          title: '价格',
+          dataIndex: 'price'
+        },
+        {
+          title: '总价',
+          dataIndex: 'totalPrice'
+        },
+        {
+          title: '更换日期',
+          dataIndex: 'startDate'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'actionSpare' }
+        }
+      ],
+      columnsFee: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          customRender: (text, record, index) => {
+            return `${index + 1}`
+          }
+        },
+        {
+          title: '费用金额',
+          dataIndex: 'fee',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Amount.formatter(text)
+          }
+        },
+        {
+          title: '费用类别',
+          dataIndex: 'type',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.typeMap, text)
+          }
+        },
+        {
+          title: '费用原因',
+          dataIndex: 'reason'
+        },
+        {
+          title: '费用描述',
+          dataIndex: 'descripition'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remark'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      columnsReason: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          width: '70',
+          customRender: (text, record, index) => {
+            return `${index + 1}`
+          }
+        },
+        {
+          title: '分析时间',
+          dataIndex: 'analyzeTime',
+          width: '200px'
+        },
+        {
+          title: '问题描述',
+          dataIndex: 'problemDesc',
+          ellipsis: true,
+          width: '200px'
+        },
+        {
+          title: '原因分析',
+          dataIndex: 'reasonAnalysis',
+          ellipsis: true,
+          width: '200px'
+        },
+        {
+          title: '改进措施',
+          dataIndex: 'improveMeasure',
+          ellipsis: true,
+          width: '200px'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      model: {
+        'id': null,
+        'sbId': null,
+        'partId': null,
+        'repairUserId': null,
+        'needStop': null,
+        'no': null,
+        'source': null,
+        'applyTime': null,
+        'level': null,
+        'content': null,
+        'status': null,
+        'remark': null,
+        'updateTime': null,
+        'createdUserId': null,
+        'updateUserId': null,
+        'createdUserName': null,
+        'sbName': null,
+        'partName': null,
+        'updateUserName': null,
+        'repairFormVO': null,
+        'repairCheckVO': null
+      }
+    }
+  },
+  created () {
+    // 下拉框map
+    this.sourceMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_SOURCE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_LEVEL)
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_STATUS)
+    this.statusRepairMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_FORM_STATUS)
+    this.statusCheckMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_CHECK_STATUS)
+    this.needStopMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
+    this.repairProjectMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_PROJECT_TYPE)
+    this.repairTechnologyMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_TECHNOLOGY_TYPE)
+    this.descripitionMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIRE_ACTION)
+    this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_FEE_TYPE)
+    this.outTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_OUT_TYPE)
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      this.modalTitle = '详情'
+      this.model = record
+      this.activeKey = 'a'
+      this.dispatchList = JSON.parse(record.repairDispatchList)
+      this.init()
+    },
+    init () {
+      queryRepairFee({ repairId: this.model.id }).then(res => {
+        this.dataFee = res.data
+      })
+      queryRepairReason({ repairId: this.model.id }).then(res => {
+        this.dataReason = res.data
+      })
+    },
+    handleCancel () {
+      this.visible = false
+      this.confirmLoading = false
+      this.$emit('ok')
+    },
+    receive () {
+      this.model.status = 3
+      receive(this.model).then(() => {
+        // const modal = this.$refs.finishForm
+        // modal.base(that.model)
+      })
+    },
+    batchDeleteFee (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]
+      }
+      deleteRepairFees(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+      })
+    },
+    handleAddFee () {
+      const modal = this.$refs.feeForm
+      modal.base(null, this.model)
+    },
+    handleEditFee (record) {
+      fetchRepairFee({ id: record.id }).then(res => {
+        const modal = this.$refs.feeForm
+        const data = res.data
+        data.repairNo = this.model.no
+        modal.base(data, this.model)
+      })
+    },
+    handleViewFee (record) {
+      fetchRepairFee({ id: record.id }).then(res => {
+        const modal = this.$refs.feeDetail
+        modal.base(res.data)
+      })
+    },
+    batchDeleteReason (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]
+      }
+      deleteRepairReasons(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+        this.$refs.table.clearSelected()
+      })
+    },
+    handleAddReason () {
+      const modal = this.$refs.reasonForm
+      this.visible = false
+      modal.base(null, this.model)
+    },
+    handleEditReason (record) {
+      fetchRepairReason({ id: record.id }).then(res => {
+        const modal = this.$refs.reasonForm
+        this.visible = false
+        modal.base(res.data, this.model)
+      })
+    },
+    handleViewReason (record) {
+      fetchRepairReason({ id: record.id }).then(res => {
+        const modal = this.$refs.reasonDetail
+        modal.base(res.data)
+      })
+    },
+    handleOk () {
+      this.loading = true
+      fetchRepairApplicationForm({ id: this.model.id }).then(res => {
+        this.loading = false
+        this.model = res.data
+        this.visible = true
+        this.dispatchList = JSON.parse(this.model.repairDispatchList)
+      })
+      this.init()
+    },
+    handleEdit () {
+      const modal = this.$refs.finishForm
+      modal.base(this.model)
+    },
+    handleFinish () {
+      const modal = this.$refs.finishForm
+      modal.base(this.model)
+    },
+    batchDelete (id) {
+      let ids = []
+      if (this.BaseTool.String.isBlank(id)) {
+        if (length === 0) {
+          this.$message.info('请选择要删除的记录')
+          return
+        }
+        ids = this.selectedRows.map(item => item.id)
+      } else {
+        ids = [id]
+      }
+      deleteRepairProjectRelations(ids).then(res => {
+        this.$message.info('删除成功')
+        this.handleOk()
+      })
+    },
+    onSelectChange (selectedRowKeys) {
+      console.log('selectedRowKeys changed: ', selectedRowKeys)
+      this.selectedRowKeys = selectedRowKeys
+    }
+  }
+}
+</script>

+ 250 - 0
src/views/repair/application-form/modules/FinishOutForm.vue

@@ -0,0 +1,250 @@
+<template>
+  <a-modal
+    :title="modalTitle"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    class="ant-modal2"
+    @cancel="handleCancel"
+  >
+    <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
+              disabled="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-select v-decorator="['outType']" placeholder="请选择">
+              <a-select-option
+                v-for="(label,value) in outTypeMap"
+                :key="value"
+                :label="label"
+                :value="parseInt(value)">{{ label }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </row-item>
+      </row-list>
+      <row-list :col="1">
+        <row-item>
+          <a-form-item
+            label="故障描述"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-textarea v-decorator="['content', {rules: [{required: true, message: '故障描述不能为空'}]}]"/>
+          </a-form-item>
+        </row-item>
+      </row-list>
+      <row-list :col="1">
+        <row-item>
+          <a-form-item
+            label="维修描述"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-textarea v-decorator="['repairContent', {rules: [{required: true, message: '维修描述不能为空'}]}]"/>
+          </a-form-item>
+        </row-item>
+        <row-item>
+          <a-form-item
+            label="维修图片"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-upload
+              :action="uploadUrl"
+              :multiple="true"
+              list-type="picture"
+              :file-list="defaultRepairFileList"
+              @change="handleRepairFileChange"
+              accept="image/*"
+              :headers="headers"
+            >
+              <a-button> <a-icon type="upload" /> 上传图片 </a-button>
+            </a-upload>
+          </a-form-item>
+        </row-item>
+      </row-list>
+    </a-form>
+    <spare-part-used-select-modal ref="sparePartUsedSelectModal" />
+    <template slot="footer">
+      <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+    </template>
+  </a-modal>
+</template>
+
+<script>
+import pick from 'lodash.pick'
+import { finish } from '@/api/repair/application-form'
+import { queryUser } from '@/api/upms/user'
+import { fetchErrorTypeTree } from '@/api/repair/errortype'
+import SparePartUsedSelectModal from '@/views/sqarepartmanage/sparepartused/modules/SparePartUsedSelectModal'
+import { uploadUrl } from '@/api/upms/file'
+
+export default {
+  name: 'BaseRepairApplicationForm',
+  data () {
+    return {
+      model: null,
+      confirmLoading: false,
+      modalTitle: null,
+      form: this.$form.createForm(this),
+      visible: false,
+      // 下拉框map
+      treeData: [],
+      descripitionMap: {},
+      sourceMap: {},
+      levelMap: {},
+      needStopMap: {},
+      statusMap: {},
+      uploadUrl: uploadUrl,
+      defaultRepairFileList: [],
+      repairFileList: [], // 维修图片,
+      userList: []
+    }
+  },
+  components: {
+    SparePartUsedSelectModal
+  },
+  props: {
+  },
+  created () {
+    // 下拉框map
+    this.sourceMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_SOURCE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_LEVEL)
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_STATUS)
+    this.needStopMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
+    this.descripitionMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIRE_ACTION)
+  },
+  methods: {
+    base (record) {
+      this.setTree()
+      this.visible = true
+      this.model = record
+      // 如果是空标识添加
+      if (this.BaseTool.Object.isBlank(record)) {
+        this.modalTitle = '添加'
+        return
+      }
+      this.modalTitle = '编辑'
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign(pick(record, [
+          'id',
+          'no',
+          'outType',
+          'content'
+        ])))
+      })
+    },
+    getUsers () {
+      queryUser({ status: 1 }).then(res => {
+        this.userList = res.data
+      })
+    },
+    handleApplicationFileChange (info) {
+      this.defaultRepairFileList = info.fileList
+      this.repairFileList = this.setFileList(info, 12)
+    },
+    setFileList (info, type) {
+      const file = info.file
+      const fileList = info.fileList
+      if (file.status === 'done') {
+        return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
+      } else if (file.status === 'removed') {
+        return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
+      } else if (file.status === 'error') {
+        this.$message.error('上传失败')
+        return []
+      }
+    },
+    save () {
+      const { form: { validateFieldsAndScroll } } = this
+      this.confirmLoading = true
+      validateFieldsAndScroll((errors, values) => {
+        if (errors) {
+          this.confirmLoading = false
+          return
+        }
+        // 日期处理
+        values.repairFileList = this.repairFileList
+        finish(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')
+      }
+    },
+    handleSbSelect () {
+      this.$refs.sbInfoSelectModal.base({}, { filter: 0, status: 2 })
+    },
+    handleSbSelectd (keys, rows) {
+      const [ key ] = keys
+      const [ row ] = rows
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'sbId': key,
+          'sbName': row.name
+        }))
+      })
+    },
+    handlePartSelect () {
+      const sbId = this.form.getFieldValue('sbId')
+      this.$refs.partInfoSelectModal.base({ sbId })
+    },
+    handlePartSelected (keys, rows) {
+      const [ key ] = keys
+      const [ row ] = rows
+      const { form: { setFieldsValue } } = this
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'partId': key,
+          'partName': row.name
+        }))
+      })
+    },
+    /**
+     * 设置类别树
+     */
+    setTree (record = {}) {
+      fetchErrorTypeTree({ id: record.id }).then(res => {
+        this.treeData = res.data
+      })
+    },
+    handleAddPartUsed () {
+      /* const modal = this.$refs.repairFeeModal
+      modal.base(null, record) */
+      this.$refs.sparePartUsedSelectModal.base(this.model, { sbId: this.model.sbId, modelId: this.model.modelId })
+    }
+
+  }
+}
+</script>