浏览代码

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

山水共长天一色 3 年之前
父节点
当前提交
a0e6121feb
共有 29 个文件被更改,包括 504 次插入444 次删除
  1. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  2. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SysRoleController.java
  3. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  4. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysFunction.java
  5. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  6. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  7. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  8. 9 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java
  9. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  10. 351 351
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  11. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
  12. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  13. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysFunctionMapper.xml
  14. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml
  15. 二进制
      fhKeeper/formulahousekeeper/management-platform/员工项目分摊比例导入模板.xlsx
  16. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  17. 6 3
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  18. 16 15
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  19. 4 5
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  20. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  21. 6 6
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  22. 19 20
      fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue
  23. 10 12
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  24. 3 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  25. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  26. 0 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue
  27. 0 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue
  28. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/index.vue
  29. 17 5
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

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

@@ -54,6 +54,7 @@ public class EarningSnapshotController {
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
         Project project = projectMapper.selectById(projectId);
+
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看成本基线");
         if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
             List<EarningSnapshot> list = earningSnapshotService.list(new QueryWrapper<EarningSnapshot>().eq("project_id", projectId).orderByDesc("id"));

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

@@ -46,8 +46,9 @@ public class SysRoleController {
             queryWrapper.eq("id", 88)
                     .or().eq("id", 294).or().eq("id",309).or().eq("id", 7)
                     .or().eq("id", 10).or().eq("id", 424).or().eq("id", 317)
-                    .or().eq("id", 428).or().eq("id", 469).or().eq("id", 528)
-                    .or().eq("id", 529).or().gt("id", 565);
+                    .or().eq("id", 428).or().eq("id", 469)
+                    .or().eq("id", 481).or().eq("id", 528)
+                    .or().eq("id", 529).or().eq("id", 541).or().gt("id", 565);
             //565是2月底最后一家
             List<Company> allCompany = companyMapper.selectList(queryWrapper);
             for (Company company : allCompany) {

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

@@ -846,6 +846,9 @@ public class WeiXinCorpController {
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }
+        if (timeType.getNeedDeptAudit() == 1) {
+            queryWrapper.or().eq("need_dept_audit", 1);
+        }
         queryWrapper.orderByAsc("orderitem");
 
         //返回菜单
@@ -908,6 +911,12 @@ public class WeiXinCorpController {
             if (company.getPackageFinance() == 1) {
                 functionQueryWrapper.or().eq("package_finance", 1);
             }
+            if (timeType.getReportWorkflow() == 1) {
+                queryWrapper.or().eq("report_workflow", 1);
+            }
+            if (timeType.getNeedDeptAudit() == 1) {
+                queryWrapper.or().eq("need_dept_audit", 1);
+            }
             functionQueryWrapper.orderByAsc("seq");
 
             List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);

+ 7 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysFunction.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-01
+ * @since 2022-04-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -123,10 +123,15 @@ public class SysFunction extends Model<SysFunction> {
     @TableField("sync_corpwx_time")
     private Integer syncCorpwxTime;
 
+    /**
+     * 财务上传是否需要审核
+     */
+    @TableField("finance_audit")
+    private Integer financeAudit;
+
 
     @TableField(exist = false)
     private boolean checked;
-
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 6 - 2
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 2022-04-01
+ * @since 2022-04-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -134,6 +134,11 @@ public class SysModule extends Model<SysModule> {
     @TableField("package_finance")
     private Integer packageFinance;
 
+    /**
+     * 是否属于导入审核控制
+     */
+    @TableField("need_dept_audit")
+    private Integer needDeptAudit;
 
 
     @TableField(exist = false)
@@ -146,7 +151,6 @@ public class SysModule extends Model<SysModule> {
     @TableField(exist = false)
     private List<SysFunction> functionList;
 
-
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -451,6 +451,9 @@ public class DingDingServiceImpl implements DingDingService {
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }
+        if (timeType.getNeedDeptAudit() == 1) {
+            queryWrapper.or().eq("need_dept_audit", 1);
+        }
         queryWrapper.orderByAsc("orderitem");
 
         //返回菜单
@@ -513,6 +516,12 @@ public class DingDingServiceImpl implements DingDingService {
             if (company.getPackageFinance() == 1) {
                 functionQueryWrapper.or().eq("package_finance", 1);
             }
+            if (timeType.getReportWorkflow() == 1) {
+                queryWrapper.or().eq("report_workflow", 1);
+            }
+            if (timeType.getNeedDeptAudit() == 1) {
+                queryWrapper.or().eq("need_dept_audit", 1);
+            }
             functionQueryWrapper.orderByAsc("seq");
 
             List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);

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

@@ -184,6 +184,9 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }
+        if (timeType.getNeedDeptAudit() == 1) {
+            queryWrapper.or().eq("need_dept_audit", 1);
+        }
         queryWrapper.orderByAsc("orderitem");
 
         List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
@@ -217,6 +220,10 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
         if (timeType.getSyncCorpwxTime() == 1) {
             functionQueryWrapper.or().eq("sync_corpwx_time", 1);
         }
+        //开通财务审核功能的
+        if (timeType.getFinanceAudit() == 1) {
+            functionQueryWrapper.or().eq("finance_audit", 1);
+        }
         functionQueryWrapper.orderByAsc("seq");
 
         List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);

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

@@ -51,7 +51,8 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     public static String[] pmoFunctions = {"新增项目","查看全部项目","管理全部项目","分类管理","导入项目","代填日报", "请假填报","费用填报",
             "导出项目","查看资源分配", "基线成本项管理","查看成本基线","校正成本基线","查看合同金额"};
     public static String[] corpLeaderFunctions = {"查看全公司工时","查看全部项目","导出项目","查看资源分配",
-            "查看成本基线","查看合同金额", "请假填报","费用填报", "查看全部请假单"};
+            "查看成本基线","查看合同金额", "请假填报","费用填报", "查看全部请假单","项目任务报表","项目成本报表","项目收支平衡表","客户项目利润表",
+            "项目阶段工时表", "加班情况统计表"};
     public static final HashMap<String, String[]> functionMaps = new HashMap();
     static {
         functionMaps.put("普通员工", employeeFunctions);
@@ -122,6 +123,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }
+        if (timeType.getNeedDeptAudit() == 1) {
+            queryWrapper.or().eq("need_dept_audit", 1);
+        }
         queryWrapper.orderByAsc("orderitem");
 
         List<SysModule> modules = sysModuleMapper.selectList(queryWrapper);
@@ -155,6 +159,10 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         if (timeType.getSyncCorpwxTime() == 1) {
             functionQueryWrapper.or().eq("sync_corpwx_time", 1);
         }
+        //开通财务审核功能的
+        if (timeType.getFinanceAudit() == 1) {
+            functionQueryWrapper.or().eq("finance_audit", 1);
+        }
         functionQueryWrapper.orderByAsc("seq");
 
         List<SysFunction> functions = sysFunctionMapper.selectList(functionQueryWrapper);

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -222,6 +222,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }
+        if (timeType.getNeedDeptAudit() == 1) {
+            queryWrapper.or().eq("need_dept_audit", 1);
+        }
         queryWrapper.orderByAsc("orderitem");
 
         //返回菜单
@@ -303,6 +306,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (company.getPackageFinance() == 1) {
                 functionQueryWrapper.or().eq("package_finance", 1);
             }
+            if (timeType.getReportWorkflow() == 1) {
+                queryWrapper.or().eq("report_workflow", 1);
+            }
+            if (timeType.getNeedDeptAudit() == 1) {
+                queryWrapper.or().eq("need_dept_audit", 1);
+            }
             functionQueryWrapper.orderByAsc("seq");
 
             List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);

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

@@ -1,351 +1,351 @@
-//package com.management.platform.task;
-//
-//import java.time.LocalDate;
-//import java.time.Period;
-//import java.time.format.DateTimeFormatter;
-//
-//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-//import com.management.platform.constant.Constant;
-//import com.management.platform.entity.*;
-//import com.management.platform.mapper.*;
-//import com.management.platform.service.CompanyDingdingService;
-//import com.management.platform.service.WxCorpInfoService;
-//import com.management.platform.util.*;
-//import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
-//import me.chanjar.weixin.mp.api.WxMpService;
-//import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-//import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
-//import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.format.annotation.DateTimeFormat;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.Scheduled;
-//import org.springframework.stereotype.Component;
-//
-//import javax.annotation.Resource;
-//import java.time.LocalDateTime;
-//import java.util.*;
-//import java.util.stream.Collectors;
-//
-///**
-// * Author: 吴涛涛
-// * Date : 2019 - 12 - 31 16:04
-// * Description:<描述>
-// * Version: 1.0
-// */
-//@EnableScheduling
-//@Component
-//public class TimingTask {
-//
-//    @Value("${wx.template_report_fill}")
-//    public String TEMPLATE_REPORT_FILL;
-//    @Value("${wx.template_project_deadline}")
-//    public String TEMPLATE_PROJECT_DEADLINE;
-//    @Value("${wx.app_id}")
-//    public String appId;
-//    @Value("${wx.app_secret}")
-//    public String appSecret;
-//    @Autowired
-//    private RedisUtil redisUtil;
-//
-//    @Resource
-//    private ScreenshotMapper screenshotMapper;
-//    @Resource
-//    private TimeTypeMapper timeTypeMapper;
-//    @Resource
-//    private UserMapper userMapper;
-//    @Resource
-//    private DepartmentMapper departmentMapper;
-//    @Resource
-//    private ReportMapper reportMapper;
-//    @Resource
-//    private WxCorpInfoService wxCorpInfoService;
-//    @Resource
-//    private WxCorpInfoMapper wxCorpInfoMapper;
-//    @Value(value = "${upload.path}")
-//    private String path;
-//    @Resource
-//    private ProjectMapper projectMapper;
-//    @Resource
-//    private CompanyDingdingService companyDingdingService;
-//
-//    //检查项目到期,距离到期时间3天内的,每天提醒
-//    @Scheduled(cron = "0 0 10 ? * *")
-//    private void projectDeadlineAlert() {
-//        LocalDate start = LocalDate.now();
-//        start = start.plusDays(1);
-//        LocalDate end = LocalDate.now();
-//        end = end.plusDays(3);
-//        //获取未来3天内超期的项目
-//        List<Project> list = projectMapper.selectList(new QueryWrapper<Project>().eq("status", 1).between("plan_end_date", start, end));
-//        System.out.println("即将超期项目=="+list.size());
-//
-//        for (Project p : list) {
-//
-//            Period period = Period.between(start, p.getPlanEndDate());
-//            int days = period.getDays();
-//            List<Map<String, Object>> userList = userMapper.getProjectPushUserList(p.getId());
-//            userList.forEach(u->{
-//                if (u.get("corpwxUserid") != null) {
-//                    //TODO: 推送到企业微信
-////                    String corpUid = (String) u.get("corpwxUserid");
-////                    wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, "请及时填写今日的工作报告哦");
-//                } else {
-//                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-//                }
-//            });
-//        }
-//    }
-//
-//    //每天7点同步昨天的企业微信考勤考勤打卡记录
-//    @Scheduled(cron = "0 0 7 ? * *")
-//    private void synCorpWXCardTime() {
-//        LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
-//        yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
-//
-//        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
-//        for (TimeType type : typeList) {
-//            Integer companyId = type.getCompanyId();
-//            wxCorpInfoService.getUserCheckInDayData(companyId, null, yestoday, yestoday);
-//        }
-//    }
-//
-//    //每周日晚上11点 同步一次本月的考勤打卡记录
-//    @Scheduled(cron = "0 0 23 ? * 7")
-//    private void weeklySyncCorpWXCardTime() {
-//        LocalDateTime current = LocalDateTime.now();
-//        LocalDateTime start = current.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-//        LocalDateTime now = LocalDateTime.now();
-//        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-//        System.out.println("每周同步,开始同步本月的考勤记录="+start+" 至 "+end);
-//        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
-//        for (TimeType type : typeList) {
-//            Integer companyId = type.getCompanyId();
-//            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
-//        }
-//    }
-//
-//    //每个月6号早上6点同步上个月的企业微信考勤考勤打卡记录
-//    @Scheduled(cron = "0 0 6 6 * ?")
-//    private void synMonthCorpWXCardTime() {
-//        LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
-//        LocalDateTime start = lastMonth.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-//        LocalDateTime now = LocalDateTime.now().withDayOfMonth(1);
-//        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-//        System.out.println("开始同步上个月的考勤记录");
-//        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
-//        for (TimeType type : typeList) {
-//            Integer companyId = type.getCompanyId();
-//            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
-//        }
-//    }
-//
-//    //发送上周填写的工时统计
-//    @Scheduled(cron = "0 0 8 ? * *")
-//    private void lastWeekFillTimeAlert() {
-//        //每日检查是否是周一,提醒上周工时汇总
-//        LocalDate curDay = LocalDate.now();
-//        if (curDay.getDayOfWeek().getValue() == 1) {
-//            List<User> allUser = userMapper.selectList(new QueryWrapper<User>().isNotNull("wx_openid"));
-//            for (User u : allUser) {
-//                //取上周
-//                LocalDate lastWeek = curDay.minusWeeks(1);
-//
-//                int weekDay = lastWeek.getDayOfWeek().getValue();
-//                LocalDate monday = lastWeek.minusDays(weekDay-1);
-//                LocalDate sunday = monday.plusDays(6);
-//                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", u.getId()).between("create_date", monday, sunday));
-//                List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
-//                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
-//                String collect = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(","));
-//                //计算总工时
-//                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
-//                double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
-//                double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
-//                double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
-//                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + sum+"小时。其中审核通过"+pass
-//                        +"小时, 待审核"+waiting+"小时,驳回"+reject+"小时。";
-//                pushLastWeekReportFill(u, str);
-//            }
-//        }
-//    }
-//
-//    //每分钟校验是否有需要提醒的填报
-//    @Scheduled(fixedRate = 60 * 1000)
-//    private void process() {
-//        LocalDateTime now = LocalDateTime.now();
-//        LocalDate localDate = LocalDate.now();
-//
-//        //判断是否是工作日,非工作日不提醒
-//        if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
-//            return;
-//        }
-//        DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");
-//        String str = dt.format(now);
-//        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
-//                .ge("alert_time", str));
-//
-//        typeList.forEach(t->{
-//            if (str.equals(t.getAlertTime())) {
-//                //发送推送提醒
-//                List<Map<String, Object>> userList = userMapper.getPushUserList(t.getCompanyId());
-//                List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
-//                userList.forEach(u->{
-//                    if (u.get("corpwxUserid") != null) {
-//                        //推送到企业微信
-//                        String corpUid = (String) u.get("corpwxUserid");
-//                        wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, t.getAlertMsg());
-//                    } else if (u.get("wxOpenid") != null) {
-//                        push(u, t.getAlertMsg());
-//                    }
-//                });
-//            }
-//        });
-//
-//        List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
-//        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
-//
-//        //钉钉平台的用批量发送, 每分钟5000个
-//        int minuteSize = 5000;
-//        int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);
-//        for (int m = 0; m < minuteTimes; m++) {
-//            int startIndex = m*minuteSize;
-//            int endIndex = (m+1)*minuteSize;
-//            if (endIndex > dingdingUserList.size()) {
-//                endIndex = dingdingUserList.size();
-//            }
-//            final List<Map<String, Object>> curUserList = dingdingUserList.subList(startIndex, endIndex);
-//            final int curm = m;
-//            //调用新的线程发送
-//            new Thread(() -> {
-//                if (curm > 0) {
-//                    try {
-//                        //每间隔60秒发送一次
-//                        System.out.println("开始间隔了60秒===");
-//                        Thread.currentThread().sleep(60000);
-//                    } catch (InterruptedException e) {
-//                        e.printStackTrace();
-//                    }
-//                }
-//                System.out.println("发送钉钉漏填提醒:" + LocalDateTime.now().toString() + ", size=" + curUserList.size());
-//                //按照company组装,同一个company批量发送,最大不超过1000
-//                Integer companyId = null;
-//                Long agentId = null;
-//                String alertMsg = null;
-//                List<String> dingUid = new ArrayList<>();
-//                int count = 0;
-//                for (int i=0;i<curUserList.size(); i++) {
-//                    count++;
-//                    Map<String, Object> item = curUserList.get(i);
-//                    Integer curCompanyId = (Integer)item.get("companyId");
-//                    dingUid.add((String)item.get("dingdingUserid"));
-//                    if (companyId == null) {
-//                        companyId = curCompanyId;
-//                        agentId = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId)).getAgentId();
-//                        alertMsg = timeTypeMapper.selectById(companyId).getAlertMsg();
-//                    }
-//
-//                    if (i == curUserList.size() -1 || curCompanyId.intValue() != (int)curUserList.get(i+1).get("companyId")
-//                                || count == 1000) {
-//                        String idStr = dingUid.stream().collect(Collectors.joining(","));
-//                        System.out.println("发送给==="+idStr);
-//                        companyDingdingService.sendFillReportAlertMsg(companyId, agentId, alertMsg, idStr);
-//                        count = 0;
-//                        companyId = null;
-//                        dingUid.clear();
-//                    }
-//                }
-//            }).start();
-//        }
-//    }
-//    //推送项目即将逾期通知
-//    public void pushProjectNotify(String wxOpenid, String projectName, int days, String endDate) {
-//        //1,配置
-//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-//        wxStorage.setAppId(appId);
-//        wxStorage.setSecret(appSecret);
-//        WxMpService wxMpService = new WxMpServiceImpl();
-//        wxMpService.setWxMpConfigStorage(wxStorage);
-//
-//        //2,推送消息
-//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-//                .toUser(wxOpenid)//要推送的用户openid
-//                .templateId(TEMPLATE_PROJECT_DEADLINE)//模版id
-//                .build();
-//        //3,如果是正式版发送模版消息,这里需要配置你的信息
-//        templateMessage.addData(new WxMpTemplateData("first", "项目还有"+days+"天到期", "#FF00FF"));
-//        templateMessage.addData(new WxMpTemplateData("keyword1", projectName, "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("keyword2", endDate, "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("remark", "如有您参与的任务,请按时完成,谢谢", "#000000"));
-//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-//        try {
-//            System.out.println("======推送消息===");
-//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-//        } catch (Exception e) {
-//            System.out.println("推送失败:" + e.getMessage());
-//            e.printStackTrace();
-//        }
-//    }
-//
-//    //推送日报未填消息
-//    public void push(Map<String, Object> user, String alertMsg) {
-//        //1,配置
-//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-//        wxStorage.setAppId(appId);
-//        wxStorage.setSecret(appSecret);
-//        WxMpService wxMpService = new WxMpServiceImpl();
-//        wxMpService.setWxMpConfigStorage(wxStorage);
-//
-//        //2,推送消息
-//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-//                .toUser((String)user.get("wxOpenid"))//要推送的用户openid
-//                .templateId(TEMPLATE_REPORT_FILL)//模版id
-//                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
-//                .build();
-//        //3,如果是正式版发送模版消息,这里需要配置你的信息
-//        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-//        templateMessage.addData(new WxMpTemplateData("keyword1", (String)user.get("name"), "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("keyword2", (String)user.get("departmentName"), "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("remark", "请尽快填报", "#000000"));
-//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-//        try {
-//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-//        } catch (Exception e) {
-//            System.out.println("推送失败:" + e.getMessage());
-//            e.printStackTrace();
-//        }
-//
-//    }
-//
-//
-//    //推送上周填写的日报工时情况
-//    public void pushLastWeekReportFill(User user, String alertMsg) {
-//        //1,配置
-//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-//        wxStorage.setAppId(appId);
-//        wxStorage.setSecret(appSecret);
-//        WxMpService wxMpService = new WxMpServiceImpl();
-//        wxMpService.setWxMpConfigStorage(wxStorage);
-//
-//        //2,推送消息
-//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-//                .toUser(user.getWxOpenid())//要推送的用户openid
-//                .templateId(TEMPLATE_REPORT_FILL)//模版id
-//                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
-//                .build();
-//        //3,如果是正式版发送模版消息,这里需要配置你的信息
-//        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-//        templateMessage.addData(new WxMpTemplateData("keyword1", user.getName(), "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("keyword2", user.getDepartmentName(), "#000000"));
-//        templateMessage.addData(new WxMpTemplateData("remark", "-", "#000000"));
-//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-//        try {
-//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-//        } catch (Exception e) {
-//            System.out.println("推送失败:" + e.getMessage());
-//            e.printStackTrace();
-//        }
-//
-//    }
-//}
+package com.management.platform.task;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.*;
+import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Author: 吴涛涛
+ * Date : 2019 - 12 - 31 16:04
+ * Description:<描述>
+ * Version: 1.0
+ */
+@EnableScheduling
+@Component
+public class TimingTask {
+
+    @Value("${wx.template_report_fill}")
+    public String TEMPLATE_REPORT_FILL;
+    @Value("${wx.template_project_deadline}")
+    public String TEMPLATE_PROJECT_DEADLINE;
+    @Value("${wx.app_id}")
+    public String appId;
+    @Value("${wx.app_secret}")
+    public String appSecret;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private ScreenshotMapper screenshotMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Value(value = "${upload.path}")
+    private String path;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+
+    //检查项目到期,距离到期时间3天内的,每天提醒
+    @Scheduled(cron = "0 0 10 ? * *")
+    private void projectDeadlineAlert() {
+        LocalDate start = LocalDate.now();
+        start = start.plusDays(1);
+        LocalDate end = LocalDate.now();
+        end = end.plusDays(3);
+        //获取未来3天内超期的项目
+        List<Project> list = projectMapper.selectList(new QueryWrapper<Project>().eq("status", 1).between("plan_end_date", start, end));
+        System.out.println("即将超期项目=="+list.size());
+
+        for (Project p : list) {
+
+            Period period = Period.between(start, p.getPlanEndDate());
+            int days = period.getDays();
+            List<Map<String, Object>> userList = userMapper.getProjectPushUserList(p.getId());
+            userList.forEach(u->{
+                if (u.get("corpwxUserid") != null) {
+                    //TODO: 推送到企业微信
+//                    String corpUid = (String) u.get("corpwxUserid");
+//                    wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, "请及时填写今日的工作报告哦");
+                } else {
+                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                }
+            });
+        }
+    }
+
+    //每天7点同步昨天的企业微信考勤考勤打卡记录
+    @Scheduled(cron = "0 0 7 ? * *")
+    private void synCorpWXCardTime() {
+        LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
+        yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
+
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, yestoday, yestoday);
+        }
+    }
+
+    //每周日晚上11点 同步一次本月的考勤打卡记录
+    @Scheduled(cron = "0 0 23 ? * 7")
+    private void weeklySyncCorpWXCardTime() {
+        LocalDateTime current = LocalDateTime.now();
+        LocalDateTime start = current.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        System.out.println("每周同步,开始同步本月的考勤记录="+start+" 至 "+end);
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
+        }
+    }
+
+    //每个月6号早上6点同步上个月的企业微信考勤考勤打卡记录
+    @Scheduled(cron = "0 0 6 6 * ?")
+    private void synMonthCorpWXCardTime() {
+        LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
+        LocalDateTime start = lastMonth.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        LocalDateTime now = LocalDateTime.now().withDayOfMonth(1);
+        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        System.out.println("开始同步上个月的考勤记录");
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
+        }
+    }
+
+    //发送上周填写的工时统计
+    @Scheduled(cron = "0 0 8 ? * *")
+    private void lastWeekFillTimeAlert() {
+        //每日检查是否是周一,提醒上周工时汇总
+        LocalDate curDay = LocalDate.now();
+        if (curDay.getDayOfWeek().getValue() == 1) {
+            List<User> allUser = userMapper.selectList(new QueryWrapper<User>().isNotNull("wx_openid"));
+            for (User u : allUser) {
+                //取上周
+                LocalDate lastWeek = curDay.minusWeeks(1);
+
+                int weekDay = lastWeek.getDayOfWeek().getValue();
+                LocalDate monday = lastWeek.minusDays(weekDay-1);
+                LocalDate sunday = monday.plusDays(6);
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", u.getId()).between("create_date", monday, sunday));
+                List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
+                String collect = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(","));
+                //计算总工时
+                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
+                double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
+                double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
+                double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
+                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + sum+"小时。其中审核通过"+pass
+                        +"小时, 待审核"+waiting+"小时,驳回"+reject+"小时。";
+                pushLastWeekReportFill(u, str);
+            }
+        }
+    }
+
+    //每分钟校验是否有需要提醒的填报
+    @Scheduled(fixedRate = 60 * 1000)
+    private void process() {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDate localDate = LocalDate.now();
+
+        //判断是否是工作日,非工作日不提醒
+        if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
+            return;
+        }
+        DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");
+        String str = dt.format(now);
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
+                .ge("alert_time", str));
+
+        typeList.forEach(t->{
+            if (str.equals(t.getAlertTime())) {
+                //发送推送提醒
+                List<Map<String, Object>> userList = userMapper.getPushUserList(t.getCompanyId());
+                List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
+                userList.forEach(u->{
+                    if (u.get("corpwxUserid") != null) {
+                        //推送到企业微信
+                        String corpUid = (String) u.get("corpwxUserid");
+                        wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, t.getAlertMsg());
+                    } else if (u.get("wxOpenid") != null) {
+                        push(u, t.getAlertMsg());
+                    }
+                });
+            }
+        });
+
+        List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
+        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
+
+        //钉钉平台的用批量发送, 每分钟5000个
+        int minuteSize = 5000;
+        int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);
+        for (int m = 0; m < minuteTimes; m++) {
+            int startIndex = m*minuteSize;
+            int endIndex = (m+1)*minuteSize;
+            if (endIndex > dingdingUserList.size()) {
+                endIndex = dingdingUserList.size();
+            }
+            final List<Map<String, Object>> curUserList = dingdingUserList.subList(startIndex, endIndex);
+            final int curm = m;
+            //调用新的线程发送
+            new Thread(() -> {
+                if (curm > 0) {
+                    try {
+                        //每间隔60秒发送一次
+                        System.out.println("开始间隔了60秒===");
+                        Thread.currentThread().sleep(60000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                System.out.println("发送钉钉漏填提醒:" + LocalDateTime.now().toString() + ", size=" + curUserList.size());
+                //按照company组装,同一个company批量发送,最大不超过1000
+                Integer companyId = null;
+                Long agentId = null;
+                String alertMsg = null;
+                List<String> dingUid = new ArrayList<>();
+                int count = 0;
+                for (int i=0;i<curUserList.size(); i++) {
+                    count++;
+                    Map<String, Object> item = curUserList.get(i);
+                    Integer curCompanyId = (Integer)item.get("companyId");
+                    dingUid.add((String)item.get("dingdingUserid"));
+                    if (companyId == null) {
+                        companyId = curCompanyId;
+                        agentId = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId)).getAgentId();
+                        alertMsg = timeTypeMapper.selectById(companyId).getAlertMsg();
+                    }
+
+                    if (i == curUserList.size() -1 || curCompanyId.intValue() != (int)curUserList.get(i+1).get("companyId")
+                                || count == 1000) {
+                        String idStr = dingUid.stream().collect(Collectors.joining(","));
+                        System.out.println("发送给==="+idStr);
+                        companyDingdingService.sendFillReportAlertMsg(companyId, agentId, alertMsg, idStr);
+                        count = 0;
+                        companyId = null;
+                        dingUid.clear();
+                    }
+                }
+            }).start();
+        }
+    }
+    //推送项目即将逾期通知
+    public void pushProjectNotify(String wxOpenid, String projectName, int days, String endDate) {
+        //1,配置
+        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+        wxStorage.setAppId(appId);
+        wxStorage.setSecret(appSecret);
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxStorage);
+
+        //2,推送消息
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(wxOpenid)//要推送的用户openid
+                .templateId(TEMPLATE_PROJECT_DEADLINE)//模版id
+                .build();
+        //3,如果是正式版发送模版消息,这里需要配置你的信息
+        templateMessage.addData(new WxMpTemplateData("first", "项目还有"+days+"天到期", "#FF00FF"));
+        templateMessage.addData(new WxMpTemplateData("keyword1", projectName, "#000000"));
+        templateMessage.addData(new WxMpTemplateData("keyword2", endDate, "#000000"));
+        templateMessage.addData(new WxMpTemplateData("remark", "如有您参与的任务,请按时完成,谢谢", "#000000"));
+        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+        try {
+            System.out.println("======推送消息===");
+            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        } catch (Exception e) {
+            System.out.println("推送失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    //推送日报未填消息
+    public void push(Map<String, Object> user, String alertMsg) {
+        //1,配置
+        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+        wxStorage.setAppId(appId);
+        wxStorage.setSecret(appSecret);
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxStorage);
+
+        //2,推送消息
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser((String)user.get("wxOpenid"))//要推送的用户openid
+                .templateId(TEMPLATE_REPORT_FILL)//模版id
+                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
+                .build();
+        //3,如果是正式版发送模版消息,这里需要配置你的信息
+        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
+        templateMessage.addData(new WxMpTemplateData("keyword1", (String)user.get("name"), "#000000"));
+        templateMessage.addData(new WxMpTemplateData("keyword2", (String)user.get("departmentName"), "#000000"));
+        templateMessage.addData(new WxMpTemplateData("remark", "请尽快填报", "#000000"));
+        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+        try {
+            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        } catch (Exception e) {
+            System.out.println("推送失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+
+    //推送上周填写的日报工时情况
+    public void pushLastWeekReportFill(User user, String alertMsg) {
+        //1,配置
+        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+        wxStorage.setAppId(appId);
+        wxStorage.setSecret(appSecret);
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxStorage);
+
+        //2,推送消息
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(user.getWxOpenid())//要推送的用户openid
+                .templateId(TEMPLATE_REPORT_FILL)//模版id
+                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
+                .build();
+        //3,如果是正式版发送模版消息,这里需要配置你的信息
+        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
+        templateMessage.addData(new WxMpTemplateData("keyword1", user.getName(), "#000000"));
+        templateMessage.addData(new WxMpTemplateData("keyword2", user.getDepartmentName(), "#000000"));
+        templateMessage.addData(new WxMpTemplateData("remark", "-", "#000000"));
+        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+        try {
+            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        } catch (Exception e) {
+            System.out.println("推送失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+}

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml

@@ -9,8 +9,8 @@ spring:
     multipart:
       # 配置上传文件的大小设置
       # Single file max size  即单个文件大小
-      max-file-size: 10000MB
-      max-request-size: 10000MB
+      max-file-size: 100MB
+      max-request-size: 100MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -9,8 +9,8 @@ spring:
     multipart:
       # 配置上传文件的大小设置
       # Single file max size  即单个文件大小
-      max-file-size: 10000MB
-      max-request-size: 10000MB
+      max-file-size: 100MB
+      max-request-size: 100MB
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver

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

@@ -21,6 +21,7 @@
         <result column="package_etimecard" property="packageEtimecard" />
         <result column="package_finance" property="packageFinance" />
         <result column="sync_corpwx_time" property="syncCorpwxTime" />
+        <result column="finance_audit" property="financeAudit" />
     </resultMap>
     <resultMap id="BaseResultMap1" type="com.management.platform.entity.vo.SysRichFunction">
         <id column="id" property="id" />
@@ -33,7 +34,7 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, icon, code, module_id, seq, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, package_finance, sync_corpwx_time
+        id, name, icon, code, module_id, seq, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, package_finance, sync_corpwx_time, finance_audit
     </sql>
     <select id="getRoleFunctions" resultMap="BaseResultMap1" >
         select sys_function.id, sys_function.name, sys_function.icon, sys_function.code, sys_function.module_id, sys_function.seq, sys_module.name as module_name

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

@@ -22,11 +22,12 @@
         <result column="package_etimecard" property="packageEtimecard" />
         <result column="report_workflow" property="reportWorkflow" />
         <result column="package_finance" property="packageFinance" />
+        <result column="need_dept_audit" property="needDeptAudit" />
     </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
+        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
     </sql>
 
 </mapper>

二进制
fhKeeper/formulahousekeeper/management-platform/员工项目分摊比例导入模板.xlsx


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -121,7 +121,7 @@ router.beforeEach((to, from, next) => {
                         filterRouter = filterRouter.filter(r=>{return r.name != '导入日报审核'});
                     }
                     if (user.timeType.customDataActive == 0) {
-                        //没有开启导入日报审核,则不需要
+                        //没有开启自定义数值统计
                         filterRouter = filterRouter.filter(r=>{return r.name != '自定义数值统计'});
                     } else {
                         var customMenu = filterRouter.filter(r=>{return r.name == '自定义数值统计'});

+ 6 - 3
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -32,7 +32,8 @@ const StringUtil = {
         financialProportion: false, // 分摊比例设置 // 
         financialUpload: false, // 薪资数据上传 // 
         financialExport: false, // 薪资数据导出 // 
-        financialShare: false, // 导出分摊数据 // 
+        financialShare: false, // 导出分摊数据 //
+        setFinanceAuditor: false, //设置财务审核人
 
         // 项目报表服务 // 
         reportTask : false, // 项目任务报表 //
@@ -59,12 +60,13 @@ const StringUtil = {
         projectReportReview: false, // 审核全员日报 //
 
         // 导入日报审核
-        importAudit: false, // 导入日报记录 //
+        importAudit: false, // 查看导审记录 //
         
     }
     for(var i in arr) {
         arr[i] == '导入工时' ? obj.importReport = true : ''
-        arr[i] == '导入日报审核记录' ? obj.importAudit = true : ''
+        arr[i] == '查看导审记录' ? obj.importAudit = true : ''
+        arr[i] == '删除全公司日报' ? obj.reportsDeleteAll = true : ''
         arr[i] == '新增项目' ? obj.projectNew = true : ''
         arr[i] == '查看全部项目' ? obj.projectView = true : ''
         arr[i] == '管理全部项目' ? obj.projectManagement = true : ''
@@ -104,6 +106,7 @@ const StringUtil = {
         arr[i] == '费用审核' ? obj.costAudit = true : ''
         arr[i] == '查看全部报销单' ? obj.costAll = true : ''
         arr[i] == '审核全员日报' ? obj.projectReportReview = true : ''
+        arr[i] == '设置财务审核人' ? obj.setFinanceAuditor = true : ''
     }
 
     return obj

+ 16 - 15
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -24,10 +24,9 @@
           <el-submenu index="2">
             <template slot="title">
               <i class="iconfont firerock-iconbaoxiaodan"></i>
-              <!-- <span>{{user.role == 0?"我的报销凭证":"报销凭证列表"}}</span> -->
-              <span>{{"报销凭证列表"}}</span>
+              <span>{{permissions.costAll?"报销凭证列表":"我的报销凭证"}}</span>
             </template>
-            <el-menu-item index="2-1" v-if="permissions.costAll"><p @click="bills(false)" >单据列表</p></el-menu-item>
+            <el-menu-item index="2-1" ><p @click="bills(false)" >单据列表</p></el-menu-item>
             <el-menu-item index="2-2" v-if="permissions.costAudit"><p @click="bills(true)">单据审核</p></el-menu-item>
           </el-submenu>
             <!-- <el-menu-item index="3" @select="bills" @click="bills(false)" v-if="user.role == 0">
@@ -57,7 +56,7 @@
             <!-- 报销人 -->
             <el-form-item label="报销人" prop="ownerId">
               <!--普通员工只能自己填报自己的 -->
-              <el-select v-model="addForm.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="!permissions.costFil" filterable="true">
+              <el-select v-model="addForm.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
@@ -86,14 +85,14 @@
             <el-form-item label="备注" style="display: block; width: 70%; float: left;">
               <el-input type="textarea" v-model="addForm.remark"></el-input>
             </el-form-item>
-            <!-- 总成本 -->
-            <!-- <div style="float: left; line-height: 55px;margin-left:20px">总成本 <el-link disabled v-model="addForm.totalAmount">{{addForm.totalAmount}}</el-link> 元</div> -->
+            <!-- 总费用 -->
+            <!-- <div style="float: left; line-height: 55px;margin-left:20px">总费用 <el-link disabled v-model="addForm.totalAmount">{{addForm.totalAmount}}</el-link> 元</div> -->
           </el-form>
         </div>
         <!-- 按钮 -->
         <div class="pu_button">
-          <span v-if="this.addForm.totalAmount <= 0" style="color:#606266;">总成本 {{this.addForm.totalAmount}} 元</span>
-          <span v-else style="color:#606266;">总成本 ¥{{this.addForm.totalAmount | numberToCurrency}} 元</span>
+          <span v-if="this.addForm.totalAmount <= 0" style="color:#606266;">总费用 {{this.addForm.totalAmount}} 元</span>
+          <span v-else style="color:#606266;">总费用 ¥{{this.addForm.totalAmount | numberToCurrency}} 元</span>
           <span class="pu_bu_x" style="margin-left:10px;" @click="addxz"> <i class="el-icon-circle-plus-outline"></i> 新增发票</span>
         </div>
 
@@ -188,7 +187,7 @@
           <el-form label-width="70px" inline >
             <!-- 报销人 -->
             <el-form-item label="报销人">
-              <el-select v-model="ownerId" size="small" clearable placeholder="选择报销人" style="width: 120px" :disabled="!permissions.costFil" filterable="true">
+              <el-select v-model="ownerId" size="small" clearable placeholder="选择报销人" style="width: 120px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
@@ -228,7 +227,11 @@
         <!--列表-->
           <el-table ref="tab" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" :summary-method="getSummaries" show-summary>
               <el-table-column prop="code" label="票据编号"></el-table-column>
-              <el-table-column prop="totalAmount" label="金额(元)" ></el-table-column>
+              <el-table-column prop="totalAmount" label="金额(元)" align="center">
+                <template slot-scope="scope" >
+                  <span style="float:right;margin-right:20px">{{scope.row.totalAmount.toFixed(2)}}</span>
+                </template>
+              </el-table-column>
               <el-table-column prop="ownerName" label="报销人" ></el-table-column>
               <el-table-column prop="createDate" label="填报日期" ></el-table-column>
               <el-table-column prop="ticketNum" label="发票张数" ></el-table-column>
@@ -310,7 +313,7 @@
             <el-form-item label="备注" style="width: 280px">
               <el-input v-model="ParticularsList.remark" :disabled="flg"></el-input>
             </el-form-item>
-            <el-form-item label="总成本">
+            <el-form-item label="总费用">
               ¥{{ParticularsList.totalAmount | numberToCurrency}}&nbsp;&nbsp;元
             </el-form-item>
 
@@ -679,7 +682,7 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.users = res.data.records;
-                if (!this.permissions.costFil) {
+                if (!this.permissions.costAudit) {
                     this.addForm.ownerId = this.user.id;
                     this.addForm.status = 1;
                 }
@@ -951,9 +954,7 @@ export default {
       this.addForm.type = index
       this.ins = index;
       this.expenseTypeList = this.allExpList.filter(a=>a.mainType == this.ins);
-      if (!this.permissions.costFil) {
-         this.addForm.ownerId = this.user.id;
-      }
+      this.addForm.ownerId = this.user.id;
       
       this.getNextCode();
     },

+ 4 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -27,10 +27,10 @@
             <el-menu-item index="2-1" ><p @click="bills(false, 2)" v-if="permissions.leaveAll">全部</p></el-menu-item>
             <el-menu-item index="2-2" ><p @click="bills(true, 1)" v-if="permissions.leaveAudit">待审核</p></el-menu-item>
           </el-submenu>
-            <!-- <el-menu-item index="3" @select="bills" @click="bills(false, 2)" v-if="user.role == 0">
+            <el-menu-item index="3" @select="bills" @click="bills(false, 2)" v-if="!permissions.leaveAll">
               <i class="iconfont firerock-iconbaoxiaodan"></i>
-              <span slot="title">{{user.role == 0?"我的请假单":"请假单列表"}}</span>
-            </el-menu-item> -->
+              <span slot="title">我的请假单</span>
+            </el-menu-item>
             <el-menu-item index="4" v-if="permissions.leaveStatistical">
               <template slot="title">
                 <i class="iconfont firerock-icontianbao"></i>
@@ -140,7 +140,7 @@
         <div class="ctons">
           <div class="flex">
             <div>
-              <el-select v-model="ownerIds" placeholder="请选择请假人" clearable @change="chufas()" style="width: 180px" size="small" :disabled="!permissions.leaveFil" filterable="true">
+              <el-select v-model="ownerIds" placeholder="请选择请假人" clearable @change="chufas()" style="width: 180px" size="small" :disabled="!permissions.leaveAll" filterable="true">
                   <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
@@ -153,7 +153,6 @@
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
-              
             </div>
             <div>
               <span style="color: #606266">请假状态</span>

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

@@ -34,7 +34,7 @@
             <el-form-item style="float:right;" v-if="permissions.financialCustom">
                 <el-link type="primary" :underline="false" @click="showItemDialog">自定义薪资项</el-link>
             </el-form-item>
-            <el-form-item style="float:right;" v-if="user.timeType.financeAudit == '1'">
+            <el-form-item style="float:right;" v-if="user.timeType.financeAudit == '1' && permissions.setFinanceAuditor">
                 <el-link type="primary" :underline="false" @click="reviewerVisible = true">设置审核人</el-link>
             </el-form-item>
             

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

@@ -149,7 +149,7 @@
                     {{scope.row.progress==null?"-":scope.row.progress}}%
                 </template>
             </el-table-column>
-            <el-table-column label="操作" width="390"  align="left">
+            <el-table-column label="操作" width="320"  align="center">
                 <template slot-scope="scope">
                     <el-button v-if="permissions.projectManagement || user.id==scope.row.creatorId" size="mini"  @click="subProject(scope.row)">子项目</el-button>
                     <el-button size="mini" v-if="permissions.projectManagement || user.id==scope.row.inchargerId || user.id==scope.row.creatorId" type="primary" @click="handleAdd(scope.$index, scope.row)">编辑</el-button>
@@ -163,7 +163,7 @@
                     </el-dropdown>
                     <!-- <el-button v-if="permissions.projectManagement && scope.row.status == 1" size="mini"  @click="cancelPro(scope.row)">撤销</el-button>
                     <el-button v-if="permissions.projectManagement && scope.row.status == 1" size="mini"  @click="finishPro(scope.row)">完成</el-button> -->
-                    <el-button v-if="permissions.projectManagement && scope.row.status >= 2" size="mini"  @click="restartPro(scope.row)">重启</el-button>
+                    <el-button v-if="(permissions.projectManagement || user.id==scope.row.inchargerId || user.id==scope.row.creatorId) && scope.row.status >= 2" size="mini"  @click="restartPro(scope.row)">重启</el-button>
                 </template>
             </el-table-column>
         </el-table>
@@ -196,7 +196,7 @@
                     <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input>
                 </el-form-item>
                 <el-form-item label="项目类型" prop="isPublic">
-                    <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic">
+                    <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="!permissions.projectManagement && addForm.creatorId != user.id">
                         <el-option :value="0" label="普通项目"></el-option>
                         <el-option :value="1" label="公共项目"></el-option>
                     </el-select>
@@ -225,8 +225,7 @@
                 <el-form-item label="全部参与者" v-show="addForm.isPublic == 0">
                     <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
                 </el-form-item>
-                <el-form-item label="负责人" >
-                    <el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 ||  permissions.projectManagement) && addForm.isPublic == 0" filterable placeholder="请选择负责人" style="width:32%;" >
+                <el-form-item label="负责人" ><el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 && addForm.isPublic == 0) || (!permissions.projectManagement && user.id != addForm.creatorId)" filterable placeholder="请选择负责人" style="width:32%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
@@ -1688,7 +1687,8 @@ a {
                         notifyUserNames:'',
                         chosenLeaders:[],
                         taskGpIncharge: 0,
-                        category:null
+                        category:null,
+                        creatorId: this.user.id
                     }
                     this.projectBaseCostData = [];
                     this.auseList = [];

+ 19 - 20
fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue

@@ -2,7 +2,7 @@
   <div>
       <!-- 表头 -->
       <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-          <el-form :inline="true">
+          <el-form :inline="true" style="width: 81%">
               <el-form-item label="角色权限">
               </el-form-item>
               <el-form-item >
@@ -12,7 +12,7 @@
                   </el-input>
                   </div>
               </el-form-item>
-              <el-form-item>
+              <el-form-item style="float: right">
                   <el-link type="primary" :underline="false" @click="handleAdd('添加角色', '立即添加')">添加角色</el-link>
                   <el-link type="primary" :underline="false" @click="modify()" style="margin-left: 20px;">修改默认角色</el-link>
               </el-form-item>
@@ -29,9 +29,9 @@
         <el-table-column prop="date" label="操作">
             <template slot-scope="scope">
                 <div>
-                    <el-button type="primary" size="small" @click="handleAdd('编辑角色', '立即修改', scope.row)">编辑角色</el-button>
-                    <el-button type="primary" size="small" @click="shisha(scope.row.id), roleName = scope.row.rolename">分配权限</el-button>
-                    <el-button type="danger" size="small" @click="deteHand(scope.row)">删除</el-button>
+                    <el-button size="small" @click="handleAdd('编辑角色', '立即修改', scope.row)" v-if="scope.row.rolename != '超级管理员'">编辑角色</el-button>
+                    <el-button type="primary" size="small" @click="shisha(scope.row.id), roleName = scope.row.rolename" v-if="scope.row.rolename !='超级管理员' || (scope.row.rolename =='超级管理员' && user.roleName == '超级管理员')">分配权限</el-button>
+                    <el-button type="danger" size="small" @click="deteHand(scope.row)" v-if="scope.row.rolename != '超级管理员'">删除</el-button>
                 </div>
             </template>
         </el-table-column>
@@ -67,7 +67,7 @@
                         <el-checkbox :label="mainMenu.name" name="type" v-model="mainMenu.checked" style="font-weight:bold;width: 160px" @change="mainChange(mainMenu)"></el-checkbox>
                         <span v-if="mainMenu.functionList && mainMenu.functionList.length > 0" style="margin-right:10px;margin-left:10px;">
                           <!-- <div></div>(功能:  <el-checkbox v-for="fun in mainMenu.functionList" :key="fun.id" :label="fun.name" name="type" v-model="fun.checked" @change="subChanges(fun, mainMenu.id)"></el-checkbox>) -->
-                          <span class="gongn"><el-checkbox v-for="fun in mainMenu.functionList" :key="fun.id" :label="fun.name" name="type" v-model="fun.checked" style="width: 130px"></el-checkbox></span>
+                          <span class="gongn"><el-checkbox v-for="fun in mainMenu.functionList" :key="fun.id" :label="fun.name" name="type" v-model="fun.checked" style="width: 130px" @change="subChanges(fun, mainMenu.id)"></el-checkbox></span>
                         </span>
                       </span>
                       <ul v-if="mainMenu.children && mainMenu.useState">
@@ -83,7 +83,7 @@
                 </el-form>
             </div>
             <span slot="footer" class="dialog-footer">
-              <el-button type="primary" size="small" @click="saveList()">保存</el-button>
+              <el-button type="primary" @click="saveList()">保存</el-button>
             </span>
         </el-dialog>
         <!-- 添加角色弹窗 -->
@@ -111,7 +111,7 @@
                       <el-option v-for="item in auseList" :key="item.id" :label="item.rolename" :value="item.id"></el-option>
                   </el-select>
                 </el-form-item>
-                <div class="daoru"><el-link type="info">导入人员时的默认角色</el-link></div>
+                <div class="daoru"><span type="info" style="color:#999">*设置导入人员时的默认角色</span></div>
               </el-form>
             </div>
             <span slot="footer" class="dialog-footer">
@@ -372,11 +372,11 @@ export default {
                 f.checked = mainMenu.checked;
             });
         });
-        // if(mainMenu.functionList) {
-        //   mainMenu.functionList.forEach(c=>{
-        //     c.checked = mainMenu.checked;
-        //   })
-        // }
+        if(mainMenu.functionList) {
+          mainMenu.functionList.forEach(c=>{
+            c.checked = mainMenu.checked;
+          })
+        }
       },
       subChange(subMenu) {
         //二级选中,自动勾选对应的一级
@@ -396,11 +396,6 @@ export default {
             m.checked = hasChecked;
           }
         });
-
-        //子功能全部勾上,取消
-        subMenu.functionList.forEach(f=>{
-          f.checked = subMenu.checked;
-        })
       },
       subChanges(subMenu, id) {
         let mainMenuList = this.moduleList
@@ -413,8 +408,12 @@ export default {
                     hasChecked = true;
                 }
             })
-            //当前点击的子菜单所有同级菜单是否有点中的,如果没有需要把父级取消勾选
-            m.checked = hasChecked;
+            console.log(hasChecked, '事件')
+            // m.checked = hasChecked;
+            if(hasChecked) {
+              console.log('执行')
+              m.checked = hasChecked;
+            }
           }
         });
       },

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

@@ -137,7 +137,7 @@
                 </el-table-column>
                 <el-table-column label="操作" width="330">
                     <template slot-scope="scope">
-                        <el-button size="mini" type="default" v-if="scope.row.roleName == '超级管理员'" @click="transferRole(scope.row)">转让</el-button>
+                        <el-button size="mini" type="default" v-if="scope.row.roleName == '超级管理员' && user.id == scope.row.id" @click="transferRole(scope.row)">转让</el-button>
                         <el-button size="mini" type="default" v-if="scope.row.roleName != '超级管理员'" @click="resetPwd(scope.row)">重置</el-button>
                         <el-button size="mini" type="primary" v-if="scope.row.roleName != '超级管理员'" @click="openInsertDialog(scope.$index)">编辑</el-button>
                         <el-button size="mini" type="primary" v-if="scope.row.roleName == '超级管理员'" @click="openInsertDialog1(scope.$index)">编辑</el-button>
@@ -229,7 +229,7 @@
             </span>
         </el-dialog>
 
-        <!-- 新增单个人员的Dialog -->
+        <!-- 新增/编辑人员的Dialog -->
         <el-dialog :title="title" :visible.sync="dialogVisible" width="550px" >
             <el-form ref="form1" :model="insertForm" :rules="rules" label-width="80px">
                 <el-form-item label="名字" prop="name">
@@ -259,7 +259,7 @@
                     <!-- <el-cascader v-model="insertForm.departmentId" placeholder="请选择部门" style="width: 100%"
                     :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader> -->
                     <el-cascader v-model="insertForm.departmentId" placeholder="请选择部门" style="width: 100%"
-                    :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
+                    :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false"  clearable></el-cascader>
                 </el-form-item>
                 <el-form-item label="角色" prop="roleId">
                     <el-select v-model="insertForm.roleId" placeholder="请选择角色" style="width: 100%">
@@ -275,26 +275,25 @@
                 <el-button type="primary" @click="submitInsert" :loading="submitLoading">提交</el-button>
             </span>
         </el-dialog>
-
-        <el-dialog title="修改成本" :visible.sync="dialogVisible1" width="550px" >
-
+        <!-- 编辑超级管理员的Dialog -->
+        <el-dialog title="编辑人员" :visible.sync="dialogVisible1" width="550px" >
             <el-form ref="form1" :model="insertForm" :rules="rules" label-width="80px">
                 <el-form-item label="名字" prop="name">
                     <el-input v-model="insertForm.name" placeholder="请输入姓名" clearable></el-input>
                 </el-form-item>
 
-                <el-form-item label="薪酬方式" prop="salaryType">
+                <el-form-item label="薪酬方式" prop="salaryType" v-if="permissions.structurePersonnel">
                     <el-radio-group v-model="insertForm.salaryType" @change="onSalaryTypeChange">
                     <el-radio  :label="0" >固定月成本</el-radio>
                     <el-radio  :label="1">计时工资</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0">
+                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0 && permissions.structurePersonnel" >
                     <el-input v-model="insertForm.monthCost" id="monthCost" @input="oninput" @keyup.native="restrictNumber('monthCost')" placeholder="请输入月成本,单位:元" clearable></el-input>
                     <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时预估时薪</span>
                     <el-link :underline="false" style="color:blue;font-size:12px;margin-left:7px;" href="#/timetype">修改工作时长</el-link>
                 </el-form-item>
-                <el-form-item label="时薪" prop="cost">
+                <el-form-item label="时薪" prop="cost" v-if="permissions.structurePersonnel">
                     <el-input v-model="insertForm.cost" id="cost" :disabled="insertForm.salaryType == 0" @keyup.native="restrictNumber('cost')" style="width:120px;"
                      placeholder="请输入成本 单位:元/小时" clearable></el-input>
                     <span style="margin-left:25px;">生效日期</span>
@@ -305,7 +304,7 @@
                     placeholder="请选择部门" 
                     style="width: 100%"
                     :options="option" 
-                    :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" 
+                    :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" 
                     clearable></el-cascader>
                 </el-form-item>
             </el-form>
@@ -1249,7 +1248,7 @@
                     id: list1.id,
                     name: list1.name,
                     phone: list1.phone,
-                    role: list1.role,
+                    roleId: list1.roleId,
                     monthCost:list1.monthCost,
                     cost: list1.cost,
                     departmentId: array1.reverse(),
@@ -1268,7 +1267,6 @@
                             id: this.insertForm.id,
                             name: this.insertForm.name,
                             phone: this.insertForm.phone,
-                            // role: this.insertForm.role,
                             roleId: this.insertForm.roleId,
                             monthCost: this.insertForm.monthCost,
                             cost: this.insertForm.cost

+ 3 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -115,7 +115,7 @@
                             </span>
                             <div class="checkbtn" style="padding-right:20px;">
                                 <el-button v-if="item1.state >= 2 && user.id == item1.id" type="primary" size="small" @click="isSubstitude=false; fillInReport(index1,0)">编辑日报</el-button>
-                                <el-button v-if="(permissions.reportsDeleteAll || user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button>
+                                <el-button v-if="permissions.reportsDeleteAll && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button>
                             </div>
                             <div class="one_daily_body">
                                 <el-timeline>
@@ -147,7 +147,7 @@
                                                 <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == -1">[ 导入待审核 ]</span>
                                                 <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == -1">[ 待专业审核 ]</span>
                                                 <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">[ 待部门审核 ]</span>
-                                                <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ 待项目经理审核 ]</span>
+                                                <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ 待项目审核人<span v-if="item2.projectAuditorName != null">({{item2.projectAuditorName}})</span>审核 ]</span>
                                                 <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ 已通过 ]</span>
                                                 <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">[ 已驳回 ] 原因:{{item2.rejectReason}}</span>
                                                 <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 待提交 ]</span>
@@ -4486,14 +4486,13 @@
             color: #20a0ff;
         }
     }
-
     .one_daily {
         i {
             color: #9ed0ff;
             margin-right: 5px;
         }
         .one_daily_body {
-            padding: 15px 0px;
+            padding: 10px 0px;
             p {
             margin: 0;
             line-height: 30px;

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

@@ -139,7 +139,7 @@
                     <span v-else-if="scope.row.state == 2" style="color:#FF0000;">已驳回</span>
                 </template>
             </el-table-column>
-            <el-table-column label="操作" width="220" v-if="permissions.projectReportReview">
+            <el-table-column label="操作" width="220">
                 <template slot-scope="scope">
                     <el-button v-if="scope.row.state == 0" type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">通过</el-button>
                     <el-button v-if="scope.row.state == 0" type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.dateStr, scope.row)">驳回</el-button>

+ 0 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue

@@ -290,10 +290,8 @@
             
             //获取项目列表
             getProjectList() {
-                this.listLoading = true;
                 this.http.post( this.port.project.list, {},
                 res => {
-                    this.listLoading = false;
                     if (res.code == "ok") {
                         this.projectList = res.data;
                     } else {
@@ -304,7 +302,6 @@
                     }
                 },
                 error => {
-                    this.listLoading = false;
                     this.$message({
                         message: error,
                         type: "error"

+ 0 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue

@@ -294,10 +294,8 @@
             
             //获取项目列表
             getProjectList() {
-                this.listLoading = true;
                 this.http.post( this.port.project.list, {},
                 res => {
-                    this.listLoading = false;
                     if (res.code == "ok") {
                         this.projectList = res.data;
                     } else {
@@ -308,7 +306,6 @@
                     }
                 },
                 error => {
-                    this.listLoading = false;
                     this.$message({
                         message: error,
                         type: "error"

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

@@ -7,7 +7,7 @@
                 <van-list v-model="loading" :finished="finished" finished-text="没有更多了" :error.sync="error" error-text="请求失败,点击重新加载" @load="getProject">
                     <van-swipe-cell v-for="(item,index) in list" :key="index">
                         <van-cell :border="false" :title="item.projectName" :value="item.projectCode"/>
-                        <template slot="right" v-if="projectManagement">
+                        <template slot="right" v-if="projectManagement || item.creatorId == user.id">
                             <van-button square type="info" text="编辑" @click="openDialog(index)"/>
                             <van-button square type="danger" text="删除" @click="delPro(index)"/>
                         </template>

+ 17 - 5
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

@@ -190,15 +190,21 @@
                         ids +=(element.id+',');
                     }
                 });
+                let that = this;
                 this.$axios.post("/report/approve", {id: id , date: this.nowTime, reportIds: ids})
                 .then(res => {
                     if(res.code == "ok") {
                         toast.clear();
-                        this.$toast.success('审核成功');
+                        setTimeout(function() {
+                            that.$toast.success('审核成功');
+                        }, 300);
+                        
                         this.getReport();
                     } else {
                         toast.clear();
-                        this.$toast.fail('审核失败');
+                        setTimeout(function() {
+                            that.$toast.fail('审核失败');
+                        }, 300);
                     }
                 }).catch(err=> {toast.clear();});
             },
@@ -222,17 +228,23 @@
                     forbidClick: true,
                     duration: 0
                 });
-                
+                let that = this;
                 this.$axios.post("/report/deny", this.denyForm)
                 .then(res => {
                     if(res.code == "ok") {
                         toast.clear();
-                        this.$toast.success(this.denyForm.i==0?'驳回成功':'撤销成功');
+                        setTimeout(function() {
+                            that.$toast.success(that.denyForm.i==0?'驳回成功':'撤销成功');
+                        }, 300);
+                        
                         this.getReport();
                         this.denyReasonDialog = false;
                     } else {
                         toast.clear();
-                        this.$toast.fail(this.denyForm.i==0?'驳回失败':'撤销失败');
+                        setTimeout(function() {
+                            that.$toast.fail(that.denyForm.i==0?'驳回失败':'撤销失败');
+                        }, 300);
+                        
                     }
                 }).catch(err=> {toast.clear();});
             }