Browse Source

财务项目工时管理功能

user5 2 years ago
parent
commit
33098e0b55

+ 53 - 0
src/api/cw/projectRecords/ManHourManagementService.js

@@ -0,0 +1,53 @@
+import request from '@/utils/httpRequest'
+
+export default class ManHourManagementService {
+  list (params) {
+    return request({
+      url: '/manHourManagement/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/manHourManagement/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatus (id) {
+    return request({
+      url: '/manHourManagement/updateStatus',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/manHourManagement/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/manHourManagement/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  getByClientId (id, projectForm) {
+    return request({
+      url: '/cwProjectRecords/getByClientId',
+      method: 'get',
+      params: {clientId: id, ...projectForm}
+    })
+  }
+  getByContractId (id, projectForm) {
+    return request({
+      url: '/cwProjectRecords/getByContractId',
+      method: 'get',
+      params: {contractId: id, ...projectForm}
+    })
+  }
+}

+ 181 - 0
src/views/modules/cw/projectRecords/ManHourManagementForm.vue

@@ -0,0 +1,181 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      label-width="135px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="120px" @submit.native.prevent>
+
+        <!--<el-divider content-position="left"><i class="el-icon-document"></i> 项目信息</el-divider>-->
+        <el-row  :gutter="0">
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="projectName"
+                          :rules="[
+                              {required: true, message:'项目名称不能为空', trigger:'blur'},
+                              {required: true, message:'项目名称不能为空', trigger:'change'}
+                   ]">
+              <el-input size="medium" :readonly="true" @focus="openContractForm()" v-model="inputForm.projectName" placeholder="请选择项目名称">
+                <el-button slot="append" icon="el-icon-search" @click="openContractForm()"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目编号" prop="projectNumber"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目经理" prop="projectMasterName"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectMasterName" placeholder="请填写项目经理" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目预计时间" prop="planDate"
+                          :rules="[
+                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
+                   ]">
+              <el-date-picker
+                style="width: 100%"
+                placement="bottom-start"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd"
+                v-model="inputForm.planDate"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                @change="forUpdate"
+                end-placeholder="结束日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+    <ProjectRecoredChooseCom  ref="projectRecoredChooseCom" @getProject="getContract"></ProjectRecoredChooseCom>
+  </div>
+</template>
+
+<script>
+  import ManHourManagementForm from '@/api/cw/projectRecords/ManHourManagementService'
+  import ProjectRecoredChooseCom from '../projectRecords/ProjectRecordsChooseCom'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          projectNumber: '',
+          planDate: [],
+          projectMasterName: ''
+        }
+      }
+    },
+    ManHourManagementForm: null,
+    created () {
+      this.manHourManagementForm = new ManHourManagementForm()
+    },
+
+    components: {
+      ProjectRecoredChooseCom
+    },
+    methods: {
+      forUpdate () {
+        this.$forceUpdate()
+      },
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          projectNumber: '',
+          planDate: [],
+          projectMasterName: ''
+        }
+        if (method === 'add') {
+          this.title = `新增项目计划时间`
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '修改项目计划时间'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '查看项目计划时间'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.manHourManagementForm.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.loading = false
+            })
+          }
+        })
+      },
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.contractId)) {
+          // this.$refs.projectInfoForm.init(this.inputForm.contractId)
+          this.$refs.projectRecoredChooseCom.init(this.inputForm.contractId)
+        } else {
+          this.$refs.projectRecoredChooseCom.init()
+        }
+      },
+      getContract (row) {
+        this.inputForm.projectName = row.projectName // 项目名称
+        this.inputForm.projectId = row.id // 项目id
+        this.inputForm.projectNumber = row.projectNumber // 项目编号
+        this.inputForm.projectMasterName = row.projectMasterName // 项目经理
+        this.clearClientList()
+        this.$forceUpdate()
+        this.inputForm.cwProjectInfoList = []
+      },
+      clearClientList () {
+        // 项目直接对接联系人列表清除
+        this.inputForm.clientList = []
+        this.$forceUpdate()
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.manHourManagementForm.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 292 - 0
src/views/modules/cw/projectRecords/ManHourManagementList.vue

@@ -0,0 +1,292 @@
+<template>
+  <div class="page">
+    <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input size="small" v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <!--<el-form-item label="项目编号" prop="projectNumber">
+        <el-input size="small" v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目经理" prop="projectMasterName">
+        <UserSelect :limit='1' :userName="searchForm.projectMasterName" @getValue='(value, label) => {searchForm.projectMasterName = label}'></UserSelect>
+      </el-form-item>-->
+      <!--<el-form-item label="开始时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="结束时间" prop="endDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.endDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>-->
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="bg-white top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" export custom>
+        <template #buttons>
+          <el-button type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :export-config="{
+                    remote: true,
+                    filename: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('manHourManagement:view')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('manHourManagement:view')"  @click="view(scope.row.id,)">{{scope.row.projectName}}</el-link>
+              <span v-else>{{scope.row.projectName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="计划开始时间" field="planStartDate"></vxe-column>
+          <vxe-column min-width="160" align="center" title="计划结束时间" field="planEndDate"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createDate"></vxe-column>
+          <vxe-column min-width="100" align="center" title="确认状态" field="statusStr"></vxe-column>
+          <vxe-column title="操作" width="200px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('manHourManagement:edit')&&scope.row.createBy.id === $store.state.user.id&&scope.row.status === '0'" type="text"  size="small" @click="edit(scope.row.id)">编辑</el-button>
+              <el-button v-if="hasPermission('manHourManagement:edit')&&scope.row.status === '0'" type="text"   size="small" @click="isReceivables(scope.row)">确认工时</el-button>
+              <el-button v-if="hasPermission('manHourManagement:del')&&scope.row.status === '0'" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ManHourManagementForm ref="manHourManagementForm" @refreshDataList="refreshList"></ManHourManagementForm>
+  </div>
+</template>
+
+<script>
+  import ManHourManagementService from '@/api/cw/projectRecords/ManHourManagementService'
+  import TaskService from '@/api/flowable/TaskService'
+  import ProcessService from '@/api/flowable/ProcessService'
+  import ManHourManagementForm from './ManHourManagementForm'
+  import UserService from '@/api/sys/UserService'
+  import UserSelect from '@/components/userSelect'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          endDates: []
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false
+      }
+    },
+    manHourManagementService: null,
+    taskService: null,
+    processService: null,
+    userService: null,
+    created () {
+      this.manHourManagementService = new ManHourManagementService()
+      this.taskService = new TaskService()
+      this.processService = new ProcessService()
+      this.userService = new UserService()
+    },
+    components: {
+      ManHourManagementForm,
+      UserSelect
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      user () {
+        this.createName = JSON.parse(localStorage.getItem('user')).name
+        return JSON.parse(localStorage.getItem('user'))
+      }
+    },
+    mounted () {
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.manHourManagementForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        this.$refs.manHourManagementForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.manHourManagementForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        this.userService.is().then(({data}) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.manHourManagementService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          // this.tableKey = Math.random()
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        this.processService.getByName('财务-项目登记').then(({data}) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      isReceivables (row) {
+        this.$confirm(`是否确认工时?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.manHourManagementService.updateStatus(row.id).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.manHourManagementService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectRecordsService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>