Forráskód Böngészése

工时批量代填功能

seyason 3 éve
szülő
commit
08c08dac42
22 módosított fájl, 808 hozzáadás és 16 törlés
  1. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  3. 145 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  4. 120 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  5. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  6. 61 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCorpwxTime.java
  7. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCorpwxTimeMapper.java
  8. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserCorpwxTimeService.java
  10. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  11. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  12. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  13. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  14. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserCorpwxTimeServiceImpl.java
  15. 98 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  16. 4 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  17. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/Constant.java
  18. 28 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DateTimeUtil.java
  19. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  20. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  21. 31 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml
  22. 190 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java

@@ -180,7 +180,7 @@ public class StagesController {
         if (tasks.size() > 0) {
             List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
             List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect));
-            if (user.getRole() == 0 && !project.getInchargerId().equals(userId)) {
+            if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
                 subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
             }
             subTasks.addAll(subLists);

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -337,7 +337,7 @@ public class TaskController {
         List<Task> list = taskService.simpleList(queryWrapper);
 
         //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
-        if (user.getRole() == 0 && !project.getInchargerId().equals(userId)) {
+        if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
             list = list.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
         }
         //设置列表名称

+ 145 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -0,0 +1,145 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.service.ReportService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-01-04
+ */
+@RestController
+@RequestMapping("/user-corpwx-time")
+public class UserCorpwxTimeController {
+    @Resource
+    UserCorpwxTimeMapper userCorpwxTimeMapper;
+    @Resource
+    HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ParticipationMapper participationMapper;
+    @Resource
+    ProjectMapper projectMapper;
+    @Resource
+    ReportService reportService;
+
+    @RequestMapping("/getMyDeptMembsData")
+    public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<Map> list = new ArrayList<Map>();
+        if (user.getRole() == 1 || user.getRole() == 2) {
+            //管理员查看全部人员的
+            list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, null);
+        } else {
+            Integer manageDeptId = user.getManageDeptId();
+            if (manageDeptId != null && manageDeptId != 0) {
+                list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, manageDeptId);
+            }
+        }
+        HashMap item = new HashMap();
+        item.put("list", list);
+        List<String> userIdList = new ArrayList<>();
+        for (int i=0;i<list.size(); i++) {
+            Map map = list.get(i);
+            String userId = (String)map.get("userId");
+            userIdList.add(userId);
+        }
+        //员工参与的项目
+        List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("user_id", userIdList));
+        if (participationList.size() > 0) {
+            List<Integer> collect = participationList.stream().map(Participation::getProjectId).collect(Collectors.toList());
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect).orderByAsc("id"));
+            List<String> names = projectList.stream().map(Project::getProjectName).collect(Collectors.toList());
+//            for (int i=0;i<list.size(); i++) {
+//                Map map = list.get(i);
+//                for () {
+//
+//                }
+//                map.put()
+//            }
+            item.put("projects", names);
+        }
+
+
+        //返回数据
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = item;
+        return msg;
+    }
+
+    @RequestMapping("/submitProjectTime")
+    public HttpRespMsg submitProjectTime(String json, String projectColumns) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        JSONArray array = JSONArray.parseArray(json);
+        JSONArray columnsArray = JSONArray.parseArray(projectColumns);
+        List<String> pnames = new ArrayList<>();
+        for (int i=0;i<columnsArray.size(); i++) {
+            System.out.println(columnsArray.getString(i));
+            pnames.add(columnsArray.getString(i));
+        }
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("project_name", pnames).eq("company_id", user.getCompanyId()));
+
+        List<Report> reportList = new ArrayList<>();
+
+        for (int i=0;i<array.size(); i++) {
+            JSONObject jsonObject = array.getJSONObject(i);
+            System.out.println(jsonObject);
+            LocalDate createDate = LocalDate.parse(jsonObject.getString("createDate"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            String userId = jsonObject.getString("userId");
+            //获取该员工的各个项目分配的工时
+
+            for (int j=0;j<projectList.size(); j++) {
+                Project p = projectList.get(j);
+                String key = p.getProjectName();
+                if (jsonObject.containsKey(key)) {
+                    double time = jsonObject.getDouble(key);
+                    if (time > 0) {
+                        Report report = new Report();
+                        report.setWorkingTime(time);
+                        report.setCreatorId(userId);
+                        report.setCreateDate(createDate);
+                        report.setProjectId(p.getId());
+                        report.setCost(new BigDecimal(0));
+                        reportList.add(report);
+                    }
+
+                }
+            }
+        }
+
+        return reportService.saveProjectTime(user.getCompanyId(), reportList);
+    }
+}
+

+ 120 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -8,6 +8,7 @@ import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.DepartmentService;
 import com.management.platform.service.UserService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import com.qq.weixin.mp.aes.AesException;
 import com.qq.weixin.mp.aes.WXBizMsgCrypt;
@@ -22,8 +23,8 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.net.URLEncoder;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 @RestController
@@ -48,7 +49,12 @@ public class WeiXinCorpController {
     //网页获取企业用户信息
     public static final String GET_CORP_USERINFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd?suite_access_token=SUITE_ACCESS_TOKEN&code=CODE";
 
+    //获取员工打卡日报统计信息
+    public static final String GET_CHECKIN_DAYDATA = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckin_daydata?access_token=ACCESS_TOKEN";
 
+    public static final String GET_CHECKINDATA = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=ACCESS_TOKEN";
+
+    public static final String GET_CHECKINOPTION = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckinoption?access_token=ACCESS_TOKEN";
     @Value("${suitId}")
     private String suitId;
     @Value("${suitSecret}")
@@ -68,6 +74,8 @@ public class WeiXinCorpController {
     @Resource
     ProjectMapper projectMapper;
     @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
     ProjectBasecostSettingMapper projectBasecostSettingMapper;
 
     public static String SUITE_ACCESS_TOKEN = null;
@@ -744,4 +752,114 @@ public class WeiXinCorpController {
         }
         return msg;
     }
+
+    //获取企业微信考勤打卡统计数据
+    @RequestMapping("/getUserCheckInDayData")
+    public HttpRespMsg getUserCheckInDayData(int companyId, String date) {
+        LocalDateTime localDate = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        return wxCorpInfoService.getUserCheckInDayData(companyId, localDate);
+    }
+
+
+    @RequestMapping("/getUserCheckInData")
+    public HttpRespMsg getUserCheckInData(int companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (corpInfo == null) {
+            msg.setError("该企业未对接企业微信");
+            return msg;
+        }
+        String url = null;
+        try {
+            url = GET_CHECKINDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            JSONObject reqParam = new JSONObject();
+            LocalDateTime now = LocalDateTime.now();
+
+            now = now.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            System.out.println(now.toString());
+            long startTime = now.toEpochSecond(ZoneOffset.of("+8"));
+            now = now.plusDays(1);
+            System.out.println(now.toString());
+            long endTime = now.toEpochSecond(ZoneOffset.of("+8"));
+            System.out.println("startTime="+startTime+",endTime="+endTime);
+            reqParam.put("starttime", startTime);
+            reqParam.put("endtime",  endTime);
+            reqParam.put("opencheckindatatype", 3);
+
+            //获取企业下的全部员工
+            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
+            System.out.println("users size=="+users.size());
+            Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
+            reqParam.put("useridlist",  objects);
+            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                System.out.println(resp);
+                JSONObject json = JSONObject.parseObject(resp);
+                if (json.getIntValue("errcode") == 0) {
+                    JSONArray datas = json.getJSONArray("datas");
+
+                } else {
+                    throw new Exception(json.toJSONString());
+                }
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+        return msg;
+    }
+
+
+    @RequestMapping("/getUserCheckOption")
+    public HttpRespMsg getUserCheckOption(int companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (corpInfo == null) {
+            msg.setError("该企业未对接企业微信");
+            return msg;
+        }
+        String url = null;
+        try {
+            url = GET_CHECKINOPTION.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            JSONObject reqParam = new JSONObject();
+            LocalDateTime now = LocalDateTime.now();
+            now = now.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            System.out.println(now.toString());
+            long startTime = now.toEpochSecond(ZoneOffset.of("+8"));
+
+            System.out.println("startTime="+startTime+",endTime="+startTime);
+            reqParam.put("datetime", startTime);
+
+            //获取企业下的全部员工
+            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
+            System.out.println("users size=="+users.size());
+            Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
+            reqParam.put("useridlist",  objects);
+            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                System.out.println(resp);
+                JSONObject json = JSONObject.parseObject(resp);
+                if (json.getIntValue("errcode") == 0) {
+                    JSONArray datas = json.getJSONArray("datas");
+
+                } else {
+                    throw new Exception(json.toJSONString());
+                }
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+        return msg;
+    }
 }

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-12-21
+ * @since 2022-01-04
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -114,6 +114,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("alert_msg")
     private String alertMsg;
 
+    /**
+     * 同步企业微信的考勤记录
+     */
+    @TableField("sync_corpwx_time")
+    private Integer syncCorpwxTime;
+
 
     @Override
     protected Serializable pkVal() {

+ 61 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCorpwxTime.java

@@ -0,0 +1,61 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-01-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserCorpwxTime extends Model<UserCorpwxTime> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("create_date")
+    private LocalDate createDate;
+
+    /**
+     * 企业微信用户id
+     */
+    @TableField("corpwx_userid")
+    private String corpwxUserid;
+
+    @TableField("start_time")
+    private String startTime;
+
+    @TableField("end_time")
+    private String endTime;
+
+    @TableField("work_hours")
+    private Double workHours;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("wx_corpid")
+    private String wxCorpid;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCorpwxTimeMapper.java

@@ -0,0 +1,20 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.UserCorpwxTime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-01-04
+ */
+public interface UserCorpwxTimeMapper extends BaseMapper<UserCorpwxTime> {
+
+    public List<Map> getUserDataList(Integer companyId, String startDate, String endDate, Integer deptId);
+}

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

@@ -60,4 +60,7 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month);
 
     HttpRespMsg importData(Integer companyId, MultipartFile file, HttpServletRequest request);
+
+    HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList);
+
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserCorpwxTimeService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.UserCorpwxTime;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-01-04
+ */
+public interface UserCorpwxTimeService extends IService<UserCorpwxTime> {
+
+}

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -2,6 +2,10 @@ package com.management.platform.service;
 
 import com.management.platform.entity.WxCorpInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -18,4 +22,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     public String downloadFile(WxCorpInfo corpInfo, String mediaId);
 
     public String testDownloadFile();
+
+    public HttpRespMsg getUserCheckInDayData(int companyId, LocalDateTime localDate);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -620,7 +620,7 @@ public class DingDingServiceImpl implements DingDingService {
             } else if (userJson.getBooleanValue("admin")) {
                 role = Constant.ROLE_MANAGER;
             } else if (userJson.getBooleanValue("senior")) {
-                role = Constant.ROLE_SENIOR;
+                role = Constant.ROLE_LEADER;
             }
             user.setId(SnowFlake.nextId()+"")
                     .setRole(role)

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -625,8 +625,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         Project project = projectMapper.selectById(id);
         if (project.getInchargerId() != null) {
             User incharger = userMapper.selectById(project.getInchargerId());
-            if (incharger != null)
+            if (incharger != null) {
                 project.setInchargerName(incharger.getName());
+            }
         }
 
         //项目参与人

+ 42 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1714,6 +1714,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+
     private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
         list.forEach(l->{
             List<HashMap> collect = userList.stream().filter(u -> u.get("departmentId").equals(l.getId())).collect(Collectors.toList());
@@ -1899,4 +1900,45 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList) {
+        //如果当天该员工已有报告,要删除
+        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()));
+            }
+
+//            //计算人员的成本
+//            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);
+//                        } else {
+//                            cost = hourCost.multiply(new BigDecimal(timeType.getAllday()))
+//                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+//                        }
+//                        report.setCost(cost);
+//                    }
+//                }
+//
+//            }
+                reportService.saveBatch(reportList);
+        }
+
+        return httpRespMsg;
+    }
+
 }

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserCorpwxTimeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.UserCorpwxTime;
+import com.management.platform.mapper.UserCorpwxTimeMapper;
+import com.management.platform.service.UserCorpwxTimeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-01-04
+ */
+@Service
+public class UserCorpwxTimeServiceImpl extends ServiceImpl<UserCorpwxTimeMapper, UserCorpwxTime> implements UserCorpwxTimeService {
+
+}

+ 98 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1,14 +1,21 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.SysConfig;
+import com.management.platform.entity.User;
+import com.management.platform.entity.UserCorpwxTime;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.SysConfigMapper;
+import com.management.platform.mapper.UserCorpwxTimeMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.WxCorpInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.DateTimeUtil;
+import com.management.platform.util.HttpRespMsg;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -19,7 +26,8 @@ import org.springframework.web.client.RestTemplate;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.time.LocalDateTime;
+import java.time.*;
+import java.util.List;
 
 /**
  * <p>
@@ -35,6 +43,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     public static String URL_SEND_WXCORP_MSG = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
     //获取临时素材url
     public static String URL_GET_MEDIA = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
+
+    public static final String GET_CHECKIN_DAYDATA = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckin_daydata?access_token=ACCESS_TOKEN";
+
+
     @Value("${suitId}")
     private String suitId;
     @Value("${suitSecret}")
@@ -51,6 +63,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     @Resource
     SysConfigMapper sysConfigMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    UserCorpwxTimeMapper userCorpwxTimeMapper;
 
     @Override
     public void sendWXCorpMsg(WxCorpInfo corpInfo, String corpUserid, String msg) {
@@ -148,6 +164,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     }
 
 
+
     //获取第三方应用临时凭证
     private String getSuiteAccessToken() {
         if (WeiXinCorpController.SUITE_ACCESS_TOKEN == null || WeiXinCorpController.suiteTokenExpireTime < System.currentTimeMillis()) {
@@ -207,4 +224,84 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return corpInfo.getAccessToken();
     }
 
+    @Override
+    public HttpRespMsg getUserCheckInDayData(int companyId, LocalDateTime now) {
+        HttpRespMsg msg = new HttpRespMsg();
+        WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (corpInfo == null) {
+            msg.setError("该企业未对接企业微信");
+            return msg;
+        }
+        String url = null;
+        try {
+            url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            JSONObject reqParam = new JSONObject();
+//            LocalDate now = LocalDate.now();
+//            LocalDateTime now = LocalDateTime.now();
+            now = now.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            System.out.println(now.toString());
+            long startTime = now.toEpochSecond(ZoneOffset.of("+8"));
+            now = now.plusDays(1);
+            System.out.println(now.toString());
+            long endTime = now.toEpochSecond(ZoneOffset.of("+8"));
+            System.out.println("startTime="+startTime+",endTime="+endTime);
+            reqParam.put("starttime", startTime);
+            reqParam.put("endtime",  endTime);
+
+            //获取企业下的全部员工
+            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
+            System.out.println("users size=="+users.size());
+            Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
+            reqParam.put("useridlist",  objects);
+            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                System.out.println(resp);
+                JSONObject json = JSONObject.parseObject(resp);
+                if (json.getIntValue("errcode") == 0) {
+                    JSONArray datas = json.getJSONArray("datas");
+                    for (int i=0;i<datas.size(); i++) {
+                        JSONObject jsonObject = datas.getJSONObject(i);
+                        JSONObject base_info = jsonObject.getJSONObject("base_info");
+                        String curUserid = base_info.getString("acctid");
+                        Long time = base_info.getLong("date");
+                        LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()).toLocalDate();
+                        UserCorpwxTime ct = new UserCorpwxTime();
+                        ct.setCompanyId(companyId);
+                        ct.setCorpwxUserid(curUserid);
+                        ct.setCreateDate(localDate);
+                        JSONObject summary_info = jsonObject.getJSONObject("summary_info");
+                        int sTime = summary_info.getIntValue("earliest_time");//秒
+                        int eTime = summary_info.getIntValue("lastest_time");//秒
+                        int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
+
+                        ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
+                        ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
+                        ct.setWorkHours(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
+                        UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
+                                            .eq("create_date", localDate));
+                        if (item != null) {
+                            ct.setId(item.getId());
+                            //已存在记录,进行更新
+                            userCorpwxTimeMapper.updateById(ct);
+                        } else {
+                            userCorpwxTimeMapper.insert(ct);
+                        }
+                    }
+                } else {
+                    throw new Exception(json.toJSONString());
+                }
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+        return msg;
+    }
+
+
 }

+ 4 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -12,6 +12,7 @@ import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.AuthService;
 import com.management.platform.util.CheckPicUtil;
 import com.management.platform.util.RedisUtil;
+import com.management.platform.util.WorkDayCalculateUtils;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
@@ -101,12 +102,10 @@ public class TimingTask {
     @Scheduled(fixedRate = 60 * 1000)
     private void process() {
         LocalDateTime now = LocalDateTime.now();
-        int day = now.getDayOfWeek().getValue();
+        LocalDate localDate = LocalDate.now();
 
-
-
-        //周末休息
-        if (day == 7||day==6) {
+        //判断是否是工作日,非工作日不提醒
+        if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
             return;
         }
         DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/Constant.java

@@ -4,9 +4,10 @@ public class Constant {
     public static final int ROLE_EMPLOYEE = 0;
     public static final int ROLE_MASTER = 1;
     public static final int ROLE_MANAGER = 2;
-    public static final int ROLE_SENIOR = 3;
+//    public static final int ROLE_SENIOR = 3;
     public static final int ROLE_HR = 4;
     public static final int ROLE_PMP = 5;
+    public static final int ROLE_LEADER = 6;
 
     public static String[] DEFAULT_BASE_COST_ITEMS = {"人工成本","一般费用","外包费用","其他"};
 }

+ 28 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DateTimeUtil.java

@@ -0,0 +1,28 @@
+package com.management.platform.util;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class DateTimeUtil {
+
+    //把秒转化为时间
+    public static String getTimeFromSeconds(int seconds) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime localDateTime = now.withSecond(0).withHour(0).withMinute(0).withNano(0);
+        localDateTime = localDateTime.plusSeconds(seconds);
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm");
+        String format = dateTimeFormatter.format(localDateTime);
+        System.out.println(format);
+        return format;
+    }
+
+    //把时长秒转化为小时
+    public static double getHoursFromSeconds(int seconds) {
+        double hours = 1.0f * seconds/3600;
+        return hours;
+    }
+
+    public static void main(String[] args) {
+        getTimeFromSeconds(38827);
+    }
+}

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java

@@ -150,6 +150,10 @@ public class WorkDayCalculateUtils {
             if (isWeekend) {
                 //判断周末是否是特殊工作日
                 HashMap<String, String[]> map = YEAR_DEFINE.get(year + "");
+                if (map == null) {
+                    //特殊日期年份尚未录入,周末不算是工作日
+                    return false;
+                }
                 String[] list = map.get(KEY_SPECIAL_WORK_DAYS);
                 if (isInArray(dateStr, list)) {
                     //存在特殊工作日
@@ -160,6 +164,10 @@ public class WorkDayCalculateUtils {
             } else {
                 //判断常规周一到周五,是否是特殊节假日
                 HashMap<String, String[]> map = YEAR_DEFINE.get(year+"");
+                if (map == null) {
+                    //特殊日期年份尚未录入,工作日正常上班
+                    return true;
+                }
                 String[] list = map.get(KEY_SPECIAL_REST_DAYS);
                 if (isInArray(dateStr, list)) {
                     return false;

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

@@ -19,11 +19,12 @@
         <result column="custom_degree_active" property="customDegreeActive" />
         <result column="custom_degree_name" property="customDegreeName" />
         <result column="alert_msg" property="alertMsg" />
+        <result column="sync_corpwx_time" property="syncCorpwxTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time
     </sql>
 
 </mapper>

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

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.UserCorpwxTimeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.UserCorpwxTime">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="corpwx_userid" property="corpwxUserid" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="work_hours" property="workHours" />
+        <result column="company_id" property="companyId" />
+        <result column="wx_corpid" property="wxCorpid" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, corpwx_userid, start_time, end_time, work_hours, company_id, wx_corpid
+    </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
+        WHERE a.create_date BETWEEN #{startDate} AND #{endDate}
+        AND a.company_id = #{companyId}
+        <if test="deptId != null">
+            AND user.`department_id` = #{deptId}
+        </if>
+        ORDER BY a.create_date ASC
+    </select>
+</mapper>

+ 190 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -72,7 +72,7 @@
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReport(-1,0)">填写日报</el-link>
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReport(-1,0)">代填日报</el-link>
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReport(-1,1)">批量填报</el-link>
-                            <el-link type="primary" v-if="user.role==1||user.role==2||user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="importDialog=true">工时导入</el-link>
+                            <el-link type="primary" v-if="user.role==1||user.role==2||user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="importWxDialog=true">工时导入</el-link>
                             
                             <!-- <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReport(-1,1)">批量代填</el-link> -->
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="showExportDialog">导出日报</el-link>
@@ -597,6 +597,83 @@
             </el-upload>
             </p>
         </el-dialog>
+
+        <!--基于企业微信考勤数据的工时导入 -->
+        <el-dialog title="工时批量代填" v-if="importWxDialog" :visible.sync="importWxDialog" customClass="customWidth" width="90%">
+            <!-- <el-steps :active="active" finish-status="success">
+            <el-step title="选择要导入工时的日期范围">
+                
+            </el-step>
+            <el-step title="下载带考勤数据的模板"></el-step>
+            <el-step title="填写模板,上传数据"></el-step>
+
+            </el-steps> -->
+            <div>
+                <span>选择日期范围:</span><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>
+                <el-button style="float:right;" type="primary" @click="submitBatchSubFillData">提交</el-button>
+            </div>
+                <el-table  border :data="checkinList" highlight-current-row v-loading="checkinLoading" :height="520" 
+                :key="timeStamp"
+                style="width: 100%;margin-top:5px;">
+                <el-table-column prop="createDate" label="工作日期"  width="100px" fixed="left"></el-table-column>
+                <el-table-column prop="username" label="员工姓名"   width="80px" fixed="left"></el-table-column>
+                <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">
+                    <template slot-scope="scope">
+                        {{scope.row.workHours.toFixed(1)}}h
+                    </template>
+                </el-table-column>
+                <!--项目名称列表 -->
+                <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
+                    </template>
+                </el-table-column>
+                <el-table-column prop="totalFillTime" label="总工时" fixed="right">
+                    <template slot-scope="scope">
+                        {{scope.row.totalFillTime==null?0.0:scope.row.totalFillTime}}&nbsp;h
+                    </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>
 
@@ -606,6 +683,12 @@
     export default {
         data() {
             return {
+                timeStamp: 0,
+                projectColumns:[],
+                checkinLoading:false,
+                importWxParam:{date:null,},
+                active:0,
+                importWxDialog:false,
                 importDialog:false,
                 denyForm:null,
                 denyReasonDialog:false,
@@ -715,6 +798,112 @@
             };
         },
         methods: {
+            triggerTotalTime(index) {
+                var item = this.checkinList[index];
+                var total = 0.0;
+                for (var i=0;i<this.projectColumns.length; i++) {
+                    var key = this.projectColumns[i]; 
+                    if (item[key] != null && item[key] != '') {
+                        total += parseFloat(item[key]);
+                    }
+                }
+                console.log(total);
+                item.totalFillTime = total;
+                this.timeStamp = new Date();
+            },
+            //提交批量代填的数据
+            submitBatchSubFillData() {
+                var data = JSON.stringify(this.checkinList);
+                this.http.post('/user-corpwx-time/submitProjectTime',{ 
+                    json: data,
+                    projectColumns: JSON.stringify(this.projectColumns)
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.$message({message:'提交成功', type:'success'});
+                        this.importWxDialog = false;
+                    } 
+                },
+                error => {
+                    this.checkinLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+            },
+           
+            loadCheckInData() {
+                if (this.importWxParam.date == null) {
+                    this.checkinList = [];
+                    return;
+                }
+                this.checkinLoading = true;
+                this.http.post('/user-corpwx-time/getMyDeptMembsData',{ 
+                    startDate: this.importWxParam.date[0],
+                    endDate: this.importWxParam.date[1],
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.checkinLoading = false;
+                        this.checkinList = res.data.list;
+                        this.projectColumns = res.data.projects;
+                        console.log(res.data);
+                    } 
+                },
+                error => {
+                    this.checkinLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+            },
+            batchImportWxData(item) {
+                //首先判断文件类型
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "xls" && format != "xlsx") {
+                    this.$message({
+                        message: "请选择.xls或.xlsx文件",
+                        type: "error"
+                    });
+                } else {
+                    this.listLoading = true;
+                    let formData = new FormData();
+                    formData.append("file", item.file);
+                    formData.append("companyId", this.user.companyId);
+                    formData.append("withCheckIn", 1);
+                    this.http.uploadFile('/report/importData', formData,
+                    res => {
+                        this.$refs.upload.clearFiles();
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: "成功导入"+res.data+"名人员的工时数据",
+                                type: "success"
+                            });
+                            this.getReportList();
+                            this.importDialog = false;
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
             batchImportData(item) {
                 //首先判断文件类型
                 let str = item.file.name.split(".");