Переглянути джерело

Merge remote-tracking branch 'origin/master'

yusm 9 місяців тому
батько
коміт
057d159e97
38 змінених файлів з 440 додано та 138 видалено
  1. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FeishuInfoController.java
  2. 16 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java
  3. 23 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  5. 17 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  7. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  8. 95 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java
  10. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  11. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml
  12. BIN
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/上海民航合同模板.xlsx
  13. 18 8
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  14. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/echarts.min.js
  15. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/element-ui.js
  16. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/element-uiCss.css
  17. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/goofy.js
  18. 61 0
      fhKeeper/formulahousekeeper/octopus/static/js/index.js
  19. 6 0
      fhKeeper/formulahousekeeper/octopus/static/js/jquery.min.js
  20. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/jweixin-1.2.0.js
  21. 1 0
      fhKeeper/formulahousekeeper/octopus/static/js/jwxwork-1.0.0.js
  22. 6 0
      fhKeeper/formulahousekeeper/octopus/static/js/vue-router.min.js
  23. 6 0
      fhKeeper/formulahousekeeper/octopus/static/js/vue.min.js
  24. 6 0
      fhKeeper/formulahousekeeper/octopus/static/js/vuex.min.js
  25. 37 21
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Company.java
  26. 50 7
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java
  27. 2 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/CompanyMapper.xml
  28. 8 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml
  29. BIN
      fhKeeper/formulahousekeeper/ops-platform/人员导入模板.xlsx
  30. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  31. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  32. 16 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  33. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  34. 1 31
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  35. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  36. 4 4
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  37. 8 5
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  38. 29 9
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/calendar.vue

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

@@ -482,6 +482,9 @@ public class FeishuInfoController {
         if (timeType.getNeedDeptAudit() == 1) {
             queryWrapper.or().eq("need_dept_audit", 1);
         }
+        if (company.getPackageDevice() == 1) {
+            queryWrapper.or().eq("package_device", 1);
+        }
 
         queryWrapper.orderByAsc("orderitem");
 

+ 16 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java

@@ -6,6 +6,7 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectAuditorService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -41,6 +42,8 @@ public class ProjectAuditorController {
     private DepartmentMapper departmentMapper;
     @Resource
     HttpServletRequest request;
+    @Autowired
+    private TimeTypeMapper timeTypeMapper;
 
     @RequestMapping("/getList")
     private HttpRespMsg getList(Integer projectId) {
@@ -57,10 +60,18 @@ public class ProjectAuditorController {
                 //非项目,该员工的部门主要负责人审核
                 mode = 1;
                 String superiorId = null;
-                Integer departmentId = user.getDepartmentId();
-                Department department = departmentMapper.selectById(departmentId);
-                if (department != null) {
-                    superiorId = department.getManagerId();
+                TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+                //优先取员工的上级领导
+                if (timeType.getReportAuditType() == 0) {
+                    superiorId = user.getSuperiorId();
+                }
+                //其次取员工的部门主要负责人
+                if (superiorId == null) {
+                    Integer departmentId = user.getDepartmentId();
+                    Department department = departmentMapper.selectById(departmentId);
+                    if (department != null) {
+                        superiorId = department.getManagerId();
+                    }
                 }
                 if (superiorId != null) {
                     User superior = userMapper.selectById(superiorId);
@@ -69,9 +80,9 @@ public class ProjectAuditorController {
                         auditor.setAuditorId(superiorId);
                         auditor.setAuditorName(superior.getName());
                         auditorList.add(auditor);
-
                     }
                 }
+
                 msg.data = auditorList;
             }
         }

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

@@ -644,6 +644,29 @@ public class ReportController {
                     }
                 }
             }
+        } else if (comTimeType.getReportAuditType() == 10) {
+            //项目经理或者公司副总审核
+            String reporterId = request.getHeader("Token");
+            if (targetUids != null && targetUids.length > 0) {
+                reporterId = targetUids[0];
+            }
+            for (int i=0;i<projectAuditorId.length; i++) {
+                if (projectAuditorId[i] == null) {
+                    //取项目的负责人进行审核
+                    final int pid = projectId[i];
+                    Project project = projectList.stream().filter(p->p.getId().equals(pid)).findFirst().get();
+                    if (company.getNonProjectSimple() == 1 && project.getIsPublic() == 1) {
+                        //非项目,由公司副总审核
+                        projectAuditorId[i] = comTimeType.getThirdAuditor();
+                    } else {
+                        projectAuditorId[i] = project.getInchargerId();
+                        if (reporterId.equals(projectAuditorId[i])) {
+                            //自己担任项目经理的情况下,由公司副总审核
+                            projectAuditorId[i] = comTimeType.getThirdAuditor();
+                        }
+                    }
+                }
+            }
         } else {
             //自动填充项目审核人
             for (int i=0;i<projectAuditorId.length; i++) {

+ 8 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-03-18
+ * @since 2024-09-27
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -127,6 +127,12 @@ public class Company extends Model<Company> {
     @TableField("package_project_approval")
     private Integer packageProjectApproval;
 
+    /**
+     * 设备管理模块
+     */
+    @TableField("package_device")
+    private Integer packageDevice;
+
     /**
      * 是否是国际化版本
      */
@@ -145,9 +151,8 @@ public class Company extends Model<Company> {
     @TableField("reg_from")
     private String regFrom;
 
-
     /**
-     * 非项目采用简易模式,非项目工时由部门主要负责人审核
+     * 非项目简单模式,该模式下非项目日报由部门主要负责人审核
      */
     @TableField("non_project_simple")
     private Integer nonProjectSimple;

+ 17 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-03-18
+ * @since 2024-09-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -110,9 +110,6 @@ public class SysModule extends Model<SysModule> {
     @TableField("package_engineering")
     private Integer packageEngineering;
 
-    @TableField(exist = false)
-    private Integer packageFinanceAudit;
-
     /**
      * 是否属于合同管理
      */
@@ -143,17 +140,6 @@ public class SysModule extends Model<SysModule> {
     @TableField("need_dept_audit")
     private Integer needDeptAudit;
 
-
-    @TableField(exist = false)
-    private List<SysModule> children;
-
-
-    @TableField(exist = false)
-    private boolean checked;
-
-    @TableField(exist = false)
-    private List<SysFunction> functionList;
-
     /**
      * 是否属于供应商模块
      */
@@ -166,6 +152,22 @@ public class SysModule extends Model<SysModule> {
     @TableField("package_project_approval")
     private Integer packageProjectApproval;
 
+    /**
+     * 是否属于设备管理模块
+     */
+    @TableField("package_device")
+    private Integer packageDevice;
+
+
+    @TableField(exist = false)
+    private List<SysModule> children;
+
+
+    @TableField(exist = false)
+    private boolean checked;
+
+    @TableField(exist = false)
+    private List<SysFunction> functionList;
 
     @Override
     protected Serializable pkVal() {

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

@@ -167,7 +167,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<UserCateTimeVo> getMembProjectCateTime(Integer companyId, String startDate, String endDate,Integer departmentId,String subUserCustomName,Integer plateString);
 
-    @Update("update project set incharger_id = null, finish_date = null, plan_start_date = null, plan_end_date=null, level=null,contract_amount=0.0,man_day=null where id = #{id} and is_public = 1")
+    @Update("update project set incharger_id = null, finish_date = null, level=null,contract_amount=0.0,man_day=null where id = #{id} and is_public = 1")
     void cleanPublicProjectData(Integer id);
 
     List<Map<String, Object>> userProjectProcessList(Integer deptId, String userId, Integer projectId, Integer companyId,@Param("list") List<Integer> deptIds,@Param("listSecond") List<Integer> regularDeptIds, Integer start, Integer size);

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

@@ -207,6 +207,9 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
             if (company.getPackageProjectApproval() == 1) {
                 wrapper.or().eq("package_project_approval", 1);
             }
+            if (company.getPackageDevice() == 1) {
+                wrapper.or().eq("package_device", 1);
+            }
             if (timeType.getReportWorkflow() == 1) {
                 wrapper.or().eq("report_workflow", 1);
             }

+ 95 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1716,14 +1716,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     for (Map map : nameList) {
                         String corpwxUserid = (String)map.get("corpwxUserid");
                         String dateStr = (String)map.get("dateStr");
-                        userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("corpwx_userid", corpwxUserid).eq("create_date", dateStr));
+                        String name = (String)map.get("name");
+                        if (corpwxUserid != null) {
+                            userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("corpwx_userid", corpwxUserid).eq("create_date", dateStr));
+                        } else {
+                            userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("name", name).eq("create_date", dateStr));
+                        }
+
                     }
                     List<UserCorpwxTime> timeList = userCorpwxTimeMapper.selectList(userCorpwxTimeQueryWrapper);
                     //过滤匹配当前的数据
                     for (Map map : nameList) {
                         String corpwxUserid = (String)map.get("corpwxUserid");
+                        String name = (String)map.get("name");
                         String dateStr = (String)map.get("dateStr");
-                        Optional<UserCorpwxTime> first = timeList.stream().filter(time -> time.getCorpwxUserid().equals(corpwxUserid) && dtf.format(time.getCreateDate()).equals(dateStr)).findFirst();
+                        Optional<UserCorpwxTime> first = timeList.stream().filter(time -> ((time.getCorpwxUserid() != null && time.getCorpwxUserid().equals(corpwxUserid)) || (time.getCorpwxUserid() == null && name != null && name.equals(time.getName()))) && dtf.format(time.getCreateDate()).equals(dateStr)).findFirst();
                         if (first.isPresent()) {
                             double wh = first.get().getWorkHours();
                             //赋值打卡时长
@@ -2129,13 +2136,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }).collect(Collectors.toList());
                 collect.add(-1);
                 List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().in("department_id", collect));
-//                Optional<Project> first = projectList.stream().filter(p -> StringUtils.isEmpty(p.getInchargerId())).findFirst();
-//                if (first.isPresent()) {
-//                    String projectName = first.get().getProjectName();
-//                    //httpRespMsg.setError("请给["+projectName+"]项目设置项目负责人");
-//                    httpRespMsg.setError("请给["+projectName+"]项目设置项目负责人");
-//                    return httpRespMsg;
-//                }
                 for (Report r : reportList) {
                     //根据项目阶段来调整审核流程
                     /*任务所属项目*/
@@ -2356,6 +2356,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
                 }
+            } else if (timeType.getReportAuditType() == 10) {
+                //项目经理或者公司副总审核;直接审核通过
+                boolean hasAuditAllPri = sysFunctionService.hasPriviledge(user.getRoleId(), "审核全员日报");
+                List<Report> updateReportList = new ArrayList<>();
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, creator_id, create_date, project_id, project_auditor_id, is_final_audit").in("id", ids));
+                for (Report r : reportList) {
+                    //直属领导审核或者部门负责人审核
+                    Report newReport = new Report();
+                    newReport.setId(r.getId());
+                    if (hasAuditAllPri || r.getProjectAuditorId().equals(user.getId())) {
+                        newReport.setState(1);
+                        newReport.setProjectAuditState(1);
+                        newReport.setProjectAuditTime(LocalDateTime.now());
+                    }
+                    updateReportList.add(newReport);
+                }
+                if (updateReportList.size() > 0) {
+                    updateBatchById(updateReportList);
+                }
             } else {
                 //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流(部门审批时,本部门的负责人是否由上级部门负责人审核,可配置)
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
@@ -3703,6 +3722,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
                 }
+            } else if (timeType.getReportAuditType() == 10) {
+                //项目经理或者公司副总审核;直接审核通过
+                boolean hasAuditAllPri = sysFunctionService.hasPriviledge(user.getRoleId(), "审核全员日报");
+                List<Report> updateReportList = new ArrayList<>();
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, group_audit_state, creator_id, create_date, project_id,audit_dept_managerid,department_audit_state,project_audit_state, project_auditor_id, is_dept_audit, is_final_audit").in("id", ids));
+                allReports = reportList;
+                for (Report r : reportList) {
+                    //直属领导审核或者部门负责人审核
+                    Report newReport = new Report();
+                    newReport.setId(r.getId());
+                    if (hasAuditAllPri || r.getProjectAuditorId().equals(user.getId())) {
+                        newReport.setState(1);
+                        newReport.setProjectAuditState(1);
+                        newReport.setProjectAuditTime(LocalDateTime.now());
+                    }
+                    updateReportList.add(newReport);
+                }
+                if (updateReportList.size() > 0) {
+                    updateBatchById(updateReportList);
+                }
             } else {
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                         new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", company.getId())
@@ -8019,7 +8058,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public HttpRespMsg getAIReport(HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         String userId = request.getHeader("token");
-        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        User user = userMapper.selectById(userId);
+        Integer companyId = user.getCompanyId();
         Company company = companyMapper.selectById(companyId);
         //先判断用户是否填写过日报
         QueryWrapper<Report> queryWrapper = new QueryWrapper<>();
@@ -8146,11 +8186,48 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 //项目的审核人
                 if (reportAuditType == 0) {
-                    r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                    int mode = 0;
+                    if (company.getNonProjectSimple() == 1) {
+                        //启用了简易模式
+                        Optional<Project> pOption = allProjectList.stream().filter(p->p.getId().equals(r.getProjectId())).findFirst();
+                        if (pOption.isPresent()) {
+                            Project project = pOption.get();
+                            List<ProjectAuditor> pAuditorList = new ArrayList<>();
+                            if (project.getIsPublic() == 1) {
+                                //非项目,该员工的部门主要负责人审核
+                                mode = 1;
+                                String superiorId = null;
+                                Integer departmentId = user.getDepartmentId();
+                                Department department = departmentMapper.selectById(departmentId);
+                                if (department != null) {
+                                    superiorId = department.getManagerId();
+                                }
+                                if (superiorId != null) {
+                                    User superior = userMapper.selectById(superiorId);
+                                    if (superior != null) {
+                                        ProjectAuditor auditor = new ProjectAuditor();
+                                        auditor.setAuditorId(superiorId);
+                                        auditor.setAuditorName(superior.getName());
+                                        pAuditorList.add(auditor);
+                                    }
+                                }
+                                r.setAuditUserList(pAuditorList);
+                            }
+                        }
+                    }
+                    if (mode == 0) {
+                        List<ProjectAuditor> pAuditorList = auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList());
+                        r.setAuditUserList(pAuditorList);
+                    }
+
                     if (r.getProjectAuditorId() != null) {
-                        Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
-                        if (auItem.isPresent()) {
-                            r.setProjectAuditorName(auItem.get().getAuditorName());
+                        List<ProjectAuditor> auList = r.getAuditUserList();
+                        if (auList.stream().anyMatch(au->au.getAuditorId().equals(r.getProjectAuditorId()))) {
+                            r.setProjectAuditorName(auList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst().get().getAuditorName());
+                        } else {
+                            //审核人列表里面没有之前日报里的该审核人,直接用审核人列表里面的第一个作为项目审核人
+                            r.setProjectAuditorId(auList.get(0).getAuditorId());
+                            r.setProjectAuditorName(auList.get(0).getAuditorName());
                         }
                     }
                 } else if (reportAuditType == 1 || reportAuditType == 2) {
@@ -8160,15 +8237,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         if (tgoup.isPresent()) {
                             TaskGroup curGroup = tgoup.get();
                             if (curGroup.getInchargerId() != null) {
-                                User user = userMapper.selectById(curGroup.getInchargerId());
+                                User incharger = userMapper.selectById(curGroup.getInchargerId());
                                 HashMap map = new HashMap();
-                                map.put("auditorId", user.getId());
-                                map.put("auditorName", user.getName());
+                                map.put("auditorId", incharger.getId());
+                                map.put("auditorName", incharger.getName());
                                 List list = new ArrayList();
                                 list.add(map);
                                 r.setAuditUserList(list);
                                 if (r.getProjectAuditorId() != null) {
-                                    r.setProjectAuditorName(user.selectById(r.getProjectAuditorId()).getName());
+                                    r.setProjectAuditorName(userMapper.selectById(r.getProjectAuditorId()).getName());
                                 }
                             }
                         }

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

@@ -134,7 +134,7 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
             return null;
         }
         //2024-04-30以后,剔除预估工时审批的模块
-        modules = modules.stream().filter(m->!m.getName().equals("预估工时审核")).collect(Collectors.toList());
+        modules = modules.stream().filter(m->!m.getName().equals("预估工时审核") && !m.getName().equals("财务报告审核")).collect(Collectors.toList());
         QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
         if (company.getPackageProject() == 1) {
             functionQueryWrapper.or().eq("package_project", 1);

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

@@ -21,6 +21,7 @@
         <result column="package_finance" property="packageFinance" />
         <result column="package_provider" property="packageProvider" />
         <result column="package_project_approval" property="packageProjectApproval" />
+        <result column="package_device" property="packageDevice" />
         <result column="is_international" property="isInternational" />
         <result column="create_date" property="createDate" />
         <result column="reg_from" property="regFrom" />
@@ -29,7 +30,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, is_international, create_date, reg_from, non_project_simple
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, package_device, is_international, create_date, reg_from, non_project_simple
     </sql>
 
 </mapper>

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

@@ -25,11 +25,12 @@
         <result column="need_dept_audit" property="needDeptAudit" />
         <result column="package_provider" property="packageProvider" />
         <result column="package_project_approval" property="packageProjectApproval" />
+        <result column="package_device" property="packageDevice" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, path, parent_id, icon, orderitem, is_menu, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, report_workflow, package_finance, need_dept_audit, package_provider, package_project_approval
+        id, name, path, parent_id, icon, orderitem, is_menu, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, report_workflow, package_finance, need_dept_audit, package_provider, package_project_approval, package_device
     </sql>
 
 </mapper>

BIN
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/上海民航合同模板.xlsx


+ 18 - 8
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -153,6 +153,7 @@
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageFinance">财务核算</el-checkbox></div>
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageProvider">供应商管理</el-checkbox></div>
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageProjectApproval">立项管理</el-checkbox></div>
+                        <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageDevice">设备管理</el-checkbox></div>
                     </div>
                     
                     <!-- <span>{{scope.row.packageWorktime ? "工时 +" : ""}}</span>
@@ -231,14 +232,17 @@
                     <el-form-item>
                         日报审核模式:
                         <el-select v-model="dialogData.reportAuditType" size="small">
-                            <el-option :value="0" label="项目审核人审核"></el-option>
-                            <el-option :value="1" label="任务分组负责人审核"></el-option>
-                            <el-option :value="2" label="先分组审核再PM审核"></el-option>
-                            <el-option :value="3" label="员工自由选择审批人"></el-option>
-                            <el-option :value="4" label="项目所属BU审核"></el-option>
-                            <el-option :value="5" label="所属部门负责人审核"></el-option>
-                            <el-option :value="6" label="直属或部门负责人审核->项目日报审核人审核"></el-option>
-                            <el-option :value="7" label="项目和部门并行审核"></el-option>
+                            <el-option :value="0" label="0-项目审核人审核"></el-option>
+                            <el-option :value="1" label="1-任务分组负责人审核"></el-option>
+                            <el-option :value="2" label="2-先分组审核再PM审核"></el-option>
+                            <el-option :value="3" label="3-员工自由选择审批人"></el-option>
+                            <el-option :value="4" label="4-项目所属BU审核"></el-option>
+                            <el-option :value="5" label="5-所属部门负责人审核"></el-option>
+                            <el-option :value="6" label="6-直属或部门负责人审核->项目日报审核人审核"></el-option>
+                            <el-option :value="7" label="7-项目和部门并行审核"></el-option>
+                            <el-option :value="8" label="8-项目设置复审人"></el-option>
+                            <el-option :value="9" label="9-分组负责人审核->项目日报审核人审核;"></el-option>
+                            <el-option :value="10" label="10-普通员工到项目经理,项目经理到单独审核人"></el-option>
                         </el-select>
                     </el-form-item>
                     <el-form-item>
@@ -255,6 +259,9 @@
                     <el-form-item><el-checkbox v-model="dialogData.enableNewWeeklyfill">是否启用新的按周填报模式</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.hideSubproject">是否去除子项目</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.userWithMultiDept">是否开启人员设置可填报部门</el-checkbox></el-form-item>
+                    <el-form-item><el-checkbox v-model="dialogData.importReportAuditNormal">导入的日报正常审批</el-checkbox></el-form-item>
+                    <el-form-item><el-checkbox v-model="dialogData.onlyShowPercent">工时报告页面,工时仅显示比例</el-checkbox></el-form-item>
+                    
                 </el-form>
             </div>
             <!-- 是否开启审批流设置,是否启用主项目模式,是否秘薪模式,是否显示日报审批流程,是否CRO企业,是否仅使用导入日报审核(不要项目审核) reportAuditType-->
@@ -411,6 +418,7 @@ import App from '../../App.vue';
                     this.dialogData.packageProvider = this.dialogData.packageProvider ? true : false,
                     this.dialogData.financeAudit = this.dialogData.financeAudit ? true : false
                     this.dialogData.packageProjectApproval = this.dialogData.packageProjectApproval ? true : false
+                    this.dialogData.packageDevice = this.dialogData.packageDevice ? true : false
                 }
                 else if(i == 'D'){ this.editDialogD = true }
                 else if (i=='E') {
@@ -700,6 +708,7 @@ import App from '../../App.vue';
                         packageFinance: this.dialogData.packageFinance ? 1 : 0,
                         packageProvider: this.dialogData.packageProvider ? 1 : 0,
                         packageProjectApproval: this.dialogData.packageProjectApproval ? 1 : 0,
+                        packageDevice: this.dialogData.packageDevice ? 1 : 0,
                     },
                 res => {
                     this.listLoading = false;
@@ -965,6 +974,7 @@ import App from '../../App.vue';
                             res.data.records[i].packageSimple == 1 ? arrList.push('简单表格') : ''
                             res.data.records[i].packageFinance == 1 ? arrList.push('财务核算') : ''
                             res.data.records[i].packageProjectApproval == 1 ? arrList.push('立项管理') : ''
+                            res.data.records[i].packageDevice == 1 ? arrList.push('设备管理') : ''
                             res.data.records[i].arrList = arrList
                         }
                         var list = res.data.records;

Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/echarts.min.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/element-ui.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/element-uiCss.css


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/goofy.js


+ 61 - 0
fhKeeper/formulahousekeeper/octopus/static/js/index.js

@@ -0,0 +1,61 @@
+let lang = window.navigator.language;
+console.log(lang);
+
+
+function apiAuth() {
+    if (!window.h5sdk) {
+        console.log('invalid h5sdk')
+        alert('please open in feishu')
+        return
+    }
+
+    // 通过服务端的Route: get_appid获取app_id
+    // 服务端Route: get_appid的具体内容请参阅服务端模块server.py的get_appid()函数
+    // 为了安全,app_id不应对外泄露,尤其不应在前端明文书写,因此此处从服务端获取
+    fetch(`/get_appid`).then(response1 => response1.json().then(res1 => {
+        console.log("get appid succeed: ", res1.appid);
+        // 通过error接口处理API验证失败后的回调
+        window.h5sdk.error(err => {
+            throw('h5sdk error:', JSON.stringify(err));
+        });
+        // 通过ready接口确认环境准备就绪后才能调用API
+        window.h5sdk.ready(() => {
+            console.log("window.h5sdk.ready");
+            console.log("url:", window.location.href);
+            // 调用JSAPI tt.requestAuthCode 获取 authorization code
+            tt.requestAuthCode({
+                appId: res1.appid,
+                // 获取成功后的回调
+                success(res) {
+                    console.log("getAuthCode succeed");
+                    //authorization code 存储在 res.code
+                    // 此处通过fetch把code传递给接入方服务端Route: callback,并获得user_info
+                    // 服务端Route: callback的具体内容请参阅服务端模块server.py的callback()函数
+                    fetch(`/callback?code=${res.code}`).then(response2 => response2.json().then(res2 => {
+                        console.log("getUserInfo succeed");
+                        // 示例Demo中单独定义的函数showUser,用于将用户信息展示在前端页面上
+                        showUser(res2);}
+                        )
+                    ).catch(function (e) {console.error(e)})
+                },
+                // 获取失败后的回调
+                fail(err) {
+                    console.log(`getAuthCode failed, err:`, JSON.stringify(err));
+                }
+            })
+        }
+        )
+    })).catch(function (e) { // 从服务端获取app_id失败后的处理
+        console.error(e)
+        })
+}
+
+function showUser(res) {
+    // 展示用户信息
+    // 头像
+    $('#img_div').html(`<img src="${res.avatar_url}" width="100%" height=""100%/>`);
+    // 名称
+    $('#hello_text_name').text(lang === "zh_CN" || lang === "zh-CN" ? `${res.name}` : `${res.en_name}`);
+    // 欢迎语
+    $('#hello_text_welcome').text(lang === "zh_CN" || lang === "zh-CN" ? "欢迎使用飞书" : "welcome to Feishu");
+}

Різницю між файлами не показано, бо вона завелика
+ 6 - 0
fhKeeper/formulahousekeeper/octopus/static/js/jquery.min.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/jweixin-1.2.0.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
fhKeeper/formulahousekeeper/octopus/static/js/jwxwork-1.0.0.js


Різницю між файлами не показано, бо вона завелика
+ 6 - 0
fhKeeper/formulahousekeeper/octopus/static/js/vue-router.min.js


Різницю між файлами не показано, бо вона завелика
+ 6 - 0
fhKeeper/formulahousekeeper/octopus/static/js/vue.min.js


Різницю між файлами не показано, бо вона завелика
+ 6 - 0
fhKeeper/formulahousekeeper/octopus/static/js/vuex.min.js


+ 37 - 21
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Company.java

@@ -19,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-02-21
+ * @since 2024-09-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -72,12 +72,6 @@ public class Company extends Model<Company> {
     @TableField("package_project")
     private Integer packageProject;
 
-    /**
-     * 立项管理
-     */
-    @TableField("package_project_approval")
-    private Integer packageProjectApproval;
-
     /**
      * 合同平台
      */
@@ -126,32 +120,30 @@ public class Company extends Model<Company> {
     @TableField("package_finance")
     private Integer packageFinance;
 
-
-    @TableField(exist = false)
-    private String wxCorpid;
-
-    @TableField(exist = false)
-    private String dingdingCorpid;
-
-    @TableField(exist = false)
-    private String feishuInfoid;
-
-
     /**
      * 供应商模块
      */
     @TableField("package_provider")
     private Integer packageProvider;
 
+    /**
+     * 立项管理
+     */
+    @TableField("package_project_approval")
+    private Integer packageProjectApproval;
+
+    /**
+     * 设备管理模块
+     */
+    @TableField("package_device")
+    private Integer packageDevice;
+
     /**
      * 是否是国际化版本
      */
     @TableField("is_international")
     private Integer isInternational;
 
-    /**
-     * 创建日期
-     */
     @TableField("create_date")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
@@ -166,6 +158,30 @@ public class Company extends Model<Company> {
     @TableField(exist = false)
     private long remainingValidDays;
 
+    /**
+     * 注册来源
+     */
+    @TableField("reg_from")
+    private String regFrom;
+
+    /**
+     * 非项目简单模式,该模式下非项目日报由部门主要负责人审核
+     */
+    @TableField("non_project_simple")
+    private Integer nonProjectSimple;
+
+
+    @TableField(exist = false)
+    private String wxCorpid;
+
+    @TableField(exist = false)
+    private String dingdingCorpid;
+
+    @TableField(exist = false)
+    private String feishuInfoid;
+
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -5,8 +5,6 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
-import java.util.List;
-
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -17,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-03-25
+ * @since 2024-09-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -297,7 +295,7 @@ public class TimeType extends Model<TimeType> {
     private Integer mainProjectState;
 
     /**
-     * 日报的审核类型, 0-项目审核人审核,1-分组负责人审核,2-先分组负责人审核再项目负责人(PM)审核;3-员工自由选择审批人 4-项目所属BU审核 5-直属审核人或部门负责人审核,6-直属或部门负责人审核->项目日报审核人审核
+     * 日报的审核类型, 0-项目审核人审核,1-分组负责人审核,2-先分组负责人审核再项目负责人(PM)审核;3-员工自由选择审批人 4-项目所属BU审核 5-直属审核人或部门负责人审核,6-直属或部门负责人审核->项目日报审核人审核,7-项目和部门并行审核;8-项目设置复审人;9-分组负责人审核->项目日报审核人审核;10-普通员工到项目经理,项目经理到单独审核人
      */
     @TableField("report_audit_type")
     private Integer reportAuditType;
@@ -368,9 +366,6 @@ public class TimeType extends Model<TimeType> {
     @TableField("report_auto_approve_days")
     private Integer reportAutoApproveDays;
 
-    @TableField(exist = false)
-    private List<User> userList;
-
     /**
      * 日报填报时长上限,默认12小时
      */
@@ -533,6 +528,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_degree_multiple")
     private Boolean customDegreeMultiple;
 
+    /**
+     * 任务分组是否必填
+     */
+    @TableField("task_group_required")
+    private Integer taskGroupRequired;
+
     /**
      * 任务是否必填 0-否 1-是
      */
@@ -569,6 +570,48 @@ public class TimeType extends Model<TimeType> {
     @TableField("user_with_multi_dept")
     private Integer userWithMultiDept;
 
+    /**
+     * 提醒审核日,默认周一
+     */
+    @TableField("alert_check_day")
+    private Integer alertCheckDay;
+
+    /**
+     * 提醒审核的文字消息
+     */
+    @TableField("alert_check_msg")
+    private String alertCheckMsg;
+
+    /**
+     * 导入的日报,按照正常审批来处理,非单独设置的部门直属领导审核
+     */
+    @TableField("import_report_audit_normal")
+    private Integer importReportAuditNormal;
+
+    /**
+     * 日报第二审核人;在reportAuditType5时有效
+     */
+    @TableField("second_auditor")
+    private String secondAuditor;
+
+    /**
+     * 日报第三审核人;在reportAuditType5时有效
+     */
+    @TableField("third_auditor")
+    private String thirdAuditor;
+
+    /**
+     * 工时报告页面,查看时仅显示比例;
+     */
+    @TableField("only_show_percent")
+    private Integer onlyShowPercent;
+
+    /**
+     * 是否校验考勤数据的加班时长
+     */
+    @TableField("verify_card_overtime")
+    private Integer verifyCardOvertime;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/CompanyMapper.xml

@@ -21,6 +21,7 @@
         <result column="package_finance" property="packageFinance" />
         <result column="package_provider" property="packageProvider" />
         <result column="package_project_approval" property="packageProjectApproval" />
+        <result column="package_device" property="packageDevice" />
         <result column="is_international" property="isInternational" />
         <result column="create_date" property="createDate" />
         <result column="reg_from" property="regFrom" />
@@ -29,7 +30,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, is_international, create_date, reg_from, non_project_simple
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, package_device, is_international, create_date, reg_from, non_project_simple
     </sql>
 
 </mapper>

Різницю між файлами не показано, бо вона завелика
+ 8 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml


BIN
fhKeeper/formulahousekeeper/ops-platform/人员导入模板.xlsx


+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -1883,6 +1883,7 @@
   "xiangMuRenTian": "Project person day",
   "xiangMuShenHeRenShenHe": "Project Reviewer Review",
   "xiangMuSuoShuBuFuZeRenShenHe": "Reviewed by the BU responsible person for the project",
+  "projectManagerOrLeaderReview": "Reviewed by pm or leader",
   "xiangMuTongBuChengGong": "Project synchronization successful",
   "xiangMuYuGuGongShiPeiZhi": "Project estimated working hours configuration",
   "xuanZeYaoFuZhiDaoDeMuBiaoXiangMu": "Select the target project to copy to",

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -1864,6 +1864,7 @@
   "fenZuGongShiBuZuShi": "分组工时不足时",
   "xiangMuShenHeRenShenHe": "项目审核人审核",
   "xiangMuSuoShuBuFuZeRenShenHe": "项目所属BU负责人审核",
+  "projectManagerOrLeaderReview": "项目经理或公司副总审核",
   "zhiNengFenGongSheZhi": "职能分工设置",
   "gongShiLeiXing": "工时类型",
   "gongZuoZhiZe": "工作职责",

+ 16 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -92,7 +92,12 @@
 
         <!--导出报表条件选择 -->
         <el-dialog :title="$t('timeReportExport')" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <el-form ref="form3" :model="exportParam" >
+            <el-form ref="form4"  v-if="user.companyId == 10">
+                <el-form-item :label="this.$t('Selectmonth')" >
+                    <el-date-picker size="small" v-model="exportParam.date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" :clearable="false" type="month" :placeholder="$t('Selectmonth')" style="margin-right: 20px"></el-date-picker>
+                </el-form-item>
+            </el-form>
+            <el-form ref="form3" :model="exportParam" v-else>
                 <el-form-item prop="projectCategoryId" :label="$t('projectclassification')" v-if="radio == $t('projectclassification')||radio==$t('other.project')">
                     <el-select v-model="exportParam.projectCategoryId" :placeholder="$t('classificationitems')"  clearable style="width:350px;" filterable="true" @change="filterCategory">
                         <el-option v-for="item in categoryList"  :key="item.id" :label="item.name" :value="item.id">
@@ -226,7 +231,7 @@
                 hasReportUserList:[],
                 projectList:[],
                 categoryList: [],
-                exportParam:{projectId:null,dateRange:[],userId: null,type: '0', withPercent: false},
+                exportParam:{projectId:null,dateRange:[],userId: null,type: '0', withPercent: false, date: null},
                 exportDialog:false,
                 dateRange:[],
                 user: JSON.parse(sessionStorage.getItem("user")),
@@ -327,7 +332,6 @@
                 },
             
             showExportDialog() {
-                // console.log(12345)
                 // 清空选择的人
                 if(this.radio == this.$t('ren-yuan')) {
                     this.exportParam.userIds = new Array()
@@ -336,7 +340,10 @@
 
                 this.exportDialog = true;
                 this.exportParam.dateRange = this.dateRange;
-                // console.log(this.hasReportUserList)
+                var array = this.exportParam.dateRange[0].split('-');
+                this.exportParam.date = array[0] + '-' + array[1];
+                console.log(this.exportParam.date)
+                this.$forceUpdate();
                 if (this.radio == this.$t('ren-yuan')) {
                     // this.exportParam.userIds = [];
                 }
@@ -406,6 +413,11 @@
                      if (this.exportParam.withPercent) {
                         param.withPercent = 1;
                      }
+                     if (this.user.companyId == 10) {
+                        param.date = this.exportParam.date;
+                        url = '/project/exportTimeByProjectAndEmployee';
+                        fileName = param.date + '月度工时成本统计表.xlsx';
+                     }
                  }
                  if (this.radio == this.$t('ren-yuan') ) {
                     //  console.log(this.exportParam.userIds);

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

@@ -4,7 +4,7 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <!-- <el-form-item label="财务核算成本 | 月份选择" style="margin-top:5px;"> -->
-                <el-form-item :label="this.$t('Selectmonth')" >
+            <el-form-item :label="this.$t('Selectmonth')" >
                 <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="loadMonthData" :clearable="false" type="month" :placeholder="$t('Selectmonth')" style="margin-right: 20px"></el-date-picker>
                 <el-link type="primary" :underline="false" @click="audits()" v-if="user.timeType.financeAudit == '1'">{{revaelse}}</el-link>
             </el-form-item>

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

@@ -417,28 +417,6 @@
                     </template>
                 </el-dropdown-menu>
             </el-dropdown>
-            <!-- <template v-if="user.timeType.customDegreeActive && (showColumnWidth != '0' || permissions.projectManagement)">
-                <el-button size="small" type="primary" @click="batchSetWudulistBtn2(true)">{{ $t('volumeset') }} {{user.timeType.customDegreeName}}</el-button>
-                <el-button size="small" type="primary" @click="batchSetWudulistBtn2(false)">{{ $t('pi-liang-tian-jia') }} {{user.timeType.customDegreeName}}</el-button>
-            </template>
-            <template v-if="user.company.packageProject && (showColumnWidth != '0' || permissions.projectManagement)">
-                <el-button size="small" type="primary" @click="addTaskGroup()" >{{ $t('piLiangZengJiaRenWuFenZu') }}</el-button>
-            </template>
-            <template v-if="user.company.packageProject && (showColumnWidth != '0' || permissions.projectManagement)">
-                <el-button size="small" type="primary" @click="setGroupIncharger()" >{{ $t('piLiangSheZhiFenZuFuZeRen') }}</el-button>
-            </template>
-            <template v-if="user.company.packageProject && (showColumnWidth != '0' || permissions.projectManagement)">
-                <el-button size="small" type="primary" @click="addGroupPerson()" :loading="addGroupPersonBtnLoading">{{ $t('groupparticipantsinbatches') }}</el-button>
-            </template>
-            <template v-if="(showColumnWidth != '0' || permissions.projectManagement)">
-                <el-button size="small" type="primary" @click="addProPreson()">{{ $t('projectparticipantsinbatches') }}</el-button>
-                <el-button size="small" type="primary" v-if="permissions.projectManagement" @click="batchIncharger()">{{ $t('projectmanagersinbatches') }}</el-button>
-                <el-button size="small" type="primary" v-if="user.roleName=($t('role.superAdministrator'))" @click="batchDelete()" :loading="isDeleting">{{ $t('Batchdelete') }}</el-button>
-            </template>
-            <template v-if="showColumnWidth != '0' && user.company.packageProject == 1">
-                <el-button size="small" type="primary" @click="batchProjectStage()">{{ $t('piLiangXiuGaiXiangMuJieDuan') }}</el-button>
-            </template> -->
-            
             <el-pagination :key="projectListPageComponentKey"
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
@@ -509,14 +487,6 @@
                         <!-- <vueCascader :size="'medium'" :widthStr="'430'" :filterable="true" :clearable="true" :subject="departmentList" :subjectId="addForm.deptId" :radios="true" :distinction="'20'" :disabled="canOnlyModParticipator" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1" ></vueCascader> -->
                         <vueCascadeSelection v-model="addForm.deptId" :options="departmentList" :props="{ checkStrictly: true, expandTrigger: 'hover' }" :disabled="canOnlyModParticipator" v-if="user.userNameNeedTranslate == 1"></vueCascadeSelection>
                     </el-form-item>
-
-                    <!-- 供应商 -->
-                    <!-- <el-form-item label="供应商" v-if="user.company.packageProvider">
-                        <el-select v-model="addForm.supplierId" multiple collapse-tags style="width:32%;" placeholder="请选择供应商">
-                            <el-option v-for="item in supplierList" :key="item.id" :label="item.providerName" :value="item.id">
-                            </el-option>
-                        </el-select>
-                    </el-form-item> -->
                     <el-form-item :label="$t('supplier')" v-if="user.company.packageProvider">
                         <el-select v-model="addForm.supplierId" multiple :placeholder="$t('defaultText.pleaseChoose')" filterable="true" style="width: 100%" :disabled="canOnlyModParticipator">
                             <span v-for="(item, index) in supplierList" :key="index">
@@ -619,7 +589,7 @@
                     </el-form-item>
 
 
-                    <el-form-item :label="$t('ommencementDate')" prop="planStartDate"  v-if="(user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                    <el-form-item :label="$t('ommencementDate')" prop="planStartDate"  >
                         <el-date-picker v-model="addForm.planStartDate" :disabled="canOnlyModParticipator"
                         :editable="false" style="width:32%;" 
                         format="yyyy-MM-dd" 

Різницю між файлами не показано, бо вона завелика
+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue


+ 4 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -416,9 +416,9 @@
         </el-dialog>
 
         <!-- 新增/编辑人员的Dialog -->
-        <el-dialog :title="title" :visible.sync="dialogVisible" width="580px" :top="'7.5vh'">
+        <el-dialog :title="title" :visible.sync="dialogVisible" width="600px" :top="'7.5vh'">
             <div style="height: 62vh;overflow: auto;">
-              <el-form ref="form12" :model="insertForm" :rules="rules" label-width="100px">
+              <el-form ref="form12" :model="insertForm" :rules="rules" label-width="120px">
                   <el-form-item :label="$t('lable.name')" prop="name" v-if="user.userNameNeedTranslate != '1'">
                       <el-input v-model="insertForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="user.userNameNeedTranslate == '1'"></el-input>
                   </el-form-item>
@@ -472,9 +472,9 @@
                       <el-radio  :label="1">{{ $t('yiCengShenHe') }}</el-radio>
                       </el-radio-group>
                   </el-form-item>
-                  <el-form-item v-if="user.timeType.reportAuditType == 5 || user.timeType.reportAuditType == 6">
+                  <el-form-item v-if="user.timeType.reportAuditType == 5 || user.timeType.reportAuditType == 6 || (user.timeType.reportAuditType == 0 && user.company.nonProjectSimple == 1)">
                       <span slot="label">
-                        <span>{{ $t('immediatesuperior') }}</span>
+                        <span>{{ (user.timeType.reportAuditType == 0 && user.company.nonProjectSimple == 1)?'非项目审核人':$t('immediatesuperior') }}</span>
                         <el-tooltip effect="dark" :content="$t('weiSheZhiShiYouSuoShuBuMenFuZeRenShenHe')" placement="top-start">
                           <i class="el-icon-question" style="color:#606266"></i>
                         </el-tooltip>

+ 8 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -596,7 +596,7 @@
                                 </el-select>
                             </template>
                         </el-form-item>
-                        <div v-if="user.timeType.reportAuditType != 1 && user.timeType.reportAuditType != 2 && user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && user.timeType.reportAuditType != 9 && domain.auditUserList">
+                        <div v-if="user.timeType.reportAuditType != 1 && user.timeType.reportAuditType != 2 && user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && user.timeType.reportAuditType != 9 && user.timeType.reportAuditType != 10 && domain.auditUserList">
                             <el-form-item v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && domain.auditUserList.length > 0">
                                 <template slot="label">
                                     <span style="color:#FF0000;">*</span>
@@ -2171,8 +2171,7 @@
                 <el-steps  :active="curAuditNode" align-center="true" finish-status="success" v-if="user.companyId == 7544">
                 <el-step title="待提交"></el-step>
                 <el-step title="员工提交"></el-step>
-                <el-step title="项目经理审核"></el-step>
-                <el-step title="公司副总审核"></el-step>
+                <el-step title="审核通过"></el-step>
                 </el-steps>
                 <el-divider v-if="user.companyId == 7544"></el-divider>
                 <p style="color:#aaaaaa;" v-if="user.companyId == 7544">审核记录</p>
@@ -3433,10 +3432,14 @@
             },
             //下载带企业微信考勤数据的工时统计模板
             downloadCheckInExcel() {
-                this.http.post('/user-corpwx-time/exportCheckInExcel',{ 
+                var param = { 
                     startDate: this.importWxParam.date[0],
                     endDate: this.importWxParam.date[1],
-                },
+                };
+                if (this.user.roleName == '超级管理员' || this.user.roleName == '财务管理员') {
+                    param.onlySelfData = false;
+                }
+                this.http.post('/user-corpwx-time/exportCheckInExcel',param,
                 res => {
                     if (res.code == "ok") {
                         var filePath = res.data;

+ 29 - 9
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/calendar.vue

@@ -12,6 +12,7 @@
             :style="{ height: tableHeight+'px' }"
             :className="'van-calendar__top-info'"
             @select="selectDate"
+            @month-show="onMonthShow"
             />
         </div>
     </div>
@@ -107,32 +108,51 @@
                 this.showPicker = false;
                 this.getReport();
             },
-
-            // 获取日报
-            getReport() {
+            onMonthShow(data) {
                 this.hasWaiting = false;
                 const toast = this.$toast.loading({
                     forbidClick: true,
                     duration: 0
                 });
-                var startDate = new Date();
-                startDate.setMonth(startDate.getMonth() -2);
-                this.$axios.post("/report/getReportFillStatus", {startDate: this.format(startDate), endDate:this.format(this.maxDate), userId: this.user.id})
+                var startDate = data.date;
+                var endDate = new Date(startDate);
+                endDate.setMonth(endDate.getMonth() + 1, 0);
+                this.$axios.post("/report/getReportFillStatus", {startDate: this.format(startDate), endDate:this.format(endDate), userId: this.user.id})
                 .then(res => {
                     if(res.code == "ok") {
                         this.$toast.clear();
-                        this.report = res.data;
-                        
+                        this.report = this.report.concat(res.data);
                     } else {
                         this.$toast.clear();
                         this.$toast.fail('获取失败');
                     }
                 }).catch(err=> {this.$toast.clear();});
             },
+            // 获取日报
+            // getReport() {
+            //     this.hasWaiting = false;
+            //     const toast = this.$toast.loading({
+            //         forbidClick: true,
+            //         duration: 0
+            //     });
+            //     var startDate = new Date();
+            //     startDate.setMonth(startDate.getMonth() -1);
+            //     this.$axios.post("/report/getReportFillStatus", {startDate: this.format(startDate), endDate:this.format(this.maxDate), userId: this.user.id})
+            //     .then(res => {
+            //         if(res.code == "ok") {
+            //             this.$toast.clear();
+            //             this.report = res.data;
+                        
+            //         } else {
+            //             this.$toast.clear();
+            //             this.$toast.fail('获取失败');
+            //         }
+            //     }).catch(err=> {this.$toast.clear();});
+            // },
         },
 
         mounted() {
-            this.getReport();
+            // this.getReport();
         }
     };
 </script>