Browse Source

多个执行人,日报导出功能完善

seyason 3 years ago
parent
commit
41826fb0a3
25 changed files with 925 additions and 46 deletions
  1. 128 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java
  2. 47 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DirtyCleanController.java
  3. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GtemplateTaskController.java
  4. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskExecutorController.java
  5. 93 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowSetting.java
  6. 102 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/GtemplateTask.java
  7. 82 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskExecutor.java
  8. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/AuditWorkflowSettingMapper.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/GtemplateTaskMapper.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskExecutorMapper.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/AuditWorkflowSettingService.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/GtemplateTaskService.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskExecutorService.java
  14. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowSettingServiceImpl.java
  15. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GtemplateTaskServiceImpl.java
  16. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskExecutorServiceImpl.java
  17. 25 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/AuditWorkflowSettingMapper.xml
  18. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/GtemplateTaskMapper.xml
  19. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskExecutorMapper.xml
  20. 52 0
      fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板 (2).xls
  21. BIN
      fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板.xls
  22. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  23. 73 21
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  24. 48 11
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  25. 33 14
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 128 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java

@@ -0,0 +1,128 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.entity.Department;
+import com.management.platform.entity.Report;
+import com.management.platform.mapper.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+@RestController
+@RequestMapping("/audit-workflow-setting")
+public class AuditWorkflowSettingController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    ReportMapper reportMapper;
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(String json, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        auditWorkflowSettingMapper.delete(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId));
+        JSONArray array = JSONArray.parseArray(json);
+
+        if (array.size() == 1 && array.getJSONObject(0).getInteger("auditorType") == 0) {
+            //只有一个项目负责人审核,不保存
+        } else {
+            //检查是否有重复的部门
+            List<Integer> auditDeptIds = new ArrayList<>();
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+                if (auditWorkflowTimeSetting.getAuditDeptId() != null) {
+                    if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("保存失败: 部门["+auditWorkflowTimeSetting.getAuditDeptName()+"]存在重复");
+                        return msg;
+                    } else {
+                        auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+                    }
+                }
+            }
+
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+                auditWorkflowTimeSetting.setCompanyId(companyId);
+                auditWorkflowTimeSetting.setSeq(i+1);
+                if (i == array.size() -1) {
+                    auditWorkflowTimeSetting.setIsFinal(1);
+                } else {
+                    auditWorkflowTimeSetting.setIsFinal(0);
+                }
+                auditWorkflowTimeSetting.setDeptId(deptId);
+                auditWorkflowSettingMapper.insert(auditWorkflowTimeSetting);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/checkNodeInUse")
+    public HttpRespMsg checkNodeInUse(String auditDeptId, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<AuditWorkflowSetting> targetNode = auditWorkflowSettingMapper.selectList(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).eq("audit_dept_id", auditDeptId));
+        if (targetNode.size() > 0) {
+            //要删除的部门节点是存在的,需要检测是否有待审核的走到这个流程点了
+            long num = reportMapper.selectCount(new QueryWrapper<Report>().eq("state", 0).eq("is_dept_audit", 1).eq("audit_deptid", auditDeptId));
+            if (num > 0) {
+                msg.setError("当前部门存在待审核报告,无法操作!");
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        List<AuditWorkflowSetting> auditWorkflowTimeSettings = auditWorkflowSettingMapper.selectList(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).orderByAsc("seq"));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (auditWorkflowTimeSettings.size() == 0) {
+            int seq = 1;
+            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+            Department dept = departmentMapper.selectById(deptId);
+            AuditWorkflowSetting setting = new AuditWorkflowSetting();
+            setting.setSeq(seq);
+            setting.setCompanyId(companyId);
+            setting.setDeptId(dept.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setAuditorType(0);
+            auditWorkflowTimeSettings.add(setting);
+        }
+        msg.data = auditWorkflowTimeSettings;
+        return msg;
+    }
+
+}
+

+ 47 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DirtyCleanController.java

@@ -0,0 +1,47 @@
+package com.management.platform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Report;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ReportService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/clean")
+public class DirtyCleanController {
+    @Resource
+    private ReportService reportService;
+    @Resource
+    private ReportMapper reportMapper;
+
+
+
+    @RequestMapping("/removeDuplicate")
+    public HttpRespMsg removeDuplicate(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String, Object>> list = reportMapper.getDuplicate(companyId);
+        System.out.println("共=="+list.size()+"条重复记录");
+        List<Integer> reportIds = new ArrayList<>();
+        for(int i=0;i<list.size(); i++) {
+            Map map = list.get(i);
+            String ids = (String)map.get("reportIds");
+            reportIds.addAll(ListUtil.convertIntegerIdsArrayToList(ids));
+        }
+        System.out.println(reportIds);
+        System.out.println("日报记录report ="+reportIds.size());
+//        QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().in("id", reportIds).eq("company_id", companyId);
+//        reportMapper.delete(queryWrapper);
+//        List<Report> rList = reportMapper.selectList();
+//        System.out.println("去查找的日报数量="+rList.size());
+
+        return msg;
+    }
+}

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GtemplateTaskController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@RestController
+@RequestMapping("/gtemplate-task")
+public class GtemplateTaskController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskExecutorController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@RestController
+@RequestMapping("/task-executor")
+public class TaskExecutorController {
+
+}
+

+ 93 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowSetting.java

@@ -0,0 +1,93 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AuditWorkflowSetting extends Model<AuditWorkflowSetting> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 要设置的部门id,针对部门设置流程
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
+    /**
+     * 指定该节点的审核人员
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 指定该节点的审核姓名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 顺序
+     */
+    @TableField("seq")
+    private Integer seq;
+
+    /**
+     * 审核部门的id
+     */
+    @TableField("audit_dept_id")
+    private Integer auditDeptId;
+
+    /**
+     * 审核部门的名称
+     */
+    @TableField("audit_dept_name")
+    private String auditDeptName;
+
+    /**
+     * 1-部门审核,0-项目负责人审核,2-指定人员审核
+     */
+    @TableField("auditor_type")
+    private Integer auditorType;
+
+    /**
+     * 是否是最终审核
+     */
+    @TableField("is_final")
+    private Integer isFinal;
+
+    /**
+     * 类型:1-请假,2-出差,3-物资采购
+     */
+    @TableField("type")
+    private Integer type;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 102 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/GtemplateTask.java

@@ -0,0 +1,102 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+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.time.LocalDate;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.apache.poi.ss.formula.functions.T;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class GtemplateTask extends Model<GtemplateTask> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 任务内容
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 任务级别,0-一般 1-重要 2-紧急
+     */
+    @TableField("task_level")
+    private Integer taskLevel;
+
+    /**
+     * 当前阶段id
+     */
+    @TableField("tstages_id")
+    private Integer tstagesId;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 排序位置
+     */
+    @TableField("seq")
+    private Integer seq;
+
+    /**
+     * 0-任务,1-里程碑,2-风险
+     */
+    @TableField("task_type")
+    private Integer taskType;
+
+    /**
+     * 模板id
+     */
+    @TableField("gtemplate_id")
+    private Integer gtemplateId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+
+    public static GtemplateTask fromTask(Task task) {
+        GtemplateTask item = new GtemplateTask();
+        item.setCompanyId(task.getCompanyId());
+        item.setName(task.getName());
+        item.setSeq(task.getSeq());
+        item.setTaskLevel(task.getTaskLevel());
+        item.setTaskType(task.getTaskType());
+        return item;
+    }
+
+    public Task toTask() {
+        Task task = new Task();
+        task.setName(name);
+        task.setTaskLevel(taskLevel);
+        task.setTaskType(taskType);
+        task.setCompanyId(companyId);
+        task.setSeq(seq);
+        task.setCreateDate(LocalDate.now());
+        return task;
+    }
+}

+ 82 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskExecutor.java

@@ -0,0 +1,82 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TaskExecutor extends Model<TaskExecutor> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("task_id")
+    private Integer taskId;
+
+    /**
+     * 执行人id
+     */
+    @TableField("executor_id")
+    private String executorId;
+
+    /**
+     * 执行人姓名
+     */
+    @TableField("executor_name")
+    private String executorName;
+
+    /**
+     * 头像颜色
+     */
+    @TableField("executor_color")
+    private String executorColor;
+
+    /**
+     * 计划工时
+     */
+    @TableField("plan_hours")
+    private Integer planHours;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    public static TaskExecutor fromTask(Task task) {
+        TaskExecutor executor = new TaskExecutor();
+        executor.setTaskId(task.getId());
+        executor.setProjectId(task.getProjectId());
+        executor.setPlanHours(task.getPlanHours());
+        executor.setExecutorId(task.getExecutorId());
+        executor.setExecutorName(task.getExecutorName());
+        executor.setExecutorColor(task.getExecutorColor());
+        return executor;
+    }
+
+    public static void fromTask(Task task, TaskExecutor executor) {
+        executor.setExecutorId(task.getExecutorId());
+        executor.setExecutorName(task.getExecutorName());
+        executor.setExecutorColor(task.getExecutorColor());
+    }
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/AuditWorkflowSettingMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+public interface AuditWorkflowSettingMapper extends BaseMapper<AuditWorkflowSetting> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/GtemplateTaskMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.GtemplateTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+public interface GtemplateTaskMapper extends BaseMapper<GtemplateTask> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskExecutorMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.TaskExecutor;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+public interface TaskExecutorMapper extends BaseMapper<TaskExecutor> {
+
+}

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

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

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

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

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

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

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.mapper.AuditWorkflowSettingMapper;
+import com.management.platform.service.AuditWorkflowSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+@Service
+public class AuditWorkflowSettingServiceImpl extends ServiceImpl<AuditWorkflowSettingMapper, AuditWorkflowSetting> implements AuditWorkflowSettingService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.GtemplateTask;
+import com.management.platform.mapper.GtemplateTaskMapper;
+import com.management.platform.service.GtemplateTaskService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@Service
+public class GtemplateTaskServiceImpl extends ServiceImpl<GtemplateTaskMapper, GtemplateTask> implements GtemplateTaskService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.TaskExecutor;
+import com.management.platform.mapper.TaskExecutorMapper;
+import com.management.platform.service.TaskExecutorService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@Service
+public class TaskExecutorServiceImpl extends ServiceImpl<TaskExecutorMapper, TaskExecutor> implements TaskExecutorService {
+
+}

+ 25 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/AuditWorkflowSettingMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.AuditWorkflowSettingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.AuditWorkflowSetting">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="dept_id" property="deptId" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="seq" property="seq" />
+        <result column="audit_dept_id" property="auditDeptId" />
+        <result column="audit_dept_name" property="auditDeptName" />
+        <result column="auditor_type" property="auditorType" />
+        <result column="is_final" property="isFinal" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, dept_id, user_id, user_name, seq, audit_dept_id, audit_dept_name, auditor_type, is_final, type
+    </sql>
+
+</mapper>

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/GtemplateTaskMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.GtemplateTaskMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.GtemplateTask">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="task_level" property="taskLevel" />
+        <result column="tstages_id" property="tstagesId" />
+        <result column="company_id" property="companyId" />
+        <result column="seq" property="seq" />
+        <result column="task_type" property="taskType" />
+        <result column="gtemplate_id" property="gtemplateId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, task_level, tstages_id, company_id, seq, task_type, gtemplate_id
+    </sql>
+
+</mapper>

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskExecutorMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.TaskExecutorMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.TaskExecutor">
+        <id column="id" property="id" />
+        <result column="task_id" property="taskId" />
+        <result column="executor_id" property="executorId" />
+        <result column="executor_name" property="executorName" />
+        <result column="executor_color" property="executorColor" />
+        <result column="plan_hours" property="planHours" />
+        <result column="project_id" property="projectId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, task_id, executor_id, executor_name, executor_color, plan_hours, project_id
+    </sql>
+
+</mapper>

File diff suppressed because it is too large
+ 52 - 0
fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板 (2).xls


BIN
fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板.xls


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

@@ -709,6 +709,7 @@ import { error } from 'dingtalk-jsapi';
             downloadByA(row) {
                 const a = document.createElement('a'); // 创建a标签
                 a.setAttribute('download', row.name);// download属性
+                console.log(row.url);
                 a.setAttribute('href', row.url);// href链接
                 a.click();// 自执行点击事件
                 a.remove();

+ 73 - 21
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -147,13 +147,15 @@
                                                 <el-tooltip class="item" effect="dark" :content="element.name" placement="top">
                                                 <label class="task_name" :style="'background:'+(element.taskStatus==0?'#ffffff;':'#eFeFeF;')"><span>{{element.name}}</span></label>
                                                 </el-tooltip>
-                                                <span v-if="element.executorName != null" :style="'background:'+element.executorColor" class="user_name_icon">{{element.executorName.length>2?element.executorName.substring(element.executorName.length-2, element.executorName.length):element.executorName}}</span>
-                                                <el-button v-if="element.executorName == null" type="primary" @click.stop.native="addAsMyTask(element)" size="mini" style="float:right;width:38px;padding:5px;position: absolute;z-index: 5;right: 5px;">认领</el-button>
-                                            </div>
+                                                <i :class="taskTypeIcon[element.taskType]" :style="'float:right;color:'+taskTypeColor[element.taskType]+';margin-right:8px;margin-top:8px;'" ></i>
+                                                </div>
                                             <div style="margin: 10px 0px;color:#666;" @click="timess(element.endDate)">
                                                 <span v-if="element.endDate >= times || element.taskStatus == 1"><i v-if="element.endDate != null" class="el-icon-date">&nbsp;&nbsp;{{element.endDate}}</i></span>
                                                 <span v-else><em v-if="element.endDate != null" style="display: inline-block;padding:3px 5px"><i v-if="element.endDate != null" class="el-icon-date"><span  class="element_span"> &nbsp;&nbsp;{{element.endDate}} 截止</span></i></em></span>
-                                                <i :class="taskTypeIcon[element.taskType]" :style="'float:right;color:'+taskTypeColor[element.taskType]+';margin-right:8px;'" ></i>
+                                                <span v-if="element.executorName">
+                                                <span v-for="(exeItem, exeIndex) in element.executorName.split(',')" :key="exeIndex" :style="'background:'+element.executorColor.split(',')[exeIndex]" class="user_name_icon">{{exeItem.length>2?exeItem.substring(exeItem.length-2, exeItem.length):exeItem}}</span>
+                                                </span>
+                                                <el-button v-if="!element.executorName" type="primary" @click.stop.native="addAsMyTask(element)" size="mini" style="float:right;width:38px;padding:5px;position: absolute;z-index: 5;right: 5px;">认领</el-button>
                                             </div>
                                             <!--子任务 -->
                                             <div v-if="element.subTaskList.length > 0">
@@ -265,22 +267,26 @@
                     <el-input v-model="addForm.name" :maxlength="40" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" placeholder="请输入任务内容" clearable></el-input>
                 </el-form-item>
                 
-                <el-form-item label="执行人">
-                    <el-select v-model="addForm.executorId" filterable placeholder="请选择执行人" style="width:100%;" >
-                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
-                </el-form-item>
+                
                 <el-form-item label="开始时间" prop="startDate">
                     <el-date-picker v-model="addForm.startDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
                     placeholder="请选择日期" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id"></el-date-picker>
-                    <span style="margin-left:30px;margin-right:10px;">计划工时</span>
-                    <el-input-number :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" v-model="addForm.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
-                </el-form-item>
-                <el-form-item label="截止时间" prop="endDate">
-                    <el-date-picker v-model="addForm.endDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
+                    <span style="margin-left:30px;margin-right:10px;">截止时间</span>
+                    <el-date-picker v-model="addForm.endDate" type="date" value-format="yyyy-MM-dd"  
                     placeholder="请选择日期" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id"></el-date-picker>
+                    </el-form-item>
+                <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
+                <el-form-item :label="'执行人'+(index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
+                    <el-select v-model="executorItem.executorId" :disabled="addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id" size="small" filterable placeholder="请选择执行人" style="width:40%;" @change="$forceUpdate()">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                    <span style="margin-left:30px;margin-right:10px;">计划工时</span>
+                    <el-input-number size="small" :disabled="addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id" v-model="executorItem.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
+                    <!--移除执行人 -->
+                    <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
                 </el-form-item>
-                
+                <el-link type="primary" v-if="(addForm.executorListFront == null || addForm.executorListFront.length<10)&& (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id)" style="margin-left:35px;" @click="addExecutorLine">添加执行人</el-link>
+                </div>
                 <el-form-item label="优先级">
                     <el-select v-model="addForm.taskLevel" style="width:100%;" >
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
@@ -612,16 +618,16 @@
                     <el-form-item prop="name">
                         <el-input v-model="templateForm.name" placeholder="请输入模板名称" maxlength="12"
                             show-word-limit clearable></el-input>
-                            <!-- <div>
+                            <div>
                                 <span style="margin-right:20px">同时保存</span>
                                 <el-checkbox v-model="templateForm.saveTask" label="任务"></el-checkbox>
-                                <el-checkbox v-model="templateForm.saveRisk" label="风险"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveMileStone" label="里程碑"></el-checkbox>
-                            </div> -->
+                                <el-checkbox v-model="templateForm.saveRisk" label="风险"></el-checkbox>
+                            </div>
                     </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="createTemplate" style="width:100%;" >存为模板</el-button>
+                <el-button type="primary" @click="createTemplate" style="width:100%;" :loading="saveTemplateLoading">存为模板</el-button>
             </div>
         </el-dialog>
         
@@ -709,6 +715,7 @@
         
         data() {
             return {
+                saveTemplateLoading: false,
                 joinMembList:[],
                 setInchargerDialog: false,
                 recentProgressInfo:{},
@@ -789,7 +796,7 @@
                 },
                 sleectId: null,
                 sleectProjectId: null,
-                sidebarIndex: null, // 侧边栏索引
+                sidebarIndex: 0, // 侧边栏索引
                 url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                 count: 0,
                 textarea2: '',
@@ -896,8 +903,10 @@
             },
             //创建模板
             createTemplate() {
+                this.saveTemplateLoading = true;
                 this.http.post('/group-template/addTemplate', this.templateForm,
                     res => {
+                        this.saveTemplateLoading = false;
                         if (res.code == "ok") {
                             this.addToTmpDialog = false;
                             this.getGroupTemplate();
@@ -1297,6 +1306,7 @@
             addSubTask() {
                 this.addFormVisible = true;
                 this.addForm = {parentTname: this.addForm.name,parentTid: this.addForm.id,projectId: this.addForm.projectId, groupId: this.addForm.groupId,  taskLevel:0, planHours: 8, taskType: 0};
+                this.addForm.executorListFront = [{executorId:null, planHours:8}];
                 this.addLoading = false;
             },
             //认领任务
@@ -1518,6 +1528,9 @@
                         this.addForm.indate = null;
                         this.addLoading = false;
                         this.recentProgressInfo = this.addForm.progress;
+                        this.addForm.executorListFront = this.addForm.executorList;
+                        //删除中间传值的变量数组
+                        delete this.addForm.executorList;
                     } else {
                         this.$message({
                         message: res.msg,
@@ -1535,10 +1548,23 @@
             addTask(stage) {
                 this.addFormVisible = true;
                 this.addForm = {projectId: stage.projectId, groupId: stage.groupId, stagesId: stage.id, taskLevel:0, planHours: 8, taskType: 0};
+                this.addForm.executorListFront = [{executorId:null, planHours:8}];
+
                 this.addLoading = false;
                 this.title="创建任务";
                 this.commentList = [];
             },
+            addExecutorLine() {
+                if (this.addForm.executorListFront == null) {
+                    this.addForm.executorListFront = [];//初始化
+                }
+                this.addForm.executorListFront.push({executorId:null, planHours:8});
+                this.$forceUpdate();
+            },
+            removeExecutorLine(index) {
+                this.addForm.executorListFront.splice(index,1);
+                this.$forceUpdate();
+            },
             renameStage(item) {
                 this.stageForm = JSON.parse(JSON.stringify(item));
                 this.addStageDialog = true;
@@ -1692,7 +1718,6 @@
                 var param = JSON.parse(JSON.stringify(this.groupTemplateList.filter(g=>g.selected)[0]));
                 delete param.stagesList;
                 param.projectId = this.curProjectId;
-                // 
                 var k = this.groupTemplateList[this.sidebarIndex].name
                 var s = null;
                 var xmz = this.groupList.forEach(function(a, b, c){
@@ -1703,6 +1728,10 @@
                 })
                 if (s){ 
                     this.addGroupDialog = false;
+                    this.$message({
+                        message: '当前项目已存在分组['+k+'],请修改组名后重试。',
+                        type: "error"
+                        });
                     return 
                 }
                 // 
@@ -1971,12 +2000,35 @@
                     message: '图片太大,请重新上传',
                     type: 'warning'
                 });
+                //检查是有重名的执行人
+                var exeList = this.addForm.executorListFront;
+                for (var i=0;i<exeList.length;i++) {
+                    var findSameUser = false;
+                    for (var j=i+1;j<exeList.length; j++) {
+                        if (exeList[i].executorId && exeList[j].executorId && exeList[i].executorId == exeList[j].executorId) {
+                            findSameUser = true;
+                            break;
+                        }
+                    }
+                    if (findSameUser) {
+                        return this.$message({
+                            showClose: true,
+                            message: '执行人存在重复',
+                            type: 'error'
+                        });
+                    }
+                }
+
+                
                 this.$refs.form1.validate(valid => {
                     if (valid) {
                         delete this.addForm.subTaskList;
                         delete this.addForm.progress;
+                        this.addForm.executorListStr = JSON.stringify(this.addForm.executorListFront);
+                        this.addLoading = true;
                         this.http.post('/task/save',this.addForm,
                             res => {
+                                this.addLoading = false;
                                 if (res.code == "ok") {
                                     this.$message({
                                         message: "提交成功",

+ 48 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -58,7 +58,8 @@
                     </el-table-column>
                     <el-table-column prop="executorName" label="执行人" sortable width="130">
                         <template slot-scope="scope">
-                            <el-link type="primary" @click="showUser(scope.row.executorId)">{{scope.row.executorName}}</el-link>
+                            <!-- <el-link type="primary" @click="showUser(scope.row.executorId)">{{scope.row.executorName}}</el-link> -->
+                            <span>{{scope.row.executorName}}</span>
                         </template>
                     </el-table-column>
                     
@@ -186,20 +187,25 @@
                     <el-input v-model="addForm.name" :maxlength="40" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" placeholder="请输入任务内容" clearable></el-input>
                 </el-form-item>
                 
-                <el-form-item label="执行人">
-                    <el-select v-model="addForm.executorId" filterable placeholder="请选择执行人" style="width:100%;" >
-                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
-                </el-form-item>
                 <el-form-item label="开始时间" prop="startDate">
                     <el-date-picker v-model="addForm.startDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
                     placeholder="请选择日期" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id"></el-date-picker>
-                    <span style="margin-left:30px;margin-right:10px;">计划工时</span><el-input-number :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" v-model="addForm.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
-                </el-form-item>
-                <el-form-item label="截止时间" prop="endDate">
-                    <el-date-picker v-model="addForm.endDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
+                    <span style="margin-left:30px;margin-right:10px;">截止时间</span>
+                    <el-date-picker v-model="addForm.endDate" type="date" value-format="yyyy-MM-dd"  
                     placeholder="请选择日期" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id"></el-date-picker>
+                    </el-form-item>
+                <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
+                <el-form-item :label="'执行人'+(index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
+                    <el-select v-model="executorItem.executorId" :disabled="addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id" size="small" filterable placeholder="请选择执行人" style="width:40%;" @change="$forceUpdate()">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                    <span style="margin-left:30px;margin-right:10px;">计划工时</span>
+                    <el-input-number size="small" :disabled="addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id" v-model="executorItem.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
+                    <!--移除执行人 -->
+                    <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
                 </el-form-item>
+                <el-link type="primary" v-if="addForm.executorListFront.length<10&& (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id)" style="margin-left:35px;" @click="addExecutorLine">添加执行人</el-link>
+                </div>
                 
                 <el-form-item label="优先级">
                     <el-select v-model="addForm.taskLevel" style="width:100%;" >
@@ -1118,6 +1124,14 @@ import { error } from 'dingtalk-jsapi';
                 this.gain(task); // 获取评论列表
                 // this.getStageList()
             }, 
+            addExecutorLine() {
+                this.addForm.executorListFront.push({executorId:null, planHours:8});
+                this.$forceUpdate();
+            },
+            removeExecutorLine(index) {
+                this.addForm.executorListFront.splice(index,1);
+                this.$forceUpdate();
+            },
             getTaskDetail(id) {
                 this.http.post('/task/getTask',{id: id},
                 res => {
@@ -1127,7 +1141,10 @@ import { error } from 'dingtalk-jsapi';
                         this.addForm.indate = null;
                         this.addLoading = false;
                         this.recentProgressInfo = this.addForm.progress;
-                        // console.log(this.addForm, '看看数据')
+
+                        this.addForm.executorListFront = this.addForm.executorList;
+                        //删除中间传值的变量数组
+                        delete this.addForm.executorList;
                     } else {
                         this.$message({
                         message: res.msg,
@@ -1438,10 +1455,30 @@ import { error } from 'dingtalk-jsapi';
                     message: '图片太大,请重新上传',
                     type: 'warning'
                 });
+                //检查是有重名的执行人
+                var exeList = this.addForm.executorListFront;
+                for (var i=0;i<exeList.length;i++) {
+                    var findSameUser = false;
+                    for (var j=i+1;j<exeList.length; j++) {
+                        if (exeList[i].executorId && exeList[j].executorId && exeList[i].executorId == exeList[j].executorId) {
+                            findSameUser = true;
+                            break;
+                        }
+                    }
+                    if (findSameUser) {
+                        return this.$message({
+                            showClose: true,
+                            message: '执行人存在重复',
+                            type: 'error'
+                        });
+                    }
+                }
+
                 this.$refs.form1.validate(valid => {
                     if (valid) {
                         delete this.addForm.subTaskList;
                         delete this.addForm.progress;
+                        this.addForm.executorListStr = JSON.stringify(this.addForm.executorListFront);
                         this.http.post('/task/save',this.addForm,
                             res => {
                                 if (res.code == "ok") {

+ 33 - 14
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -609,7 +609,7 @@
             <div>
                 <div class="zhoFel" v-if="zhoBao.auditUserList != null && zhoBao.auditUserList.length > 0">
                     <p>审核人</p>
-                    <el-select v-model="zhoBao.projectAuditorId" placeholder="请选择" clearable="true" style="width: 355px">
+                    <el-select v-model="zhoBao.projectAuditorId" placeholder="请选择" style="width: 355px">
                         <el-option v-for="item in zhoBao.auditUserList" :key="item.id" :label="item.auditorName" :value="item.auditorId"></el-option>
                     </el-select>
                 </div>
@@ -669,7 +669,7 @@
         <el-dialog title="日报导出" v-if="exportDialog" :visible.sync="exportDialog" customClass="customWidth" width="500px">
             <el-form ref="form3" :model="exportParam" >
                 <el-form-item prop="projectId" label="选择项目">
-                    <el-select v-model="exportParam.projectId" placeholder="全部项目"  clearable style="width:350px;">
+                    <el-select v-model="exportParam.projectId" placeholder="全部项目"  clearable filterable style="width:350px;">
                         <el-option v-for="item in projectList"  :key="item.id" :label="item.projectName" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
@@ -737,7 +737,7 @@
     >
       <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
       <el-tabs v-model="activeName" @tab-click="handleClick">
-        <el-tab-pane label="已填工时情况" name="first">
+        <el-tab-pane label="工时填报情况" name="first">
           <div class="selectworktime_export" style="margin-top:10px;">
             <div class="selectworktime_export_l">
               <el-date-picker
@@ -765,7 +765,7 @@
             <el-link
               type="primary"
               style="float: right; margin-right: 60px; vertical-align: middle;height:32px"
-              @click="exportMembAlreadyWorkHours()"
+              @click="exportMembWorkHours()"
               >导出数据</el-link
             >
           </div>
@@ -784,6 +784,12 @@
             </el-table-column>
 
             <el-table-column width="105" prop="name" fixed="left" label="姓名">
+                <template slot-scope="scope">
+                    <span :style="scope.row.worktimeList.length==0?'color:red':''">{{scope.row.name}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="departmentName" fixed="left" label="部门">
+                
             </el-table-column>
             <el-table-column
               min-width="105"
@@ -1455,7 +1461,7 @@
                         this.importingData = false;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "导入成功:成功导入"+res.data+"条工时数据";
+                            this.importResultMsg = "导入成功:成功导入"+res.data+"条工时数据"+(res.msg?res.msg:"");
                             this.getReportList();
                             this.importWxDialog = false;
                         } else {
@@ -1493,7 +1499,7 @@
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "成功导入"+res.data+"条工时数据";
+                            this.importResultMsg = "成功导入"+res.data+"条工时数据"+(res.msg?res.msg:"");;
                             this.getReportList();
                             this.importWXDialog = false;
                         } else {
@@ -1700,8 +1706,8 @@
       }
     },
     //导出员工每日填报工时数
-    exportMembAlreadyWorkHours() {   
-      console.log("exportMembAlreadyWorkHours",this.WorktimeDatepickValue1);
+    exportMembWorkHours() {   
+      console.log("exportMembWorkHours",this.WorktimeDatepickValue1);
       this.http.post(
         "/report/exportUserDailyWorkTime",
         {
@@ -2184,7 +2190,7 @@
                 },
                 res => {
                     if (res.code == "ok") {
-                        domainItem.auditUserList = res.data
+                        domainItem.auditUserList = res.data;
                         if (res.data.length==1) {
                             domainItem.projectAuditorId = domainItem.auditUserList[0].auditorId;
                             domainItem.projectAuditorName = domainItem.auditUserList[0].auditorName;
@@ -3158,6 +3164,7 @@
                 sss.progress = item.progress
                 sss.time = item.time
                 sss.workingTime = item.workingTime
+                sss.projectAuditorId = item.projectAuditorId;
                 var that = this
                 setTimeout(() =>{
                     if(Object.keys(item).length < 5) {
@@ -3166,20 +3173,25 @@
                         sss.stage = that.workForm.domains[0].stage
                         sss.subProjectList = that.workForm.domains[0].subProjectList
                         sss.stages = that.workForm.domains[0].stages
-                        // sss.auditUserList = that.workForm.domains[0].auditUserList;
+                        sss.auditUserList = obj.auditUserList;
                     } else {
                         sss.subProjectId = item.subProjectId
                         sss.stage = item.stage
                         sss.subProjectList = item.subProjectList
                         sss.stages = item.stages
-                        // sss.auditUserList = item.auditUserList;
+                        sss.auditUserList = obj.auditUserList;
+                    }
+                    if (sss.auditUserList != null && sss.auditUserList.length==1) {
+                        //只有一个审核人,自动设置上去
+                        sss.projectAuditorId = sss.auditUserList[0].auditorId;
                     }
                     console.log(sss, '数据')
                     that.zhoBaoIdx = i
                     that.zhoBaoName = names
                     that.zhoBao = sss
                     that.zhis = row
-                },200);
+                    that.$forceUpdate();
+                },500);
                 // if(Object.keys(sss).length <= 4) {
                 //     sss.subProjectId = this.workForm.domains[0].subProjectId
                 //     sss.stage = this.workForm.domains[0].stage
@@ -3578,6 +3590,9 @@
                                     formData.append("professionProgress", "[]")
                                     zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                     formData.append("createDate",zhoD.zhoDataTime)
+                                    if (zhoD[j].projectAuditorId) {
+                                        formData.append("projectAuditorId",zhoD[j].projectAuditorId)
+                                    }
                                 }
                             }
                         }
@@ -3607,7 +3622,9 @@
                                         formData.append("professionProgress", "[]")
                                         zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                         formData.append("createDate",zhoD.zhoDataTime)
-
+                                        if (zhoD[j].projectAuditorId) {
+                                            formData.append("projectAuditorId",zhoD[j].projectAuditorId)
+                                        }
                                     }
                                 }
                             } else {
@@ -3640,7 +3657,9 @@
                                         formData.append("professionProgress", "[]")
                                         zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                         formData.append("createDate",zhoD.zhoDataTime)
-
+                                        if (zhoD[j].projectAuditorId) {
+                                            formData.append("projectAuditorId",zhoD[j].projectAuditorId)
+                                        }
                                     }
                                 }
                             }