hfxc226 3 years ago
parent
commit
ba36f2e06c

+ 2 - 2
public/hitch-screen/static/index.css

@@ -3,8 +3,8 @@ body{padding:0px;margin:0px;width:1920px;height:1080px;}
 .data{float:right;width:586px;height:1080px;background:url("right.png") no-repeat;}
 .data>div:nth-child(1){margin-top:240px;width:100%;font-size:40px;color:#ffffff;text-align:center;}
 .data>div:nth-child(2){margin-top:30px;width:100%;font-size:16px;color:#ffffff;text-align:center;}
-.data>div:nth-child(2)>span:nth-child(1){padding-left:22px;background:url("red.png") no-repeat 5px 5px;}
-.data>div:nth-child(2)>span:nth-child(2){padding-left:22px;background:url("green.png") no-repeat 5px 5px;}
+/*.data>div:nth-child(2)>span:nth-child(1){padding-left:22px;background:url("red.png") no-repeat 5px 5px;}
+.data>div:nth-child(2)>span:nth-child(2){padding-left:22px;background:url("green.png") no-repeat 5px 5px;}*/
 .data>div:nth-child(3){margin-top:70px;color:#ffffff;}
 .data .item{float:left;clear:both;padding-left:50px;margin-bottom: 10px;}
 .data .item>span{float:left;line-height:30px;text-align:center;}

+ 35 - 0
src/api/report/repair-fee.js

@@ -0,0 +1,35 @@
+import { axios } from '@/utils/request'
+import { stringify } from 'qs'
+
+/**
+ * page func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getMonthReportFee (parameter) {
+  return axios({
+    url: '/report/repair/fee?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * export file
+ * parameter: { }
+ * @param parameter :
+  * @returns {*}
+ */
+export function exportMonthReportFee (parameter) {
+  return axios({
+    url: '/report/repair/fee/export?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    responseType: 'blob'
+  })
+}

+ 3 - 1
src/router/generator-platform-routers.js

@@ -117,6 +117,7 @@ const constantRouterComponents = {
   'PollingCheckProject': () => import('@/views/check/checkproject/PollingCheckProject'),
   'PollingCheckPlan': () => import('@/views/check/checkplan/PollingCheckPlan'),
   'PollingCheckJob': () => import('@/views/check/checkjob/PollingCheckJob'),
+  'PollingCheckJobOverTime': () => import('@/views/check/checkjob/PollingCheckJobOverTime'),
   'PollingCheckJobFinish': () => import('@/views/check/checkjob/PollingCheckJobFinish'),
   // 润滑
   'RunCheckStandard': () => import('@/views/check/checkstandard/RunCheckStandard'),
@@ -324,7 +325,8 @@ const constantRouterComponents = {
   'CheckJobReportWeek': () => import('@/views/dashboard/CheckJobReportWeek'), // 保养任务周工作负荷统计报表
   'RepairReport': () => import('@/views/dashboard/RepairReport'), // >24小时停机次数按月统计
   'RepairReportSbAll': () => import('@/views/dashboard/RepairReportSbAll'), // 设备故障次数按月统计
-  'RepairReportMttr': () => import('@/views/dashboard/RepairReportMttr')// MTTR月统计报表
+  'RepairReportMttr': () => import('@/views/dashboard/RepairReportMttr'), // MTTR月统计报表
+  'RepairReportFee': () => import('@/views/dashboard/RepairReportFee') // 费用按月统计
 }
 
 // 前端未找到页面路由(固定不用改)

+ 2 - 4
src/utils/dict.js

@@ -852,8 +852,7 @@ DictCache.VALUE = {
   CHECK_JOB_STATUS: {
     NOT_EXECUTE: 1, // 未执行
     EXECUTING: 2, // 执行中
-    FINISHED: 3, // 已完成
-    OUT_OF_DATE: 4// 已过期
+    FINISHED: 3 // 已完成
   },
 
   /**
@@ -896,8 +895,7 @@ DictCache.VALUE = {
   MAINTAIN_JOB_STATUS: {
     NOT_EXECUTE: 1, // 未执行
     EXECUTING: 2, // 执行中
-    FINISHED: 3, // 已完成
-    OUT_OF_DATE: 4// 已过期
+    FINISHED: 3 // 已完成
   },
   /**
    * 点巡检任务设备状态

+ 16 - 1
src/views/check/checkjob/CheckJob.vue

@@ -217,10 +217,14 @@ export default {
       type: Number,
       default: null
     },
+    receiveOvertime: {
+      type: Boolean,
+      default: null
+    },
     statusList: {
       type: Array,
       default: () => {
-        return [DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING, DictCache.VALUE.CHECK_JOB_STATUS.OUT_OF_DATE]
+        return [DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING]
       }
     }
   },
@@ -235,6 +239,7 @@ export default {
         searchEndTime: null,
         filter: this.filter,
         status: this.status,
+        receiveOvertime: this.receiveOvertime,
         statusList: this.statusList
       },
       treeData: [],
@@ -355,6 +360,16 @@ export default {
             return (text == null ? '暂无' : this.BaseTool.Date.formatter(text, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN))
           }
         },
+        {
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
+        },
         {
           title: '任务状态',
           dataIndex: 'status',

+ 17 - 0
src/views/check/checkjob/PollingCheckJobOverTime.vue

@@ -0,0 +1,17 @@
+<template>
+  <CheckJob :check-type="2" :receive-overtime="true"/>
+</template>
+
+<script>
+import CheckJob from './CheckJob'
+export default {
+  name: 'PollingCheckJobOverTime',
+  components: {
+    CheckJob
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 8 - 2
src/views/check/checkjob/modules/CheckJobSelectModal.vue

@@ -148,8 +148,14 @@ export default {
           }
         },
         {
-          title: '创建人名称',
-          dataIndex: 'createdUserName'
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
         },
         {
           title: '创建时间',

+ 10 - 0
src/views/check/checkjob/modules/CheckJobTable.vue

@@ -224,6 +224,16 @@ export default {
           dataIndex: 'actualEndTime',
           width: '200px'
         },
+        {
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
+        },
         {
           title: '任务状态',
           dataIndex: 'status',

+ 8 - 2
src/views/check/checkjob/modules/CheckJobTableWaitDo.vue

@@ -229,8 +229,14 @@ export default {
         //  scopedSlots: { customRender: 'stopFlag' }
         //},
         {
-          title: '创建人名称',
-          dataIndex: 'createdUserName'
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
         },
         {
           title: '创建时间',

+ 7 - 6
src/views/check/checkjob/modules/Detail.vue

@@ -10,11 +10,11 @@
   >
     <a-row :gutter="48">
       <a-col :md="48" :sm="48">
-          <span class="table-page-search-submitButtons" style="float: right">
-            <a-button style="margin-left: 16px"  v-if="model.status === DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE" type="default" @click="handleExecute()">接收</a-button>
-            <a-button style="margin-left: 16px"  v-if="model.status === DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING" type="default" @click="handleFinish()">完成</a-button>
-            <a-button style="margin-left: 8px" type="primary" @click="handleCancel()">返回</a-button>
-          </span>
+        <span class="table-page-search-submitButtons" style="float: right">
+          <a-button style="margin-left: 16px" v-if="model.status === DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE" type="default" @click="handleExecute()">接收</a-button>
+          <a-button style="margin-left: 16px" v-if="model.status === DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING" type="default" @click="handleFinish()">完成</a-button>
+          <a-button style="margin-left: 8px" type="primary" @click="handleCancel()">返回</a-button>
+        </span>
       </a-col>
     </a-row>
     <title-divider title="标准信息" width="90px"></title-divider>
@@ -66,6 +66,7 @@
       <detail-list-item term="实际结束时间">{{ model.actualEndTime }}</detail-list-item>
       <!--<detail-list-item term="计划性维修"><badge :status="DictCache.COLOR.YES_NO[model.sbStatus]" :text="sbStatusMap[model.sbStatus]" /></detail-list-item>-->
       <detail-list-item term="任务状态"><badge :status="DictCache.COLOR.CHECK_JOB_STATUS[model.status]" :text="statusMap[model.status]" /></detail-list-item>
+      <detail-list-item term="是否延期">{{ (model.receiveOvertime === null || model.receiveOvertime === 0) ? '否' : '是' }}</detail-list-item>
     </detail-list>
     <detail-list title="" :col="1">
       <detail-list-item term="检查结果">{{ model.feedback }}</detail-list-item>
@@ -210,4 +211,4 @@ export default {
   margin: 5px;
   display: inline-block;
 }
-</style>
+</style>

+ 12 - 2
src/views/check/checkjob/modules/DetailSbCheckJob.vue

@@ -206,6 +206,16 @@ export default {
           dataIndex: 'actualEndTime',
           width: '200px'
         },
+        {
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
+        },
         {
           title: '任务状态',
           dataIndex: 'status',
@@ -240,12 +250,12 @@ export default {
       this.visible = true
       this.model = record
       this.modalTitle = '详情2'
-      queryCheckJob({ sbId: record.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING, this.DictCache.VALUE.CHECK_JOB_STATUS.OUT_OF_DATE].join(',') }).then(res => {
+      queryCheckJob({ sbId: record.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING].join(',') }).then(res => {
         this.data = res.data
       })
     },
     handleOk () {
-      queryCheckJob({ sbId: this.model.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING, this.DictCache.VALUE.CHECK_JOB_STATUS.OUT_OF_DATE].join(',') }).then(res => {
+      queryCheckJob({ sbId: this.model.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING].join(',') }).then(res => {
         this.data = res.data
       })
     },

+ 12 - 2
src/views/check/checkjob/modules/DetailStandardCheckJob.vue

@@ -194,6 +194,16 @@ export default {
           dataIndex: 'actualEndTime',
           width: '200px'
         },
+        {
+          title: '是否延期',
+          dataIndex: 'receiveOvertime',
+          checked: true,
+          fixed: 'right',
+          width: '100px',
+          customRender: (text, record, index) => {
+            return ((text === null || text === 0) ? '否' : '是')
+          }
+        },
         {
           title: '任务状态',
           dataIndex: 'status',
@@ -228,12 +238,12 @@ export default {
       this.visible = true
       this.model = record
       this.modalTitle = '保养记录'
-      queryCheckJob({ standardId: record.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING, this.DictCache.VALUE.CHECK_JOB_STATUS.OUT_OF_DATE].join(',') }).then(res => {
+      queryCheckJob({ standardId: record.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING].join(',') }).then(res => {
         this.data = res.data
       })
     },
     handleOk () {
-      queryCheckJob({ standardId: this.model.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING, this.DictCache.VALUE.CHECK_JOB_STATUS.OUT_OF_DATE].join(',') }).then(res => {
+      queryCheckJob({ standardId: this.model.id, type: this.checkType, statusList: [this.DictCache.VALUE.CHECK_JOB_STATUS.NOT_EXECUTE, this.DictCache.VALUE.CHECK_JOB_STATUS.EXECUTING].join(',') }).then(res => {
         this.data = res.data
       })
     },

+ 2 - 2
src/views/check/checkstandard/CheckStandard.vue

@@ -40,10 +40,10 @@
           <a-icon type="upload"/>
           新增导入
         </a-button>
-        <a-button style="margin-left:8px;" type="primary" @click="doImportOldVersion">
+<!--        <a-button style="margin-left:8px;" type="primary" @click="doImportOldVersion">
           <a-icon type="upload"/>
           老版本导入
-        </a-button>
+        </a-button>-->
         <a-button style="margin-left:8px;" type="primary" @click="doImportByUpdate">
           <a-icon type="upload"/>
           修改导入

+ 257 - 0
src/views/dashboard/RepairReportFee.vue

@@ -0,0 +1,257 @@
+<template>
+  <div class="page-header-index-wide">
+    <a-card :title="title" :loading="loading" v-show="visible" :bordered="false" :body-style="{padding: '0'}">
+      <div class="salesCard">
+        <a-tabs default-active-key="1" size="large" :tab-bar-style="{marginBottom: '24px', paddingLeft: '16px'}">
+          <div class="extra-wrapper" slot="tabBarExtraContent">
+
+            <!--            <a-select style="margin-left: 8px" @change="changeYear" v-model="queryParam.year" placeholder="请选择">
+              <a-select-option
+                v-for="item in years"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">{{ item.label }}
+              </a-select-option>
+            </a-select>-->
+            <a-month-picker style="margin-left: 8px" v-model="queryParam.startMonth" placeholder="开始月份" @change="onStartChange" />
+            <a-month-picker style="margin-left: 8px" v-model="queryParam.endMonth" placeholder="结束月份" @change="onEndChange" />
+            <a-button style="margin-left: 8px" type="default" @click="getData()">查询</a-button>
+            <a-button style="margin-left: 8px" type="primary" icon="printer" @click="handlePrint()">打印</a-button>
+            <a-button style="margin-left: 8px" type="primary" @click="doExport()">导出</a-button>
+          </div>
+          <a-tab-pane loading="true" tab="图形统计" key="1">
+            <a-row>
+              <a-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+                <div style="padding: 10px">
+                  <div id="container"></div>
+                </div>
+              </a-col>
+            </a-row>
+          </a-tab-pane>
+          <a-tab-pane loading="true" tab="表格统计" key="2">
+            <a-row>
+              <a-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+                <div style="padding: 10px">
+                  <a-table
+                    bordered
+                    :data-source="chartsData"
+                    :columns="columns"
+                    tableLayout="auto"
+                    :scroll="{x: 1000, y: BaseTool.Constant.scrollY }"
+                    rowKey="month">
+                    <span slot="action" slot-scope="record">
+                      <template>
+                        <a @click="handleView(record)">查看明细</a>
+                      </template>
+                    </span>
+                  </a-table>
+                </div>
+              </a-col>
+            </a-row>
+          </a-tab-pane>
+        </a-tabs>
+      </div>
+    </a-card>
+    <print-in-repair-report-fee ref="basePrintModal" @ok="handleOk"/>
+    <detail-repair-report-fee ref="detailModal" @ok="handleOk"/>
+  </div>
+</template>
+
+<script>
+import { getMonthReportFee, exportMonthReportFee } from '@/api/report/repair-fee'
+import { Chart } from '@antv/g2'
+import PrintInRepairReportFee from '@/views/dashboard/modules/PrintInRepairReportFee'
+import DetailRepairReportFee from '@/views/dashboard/modules/DetailRepairReportFee'
+
+export default {
+  name: 'RepairReportFee',
+  components: {
+    PrintInRepairReportFee,
+    Chart,
+    DetailRepairReportFee
+  },
+  props: {
+    title: {
+      type: String,
+      default: '费用月统计报表'
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      serverData: [],
+      queryParam: {
+      },
+      years: [],
+      visible: true,
+      chart: null, // 创建一个chart变量
+      chartsData: [],
+      // 表头
+      columns: [
+        {
+          title: '月份',
+          width: 180,
+          dataIndex: 'month'
+        },
+        {
+          title: '月费用次数',
+          width: 120,
+          dataIndex: 'num'
+        },
+        {
+          title: '总费用',
+          width: 120,
+          dataIndex: 'totalFee'
+        },
+        {
+          title: '平均费用',
+          width: 120,
+          dataIndex: 'meanFee'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ]
+    }
+  },
+  created () {
+    // this.initSelectYear()
+  },
+  mounted () {
+    // this.changeYear(this.queryParam.year)
+  },
+  methods: {
+    initSelectYear () {
+      const myDate = new Date()
+      // this.queryParam.year = myDate.getFullYear()// 获取当前年
+      this.queryParam.startMonth = myDate.getFullYear() + '-01-01'
+      this.queryParam.endMonth = myDate.getFullYear() + '-12-01'
+      this.years = []
+      for (let i = 0; i < 5; i++) {
+        this.years.push({ value: (this.queryParam.year - i), label: (this.queryParam.year - i) + '年' })
+      }
+    },
+    changeYear (value) {
+      this.queryParam.year = value
+      this.getData()
+    },
+    onStartChange (date, dateString) {
+      this.$nextTick(() => {
+        this.queryParam.startMonth = this.BaseTool.Date.formatter(dateString + '-01', this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+      })
+    },
+    onEndChange (date, dateString) {
+      this.queryParam.endMonth = this.BaseTool.Date.formatter(dateString + '-01', this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+    },
+    getData () {
+      if (this.queryParam.startMonth == null) {
+        this.$message.error('请选择起始月份')
+        return
+      }
+      if (this.queryParam.endMonth == null) {
+        this.$message.error('请选择结束月份')
+        return
+      }
+      getMonthReportFee(this.queryParam)
+        .then(res => {
+          this.chartsData = res.data
+          this.getCharts('container', this.chartsData)// 调用统计图
+        })
+    },
+    getCharts (id, data) {
+      this.chart && this.chart.destroy()// 防止点击搜索按钮新增一个
+      this.chart = new Chart({
+        container: 'container',
+        autoFit: true,
+        height: 400
+      })
+      this.chart.data(data)
+      this.chart.scale('总费用', {
+        nice: true
+      })
+      this.chart.tooltip({
+        showMarkers: true,
+        shared: true
+      })
+      this.chart.interval().position('month*totalFee')
+      this.chart.interaction('active-region')
+      this.chart.legend({
+        position: 'bottom'
+      })
+      this.chart.option('scrollbar', {
+        type: 'horizontal'
+      })
+      this.chart.render()
+    },
+    doExport () {
+      const parameter = {
+        ...this.queryParam
+      }
+      exportMonthReportFee(parameter).then(file => {
+        this.BaseTool.UPLOAD.downLoadExportExcel(file)
+      })
+    },
+    handlePrint (record) {
+      const modal = this.$refs.basePrintModal
+      this.visible = false
+      modal.base({ startMonth: this.queryParam.startMonth, endMonth: this.queryParam.endMonth, title: this.title, data: this.chartsData })
+    },
+    handleView (record) {
+      const modal = this.$refs.detailModal
+      modal.base(record)
+    },
+    handleOk () {
+      this.visible = true
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .extra-wrapper {
+    line-height: 55px;
+    padding-right: 24px;
+
+    .extra-item {
+      display: inline-block;
+      margin-right: 24px;
+
+      a {
+        margin-left: 24px;
+      }
+    }
+  }
+
+  .antd-pro-pages-dashboard-analysis-twoColLayout {
+    position: relative;
+    display: flex;
+    display: block;
+    flex-flow: row wrap;
+  }
+
+  .antd-pro-pages-dashboard-analysis-salesCard {
+    height: calc(100% - 24px);
+    /deep/ .ant-card-head {
+      position: relative;
+    }
+  }
+
+  .dashboard-analysis-iconGroup {
+    i {
+      margin-left: 16px;
+      color: rgba(0,0,0,.45);
+      cursor: pointer;
+      transition: color .32s;
+      color: black;
+    }
+  }
+  .analysis-salesTypeRadio {
+    position: absolute;
+    right: 54px;
+    bottom: 12px;
+  }
+</style>

+ 188 - 0
src/views/dashboard/modules/DetailRepairReportFee.vue

@@ -0,0 +1,188 @@
+<template>
+  <a-modal
+    :title="modalTitle"
+    :width="1200"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @cancel="handleCancel"
+  >
+    <title-divider title="明细列表" width="90px"></title-divider>
+    <a-table
+      bordered
+      :data-source="data"
+      :columns="columns"
+      :scroll="{x: 1000, y: BaseTool.Constant.scrollY}"
+      tableLayout="auto"
+      rowKey="id"
+    >
+      <span slot="action" slot-scope="record">
+        <template>
+          <a @click="handleView(record)">查看</a>
+        </template>
+      </span>
+      <span slot="status" slot-scope="text">
+        <badge :text="BaseTool.Object.getField(statusMap,text)" :status="DictCache.COLOR.REPAIR_APPLICATION_FORM_STATUS[text]"/>
+      </span>
+    </a-table>
+    <template slot="footer">
+      <a-button :loading="confirmLoading" type="primary" @click="handleCancel()">返回</a-button>
+    </template>
+  </a-modal>
+</template>
+
+<script>
+import DetailList from '@/components/tools/DetailList'
+const DetailListItem = DetailList.Item
+
+export default {
+  name: 'DetailRepairReportFee',
+  components: {
+    DetailList,
+    DetailListItem
+  },
+  data () {
+    return {
+      confirmLoading: false,
+      mdl: {},
+      modalTitle: null,
+      visible: false,
+      // 下拉框map
+      typeMap: {},
+      moneyTypeMap: {},
+      model: {},
+      // 查询参数
+      queryParam: {
+        filter: this.filter,
+        searchType: this.searchType
+      },
+      // 表头
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          checked: true,
+          width: '100px',
+          customRender: (text, record, index) => {
+            return `${index + 1}`
+          }
+        },
+        {
+          title: '设备编号',
+          checked: true,
+          width: '100px',
+          dataIndex: 'sbNo'
+        },
+        {
+          title: '设备名称',
+          checked: true,
+          width: '150px',
+          dataIndex: 'sbName'
+        },
+        {
+          title: '维修单号',
+          checked: true,
+          width: '150px',
+          dataIndex: 'repairNo'
+        },
+        {
+          title: '费用单号',
+          checked: true,
+          width: '150px',
+          dataIndex: 'no'
+        },
+        {
+          title: '费用金额',
+          dataIndex: 'fee',
+          checked: true,
+          width: '150px',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Amount.formatter(text)
+          }
+        },
+        {
+          title: '费用日期',
+          checked: true,
+          width: '150px',
+          dataIndex: 'feeDate'
+        },
+        {
+          title: '货币单位',
+          dataIndex: 'moneyType',
+          checked: true,
+          width: '150px',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.moneyTypeMap, text)
+          }
+        },
+        {
+          title: '费用类别',
+          dataIndex: 'type',
+          checked: true,
+          width: '150px',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.typeMap, text)
+          }
+        },
+        {
+          title: '费用原因',
+          checked: true,
+          width: '150px',
+          dataIndex: 'reason'
+        },
+        {
+          title: '费用描述',
+          checked: true,
+          width: '150px',
+          dataIndex: 'descripition'
+        },
+        {
+          title: '备注',
+          checked: true,
+          width: '150px',
+          dataIndex: 'remark'
+        },
+        {
+          title: '创建日期',
+          checked: true,
+          width: '200px',
+          dataIndex: 'createdTime'
+        },
+        {
+          title: '操作',
+          key: 'action',
+          width: '200px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 下拉框map
+      sourceMap: {},
+      levelMap: {},
+      needStopMap: {},
+      planFlagMap: {},
+      data: []
+    }
+  },
+  created () {
+    // 下拉框map
+    this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_FEE_TYPE)
+    this.moneyTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.MONEY_TYPE)
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      this.modalTitle = '详情'
+      this.model = record
+      this.data = record.detailList
+    },
+    handleCancel () {
+      this.visible = false
+      this.confirmLoading = false
+    },
+    handleView (record) {
+
+    }
+  }
+}
+</script>

+ 228 - 0
src/views/dashboard/modules/PrintInRepairReportFee.vue

@@ -0,0 +1,228 @@
+<template>
+  <div class="print-content" v-show="visible">
+    <a-row :gutter="48" slot="extra">
+      <a-col :md="48" :sm="48">
+        <span class="table-page-search-submitButtons" style="float: right">
+          <a-button type="primary" v-print="'#print-container2'" :disabled="disabled">打印</a-button>
+          <a-button style="margin-left: 8px" @click="handleCancel()">返回列表</a-button>
+        </span>
+      </a-col>
+    </a-row>
+    <div class="container" id="print-container2">
+      <div class="text-center" style="position:relative;font-size:20px;font-weight:bold">
+        Hitachi</br> {{ record.title }}
+      </div>
+      <div>
+        <div class="col-md-4 text-center" style="padding: 0">统计周期: {{ record.startMonth }} 至 {{ record.endMonth }}</div>
+      </div>
+      <table class="gridtable list">
+        <tbody>
+          <tr>
+            <td class="text-center">月份</td>
+            <td class="text-center">月费用次数</td>
+            <td class="text-center">总费用</td>
+            <td class="text-center">平均费用</td>
+          </tr>
+          <tr :key="index" v-for="(item,index) in items">
+            <td class="text-center">{{ item.month}}</td>
+            <td class="text-center">{{ item.num }}</td>
+            <td class="text-center">{{ item.totalFee }}</td>
+            <td class="text-center">{{ item.meanFee }}</td>
+          </tr>
+        </tbody>
+      </table>
+      <div class="row">
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { formatDate } from '@/utils/util'
+
+export default {
+  name: 'PrintRepairReportFee',
+  components: { },
+  data () {
+    return {
+      visible: false,
+      disabled: true,
+      record: {},
+      count: 0,
+      items: [],
+      user: this.$store.getters.userInfo
+      // 下拉框map
+    }
+  },
+  props: {},
+  created () {
+    // 下拉框map
+  },
+  computed: {
+  },
+  methods: {
+    base (record) {
+      this.disabled = true
+      this.visible = true
+      this.record = record
+      this.items = record.data
+      this.disabled = false
+    },
+    formatDateEn (value) {
+      return formatDate(new Date(value), 'yyyy-MM-dd')
+    },
+    handleCancel (values) {
+      this.visible = false
+      this.$emit('ok', values)
+    }
+  }
+}
+</script>
+<style media=print>
+/* 应用这个样式的在打印时隐藏 */
+.noPrint {
+  display: none;
+}
+
+/* 应用这个样式的,从那个标签结束开始另算一页,之后在遇到再起一页,以此类推 */
+.page {
+  page-break-after: always;
+}
+</style>
+<style>
+.print-content{
+  width: 1123px;
+  background-color: #fff;
+}
+
+#print-container2 * {
+  font-family: SimHei !important;
+  color: #333447;
+  line-height: 1.5;
+}
+
+.container {
+  width: 95%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+table.gridtable {
+  width: 100%;
+  font-family: verdana, arial, sans-serif;
+  font-size: 11px;
+  color: #333333;
+  border-width: 1px;
+  border-color: #666666;
+  border-collapse: collapse;
+}
+
+table.gridtable th {
+  border-width: 1px;
+  padding: 8px;
+  border-style: solid;
+  border-color: #666666;
+  background-color: #dedede;
+}
+
+table.gridtable td {
+  border-width: 1px;
+  padding: 8px;
+  border-style: solid;
+  border-color: #666666;
+  background-color: #ffffff;
+}
+
+table.content td {
+  height: 95px;
+}
+
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+.container:before,
+.container:after,
+.row:before, .row:after {
+  display: table;
+  content: " ";
+}
+
+.container:after, .row:after {
+  clear: both;
+}
+
+.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+  float: left;
+}
+
+.col-md-12 {
+  width: 100%;
+}
+
+.col-md-11 {
+  width: 91.66666667%;
+}
+
+.col-md-10 {
+  width: 83.33333333%;
+}
+
+.col-md-9 {
+  width: 75%;
+}
+
+.col-md-8 {
+  width: 66.66666667%;
+}
+
+.col-md-7 {
+  width: 58.33333333%;
+}
+
+.col-md-6 {
+  width: 50%;
+}
+
+.col-md-5 {
+  width: 41.66666667%;
+}
+
+.col-md-4 {
+  width: 33.33333333%;
+}
+
+.col-md-3 {
+  width: 25%;
+}
+
+.col-md-2 {
+  width: 16.66666667%;
+}
+
+.col-md-1 {
+  width: 8.33333333%;
+}
+</style>

+ 2 - 2
src/views/upms/user/User.vue

@@ -175,13 +175,13 @@ export default {
           dataIndex: 'lastLoginTime',
           sorter: true
         }, */
-        {
+/*        {
           title: '身份',
           dataIndex: 'identityType',
           customRender: (text, record, index) => {
             return this.BaseTool.Object.getField(this.identityTypeMap, text)
           }
-        },
+        },*/
         /*{
           title: '职务',
           dataIndex: 'jobType',

+ 4 - 4
src/views/upms/user/modules/BaseForm.vue

@@ -48,7 +48,7 @@
       >
         <a-input v-decorator="['email']"/>
       </a-form-item>
-      <a-form-item
+<!--      <a-form-item
         label="身份"
         :labelCol="labelCol"
         :wrapperCol="wrapperCol"
@@ -66,7 +66,7 @@
             :value="parseInt(value)">{{ label }}
           </a-select-option>
         </a-select>
-      </a-form-item>
+      </a-form-item>-->
 <!--      <a-form-item
         label="职务"
         :labelCol="labelCol"
@@ -144,13 +144,13 @@
       <!--          v-decorator="['exchangeRate', {rules: [{required: true, message: '汇率不能为空'}]}]"/>-->
       <!--      </a-form-item>-->
 
-      <a-form-item
+<!--      <a-form-item
         label="地址"
         :labelCol="labelCol"
         :wrapperCol="wrapperCol"
       >
         <a-input v-decorator="['addressDetail']"/>
-      </a-form-item>
+      </a-form-item>-->
       <a-form-item
         label="角色"
         :labelCol="labelCol"