Browse Source

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

ggooalice 2 năm trước cách đây
mục cha
commit
056fba82ef
49 tập tin đã thay đổi với 1327 bổ sung511 xóa
  1. 23 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  2. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  3. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  4. 14 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  5. 20 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  6. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  7. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  8. 9 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  9. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpInfoController.java
  11. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectRequirementMapper.java
  13. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  14. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  15. 13 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelExportService.java
  16. 9 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  17. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  18. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  19. 151 25
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  20. 102 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  21. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  22. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  23. 123 37
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  24. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProviderInfoServiceImpl.java
  25. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  26. 13 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  27. 8 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SimpleReportServiceImpl.java
  28. 10 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  29. 190 147
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  30. 243 216
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  31. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  32. 63 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  33. 70 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  34. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  35. 9 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectRequirementMapper.xml
  36. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml
  37. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  38. 46 2
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  39. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue
  40. 13 5
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  41. 35 5
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  42. 12 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue
  43. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  44. 8 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  45. 6 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  46. 25 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  47. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  48. 7 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  49. 24 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

+ 23 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -2,14 +2,12 @@ package com.management.platform.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.Company;
-import com.management.platform.entity.Project;
-import com.management.platform.entity.SysConfig;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.UserAgentUtils;
@@ -54,6 +52,8 @@ public class AuthRedirectController {
     RestTemplate restTemplate;
     @Resource
     UserMapper userMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
 
     @RequestMapping("/corpWXAuth")
     public ModelAndView auth(String code, String state) {
@@ -70,6 +70,8 @@ public class AuthRedirectController {
         System.out.println("企微身份:"+obj.toString());
         String wxUserId = obj.getString("UserId");
         String openUserId = obj.getString("open_userid");
+        String corpId = obj.getString("CorpId");
+
         System.out.println("wxUserId="+wxUserId+", openUserId="+openUserId);
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", openUserId));
         if (userList.size() > 0) {
@@ -83,6 +85,23 @@ public class AuthRedirectController {
                 //reqParam.put("errorMsg", "您的账号已停用,无法登录");
                 reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
             }
+        } else {
+            //使用UserId比对,之前有的老用户存的是UserId
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+            if (wxCorpInfo == null) {
+                reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+            } else {
+                User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_userid", wxUserId));
+                if (curUser == null) {
+                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                } else if (curUser.getIsActive() == 1) {
+                    reqParam.put("userId", curUser.getId());
+                } else {
+                    //提示账号已停用
+                    //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                    reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                }
+            }
         }
         reqParam.put("hasTriedAutoLogin", 1);
         String redirecUrl = null;

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

@@ -36,8 +36,8 @@ public class DepartmentController {
     }
 
     @RequestMapping("/listAllMemb")
-    public HttpRespMsg listAllMemb(HttpServletRequest request) {
-        return departmentService.listAllMemb(request);
+    public HttpRespMsg listAllMemb(HttpServletRequest request,String keyword) {
+        return departmentService.listAllMemb(request,keyword);
     }
 
     //获取我可以管辖到的人员列表,进行代填时选择的人员列表用到

+ 6 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java

@@ -2,13 +2,11 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.Company;
-import com.management.platform.entity.FinanceFixedcolname;
-import com.management.platform.entity.FinanceTblcuscol;
-import com.management.platform.entity.TimeType;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.FinanceTblcuscolMapper;
 import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.FinanceFixedcolnameService;
 import com.management.platform.service.FinanceService;
 import com.management.platform.util.ExcelUtil;
@@ -51,6 +49,8 @@ public class FinanceController {
     private FinanceFixedcolnameService financeFixedcolnameService;
     @Resource
     private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -130,6 +130,7 @@ public class FinanceController {
 
         List<String> heads = new ArrayList<>();
         Company company = companyMapper.selectById(companyId);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         //判断是否启用了工号模式
         TimeType timeType = timeTypeMapper.selectById(companyId);
         if (timeType.getFinanceJobnumEnabled() == 1) {
@@ -154,7 +155,7 @@ public class FinanceController {
         allList.add(heads);
         //String fileName = company.getCompanyName()+"_财务人员成本模板";
         String fileName = MessageUtils.message("fileName.financialCost",company.getCompanyName());
-        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allList, path);
+        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, allList, path);
 
         return msg;
     }

+ 14 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -66,6 +66,15 @@ public class ProjectController {
     private UserMapper userMapper;
     @Resource
     private OperationRecordService operationRecordService;
+    @RequestMapping("/testRead")
+    public HttpRespMsg testRead(String jobId) {
+        return projectService.testRead(jobId);
+    }
+
+    @RequestMapping("/testAdd")
+    public HttpRespMsg testAdd(String jobId) {
+        return projectService.testAdd(jobId);
+    }
 
     /**
      * 获取我参与的全部项目的负责人列表
@@ -556,8 +565,11 @@ public class ProjectController {
     }
 
     @RequestMapping("/exportData")
-    public HttpRespMsg exportData() {
-        return projectService.exportData(request);
+    public HttpRespMsg exportData(String keyword,
+                                  @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                                  Integer projectId, //可以直接传projectId来进行匹配
+                                  Integer status, Integer category,Integer projectMainId,Integer deptId,String inchagerId,String participation) {
+        return projectService.exportData(keyword,searchField,projectId,status,category,projectMainId,deptId,inchagerId,participation,request);
     }
 
     @RequestMapping("/exportGroupData")

+ 20 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java

@@ -59,6 +59,8 @@ public class ProjectRequirementController {
     private TaskMapper taskMapper;
     @Resource
     private GroupParticipatorMapper groupParticipatorMapper;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectRequirement record) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -77,6 +79,7 @@ public class ProjectRequirementController {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
         HttpRespMsg msg = new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         int startIndex = (pageIndex-1)*pageSize;
         LocalDate now = LocalDate.now();
         now = now.minusDays(7);
@@ -93,7 +96,7 @@ public class ProjectRequirementController {
             taskGroupUserIds=groupParticipatorList.stream().map(GroupParticipator::getUserId).collect(Collectors.toList());
             taskGroupUserIds.add("-1");
         }
-        List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate,taskGroupUserIds.size()==0?null:taskGroupUserIds);
+        List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(wxCorpInfo.getSaasSyncContact(),companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate,taskGroupUserIds.size()==0?null:taskGroupUserIds);
         List<Integer> ids = projectRequirements.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
         List<Task> milepostList=taskMapper.selectMilepost(ids.size()==0?null:ids);
         projectRequirements.forEach(pr->{
@@ -116,6 +119,7 @@ public class ProjectRequirementController {
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         LocalDate now = LocalDate.now();
         now = now.minusDays(7);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
@@ -130,7 +134,7 @@ public class ProjectRequirementController {
             taskGroupUserIds=groupParticipatorList.stream().map(GroupParticipator::getUserId).collect(Collectors.toList());
             taskGroupUserIds.add("-1");
         }
-        List<ProjectRequirement> projectRequirementList = projectRequirementMapper.customSelect(companyId,startDate, projectId,  projectIds.size()==0?null:projectIds, null, null,null,null,taskGroupUserIds.size()==0?null:taskGroupUserIds);
+        List<ProjectRequirement> projectRequirementList = projectRequirementMapper.customSelect(wxCorpInfo.getSaasSyncContact(),companyId,startDate, projectId,  projectIds.size()==0?null:projectIds, null, null,null,null,taskGroupUserIds.size()==0?null:taskGroupUserIds);
         List<Integer> collect = projectRequirementList.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
         List<Task> milepostList=taskMapper.selectMilepost(collect);
         projectRequirementList.forEach(pr->{
@@ -147,9 +151,21 @@ public class ProjectRequirementController {
         dataList.add(nameList);
         projectRequirementList.forEach(pr->{
             List<String> resultData=new ArrayList<>();
+            List<String> corpwxUseridList=new ArrayList<>();
+            if(pr.getActiveUsers()!=null){
+                String[] split = pr.getActiveUsers().split(",");
+                Arrays.asList(split).forEach(st->{
+                    corpwxUseridList.add("$userName="+st+"$");
+                });
+            }
+            String userString = corpwxUseridList.toString();
             resultData.add(pr.getProjectCode());
             resultData.add(pr.getProjectName());
-            resultData.add(pr.getActiveUsers());
+            if(wxCorpInfo.getSaasSyncContact()==1){
+                resultData.add(userString.replaceAll("\\[","").replaceAll("]",""));
+            }else {
+                resultData.add(pr.getActiveUsers());
+            }
             resultData.add(pr.getMembReq());
             resultData.add(pr.getTaskReq());
             resultData.add(pr.getContractReq());
@@ -177,7 +193,7 @@ public class ProjectRequirementController {
         //生成excel文件导出
         //String fileName = "资源需求统计报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.resourceDemand",System.currentTimeMillis());
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         httpRespMsg.data=resp;
         return httpRespMsg;
     }

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1270,6 +1270,23 @@ public class ReportController {
         return reportService.exportUserDailyWorkTime(request, startDate, endDate);
     }
 
+    @RequestMapping("/isWorkDay")
+    public HttpRespMsg isWorkDay(String date) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        if (token == null) {
+            //
+            //msg.setError("请求非法");
+            msg.setError(MessageUtils.message("request.illegal"));
+            System.err.println("==有非法请求===" + date);
+        } else {
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate lDate = LocalDate.parse(date, dtf);
+            msg.data = WorkDayCalculateUtils.isWorkDay(lDate);
+        }
+        return msg;
+    }
+
     /**
      * 计算给定时间段内的工作日数量
      * @param startDate 开始日期

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

@@ -77,8 +77,8 @@ public class UserController {
     }
 
     @RequestMapping("/getSimpleActiveUserList")
-    public HttpRespMsg getSimpleActiveUserList(Integer departmentId) {
-        return userService.getSimpleActiveUserList(departmentId, request);
+    public HttpRespMsg getSimpleActiveUserList(Integer departmentId,String keyword) {
+        return userService.getSimpleActiveUserList(departmentId,request,keyword);
     }
 
     @RequestMapping("/getUserListByRole")

+ 9 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -62,6 +62,8 @@ public class UserCorpwxTimeController {
     CompanyMapper companyMapper;
     @Resource
     SysFunctionMapper sysFunctionMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
 
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -228,6 +230,7 @@ public class UserCorpwxTimeController {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         Integer manageDeptId = user.getManageDeptId();
 
         HttpRespMsg ret = getMyDeptMembsData(startDate, endDate);
@@ -271,7 +274,11 @@ public class UserCorpwxTimeController {
             String createDate = (String)dataItem.get("createDate");
             dataList.add(createDate);
             dataList.add((String)dataItem.get("weekDayTxt"));
-            dataList.add((String)dataItem.get("username"));
+            if(wxCorpInfo.getSaasSyncContact()==1){
+                dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else{
+                dataList.add((String)dataItem.get("username"));
+            }
             dataList.add((String)dataItem.get("startTime"));
             dataList.add((String)dataItem.get("endTime"));
 //            dataList.add(""+(Double)dataItem.get("cardTime"));
@@ -291,7 +298,7 @@ public class UserCorpwxTimeController {
         }
         //fileName += "_人员工时统计模板"+startDate+"至"+endDate;
         fileName += MessageUtils.message("fileName.workHour",startDate,endDate);
-        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allData, path);
+        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, allData, path);
         return msg;
     }
 }

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

@@ -8,6 +8,7 @@ import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
+import com.management.platform.service.impl.ExcelExportServiceImpl;
 import com.management.platform.util.*;
 import com.qq.weixin.mp.aes.AesException;
 import com.qq.weixin.mp.aes.WXBizMsgCrypt;
@@ -413,6 +414,7 @@ public class WeiXinCorpController {
                     result.setJobId(jobId);
                     result.setJobType(jobType);
                     corpwxJobResultMapper.insert(result);
+                    ExcelExportServiceImpl.corpwxJobCenter.put(jobId, result);
                 }
             }
         } catch (Exception e) {

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

@@ -68,7 +68,7 @@ public class WxCorpInfoController {
         jsonObj.put("value", "测试提醒消息");
         dataJson.add(jsonObj);
         json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
         json.put("content_item",dataJson);
         wxCorpInfoService.sendWXCorpTemplateMsg(corpInfo, corpUid, json);
         return new HttpRespMsg();

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -353,6 +353,9 @@ public class Project extends Model<Project> {
 
     @TableField(exist = false)
     List<TaskGroup> taskGroupList;
+    
+    @TableField(exist = false)
+    private String levelString;
 
     @Override
     protected Serializable pkVal() {

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectRequirementMapper.java

@@ -15,7 +15,7 @@ import java.util.List;
  */
 public interface ProjectRequirementMapper extends BaseMapper<ProjectRequirement> {
 
-    public List<ProjectRequirement> customSelect(Integer companyId, String startDate, Integer projectId, List<Integer> refProjectIdList, Integer startIndex, Integer pageSize,String reStartDate,String reEndDate,List<String> refTaskGroupUserIdList);
+    public List<ProjectRequirement> customSelect(Integer key,Integer companyId, String startDate, Integer projectId, List<Integer> refProjectIdList, Integer startIndex, Integer pageSize,String reStartDate,String reEndDate,List<String> refTaskGroupUserIdList);
 
     long selectCountByDate(Integer companyId, String startDate, Integer projectId, List<Integer> refProjectIdList, Integer startIndex, Integer pageSize, String reStartDate, String reEndDate,List<String> refTaskGroupUserIdList);
 }

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -19,7 +20,7 @@ import java.util.List;
  * @since 2021-04-19
  */
 public interface TaskMapper extends BaseMapper<Task> {
-    List getExecutorPanel(Integer projectId);
+    List<Map<String,Object>> getExecutorPanel(Integer projectId);
     List getStagesPanel(Integer projectId);
     List getTopCostTask(Integer projectId);
 
@@ -44,7 +45,7 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List<Task> selectMilepost(@Param("ids") List<Integer> ids);
 
-    List getExecutorPlanHour(Integer projectId);
+    List<Map<String,Object>> getExecutorPlanHour(Integer projectId);
     @Update("update task set start_date =null where id=#{id}")
     void updateStartDate(Integer id);
     @Update("update task set end_date =null where id=#{id}")

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

@@ -33,7 +33,7 @@ public interface DepartmentService extends IService<Department> {
 
     HttpRespMsg exportUserStatistic(String startDate, String endDate, String userIds, HttpServletRequest request);
 
-    HttpRespMsg listAllMemb(HttpServletRequest request);
+    HttpRespMsg listAllMemb(HttpServletRequest request,String keyword);
 
     HttpRespMsg listMyMembs(HttpServletRequest request);
 

+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelExportService.java

@@ -0,0 +1,13 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.util.HttpRespMsg;
+
+import java.util.List;
+
+public interface ExcelExportService {
+    public void testRead(String jobId);
+    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception;
+
+    void testAdd(String jobId);
+}

+ 9 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectSeparate;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -107,7 +108,10 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg getDegreeCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
 
-    HttpRespMsg exportData(HttpServletRequest request);
+    HttpRespMsg exportData(String keyword,
+                           @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                           Integer projectId, //可以直接传projectId来进行匹配
+                           Integer status, Integer category,Integer projectMainId,Integer deptId,String inchagerId,String participation,HttpServletRequest request);
 
     HttpRespMsg exportGroupData(HttpServletRequest request);
 
@@ -192,4 +196,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg removeDuplicateParticipators(Integer companyId, HttpServletRequest request);
 
     HttpRespMsg synchronizationProject(String dataJson);
+
+    HttpRespMsg testRead(String jobId);
+
+    HttpRespMsg testAdd(String jobId);
 }

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

@@ -68,7 +68,7 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg batchUpdateRole(String userIds, Integer roleId, HttpServletRequest request);
 
-    HttpRespMsg getSimpleActiveUserList(Integer departmentId, HttpServletRequest request);
+    HttpRespMsg getSimpleActiveUserList(Integer departmentId, HttpServletRequest request,String keyword);
 
     HttpRespMsg getUserListByRole(HttpServletRequest request);
 

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

@@ -32,7 +32,7 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
 
     HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo);
 
-    public List<LeaveSheet> WxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> ApprovalLeave) throws Exception;
+    public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception;
 
     public String getProviderAccessToken() throws Exception;
 

+ 151 - 25
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -1,7 +1,10 @@
 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.DepartmentMasterVO;
 import com.management.platform.entity.vo.DepartmentVO;
@@ -12,9 +15,12 @@ import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -61,6 +67,13 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     private AuditWorkflowSettingMapper auditWorkflowSettingMapper;
     @Resource
     private DepartmentOtherManagerMapper departmentOtherManagerMapper;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Value("${corpId}")
+    private String corpId;
+    @Value("${providerSecret}")
+    private String providerSecret;
     //新增部门
     @Override
     public HttpRespMsg insertDepartment(String departmentName, Integer superiorId, String managerId, String reportAuditUserid,String otherManagerIds,  HttpServletRequest request) {
@@ -584,6 +597,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         try {
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             //当前用户管理部门
             List<Integer> deptIds=null;
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
@@ -639,7 +653,11 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     dataMap.put("time", time);
                     tempList.add(dataMap);
                 } else {
-                    names.add((String)map.get("user"));
+                    if(wxCorpInfo.getSaasSyncContact()==1){
+                        names.add("$userName="+(String)map.get("corpwxUseid")+"$");
+                    }else {
+                        names.add((String)map.get("user"));
+                    }
                     //这个名字尚未装进数组中
                     List<Map<String, Object>> tempList = new ArrayList<>();
                     if (map.containsKey("project")) {
@@ -731,7 +749,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //生成excel文件导出
             //String fileName = "人员成本统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.costStatistics",System.currentTimeMillis());
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
 
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
@@ -742,9 +760,78 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return httpRespMsg;
     }
 
+    //获取provider_access_token
+    private String getProviderAccessToken() {
+        if (WeiXinCorpController.SUITE_ACCESS_TOKEN == null || WeiXinCorpController.suiteTokenExpireTime < System.currentTimeMillis()) {
+            //失效了,需要重新获取
+            String url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
+            HttpHeaders headers = new HttpHeaders();
+            RestTemplate restTemplate = new RestTemplate();
+            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+            headers.setContentType(type);
+            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+            JSONObject reqParam = new JSONObject();
+            reqParam.put("corpid", corpId);
+            reqParam.put("provider_secret", providerSecret);
+            HttpEntity<JSONObject> Entity = new HttpEntity<>(reqParam, headers);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, Entity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                JSONObject obj = JSONObject.parseObject(resp);
+                if (obj.getIntValue("errcode") == 0) {
+                    UserServiceImpl.provider_access_token = obj.getString("provider_access_token");
+                    UserServiceImpl.providerTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+                }
+            }
+        }
+        return UserServiceImpl.provider_access_token;
+    }
+
+    //根据关键词查询微信通讯录人员的openid以及部门
+    //keyword不可为空格或空字符串,否则请求参数错误
+    private Object[] getOpenId(String corpId,String keyword) {
+        Object[] user = null;
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/search?provider_access_token=ACCESS_TOKEN";
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        String providerToken = getProviderAccessToken();
+        if (providerToken!=null){
+            //搜索通讯录名单
+            url = url.replace("ACCESS_TOKEN", providerToken);
+            JSONObject requestMap = new JSONObject();
+            requestMap.put("auth_corpid", corpId);
+            requestMap.put("query_word", keyword);
+            requestMap.put("query_type", 0);
+            requestMap.put("query_range", 1);
+            requestMap.put("limit", 200);
+            //requestMap.put("cursor", pageSize);
+            HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+            ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+            if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = ResponseEntity.getBody();
+                JSONObject respJson = JSONObject.parseObject(resp);
+                    if (respJson.getInteger("errcode")==0){
+                        JSONObject queryResult = respJson.getJSONObject("query_result");
+                        if (!queryResult.isEmpty()){
+                            JSONArray jsonArray = queryResult.getJSONObject("user").getJSONArray("open_userid");
+                            if (jsonArray!=null){
+                                user = jsonArray.toArray();
+                            }
+                        }
+                    }
+            }
+        }
+        return user;
+    }
+
     @Override
-    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+    public HttpRespMsg listAllMemb(HttpServletRequest request,String keyword) {
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<HashMap> userMapList = new ArrayList<>();
         HttpRespMsg departmentList = departmentService.getDepartmentList(request);
         List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
         //加上未分配的部门
@@ -753,22 +840,53 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         //unAssignedDept.setLabel("未分配");
         unAssignedDept.setLabel(MessageUtils.message("department.noDistribution"));
         list.add(unAssignedDept);
-
-        //获取公司全部人员
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
-        List<HashMap> userMapList = new ArrayList<>();
-        for (User u : userList) {
-            HashMap<String, Object> user = new HashMap<String, Object>();
-            user.put("id", u.getId());
-            user.put("name", u.getName());
-            user.put("departmentId", u.getDepartmentId());
-            userMapList.add(user);
+        //通讯录查询人员
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
+            Object[] users = getOpenId(wxCorpInfo.getCorpid(), keyword);
+            if (users!=null){
+                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
+                List<DepartmentVO> temp = new ArrayList<>();
+                //重新封装list集合,把没有查询人员的部门去掉
+                if (realUser.size()!=0){
+                    for (DepartmentVO departmentVO : list) {
+                        for (User user : realUser) {
+                            if (departmentVO.getId() == user.getDepartmentId()){
+                                temp.add(departmentVO);
+                                continue;
+                            }
+                        }
+                    }
+                    list = temp;
+                    for (User u : realUser) {
+                        HashMap<String, Object> user = new HashMap<String, Object>();
+                        user.put("id", u.getId());
+                        user.put("name", u.getName());
+                        user.put("departmentId", u.getDepartmentId());
+                        userMapList.add(user);
+                        fillDeptUser(list, userMapList);
+                        msg.data = list;
+                        return msg;
+                    }
+                }
+            }
+            ArrayList<Object> emptyList = new ArrayList<>();
+            msg.data = emptyList;
+            return msg;
+        }else {
+            //获取公司全部人员
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+            for (User u : userList) {
+                HashMap<String, Object> user = new HashMap<String, Object>();
+                user.put("id", u.getId());
+                user.put("name", u.getName());
+                user.put("departmentId", u.getDepartmentId());
+                userMapList.add(user);
+            }
+            fillDeptUser(list, userMapList);
+            msg.data = list;
+            return msg;
         }
-        fillDeptUser(list, userMapList);
-
-        HttpRespMsg msg = new HttpRespMsg();
-        msg.data = list;
-        return msg;
     }
 
     @Override
@@ -834,6 +952,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             HttpRespMsg msg = getUserCustomDataStatistic(startDate, endDate, null, request);
             Map<String, Object> map = (Map<String, Object>) msg.data;
             List<HashMap> itemList = (List<HashMap>) map.get("list");
@@ -854,7 +973,11 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             for (Map<String, Object> membMap : itemList) {
                 List<String> membRowData = new ArrayList<String>();
                 membRowData.add(String.valueOf(seq));
-                membRowData.add((String)membMap.get("name"));
+                if(wxCorpInfo.getSaasSyncContact()==1){
+                    membRowData.add("$userName="+(String)membMap.get("name")+"$");
+                }else {
+                    membRowData.add((String)membMap.get("name"));
+                }
                 membRowData.add(((Double)membMap.get("cost")).toString());
                 allList.add(membRowData);
                 totalCostTime += (Double)membMap.get("cost");
@@ -870,7 +993,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //生成excel文件导出
             //String fileName = timeType.getCustomDataName() + "统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.statistics",timeType.getCustomDataName(),System.currentTimeMillis());
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
 
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
@@ -899,7 +1022,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             List<Integer> deptIds = null;
             List<Department> allDeptList = null;
             //首先校验有无权限
@@ -934,9 +1057,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             Double totalCost = 0.0;
             for (Map<String, Object> map : list) {
 
-                if (tempMap.containsKey(map.get("user"))) {
+                if (tempMap.containsKey(wxCorpInfo.getSaasSyncContact()==1?map.get("corpwxUserid"):map.get("user"))) {
                     //这个名字已经装进数组中了
-                    List<Map<String, Object>> tempList = tempMap.get(map.get("user"));
+                    List<Map<String, Object>> tempList = tempMap.get(wxCorpInfo.getSaasSyncContact()==1?map.get("corpwxUserid"):map.get("user"));
                     Map<String, Object> dataMap = new HashMap<>();
                     dataMap.put("project", map.get("project"));
                     Double cost = (Double) map.getOrDefault("cost", 0);
@@ -947,6 +1070,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     User user = new User();
                     user.setId((String)map.get(("id")));
                     user.setName((String)map.get("user"));
+                    user.setCorpwxUserid((String)map.get("corpwxUserid"));
                     userList.add(user);
                     //这个名字尚未装进数组中
                     List<Map<String, Object>> tempList = new ArrayList<>();
@@ -958,7 +1082,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                         dataMap.put("cost", cost);
                         tempList.add(dataMap);
                     }
-                    tempMap.put((String) map.get("user"), tempList);
+                    tempMap.put((String) (wxCorpInfo.getSaasSyncContact()==1?map.get("corpwxUserid"):map.get("user")), tempList);
                 }
             }
             Map<String, Object> finalMap = new HashMap<>();
@@ -1010,6 +1134,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     public HttpRespMsg exportDeptStatistic(String startDate, String endDate, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
+            Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             HttpRespMsg msg = getDepartmentStatistics(null, startDate, endDate, request);
             Map<String,Object> mapData = (Map<String, Object>) msg.data;
             List<DepartmentMasterVO> costList = (List<DepartmentMasterVO>) mapData.get("costList");
@@ -1053,7 +1179,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //生成excel文件导出
             //String fileName = "部门工时统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.depHours",System.currentTimeMillis());
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
             e.printStackTrace();

+ 102 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -0,0 +1,102 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.CorpwxJobResult;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.CorpwxJobResultMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+public class ExcelExportServiceImpl implements ExcelExportService {
+    //用于控制线程锁
+    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+
+    @Resource
+    private CorpwxJobResultMapper corpwxJobResultMapper;
+
+    @Transactional(isolation = Isolation.READ_COMMITTED)
+    public void testRead(String jobId) {
+        System.out.println("Enter ExcelExportService testRead@@@");
+        int i = 0;
+        while (i < 10) {
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+//            CorpwxJobResult corpwxJobResult = corpwxJobResultMapper.selectById(jobId);
+            CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+//            CorpwxJobResult item = new CorpwxJobResult();
+//            item.setJobId("444");
+//            corpwxJobResultMapper.insert(item);
+            if (corpwxJobResult != null) {
+                System.out.println("===读取到了====");
+                corpwxJobCenter.remove(jobId);
+                break;
+            } else {
+                System.out.println("===无匹配记录====");
+            }
+            i++;
+        }
+    }
+
+    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception {
+        String result = "系统提示:Excel文件导出成功!";
+        String fileName = title + ".xls";
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(null, title, list, downloadPath);
+        String fileUrlSuffix = title + ".xls";
+        if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
+            String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+            String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            while (i < 10) {
+                Thread.sleep(300);
+                CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+                if (corpwxJobResult != null) {
+                    if (corpwxJobResult.getErrCode() == 0) {
+                        syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                        corpwxJobCenter.remove(jobId);
+                    } else {
+                        httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                        return httpRespMsg;
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                httpRespMsg.setError("处理超时...");
+            }
+        }else {
+            httpRespMsg.data = resp;
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public void testAdd(String jobId) {
+        CorpwxJobResult corpwxJobResult = new CorpwxJobResult();
+        corpwxJobResult.setJobId(jobId);
+        corpwxJobCenter.put(jobId, corpwxJobResult);
+//        corpwxJobResultMapper.insert(corpwxJobResult);
+    }
+}

+ 6 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -75,6 +75,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     private ProjectCategoryMapper projectCategoryMapper;
     @Resource
     FinanceProjectsService financeProjectsService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -456,6 +458,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
             boolean isSecret = timeType.getIsSecretSalary()==1?true:false;
             final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
@@ -1076,7 +1079,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //生成excel文件导出
             //String fileName = yearMonth+(groupByCategory==0?"财务人员成本_":"财务项目分类成本_")+System.currentTimeMillis();
             String fileName = yearMonth+(groupByCategory==0?MessageUtils.message("fileName.costFinancialPersonnel"):MessageUtils.message("fileName.proClassCost"))+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
 
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
@@ -1348,6 +1351,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
             Company company = companyMapper.selectById(companyId);
             BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
@@ -1488,7 +1492,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //生成excel文件导出
             //String fileName = "人员薪资_"+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.perSal")+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
             e.printStackTrace();

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

@@ -63,6 +63,8 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
     SysFunctionMapper sysFunctionMapper;
     @Resource
     DepartmentService departmentService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
 
     @Override
     public HttpRespMsg add(LeaveSheet sheet, String userId) {
@@ -241,6 +243,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
     public HttpRespMsg exportLeaveData(String userId,Integer status,Integer leaveType,String startTime,String endTime) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Integer companyId = userMapper.selectById(userId).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         QueryWrapper<LeaveSheet> qw = new QueryWrapper<LeaveSheet>()
                 .select("owner_name", "tel", "leave_type", "start_date","end_date","time_days", "time_hours", "status", "remark")
                 .eq("company_id", companyId)
@@ -340,7 +343,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         }
         //String fileName = "请假信息_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.leaveInfo")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
         httpRespMsg.data = resp;
         return httpRespMsg;
     }

+ 123 - 37
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -38,8 +38,11 @@ import org.assertj.core.util.Lists;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
@@ -76,6 +79,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private HttpServletRequest request;
     @Resource
+    ExcelExportService excelExportService;
+    @Resource
     private ProjectNotifyUserService projectNotifyUserService;
     @Resource
     private GroupParticipatorMapper groupParticipatorMapper;
@@ -185,6 +190,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     TaskGroupService taskGroupService;
     @Resource
     GroupTemplateMapper GroupTemplateMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
 
     @Resource
     private HttpServletResponse response;
@@ -1107,6 +1114,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         try {
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -1325,13 +1333,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //生成excel文件导出
             //String fileName = "项目成本工时统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.projectCost")+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
-            httpRespMsg.data = resp;
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败");
             httpRespMsg.setError(MessageUtils.message("access.verificationError"));
             return httpRespMsg;
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            httpRespMsg.setError(exception.getMessage());
         }
         return httpRespMsg;
     }
@@ -1667,6 +1677,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         //判断用户的角色,如果是管理员和负责人,查看全部的。如果是普通员工,只能是看到参与的项目
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -1701,7 +1712,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "项目报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectReport")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -1744,7 +1755,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
-
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
@@ -1789,7 +1800,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "项目任务报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectTaskReport")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -1839,6 +1850,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
         List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
@@ -1876,7 +1888,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "项目成本报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectCostReport")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -1945,6 +1957,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
         List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
@@ -1992,7 +2005,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "项目收支平衡报表(利润表)_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.profitSta")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -2003,7 +2016,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
-
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         List<CustomerProject> projectList = projectMapper.getCustomerProjectInAndOut(companyId, null, null,null,null);
         List<List<String>> exportList = new ArrayList<>();
         //String[] titles = {"客户名称", "相关项目", "合同金额", "人工成本", "一般费用", "差旅费用","外包费用", "总费用", "利润", "利润率"};
@@ -2061,7 +2074,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "客户项目利润报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.cusPro")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -2521,6 +2534,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HttpRespMsg msg = new HttpRespMsg();
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
@@ -2587,7 +2601,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //String fileName = "项目阶段工时报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.ProPeriodWork")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, dataList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, dataList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -3018,6 +3032,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     project.setCreatorId(userId);
                     project.setCreatorName(user.getName());
                     project.setProjectName(name);
+                    project.setCreateDate(LocalDate.now());
 
                     //处理人员
                     if (inchargerCell != null) {
@@ -3452,6 +3467,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     project.setCreatorId(userId);
                     project.setCreatorName(user.getName());
                     project.setProjectName(name);
+                    project.setCreateDate(LocalDate.now());
 
                     //处理人员
                     if (inchargerCell != null) {
@@ -4142,7 +4158,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg exportData(HttpServletRequest request) {
+    public HttpRespMsg exportData(String keyword,
+                                  @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                                  Integer projectId, //可以直接传projectId来进行匹配
+                                  Integer status, Integer category,Integer projectMainId,Integer deptId,String inchagerId,String participation,HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
@@ -4152,12 +4171,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //无全部项目权限,只能导出自己相关的(创建或参与)
             userId = user.getId();
         }
-        HttpRespMsg projectPage = getProjectPage(null, null, null, null, null, null, null, null,null, null, null,null,null, request);
+        HttpRespMsg projectPage = getProjectPage(null, null, keyword, searchField, status, category, projectId, projectMainId,deptId, null, null,inchagerId,participation, request);
         List<ProjectKeyNodesSetting> projectKeyNodesSettingList = projectKeyNodesSettingMapper.selectList(new QueryWrapper<ProjectKeyNodesSetting>().eq("company_id", user.getCompanyId()));
         Map<String,Object> resultMap= (Map<String, Object>) projectPage.data;
         List<ProjectVO> projectVOList= (List<ProjectVO>) resultMap.get("records");
         List<String> nameList= (List<String>) resultMap.get("nameList");
         Company company = companyMapper.selectById(user.getCompanyId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
         List<String> headList = new ArrayList<String>();
 //        headList.add("项目编号");
 //        headList.add("项目分类");
@@ -4335,8 +4355,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     rowData.add("");
                     rowData.add("");
                 }
-                Integer status = projectVO.getStatus();
-                switch (status){
+                Integer state = projectVO.getStatus();
+                switch (state){
                     //case 0:rowData.add("全部");
                     case 0:rowData.add(MessageUtils.message("excel.whole"));
                         break;
@@ -4373,7 +4393,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "项目导出_"+company.getCompanyName()+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.proExport")+company.getCompanyName()+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,allList,path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
 
@@ -4384,6 +4404,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg exportGroupData(HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         List<HashMap<String, Object>> list = projectMapper.getExportGroupData(user.getCompanyId());
         List<List<String>> allList = new ArrayList<>();
         List<String> headList = new ArrayList<String>();
@@ -4409,7 +4430,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "项目分组_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.proGroup")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
         return httpRespMsg;
@@ -4452,6 +4473,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
             List<String> headList = new ArrayList<String>();
 //            headList.add("序号");
@@ -4530,7 +4552,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //生成excel文件导出
             //String fileName = timeType.getCustomDataName() + "统计_"+System.currentTimeMillis();
             String fileName = timeType.getCustomDataName() + MessageUtils.message("Statistics.tj")+"_"+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
 
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
@@ -4822,7 +4844,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
-
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         List<HashMap> projectList = projectMapper.getBaseCostAndRealCost(companyId, null, null, null);
         List<List<String>> exportList = new ArrayList<>();
         //String[] titles = {"项目编号", "项目名称", "当前总预算","当前剩余预算","总剩余预算","已发生总工时成本"};
@@ -4915,7 +4937,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         //String fileName = "工时成本预警表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.hourCostAlert")+System.currentTimeMillis();
-        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
         httpRespMsg.data =  pathPrefix + fileName+".xls";
         return httpRespMsg;
     }
@@ -5183,6 +5205,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //根据系统配置的员工成本计算方式,按固定时薪还是固定月薪,分情况计算。
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -5328,7 +5351,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //生成excel文件导出
             //String fileName = "项目分类工时成本统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.proClassLaborCost")+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
             e.printStackTrace();
@@ -5394,6 +5417,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司工时分配");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门工时分配");
         List<Integer> deptIds=null;
@@ -5437,7 +5461,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "人员工时分配统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perHoursAllSta")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         msg.data = resp;
         return msg;
     }
@@ -5604,7 +5628,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 BigDecimal divide;
                 if(days!=0){
                      divide = bigDecimal.divide(BigDecimal.valueOf(days), 2, BigDecimal.ROUND_HALF_UP);
-                }else if(days==0&&num!=0){
+                }else if(days==0){
                     divide=new BigDecimal(1);
                     //查看当天有请假直接算100%
                 }else if (days==0&&num!=0&&leaveSheetList.size()>0){
@@ -5624,7 +5648,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 BigDecimal divide;
                 if(days!=0){
                     divide = bigDecimal.divide(BigDecimal.valueOf(days), 2, BigDecimal.ROUND_HALF_UP);
-                }else if(days==0&&num!=0){
+                }else if(days==0){
                     divide=new BigDecimal(1);
                     //查看当天有请假直接算100%
                 }else if (days==0&&num!=0&&leaveSheetList.size()>0){
@@ -5654,6 +5678,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg exportReportTimelinessRate(HttpServletRequest request, String startDate, String endDate) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HttpRespMsg msg = getUserReportTimelinessRate(request, startDate, endDate, null, null, null, null);
         HashMap map= (HashMap) msg.data;
         List<TimelinessRateVO> list = (List<TimelinessRateVO>) map.get("list");
@@ -5673,7 +5699,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "人员填报及时率统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.timePerFill")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         httpRespMsg.data = resp;
         return httpRespMsg;
     }
@@ -5718,6 +5744,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg exportWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,String startDate,String endDate) {
         HttpRespMsg msg = getWaitingReviewList(request, stateKey, userId, null, null,startDate,endDate,null);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HashMap resultmap= (HashMap) msg.data;
         List<Map<String,Object>> list= (List<Map<String, Object>>) resultmap.get("result");
         List<List<String>> dataList=new ArrayList<>();
@@ -5733,7 +5761,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "人员待审核统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perReviewed")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         msg.data = resp;
         return msg;
     }
@@ -5849,6 +5877,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg exportUserWorkingTimeStatic(String startDate, String endDate, HttpServletRequest request, String userId, Integer departmentId) {
         HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HttpRespMsg httpRespMsg = getUserWorkingTimeStatic(startDate, endDate, null, null, request, userId, departmentId);
         Map<String,Object> data = (Map<String, Object>) httpRespMsg.data;
         List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
@@ -5880,7 +5910,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "人员工时统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perHoursSta")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         msg.data = resp;
         return msg;
     }
@@ -6293,6 +6323,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg exportProjectBaseCost(HttpServletRequest request) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         HttpRespMsg projectBaseCost = getProjectBaseCost(null, request, null, null);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HashMap map= (HashMap) projectBaseCost.data;
         List<Project> resultProjectList= (List<Project>) map.get("result");
         List<List<String>> dataList=new ArrayList<>();
@@ -6323,7 +6355,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = "项目成本基线表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("Statistics.ProjectCostBase")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         httpRespMsg.data = resp;
         return httpRespMsg;
     }
@@ -6392,6 +6424,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg exportTimeCostByUserCustom(String startDate, String endDate, String subCustomName, Integer customId, HttpServletRequest request, String fieldName) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         User targetUser = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", targetUser.getCompanyId()));
         List<SysRichFunction> functionTimeList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看工时统计");
         List<SysRichFunction> functionCostList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看成本统计");
         HttpRespMsg msg = getTimeCostByUserCustom(startDate, endDate, null, customId, request, fieldName);
@@ -6424,7 +6457,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //生成excel文件导出
         //String fileName = userCustom.getName()+"工时成本统计_"+System.currentTimeMillis();
         String fileName = userCustom.getName()+MessageUtils.message("fileName.hourCost")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         httpRespMsg.data = resp;
 
         return httpRespMsg;
@@ -6754,7 +6787,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             msg.setError(MessageUtils.message("other.tokenOverdue"));
             return msg;
         }
+        TimeType timeType = timeTypeMapper.selectById(thirdPartyInterface.getCompanyId());
         List<Project> allProject = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        List<ProjectStage> projectStageList = projectStageMapper.selectList(new QueryWrapper<ProjectStage>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        List<ProjectCategory> projectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", thirdPartyInterface.getCompanyId()));
         String message="";
         List<Project> changeProjectList=new ArrayList<>();
         List<Project> inertProjectList=new ArrayList<>();
@@ -6766,6 +6805,37 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(first.isPresent()){
                         continue;
                     }
+                    if(timeType.getMainProjectState()==1){
+                        Optional<ProjectMain> mainOptional = projectMainList.stream().filter(pm -> pm.getName().equals(project.getProjectMainName())).findFirst();
+                        if(mainOptional.isPresent()){
+                            project.setProjectMainId(mainOptional.get().getId());
+                            project.setCategoryName(mainOptional.get().getCategoryName());
+                            project.setCategory(mainOptional.get().getCategoryId());
+                        }else project.setProjectMainName(null);
+                    }else {
+                        Optional<ProjectCategory> category = projectCategoryList.stream().filter(pc -> pc.getName().equals(project.getCategoryName())).findFirst();
+                        if(category.isPresent()){
+                            project.setProjectMainId(null);
+                            project.setProjectMainName(null);
+                            project.setCategoryName(category.get().getName());
+                            project.setCategory(category.get().getId());
+                        }else project.setCategoryName(null);
+                    }
+                    if(timeType.getProjectLevelState()==1){
+                        Optional<ProjectLevel> level = projectLevelList.stream().filter(pl -> pl.getProjectLevelName().equals(project.getLevelString())).findFirst();
+                        if(level.isPresent()){
+                            project.setLevel(level.get().getId());
+                        }
+                    }
+                    Optional<User> user = userList.stream().filter(ul -> ul.getJobNumber()!=null&&ul.getJobNumber().equals(project.getInchargerId())).findFirst();
+                    if(user.isPresent()){
+                        project.setInchargerId(user.get().getId());
+                        project.setInchargerName(user.get().getName());
+                    }
+                    Optional<ProjectStage> stage = projectStageList.stream().filter(ps -> ps.getProjectStageName().equals(project.getCurrentStageName())).findFirst();
+                    if(stage.isPresent()){
+                        project.setCurrentStageId(stage.get().getId());
+                    }else project.setCurrentStageName(null);
                     project.setCompanyId(thirdPartyInterface.getCompanyId());
                     inertProjectList.add(project);
                 }
@@ -6773,6 +6843,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     //message+="成功添加"+inertProjectList.size()+"条项目数据";
                     message+=MessageUtils.message("project.upDataSuc",inertProjectList.size());
                 }
+                List<Integer> idList = inertProjectList.stream().map(Project::getId).collect(Collectors.toList());
+                idList.add(-1);
+                List<ProjectSeparate> projectSeparateList = projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("id", idList));
                 for (Project project : inertProjectList) {
                     List<TaskGroup> taskGroupList = project.getTaskGroupList();
                     if(taskGroupList!=null){
@@ -6780,16 +6853,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         taskGroupService.saveBatch(taskGroupList);
                     }
                     ProjectSeparate projectSeparate = project.getProjectSeparate();
-                    if(projectSeparate!=null){
-                        projectSeparate.setId(project.getId());
-                        projectSeparateService.save(projectSeparate);
-                    }
+                    projectSeparate.setId(project.getId());
+                    projectSeparateService.saveOrUpdate(projectSeparate);
                 }
             }
         }else if(changeType.equals("update_project")){
             if(projectList!=null &&projectList.size()>0){
                 for (Project project : projectList) {
                     Optional<Project> first = allProject.stream().filter(ap ->ap.getProjectCode()!=null&& ap.getProjectCode().equals(project.getProjectCode())).findFirst();
+                    Optional<User> user = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(project.getInchargerId())).findFirst();
+                    if(user.isPresent()){
+                        project.setInchargerId(user.get().getId());
+                        project.setInchargerName(user.get().getName());
+                    }
                     if(first.isPresent()){
                         project.setId(first.get().getId());
                         project.setCompanyId(thirdPartyInterface.getCompanyId());
@@ -6803,7 +6879,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 List<Integer> idList = changeProjectList.stream().map(Project::getId).collect(Collectors.toList());
                 idList.add(-1);
                 List<TaskGroup> groupList = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", idList));
-                List<ProjectSeparate> projectSeparateList = projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("project_id", idList));
+                List<ProjectSeparate> projectSeparateList = projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("id", idList));
                 for (Project project : changeProjectList) {
                     List<TaskGroup> taskGroupList = project.getTaskGroupList();
                     if(taskGroupList!=null){
@@ -6819,10 +6895,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         taskGroupService.saveOrUpdateBatch(taskGroupList);
                     }
                     ProjectSeparate projectSeparate = project.getProjectSeparate();
-                    Optional<ProjectSeparate> first = projectSeparateList.stream().filter(pl -> pl.getId().equals(project.getId())).findFirst();
-                    if(first.isPresent()) {
-                        projectSeparate.setId(first.get().getId());
-                    }
+                    projectSeparate.setId(project.getId());
+                    projectSeparateService.saveOrUpdate(projectSeparate);
                     projectSeparateService.saveOrUpdate(projectSeparate);
                 }
             }
@@ -6846,6 +6920,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg testRead(String jobId) {
+        excelExportService.testRead(jobId);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg testAdd(String jobId) {
+        excelExportService.testAdd(jobId);
+        return new HttpRespMsg();
+    }
+
     public static void main(String[] args) {
         Map params = new HashMap<>();
         Map paramDataJson = new HashMap<>();

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

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.ProviderInfo;
 import com.management.platform.entity.User;
+import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.ProviderInfoMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.ProviderInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -43,6 +45,8 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
     ProviderInfoMapper providerInfoMapper;
     @Resource
     UserMapper userMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
     @Value(value = "${upload.path}")
     String path;
     @Override
@@ -158,6 +162,7 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
     @Override
     public HttpRespMsg exportData(HttpServletRequest request) {
         User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         List<List<String>> dataList=new ArrayList<>();
         //String[] titleString=new String[]{"供应商编号","供应商名称","分类","联系人","联系电话","邮箱","地址","备注"};
         String[] titleString=new String[]{MessageUtils.message("excel.supplierNo"),MessageUtils.message("excel.supplierName"),MessageUtils.message("excel.classification"),MessageUtils.message("excel.contacts"),MessageUtils.message("excel.phone"),MessageUtils.message("excel.email"),MessageUtils.message("excel.address"),MessageUtils.message("excel.remarks")};
@@ -179,7 +184,7 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
         //生成excel文件导出
         //String fileName = "供应商统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.supStat")+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
         return httpRespMsg;

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

@@ -5,13 +5,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.ReportExtraDegree;
 import com.management.platform.entity.TimeType;
 import com.management.platform.entity.User;
+import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.ReportExtraDegreeService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import com.qq.weixin.mp.aes.WXBizMsgCrypt;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.Row;
@@ -49,6 +52,8 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
     UserMapper userMapper;
     @Resource
     TimeTypeMapper timeTypeMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
     @Override
     public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
@@ -152,6 +157,7 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
     public HttpRespMsg exportData(HttpServletRequest request) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         List<ReportExtraDegree> reportExtraDegreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", user.getCompanyId()));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         List<String> titleList=new ArrayList<>();
@@ -165,7 +171,7 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
         }
         //生成excel文件导出
         String fileName = timeType.getCustomDegreeName()+"_"+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         httpRespMsg.data = resp;
         return httpRespMsg;
     }

+ 13 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -652,6 +652,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (company.getPackageProject() == 1) {
                 timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
             }
+            //当天是否是工作日
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate lDate = LocalDate.parse(date, dtf);
+            boolean isWorkDay = companyId == 817 ? WorkDayCalculateUtils.isWorkDayExceptSaturday(lDate) : WorkDayCalculateUtils.isWorkDay(lDate);
+            resultMap.put("isWorkDay", isWorkDay);
 
             resultMap.put("timeBasecostList",timeBasecostList);
 
@@ -1547,7 +1552,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item2.put("key","日期");
                                     item2.put("value",report.getCreateDate());
                                     dataJson.add(item2);
-                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item",dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
                                 }
@@ -1592,7 +1597,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item3.put("value",report.getCreateDate());
                                     dataJson.add(item3);
                                     json.put("template_id","tty9TkCAAAwOgmzwS2uFogWgOmPDdIRQ");
-                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item",dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
                                 }
@@ -2489,7 +2494,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item2.put("key","日期");
                                     item2.put("value",report.getCreateDate());
                                     dataJson.add(item2);
-                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item",dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
                                 }
@@ -3111,6 +3116,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Override
     public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
         HttpRespMsg msg = getUserDailyWorkTime(request, startDate, endDate);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         //String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         String[] weekDayCHN = {MessageUtils.message("week.Monday"),MessageUtils.message("week.Tuesday"),MessageUtils.message("week.Wednesday"),MessageUtils.message("week.Thursday"),MessageUtils.message("week.Friday"),MessageUtils.message("week.Saturday"),MessageUtils.message("week.Sunday")};
         HashMap map = (HashMap) msg.data;
@@ -3161,7 +3168,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //生成excel文件导出
         //String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.dailyManHour",startDate,endDate)+"_"+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
         return httpRespMsg;
@@ -4219,6 +4226,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg msg = getNoReportUserList(request, startDate, endDate);
         String token = request.getHeader("TOKEN");
         TimeType timeType = timeTypeMapper.selectById(userMapper.selectById(token).getCompanyId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", userMapper.selectById(token).getCompanyId()));
         //String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         String[] weekDayCHN = {MessageUtils.message("week.Monday"),MessageUtils.message("week.Tuesday"),MessageUtils.message("week.Wednesday"),MessageUtils.message("week.Thursday"),MessageUtils.message("week.Friday"),MessageUtils.message("week.Saturday"),MessageUtils.message("week.Sunday")};
         List<UserDailyWorkItem> dailyWorkItems = (List<UserDailyWorkItem>) msg.data;
@@ -4255,7 +4263,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //生成excel文件导出
         //String fileName = "未填人员统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perNoFill")+startDate+MessageUtils.message("leave.to")+endDate+"_"+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
         return httpRespMsg;

+ 8 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SimpleReportServiceImpl.java

@@ -2,13 +2,8 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.SimpleFinance;
-import com.management.platform.entity.SimpleProjectime;
-import com.management.platform.entity.SimpleReport;
-import com.management.platform.entity.User;
-import com.management.platform.mapper.SimpleFinanceMapper;
-import com.management.platform.mapper.SimpleProjectimeMapper;
-import com.management.platform.mapper.SimpleReportMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.SimpleFinanceService;
 import com.management.platform.service.SimpleProjectimeService;
 import com.management.platform.service.SimpleReportService;
@@ -69,6 +64,10 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
     SimpleProjectimeMapper simpleProjectimeMapper;
     @Resource
     SimpleProjectimeService simpleProjectimeService;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -393,6 +392,7 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
     @Override
     public HttpRespMsg exportData(String yearMonth, Integer companyId, String type, HttpServletRequest request) {
         HttpRespMsg timeCost = getTimeCost(yearMonth, companyId, type, request);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HashMap map = (HashMap)timeCost.data;
         List<HashMap> costList = (List<HashMap>)map.get("costList");
         List<List<String>> dataList = new ArrayList<>();
@@ -440,7 +440,7 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
         dataList.add(sumRow);
         //生成excel文件导出
         String fileName = yearMonth+"_"+type+MessageUtils.message("report.report")+"_"+System.currentTimeMillis();
-        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
         return  httpRespMsg;

+ 10 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -71,7 +71,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Override
     public HttpRespMsg getExecutorPanel(Integer projectId) {
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data = taskMapper.getExecutorPanel(projectId);
+        List<Map<String, Object>> list = taskMapper.getExecutorPanel(projectId);
+        list.forEach(l->{
+            l.put("type","userName");
+        });
+        msg.data=list;
         return msg;
     }
 
@@ -619,7 +623,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Override
     public HttpRespMsg getExecutorPlanHour(Integer projectId) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
-        httpRespMsg.data=taskMapper.getExecutorPlanHour(projectId);
+        List<Map<String, Object>> list = taskMapper.getExecutorPlanHour(projectId);
+        list.forEach(l->{
+            l.put("type","userName");
+        });
+        httpRespMsg.data=list;
         return httpRespMsg;
     }
 

+ 190 - 147
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -150,6 +150,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private ThirdPartyInterfaceMapper thirdPartyInterfaceMapper;
     @Resource
     SysConfigMapper sysConfigMapper;
+
+    public static String provider_access_token = null;
+    public static long providerTokenExpireTime = 0L;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -431,166 +434,182 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
-    //获取员工的列表
-    @Override
-    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer roleId, Integer onlyDirect, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        Integer WXCompanyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
-        if (wxCorpInfo!=null && keyword!=null && keyword.trim().length()!=0 && departmentId == -1){
-            if (wxCorpInfo.getSaasSyncContact()==1){
-                String AccessUrl = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
-                String url = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/search?provider_access_token=ACCESS_TOKEN";
-                HttpHeaders headers = new HttpHeaders();
-                RestTemplate restTemplate = new RestTemplate();
-                MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
-                headers.setContentType(type);
-                headers.add("Accept", MediaType.APPLICATION_JSON.toString());
-                //获取服务商id
-                JSONObject AccessRequestMap = new JSONObject();
-                AccessRequestMap.put("corpid", corpId);
-                AccessRequestMap.put("provider_secret", providerSecret);
-                HttpEntity<JSONObject> AccessEntity = new HttpEntity<>(AccessRequestMap, headers);
-                ResponseEntity<String> AccessResponseEntity = restTemplate.postForEntity(AccessUrl, AccessEntity, String.class);
-                String providerToken ="";
-                if (AccessResponseEntity.getStatusCode() == HttpStatus.OK){
-                    String AccessResp = AccessResponseEntity.getBody();
-                    JSONObject json = JSONObject.parseObject(AccessResp);
-                    providerToken = json.getString("provider_access_token");
-                }else {
-                    httpRespMsg.setError("服务商token获取失败");
-                    return httpRespMsg;
+    //获取provider_access_token
+    private String getProviderAccessToken() {
+        if (WeiXinCorpController.SUITE_ACCESS_TOKEN == null || WeiXinCorpController.suiteTokenExpireTime < System.currentTimeMillis()) {
+            //失效了,需要重新获取
+            String url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
+            HttpHeaders headers = new HttpHeaders();
+            RestTemplate restTemplate = new RestTemplate();
+            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+            headers.setContentType(type);
+            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+            JSONObject reqParam = new JSONObject();
+            reqParam.put("corpid", corpId);
+            reqParam.put("provider_secret", providerSecret);
+            HttpEntity<JSONObject> Entity = new HttpEntity<>(reqParam, headers);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, Entity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                JSONObject obj = JSONObject.parseObject(resp);
+                if (obj.getIntValue("errcode") == 0) {
+                    UserServiceImpl.provider_access_token = obj.getString("provider_access_token");
+                    UserServiceImpl.providerTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
                 }
-                //搜索通讯录名单
-                url = url.replace("ACCESS_TOKEN", providerToken);
-                JSONObject requestMap = new JSONObject();
-                requestMap.put("auth_corpid", wxCorpInfo.getCorpid());
-                requestMap.put("query_word", keyword);
-                requestMap.put("query_type", 1);
-                requestMap.put("query_range", 1);
-                requestMap.put("limit", 200);
-                //requestMap.put("cursor", pageSize);
-                HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
-                ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
-                if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
-                    String resp = ResponseEntity.getBody();
-                    JSONObject json = JSONObject.parseObject(resp);
-                    JSONObject queryResult = json.getJSONObject("query_result");
+            }
+        }
+        return UserServiceImpl.provider_access_token;
+    }
+
+    //根据关键词查询微信通讯录人员的openid
+    //keyword不可为空格或空字符串,否则请求参数错误
+    private Object[] getOpenId(String corpId,String keyword) {
+        Object[] user = null;
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/search?provider_access_token=ACCESS_TOKEN";
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        String providerToken = getProviderAccessToken();
+        if (providerToken!=null){
+            //搜索通讯录名单
+            url = url.replace("ACCESS_TOKEN", providerToken);
+            JSONObject requestMap = new JSONObject();
+            requestMap.put("auth_corpid", corpId);
+            requestMap.put("query_word", keyword);
+            requestMap.put("query_type", 1);
+            requestMap.put("query_range", 1);
+            requestMap.put("limit", 200);
+            //requestMap.put("cursor", pageSize);
+            HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+            ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+            if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = ResponseEntity.getBody();
+                JSONObject respJson = JSONObject.parseObject(resp);
+                if (respJson.getInteger("errcode")==0){
+                    JSONObject queryResult = respJson.getJSONObject("query_result");
                     if (!queryResult.isEmpty()){
                         JSONArray jsonArray = queryResult.getJSONObject("user").getJSONArray("open_userid");
-                        if (jsonArray.size()!=0){
-                            Object[] user = jsonArray.toArray();
-                            List<User> users = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", user));
-                            HashMap<String, Object> data = new HashMap<>();
-                            data.put("records",users);
-                            data.put("total",0);
-                            httpRespMsg.data=data;
-                            return httpRespMsg;
-                        }else {
-                            HashMap<String, Object> data = new HashMap<>();
-                            ArrayList<Object> records = new ArrayList<>();
-                            data.put("records",records);
-                            data.put("total",0);
-                            httpRespMsg.data=data;
-                            return httpRespMsg;
+                        if (jsonArray!=null){
+                            user = jsonArray.toArray();
                         }
-                    }else{
-                        HashMap<String, Object> data = new HashMap<>();
-                        ArrayList<Object> records = new ArrayList<>();
-                        data.put("records",records);
-                        data.put("total",0);
-                        httpRespMsg.data=data;
-                        return httpRespMsg;
                     }
                 }
             }
         }
-        try {
-            Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-            TimeType timeType = timeTypeMapper.selectById(companyId);
-            long total;
-            List<Map<String, Object>> list;
-            Page<User> page = new Page<>(pageIndex, pageSize);
-            if (departmentId == -1) {
-                //单独查找全部
-                list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, roleId);
-                total = page.getTotal();
-            } else if (departmentId == 0) {
-                //单独查找0, 未分配的
-                list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword, status, roleId);
-                total = page.getTotal();
-            } else {
-                //范围查找
-                List<Integer> ids = new ArrayList<>();
-                if (onlyDirect != null && onlyDirect == 1) {
-                    //只看直属的
-                    ids.add(departmentId);
-                } else {
-                    //查看当前部门包括子部门的人员
-                    List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                    ids = departmentService.getDeptIncludeSubDeptIds(departmentId, allDeptList);
-                }
+        return user;
+    }
 
-                list = userMapper.getUserByDepartmentList(page, companyId, ids, keyword, status, roleId);
-                total = page.getTotal();
-            }
-            Map<String, Object> resultMap = new HashMap<>();
-            if (timeType.getIsSecretSalary() == 1) {
-                //秘薪处理
-                list.forEach(li->{
-                    li.put("monthCost", 0.0);
-                    li.put("cost", 0.0);
-                });
+    //获取员工的列表
+    @Override
+    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer roleId, Integer onlyDirect, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer WXCompanyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
+        HashMap<String, Object> data = new HashMap<>();
+        httpRespMsg.data=data;
+        data.put("total",0);
+        //当企业开启了微信通讯录的情况下
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1 && departmentId == -1){
+            Object[] users = getOpenId(wxCorpInfo.getCorpid(), keyword);
+            if (users!=null){
+                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
+                data.put("records",realUser);
+                return httpRespMsg;
+            }else {
+                ArrayList<Object> records = new ArrayList<>();
+                data.put("records",records);
+                return httpRespMsg;
             }
-            List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
-            if(!StringUtils.isEmpty(list)){
-                for(Map<String,Object> u:list) {
-                    HashMap map=new HashMap();
-                    for (int i = 0; i < userCustomList.size(); i++) {
-                        switch (i) {
-                            case 0:
-                                map.put(userCustomList.get(i).getName(), u.get("plate1"));
-                                break;
-                            case 1:
-                                map.put(userCustomList.get(i).getName(), u.get("plate2"));
-                                break;
-                            case 2:
-                                map.put(userCustomList.get(i).getName(), u.get("plate3"));
-                                break;
-                            case 3:
-                                map.put(userCustomList.get(i).getName(), u.get("plate4"));
-                                break;
-                            case 4:
-                                map.put(userCustomList.get(i).getName(), u.get("plate5"));
-                                break;
+        }else {
+            try {
+                Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+                TimeType timeType = timeTypeMapper.selectById(companyId);
+                long total;
+                List<Map<String, Object>> list;
+                Page<User> page = new Page<>(pageIndex, pageSize);
+                if (departmentId == -1) {
+                    //单独查找全部
+                    list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, roleId);
+                    total = page.getTotal();
+                } else if (departmentId == 0) {
+                    //单独查找0, 未分配的
+                    list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword, status, roleId);
+                    total = page.getTotal();
+                } else {
+                    //范围查找
+                    List<Integer> ids = new ArrayList<>();
+                    if (onlyDirect != null && onlyDirect == 1) {
+                        //只看直属的
+                        ids.add(departmentId);
+                    } else {
+                        //查看当前部门包括子部门的人员
+                        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                        ids = departmentService.getDeptIncludeSubDeptIds(departmentId, allDeptList);
+                    }
+
+                    list = userMapper.getUserByDepartmentList(page, companyId, ids, keyword, status, roleId);
+                    total = page.getTotal();
+                }
+                Map<String, Object> resultMap = new HashMap<>();
+                if (timeType.getIsSecretSalary() == 1) {
+                    //秘薪处理
+                    list.forEach(li->{
+                        li.put("monthCost", 0.0);
+                        li.put("cost", 0.0);
+                    });
+                }
+                List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
+                if(!StringUtils.isEmpty(list)){
+                    for(Map<String,Object> u:list) {
+                        HashMap map=new HashMap();
+                        for (int i = 0; i < userCustomList.size(); i++) {
+                            switch (i) {
+                                case 0:
+                                    map.put(userCustomList.get(i).getName(), u.get("plate1"));
+                                    break;
+                                case 1:
+                                    map.put(userCustomList.get(i).getName(), u.get("plate2"));
+                                    break;
+                                case 2:
+                                    map.put(userCustomList.get(i).getName(), u.get("plate3"));
+                                    break;
+                                case 3:
+                                    map.put(userCustomList.get(i).getName(), u.get("plate4"));
+                                    break;
+                                case 4:
+                                    map.put(userCustomList.get(i).getName(), u.get("plate5"));
+                                    break;
+                            }
                         }
+                        u.put("plateMap",map);
                     }
-                    u.put("plateMap",map);
                 }
-            }
-            if (companyMapper.selectById(companyId).getIsInternational() == 1) {
-                //国际化版本
-                LocaleInformation locale = localeInformationMapper.selectById(companyId);
-                TimeZone curZone = TimeZone.getTimeZone(locale.getTimezone());
-                int offsetSeconds = (curZone.getRawOffset() - TimeZone.getTimeZone("GMT+8").getRawOffset())/1000;
-                //时区转换,默认数据库存的是GMT+8
-                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.CHINA);
-                for (Map user : list) {
-                    String createTime = (String)user.get("createTime");
-                    LocalDateTime time = LocalDateTime.parse(createTime, dtf);
-                    time = time.plusSeconds(offsetSeconds);
-                    user.put("createTime", dtf.format(time));
+                if (companyMapper.selectById(companyId).getIsInternational() == 1) {
+                    //国际化版本
+                    LocaleInformation locale = localeInformationMapper.selectById(companyId);
+                    TimeZone curZone = TimeZone.getTimeZone(locale.getTimezone());
+                    int offsetSeconds = (curZone.getRawOffset() - TimeZone.getTimeZone("GMT+8").getRawOffset())/1000;
+                    //时区转换,默认数据库存的是GMT+8
+                    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.CHINA);
+                    for (Map user : list) {
+                        String createTime = (String)user.get("createTime");
+                        LocalDateTime time = LocalDateTime.parse(createTime, dtf);
+                        time = time.plusSeconds(offsetSeconds);
+                        user.put("createTime", dtf.format(time));
+                    }
                 }
+                resultMap.put("records", list);
+                resultMap.put("total", total);
+                httpRespMsg.data = resultMap;
+            } catch (NullPointerException e) {
+                //httpRespMsg.setError("验证失败");
+                httpRespMsg.setError(MessageUtils.message("access.verificationError"));
+                return httpRespMsg;
             }
-            resultMap.put("records", list);
-            resultMap.put("total", total);
-            httpRespMsg.data = resultMap;
-        } catch (NullPointerException e) {
-            //httpRespMsg.setError("验证失败");
-            httpRespMsg.setError(MessageUtils.message("access.verificationError"));
             return httpRespMsg;
         }
-        return httpRespMsg;
     }
 
     //删除普通用户
@@ -1688,7 +1707,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                             jsonObj.put("value", "您"+(StringUtils.isEmpty(date)?"":date)+"的工时报告还未填写");
                             dataJson.add(jsonObj);
                             json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-                            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                             json.put("content_item",dataJson);
                             if (cpList.size() > 0) {
                                 wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
@@ -2044,7 +2063,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     }
 
     @Override
-    public HttpRespMsg getSimpleActiveUserList(Integer departmentId, HttpServletRequest request) {
+    public HttpRespMsg getSimpleActiveUserList(Integer departmentId, HttpServletRequest request,String keyword) {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
@@ -2056,8 +2075,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             wrapper.in("department_id", deptIds);
         }
         List<User> userList = userMapper.selectList(wrapper);
-        msg.data = userList;
-        return msg;
+        //企业微信通讯录搜索功能
+        Integer WXCompanyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
+        //当企业开启了微信通讯录的情况下
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
+            Object[] users = getOpenId(wxCorpInfo.getCorpid(), keyword);
+            List<User> retUser = new ArrayList<>();
+            msg.data = retUser;
+            if (users!=null){
+                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
+                for (User item : userList) {
+                    for (User realItem : realUser) {
+                        if (item.getId().equals(realItem.getId())){
+                            retUser.add(realItem);
+                            continue;
+                        }
+                    }
+                }
+                return msg;
+            }else {
+                return msg;
+            }
+        }else {
+            msg.data = userList;
+            return msg;
+        }
     }
 
     @Override

+ 243 - 216
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -12,6 +12,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.HttpClientUtils;
 import org.json.HTTP;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +33,7 @@ import java.net.URI;
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
@@ -208,6 +210,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             JSONObject reqParam = new JSONObject();
             reqParam.put("touser", corpUserid);
             reqParam.put("msgtype", "text");
+            reqParam.put("enable_id_trans", 1);
             reqParam.put("agentid", corpInfo.getAgentid());
             JSONObject contentJson = new JSONObject();
             contentJson.put("content", msg);
@@ -219,7 +222,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             if (responseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = responseEntity.getBody();
                 log.info("发送企业微信消息返回结果==" + resp);
-                System.out.println("发送企业微信消息返回结果==" + resp);
                 JSONObject json = JSONObject.parseObject(resp);
                 if (json.getIntValue("errcode") == 0) {
                     //发送成功
@@ -538,6 +540,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             String resp = responseEntity.getBody();
             if (showLog) System.out.println(resp);
             JSONObject json = JSONObject.parseObject(resp);
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             if (json.getIntValue("errcode") == 0) {
                 JSONArray datas = json.getJSONArray("datas");
                 for (int i = 0; i < datas.size(); i++) {
@@ -590,250 +593,274 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
                     Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
 
-
                     ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
                     ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
                     //直接设置打卡时长,以企业微信的为准,不考虑漏打卡的情况
                     ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
-
-                    JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
-//                        if (eTime == sTime) {
-                    //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
-                    String lastestOffworkTime = null;
-                    boolean needRecaculate = false;
-                    for (int t = 0; t < holidayItems.size(); t++) {
-                        JSONObject holiday = holidayItems.getJSONObject(t);
-                        JSONObject spTitle = holiday.getJSONObject("sp_title");
-                        JSONArray data = spTitle.getJSONArray("data");
-                        for (int m = 0; m < data.size(); m++) {
-                            String leaveText = data.getJSONObject(m).getString("text");
-                            if (leaveText.startsWith("请假")) {
-                                //获取对应位置的请假时间段
-                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                String[] s = string.split(" |\\~");
-                                boolean isOldFormat = false;
-                                if (s.length < 5) {
-                                    isOldFormat = true;
-                                }
-
-                                //获取到请假的开始时间和结束时间
-                                String leaveEnd = isOldFormat ? s[3] : s[4];
-                                String leaveStart = s[1];
-                                //请假开始的日期和结束的日期
-                                String dateStart = localDate.getYear() + "/" + s[0];
-                                String dateEnd = localDate.getYear() + "/" + (isOldFormat ? s[2] : s[3]);
-                                LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
-                                LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
-                                if (sDate.isEqual(eDate)) {
-                                    //请假在一天内
-                                    if (leaveEnd.equals("下午")) {
-                                        if (leaveStart.equals("上午")) {
-                                            leaveEnd = baseAfternoonEnd;//上午和下午都请假,算全天
-                                            leaveStart = baseMorningStart;
-                                        } else {
-                                            leaveStart = "14:00";
-                                            leaveEnd = baseAfternoonEnd;//请假的下班打卡时间,算上午结束的时间
-                                        }
-                                    } else if (leaveEnd.equals("上午")) {
-                                        //上午请假
-                                        leaveEnd = baseMorningEnd;
-                                        leaveStart = baseMorningStart;
-                                    }
-                                    //开始时间是00:00要处理成正常打卡的开始时间
-                                    if ("00:00".equals(leaveStart)) {
-                                        leaveStart = baseMorningStart;
+                    ct.setAskLeaveTime(0.0);
+                    ct.setWorkHours(0.0);
+                    ct.setOutdoorTime(0.0);
+                    //工作日或者非工作日有打卡,需要校正请假,外出的时长数据
+                    if (WorkDayCalculateUtils.isWorkDay(localDate) || sTime > 0 || eTime > 0) {
+                        JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
+                        //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
+                        boolean needRecaculate = false;
+                        //跨天请假的情况,中间如果有非工作日要自动补齐时间。
+                        List<LocalDate> betweenNonWorkDays = new ArrayList<>();
+                        int betweenTotalDays = 0;
+                        for (int t = 0; t < holidayItems.size(); t++) {
+                            JSONObject holiday = holidayItems.getJSONObject(t);
+                            JSONObject spTitle = holiday.getJSONObject("sp_title");
+                            JSONArray data = spTitle.getJSONArray("data");
+                            for (int m = 0; m < data.size(); m++) {
+                                String leaveText = data.getJSONObject(m).getString("text");
+                                if (leaveText.startsWith("请假")) {
+                                    //获取对应位置的请假时间段
+                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                    String[] s = string.split(" |\\~");
+                                    boolean isOldFormat = false;
+                                    if (s.length < 5) {
+                                        isOldFormat = true;
                                     }
-                                    System.out.println("leaveStart==" + leaveStart + ", leaveEnd=" + leaveEnd);
-                                } else {
-                                    if (showLog) System.out.println("跨天请假@@@@");
-                                    if (showLog)
-                                        System.out.println("当天==" + localDate + ", sDate=" + sDate + ", 比较=" + (localDate.isEqual(sDate)));
-                                    //跨天请假
-                                    if (localDate.isEqual(sDate)) {
-                                        //当前日期第一天,需判断上下午半天请假的情况
-                                        if (leaveStart.equals("上午")) {
-                                            leaveStart = baseMorningStart;
-                                        } else {
-                                            leaveStart = baseAfternoonStart;
-                                        }
-                                        //跨天请假的第一天,结束时间默认为18:00
-                                        leaveEnd = baseAfternoonEnd;//上午开始请假的算全天
-                                    } else if (localDate.isEqual(eDate)) {
-                                        //当前日期就是最后一天,需判断上下午半天请假的情况
+
+                                    //获取到请假的开始时间和结束时间
+                                    String leaveEnd = isOldFormat ? s[3] : s[4];
+                                    String leaveStart = s[1];
+                                    //请假开始的日期和结束的日期
+                                    String dateStart = localDate.getYear() + "/" + s[0];
+                                    String dateEnd = localDate.getYear() + "/" + (isOldFormat ? s[2] : s[3]);
+                                    LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
+                                    LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
+                                    if (sDate.isEqual(eDate)) {
+                                        //请假在一天内
                                         if (leaveEnd.equals("下午")) {
-                                            leaveEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
+                                            if (leaveStart.equals("上午")) {
+                                                leaveEnd = baseAfternoonEnd;//上午和下午都请假,算全天
+                                                leaveStart = baseMorningStart;
+                                            } else {
+                                                leaveStart = "14:00";
+                                                leaveEnd = baseAfternoonEnd;//请假的下班打卡时间,算上午结束的时间
+                                            }
                                         } else if (leaveEnd.equals("上午")) {
                                             //上午请假
                                             leaveEnd = baseMorningEnd;
+                                            leaveStart = baseMorningStart;
+                                        }
+                                        //开始时间是00:00要处理成正常打卡的开始时间
+                                        if ("00:00".equals(leaveStart)) {
+                                            leaveStart = baseMorningStart;
                                         }
-                                        //跨天请假的最后一天,开始时间默认为9:00
-                                        leaveStart = baseMorningStart;
+                                        System.out.println("leaveStart==" + leaveStart + ", leaveEnd=" + leaveEnd);
                                     } else {
-                                        //中间日期就是全天
-                                        leaveStart = baseMorningStart;
-                                        leaveEnd = baseAfternoonEnd;
-                                        if (showLog) System.out.println("===中间天请假===");
+                                        if (showLog) System.out.println("跨天请假@@@@");
+                                        if (showLog)
+                                            System.out.println("当天==" + localDate + ", sDate=" + sDate + ", 比较=" + (localDate.isEqual(sDate)));
+                                        //跨天请假,获取期间的非工作日,加进去
+                                        List<LocalDate> localDates = WorkDayCalculateUtils.getNonWorkDaysListInRange(dtf.format(sDate) ,dtf.format(eDate));
+                                        for (LocalDate curLdate : localDates) {
+                                            if (!betweenNonWorkDays.stream().anyMatch(be->be.isEqual(curLdate))) {
+                                                if (showLog) System.out.println("含非工作日请假:"+curLdate);
+                                                betweenNonWorkDays.add(curLdate);
+                                            }
+                                        }
+                                        if (betweenNonWorkDays.size() > 0) {
+                                            betweenTotalDays = (int)sDate.until(eDate, ChronoUnit.DAYS) + 1;
+                                            if (showLog) System.out.println("总跨度请假天数为:"+betweenTotalDays);
+                                        }
+                                        if (localDate.isEqual(sDate)) {
+                                            //当前日期第一天,需判断上下午半天请假的情况
+                                            if (showLog) System.out.println("跨天请假第一天leaveStart为:"+leaveStart);
+                                            if (leaveStart.equals("上午")) {
+                                                leaveStart = baseMorningStart;
+                                            } else if (leaveStart.equals("下午")) {
+                                                leaveStart = baseAfternoonStart;
+                                            }
+                                            //跨天请假的第一天,结束时间默认为18:00
+                                            leaveEnd = baseAfternoonEnd;//上午开始请假的算全天
+                                        } else if (localDate.isEqual(eDate)) {
+                                            //当前日期就是最后一天,需判断上下午半天请假的情况
+                                            if (leaveEnd.equals("下午")) {
+                                                leaveEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
+                                            } else if (leaveEnd.equals("上午")) {
+                                                //上午请假
+                                                leaveEnd = baseMorningEnd;
+                                            }
+                                            //跨天请假的最后一天,开始时间默认为9:00
+                                            leaveStart = baseMorningStart;
+                                        } else {
+                                            //中间日期就是全天
+                                            leaveStart = baseMorningStart;
+                                            leaveEnd = baseAfternoonEnd;
+                                            if (showLog) System.out.println("===中间天请假===");
+                                        }
                                     }
-                                }
 
-                                //获取请假最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
-                                if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
-                                    ct.setStartTime(leaveStart);
-                                    needRecaculate = true;
-                                }
-                                if (ct.getEndTime().compareTo(leaveEnd) < 0) {
-                                    ct.setEndTime(leaveEnd);
-                                    needRecaculate = true;
-                                }
-                            } else if (leaveText.startsWith("外出")) {
-                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                String[] s = string.split(" |\\~");
-                                //获取到外出的开始时间和结束时间
-                                boolean isOldFormat = false;
-                                if (s.length < 5) {
-                                    isOldFormat = true;
-                                }
-                                String outEnd = isOldFormat ? s[3] : s[4];
-                                String outStart = s[1];
-                                //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
-                                if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
-                                    ct.setStartTime(outStart);
-                                    needRecaculate = true;
-                                }
+                                    //获取请假最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                    if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
+                                        ct.setStartTime(leaveStart);
+                                        needRecaculate = true;
+                                    }
+                                    if (ct.getEndTime().compareTo(leaveEnd) < 0) {
+                                        ct.setEndTime(leaveEnd);
+                                        needRecaculate = true;
+                                    }
+                                } else if (leaveText.startsWith("外出")) {
+                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                    String[] s = string.split(" |\\~");
+                                    //获取到外出的开始时间和结束时间
+                                    boolean isOldFormat = false;
+                                    if (s.length < 5) {
+                                        isOldFormat = true;
+                                    }
+                                    String outEnd = isOldFormat ? s[3] : s[4];
+                                    String outStart = s[1];
+                                    //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                    if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
+                                        ct.setStartTime(outStart);
+                                        needRecaculate = true;
+                                    }
 
-                                if (ct.getEndTime().compareTo(outEnd) < 0) {
-                                    ct.setEndTime(outEnd);
-                                    needRecaculate = true;
+                                    if (ct.getEndTime().compareTo(outEnd) < 0) {
+                                        ct.setEndTime(outEnd);
+                                        needRecaculate = true;
+                                    }
                                 }
                             }
                         }
-                    }
-                    double timeDelta = 0;
-                    //时间有变化,需要重新计算
-                    if (needRecaculate) {
-                        System.out.println("" + ct.getStartTime() + "--" + ct.getEndTime());
-                        timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
-                        //超过下午上班的开始时间,需要减去午休的时间
-                        if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0) {
-                            //重新计算打卡工时时,需要减去中间午休时间
-
-                            timeDelta -= restTime;
+                        double timeDelta = 0;
+                        //时间有变化,需要重新计算
+                        if (needRecaculate) {
+                            System.out.println("" + ct.getStartTime() + "--" + ct.getEndTime());
+                            timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
+                            //超过下午上班的开始时间,需要减去午休的时间
+                            if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0) {
+                                //重新计算打卡工时时,需要减去中间午休时间
+                                timeDelta -= restTime;
+                            }
+                        } else {
+                            timeDelta = ct.getCardTime();
                         }
-                    } else {
-                        timeDelta = ct.getCardTime();
-                    }
 
-                    if (showLog) System.out.println("上下班间隔时长为==" + timeDelta);
-                    ct.setName(name);
-                    //解析请假和外出的情况
-                    JSONArray sp_items = jsonObject.getJSONArray("sp_items");
-                    for (int j = 0; j < sp_items.size(); j++) {
-                        JSONObject spItem = sp_items.getJSONObject(j);
-                        switch (spItem.getInteger("type")) {
-                            case 1://请假
-                                Double leaveTime = ct.getAskLeaveTime();
-                                if (leaveTime == null) {
-                                    leaveTime = 0.0;
-                                }
-                                ct.setAskLeaveTime(leaveTime + convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration"))));
-                                break;
-                            case 2://补卡
-                            case 3://出差
-                            case 4://外出
-                            case 100://外勤
-                                Double outdoorTime = ct.getOutdoorTime();
-                                if (outdoorTime == null) {
-                                    outdoorTime = 0.0;
-                                }
-                                double otTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
-                                if (otTime > 8.0) {
-                                    otTime = 8.0;
-                                }
-                                ct.setOutdoorTime(outdoorTime + otTime);
-                                break;
+                        if (showLog) System.out.println("上下班间隔时长为==" + timeDelta);
+                        ct.setName(name);
+                        //解析请假和外出的情况
+                        JSONArray sp_items = jsonObject.getJSONArray("sp_items");
+                        for (int j = 0; j < sp_items.size(); j++) {
+                            JSONObject spItem = sp_items.getJSONObject(j);
+                            switch (spItem.getInteger("type")) {
+                                case 1://请假
+                                    Double leaveTime = ct.getAskLeaveTime();
+                                    if (leaveTime == null) {
+                                        leaveTime = 0.0;
+                                    }
+                                    int wxDuration = spItem.getInteger("duration");
+                                    int seconds = 0;
+                                    if (betweenNonWorkDays.size() > 0) {
+                                        //跨天请假中含有非工作日的情况,要减去非工作日来重新计算实际工作日的每天请假时长。
+                                        seconds = wxDuration * betweenTotalDays/(betweenTotalDays - betweenNonWorkDays.size());
+                                    }
+                                    double curLeaveTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(seconds));
+                                    ct.setAskLeaveTime(leaveTime + curLeaveTime);
+                                    break;
+                                case 2://补卡
+                                case 3://出差
+                                case 4://外出
+                                case 100://外勤
+                                    Double outdoorTime = ct.getOutdoorTime();
+                                    if (outdoorTime == null) {
+                                        outdoorTime = 0.0;
+                                    }
+                                    double otTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
+                                    if (otTime > 8.0) {
+                                        otTime = 8.0;
+                                    }
+                                    ct.setOutdoorTime(outdoorTime + otTime);
+                                    break;
+                            }
                         }
-                    }
 
-                    //获取请假的最早和最晚时间
-                    for (int t = 0; t < holidayItems.size(); t++) {
-                        JSONObject holiday = holidayItems.getJSONObject(t);
-                        JSONObject spTitle = holiday.getJSONObject("sp_title");
-                        JSONArray data = spTitle.getJSONArray("data");
-                        for (int m = 0; m < data.size(); m++) {
-                            String leaveText = data.getJSONObject(m).getString("text");
-                            if (leaveText.startsWith("请假")) {
-                                //获取对应位置的请假时间段
-                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                String[] s = string.split(" |\\~");
-                                boolean isOldFormat = false;
-                                if (s.length < 5) {
-                                    isOldFormat = true;
-                                }
-                                //获取到请假的开始时间和结束时间
-                                String leaveStart = s[1];
-                                String leaveEnd = isOldFormat ? s[3] : s[4];
-
-                                //检查请假时间段是否在打卡的时间范围内
-                                if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
-                                    //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
-                                    if (ct.getAskLeaveTime() >= 12) {
-                                        if (showLog)
-                                            System.out.println("====半天或者全天请假 =转化为8小时制下的时间=" + (ct.getAskLeaveTime() / 24 * 8.0));
-                                        //12小时以上的,是请假半天或者全天的。 防止1天有2次上下午分开的请假,导致计算两次的错误
-                                        ct.setAskLeaveTime(ct.getAskLeaveTime() / 24 * 8.0);//转换成一天8小时工作制
+                        //获取请假的最早和最晚时间
+                        for (int t = 0; t < holidayItems.size(); t++) {
+                            JSONObject holiday = holidayItems.getJSONObject(t);
+                            JSONObject spTitle = holiday.getJSONObject("sp_title");
+                            JSONArray data = spTitle.getJSONArray("data");
+                            for (int m = 0; m < data.size(); m++) {
+                                String leaveText = data.getJSONObject(m).getString("text");
+                                if (leaveText.startsWith("请假")) {
+                                    //获取对应位置的请假时间段
+                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                    String[] s = string.split(" |\\~");
+                                    boolean isOldFormat = false;
+                                    if (s.length < 5) {
+                                        isOldFormat = true;
                                     }
-                                } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
-                                    String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
-                                    if (showLog) System.out.println("请假时长=" + hourLeaveTime);
+                                    //获取到请假的开始时间和结束时间
+                                    String leaveStart = s[1];
+                                    String leaveEnd = isOldFormat ? s[3] : s[4];
+
+                                    //检查请假时间段是否在打卡的时间范围内
+                                    if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
+                                        //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
+                                        if (ct.getAskLeaveTime() >= 12) {
+                                            if (showLog)
+                                                System.out.println("====半天或者全天请假 =转化为8小时制下的时间=" + (ct.getAskLeaveTime() / 24 * 8.0));
+                                            //12小时以上的,是请假半天或者全天的。 防止1天有2次上下午分开的请假,导致计算两次的错误
+                                            ct.setAskLeaveTime(ct.getAskLeaveTime() / 24 * 8.0);//转换成一天8小时工作制
+                                        }
+                                    } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
+                                        String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
+                                        if (showLog) System.out.println("请假时长=" + hourLeaveTime);
 //                                        ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
+                                    }
                                 }
                             }
                         }
-                    }
-                    //校正请假时长
-                    if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
-                        ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
-                    }
-                    if (ct.getAskLeaveTime() > 8.0) {
-                        ct.setAskLeaveTime(8.0);//超过8小时都以8小时计算
-                    }
-                    if (showLog) System.out.println("校正后请假时长=" + ct.getAskLeaveTime());
-                    //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
-                    if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
-                        timeDelta += ct.getOutdoorTime();
-                    }
-                    double workHours = timeDelta - ct.getAskLeaveTime();
-                    if (workHours < 0) {
-                        workHours = 0;
-                    }
-                    if (ct.getAskLeaveTime() >= 8.0) {
-                        //全天请假了,就不算打卡工作时长了。
-                        workHours = 0;
-                        //重新校正开始时间和结束时间
-                        ct.setStartTime(baseMorningStart);
-                        ct.setEndTime(baseAfternoonEnd);
-                    }
-                    if (showLog) System.out.println("工作时长==" + workHours);
-                    ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
+                        //校正请假时长
+                        if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
+                            ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
+                        }
+                        if (ct.getAskLeaveTime() > 8.0) {
+                            ct.setAskLeaveTime(8.0);//超过8小时都以8小时计算
+                        }
+                        if (showLog) System.out.println("校正后请假时长=" + ct.getAskLeaveTime());
+                        //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
+                        if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
+                            timeDelta += ct.getOutdoorTime();
+                        }
+                        double workHours = timeDelta - ct.getAskLeaveTime();
+                        if (workHours < 0) {
+                            workHours = 0;
+                        }
+                        if (ct.getAskLeaveTime() >= 8.0) {
+                            //全天请假了,就不算打卡工作时长了。
+                            workHours = 0;
+                            //重新校正开始时间和结束时间
+                            ct.setStartTime(baseMorningStart);
+                            ct.setEndTime(baseAfternoonEnd);
+                        }
+                        if (showLog) System.out.println("工作时长==" + workHours);
+                        ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
 //                        if (regular_work_sec < standard_work_sec) {
 //                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime() + ct.getOutdoorTime()));
 //                        } else {
 //                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime()));
 //                        }
-                    //仅有一次打卡,并且没有请假,外出的情况,需要补足下班的打卡时间
-                    if (ct.getStartTime().equals(ct.getEndTime()) && !"00:00".equals(ct.getStartTime())) {
-                        if (ct.getEndTime().compareTo(baseAfternoonEnd) < 0) {
-                            ct.setEndTime(baseAfternoonEnd);
-                            //重新计算时长
-                            double workTime = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
-                            if (ct.getStartTime().compareTo(baseMorningEnd) >= 0) {
-                                //重新计算打卡工时时,需要减去中间午休时间
-                                workTime -= restTime;
+                        //仅有一次打卡,并且没有请假,外出的情况,需要补足下班的打卡时间
+                        if (ct.getStartTime().equals(ct.getEndTime()) && !"00:00".equals(ct.getStartTime())) {
+                            if (ct.getEndTime().compareTo(baseAfternoonEnd) < 0) {
+                                ct.setEndTime(baseAfternoonEnd);
+                                //重新计算时长
+                                double workTime = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
+                                if (ct.getStartTime().compareTo(baseMorningEnd) >= 0) {
+                                    //重新计算打卡工时时,需要减去中间午休时间
+                                    workTime -= restTime;
+                                }
+                                ct.setCardTime(workTime);
+                                ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workTime));
                             }
-                            ct.setCardTime(workTime);
-                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workTime));
                         }
                     }
+
                     UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
                             .eq("create_date", localDate));
                     if (item != null) {
@@ -862,7 +889,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     //查询某时间段的微信请假审批单号及详情
     @Override
-    public List<LeaveSheet> WxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> ApprovalLeave) throws Exception {
+    public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception {
         //存储更新失败的公司名称
         List<String> fail = new ArrayList<>();
         String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
@@ -878,9 +905,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             String accessToken = getCorpAccessToken(wxCorpInfo);
             url = url.replace("ACCESS_TOKEN", accessToken);
             //查询并更新审核中的审批单
-            if (ApprovalLeave.size()!=0){
-                for (LeaveSheet corpInfo : ApprovalLeave) {
-                    if (corpInfo.getCompanyId()==wxCorpInfo.getCompanyId()&&corpInfo.getProcinstId()!=null&&corpInfo.getProcinstId()!=""){
+            if (approvalLeave.size()!=0){
+                for (LeaveSheet corpInfo : approvalLeave) {
+                    if (corpInfo.getCompanyId().equals(wxCorpInfo.getCompanyId())&& StringUtils.isNotEmpty(corpInfo.getProcinstId())){
                         detailUrl = detailUrl.replace("ACCESS_TOKEN", accessToken);
                         JSONObject detailMap = new JSONObject();
                         detailMap.put("sp_no",corpInfo.getProcinstId());
@@ -931,7 +958,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         .getJSONArray("details").getJSONObject(0)
                                         .getJSONObject("approver").getString("userid");
                                 User approverUser = new User();
-                                if (approverUserId!=""&&approverUserId!=null){
+                                if (StringUtils.isNotEmpty(approverUserId)){
                                     approverUser= userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", approverUserId));
                                 }
                                 leaveSheet.setAuditorName(approverUser==null?approverUserId:approverUser.getName());

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

@@ -314,10 +314,10 @@ public class TimingTask {
         String startTime = Long.toString(System.currentTimeMillis()/1000L-86400);
         String endTime = Long.toString(System.currentTimeMillis()/1000L);
         //查询更新审批中的请假单
-        List<LeaveSheet> ApprovalLeave = leaveSheetMapper.selectApprovalList();
+        List<LeaveSheet> approvalLeave = leaveSheetMapper.selectApprovalList();
         //插入请假单并更新审核中的请假单
         List<WxCorpInfo> wxCorpInfos = wxCorpInfoMapper.selectList(null);
-        List<LeaveSheet> leaveSheets = wxCorpInfoService.WxLeaveNumber(startTime,endTime, wxCorpInfos,ApprovalLeave);
+        List<LeaveSheet> leaveSheets = wxCorpInfoService.wxLeaveNumber(startTime,endTime, wxCorpInfos,approvalLeave);
         for (LeaveSheet leaveSheet : leaveSheets) {
             leaveSheetMapper.insert(leaveSheet);
         }
@@ -367,7 +367,7 @@ public class TimingTask {
                     jsonObj.put("value",StringUtils.isEmpty(map.get("num"))?"":map.get("num"));
                     dataJson.add(jsonObj);
                     json.put("template_id","tty9TkCAAAuPvPjabDdQXGocnG0K24EQ");
-                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                     json.put("content_item",dataJson);
                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
                     }
@@ -582,7 +582,7 @@ public class TimingTask {
                         jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
                         dataJson.add(jsonObj);
                         json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-                        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                         json.put("content_item",dataJson);
                         if (cpList.size() > 0) {
                             wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);

+ 63 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -1,12 +1,21 @@
 package com.management.platform.util;
 
+import com.management.platform.entity.CorpwxJobResult;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.CorpwxJobResultMapper;
+import com.management.platform.service.CorpwxJobResultService;
+import com.management.platform.service.WxCorpInfoService;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.util.List;
 
+@Component
 public class ExcelUtil {
     /**
      * 简单Excel导出
@@ -14,7 +23,23 @@ public class ExcelUtil {
      * @param list      数据
      * @return
      */
-    public static String exportGeneralExcelByTitleAndList(String title, List<List<String>> list, String downloadPath) {
+
+    @Autowired
+    private WxCorpInfoService wxCorpInfoService;
+
+    @Autowired
+    private CorpwxJobResultService corpwxJobResultService;
+
+    public ExcelUtil(){}
+    public static ExcelUtil ExcelUtil;
+
+    @PostConstruct
+    public void init(){
+        ExcelUtil = this;
+    }
+
+
+    public static String exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo,String title, List<List<String>> list, String downloadPath) {
         String result="系统提示:Excel文件导出成功!";
         String fileName= title+".xls";
         try {
@@ -142,6 +167,43 @@ public class ExcelUtil {
             workBook.write(os);
             os.flush();
             os.close();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId =ExcelUtil.wxCorpInfoService.getTranslationMediaId(fileName);
+                System.out.println(fileName);
+                String jobId = ExcelUtil.wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileName, null);
+            /*if(jobId!=null&&!jobId.equals("")){
+                File file=new File(path + fileUrlSuffix);
+                if(file.exists()){
+                    file.delete();
+                }
+            }*/
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    CorpwxJobResult corpwxJobResult = ExcelUtil.corpwxJobResultService.getById(jobId);
+                    if (corpwxJobResult != null) {
+                        if (corpwxJobResult.getErrCode() == 0) {
+                            syncTranslationResult = ExcelUtil.wxCorpInfoService.getSyncTranslationResult(jobId);
+                        } else {
+                            return corpwxJobResult.getErrMsg();
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    return syncTranslationResult;
+                } else {
+                    return  "处理超时...";
+                }
+            }else {
+                return  "/upload/" + fileName;
+            }
         }catch(Exception e) {
             System.out.println(result);
             e.printStackTrace();

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

@@ -119,6 +119,35 @@ public class WorkDayCalculateUtils {
         return list;
     }
 
+    /**
+     * 获取期间的非工作日
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static List<LocalDate> getNonWorkDaysListInRange(String startDate, String endDate) {
+        int daysOffset = 0;
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        List<LocalDate> list = new ArrayList<>();
+        while(true) {
+            localStartDate = localStartDate.plusDays(daysOffset);
+            if (!isWorkDay(localStartDate)) {
+                list.add(localStartDate);
+            }
+            //到达结束日期,结束计算
+            if (localStartDate.isEqual(localEndDate)) {
+                break;
+            }
+            //每次加一天
+            if (daysOffset == 0) {
+                daysOffset = 1;
+            }
+        }
+        return list;
+    }
+
+
     /**
      * 计算给定时间范围内的工作日天数
      * @param startDate
@@ -167,6 +196,47 @@ public class WorkDayCalculateUtils {
         }
         return false;
     }
+    //一周6天工作制,周六也算工作日
+    public static boolean isWorkDayExceptSaturday(LocalDate date) {
+        int year = date.getYear();
+        try {
+            String dateStr = dateTimeFormatter.format(date);
+            Date d = simpleDateFormat.parse(dateStr);
+            boolean isWeekend = date.getDayOfWeek() == DayOfWeek.SUNDAY;
+            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)) {
+                    //存在特殊工作日
+                    return true;
+                } else {
+                    return false;
+                }
+            } 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;
+                } else {
+                    return true;
+                }
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+        }
+        return true;
+    }
 
     public static boolean isWorkDay(LocalDate date) {
         int year = date.getYear();

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

@@ -37,7 +37,7 @@
 
     <!--根据人员获取成本-->
     <select id="getCostByUser" resultType="java.util.Map">
-        SELECT a.id as id, a.name AS user, a.job_number as jobNumber, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.cost) AS
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserid, a.job_number as jobNumber, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.cost) AS
         money
         FROM user AS a
         LEFT JOIN report AS b ON a.id = b.creator_id
@@ -66,7 +66,7 @@
 
     <!-- 根据人员获取自定义的日报数值 -->
     <select id="getCustomDataByUser" resultType="java.util.Map">
-        SELECT a.id as id, a.name AS user, a.job_number as jobNumber,c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserid, a.job_number as jobNumber,c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
         FROM user AS a
         LEFT JOIN report AS b ON a.id = b.creator_id
         LEFT JOIN project AS c ON b.project_id = c.id

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

@@ -31,7 +31,15 @@
 
     <select id="customSelect" resultMap="RichMap">
         SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,project_requirement.contract_req,project_requirement.department_speed,project_requirement.start_date,project_requirement.end_date,
-        (SELECT GROUP_CONCAT(DISTINCT user.`name`) FROM report LEFT JOIN `user` ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id
+        (SELECT GROUP_CONCAT(
+        <choose>
+            <when test="key==1">
+                DISTINCT user.`corpwx_userid`
+            </when>
+            <otherwise>
+                DISTINCT user.`name`
+            </otherwise>
+        </choose>) FROM report LEFT JOIN `user` ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id
         <if test="refTaskGroupUserIdList!=null">
         and user.`id` in
         <foreach collection="refTaskGroupUserIdList" open="(" close=")" separator="," item="item">

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

@@ -27,7 +27,7 @@
 
 
     <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,a.week_day as weekDay,
+        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,user.corpwx_userid as corpwxUserid,a.week_day as weekDay,
         week_day_txt as weekDayTxt,card_time as cardTime, outdoor_time as outdoorTime, ask_leave_time as askLeaveTime 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}

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -3,7 +3,7 @@
     <!-- <div :style="'width:' + selectWidth + 'px;height:' + selectHeight + 'px'" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'"> -->
     <div :class="disabled ? 'disabledTrue' : 'disabledFalse'" @mouseenter="moveIonDiv" @mouseleave="outIonDiv">
         <div :style="`width:${selectWidth}px;height:${selectHeight}px`" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'">
-            <div v-if="!multiSelect" :style="'line-height: '+selectHeight+'px'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
+            <div v-if="!multiSelect" :style="'line-height: '+selectHeight+'px;font-size: '+selectFontSize+'px;'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
                 <ww-open-data type='userName' :openid='selectName'></ww-open-data>
                 <!-- {{selectName}} -->
             </div>
@@ -19,7 +19,7 @@
                     </span>
                     <span v-if="tile">
                         <span class="all" style="margin-right: 6px" v-for="(items, indexs) in multiSelectList" :key="indexs">
-                            <ww-open-data type='userName' :openid='multiSelectList[0].name'></ww-open-data>
+                            <ww-open-data type='userName' :openid='items.name'></ww-open-data>
                             <!-- {{items.name}} -->
                             <i class="el-icon-error" @click.stop="deleteMultiSelectList(indexs)" v-if="!disabled"></i>
                         </span>
@@ -43,6 +43,7 @@
                         <span v-if="item.auditorName">
                             <ww-open-data type='userName' :openid='item.auditorName'></ww-open-data>
                         </span>
+                        <!-- {{item.name || item.auditorName}} -->
                     </span>
 
                     <span v-if="multiSelect">
@@ -181,6 +182,8 @@ export default {
                                 this.selectName = this.options[i].name || this.options[i].auditorName
                             }
                         }
+                    } else {
+                        this.selectName = this.$t('defaultText.pleaseChoose')
                     }
                 }
                 if(this.multiSelect) {

+ 46 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -55,7 +55,22 @@
                         <el-table-column property="type" :label="$t('other.messageContent')" align="left">
                             <template slot-scope="scope">
                                 <el-link type="primary" :underline="false" @click="locationHerf(scope.row.id,scope.row.content, scope.row.type)">
-                                    <span style="font-size:13px;">{{scope.row.msg==null?msgTypeTxt[scope.row.type]:scope.row.msg}}</span>
+                                    <span style="font-size:13px;">
+                                        <span v-if="scope.row.msg == null">
+                                            {{msgTypeTxt[scope.row.type]}}
+                                        </span>
+                                        <span v-else>
+                                            <span v-if="user.userNameNeedTranslate != 1">
+                                                {{scope.row.msg}}
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate == 1">
+                                                {{scope.row.omg.textOne}}
+                                                <ww-open-data type='userName' :openid='scope.row.omg.textTwo'></ww-open-data>
+                                                {{scope.row.omg.textThree}}
+                                            </span>
+                                        </span>
+                                        <!-- {{scope.row.msg==null?msgTypeTxt[scope.row.type]:scope.row.msg}} -->
+                                    </span>
                                 </el-link>
                             </template> 
                         </el-table-column>
@@ -404,6 +419,36 @@
                 res => {
                     if (res.code == "ok") {
                         var list = res.data;
+                        if(this.user.userNameNeedTranslate == 1) {
+                            let msgArr = res.data
+                            for(var i in msgArr) {
+                                if(msgArr[i].msg) {
+                                    let caozuo = JSON.parse(JSON.stringify(msgArr[i].msg))
+                                    if(caozuo.indexOf('$userName=') != '-1') {
+                                        let textOne = caozuo.split('$userName=')[0]
+                                        let textTwo = caozuo.split('$userName=')[1].split('$')[0]
+                                        let textThree = caozuo.split('$userName=')[1].split('$')[1]
+                                        msgArr[i].omg = {
+                                            textOne: textOne,
+                                            textTwo: textTwo,
+                                            textThree: textThree
+                                        }
+                                    } else {
+                                        msgArr[i].omg = {
+                                            textOne: msgArr[i].msg,
+                                            textTwo: '',
+                                            textThree: ''
+                                        }
+                                    }
+                                } else {
+                                    msgArr[i].omg = {
+                                        textOne: '',
+                                        textTwo: '',
+                                        textThree: ''
+                                    }
+                                }
+                            }
+                        }
                         this.popoverData = res.data;
                         var num = 0;
                         for(var i in list) {
@@ -426,7 +471,6 @@
                     });
                 });
             },
-
             //点击消息的跳转
             locationHerf(id, date, type) {
                 this.http.post( this.port.manage.check, { id: id },

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue

@@ -49,7 +49,7 @@
     export default {
         data() {
             return {
-                typeList:[{id:0,name:'工时统计表简易版'},{id:1,name:'工时统计基础版'},
+                typeList:[{id:1,name:'工时统计基础版'},
                 {id:2,name:'项目管理专业版'},{id:3,name:'企业办公旗舰版'},{id:4,name:'工程管理专业版'}],
                 logining: false,
                 showTimer: false,

+ 13 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -184,11 +184,14 @@
                 </el-table-column>
                 <el-table-column prop="executor_name" :label="$t('zhi-hang-ren')"  width="200">
                   <template slot-scope="scope" >
-                    <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.executor_name'></ww-open-data>
-                    </span>
-                    <span v-if="user.userNameNeedTranslate != '1'">
-                      {{scope.row.executor_name}}
+                    <span v-for="(items, indexs) in scope.row.executor_name" :key="indexs">
+                      <span v-if="user.userNameNeedTranslate == '1'">
+                        <ww-open-data type='userName' :openid='items'></ww-open-data>
+                      </span>
+                      <span v-if="user.userNameNeedTranslate != '1'">
+                        {{items}}
+                      </span>
+                      <span v-if="indexs < scope.row.executor_name.length - 1">,</span>
                     </span>
                   </template>
                 </el-table-column>
@@ -1567,6 +1570,11 @@ export default {
                 } else {
                   res.data.records[i].customName = res.data.records[i].project_name
                 }
+              }
+              for(var i in res.data.records) {
+                if(res.data.records[i].executor_name) {
+                  res.data.records[i].executor_name = res.data.records[i].executor_name.split(',')
+                }
               }
                 this.list1 = res.data.records;
                 this.listArr1 = []

+ 35 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -63,11 +63,14 @@
             <!-- 报销人 -->
             <el-form-item :label="$t('peopleconcerned')" prop="ownerId">
               <!--普通员工只能自己填报自己的 -->
-              <el-select v-model="addForm.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="!permissions.costAudit" filterable="true">
+              <el-select v-if="user.userNameNeedTranslate != '1'" v-model="addForm.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
               </el-select>
+
+              <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :widthStr="'150'" :distinction="'1'" :subject="users" :disabled="!permissions.costAudit" :subjectId="addForm.ownerId" ref="selectCat" @selectCal="selectCal"></selectCat>
+
             </el-form-item>
             <!-- 填报日期 -->
             <el-form-item :label="$t('fillinthedate')" style="position: relative;top: 38px;" prop="createDate">
@@ -198,11 +201,13 @@
           <el-form label-width="70px" inline >
             <!-- 报销人 -->
             <el-form-item :label="$t('peopleconcerned')">
-              <el-select v-model="ownerId" size="small" clearable :placeholder="$t('selecttheapplicant')" style="width: 120px" :disabled="!permissions.costAudit" filterable="true">
+              <el-select v-if="user.userNameNeedTranslate != '1'" v-model="ownerId" size="small" clearable :placeholder="$t('selecttheapplicant')" style="width: 120px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
               </el-select>
+
+              <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'small'" :widthStr="'120'" :distinction="'2'" :clearable="true" :subject="users" :disabled="!permissions.costAudit" :subjectId="ownerId" ref="selectCat" @selectCal="selectCal"></selectCat>
             </el-form-item>
             <!-- 单据编号 -->
             <el-form-item :label="$t('receiptnumber')" >
@@ -243,7 +248,18 @@
                   <span style="float:right;margin-right:20px">{{scope.row.totalAmount ? scope.row.totalAmount.toFixed(2) : '0'}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="ownerName" :label="$t('peopleconcerned')" ></el-table-column>
+              <el-table-column prop="ownerName" :label="$t('peopleconcerned')" >
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate != 1">
+                      {{scope.row.ownerName}}
+                    </span>
+                    <span v-if="user.userNameNeedTranslate == 1">
+                      <ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data>
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column prop="createDate" :label="$t('fillinthedate')" ></el-table-column>
               <el-table-column prop="ticketNum" :label="$t('invoicenumber')" ></el-table-column>
               <el-table-column prop="type" :label="$t('ppertype')" >
@@ -306,11 +322,14 @@
           <el-form :model="ParticularsList" label-width="80px">
             <el-form-item :label="$t('peopleconcerned')" style="width: 270px" :rules="{ required: true, message: $t('pleaseselecttheapplicant'), trigger: 'blur' }">
               <!-- <el-input v-show="flg" v-model="ParticularsList.ownerName" disabled ></el-input> -->
-              <el-select v-model="ParticularsList.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId">
+              <!-- <el-select v-model="ParticularsList.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
-              </el-select>
+              </el-select> -->
+
+              <selectCat v-if="user.userNameNeedTranslate != '1'" :size="'medium'" :widthStr="'150'" :distinction="'3'" :subject="users" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId" :subjectId="ParticularsList.ownerId" ref="selectCat" @selectCal="selectCal"></selectCat>
+
             </el-form-item>
             <el-form-item :label="$t('fillinthedate')">
               <!-- <el-input v-model="ParticularsList.createDate" :disabled="flg"></el-input> -->
@@ -981,6 +1000,7 @@ export default {
                 if (!this.permissions.costAudit) {
                     this.addForm.ownerId = this.user.id;
                     this.addForm.status = 1;
+                    this.$forceUpdate()
                 }
             } else {
                 this.$message({
@@ -1465,6 +1485,16 @@ export default {
         // console.log(sums, 123)
         this.$nextTick(()=>{ this.$refs.tab.doLayout()})
         return sums;
+      },
+      // 自定义组件事件
+      selectCal(obj) {
+        if(obj.distinction == '1') {
+          this.addForm.ownerId = obj.id
+        } else if(obj.distinction == '2') {
+          this.ownerId = obj.id
+        } else if(obj.distinction == '3') {
+          this.ParticularsList.ownerId = obj.id
+        }
       }
   },
 };

+ 12 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -50,7 +50,18 @@
                                 </template>
                             </el-table-column>
                             <el-table-column :label="$t('xiabo')" prop="indate" align="center" min-width="200"></el-table-column>
-                            <el-table-column :label="$t('caozuo')" prop="userName" align="center" min-width="120"></el-table-column>
+                            <el-table-column :label="$t('caozuo')" prop="userName" align="center" min-width="120">
+                                <template slot-scope="scope">
+                                    <div>
+                                        <span v-if="user.userNameNeedTranslate != 1">
+                                            {{scope.row.userName}}
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                                        </span>
+                                    </div>
+                                </template>
+                            </el-table-column>
                             <el-table-column :label="$t('bei-zhu')" prop="remark" align="left" header-align="left" show-overflow-tooltip min-width="200"></el-table-column>
                             <el-table-column label="" align="center" fixed="right" v-if="permissions.projectAllocate">
                                 <template slot-scope="scope">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -1328,7 +1328,7 @@ import { error } from 'dingtalk-jsapi';
                         return prev;
                     }
                     }, 0);
-                    sums[index] += this.$t('yuan');
+                    sums[index] = sums[index].toFixed(2) + this.$t('yuan');
                 } else {
                     sums[index] = 'N/A';
                 }

+ 8 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -105,7 +105,14 @@
                     <div style="margin-top:10px;color:#999;">{{ $t('newspaperauditor') }}</div>
                     <div>
                         <span v-if="project.auditorList.length == 0" style="margin:10px;">-</span>
-                        <el-link v-for="item in project.auditorList" :key="item.id" style="margin:10px;" @click="showUser(item.auditorId)">{{item.auditorName}}</el-link>
+                        <el-link v-for="item in project.auditorList" :key="item.id" style="margin:10px;" @click="showUser(item.auditorId)">
+                            <span v-if="user.userNameNeedTranslate != 1">
+                                {{item.auditorName}}
+                            </span>
+                            <span v-if="user.userNameNeedTranslate == 1">
+                                <ww-open-data type='userName' :openid='item.auditorName'></ww-open-data>
+                            </span>
+                        </el-link>
                     </div>
                    
                     <div v-show="project.isPublic == 0" style="color:#999;">{{ $t('participantin') }}</div>

+ 6 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -115,7 +115,7 @@
                         </el-option>
                     </el-select>
 
-                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'1'" @selectCal="selectCal"></selectCat>
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'1'" :clearable="true" @selectCal="selectCal"></selectCat>
 
                 </el-form-item>
                 <el-form-item>
@@ -128,7 +128,7 @@
                         </el-option>
                     </el-select>
 
-                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'2'" @selectCal="selectCal"></selectCat>
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'2'" :clearable="true" @selectCal="selectCal"></selectCat>
 
                 </el-form-item>
                 <!-- 部门筛选 -->
@@ -504,18 +504,21 @@
                 </el-form-item>
                 <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 && addForm.isPublic == 0) || (!permissions.projectManagement && user.id != addForm.creatorId)" filterable placeholder="请选择项目经理" style="width:32%;" > -->
+
                     <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
 
-                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'"></selectCat>
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'" @selectCal="selectCal"></selectCat>
 
                 </el-form-item>
                 <el-form-item :label="$t('newspaperauditor')" v-show="user.timeType.reportAuditType==0">
                     <el-select v-if="user.userNameNeedTranslate != '1'" v-model="addForm.auditUserIds" multiple="true" :disabled=" !(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
+
                     <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :tile="true" :widthStr="'800'" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" :subjectId="addForm.auditUserIds" :subject="participator" :clearable="false" :distinction="'10'"  :multiSelect="true" @selectCal="selectCal"></selectCat>
+
                 </el-form-item>
                 <!--专业项目协作版本功能 -->
                 <el-form-item :label="$t('ji-bie')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.packageProject==1">

+ 25 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -85,7 +85,21 @@
     <el-table height="90%" :loading="demandListLoading" :data="demandList">
       <el-table-column label="项目编号" prop="projectCode" width="160"></el-table-column>
       <el-table-column label="项目名称" prop="projectName" min-width="240"></el-table-column>
-      <el-table-column label="近七日活跃人员" prop="activeUsers" min-width="240"></el-table-column>
+      <el-table-column label="近七日活跃人员" prop="activeUsers" min-width="240">
+        <template slot-scope="scope">
+          <div>
+            <span v-if="user.userNameNeedTranslate == 1">
+              <span v-for="(item, index) in scope.row.activeUsers" :key="index">
+                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                <span v-if="index < scope.row.activeUsers.length - 1">,</span>
+              </span>
+            </span>
+            <span v-if="user.userNameNeedTranslate != 1">
+              {{scope.row.activeUsers}}
+            </span>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column label="开始时间 - 结束时间" min-width="240">
         <template slot-scope="scope">
           <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
@@ -197,7 +211,9 @@ export default {
       editDate1: '',
       editDate2: '',
       taskgroupList: [],
-      valuex2: ''
+      valuex2: '',
+
+      user: JSON.parse(sessionStorage.getItem("user")),
 
     }
   },
@@ -544,6 +560,13 @@ export default {
           if(res.code == 'ok'){
             this.demandListLoading = false
             this.total = res.data.total
+            if(this.user.userNameNeedTranslate == 1) {
+              for(let i in res.data.records) {
+                if(res.data.records[i].activeUsers){
+                  res.data.records[i].activeUsers = res.data.records[i].activeUsers.split(',')
+                }
+              }
+            }
             this.demandList = res.data.records
           }else {
             this.demandListLoading = false

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -981,7 +981,10 @@ import { error } from 'dingtalk-jsapi';
                     if(res.code == 'ok') {
                         if(this.user.userNameNeedTranslate == 1) {
                             for(var i in res.data.records) {
-                                let arr = res.data.records[i].executorName.split(',')
+                                let arr = []
+                                if(res.data.records[i].executorName) {
+                                    arr = res.data.records[i].executorName.split(',')
+                                }
                                 res.data.records[i].executorNameList = arr
                             }
                         }

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

@@ -447,7 +447,7 @@
                             </el-option>
                         </el-select>
 
-                        <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'small'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="true" @selectCatCli="selectCatCli"></selectCat>
+                        <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="domain.projectAuditorId ? true : false" @selectCatCli="selectCatCli"></selectCat>
 
                     </el-form-item>
                     <!-- 111111 -->
@@ -4076,6 +4076,9 @@
                         this.jsTime = quanbu
                         var list = res.data;
                         this.report = list;
+                        this.reportTimeType = this.report.timeType;
+                        //从后端接口的数据设置是否是周末,后端会判断节假日以及中航工业一周6天工作日的情况
+                        this.isWeekend = !this.report.isWorkDay;
                         
                         this.canCancelInDialog = false
                         if(list.report.length != 0) {
@@ -5669,9 +5672,12 @@
                             } else {
                                 formData.append("stage", "-");
                             }
+                            console.log(this.workForm.domains[i].projectAuditorId, '审核人的id')
                             if (this.workForm.domains[i].projectAuditorId) {
                                 formData.append("projectAuditorId", this.workForm.domains[i].projectAuditorId);
                             } else {
+                                console.log('执行到了这里')
+                                console.log(this.user.timeType.reportAuditType)
                                 if (this.user.timeType.reportAuditType == 0) {
                                     this.$message({
                                         message: this.$t('message.Pleasespecifyaprojectreviewer'),

+ 24 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -276,19 +276,40 @@
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <div>
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                            {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                            <!-- {{item.userName}} -->
+                                            <span v-if="user.userNameNeedTranslate == 1">
+                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate != 1">
+                                                {{item.userName}}
+                                            </span>
+                                            /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                         </span>
                                     </div>
                                     <div slot="reference" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;">
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                            {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                            <!-- {{item.userName}} -->
+                                            <span v-if="user.userNameNeedTranslate == 1">
+                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate != 1">
+                                                {{item.userName}}
+                                            </span>
+                                            /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                         </span>
                                     </div>
                                     </el-popover>
                                 </div>
                                 <div style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;" v-else>
                                     <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                        {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                        <!-- {{item.userName}} -->
+                                        <span v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate != 1">
+                                            {{item.userName}}
+                                        </span>
+                                        /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                     </span>
                                 </div>
                             </div>