Ver código fonte

修改工时成本统计导出
修改填报 针对依斯呗逻辑
分组耗用增加首次记录人天设置
企业微信 审批模板 接口对接 (同步服务商模板到企业 查询模板详情)

Min 1 ano atrás
pai
commit
741006b013
19 arquivos alterados com 400 adições e 125 exclusões
  1. 3 120
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  2. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  3. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpTemplateController.java
  4. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java
  5. 47 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/WxCorpTemplate.java
  6. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/WxCorpTemplateMapper.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java
  8. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpTemplateService.java
  10. 130 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  11. 23 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 67 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  13. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpTemplateServiceImpl.java
  14. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  15. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskGroupMapper.xml
  16. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/WxCorpTemplateMapper.xml
  17. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  18. 17 0
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue
  19. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -57,19 +57,7 @@ public class ProjectApprovalController {
     @Resource
     private ProjectApprovalCheckService projectApprovalCheckService;
     @Resource
-    private ProjectService projectService;
-    @Resource
-    private ProjectBasecostService projectBasecostService;
-    @Resource
-    private ProjectAuditorService projectAuditorService;
-    @Resource
-    private ParticipationService participationService;
-    @Resource
-    private SysFunctionService sysFunctionService;
-    @Resource
     private ProjectApprovalLogService projectApprovalLogService;
-    @Resource
-    private ReportService reportService;
 
     /**
      * 分页获取项目列表
@@ -158,6 +146,8 @@ public class ProjectApprovalController {
             }
             if(projectApprovalCheckList.size()>0){
                 projectApprovalCheckService.saveOrUpdateBatch(projectApprovalCheckList);
+                //更新审核人 发送到企业微信完成审核动作
+
             }
         }
         //新增操作记录数据
@@ -220,114 +210,7 @@ public class ProjectApprovalController {
     @RequestMapping("/check")
     @Transactional(rollbackFor = Exception.class)
     public HttpRespMsg check(Integer id,Integer checkType,Integer revokeType){
-        HttpRespMsg msg=new HttpRespMsg();
-        User user = userMapper.selectById(request.getHeader("token"));
-        ProjectApproval projectApproval = projectApprovalService.getById(id);
-        List<ProjectApprovalCheck> projectApprovalChecks = projectApprovalCheckService.list(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId, id));
-        Optional<ProjectApprovalCheck> first = projectApprovalChecks.stream().filter(p -> p.getUserId().equals(user.getId())&&p.getStatus()==0).findFirst();
-//        boolean hasAllPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "管理全部立项申请");
-//        boolean hasCheckPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "审核立项申请");
-        if(checkType!=3){
-            if(projectApprovalChecks.size()>0){
-                if(!first.isPresent()){
-                    msg.setError("审核人验证失败,请按照审核人顺序审核");
-                    return msg;
-                }
-            }
-        }
-        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
-        switch (checkType){
-            /*审核通过*/
-            case 1:
-                ProjectApprovalCheck projectApprovalCheck = first.get();
-                projectApprovalCheck.setStatus(1);
-                projectApprovalCheckService.updateById(projectApprovalCheck);
-                //检查剩余的数据
-                List<ProjectApprovalCheck> approvalChecks = projectApprovalChecks.stream().filter(p -> !p.getId().equals(first.get().getId())).collect(Collectors.toList());
-                boolean b = approvalChecks.stream().anyMatch(a -> a.getStatus() != 1);
-                if(!b){
-                    projectApproval.setStatus(1);
-                    projectApprovalService.updateById(projectApproval);
-                    //立项审核通过后创建项目数据
-                    Project project=new Project();
-                    BeanUtils.copyProperties(projectApproval,project);
-                    project.setId(null);
-                    project.setCreateDate(LocalDate.now());
-                    List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
-                    List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, id));
-                    List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, id));
-                    projectService.save(project);
-                    List<ProjectBasecost> projectBasecostList=new ArrayList<>();
-                    List<Participation> participationList=new ArrayList<>();
-                    List<ProjectAuditor> projectAuditorList=new ArrayList<>();
-                    projectApprovalBasecostList.forEach(p->{
-                        ProjectBasecost projectBasecost=new ProjectBasecost();
-                        BeanUtils.copyProperties(p,projectBasecost);
-                        projectBasecost.setId(null);
-                        projectBasecost.setProjectId(project.getId());
-                        projectBasecostList.add(projectBasecost);
-                    });
-                    participationApprovalList.forEach(p->{
-                        Participation participation=new Participation();
-                        BeanUtils.copyProperties(p,participation);
-                        participation.setId(null);
-                        participation.setProjectId(project.getId());
-                        participationList.add(participation);
-                    });
-                    projectApprovalAuditorList.forEach(p->{
-                        ProjectAuditor projectAuditor=new ProjectAuditor();
-                        BeanUtils.copyProperties(p,projectAuditor);
-                        projectAuditor.setId(null);
-                        projectAuditor.setProjectId(project.getId());
-                        projectAuditorList.add(projectAuditor);
-                    });
-                    projectBasecostService.saveBatch(projectBasecostList);
-                    participationService.saveBatch(participationList);
-                    projectAuditorService.saveBatch(projectAuditorList);
-                    //新增操作记录数据
-                    projectApprovalLog.setCreateTime(LocalDateTime.now());
-                    projectApprovalLog.setProjectApprovalId(projectApproval.getId());
-                    //通过
-                    projectApprovalLog.setType(2);
-                    projectApprovalLogService.save(projectApprovalLog);
-                }
-                break;
-            /*驳回*/
-            case 2:
-                projectApproval.setStatus(2);
-                projectApprovalService.updateById(projectApproval);
-                //新增操作记录数据
-                projectApprovalLog.setCreateTime(LocalDateTime.now());
-                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
-                //驳回
-                projectApprovalLog.setType(3);
-                projectApprovalLogService.save(projectApprovalLog);
-                break;
-            /*撤销*/
-            case 3:
-                Project project = projectService.getOne(new LambdaQueryWrapper<Project>().eq(Project::getApproveId,projectApproval.getId()));
-                if(project!=null){
-                    int count = reportService.count(new LambdaQueryWrapper<Report>().eq(Report::getProjectId, project.getId()));
-                    if(count>0){
-                        msg.setError("已存在填报数据无法撤销立项");
-                        return msg;
-                    }
-                    projectAuditorService.remove(new LambdaQueryWrapper<ProjectAuditor>().eq(ProjectAuditor::getProjectId,project.getId()));
-                    projectBasecostService.remove(new LambdaQueryWrapper<ProjectBasecost>().eq(ProjectBasecost::getProjectId,project.getId()));
-                    participationService.remove(new LambdaQueryWrapper<Participation>().eq(Participation::getProjectId,project.getId()));
-                    project.deleteById(project.getId());
-                }
-                projectApproval.setStatus(3);
-                projectApprovalService.updateById(projectApproval);
-                //新增操作记录数据
-                projectApprovalLog.setCreateTime(LocalDateTime.now());
-                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
-                //驳回
-                projectApprovalLog.setType(4);
-                projectApprovalLogService.save(projectApprovalLog);
-                break;
-        }
-        return msg;
+        return projectApprovalService.check(id,checkType,revokeType);
     }
 
     @RequestMapping("/importData")

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

@@ -201,8 +201,10 @@ public class TaskGroupController {
             item.setId(taskGroup.getId());
             if (taskGroup.getManDay() == null) {
                 item.setManDay(0.0);
+                item.setFirstManDay(0.0);
             } else {
                 item.setManDay(taskGroup.getManDay());
+                item.setFirstManDay(taskGroup.getManDay());
                 totalManDay += taskGroup.getManDay();
             }
             addList.add(item);

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpTemplateController.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 2024-03-25
+ */
+@RestController
+@RequestMapping("/wx-corp-template")
+public class WxCorpTemplateController {
+
+}
+

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java

@@ -76,6 +76,12 @@ public class TaskGroup extends Model<TaskGroup> {
     @TableField(exist = false)
     private String estimatedWorkTime;
 
+    /**
+     * 首次设置的预估工时:人天
+     */
+    @TableField("first_man_day")
+    private Double firstManDay;
+
 
     @Override
     protected Serializable pkVal() {

+ 47 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/WxCorpTemplate.java

@@ -0,0 +1,47 @@
+package com.management.platform.entity;
+
+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 2024-03-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class WxCorpTemplate extends Model<WxCorpTemplate> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("company_id")
+    private Integer companyId;
+
+    /**
+     * 审批模板id
+     */
+    @TableField("template_id")
+    private String templateId;
+
+    /**
+     * 0-立项审批
+     */
+    @TableField("type")
+    private Integer type;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

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

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

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java

@@ -23,4 +23,6 @@ public interface ProjectApprovalService extends IService<ProjectApproval> {
     HttpRespMsg importData(MultipartFile multipartFile);
 
     HttpRespMsg exportData(String keyword, Integer searchField, String statuses, Integer category, Integer viewId);
+
+    HttpRespMsg check(Integer id, Integer checkType, Integer revokeType);
 }

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

@@ -76,4 +76,8 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     List<Map<String, String>> getActiveInfoByUser(HttpServletRequest request) throws Exception;
 
     HttpRespMsg batchTransferLicense(HttpServletRequest request,String handoverId, String takeoverId) throws Exception;
+
+    public void copyTemplate(HttpServletRequest request,Integer templateType) throws Exception;
+
+    public String getTemplateDetail(HttpServletRequest request,String templateId,Integer templateType) throws Exception;
 }

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

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

+ 130 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java

@@ -16,6 +16,7 @@ import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -29,6 +30,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -69,11 +71,27 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     @Resource
     private ProjectApprovalAuditorMapper projectApprovalAuditorMapper;
     @Resource
+    private ProjectApprovalBasecostService projectApprovalBasecostService;
+    @Resource
     private ProjectApprovalAuditorService projectApprovalAuditorService;
     @Resource
     private ProjectMapper projectMapper;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private ProjectApprovalService projectApprovalService;
+    @Resource
+    private ProjectBasecostService projectBasecostService;
+    @Resource
+    private ProjectAuditorService projectAuditorService;
+    @Resource
+    private ParticipationService participationService;
+    @Resource
+    private ProjectApprovalLogService projectApprovalLogService;
+    @Resource
+    private ReportService reportService;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -654,4 +672,116 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         }
         return msg;
     }
+
+    @Override
+    public HttpRespMsg check(Integer id, Integer checkType, Integer revokeType) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        ProjectApproval projectApproval = getById(id);
+        List<ProjectApprovalCheck> projectApprovalChecks = projectApprovalCheckService.list(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId, id));
+        Optional<ProjectApprovalCheck> first = projectApprovalChecks.stream().filter(p -> p.getUserId().equals(user.getId())&&p.getStatus()==0).findFirst();
+//        boolean hasAllPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "管理全部立项申请");
+//        boolean hasCheckPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "审核立项申请");
+        if(checkType!=3){
+            if(projectApprovalChecks.size()>0){
+                if(!first.isPresent()){
+                    msg.setError("审核人验证失败,请按照审核人顺序审核");
+                    return msg;
+                }
+            }
+        }
+        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
+        switch (checkType){
+            /*审核通过*/
+            case 1:
+                ProjectApprovalCheck projectApprovalCheck = first.get();
+                projectApprovalCheck.setStatus(1);
+                projectApprovalCheckService.updateById(projectApprovalCheck);
+                //检查剩余的数据
+                List<ProjectApprovalCheck> approvalChecks = projectApprovalChecks.stream().filter(p -> !p.getId().equals(first.get().getId())).collect(Collectors.toList());
+                boolean b = approvalChecks.stream().anyMatch(a -> a.getStatus() != 1);
+                if(!b){
+                    projectApproval.setStatus(1);
+                    updateById(projectApproval);
+                    //立项审核通过后创建项目数据
+                    Project project=new Project();
+                    BeanUtils.copyProperties(projectApproval,project);
+                    project.setId(null);
+                    project.setCreateDate(LocalDate.now());
+                    List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
+                    List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, id));
+                    List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, id));
+                    projectService.save(project);
+                    List<ProjectBasecost> projectBasecostList=new ArrayList<>();
+                    List<Participation> participationList=new ArrayList<>();
+                    List<ProjectAuditor> projectAuditorList=new ArrayList<>();
+                    projectApprovalBasecostList.forEach(p->{
+                        ProjectBasecost projectBasecost=new ProjectBasecost();
+                        BeanUtils.copyProperties(p,projectBasecost);
+                        projectBasecost.setId(null);
+                        projectBasecost.setProjectId(project.getId());
+                        projectBasecostList.add(projectBasecost);
+                    });
+                    participationApprovalList.forEach(p->{
+                        Participation participation=new Participation();
+                        BeanUtils.copyProperties(p,participation);
+                        participation.setId(null);
+                        participation.setProjectId(project.getId());
+                        participationList.add(participation);
+                    });
+                    projectApprovalAuditorList.forEach(p->{
+                        ProjectAuditor projectAuditor=new ProjectAuditor();
+                        BeanUtils.copyProperties(p,projectAuditor);
+                        projectAuditor.setId(null);
+                        projectAuditor.setProjectId(project.getId());
+                        projectAuditorList.add(projectAuditor);
+                    });
+                    projectBasecostService.saveBatch(projectBasecostList);
+                    participationService.saveBatch(participationList);
+                    projectAuditorService.saveBatch(projectAuditorList);
+                    //新增操作记录数据
+                    projectApprovalLog.setCreateTime(LocalDateTime.now());
+                    projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                    //通过
+                    projectApprovalLog.setType(2);
+                    projectApprovalLogService.save(projectApprovalLog);
+                }
+                break;
+            /*驳回*/
+            case 2:
+                projectApproval.setStatus(2);
+                projectApprovalService.updateById(projectApproval);
+                //新增操作记录数据
+                projectApprovalLog.setCreateTime(LocalDateTime.now());
+                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                //驳回
+                projectApprovalLog.setType(3);
+                projectApprovalLogService.save(projectApprovalLog);
+                break;
+            /*撤销*/
+            case 3:
+                Project project = projectService.getOne(new LambdaQueryWrapper<Project>().eq(Project::getApproveId,projectApproval.getId()));
+                if(project!=null){
+                    int count = reportService.count(new LambdaQueryWrapper<Report>().eq(Report::getProjectId, project.getId()));
+                    if(count>0){
+                        msg.setError("已存在填报数据无法撤销立项");
+                        return msg;
+                    }
+                    projectAuditorService.remove(new LambdaQueryWrapper<ProjectAuditor>().eq(ProjectAuditor::getProjectId,project.getId()));
+                    projectBasecostService.remove(new LambdaQueryWrapper<ProjectBasecost>().eq(ProjectBasecost::getProjectId,project.getId()));
+                    participationService.remove(new LambdaQueryWrapper<Participation>().eq(Participation::getProjectId,project.getId()));
+                    project.deleteById(project.getId());
+                }
+                projectApproval.setStatus(3);
+                projectApprovalService.updateById(projectApproval);
+                //新增操作记录数据
+                projectApprovalLog.setCreateTime(LocalDateTime.now());
+                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                //驳回
+                projectApprovalLog.setType(4);
+                projectApprovalLogService.save(projectApprovalLog);
+                break;
+        }
+        return msg;
+    }
 }

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

@@ -1664,6 +1664,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<Integer> deptIds=null;
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
             List<Department> allDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", targetUser.getCompanyId()));
+            Department[] deptArray = allDepartmentList.toArray(new Department[0]);
             List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全公司");
             List<SysRichFunction> functionDpartList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看负责部门");
@@ -1888,16 +1889,27 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 membRowData.add("");
 
                             }
+                            Department dept = null;
+                            Department targetDept = new Department();
+                            if (membMap.get("deptId") != null) {
+                                targetDept.setDepartmentId(Integer.valueOf(membMap.get("deptId").toString()));
+                                int index = Arrays.binarySearch(deptArray, targetDept, Comparator.comparing(Department::getDepartmentId));
+                                if (index >= 0) {
+                                    dept = deptArray[index];
+                                }
+                            }
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 membRowData.add((String)("$userName="+membMap.get("corpwxUserId")+"$"));
                                 if(membMap.get("departmentName").equals("未分配")){
                                     membRowData.add("未分配");
                                 }else {
-                                    membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
+                                    membRowData.add(departmentService.exportWxDepartment(dept,allDepartmentList));
+//                                    membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
                                 }
                             }else {
                                 membRowData.add((String)membMap.get("name"));
-                                membRowData.add((String)membMap.get("departmentName"));
+                                membRowData.add(departmentService.getSupDepartment(dept,allDepartmentList));
+//                                membRowData.add((String)membMap.get("departmentName"));
                             }
                             String creatorId = (String)membMap.get("creatorId");
                             User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
@@ -12834,6 +12846,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realCost")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("overHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("normalHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
+                                    item.put("afterSetPlanHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("afterSetPlanHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
                                     double planHour =  Double.valueOf(String.valueOf( mapList.get(0).get("planHour"))).doubleValue();
                                     item.put("process",percentFormat.format(realHour/planHour));
@@ -12843,6 +12856,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
+                                    item.put("afterSetPlanHour",0);
                                     item.put("process","0.00%");
                                 }
                             }else {
@@ -12851,6 +12865,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 item.put("realCost",0);
                                 item.put("overHour",0);
                                 item.put("normalHour",0);
+                                item.put("afterSetPlanHour",0);
                                 item.put("process","0.00%");
                             }
                             itemList.add(item);
@@ -12881,6 +12896,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realCost")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("overHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("normalHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
+                                    item.put("afterSetPlanHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("afterSetPlanHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
                                     double planHour =  Double.valueOf(String.valueOf( mapList.get(0).get("planHour"))).doubleValue();
                                     item.put("process",percentFormat.format(realHour/planHour));
@@ -12890,6 +12906,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
+                                    item.put("afterSetPlanHour",0);
                                     item.put("process","0.00%");
                                 }
                             }else {
@@ -12898,6 +12915,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 item.put("realCost",0);
                                 item.put("overHour",0);
                                 item.put("normalHour",0);
+                                item.put("afterSetPlanHour",0);
                                 item.put("process","0.00%");
                             }
                             itemList.add(item);
@@ -12932,6 +12950,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realCost")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("overHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     item.put("normalHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
+                                    item.put("afterSetPlanHour",new BigDecimal(mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("afterSetPlanHour")))).sum()).setScale(2,RoundingMode.HALF_UP));
                                     double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
                                     double planHour =  Double.valueOf(String.valueOf( mapList.get(0).get("planHour"))).doubleValue();
                                     item.put("process",percentFormat.format(realHour/planHour));
@@ -12941,6 +12960,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
+                                    item.put("afterSetPlanHour",0);
                                     item.put("process","0.00%");
                                 }
                             }else {
@@ -12949,6 +12969,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 item.put("realCost",0);
                                 item.put("overHour",0);
                                 item.put("normalHour",0);
+                                item.put("afterSetPlanHour",0);
                                 item.put("process","0.00%");
                             }
                             itemList.add(item);

+ 67 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -9,6 +9,7 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.TimeTypeService;
 import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.WxCorpTemplateService;
 import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
@@ -78,6 +79,12 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     //获取日程
     public static final String ADD_SCHEDULE = " https://qyapi.weixin.qq.com/cgi-bin/oa/schedule/add?access_token=ACCESS_TOKEN";
 
+    //复制审批模板到企业
+    public static final String COPY_TEMPLATE = "https://qyapi.weixin.qq.com/cgi-bin/oa/approval/copytemplate?access_token=ACCESS_TOKEN";
+
+    //获取企业审批模板详情
+    public static final String GET_TEMPLATE_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/gettemplatedetail?access_token=ACCESS_TOKEN";
+
 
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
@@ -144,6 +151,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     ContactSyncLogMapper contactSyncLogMapper;
     @Resource
     TaskMapper taskMapper;
+    @Resource
+    WxCorpTemplateService wxCorpTemplateService;
 
 
     //获取服务商provider_access_token
@@ -2337,4 +2346,62 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return msg;
     }
 
+    /**
+     * 企业微信审批模板 复制更新到企业
+     *
+     * */
+    @Override
+    public void copyTemplate(HttpServletRequest request,Integer templateType) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        String url=GET_TEMPLATE_DETAIL.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("template_id","1bc0b9fc084369083b6abb970d658f3a_75187226");
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = ResponseEntity.getBody();
+            JSONObject respJson = JSONObject.parseObject(resp);
+            WxCorpTemplate wxCorpTemplate =new WxCorpTemplate();
+            wxCorpTemplate.setCompanyId(wxCorpInfo.getCompanyId())
+                          .setTemplateId(respJson.getString("template_id"))
+                          .setType(templateType);
+            wxCorpTemplateService.saveOrUpdate(wxCorpTemplate);
+            System.out.println(resp);
+        }
+    }
+
+    /**
+     * 获取企业审批模板详情
+     * */
+    @Override
+    public String getTemplateDetail(HttpServletRequest request,String templateId,Integer templateType) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        WxCorpTemplate template = wxCorpTemplateService.getById(wxCorpInfo.getCompanyId());
+        if(template==null){
+            copyTemplate(request,templateType);
+            template = wxCorpTemplateService.getById(wxCorpInfo.getCompanyId());
+        }
+        String url=COPY_TEMPLATE.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("template_id",template.getTemplateId());
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = ResponseEntity.getBody();
+            return resp;
+        }
+        return null;
+    }
 }

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.WxCorpTemplate;
+import com.management.platform.mapper.WxCorpTemplateMapper;
+import com.management.platform.service.WxCorpTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-25
+ */
+@Service
+public class WxCorpTemplateServiceImpl extends ServiceImpl<WxCorpTemplateMapper, WxCorpTemplate> implements WxCorpTemplateService {
+
+}

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

@@ -1896,7 +1896,7 @@
     <select id="groupExpendProcessList" resultType="java.util.Map">
         SELECT p.project_name AS projectName,p.id AS projectId,tg.id AS groupId,d.department_name,d.department_id AS deptId,d.corpwx_deptid AS corpwxDeptId,tg.name AS groupName,
         IFNULL(r.realHour,0) AS realHour,IFNULL(r.realCost,0) AS realCost,IFNULL(r.normalHour,0) as normalHour,IFNULL(r.overHour,0) as overHour,
-        IFNULL(tg.man_day*8,0) AS planHour
+        IFNULL(tg.first_man_day*8,0) AS planHour,IFNULL((SELECT SUM(change_man_day) FROM `group_budget_review` WHERE group_id=tg.`id` AND `status`=1),0) AS afterSetPlanHour
         FROM task_executor te
         LEFT JOIN task t ON t.id=te.task_id
         LEFT JOIN user u ON te.executor_id=u.id

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

@@ -11,11 +11,12 @@
         <result column="incharger_id" property="inchargerId" />
         <result column="wbs_code" property="wbsCode" />
         <result column="man_day" property="manDay" />
+        <result column="first_man_day" property="firstManDay" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_id, task_group_code, name, incharger_id, wbs_code, man_day
+        id, project_id, task_group_code, name, incharger_id, wbs_code, man_day, first_man_day
     </sql>
 
     <select id="selectReallyTimeWithMap" resultType="java.util.Map">

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/WxCorpTemplateMapper.xml

@@ -0,0 +1,17 @@
+<?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.WxCorpTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.WxCorpTemplate">
+        <id column="company_id" property="companyId" />
+        <result column="template_id" property="templateId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, template_id, type
+    </sql>
+
+</mapper>

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

@@ -1142,6 +1142,7 @@
               <el-table-column align="center" prop="groupName" label="任务分组" min-width="150"></el-table-column>
               <el-table-column align="center" prop="planHour" label="计划工时(财务)" width="120"></el-table-column>
               <el-table-column align="center" label="实际工时成本">
+                <el-table-column align="center" prop="afterSetPlanHour" label="增补工时" width="120"></el-table-column>
                 <el-table-column align="center" prop="normalHour" label="正常工时(h)" width="100"></el-table-column>
                 <el-table-column align="center" prop="overHour" label="加班工时(h)" width="100"></el-table-column>
                 <el-table-column align="center" prop="realHour" label="合计工时(h)" width="100"></el-table-column>

+ 17 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -169,6 +169,23 @@
                                     </el-select>
                                     <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :tile="true" :widthStr="'800'" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" :subjectId="addForm.auditUserIds" :subject="participator" :clearable="false" :distinction="'10'"  :multiSelect="user.timeType.reportAuditType != 6" @selectCal="selectCal"></selectCat>
                                 </el-form-item>
+                                <!--专业项目协作版本功能 -->
+                                <el-form-item :label="$t('ji-bie')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.packageProject==1 && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                                    <el-select v-model="addForm.level"  :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-if="user.timeType.projectLevelState == 1" :disabled="canOnlyModParticipator || isShowProjectName">
+                                        <el-option v-for="item in levelList" :key="item.id" :label="item.projectLevelName" :value="item.id"></el-option>
+                                    </el-select>
+                                    <el-select v-model="addForm.level"  :placeholder="this.$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator" v-else>
+                                        <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                                <!-- 增加合同金额字段 -->
+                                <el-form-item  :label="$t('contractamount')" v-if="user.company.packageProject==1 && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                                    <el-input id="contractAmount" v-model="addForm.contractAmount" :disabled="canOnlyModParticipator" style="width:32%;" @input="contractAmountChange(addForm.contractAmount)" :placeholder="$t('zheng-shu')" clearable  @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;position:absolute;">{{ $t('yuan') }}</span>
+                                    <template v-if="title == $t('modifytheproject') && contractAmountReasonShow">
+                                        <span style="margin-left:63px;margin-right:10px;">{{ $t('modifythereason') }}</span>
+                                        <el-input v-model="addForm.changeContractReason" style="width:33%" clearable :placeholder="$t('contractamountasd')"></el-input>
+                                    </template>
+                                </el-form-item>
                                 <el-form-item :label="$t('ommencementDate')" prop="planStartDate"  v-if="(user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
                                     <el-date-picker v-model="addForm.planStartDate" :disabled="canOnlyModParticipator"
                                     :editable="false" style="width:32%;" 

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

@@ -274,7 +274,7 @@
                                                     <span style="margin-left:10px;">工作内容:{{ item2.extraField3? item2.extraField3Name:''}}</span></p>
                                                     <!--任务分组和阶段 -->
                                                     <p v-if="item2.groupId != 0">
-                                                        {{$t('other.taskGroup')}}:{{item2.groupName}} 
+                                                        {{$t('other.taskGroup')}}:{{item2.groupName}}
                                                         <span v-if="item2.stage != null && item2.stage != '-' && user.companyId != yuzhongCompId && user.timeType.enableNewWeeklyfill != 1" style="margin-left:10px;">{{$t('other.inputStage')}}:{{item2.stage}}</span>
                                                     </p>
                                                     <p v-if="user.timeType.customDegreeActive==1 && ((item2.degree_id != null && item2.degree_id != -1) || item2.multiDegrId)">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
@@ -4461,6 +4461,10 @@
                 if(!domain.groupId){
                     domain.projectAuditorId = ''
                     domain.stages = []
+                    if(this.user.companyId == '3092') { // 针对 公司id为3092的公司清空任务分组时一起清空任务和服务
+                        domain.taskId = ''
+                        domain.sapServiceId = ''
+                    }
                     if(this.user.timeType.reportAuditType >= 1){
                         domain.auditUserList = []
                     }