瀏覽代碼

Merge remote-tracking branch 'origin/master'

Guo1B0 1 年之前
父節點
當前提交
604e313b44
共有 24 個文件被更改,包括 774 次插入212 次删除
  1. 9 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FeishuInfoController.java
  3. 9 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  4. 10 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  5. 61 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  6. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java
  7. 158 91
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  8. 13 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/GroupBudgetReview.java
  9. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalLog.java
  10. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserWithBeisen.java
  11. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  12. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  13. 97 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  14. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  15. 66 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  16. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/BeiSenUtils.java
  17. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/GroupBudgetReviewMapper.xml
  18. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserWithBeisenMapper.xml
  19. 9 9
      fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue
  20. 57 14
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue
  21. 242 23
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  22. 4 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  23. 4 4
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue
  24. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

+ 9 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java

@@ -194,18 +194,18 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         UpdateWrapper<Contacts> contactsUpdateWrapper = new UpdateWrapper<>();
         List<BusinessOpportunity> opportunityList = businessOpportunityMapper.selectList(new QueryWrapper<BusinessOpportunity>().in("contacts_id", ids));
         if (!opportunityList.isEmpty()){
-//            List<BusinessOpportunity> collect = opportunityList.stream().filter(o -> o.getStage() < 4).collect(Collectors.toList());
-//            if (!collect.isEmpty()){
-//                String oName=" ";
-//                for (BusinessOpportunity businessOpportunity : collect) {
-//                    oName+=businessOpportunity.getName()+" ";
-//                }
-//                msg.setError(oName+"等商机正在进行且跟联系人有关");
-//            }
+            List<BusinessOpportunity> collect = opportunityList.stream().filter(o -> o.getStageId()!=null&&o.getStageId() < 5).collect(Collectors.toList());
+            if (!collect.isEmpty()){
+                String oName=" ";
+                for (BusinessOpportunity businessOpportunity : collect) {
+                    oName+=businessOpportunity.getName()+" ";
+                }
+                msg.setError(oName+"等商机正在进行且跟联系人有关");
+            }
         }
         List<Task> taskList = taskMapper.selectList(new QueryWrapper<Task>().in("contacts_id", ids));
         if (!taskList.isEmpty()){
-            List<Task> collect = taskList.stream().filter(t -> t.getStatus() != 2).collect(Collectors.toList());
+            List<Task> collect = taskList.stream().filter(t ->t.getStatus()!=null&&t.getStatus() != 2).collect(Collectors.toList());
             if (!collect.isEmpty()){
                 msg.setError("存在任务未完成且跟联系人有关");
             }

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

@@ -609,7 +609,7 @@ public class FeishuInfoController {
         return feishuInfoService.initSuperManager(corpid, name);
     }
 
-    //"企业微信数据回调"
+    //"飞书数据回调"
     @RequestMapping(value = "/dataCallback", method = RequestMethod.POST)
     @ResponseBody
     public void dataCallback(@RequestBody JSONObject jsonParam, HttpServletResponse response) throws IOException {

+ 9 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -107,6 +107,8 @@ public class GroupBudgetReviewController {
             groupBudgetReview.setRejectReason(rejectReason);
         }
         groupBudgetReview.setStatus(checkType);
+        groupBudgetReview.setCheckerId(checker.getId());
+        groupBudgetReview.setChecker(checker.getName());
         if(!groupBudgetReviewService.updateById(groupBudgetReview)){
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
@@ -157,7 +159,7 @@ public class GroupBudgetReviewController {
     }
 
     @RequestMapping("/list")
-    public HttpRespMsg list(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
+    public HttpRespMsg list(String startDate,String endDate,Integer projectId,Integer status,String checkUserId){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
 
@@ -171,8 +173,8 @@ public class GroupBudgetReviewController {
         if(status!=null){
             queryWrapper.eq(GroupBudgetReview::getStatus,status-1);
         }
-        if(!StringUtils.isEmpty(submitUserId)){
-            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        if(!StringUtils.isEmpty(checkUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCheckerId,checkUserId);
         }
         List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
         TimeType timeType = timeTypeMapper.selectById(companyId);
@@ -201,7 +203,7 @@ public class GroupBudgetReviewController {
     }
 
     @RequestMapping("/export")
-    public HttpRespMsg export(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
+    public HttpRespMsg export(String startDate,String endDate,Integer projectId,Integer status,String checkUserId){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -215,10 +217,10 @@ public class GroupBudgetReviewController {
             queryWrapper.eq(GroupBudgetReview::getProjectId,projectId);
         }
         if(status!=null){
-            queryWrapper.eq(GroupBudgetReview::getStatus,status);
+            queryWrapper.eq(GroupBudgetReview::getStatus,status-1);
         }
-        if(!StringUtils.isEmpty(submitUserId)){
-            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        if(!StringUtils.isEmpty(checkUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCreatorId,checkUserId);
         }
         List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
         List<List<String>> dataList=new ArrayList<>();

+ 10 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -88,19 +88,18 @@ public class ProjectApprovalController {
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         List<ProjectCategory> categoryList = projectCategoryService.list(new LambdaQueryWrapper<ProjectCategory>().eq(ProjectCategory::getCompanyId, companyId));
-        projectApproval.setCompanyId(companyId);
-        projectApproval.setCreateDate(LocalDate.now());
-        projectApproval.setCreatorId(user.getId());
+        //编辑重新提交修改状态为待审核
+        projectApproval.setStatus(0);
+        if(projectApproval.getId()==null){
+            projectApproval.setCompanyId(companyId);
+            projectApproval.setCreateDate(LocalDate.now());
+            projectApproval.setCreatorId(user.getId());
+        }
         Optional<ProjectCategory> category = categoryList.stream().filter(c -> c.getId().equals(projectApproval.getCategory())).findFirst();
         if(category.isPresent()){
             projectApproval.setCategoryName(category.get().getName());
         }
-        Integer count;
-        if(projectApproval.getId()==null){
-            count = projectMapper.selectCount(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, companyId).eq(Project::getProjectCode, projectApproval.getProjectCode()));
-        }else {
-            count = projectMapper.selectCount(new LambdaQueryWrapper<Project>().ne(Project::getId,projectApproval.getId()).eq(Project::getCompanyId, companyId).eq(Project::getProjectCode,  projectApproval.getProjectCode()));
-        }
+        Integer count=projectMapper.selectCount(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, companyId).eq(Project::getProjectCode, projectApproval.getProjectCode()));
         if(count>0){
             msg.setError("已存在项目编号为["+projectApproval.getProjectCode()+"]的项目");
             return msg;
@@ -214,7 +213,7 @@ public class ProjectApprovalController {
                                 value.put("text",arr[projectApproval.getLevel()-1]);
                                 break;
                             case "合同金额":
-                                value.put("text",projectApproval.getContractAmount()==null?0:projectApproval.getContractAmount());
+                                value.put("text",projectApproval.getContractAmount()==null?String.valueOf(0):String.valueOf(projectApproval.getContractAmount()));
                                 break;
                             case "计划开始日期":
                                 value.put("text",projectApproval.getPlanStartDate()==null?"":df.format(projectApproval.getPlanStartDate()));
@@ -244,6 +243,7 @@ public class ProjectApprovalController {
         ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
         projectApprovalLog.setCreateTime(LocalDateTime.now());
         projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+        projectApprovalLog.setUserName(user.getName());
         if(projectApproval.getId()==null){
             //提交
             projectApprovalLog.setType(0);

+ 61 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1556,26 +1556,74 @@ public class ReportController {
                 }
             }
         }
+        //针对填写日报
+        if (!createDate[0].contains("@")) {
+            if (company.getId() == 3918) {
+                List<UserCorpwxTime> cardTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", user.getCorpwxUserid()).eq("create_date", createDate[0]));
+                //凡己科技,提交时仅针对请假的时候做限制
+                for (Report r : reportList) {
+                    Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(r.getCreateDate())).findFirst();
+                    if (first.isPresent()) {
+                        if (first.get().getAskLeaveTime() >= comTimeType.getAllday()) {
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError(dtf.format(r.getCreateDate())+"全天请假,不可填报");
+                            return msg;
+                        }
+                    }
+                }
+            }
+        }
+
 
         if (createDate[0].contains("@") && targetUserList == null) {
             //个人批量填报,判断是否需要考勤校验
             if (comTimeType.getSyncCorpwxTime() == 1) {
                 String[] dateArr = createDate[0].split("@");
                 List<UserCorpwxTime> cardTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", user.getCorpwxUserid()).between("create_date", dateArr[0], dateArr[1]));
-                //提交日报时,考勤记录不能为空或时长为0
-                if (comTimeType.getNotAllowedNoAttendance() == 1 && draft == 0) {
+                if (company.getId() == 3918) {
+                    //凡己科技,提交时仅针对请假的时候做限制
+                    for (Report r : reportList) {
+                        Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(r.getCreateDate())).findFirst();
+                        if (first.isPresent()) {
+                            if (first.get().getAskLeaveTime() >= comTimeType.getAllday()) {
+                                HttpRespMsg msg = new HttpRespMsg();
+                                msg.setError(dtf.format(r.getCreateDate())+"全天请假,不可填报");
+                                return msg;
+                            }
+                        }
+                    }
+                } else {
+                    //提交日报时,考勤记录不能为空或时长为0
+                    if (comTimeType.getNotAllowedNoAttendance() == 1 && draft == 0) {
+                        String str = "";
+                        for (Report r : reportList) {
+                            Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(r.getCreateDate())).findFirst();
+                            if (first.isPresent()) {
+                                if (first.get().getWorkHours() == 0) {
+                                    str += dtf.format(r.getCreateDate()) + ",";
+                                }
+                            } else {
+                                str += dtf.format(r.getCreateDate()) + ",";
+                            }
+                        }
+                        //有无考勤的日期
+                        if (str.length() > 0) {
+                            str = str.substring(0, str.length()-1);
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError(MessageUtils.message("report.lackCardTime", str));
+                            return msg;
+                        }
+                    }
                     String str = "";
                     for (Report r : reportList) {
                         Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(r.getCreateDate())).findFirst();
                         if (first.isPresent()) {
-                            if (first.get().getWorkHours() == 0) {
+                            double cardTime = first.get().getWorkHours();
+                            if (r.getWorkingTime() > cardTime) {
                                 str += dtf.format(r.getCreateDate()) + ",";
                             }
-                        } else {
-                            str += dtf.format(r.getCreateDate()) + ",";
                         }
                     }
-                    //有无考勤的日期
                     if (str.length() > 0) {
                         str = str.substring(0, str.length()-1);
                         HttpRespMsg msg = new HttpRespMsg();
@@ -1583,22 +1631,6 @@ public class ReportController {
                         return msg;
                     }
                 }
-                String str = "";
-                for (Report r : reportList) {
-                    Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(r.getCreateDate())).findFirst();
-                    if (first.isPresent()) {
-                        double cardTime = first.get().getWorkHours();
-                        if (r.getWorkingTime() > cardTime) {
-                            str += dtf.format(r.getCreateDate()) + ",";
-                        }
-                    }
-                }
-                if (str.length() > 0) {
-                    str = str.substring(0, str.length()-1);
-                    HttpRespMsg msg = new HttpRespMsg();
-                    msg.setError(MessageUtils.message("report.lackCardTime", str));
-                    return msg;
-                }
             }
         }
         //更新填报时间
@@ -1957,7 +1989,7 @@ public class ReportController {
     }
 
     @RequestMapping("/getUserDailyWorkTime")
-    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception{
         return reportService.getUserDailyWorkTime(request, startDate, endDate);
     }
 
@@ -1972,7 +2004,7 @@ public class ReportController {
     }
 
     @RequestMapping("/exportUserDailyWorkTime")
-    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception{
         return reportService.exportUserDailyWorkTime(request, startDate, endDate);
     }
 
@@ -2510,5 +2542,10 @@ public class ReportController {
         userMapper.updateById(user);
         return msg;
     }
+
+    @RequestMapping("/changeReminder")
+    public HttpRespMsg changeReminder() throws Exception {
+        return reportService.changeReminder(request);
+    }
 }
 

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

@@ -83,6 +83,9 @@ public class UserWithBeisenController {
                 userWithBeisen.setMobilePhone(employeeInfo.getString("mobilePhone"));
                 userWithBeisen.setName(employeeInfo.getString("name"));
                 userWithBeisen.setUserId(employeeInfo.getString("userID"));
+                if(recordInfo.containsKey("extOTWagetype_110324_985711501")){
+                    userWithBeisen.setExtOTWagetype(recordInfo.getIntValue("extOTWagetype_110324_985711501"));
+                }
                 Optional<UserWithBeisen> first = allBeisenList.stream().filter(a ->a.getJobNumber()!=null&& a.getJobNumber().equals(recordInfo.getString("jobNumber"))).findFirst();
                 if(first.isPresent()){
                     userWithBeisen.setId(first.get().getId());
@@ -103,7 +106,7 @@ public class UserWithBeisenController {
         return httpRespMsg;
     }
 
-    @RequestMapping("getSwipingCards")
+    @RequestMapping("/getSwipingCards")
     public HttpRespMsg getSwipingCards(String createDate){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();

+ 158 - 91
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -589,100 +589,121 @@ public class WeiXinCorpController {
                 }else if("sys_approval_change".equals(event)){
                     //审批动作事件,发生在该企业已经开通应用的情况下。
                     System.out.println("审批动作事件");
-                    org.json.JSONObject approvalInfo = jsonObject.getJSONObject("ApprovalInfo");
-                    String spNo = approvalInfo.getString("SpNo");
-                    ProjectApproval projectApproval = projectApprovalMapper.selectOne(new LambdaQueryWrapper<ProjectApproval>().eq(ProjectApproval::getWxCorpSpNo, spNo));
-                    if(projectApproval!=null){
-                        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, projectApproval.getCompanyId()));
-                        int status = approvalInfo.getInt("SpStatus");
-                        ProjectApproval pa=new ProjectApproval();
-                        pa.setId(projectApproval.getId());
-                        switch (status){
-                            case 1://审批中 无需修改
-                                break;
-                            case 2://已通过
-                                pa.setStatus(1);
-                                projectApprovalMapper.updateById(pa);
-                                //创建项目数据
-                                //立项审核通过后创建项目数据
-                                Project project=new Project();
-                                BeanUtils.copyProperties(projectApproval,project);
-                                project.setId(null);
-                                project.setCreateDate(LocalDate.now());
-                                List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, projectApproval.getId()));
-                                List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, projectApproval.getId()));
-                                List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, projectApproval.getId()));
-                                projectService.save(project);
-                                List<ProjectBasecost> projectBasecostList=new ArrayList<>();
-                                List<Participation> participationList=new ArrayList<>();
-                                List<ProjectAuditor> projectAuditorList=new ArrayList<>();
-                                projectApprovalBasecostList.forEach(p->{
-                                    ProjectBasecost projectBasecost=new ProjectBasecost();
-                                    BeanUtils.copyProperties(p,projectBasecost);
-                                    projectBasecost.setId(null);
-                                    projectBasecost.setProjectId(project.getId());
-                                    projectBasecostList.add(projectBasecost);
-                                });
-                                participationApprovalList.forEach(p->{
-                                    Participation participation=new Participation();
-                                    BeanUtils.copyProperties(p,participation);
-                                    participation.setId(null);
-                                    participation.setProjectId(project.getId());
-                                    participationList.add(participation);
-                                });
-                                projectApprovalAuditorList.forEach(p->{
-                                    ProjectAuditor projectAuditor=new ProjectAuditor();
-                                    BeanUtils.copyProperties(p,projectAuditor);
-                                    projectAuditor.setId(null);
-                                    projectAuditor.setProjectId(project.getId());
-                                    projectAuditorList.add(projectAuditor);
-                                });
-                                projectBasecostService.saveBatch(projectBasecostList);
-                                participationService.saveBatch(participationList);
-                                projectAuditorService.saveBatch(projectAuditorList);
-                                break;
-                            case 3://已驳回
-                                pa.setStatus(2);
-                                projectApprovalMapper.updateById(pa);
-                                break;
-                            case 4://已撤销 删除立项数据
-                                projectApprovalMapper.deleteById(projectApproval.getId());
-                                projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
-                                projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
-                                projectApprovalCheckService.remove(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId,projectApproval.getId()).eq(ProjectApprovalCheck::getStatus,0));
-                                return "success";
-                        }
-                        org.json.JSONArray spRecord = approvalInfo.getJSONArray("SpRecord");
-                        //获取到审批节点 生成审核记录
-                        List<ProjectApprovalLog> projectApprovalLogList=new ArrayList<>();
-                        for (int i = 0; i < spRecord.length(); i++) {
-                            org.json.JSONObject object = spRecord.getJSONObject(i);
-                            org.json.JSONArray details = object.getJSONArray("Details");
-                            for (int i1 = 0; i1 < details.length(); i1++) {
-                                org.json.JSONObject detail = details.getJSONObject(i1);
-                                org.json.JSONObject approvor = detail.getJSONObject("Approvor");
-                                //分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
-                                int spStatus = detail.getInt("SpStatus");
-                                String userId = approvor.getString("UserId");
-                                Optional<User> first = userList.stream().filter(f -> f.getCorpwxUserid().equals(userId)).findFirst();
-                                if(first.isPresent()){
-                                    //新增操作记录数据
-                                    ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
-                                    projectApprovalLog.setCreateTime(LocalDateTime.now());
-                                    projectApprovalLog.setProjectApprovalId(projectApproval.getId());
-                                    projectApprovalLog.setUserName(first.get().getName());
-                                    projectApprovalLog.setType(spStatus);
-                                    projectApprovalLogList.add(projectApprovalLog);
+                    System.out.println(jsonObject.toString());
+                    if(jsonObject.has("ApprovalInfo")){
+                        org.json.JSONObject approvalInfo = jsonObject.getJSONObject("ApprovalInfo");
+                        Long spNo = approvalInfo.getLong("SpNo");
+                        ProjectApproval projectApproval = projectApprovalMapper.selectOne(new LambdaQueryWrapper<ProjectApproval>().eq(ProjectApproval::getWxCorpSpNo, String.valueOf(spNo)));
+                        if(projectApproval!=null){
+                            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, projectApproval.getCompanyId()));
+                            int status = approvalInfo.getInt("SpStatus");
+                            ProjectApproval pa=new ProjectApproval();
+                            pa.setId(projectApproval.getId());
+                            switch (status){
+                                case 1://审批中 无需修改
+                                    break;
+                                case 2://已通过
+                                    pa.setStatus(1);
+                                    projectApprovalMapper.updateById(pa);
+                                    //创建项目数据
+                                    //立项审核通过后创建项目数据
+                                    Project project=new Project();
+                                    BeanUtils.copyProperties(projectApproval,project);
+                                    project.setId(null);
+                                    project.setStatus(1);//默认进行中状态
+                                    project.setCreateDate(LocalDate.now());
+                                    project.setApproveId(projectApproval.getId());
+                                    List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, projectApproval.getId()));
+                                    List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, projectApproval.getId()));
+                                    List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, projectApproval.getId()));
+                                    projectService.save(project);
+                                    List<ProjectBasecost> projectBasecostList=new ArrayList<>();
+                                    List<Participation> participationList=new ArrayList<>();
+                                    List<ProjectAuditor> projectAuditorList=new ArrayList<>();
+                                    projectApprovalBasecostList.forEach(p->{
+                                        ProjectBasecost projectBasecost=new ProjectBasecost();
+                                        BeanUtils.copyProperties(p,projectBasecost);
+                                        projectBasecost.setId(null);
+                                        projectBasecost.setProjectId(project.getId());
+                                        projectBasecostList.add(projectBasecost);
+                                    });
+                                    participationApprovalList.forEach(p->{
+                                        Participation participation=new Participation();
+                                        BeanUtils.copyProperties(p,participation);
+                                        participation.setId(null);
+                                        participation.setProjectId(project.getId());
+                                        participationList.add(participation);
+                                    });
+                                    projectApprovalAuditorList.forEach(p->{
+                                        ProjectAuditor projectAuditor=new ProjectAuditor();
+                                        BeanUtils.copyProperties(p,projectAuditor);
+                                        projectAuditor.setId(null);
+                                        projectAuditor.setProjectId(project.getId());
+                                        projectAuditorList.add(projectAuditor);
+                                    });
+                                    projectBasecostService.saveBatch(projectBasecostList);
+                                    participationService.saveBatch(participationList);
+                                    projectAuditorService.saveBatch(projectAuditorList);
+                                    break;
+                                case 3://已驳回
+                                    pa.setStatus(2);
+                                    projectApprovalMapper.updateById(pa);
+                                    break;
+                                case 4://已撤销 删除立项数据
+                                    projectApprovalMapper.deleteById(projectApproval.getId());
+                                    projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
+                                    projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
+                                    projectApprovalCheckService.remove(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId,projectApproval.getId()).eq(ProjectApprovalCheck::getStatus,0));
+                                    return "success";
+                            }
+//                            if(approvalInfo.has("SpRecord")){
+//                                org.json.JSONArray spRecord = approvalInfo.getJSONArray("SpRecord");
+//
+//                                for (int i = 0; i < spRecord.length(); i++) {
+//                                    org.json.JSONObject object = spRecord.getJSONObject(i);
+//                                    if(object.has("Details")){
+//                                        org.json.JSONArray details = object.getJSONArray("Details");
+//                                        for (int i1 = 0; i1 < details.length(); i1++) {
+//                                            org.json.JSONObject detail = details.getJSONObject(i1);
+//                                            if(detail.has("Approver")){
+//                                                org.json.JSONObject approvor = detail.getJSONObject("Approver");
+//                                                //分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
+//                                                int spStatus = detail.getInt("SpStatus");
+//                                                String userId = approvor.getString("UserId");
+//
+//                                            }
+//                                        }
+//                                    }
+//                                }
+//
+//                            }
+                            if(approvalInfo.has("SpRecord")){
+                                //获取到审批节点 生成审核记录
+                                List<ProjectApprovalLog> projectApprovalLogList=new ArrayList<>();
+                                Object recordObj = approvalInfo.get("SpRecord");
+                                if (recordObj instanceof org.json.JSONObject) {
+                                    org.json.JSONObject object = approvalInfo.getJSONObject("SpRecord");
+                                    parseSpItem(object, projectApproval, userList, projectApprovalLogList);
+                                } else if (recordObj instanceof org.json.JSONArray) {
+                                    org.json.JSONArray spRecord = approvalInfo.getJSONArray("SpRecord");
+                                    for (int i = 0; i < spRecord.length(); i++) {
+                                        org.json.JSONObject object = spRecord.getJSONObject(i);
+                                        parseSpItem(object, projectApproval, userList, projectApprovalLogList);
+                                    }
                                 }
+
+                                if(projectApprovalLogList.size()>0){
+                                    List<Integer> typeList=new ArrayList<>();
+                                    typeList.add(2);
+                                    typeList.add(3);
+                                    typeList.add(4);
+                                    projectApprovalLogService.remove(new LambdaQueryWrapper<ProjectApprovalLog>()
+                                            .eq(ProjectApprovalLog::getProjectApprovalId,projectApproval.getId()).in(ProjectApprovalLog::getType,typeList));
+                                    projectApprovalLogService.saveBatch(projectApprovalLogList);
+                                }
+
                             }
                         }
-                        List<Integer> typeList=new ArrayList<>();
-                        typeList.add(2);
-                        typeList.add(3);
-                        typeList.add(4);
-                        projectApprovalLogService.remove(new LambdaQueryWrapper<ProjectApprovalLog>()
-                                .eq(ProjectApprovalLog::getProjectApprovalId,projectApproval.getId()).in(ProjectApprovalLog::getType,typeList));
-                        projectApprovalLogService.saveBatch(projectApprovalLogList);
                     }
                 }
             }
@@ -695,6 +716,52 @@ public class WeiXinCorpController {
         return "success";
     }
 
+    private void parseSpItem(org.json.JSONObject object, ProjectApproval projectApproval, List<User> userList, List<ProjectApprovalLog> projectApprovalLogList) {
+        if(object.has("Details")){
+            Object Details = object.get("Details");
+            if(Details instanceof  org.json.JSONArray){
+                org.json.JSONArray details = object.getJSONArray("Details");
+                for (int i1 = 0; i1 < details.length(); i1++) {
+                    org.json.JSONObject detail = details.getJSONObject(i1);
+                    if(detail.has("Approver")){
+                        org.json.JSONObject approver = detail.getJSONObject("Approver");
+                        //分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
+                        int spStatus = detail.getInt("SpStatus");
+                        String userId = approver.getString("UserId");
+                        Optional<User> first = userList.stream().filter(f -> f.getCorpwxUserid().equals(userId)).findFirst();
+                        if(first.isPresent()){
+                            //新增操作记录数据
+                            ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
+                            projectApprovalLog.setCreateTime(LocalDateTime.now());
+                            projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                            projectApprovalLog.setUserName(first.get().getName());
+                            projectApprovalLog.setType(spStatus);
+                            projectApprovalLogList.add(projectApprovalLog);
+                        }
+                    }
+                }
+            }else if(Details instanceof  org.json.JSONObject){
+                org.json.JSONObject detail = object.getJSONObject("Details");
+                if(detail.has("Approver")){
+                    org.json.JSONObject approver = detail.getJSONObject("Approver");
+                    //分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
+                    int spStatus = detail.getInt("SpStatus");
+                    String userId = approver.getString("UserId");
+                    Optional<User> first = userList.stream().filter(f -> f.getCorpwxUserid().equals(userId)).findFirst();
+                    if(first.isPresent()){
+                        //新增操作记录数据
+                        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
+                        projectApprovalLog.setCreateTime(LocalDateTime.now());
+                        projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                        projectApprovalLog.setUserName(first.get().getName());
+                        projectApprovalLog.setType(spStatus);
+                        projectApprovalLogList.add(projectApprovalLog);
+                    }
+                }
+            }
+        }
+    }
+
     //通用开发回调处理
     @RequestMapping(value = "/commonDevCallback", method = RequestMethod.GET)
     @ResponseBody

+ 13 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/GroupBudgetReview.java

@@ -19,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2024-02-19
+ * @since 2024-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -126,6 +126,18 @@ public class GroupBudgetReview extends Model<GroupBudgetReview> {
     @TableField(exist = false)
     private String nowEstimatedWorkTime;
 
+    /**
+     * 审核人id
+     */
+    @TableField("checker_id")
+    private String checkerId;
+
+    /**
+     * 审核人
+     */
+    @TableField("checker")
+    private String checker;
+
 
 
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalLog.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -35,6 +38,8 @@ public class ProjectApprovalLog extends Model<ProjectApprovalLog> {
     private String userName;
 
     @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime createTime;
 
     /**

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-01-09
+ * @since 2024-03-29
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -57,6 +57,12 @@ public class UserWithBeisen extends Model<UserWithBeisen> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 加班补偿方式 3-无加班人员 4-加班费人员
+     */
+    @TableField("extOTWagetype")
+    private Integer extOTWagetype;
+
 
     @Override
     protected Serializable pkVal() {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -212,4 +212,7 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     @Select("SELECT report.id,report.creator_id,  report.`create_date`, report.`create_time`, group_id, task_group.`name`,report.project_id, task_group.`project_id` AS error_pid FROM report LEFT JOIN task_group ON task_group.id = report.`group_id` WHERE report.`company_id`=#{companyId} AND report.project_id <> task_group.`project_id`  AND create_date BETWEEN #{startDate} AND #{endDate} ORDER BY report.id DESC")
     List<Map<String, Object>> selectErrorGroupData(Integer companyId, String startDate, String endDate);
+
+    @Update("update report set state=2 where create_date=#{createDate} and creator_id=#{userId}")
+    void denyReportWithUserAndCreateDate(String userId, String createDate);
 }

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

@@ -62,9 +62,9 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg listByStateDepartment(Integer state, Integer projectId, String date, HttpServletRequest request);
 
-    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception;
 
-    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception;
 
     HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
 
@@ -151,4 +151,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getCustomDataWithDate(String startDate, String endDate, HttpServletRequest request);
 
     HttpRespMsg getDetailReportById(Integer reportId, HttpServletRequest request);
+
+    HttpRespMsg changeReminder(HttpServletRequest request) throws Exception;
 }

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

@@ -1,5 +1,7 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -91,6 +93,8 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     @Resource
     private ProjectApprovalLogService projectApprovalLogService;
     @Resource
+    private WxCorpTemplateService wxCorpTemplateService;
+    @Resource
     private ReportService reportService;
     @Value(value = "${upload.path}")
     private String path;
@@ -165,6 +169,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     public HttpRespMsg importData(MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
+        String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         String fileName = multipartFile.getOriginalFilename();
@@ -190,7 +195,6 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
             //获取全部人员
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()).eq("is_active", 1));
             Company company = companyMapper.selectById(user.getCompanyId());
-            List<Project> projectList = new ArrayList<Project>();
             //由于第一行需要指明列对应的标题
             int rowNum = sheet.getLastRowNum();
             HashMap<String, Integer> projectLevelMap = new HashMap<>();
@@ -313,6 +317,14 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     if (!StringUtils.isEmpty(code)) {
                         int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("project_code", code).eq("company_id", user.getCompanyId()));
                         if (cnt > 0) {
+//                            throw new Exception("项目编号存在重复: " + code);
+                            existCodeList.add(code);
+                            //跳过编号重复的数据
+                            exists=true;
+                            continue;
+                        }
+                        int cntApproval = projectApprovalMapper.selectCount(new QueryWrapper<ProjectApproval>().eq("project_code", code).eq("company_id", user.getCompanyId()));
+                        if (cntApproval > 0) {
 //                            throw new Exception("项目编号存在重复: " + code);
                             existCodeList.add(code);
                             //跳过编号重复的数据
@@ -412,6 +424,86 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                 }else {
                     projectApprovalMapper.insert(project);
                 }
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    //更新审核人 发送到企业微信完成审核动作
+                    String detail = wxCorpInfoService.getTemplateDetail(user.getCompanyId());
+                    if(detail!=null&&!StringUtils.isEmpty(detail)){
+                        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        JSONObject resultOb = JSONObject.parseObject(detail);
+                        JSONObject template_content = resultOb.getJSONObject("template_content");
+                        JSONArray controls = template_content.getJSONArray("controls");
+                        Map<String,Object> templateMap=new HashMap<>();
+                        WxCorpTemplate template = wxCorpTemplateService.getById(user.getCompanyId());
+                        JSONObject requestData=new JSONObject();
+                        requestData.put("template_id",template.getTemplateId());
+                        requestData.put("creator_userid",user.getCorpwxUserid());
+                        //审核模式  0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用);1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点),支持条件审批
+                        requestData.put("use_template_approver",1);
+                        JSONObject apply_data=new JSONObject();
+                        JSONArray contents=new JSONArray();
+                        for (int j = 0; j < controls.size(); j++) {
+                            JSONObject item = controls.getJSONObject(j);
+                            JSONObject property = item.getJSONObject("property");
+                            //控件id指定到指定控件
+                            String templateId = property.getString("id");
+                            //控件名称 这里为了统一工时管家格式 限制企业需要用到我们提供的名称(项目编号 项目名称 项目分类 项目类型 项目经理 级别 合同金额 计划开始日期 计划结束日期)
+                            JSONArray titleArray = property.getJSONArray("title");
+                            //控件类型 在这里统一用Text  Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;Selector-单选/多选;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;Attendance-假勤控件;Vacation-请假控件;Location-位置;RelatedApproval-关联审批单;Formula-公式;DateRange-时长;BankAccount-收款账户
+                            String control = property.getString("control");
+                            //是否必填
+                            String require = property.getString("require");
+                            //是否打印
+                            String un_print = property.getString("un_print");
+                            JSONObject content=new JSONObject();
+                            content.put("control",control);
+                            content.put("id",templateId);
+                            JSONObject value=new JSONObject();
+                            JSONObject titleOb = titleArray.getJSONObject(0);
+                            switch (titleOb.getString("text")){
+                                case "项目编号":
+                                    value.put("text",project.getProjectCode()==null?"":project.getProjectCode());
+                                    break;
+                                case "项目名称":
+                                    value.put("text",project.getProjectName());
+                                    break;
+                                case "项目分类":
+                                    value.put("text",project.getCategoryName()==null?"":project.getCategoryName());
+                                    break;
+                                case "项目类型":
+                                    value.put("text",project.getIsPublic()==0?"正式项目":"非项目");
+                                    break;
+                                case "项目经理":
+                                    value.put("text",project.getInchargerName()==null?"":project.getInchargerName());
+                                    break;
+                                case "级别":
+                                    value.put("text",arr[project.getLevel()-1]);
+                                    break;
+                                case "合同金额":
+                                    value.put("text",project.getContractAmount()==null?String.valueOf(0):String.valueOf(project.getContractAmount()));
+                                    break;
+                                case "计划开始日期":
+                                    value.put("text",project.getPlanStartDate()==null?"":df.format(project.getPlanStartDate()));
+                                    break;
+                                case "计划结束日期":
+                                    value.put("text",project.getPlanEndDate()==null?"":df.format(project.getPlanEndDate()));
+                                    break;
+                            }
+                            content.put("value",value);
+                            contents.add(content);
+                        }
+                        apply_data.put("contents",contents);
+                        requestData.put("apply_data",apply_data);
+                        requestData.put("approver",new JSONArray());
+                        requestData.put("summary_list",new JSONArray());
+                        System.out.println("===============>发送到企业微信的数据"+requestData);
+                        //发送到企业微信
+                        String sp_no = wxCorpInfoService.applyEvent(request, requestData);
+                        project.setWxCorpSpNo(sp_no);
+                        projectApprovalService.updateById(project);
+                    }else {
+                        throw  new Exception("企业暂未同步服务商审批模板,推送企业微信审批失败,请联系服务商!");
+                    }
+                }
                 importCount++;
                 //导入项目参与人,遵守只增不减的原则, 避免误删
                 List<ParticipationApproval> oldPartList = new ArrayList<>();
@@ -691,6 +783,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     BeanUtils.copyProperties(projectApproval,project);
                     project.setId(null);
                     project.setCreateDate(LocalDate.now());
+                    project.setApproveId(projectApproval.getId());
                     List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
                     List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, id));
                     List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, id));
@@ -725,6 +818,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     //新增操作记录数据
                     projectApprovalLog.setCreateTime(LocalDateTime.now());
                     projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                    projectApprovalLog.setUserName(user.getName());
                     //通过
                     projectApprovalLog.setType(2);
                     projectApprovalLogService.save(projectApprovalLog);
@@ -737,6 +831,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                 //新增操作记录数据
                 projectApprovalLog.setCreateTime(LocalDateTime.now());
                 projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                projectApprovalLog.setUserName(user.getName());
                 //驳回
                 projectApprovalLog.setType(3);
                 projectApprovalLogService.save(projectApprovalLog);
@@ -760,6 +855,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                 //新增操作记录数据
                 projectApprovalLog.setCreateTime(LocalDateTime.now());
                 projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                projectApprovalLog.setUserName(user.getName());
                 //驳回
                 projectApprovalLog.setType(4);
                 projectApprovalLogService.save(projectApprovalLog);

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

@@ -8179,7 +8179,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<LocalDateTime> dateTimeList=getDays(sDate, eDate);
             //针对美莱德 去除2024-02-09
             if(user.getCompanyId()==876){
-                dateTimeList=dateTimeList.stream().filter(d->d.isEqual(LocalDate.parse(startDate).atTime(LocalTime.MIN))).collect(Collectors.toList());
+                dateTimeList=dateTimeList.stream().filter(d->!d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
             }
             List<Map<String,Object>> dataList=new ArrayList<>();
             long days =dateTimeList.size();
@@ -8229,12 +8229,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<LocalDateTime> leaveDateList = getDays(leaveSheet.getStartDate().atTime(LocalTime.MIN), leaveSheet.getEndDate().atTime(LocalTime.MIN));
                     //针对美莱德 去除2024-02-09
                     if(user.getCompanyId()==876){
-                        leaveDateList=leaveDateList.stream().filter(d->d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
+                        leaveDateList=leaveDateList.stream().filter(d->!d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
                     }
                     List<LocalDateTime> list = getDays(leaveSheet.getStartDate().atTime(LocalTime.now()), leaveSheet.getEndDate().atTime(LocalTime.now()));
                     //针对美莱德 去除2024-02-09
                     if(user.getCompanyId()==876){
-                        list=list.stream().filter(d->d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
+                        list=list.stream().filter(d->!d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
                     }
                     if(list.size()>1){
                         days-=list.size();

+ 66 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -38,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
@@ -4331,12 +4332,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
         Company company = companyMapper.selectById(companyId);
         List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new LambdaQueryWrapper<UserFvTime>().between(UserFvTime::getWorkDate, startDate, endDate));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, company.getId()));
+        List<UserCustom> userCustomList = userCustomMapper.selectList(new LambdaQueryWrapper<UserCustom>().eq(UserCustom::getCompanyId, companyId));
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         //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")};
@@ -4398,10 +4401,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             map.put("createDate", date);
             //针对景昱 5978 校验填报工时是否超过考勤
             if(user.getCompanyId().equals(5978)){
+                map.put("exceedCardTime",0);
                 Optional<UserFvTime> first = userFvTimeList.stream().filter(u -> u.getWorkDate().isEqual(LocalDate.parse(date, df)) && u.getUserId().equals(id)).findFirst();
                 if(first.isPresent()){
-                    if(Double.valueOf(String.valueOf(data.get("workingTime")))>first.get().getWorkHours()){
-                        map.put("isOver",1);
+                    if(first.get().getWorkHours()!=null){
+                        Optional<User> optional = userList.stream().filter(u -> u.getId().equals(id)).findFirst();
+                        User targetUser = optional.get();
+                        List<String> customList = userCustomList.stream().map(UserCustom::getName).collect(Collectors.toList());
+                        if(customList.size()>0&&customList.contains("是否有加班费")){
+                            int index = customList.indexOf("是否有加班费");
+                            targetUser.getPlate1();
+                            String getter="getPlate"+(index+1);
+                            Class<User> aClass = User.class;
+                            Method method = aClass.getMethod(getter);
+                            String invoke = (String) method.invoke(targetUser);
+                            if(invoke.equals("有加班费")){
+                                if(!(Double.valueOf(String.valueOf(data.get("workingTime"))).equals(first.get().getWorkHours()))){
+                                    map.put("exceedCardTime",1);
+                                }
+                            }else if(invoke.equals("无加班费")){
+                                if((Double.valueOf(String.valueOf(data.get("workingTime")))<first.get().getWorkHours())){
+                                    map.put("exceedCardTime",1);
+                                }
+                            }
+                        }
                     }
                 }
             }
@@ -4547,7 +4570,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) throws Exception {
         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));
@@ -8937,4 +8960,43 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         return msg;
     }
+
+    @Override
+    public HttpRespMsg changeReminder(HttpServletRequest request) throws Exception {
+        HttpRespMsg msg=new HttpRespMsg();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        LocalDate now=LocalDate.now();
+        HttpRespMsg userDailyWorkTime = getUserDailyWorkTime(request, now.with(TemporalAdjusters.firstDayOfMonth()).format(df), now.with(TemporalAdjusters.lastDayOfMonth()).format(df));
+        Map<String, Object> map = (Map<String, Object>) userDailyWorkTime.getData();
+        List<UserMonthWork> userDailyWorkTimeData = (List<UserMonthWork>) map.get("list");
+        List<Information> informationList=new ArrayList<>();
+        userDailyWorkTimeData.forEach(u-> {
+            List<Map<String, Object>> worktimeList = u.worktimeList;
+            List<Map<String, Object>> exceedCardTimeList = worktimeList.stream().filter(w -> Integer.valueOf(String.valueOf(w.get("exceedCardTime"))).equals(1)).collect(Collectors.toList());
+            if(exceedCardTimeList.size()>0){
+                exceedCardTimeList.forEach(e->{
+                    Information information=new Information();
+                    information.setUserId(u.userId);
+                    information.setTime(LocalDateTime.now());
+                    information.setContent(String.valueOf(e.get("createDate")));
+                    information.setType(0);
+                    information.setMsg("您在"+String.valueOf(e.get("createDate"))+"的日报考勤填报异常,请完成填报变更");
+                    informationList.add(information);
+                    reportMapper.denyReportWithUserAndCreateDate(u.userId,String.valueOf(e.get("createDate")));
+                    //发送企业微信消息
+                    if(wxCorpInfo!=null&&u.corpwxUserId!=null){
+                        wxCorpInfoService.sendWXCorpMsg(wxCorpInfo, u.corpwxUserId, "您在"+String.valueOf(e.get("createDate"))+"的日报考勤填报异常,请完成填报变更", null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_DENY);
+                    }
+                });
+            }
+        });
+        if(informationList.size()>0){
+            if(!informationService.saveBatch(informationList)){
+                msg.setError("验证失败");
+            }
+        }
+        return msg;
+    }
 }

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

@@ -103,7 +103,8 @@ public class BeiSenUtils {
         columns.add("Name");
         columns.add("StaffID");
         columns.add("UserID");
-        if(companyId!=null && companyId==5789){
+        columns.add("extOTWagetype_110324_985711501");
+        if(companyId!=null && companyId==5978){
             requestMap.put("columns",columns);
         }
         System.out.println("--------headers请求头数据-------"+headers);

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

@@ -19,11 +19,13 @@
         <result column="project_name" property="projectName" />
         <result column="remark" property="remark" />
         <result column="reject_reason" property="rejectReason" />
+        <result column="checker_id" property="checkerId" />
+        <result column="checker" property="checker" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, group_id, old_man_day, change_man_day, now_man_day, status, create_time, company_id, creator_id, group_name, creator, project_id, project_name, remark, reject_reason
+        id, group_id, old_man_day, change_man_day, now_man_day, status, create_time, company_id, creator_id, group_name, creator, project_id, project_name, remark, reject_reason, checker_id, checker
     </sql>
 
 </mapper>

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

@@ -10,11 +10,12 @@
         <result column="mobile_phone" property="mobilePhone" />
         <result column="job_number" property="jobNumber" />
         <result column="company_id" property="companyId" />
+        <result column="extOTWagetype" property="extOTWagetype" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, user_id, name, mobile_phone, job_number, company_id
+        id, user_id, name, mobile_phone, job_number, company_id, extOTWagetype
     </sql>
 
 </mapper>

+ 9 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue

@@ -24,7 +24,7 @@
                 <!-- 审核人 -->
                 <div class="budgetReviewHeader_FormItem">
                     <div class="budgetReviewHeader_FormItemText">审核人:</div>
-                    <el-select v-model="screeningConditionForm.submitUserId" filterable placeholder="请选择审核人" clearable
+                    <el-select v-model="screeningConditionForm.checkUserId" filterable placeholder="请选择审核人" clearable
                         size="small" v-if="user.userNameNeedTranslate != 1" style="width: 130px;" @change="getList">
                         <el-option v-for="item in usersList" :key="item.id" :label="item.name + '\u3000' + item.jobNumber"
                             :value="item.id">
@@ -32,7 +32,7 @@
                             <span class="selectProleft">{{ item.name }}</span>
                         </el-option>
                     </el-select>
-                    <selectCat :size="'small'" :subject="usersList" :subjectId="screeningConditionForm.submitUserId"
+                    <selectCat :size="'small'" :subject="usersList" :subjectId="screeningConditionForm.checkUserId"
                         :clearable="true" :filterable="true" :searchBoxTop="1" stinction="'1'" @selectCal="selectCal"
                         v-if="user.userNameNeedTranslate == 1" :widthStr="'130'"></selectCat>
                 </div>
@@ -205,7 +205,7 @@ export default {
             screeningConditionForm: {
                 projectId: '',
                 dateRange: '',
-                submitUserId: '',
+                checkUserId: '',
                 status: ''
             }
         };
@@ -277,11 +277,11 @@ export default {
         //获取待审核的数据列表
         getList() {
             this.listLoading = true;
-            const { projectId, dateRange, submitUserId, status } = this.screeningConditionForm;
+            const { projectId, dateRange, checkUserId, status } = this.screeningConditionForm;
             const params = {
                 ...(projectId && { projectId }),
-                ...(dateRange && { startTime: dateRange[0], endTime: dateRange[1] }),
-                ...(submitUserId && { submitUserId }),
+                ...(dateRange && { startDate: dateRange[0], endDate: dateRange[1] }),
+                ...(checkUserId && { checkUserId }),
                 ...(status && { status }),
             };
             this.http.post("/group-budget-review/list", {
@@ -350,7 +350,7 @@ export default {
         selectCal(obj) {
             console.log(obj, '过来的数据')
             if (obj.distinction == 1) {
-                this.screeningConditionForm.submitUserId = obj.id
+                this.screeningConditionForm.checkUserId = obj.id
                 this.getList()
             }
         },
@@ -366,11 +366,11 @@ export default {
         },
         // 导出
         exportReport() {
-            const { projectId, dateRange, submitUserId, status } = this.screeningConditionForm;
+            const { projectId, dateRange, checkUserId, status } = this.screeningConditionForm;
             const params = {
                 ...(projectId && { projectId }),
                 ...(dateRange && { startTime: dateRange[0], endTime: dateRange[1] }),
-                ...(submitUserId && { submitUserId }),
+                ...(checkUserId && { checkUserId }),
                 ...(status && { status }),
             };
             this.exporListLoading = true;

+ 57 - 14
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -34,7 +34,7 @@
                     <div>
                         <p :class="idx == 0 ? 'on' : ''" @click="switchs(0)" v-if="permissions.projectApprovalEdit">{{'全部项目'}}</p>
                         <p :class="idx == 1 ? 'on' : ''" @click="switchs(1)">{{'我发起的'}}</p>
-                        <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">{{'我审核的'}}</p>
+                        <!-- <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">{{'我审核的'}}</p> -->
                     </div>
                 </div>
                 <div style="max-width: 94%;min-width: 90%">
@@ -81,9 +81,9 @@
                         <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
                             <template slot-scope="scope">
                                 <el-button size="mini" type="primary" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck)&&scope.row.status!=1" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0"  @click="check(scope.row,1)">{{'通过'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" @click="check(scope.row,2)">{{'驳回'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==1" @click="check(scope.row)">{{'撤销'}}</el-button>
+                                <!-- <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0"  @click="check(scope.row,1)">{{'通过'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" @click="check(scope.row,2)">{{'驳回'}}</el-button> -->
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
                             </template>
                         </el-table-column>
                     </el-table>
@@ -319,30 +319,52 @@
                         <div class="line"><span>{{'项目类型:'}}</span><span>{{projectApprocalDetail.isPublic==0?"正式项目":"非项目"}}</span></div>
                         <div class="line"><span>{{'项目描述:'}}</span><span>{{projectApprocalDetail.projectDesc}}</span></div>
                         <div class="line"><span>{{'全部参与人:'}}</span>
-                            <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.participationApprovalList.map(v=>v.userName).join(",")}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.participationApprovalList.map(v=>v.userName).join(",")'></ww-open-data></span>
+                            <span v-for="(par, index) in projectApprocalDetail.participationApprovalList" :key="par.userId">
+                                <span v-if="user.userNameNeedTranslate != 1">
+                                    {{par.userName}}
+                                </span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='userName' :openid='par.userName'></ww-open-data>
+                                </span>
+                                <span v-if="index < projectApprocalDetail.participationApprovalList.length-1">,</span>
+                            </span>
                         </div>
                         <div class="line"><span>{{'项目经理:'}}</span>
                             <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.inchargerName}}</span>
                             <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.inchargerName'></ww-open-data></span>
                         </div>
                         <div class="line"><span>{{'日报审核人:'}}</span>
-                            <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.projectApprovalAuditorList.map(v=>v.auditorName).join(",")}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.projectApprovalAuditorList.map(v=>v.auditorName).join(",")'></ww-open-data></span>
+                            <span v-for="(par,index) in projectApprocalDetail.projectApprovalAuditorList" :key="par.auditorId">
+                                <span v-if="user.userNameNeedTranslate != 1">
+                                    {{par.auditorName}}
+                                </span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='userName' :openid='par.auditorName'></ww-open-data>
+                                </span>
+                                <span v-if="index < projectApprocalDetail.projectApprovalAuditorList.length-1">,</span>
+                            </span>
                         </div>
                         <div class="line"><span>{{'级别:'}}</span><span>{{importanceListLable[projectApprocalDetail.level-1]}}</span></div>
                         <div class="line"><span>{{'合同金额:'}}</span><span>{{projectApprocalDetail.contractAmount}}</span></div>
-                        <el-divider></el-divider>
-                        <div class="line">
-                            <span>成本基线</span>
-                        </div>
                         <div class="line">
                             <span>{{'计划开始日期:'}}</span><span>{{projectApprocalDetail.planStartDate}}</span>
                             <span>{{'计划结束日期:'}}</span><span>{{projectApprocalDetail.planEndDate}}</span>
                         </div>
+                        <el-divider></el-divider>
+                        <div class="line">
+                            <span>成本基线</span>
+                        </div>
                         <div class="line" v-for="(item,index) in projectApprocalDetail.projectApprovalBasecostList">
                             <span>{{item.baseName+":"}}</span><span>{{item.baseAmount}}</span>
                         </div>
+                        <el-divider></el-divider>
+                        <div class="line">
+                            <span>操作记录</span>
+                        </div>
+                        <div class="line" v-for="(item,index) in approvalLogData">
+                            <span v-if="user.userNameNeedTranslate != 1">{{item.userName}} {{item.createTime}} {{approvalTypeStr[item.type]}}了日报</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.userName'></ww-open-data> {{item.createTime}}{{approvalTypeStr[item.type]}}了日报</span>
+                        </div>
                         <div slot="footer" class="dialog-footer">
                             <el-button type="primary" @click="projectApprovalDetailVisible = false" >{{'关闭'}}</el-button>
                         </div>
@@ -380,7 +402,7 @@ return {
     page: 1,
     size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
     listLoading:false,
-    approvalStatusStr:["待审核","已通过","已驳回"],
+    approvalStatusStr:["待审核","已通过","已驳回","已撤销"],
     importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
     importanceListLable:[this.$t('zheng-chang'), this.$t('jin-ji'), this.$t('zhong-yao'), this.$t('zhong-yao-qie-jin-ji'), this.$t('di-feng-xian'), this.$t('zhong-feng-xian'), this.$t('gao-feng-xian')],
     addFormVisible:false,
@@ -431,6 +453,8 @@ return {
     projectApprovalDetailVisible:false,
     projectApprocalDetail:{},
     importDialog:false,
+    approvalLogData:[],
+    approvalTypeStr:["提交","编辑","通过","驳回","撤销"],
 }
 },
 computed: {},
@@ -520,7 +544,7 @@ methods: {
                 if (this.addForm.auditUserIds) {
                     targetData.auditUserIds=this.addForm.auditUserIds
                 }
-                if(this.addForm.auditUserIds.length != 0) {
+                if(this.addForm.auditUserIds&&this.addForm.auditUserIds.length != 0) {
                     let userArray=[]
                     for(let i in this.addForm.auditUserIds){
                         userArray.push({
@@ -666,15 +690,25 @@ methods: {
             if (res.code == "ok") {
                 theData=res.data
             }
+            var list = theData.participationApprovalList;
+            if (item.isPublic == 1) {
+                list = this.users;
+            }
             var arr=[]
             var names=""
+            let namesLiss = [] // 企业微信用到的参与者
+            if (names.length > 0) {
+                names = names.substring(0, names.length -1);
+            }
             var auditorArr=[]
             if(theData.participationApprovalList){
                 for(let i in theData.participationApprovalList){
                     arr.push(theData.participationApprovalList[i].userId);
                     names+=theData.participationApprovalList[i].userName+",";
+                    namesLiss.push(theData.participationApprovalList[i].userName)
                 }
             }
+            this.addFormUserNames = namesLiss
             if(theData.projectApprovalAuditorList){
                 for(let i in theData.projectApprovalAuditorList){
                     auditorArr.push(theData.projectApprovalAuditorList[i].auditorId)
@@ -1252,6 +1286,15 @@ methods: {
             this.projectApprocalDetail=res.data
         }
         });
+        this.getApprovalEditLog(item)
+    },
+    getApprovalEditLog(item){
+        this.http.post('/project-approval-log/listById', {id: item.id},
+        res => {
+        if (res.code == "ok") {
+            this.approvalLogData=res.data
+        }
+        });
     },
     batchImportData(item) {
     //首先判断文件类型

+ 242 - 23
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -1379,7 +1379,7 @@
               :default-time="['12:00:00', '12:00:00']"
               size="small"
               popper-class="selecteorktime_datapick_popper"
-              @change="showMonthWorkTime()"
+              @change="showMonthWorkTime('first')"
             >
               </el-date-picker>
               <el-button size="small" @click="getDoubleLastWeek(1)">{{$t('time.twoWeeksAgo')}}</el-button>
@@ -1395,12 +1395,6 @@
                 <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true"  :searchBoxTop="'1'" :size="'small'" :subject="usersList" :subjectId="usersListId" :distinction="'12'" :clearable="true" @selectCal="selectCal"></selectCat>
             </div>
             <div style="float: right; vertical-align: middle;height:32px">
-              <el-link 
-              v-if="user.companyId==5978"
-              type="primary"
-              @click="changeReminder()"
-              >{{'变更提醒'}}</el-link
-              >
               <el-link
               type="primary"
               @click="exportMembWorkHours()"
@@ -1632,6 +1626,184 @@
           <el-alert style="position:absolute;bottom:0;z-index:10;" v-if="isFlag" :title="$t('message.loading')+'...'" type="success" center :closable="false" show-icon></el-alert>
           <el-alert style="position:absolute;bottom:0;z-index:10;" v-if="isMore" :title="$t('message.noMoreData')" type="success" center show-icon></el-alert>
         </el-tab-pane>
+
+        <el-tab-pane v-if="user.companyId==5978" :label="'工时填报明细'" name="third">
+          <div class="selectworktime_export" style="margin-top:10px;">
+            <!-- <div class="selectworktime_export_l">
+              <el-date-picker
+              class="selecteworktime_datapick"
+              v-model="WorktimeDatepickValue"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              align="right"
+              unlink-panels
+              :range-separator="$t('other.to')"
+              :start-placeholder="$t('time.startDate')"
+              :end-placeholder="$t('time.endDate')"
+              :default-time="['12:00:00', '12:00:00']"
+              size="small"
+              popper-class="selecteorktime_datapick_popper"
+              @change="showMonthWorkTime()"
+            >
+              </el-date-picker>
+              <el-button size="small" @click="getDoubleLastWeek(1)">{{$t('time.twoWeeksAgo')}}</el-button>
+              <el-button size="small" @click="getLastWeek(1)">{{$t('time.lastWeek')}}</el-button>
+              <el-button size="small" @click="getThisWeek(1)">{{$t('time.nextWeek')}}</el-button>
+            </div> -->
+            <div>
+                <el-input style="float:left;width:22%" v-if="user.userNameNeedTranslate != '1'" v-model="searchKeyword" class="input-with-select" :placeholder="$t('defaultText.pleaseEnterNametoSearch')" clearable="true" size="small">
+                    <el-button slot="append" @click="searchScreen(0)" icon="el-icon-search"></el-button>
+                </el-input>
+                <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true"  :searchBoxTop="'1'" :size="'small'" :subject="usersList" :subjectId="usersListId" :distinction="'12'" :clearable="true" @selectCal="selectCal"></selectCat>
+            </div>
+            <div style="float: right; vertical-align: middle;height:32px">
+              <el-link 
+              v-if="user.companyId==5978"
+              type="primary"
+              @click="changeReminder()"
+              >{{'变更提醒'}}</el-link
+              >
+              <el-link
+              type="primary"
+              @click="exportMembWorkHours()"
+              >{{$t('export.exportData')}}</el-link
+             >
+            </div>
+            
+          </div>
+
+          <el-table ref="hasworkTbl"
+            :data="monthWorkDataS"
+            v-el-table-infinite-scroll="listScroll"
+            border
+            :height="500"
+            highlight-current-row
+            style="width: 100%"
+            v-loading="tbload"
+            :lazy="true"
+          >
+            <el-table-column width="75" type="index" fixed="left" :label="$t('headerTop.serialNumber')">
+              <template slot-scope="scope">
+                {{ scope.$index + 1 }}
+              </template>
+            </el-table-column>
+
+            <el-table-column width="105" prop="name" fixed="left" :label="$t('lable.name')">
+                <template slot-scope="scope">
+                    <span :style="scope.row.worktimeList.length==0?'color:red':''">
+                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate != 1">{{scope.row.name}}</span>
+                        <!-- {{scope.row.name}} -->
+                    </span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="departmentName" fixed="left" :label="$t('lable.department')">
+                <template slot-scope="scope">
+                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column
+              min-width="105"
+              v-for="(item, index) in pickDateArray"
+              :key="index"
+              :label="item.label"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <div
+                  style="color: red"
+                  v-if="
+                    scope.row.worktimeList.filter(
+                      (w) =>
+                        w.createDate==item.date
+                    ).length > 0 &&
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime < reportTimeType.allday
+                  "
+                >
+                  {{
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime.toFixed(1)
+                  }}
+                </div>
+                <div
+                  style="color: #20a0ff"
+                  v-if="
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    ).length > 0 &&
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime > reportTimeType.allday
+                  "
+                >
+                  {{
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime.toFixed(1)
+                  }}
+                </div>
+                <div
+                  v-if="
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    ).length > 0 &&
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime == reportTimeType.allday
+                  "
+                >
+                  {{
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime
+                  }}
+                </div>
+                <div
+                  v-if="
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    ).length == 0
+                  "
+                >
+                  0
+                </div>
+                <div
+                  v-if="
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    ).length > 0 &&
+                    typeof scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime == 'string'
+                  "
+                >
+                  {{
+                    scope.row.worktimeList.filter(
+                      (w) =>w.createDate==item.date
+                    )[0].workingTime
+                  }}
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-alert style="position:absolute;bottom:0;z-index:10;" v-if="isFlag" :title="$t('message.loading')+'...'" type="success" center :closable="false" show-icon></el-alert>
+          <el-alert style="position:absolute;bottom:0;z-index:10;" v-if="isMore" :title="$t('message.noMoreData')" type="warning" center show-icon></el-alert>
+
+          <!-- <div slot="title" class="dialog-title selectworktime_title">
+            <label style="font-size: 16px">员工每日已填报工时数</label>
+            <el-link
+              type="primary"
+              style="float: right; margin-right: 60px"
+              @click="exportMembWorkHours()"
+              >导出已填报数据</el-link
+            > -->
+          <!-- <el-button >导出</el-button> -->
+          <!-- </div> -->
+        </el-tab-pane>
       </el-tabs>
     </el-dialog>
         <!--驳回弹出框 -->
@@ -2307,6 +2479,7 @@
                 ],
                 pushWorkTimeLogDig:false,
                 pushWorkTimeLogData:[],
+                WorktimeDatepickValueForMonth:[],
             };
         },
         watch: {
@@ -2357,6 +2530,7 @@
             this.getDepartment();
             this.scrollFunction()
             this.userssHu();
+            this.getFirstAndLastDay()
             if(this.user.timeType.reportAuditType == 3){
                 this.getAllUsersList()
             }
@@ -3707,14 +3881,14 @@
         let nowwd = [getauto[0],getauto[6]]
         this.WorktimeDatepickValue = nowwd
       }
-      this.showMonthWorkTime()
+      this.showMonthWorkTime('first')
     },
 
     handleClick(t,e){
-      if (t.name == "first") {
-        this.showMonthWorkTime()
-      }else{
+      if (t.name == "second") {
         this.showMonthNotWorkTime()
+      }else{
+        this.showMonthWorkTime(t.name)
       }
     },
     //导出员工每日填报工时数
@@ -3789,17 +3963,25 @@
         }
     },
 
-    showMonthWorkTime() {
+    showMonthWorkTime(t) {
       this.monthTotalPage = 0,
         this.tbload = true
+        let parameter={}
+        if(t == "first"){
+            parameter={
+                startDate: this.WorktimeDatepickValue[0],
+                endDate: this.WorktimeDatepickValue[1],
+            }
+        }else{
+            parameter={
+                startDate: this.WorktimeDatepickValueForMonth[0],
+                endDate: this.WorktimeDatepickValueForMonth[1],
+            }
+        }
       this.http.post(
         "/report/getUserDailyWorkTime",
         // "/report/getNoReportUserList",
-        {
-          // month: this.date,
-          startDate: this.WorktimeDatepickValue[0],
-          endDate: this.WorktimeDatepickValue[1],
-        },
+        parameter,
         (res) => {
           if (res.code == "ok") {
             this.tbload = false;
@@ -3952,6 +4134,25 @@
             },300)
         }
     },
+    getFirstAndLastDay() {
+      // 将选定的月份转换为Date对象
+    var monthDate = new Date();
+    var year = monthDate.getFullYear();
+    var month = monthDate.getMonth();
+    
+    // 计算起始日和结束日
+    var startDay = new Date(year, month, 1);
+    var endDay = new Date(year, month + 1, 0);
+      let lastmd = [this.formatDate(startDay),this.formatDate(endDay)]
+      this.WorktimeDatepickValueForMonth=lastmd
+    },
+    formatDate(date) {
+        var year = date.getFullYear();
+        var month = ("0" + (date.getMonth() + 1)).slice(-2);
+        var day = ("0" + date.getDate()).slice(-2);
+        
+        return year + "-" + month + "-" + day;
+    },
     // 获取默认这zhou日期参数 222
     getLastWeek(e){
       let newdate = new Date()
@@ -3959,7 +4160,7 @@
       let lastwd = [this.getAutoWeekDate(lastdate)[0],this.getAutoWeekDate(lastdate)[6]]
       if(e){
         this.WorktimeDatepickValue = lastwd 
-        this.showMonthWorkTime()
+        this.showMonthWorkTime('first')
         
       }else{
         this.WorktimeDatepickValue = lastwd 
@@ -3972,7 +4173,7 @@
       let nowwd = [this.getAutoWeekDate(nowdate)[0],this.getAutoWeekDate(nowdate)[6]]
       if(e){
         this.WorktimeDatepickValue = nowwd 
-        this.showMonthWorkTime()
+        this.showMonthWorkTime('first')
       }else{
         this.WorktimeDatepickValue = nowwd 
         this.showMonthNotWorkTime()
@@ -3984,7 +4185,7 @@
       let nextwd = [this.getAutoWeekDate(nextdate)[0],this.getAutoWeekDate(nextdate)[6]]
       if(e){
         this.WorktimeDatepickValue = nextwd 
-        this.showMonthWorkTime()
+        this.showMonthWorkTime('first')
       }else{
         this.WorktimeDatepickValue = nextwd 
         this.showMonthNotWorkTime()
@@ -7494,9 +7695,8 @@
                                 }
                             }
                         }
-                        
-
-                        if (this.reportTimeType.type == 1 && this.workForm.time) {
+                        //针对凡己,不校验考勤时长
+                        if (this.user.companyId != 3918 && this.reportTimeType.type == 1 && this.workForm.time) {
                             if (this.workForm.time.workHours && totalTime > parseFloat(this.workForm.time.workHours)) {
                                 this.$message({
                                         message: this.$t('message.Fillinthesumofworkinghours')+(totalTime)+"h"+this.$t('message.Cannotexceedthetotalworkinghoursofattendance')+"("+this.workForm.time.workHours.toFixed(1)+"h)",
@@ -8033,6 +8233,25 @@
                     })
                 })
             },
+            //景昱变更提醒
+            changeReminder(){
+                this.http.post('/report/changeReminder',{
+                },res => {
+                    if(res.code == 'ok'){
+                        
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
             // 重庆物奇私人定制的按周填报弹窗关闭事件
             fillWeekCustomClne() {
                 this.fillWeekDialogVisiCustom = false

+ 4 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -95,7 +95,7 @@
 
                     <!--任务分组 -->
                     <van-field readonly name="groupId"
-                        v-if="user.company.packageProject == 1 && item.taskGroups != null && item.taskGroups.length > 0"
+                        v-if="user.company.packageProject == 1 && item.taskGroups != null && item.taskGroups.length > 0 && (user.company.nonProjectSimple==0 || (user.company.nonProjectSimple==1&& (item.projectId && projectss.filter(p => p.id == item.projectId)[0].isPublic!=1)))"
                         clickable :rules="[{ required: user.companyId == 3092 ? true : false, message: '请选择任务分组' }]"
                         :value="item.groupName" label="任务分组" placeholder="请选择任务分组"
                         @click="clickPickTaskGroup(index, item)" />
@@ -277,7 +277,7 @@
                             <van-stepper v-model="pItem.progress" integer min="0" max="100" />%
                         </template>
                     </van-field>
-                    <van-field v-if="user.company.packageProject == 1 && !user.timeType.hideTask && (user.company.nonProjectSimple==0 || (user.company.nonProjectSimple==1&&domain.isPublic!=1))" readonly name="taskId" :value="item.taskName"
+                    <van-field v-if="user.company.packageProject == 1 && !user.timeType.hideTask && (user.company.nonProjectSimple==0 || (user.company.nonProjectSimple==1&& (item.projectId && projectss.filter(p => p.id == item.projectId)[0].isPublic!=1)))" readonly name="taskId" :value="item.taskName"
                         :rules="[{ required: reportTimeType.taskRequired? true : false, message: '请选择任务/里程碑' }]" label="任务/里程碑"
                         placeholder="请选择任务/里程碑" @click="clickPickerTask(index, item)"></van-field>
                     <van-field v-if="user.companyId == 3092" readonly name="sapServiceId" :value="item.sapServiceName"
@@ -2230,7 +2230,8 @@ export default {
                     return
                 }
             }
-            if (this.reportTimeType.type == 1 && this.report.time) {
+            //针对凡己,不校验考勤时长
+            if (this.user.companyId != 3918 && this.reportTimeType.type == 1 && this.report.time) {
                 var totalTime = 0;
                 for (var t = 0; t < this.form.domains.length; t++) {
                     totalTime += parseFloat(this.form.domains[t].workingTime);

+ 4 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -78,7 +78,7 @@
                                 @cancel="item.showPickerSubProject = false;$forceUpdate();" />
                         </van-popup>
                         <!--任务分组 -->
-                        <van-field  readonly  name="groupId" v-if="user.company.packageProject==1&&item.taskGroups != null && item.taskGroups.length > 0" clickable 
+                        <van-field  readonly  name="groupId" v-if="user.company.packageProject==1&&item.taskGroups != null && item.taskGroups.length > 0 && (user.company.nonProjectSimple==0 || (user.company.nonProjectSimple==1 && (item.projectId && projectss.filter(p => p.id == item.projectId)[0].isPublic!=1)))" clickable 
                             :value="item.groupName" :label="user.timeType.enableNewWeeklyfill == 1 ? '分组' : '任务分组'" :placeholder="user.timeType.enableNewWeeklyfill == 1 ? '请选择分组' : '请选择任务分组'" 
                         @click="clickPickTaskGroup(index, item)" :disabled="item.state<=1" />
                         <!-- <van-popup v-model="item.showPickerTaskGroup" position="bottom">
@@ -204,7 +204,7 @@
 
                         <!-- 任务里程碑 -->
                         <van-field :label="'任务/里程碑'" :value="item.taskName" :disabled="item.state<=1" readonly 
-                            clickable v-if="user.company.packageProject == 1 && !user.timeType.hideStages && (user.company.nonProjectSimple==0 || (user.company.nonProjectSimple==1&&domain.isPublic!=1))" 
+                            clickable v-if="user.company.packageProject == 1 && !user.timeType.hideStages && (user.company.nonProjectSimple==0 || (item.projectId && projectss.filter(p => p.id == item.projectId)[0].isPublic!=1))" 
                             @click="clickTakKer(index, item)"
                         />
                         <van-popup v-model="item.showTaksDegree" position="bottom" @click-overlay="overlayPopup(index, 'showTaksDegree')">
@@ -1992,8 +1992,8 @@
                         return
                     }
                 }
-
-                if((this.user.timeType.showDdCardtime == 1 || this.user.timeType.showCorpwxCardtime == 1) && this.reportTimeType.type == 1){
+                //针对凡己,不校验考勤时长
+                if(this.user.companyId != 3918 && (this.user.timeType.showDdCardtime == 1 || this.user.timeType.showCorpwxCardtime == 1) && this.reportTimeType.type == 1){
                     let tips = ''
                     for(let m in this.form){
                         let allhours = 0

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -193,7 +193,7 @@
                 for (var i in list) {
                     if(list[i].name == '工时报告') {
                         this.routers.push({name: '查看日报',url: '/calendar',icon: 'description'})
-                        if(this.user.timeType.enableNewWeeklyfill != 1 && this.user.companyId != 4374) { // 针对新版按周填报去掉填写日报
+                        if(this.user.timeType.enableNewWeeklyfill != 1) { // 针对新版按周填报去掉填写日报
                             this.routers.push({name: '填写日报',url: '/edit',icon: 'edit'})
                         }
                         if (this.user.companyId != 3092 && this.user.timeType.type != 0) {