Browse Source

工时导入模板

seyason 3 years ago
parent
commit
0261ced4ad

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -671,9 +671,10 @@ public class ReportController {
 
 
     @RequestMapping("/importData")
-    public HttpRespMsg importData(Integer companyId,
+    public HttpRespMsg importData(Integer companyId, Integer withCheckIn,
                                   MultipartFile file, HttpServletRequest request) {
-        return reportService.importData(companyId, file, request);
+        return reportService.importData(companyId,withCheckIn, file, request);
     }
+
 }
 

+ 60 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -8,12 +8,11 @@ import com.management.platform.entity.Participation;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.Report;
 import com.management.platform.entity.User;
-import com.management.platform.mapper.ParticipationMapper;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.UserCorpwxTimeMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ReportService;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -40,6 +39,9 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping("/user-corpwx-time")
 public class UserCorpwxTimeController {
+
+    @Value(value = "${upload.path}")
+    private String path;
     @Resource
     UserCorpwxTimeMapper userCorpwxTimeMapper;
     @Resource
@@ -52,6 +54,10 @@ public class UserCorpwxTimeController {
     ProjectMapper projectMapper;
     @Resource
     ReportService reportService;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    CompanyMapper companyMapper;
 
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -131,7 +137,6 @@ public class UserCorpwxTimeController {
                         report.setCreatorId(userId);
                         report.setCreateDate(createDate);
                         report.setProjectId(p.getId());
-                        report.setCost(new BigDecimal(0));
                         reportList.add(report);
                     }
 
@@ -139,7 +144,56 @@ public class UserCorpwxTimeController {
             }
         }
 
-        return reportService.saveProjectTime(user.getCompanyId(), reportList);
+        return reportService.saveProjectTime(user.getCompanyId(), reportList, array);
+    }
+
+    //导出带考勤数据的模板
+    @RequestMapping("/exportCheckInExcel")
+    public HttpRespMsg exportCheckInExcel(String startDate, String endDate) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        Integer manageDeptId = user.getManageDeptId();
+        if (manageDeptId != null && manageDeptId != 0) {
+
+        }
+        HttpRespMsg ret = getMyDeptMembsData(startDate, endDate);
+        HashMap map = (HashMap)ret.data;
+        List<Map> list = (List<Map>) map.get("list");
+        List<String> projects = (List) map.get("projects");
+        List<String> titles = new ArrayList<>();
+        titles.add("工作日期");
+        titles.add("员工姓名");
+        titles.add("上班时间");
+        titles.add("下班时间");
+        titles.add("工作时长");
+        //添加项目名称作为列名
+        for (String p : projects) {
+            titles.add(p);
+        }
+        List<List<String>> allData = new ArrayList<>();
+        allData.add(titles);
+        //数据填充
+        for (Map dataItem : list) {
+            List<String> dataList = new ArrayList<>();
+            dataList.add((String)dataItem.get("createDate"));
+            dataList.add((String)dataItem.get("username"));
+            dataList.add((String)dataItem.get("startTime"));
+            dataList.add((String)dataItem.get("endTime"));
+            dataList.add(""+(Double)dataItem.get("workHours"));
+            for (String p : projects) {
+                dataList.add("");
+            }
+            allData.add(dataList);
+        }
+        String fileName = companyMapper.selectById(user.getCompanyId()).getCompanyName();
+        if (manageDeptId != null && manageDeptId != 0) {
+            String departmentName = departmentMapper.selectById(manageDeptId).getDepartmentName();
+            fileName = departmentName;
+        }
+        fileName += "_人员工时统计模板"+startDate+"至"+endDate;
+        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allData, path);
+        return msg;
     }
 }
 

+ 7 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -1,6 +1,5 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -16,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-03-31
+ * @since 2022-01-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -52,9 +51,14 @@ public class Department extends Model<Department> {
     /**
      * 部门负责人id
      */
-    @TableField(value = "manager_id", updateStrategy= FieldStrategy.IGNORED)
+    @TableField("manager_id")
     private String managerId;
 
+    /**
+     * 日报导入审核人
+     */
+    @TableField("report_audit_userid")
+    private String reportAuditUserid;
 
 
     @Override

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -1,5 +1,6 @@
 package com.management.platform.service;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.Report;
 import com.management.platform.entity.User;
@@ -59,8 +60,8 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month);
 
-    HttpRespMsg importData(Integer companyId, MultipartFile file, HttpServletRequest request);
+    HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
 
-    HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList);
+    HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList, JSONArray userReportArray);
 
 }

+ 103 - 47
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -10,10 +10,7 @@ import com.management.platform.entity.vo.DepartmentVO;
 import com.management.platform.entity.vo.UserMonthWork;
 import com.management.platform.entity.vo.WorktimeItem;
 import com.management.platform.mapper.*;
-import com.management.platform.service.DepartmentService;
-import com.management.platform.service.ReportProfessionProgressService;
-import com.management.platform.service.ReportService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
@@ -23,7 +20,7 @@ import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import org.apache.poi.hssf.usermodel.*;
-import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
@@ -124,6 +121,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private PpMembsMapper ppMembsMapper;
     @Resource
     private StagesMapper stagesMapper;
+    @Resource
+    private UserSalaryService userSalaryService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -1570,7 +1569,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg importData(Integer companyId, MultipartFile multipartFile, HttpServletRequest request) {
+    public HttpRespMsg importData(Integer companyId,Integer withCheckIn,  MultipartFile multipartFile, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         //然后处理文件
@@ -1589,24 +1588,23 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             inputStream.close();
             outputStream.close();
             //然后解析表格
-            XSSFWorkbook workbook = new XSSFWorkbook(file);
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
 
-            //导入员工薪资表
             DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/M/d");
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
             //获取公司全部成员
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
 
-            XSSFSheet sheet = workbook.getSheetAt(0);
+            Sheet sheet = workbook.getSheetAt(0);
             //由于第一行需要指明列对应的标题
             int rowNum = sheet.getLastRowNum();
             List<String> projectList = new ArrayList<>();
             List<Project> allProjectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
             List<Report> reportList = new ArrayList<>();
-            int projectNameStartIndex = 2;
+            int projectNameStartIndex = (withCheckIn==null?2:5);
 
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
-                XSSFRow row = sheet.getRow(rowIndex);
+                Row row = sheet.getRow(rowIndex);
                 if (row == null) {
                     continue;
                 }
@@ -1636,10 +1634,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 } else {
                     //数据行
-                    for (int i=1;i<2+projectList.size(); i++) {
+                    for (int i=1;i<projectNameStartIndex+projectList.size(); i++) {
                         row.getCell(i).setCellType(CellType.STRING);
                     }
-                    String reportDate = sdf.format(row.getCell(0).getDateCellValue());
+                    String reportDate = withCheckIn == null?sdf.format(row.getCell(0).getDateCellValue()):row.getCell(0).getStringCellValue();
                     String username = row.getCell(1).getStringCellValue().trim();
                     //检查人员是否存在
                     Optional<User> any = allUserList.stream().filter(u -> u.getName().equals(username)).findAny();
@@ -1650,25 +1648,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     User reportCreator = any.get();
                     List<SimpleProjectime> timeCostList = new ArrayList<SimpleProjectime>();
                     double totalTime = 0;
-                    for (int i=2; i < 2 + projectList.size(); i++) {
+                    for (int i=projectNameStartIndex; i < projectNameStartIndex + projectList.size(); i++) {
                         String stringCellValue = row.getCell(i).getStringCellValue();
                         double time = 0;
-                        String pName = projectList.get(i-2);
+                        String pName = projectList.get(i-projectNameStartIndex);
                         Project project = allProjectList.stream().filter(p -> p.getProjectName().equals(pName)).findFirst().get();
 
                         if (!StringUtils.isEmpty(stringCellValue)) {
                             time = Double.parseDouble(stringCellValue);
-                            totalTime += time;
-                            Report report = new Report();
-                            report.setCompanyId(companyId);
-                            report.setCreatorId(reportCreator.getId());
-                            report.setProjectId(project.getId());
-                            report.setReportTimeType(1);
-                            report.setWorkingTime(time);
-                            report.setState(1);//导入的直接算审核通过
-                            report.setCreateDate(LocalDate.parse(reportDate, dtf));
-                            report.setCost(reportCreator.getCost().multiply(new BigDecimal(time)));
-                            reportList.add(report);
+                            if (time > 0) {
+                                totalTime += time;
+                                Report report = new Report();
+                                report.setCompanyId(companyId);
+                                report.setCreatorId(reportCreator.getId());
+                                report.setProjectId(project.getId());
+                                report.setReportTimeType(1);
+                                report.setWorkingTime(time);
+                                report.setState(0);//导入的直接算审核通过
+                                report.setCreateDate(LocalDate.parse(reportDate, dtf));
+                                report.setCost(reportCreator.getCost().multiply(new BigDecimal(time)));
+                                reportList.add(report);
+                            } else if (time < 0) {
+                                msg.setError(username + "的工时存在负数,请检查修改");
+                                return msg;
+                            }
                         }
                         //检查个人总工时不能为0
                         if (totalTime == 0) {
@@ -1902,39 +1905,92 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList) {
+    public HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList, JSONArray userReportArray) {
         //如果当天该员工已有报告,要删除
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         if (reportList.size() > 0) {
             for (Report report : reportList) {
-                reportMapper.delete(new QueryWrapper<Report>().eq("create_date", report.getCreateDate()).eq("creator_id", report.getCreatorId()));
+                reportMapper.delete(new QueryWrapper<Report>()
+                        .eq("create_date", report.getCreateDate())
+                        .eq("creator_id", report.getCreatorId()));
             }
 
-//            //计算人员的成本
-//            TimeType timeType = timeTypeMapper.selectById(companyId);
-//            for (Report report : reportList) {
-//                //获取一下信息
-//                if (report.getWorkingTime() <= 0.0) {
-//                    httpRespMsg.setError("工作时长必须大于零");
-//                    return httpRespMsg;
-//                }
-//                //检查是否存在计算加班工资的情况
-//                if (!timeType.getPayOvertime()) {
-//                    //不能超过最多时间,超过的话,等比例核算
-//                    if (totalWorkTime > timeType.getAllday()) {
-//                        BigDecimal cost;
-//                        if (hourCost == null) {
-//                            cost = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst().get().getCost().multiply(new BigDecimal(timeType.getAllday()))
-//                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+            //计算人员的成本
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+            List<String> userIds = new ArrayList<>();
+            for (int i=0;i<userReportArray.size(); i++) {
+                String userId = userReportArray.getJSONObject(i).getString("userId");
+                userIds.add(userId);
+            }
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", userIds));
+
+//            for (User subsUser : userList) {
+//                BigDecimal tempCost = new BigDecimal(0);
+//                if (subsUser.getCostApplyDate() != null) {
+//                    //检查有效期
+//                    if (subsUser.getCostApplyDate().compareTo(dtf.format(now)) > 0) {
+//                        //取上一个历史成本
+//                        List<UserSalary> list = userSalaryService.list(new QueryWrapper<UserSalary>().eq("user_id", subsUser.getId()).orderByDesc("indate").last("limit 2"));
+//                        if (list.size() > 1) {
+//                            tempCost = list.get(1).getCost();
 //                        } else {
-//                            cost = hourCost.multiply(new BigDecimal(timeType.getAllday()))
-//                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+//                            //没有记录,又没有达到预设的起效时间,则默认为0
+//                            tempCost = new BigDecimal(0);
 //                        }
-//                        report.setCost(cost);
+//                    } else {
+//                        tempCost = subsUser.getCost();
 //                    }
+//                } else {
+//                    tempCost = subsUser.getCost();
 //                }
 //
+//                if (tempCost == null) {
+//                    tempCost = new BigDecimal(0);
+//                }
+//                //设置好时薪
+//                subsUser.setCost(tempCost);
 //            }
+
+            for (Report report : reportList) {
+                //获取一下信息
+                if (report.getWorkingTime() <= 0.0) {
+                    httpRespMsg.setError("工作时长必须大于零");
+                    return httpRespMsg;
+                }
+                //获取员工当天总工作时长
+                JSONObject userDayReport = null;
+                for (int i=0;i<userReportArray.size(); i++) {
+                    JSONObject jsonObject = userReportArray.getJSONObject(i);
+                    if (jsonObject.getString("createDate").equals(DateTimeFormatter.ofPattern("yyyy-MM-dd").format(report.getCreateDate()))
+                        && jsonObject.getString("userId").equals(report.getCreatorId())) {
+                        userDayReport = jsonObject;
+                        break;
+                    }
+                }
+                BigDecimal hourCost = null;
+                double totalWorkTime = userDayReport.getDouble("totalFillTime");
+                //检查是否存在计算加班工资的情况
+                if (!timeType.getPayOvertime()) {
+                    //不能超过最多时间,超过的话,等比例核算
+                    if (totalWorkTime > timeType.getAllday()) {
+                        BigDecimal cost;
+                        if (hourCost == null) {
+                            cost = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst().get().getCost().multiply(new BigDecimal(timeType.getAllday()))
+                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+                        } else {
+                            cost = hourCost.multiply(new BigDecimal(timeType.getAllday()))
+                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+                        }
+                        report.setCost(cost);
+                    }
+                } else {
+                    //直接时薪乘以小时
+                    BigDecimal cost = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst().get().getCost()
+                                .multiply(new BigDecimal(report.getWorkingTime()));
+                    report.setCost(cost);
+                }
+
+            }
                 reportService.saveBatch(reportList);
         }
 

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml

@@ -9,13 +9,15 @@
         <result column="superior_id" property="superiorId" />
         <result column="company_id" property="companyId" />
         <result column="manager_id" property="managerId" />
+        <result column="report_audit_userid" property="reportAuditUserid" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        department_id, department_name, superior_id, company_id, manager_id
+        department_id, department_name, superior_id, company_id, manager_id, report_audit_userid
     </sql>
 
+
     <!--根据部门获取成本-->
     <select id="getCostByDepartment" resultType="java.util.Map">
         SELECT SUM(b.working_time) AS time, SUM(b.cost) AS money

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml

@@ -20,7 +20,7 @@
     </sql>
 
     <select id="getUserDataList" resultType="java.util.HashMap" >
-        SELECT user.id as userId, DATE_FORMAT(a.create_date, '%Y-%m-%d') as createDate,a.start_time as startTime, a.end_time as endTime, a.work_hours as workHours, user.name as username FROM user_corpwx_time a LEFT JOIN user ON user.`corpwx_userid` = a.corpwx_userid
+        SELECT user.id as userId, DATE_FORMAT(a.create_date, '%Y/%m/%d') as createDate,a.start_time as startTime, a.end_time as endTime, a.work_hours as workHours, user.name as username FROM user_corpwx_time a LEFT JOIN user ON user.`corpwx_userid` = a.corpwx_userid
         WHERE a.create_date BETWEEN #{startDate} AND #{endDate}
         AND a.company_id = #{companyId}
         <if test="deptId != null">

+ 86 - 38
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -599,15 +599,62 @@
         </el-dialog>
 
         <!--基于企业微信考勤数据的工时导入 -->
-        <el-dialog title="工时批量代填" v-if="importWxDialog" :visible.sync="importWxDialog" customClass="customWidth" width="90%">
-            <!-- <el-steps :active="active" finish-status="success">
+        <el-dialog title="工时批量代填" v-if="importWxDialog" :visible.sync="importWxDialog" customClass="customWidth" width="650px">
+            <el-steps :active="active" finish-status="success">
             <el-step title="选择要导入工时的日期范围">
                 
             </el-step>
             <el-step title="下载带考勤数据的模板"></el-step>
             <el-step title="填写模板,上传数据"></el-step>
 
-            </el-steps> -->
+            </el-steps>
+            
+                
+            <div v-if="active==0" style="padding:30px;height:360px;">
+                <div style="margin-top:50px;margin-left:80px;">
+                <el-date-picker 
+                    v-model="importWxParam.date" :editable="false" 
+                    format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
+                    :clearable="true" 
+                    range-separator="至"
+                    type="daterange" 
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    @change="loadCheckInData"
+                    ></el-date-picker>
+            </div>
+            </div>
+            <div v-if="active==1" style="padding:10px;">
+                <el-table border :data="checkinList" highlight-current-row v-loading="checkinLoading" :height="395" 
+                style="width: 100%;margin-top:5px;" >
+                <el-table-column prop="createDate" label="工作日期"  ></el-table-column>
+                <el-table-column prop="username" label="员工姓名"  ></el-table-column>
+                <el-table-column prop="startTime" label="上班时间"  ></el-table-column>
+                <el-table-column prop="endTime" label="下班时间" ></el-table-column>
+                <el-table-column prop="workHours" label="工作时长" >
+                    <template slot-scope="scope">
+                        {{scope.row.workHours.toFixed(1)}}h
+                    </template>
+                </el-table-column>
+                </el-table>
+            </div>
+            <div v-if="active==2" >
+                <p style="display: flex;justify-content: center;height:390px;">
+                    <el-upload style="margin-top:100px;" ref="upload"  action="#" :limit="1" :http-request="batchImportWxData" :show-file-list="false">
+                        <el-button type="primary" :underline="false" >选择文件并上传</el-button>
+                    </el-upload>
+                </p>
+            </div>
+            <el-button style="margin: 0 auto;" @click="pre">上一步</el-button>
+            
+            <el-button style="float:right;" @click="next" :disabled="importWxParam.date==null" v-if="active<2">下一步</el-button>
+            <el-link v-if="active==1" style="float:right;margin-right:150px;margin-top:10px;" 
+                type="primary" @click="downloadCheckInExcel">下载员工工时统计模板.xlsx</el-link>
+            
+        </el-dialog>
+
+        <!--基于企业微信考勤数据的工时导入 -->
+        <el-dialog title="工时批量代填" v-if="batchSubFillDialog" :visible.sync="batchSubFillDialog" customClass="customWidth" width="90%">
             <div>
                 <span>选择日期范围:</span><el-date-picker 
                     v-model="importWxParam.date" :editable="false" 
@@ -629,11 +676,6 @@
                 <el-table-column prop="startTime" label="上班时间"  width="80px" fixed="left"></el-table-column>
                 <el-table-column prop="endTime" label="下班时间"  width="80px" fixed="left"></el-table-column>
                 <el-table-column prop="workHours" label="工作时长" width="80px" align="right" fixed="left">
-                <!-- <el-table-column prop="createDate" label="工作日期"  width="100"></el-table-column>
-                <el-table-column prop="username" label="员工姓名"   width="80"></el-table-column>
-                <el-table-column prop="startTime" label="上班时间"  width="80"></el-table-column>
-                <el-table-column prop="endTime" label="下班时间"  width="80"></el-table-column>
-                <el-table-column prop="workHours" label="工作时长" width="80" align="right"> -->
                     <template slot-scope="scope">
                         {{scope.row.workHours.toFixed(1)}}h
                     </template>
@@ -641,7 +683,7 @@
                 <!--项目名称列表 -->
                 <el-table-column v-for="(item, index) in projectColumns" :key="index" :label="item" min-width="150px">
                     <template slot-scope="scope">
-                        <el-input v-model="scope.row[item]" style="width:60px;" @change="triggerTotalTime(scope.$index)"></el-input>&nbsp;h
+                        <el-input v-model="scope.row[item]" style="width:60px;" @input="triggerTotalTime(scope.$index)"></el-input>&nbsp;h
                     </template>
                 </el-table-column>
                 <el-table-column prop="totalFillTime" label="总工时" fixed="right">
@@ -650,33 +692,6 @@
                     </template>
                 </el-table-column>
                 </el-table>
-            <!-- <div v-if="active==0" style="padding:30px;height:360px;">
-                
-            </div>
-            <div v-if="active==1" style="padding:10px;">
-                
-            </div>
-            <div v-if="active==2" >
-                <p style="display: flex;justify-content: center;height:390px;">
-                    <el-upload style="margin-top:100px;" ref="upload"  action="#" :limit="1" :http-request="batchImportWxData" :show-file-list="false">
-                        <el-button type="primary" :underline="false" >选择文件并上传</el-button>
-                    </el-upload>
-                </p>
-            </div>
-            <el-button style="margin: 0 auto;" @click="pre">上一步</el-button>
-            
-            <el-button style="float:right;" @click="next" :disabled="importWxParam.date==null" v-if="active<2">下一步</el-button>
-            <el-link v-if="active==1" style="float:right;margin-right:200px;" 
-                type="primary" @click="downloadCheckInExcel">下载员工工时统计模板</el-link> -->
-            <!-- <p>1. 导出企业微信考勤打卡记录
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="" download="员工工时导入模板.xlsx">员工工时统计模板.xlsx</el-link>
-            </p>
-            <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p>
-            <p style="display: flex;justify-content: center;">
-                <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" >开始导入</el-button>
-            </el-upload>
-            </p> -->
         </el-dialog>
     </section>
 </template>
@@ -802,6 +817,40 @@
             };
         },
         methods: {
+            //下载带企业微信考勤数据的工时统计模板
+            downloadCheckInExcel() {
+                this.http.post('/user-corpwx-time/exportCheckInExcel',{ 
+                    startDate: this.importWxParam.date[0],
+                    endDate: this.importWxParam.date[1],
+                },
+                res => {
+                    if (res.code == "ok") {
+                        var filePath = res.data;
+                        const a = document.createElement('a'); // 创建a标签
+                        var data = filePath.split("\\.");
+
+                        a.setAttribute('download', data[data.length-1]);// download属性
+                        a.setAttribute('href', filePath);// href链接
+                        a.click(); //自执行点击事件
+                        a.remove();
+                    } 
+                },
+                error => {
+                    this.checkinLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+            },
+            pre() {
+                if (this.active == 0) return;
+                this.active--;
+            },
+            next() {
+                this.active++;
+            },
             triggerTotalTime(index) {
                 var item = this.checkinList[index];
                 var total = 0.0;
@@ -813,7 +862,6 @@
                 }
                 console.log(total);
                 item.totalFillTime = total;
-                this.timeStamp = new Date();
             },
             //提交批量代填的数据
             submitBatchSubFillData() {
@@ -894,7 +942,7 @@
                                 type: "success"
                             });
                             this.getReportList();
-                            this.importDialog = false;
+                            this.importWxDialog = false;
                         } else {
                             this.$message({
                                 message: res.msg,