admin
2025-01-02 6556b9d47aafc42ff347b26e953f69891fd9075c
-工时统计报表
已添加3个文件
已修改1个文件
494 ■■■■■ 文件已修改
dema-framework/src/main/java/com/dema/framework/config/SecurityConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dema-main/src/main/java/com/dema/main/am/controller/AmWorkHourInfoReportController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dema-ui/src/api/main/am/workHourInfoReport.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dema-ui/src/views/main/am/reportForms/index.vue 438 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dema-framework/src/main/java/com/dema/framework/config/SecurityConfig.java
@@ -116,6 +116,7 @@
                    .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                    .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                    .antMatchers("/bs/projectInfo/**").permitAll()
                    .antMatchers("/am/workHourInfoReport/**").permitAll()
                    // é™¤ä¸Šé¢å¤–的所有请求全部需要鉴权认证
                    .anyRequest().authenticated();
            })
dema-main/src/main/java/com/dema/main/am/controller/AmWorkHourInfoReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.dema.main.am.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dema.common.core.controller.BaseController;
import com.dema.common.core.page.TableDataInfo;
import com.dema.main.am.domain.AmWorkHourInfo;
import com.dema.main.am.service.IAmWorkHourInfoService;
import com.dema.main.components.domain.UserRole;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/am/workHourInfoReport")
public class AmWorkHourInfoReportController extends BaseController {
    @Autowired
    private IAmWorkHourInfoService amWorkHourInfoService;
    /**
     * æŸ¥è¯¢å·¥æ—¶æ˜Žç»†åˆ—表
     */
    @GetMapping("/list")
    public TableDataInfo list(AmWorkHourInfo amWorkHourInfo)
    {
        QueryWrapper<AmWorkHourInfo> wrapper = new QueryWrapper<>();
        wrapper.select("project_code as projectCode,\n" +
                "\tdept_name as deptName,\n" +
                "\tnick_name as nickName,\n" +
                "\twork_type as workType,\n" +
                "\tproject_phase as projectPhase,\n" +
                "\tsum(work_time) as workTime ");
        wrapper.groupBy("dept_name,\n" +
                "\t  nick_name,\n" +
                "    work_type,\n" +
                "    project_code,\n" +
                "\t\tproject_phase");
        List<AmWorkHourInfo> list = amWorkHourInfoService.list(wrapper);
        return getDataTable(list);
    }
}
dema-ui/src/api/main/am/workHourInfoReport.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
import request from '@/utils/request'
// æŸ¥è¯¢å·¥æ—¶æ˜Žç»†åˆ—表
export function listWorkHourInfoReport(query) {
  return request({
    url: '/am/workHourInfoReport/list',
    method: 'get',
    params: query
  })
}
dema-ui/src/views/main/am/reportForms/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,438 @@
<template xmlns="">
  <div class="app-container">
    <el-card class="box-card">
      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
        <el-form-item label="项目编码" prop="projectCode">
          <el-input
            v-model="queryParams.projectCode"
            placeholder="请输入项目编码"
            clearable
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="项目名称" prop="projectName">
          <el-input
            v-model="queryParams.projectName"
            placeholder="请输入项目名称"
            clearable
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="报工时间">
          <el-date-picker
            v-model="queryParams.reportTime"
            style="width: 340px"
            value-format="yyyy-MM-dd"
            type="datetimerange"
            range-separator="-"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          ></el-date-picker>
        </el-form-item>
        <el-form-item style="float: right">
          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
    </el-card>
    <el-card style="margin-top: 10px" class="box-card">
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
            size="mini"
            @click="handleAdd"
            v-hasPermi="['am:workHourInfo:add']"
          >新增</el-button>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="success"
            plain
            icon="el-icon-edit"
            size="mini"
            :disabled="single"
            @click="handleUpdate"
            v-hasPermi="['am:workHourInfo:edit']"
          >修改</el-button>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="danger"
            plain
            icon="el-icon-delete"
            size="mini"
            :disabled="multiple"
            @click="handleDelete"
            v-hasPermi="['am:workHourInfo:remove']"
          >删除</el-button>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="warning"
            plain
            icon="el-icon-download"
            size="mini"
            @click="handleExport"
            v-hasPermi="['am:workHourInfo:export']"
          >导出</el-button>
        </el-col>
        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
      </el-row>
      <el-table show-summary border v-loading="loading" :data="workHourInfoList" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column label="用户名称" align="center" prop="nickName" />
        <el-table-column label="项目编码" align="center" prop="projectCode" />
        <el-table-column label="部门" align="center" prop="deptName" />
        <el-table-column label="项目阶段" align="center" prop="projectPhase">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.project_phase" :value="scope.row.projectPhase"/>
          </template>
        </el-table-column>
        <el-table-column label="工种" align="center" prop="workType">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.work_type" :value="scope.row.workType"/>
          </template>
        </el-table-column>
        <el-table-column label="工时" align="center" prop="workTime" />
      </el-table>
    </el-card>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–修改工时明细对话框 -->
    <el-dialog  :title="title" :visible.sync="open" width="500px" append-to-body>
      <span slot="title">
        <i class="el-icon-s-order"></i>
        {{titleName}}
      </span>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="用户账号" prop="userName">
          <el-input disabled v-model="form.userName" placeholder="请输入用户账号" />
        </el-form-item>
        <el-form-item label="用户名称" prop="nickName">
          <el-input disabled v-model="form.nickName" placeholder="请输入用户名称" />
        </el-form-item>
        <el-form-item label="项目编码" prop="projectCode">
          <el-input v-model="form.projectCode" placeholder="请选择项目编码" >
            <el-button slot="append" @click="handleSelectMaterial" icon="el-icon-search"></el-button>
          </el-input>
          <ItemSelect ref="itemSelect" @onSelected="onItemSelected" > </ItemSelect>
        </el-form-item>
<!--        <el-form-item label="项目编码" prop="projectCode">-->
<!--          <el-select style="width: 100%"  @change="handleSelectProjectCode(form.projectCode)" v-model="form.projectCode" placeholder="请选择项目编码">-->
<!--             <el-option-->
<!--               v-for="item in options"-->
<!--               :key="item.projectCode"-->
<!--               :label="item.projectCode"-->
<!--               :value="item.projectCode">-->
<!--             </el-option>-->
<!--          </el-select>-->
<!--        </el-form-item>-->
        <el-form-item label="项目名称" prop="projectName">
          <el-input disabled v-model="form.projectName" placeholder="请输入项目名称" />
        </el-form-item>
        <el-form-item label="项目阶段" prop="projectPhase">
          <el-select v-model="form.projectPhase" placeholder="请选择项目阶段">
            <el-option
              v-for="dict in dict.type.project_phase"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="工种" prop="workType">
          <el-select v-model="form.workType" placeholder="请选择工种">
            <el-option
              v-for="dict in dict.type.work_type"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="工时" prop="workTime">
          <el-input v-model="form.workTime" placeholder="请输入工时" />
        </el-form-item>
        <el-form-item label="工作详情" prop="details">
          <el-input v-model="form.details" placeholder="请输入工作详情" />
        </el-form-item>
        <el-form-item label="报工时间" prop="reportTime">
          <el-date-picker clearable
                          disabled
                          v-model="form.reportTime"
                          type="date"
                          value-format="yyyy-MM-dd"
                          placeholder="请选择报工时间">
          </el-date-picker>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="newsubmitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listWorkHourInfo, getWorkHourInfo, delWorkHourInfo, addWorkHourInfo, updateWorkHourInfo ,listWorkHourInfoCommon} from "@/api/main/am/workHourInfo";
import {listProjectInfo} from "@/api/main/bs/projectInfo";
import {getUserProfile} from "@/api/system/user";
import userAvatar from "@/views/system/user/profile/userAvatar.vue";
import ItemSelect from "@/components/ProjectInfoSelect/single.vue";
import {listWorkHourInfoReport} from "@/api/main/am/workHourInfoReport";
export default {
  components: {userAvatar,ItemSelect},
  dicts: ['project_phase','work_type'],
  name: "WorkHourInfo",
  data() {
    return {
      options: [],
      // é®ç½©å±‚
      loading: true,
      permission:"",
      titleName: "",
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•ä¸ªç¦ç”¨
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // å·¥æ—¶æ˜Žç»†è¡¨æ ¼æ•°æ®
      workHourInfoList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        userName: null,
        nickName: null,
        projectCode: null,
        projectName: null,
        projectPhase: null,
        workType: null,
        workTime: null,
        details: null,
        reportTime: null,
      },
      projectCodeQueryParams: {
        pageNum: 1,
        pageSize: 10,
        projectCode: null,
      },
      // è¡¨å•å‚æ•°
      form: {},
      user: {},
      roleGroup: {},
      postGroup: [],
      // è¡¨å•æ ¡éªŒ
      rules: {
        workHourId: [
          { required: true, message: "工时id不能为空", trigger: "blur" }
        ],
        projectCode: [
          { required: true, message: "项目编号不能为空", trigger: "blur" },
          { pattern: /^[a-zA-Z0-9]*$/, message: "项目编号不能包含中文字符", trigger: "blur" }
        ],
        projectPhase:[
          { required: true, message: "项目阶段不能为空", trigger: "blur" },
        ],
        workType:[
          { required: true, message: "工种不能为空", trigger: "blur" },
        ],
        workTime:[
          { required: true, message: "工时不能为空", trigger: "blur" },
        ],
      }
    };
  },
  created() {
    this.getList();
    this.initProjectCode()
  },
  methods: {
    handleSelectMaterial(){
      this.$refs.itemSelect.showFlag = true;
    },
    onItemSelected(obj){
      if(obj !== undefined && obj !== null){
        this.form.projectCode = obj.projectCode;
        this.form.projectName = obj.projectName;
      }
    },
    /** æŸ¥è¯¢å·¥æ—¶æ˜Žç»†åˆ—表 */
    getList() {
      this.getUser();
      console.log('1111'+this.permission)
      this.loading = true;
        listWorkHourInfoReport(this.queryParams).then(response => {
          this.workHourInfoList = response.rows;
          this.total = response.total;
          this.loading = false;
        })
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•é‡ç½®
    reset() {
      this.form = {
        workHourId: null,
        userName: null,
        nickName: null,
        projectCode: null,
        projectName: null,
        projectPhase: null,
        workType: null,
        workTime: null,
        details: null,
        reportTime: null,
        delFlag: null,
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.workHourId)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.getUser();
      this.open = true;
      this.titleName = "添加工时明细";
      this.form.reportTime =new Date()
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const workHourId = row.workHourId || this.ids
      getWorkHourInfo(workHourId).then(response => {
        this.form = response.data;
        this.open = true;
        this.titleName = "修改工时明细";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.workHourId != null) {
            updateWorkHourInfo(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addWorkHourInfo(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /**工时判断*/
    newsubmitForm(){
      if(this.form.workTime >24){
        this.$message({
          showClose: true,
          message: '工时不能超过24小时',
          type: 'error'
        });
      }else{
        if(this.form.workTime >8){
          this.$message({
            showClose: true,
            message: '请填写工作详情',
            type: 'error'
          });
        }else {
          this.submitForm()
        }
      }
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const workHourIds = row.workHourId || this.ids;
      this.$modal.confirm('是否删除?').then(function() {
        return delWorkHourInfo(workHourIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('am/workHourInfo/export', {
        ...this.queryParams
      }, `workHourInfo_${new Date().getTime()}.xlsx`)
    },
    /** æ–°å¢žä¿®æ”¹é¡µé¢å¼•ç”¨é¡¹ç›®é¡µé¢ */
    handleSelectProjectCode(selectedOption) {
      this.projectCodeQueryParams.projectCode = selectedOption;
      listProjectInfo(this.projectCodeQueryParams).then(response => {
        this.form.projectName = response.rows[0].projectName;
      });
    },
    /** é¡¹ç›®ä¿¡æ¯åˆ—表写入options里 */
    initProjectCode(){
      listProjectInfo(this.queryParams).then(response => {
        this.options = response.rows;
      });
    },
    /** èŽ·å–账号和姓名 */
    getUser() {
      getUserProfile().then(response => {
        this.user = response.data;
        this.roleGroup = response.roleGroup;
        this.postGroup = response.postGroup;
        this.form.userName=response.data.userName;
        this.form.nickName=response.data.nickName;
      });
    },
  }
};
</script>