浏览代码

工时管家 立项管理部分

Min 1 年之前
父节点
当前提交
c60672c64f
共有 38 个文件被更改,包括 2148 次插入5 次删除
  1. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FeishuInfoController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ParticipationApprovalController.java
  3. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalAuditorController.java
  4. 39 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalBasecostController.java
  5. 154 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  6. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  7. 55 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ParticipationApproval.java
  8. 262 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApproval.java
  9. 54 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalAuditor.java
  10. 60 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalBasecost.java
  11. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ParticipationApprovalMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalAuditorMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalBasecostMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ParticipationApprovalService.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalAuditorService.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalBasecostService.java
  19. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java
  20. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ParticipationApprovalServiceImpl.java
  21. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  22. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalAuditorServiceImpl.java
  23. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalBasecostServiceImpl.java
  24. 84 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  25. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  26. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  27. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ParticipationApprovalMapper.xml
  28. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalAuditorMapper.xml
  29. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalBasecostMapper.xml
  30. 48 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalMapper.xml
  31. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml
  32. 50 0
      fhKeeper/formulahousekeeper/timesheet/src/http.js
  33. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  34. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  35. 15 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  36. 15 0
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  37. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  38. 992 0
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

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

@@ -470,6 +470,9 @@ public class FeishuInfoController {
         if (company.getPackageProvider() == 1) {
             queryWrapper.or().eq("package_provider", 1);
         }
+        if (company.getPackageProjectApproval() == 1) {
+            queryWrapper.or().eq("package_project_approval", 1);
+        }
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ParticipationApprovalController.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-18
+ */
+@RestController
+@RequestMapping("/participation-approval")
+public class ParticipationApprovalController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalAuditorController.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-18
+ */
+@RestController
+@RequestMapping("/project-approval-auditor")
+public class ProjectApprovalAuditorController {
+
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalBasecostController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ProjectApprovalBasecost;
+import com.management.platform.service.ProjectApprovalBasecostService;
+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 java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+@RestController
+@RequestMapping("/project-approval-basecost")
+public class ProjectApprovalBasecostController {
+
+    @Resource
+    private ProjectApprovalBasecostService projectApprovalBasecostService;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<ProjectApprovalBasecost> list = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, projectId));
+        msg.setData(list);
+        return msg;
+    }
+
+}
+

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

@@ -0,0 +1,154 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+@RestController
+@RequestMapping("/project-approval")
+public class ProjectApprovalController {
+
+    @Resource
+    private ProjectApprovalService projectApprovalService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private ParticipationApprovalService participationApprovalService;
+    @Resource
+    private ProjectApprovalAuditorService projectApprovalAuditorService;
+    @Resource
+    private ProjectApprovalBasecostService projectApprovalBasecostService;
+    @Resource
+    private ProjectCategoryService projectCategoryService;
+
+    /**
+     * 分页获取项目列表
+     * pageIndex 页数
+     * pageSize 页面大小
+     */
+    @RequestMapping("/listByPage")
+    public HttpRespMsg getProjectPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword,
+                                      @RequestParam(required = false, defaultValue = "1") Integer searchField,@RequestParam(defaultValue = "3") String statuses,Integer category) {
+        return projectApprovalService.listByPage(pageIndex, pageSize, keyword,searchField,statuses,category,request);
+    }
+
+    @RequestMapping("/editProjectApproval")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpRespMsg editProjectApproval(@RequestBody ProjectApproval projectApproval) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<ProjectCategory> categoryList = projectCategoryService.list(new LambdaQueryWrapper<ProjectCategory>().eq(ProjectCategory::getCompanyId, companyId));
+        projectApproval.setCompanyId(companyId);
+        projectApproval.setCreateDate(LocalDate.now());
+        projectApproval.setCreatorId(user.getId());
+        Optional<ProjectCategory> category = categoryList.stream().filter(c -> c.getId().equals(projectApproval.getCategory())).findFirst();
+        if(category.isPresent()){
+            projectApproval.setCategoryName(category.get().getName());
+        }
+        Integer count;
+        if(projectApproval.getId()==null){
+            count = projectMapper.selectCount(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, companyId).eq(Project::getProjectCode, projectApproval.getProjectCode()));
+        }else {
+            count = projectMapper.selectCount(new LambdaQueryWrapper<Project>().ne(Project::getId,projectApproval.getId()).eq(Project::getCompanyId, companyId).eq(Project::getProjectCode,  projectApproval.getProjectCode()));
+        }
+        if(count>0){
+            msg.setError("已存在项目编号为["+projectApproval.getProjectCode()+"]的项目");
+            return msg;
+        }
+        if(!projectApprovalService.saveOrUpdate(projectApproval)){
+            msg.setError("验证失败");
+        }
+        participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
+        if(projectApproval.getParticipationApprovalList()!=null&&projectApproval.getParticipationApprovalList().size()>0){
+            List<ParticipationApproval> participationApprovalList = projectApproval.getParticipationApprovalList();
+            participationApprovalList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(p.getUserId())).findFirst();
+                if(first.isPresent()){
+                    p.setUserName(first.get().getName());
+                }
+            });
+            participationApprovalService.saveBatch(participationApprovalList);
+        }
+        if(projectApproval.getProjectApprovalBasecostList()!=null&&projectApproval.getProjectApprovalBasecostList().size()>0){
+            List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApproval.getProjectApprovalBasecostList();
+            projectApprovalBasecostList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+            });
+            projectApprovalBasecostService.saveBatch(projectApprovalBasecostList);
+        }
+        if(projectApproval.getProjectApprovalAuditorList()!=null&&projectApproval.getProjectApprovalAuditorList().size()>0){
+            List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApproval.getProjectApprovalAuditorList();
+            projectApprovalAuditorList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(p.getAuditorId())).findFirst();
+                if(first.isPresent()){
+                    p.setAuditorName(first.get().getName());
+                }
+            });
+            projectApprovalAuditorService.saveBatch(projectApprovalAuditorList);
+        }
+        return msg;
+    }
+
+
+    @RequestMapping("/getDetail")
+    public HttpRespMsg getDetail(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        ProjectApproval projectApproval = projectApprovalService.getById(id);
+        Optional<User> first = userList.stream().filter(u -> u.getId().equals(projectApproval.getInchargerId())).findFirst();
+        if(first.isPresent()){
+            projectApproval.setInchargerName(first.get().getName());
+        }
+        List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, id));
+        participationApprovalList.forEach(p->{
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(p.getUserId())).findFirst();
+            if(user.isPresent()){
+                p.setUserName(user.get().getName());
+            }
+        });
+        projectApproval.setParticipationApprovalList(participationApprovalList);
+        List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, id));
+        projectApproval.setProjectApprovalAuditorList(projectApprovalAuditorList);
+        List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
+        projectApproval.setProjectApprovalBasecostList(projectApprovalBasecostList);
+        msg.setData(projectApproval);
+        return msg;
+    }
+
+}
+

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

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-28
+ * @since 2024-03-18
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -121,6 +121,12 @@ public class Company extends Model<Company> {
     @TableField("package_provider")
     private Integer packageProvider;
 
+    /**
+     * 立项管理
+     */
+    @TableField("package_project_approval")
+    private Integer packageProjectApproval;
+
     /**
      * 是否是国际化版本
      */

+ 55 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ParticipationApproval.java

@@ -0,0 +1,55 @@
+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 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ParticipationApproval extends Model<ParticipationApproval> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户表主键
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 项目立项表主键
+     */
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+    @TableField(exist = false)
+    private String userName;
+
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 262 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApproval.java

@@ -0,0 +1,262 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApproval extends Model<ProjectApproval> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
+    /**
+     * 公司表外键
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 项目编码
+     */
+    @TableField("project_code")
+    private String projectCode;
+
+    /**
+     * 负责人id
+     */
+    @TableField("incharger_id")
+    private String inchargerId;
+
+    /**
+     * 计划开始日期
+     */
+    @TableField("plan_start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planStartDate;
+
+    /**
+     * 计划结束日期
+     */
+    @TableField("plan_end_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planEndDate;
+
+    /**
+     * 项目进度
+     */
+    @TableField("progress")
+    private Integer progress;
+
+    /**
+     * 0-全部,1-正常,2-紧急,3-重要,4-重要且紧急 5-低风险 6-中风险 7-高风险
+     */
+    @TableField("level")
+    private Integer level;
+
+    /**
+     * 立项状态 0-待审核 1-已通过 2-已驳回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 实际完成日期
+     */
+    @TableField("finish_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate finishDate;
+
+    /**
+     * 创建人id
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 创建人姓名
+     */
+    @TableField("creator_name")
+    private String creatorName;
+
+    /**
+     * 创建日期
+     */
+    @TableField("create_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+    /**
+     * 项目金额:单位元
+     */
+    @TableField("contract_amount")
+    private Double contractAmount;
+
+    /**
+     * 基线总成本:单位元
+     */
+    @TableField("budget")
+    private Double budget;
+
+    /**
+     * 人员成本:单位元
+     */
+    @TableField("base_man")
+    private Integer baseMan;
+
+    /**
+     * 外包费用
+     */
+    @TableField("base_outsourcing")
+    private Integer baseOutsourcing;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk1")
+    private Integer baseRisk1;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk2")
+    private Integer baseRisk2;
+
+    /**
+     * 基线费用
+     */
+    @TableField("base_fee")
+    private Integer baseFee;
+
+    /**
+     * 人工成本
+     */
+    @TableField("fee_man")
+    private Double feeMan;
+
+    /**
+     * 客户id
+     */
+    @TableField("customer_id")
+    private Integer customerId;
+
+    /**
+     * 客户名称
+     */
+    @TableField("customer_name")
+    private String customerName;
+
+    /**
+     * 是否是公共项目 0-否  1-是
+     */
+    @TableField("is_public")
+    private Integer isPublic;
+
+    /**
+     * 关联的自定义维度
+     */
+    @TableField("associate_degrees")
+    private String associateDegrees;
+
+    /**
+     * 关联的自定义维度名称
+     */
+    @TableField("associate_degree_names")
+    private String associateDegreeNames;
+
+    /**
+     * 下放日报审核权限到分组负责人
+     */
+    @TableField("task_gp_incharge")
+    private Integer taskGpIncharge;
+
+    /**
+     * 分类id
+     */
+    @TableField("category")
+    private Integer category;
+
+    /**
+     * 分类名称
+     */
+    @TableField("category_name")
+    private String categoryName;
+
+    /**
+     * 项目描述
+     */
+    @TableField("project_desc")
+    private String projectDesc;
+
+    /**
+     * 阶段id
+     */
+    @TableField("current_stage_id")
+    private Integer currentStageId;
+
+    /**
+     * 当前任务阶段名称
+     */
+    @TableField("current_stage_name")
+    private String currentStageName;
+
+    /**
+     * 项目产值
+     */
+    @TableField("output_value")
+    private Double outputValue;
+
+    @TableField(exist = false)
+    private List<ProjectApprovalBasecost> projectApprovalBasecostList;
+
+    @TableField(exist = false)
+    private List<ParticipationApproval> participationApprovalList;
+
+    @TableField(exist = false)
+    private List<ProjectApprovalAuditor> projectApprovalAuditorList;
+
+    @TableField(exist = false)
+    private String inchargerName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 54 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalAuditor.java

@@ -0,0 +1,54 @@
+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 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApprovalAuditor extends Model<ProjectApprovalAuditor> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+    /**
+     * 审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 审核人姓名
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 60 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalBasecost.java

@@ -0,0 +1,60 @@
+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 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApprovalBasecost extends Model<ProjectApprovalBasecost> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+    /**
+     * 预算项id
+     */
+    @TableField("base_id")
+    private Integer baseId;
+
+    /**
+     * 预算项名称
+     */
+    @TableField("base_name")
+    private String baseName;
+
+    /**
+     * 预算金额
+     */
+    @TableField("base_amount")
+    private Double baseAmount;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-07-07
+ * @since 2024-03-18
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -157,6 +157,12 @@ public class SysModule extends Model<SysModule> {
     @TableField("package_provider")
     private Integer packageProvider;
 
+    /**
+     * 是否属于立项管理模块
+     */
+    @TableField("package_project_approval")
+    private Integer packageProjectApproval;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ParticipationApproval;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 人员参与项目的情况 Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+public interface ParticipationApprovalMapper extends BaseMapper<ParticipationApproval> {
+
+}

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

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

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

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

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

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

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ParticipationApproval;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 人员参与项目的情况 服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+public interface ParticipationApprovalService extends IService<ParticipationApproval> {
+
+}

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

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

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

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

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

@@ -0,0 +1,22 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectApproval;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+public interface ProjectApprovalService extends IService<ProjectApproval> {
+
+    HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category, HttpServletRequest request);
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ParticipationApproval;
+import com.management.platform.mapper.ParticipationApprovalMapper;
+import com.management.platform.service.ParticipationApprovalService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 人员参与项目的情况 服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+@Service
+public class ParticipationApprovalServiceImpl extends ServiceImpl<ParticipationApprovalMapper, ParticipationApproval> implements ParticipationApprovalService {
+
+}

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

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

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

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

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

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

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

@@ -0,0 +1,84 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProjectApprovalMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ParticipationApprovalService;
+import com.management.platform.service.ProjectApprovalAuditorService;
+import com.management.platform.service.ProjectApprovalBasecostService;
+import com.management.platform.service.ProjectApprovalService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-18
+ */
+@Service
+public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMapper, ProjectApproval> implements ProjectApprovalService {
+
+    @Resource
+    private ProjectApprovalMapper projectApprovalMapper;
+    @Resource
+    private UserMapper userMapper;
+
+
+
+    @Override
+    public HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category, HttpServletRequest request) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        LambdaQueryWrapper<ProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
+        if(!StringUtils.isEmpty(keyword)){
+            switch (searchField){
+                case 1:queryWrapper.like(ProjectApproval::getProjectName,keyword);
+                    break;
+                case 2:queryWrapper.like(ProjectApproval::getProjectCode,keyword);
+                    break;
+            }
+        }
+        if(category!=null){
+            queryWrapper.eq(ProjectApproval::getCategory,category);
+        }
+        if(!StringUtils.isEmpty(statuses)){
+            if(statuses.contains(",")){
+                String[] split = statuses.split(",");
+                List<String> statusList = Arrays.asList(split);
+                queryWrapper.in(ProjectApproval::getStatus,statusList);
+            }else {
+                if(!statuses.equals("3")){
+                    queryWrapper.eq(ProjectApproval::getStatus,Integer.valueOf(statuses));
+                }
+            }
+        }
+        IPage<ProjectApproval> iPage = projectApprovalMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        Map<String,Object> result=new HashMap<>();
+        List<ProjectApproval> records = iPage.getRecords();
+        records.forEach(r->{
+            Optional<User> optional = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
+            if(optional.isPresent()){
+                r.setInchargerName(optional.get().getName());
+            }
+        });
+        result.put("records",records);
+        result.put("total",iPage.getTotal());
+        msg.setData(result);
+        return msg;
+    }
+}

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

@@ -571,6 +571,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (company.getPackageProvider() == 1) {
             queryWrapper.or().eq("package_provider", 1);
         }
+        if (company.getPackageProjectApproval() == 1) {
+            queryWrapper.or().eq("package_project_approval", 1);
+        }
         if (timeType.getReportWorkflow() == 1) {
             queryWrapper.or().eq("report_workflow", 1);
         }

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

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

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ParticipationApprovalMapper.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.ParticipationApprovalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ParticipationApproval">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="project_approval_id" property="projectApprovalId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, project_approval_id
+    </sql>
+
+</mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalAuditorMapper.xml

@@ -0,0 +1,18 @@
+<?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.ProjectApprovalAuditorMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectApprovalAuditor">
+        <id column="id" property="id" />
+        <result column="project_approval_id" property="projectApprovalId" />
+        <result column="auditor_id" property="auditorId" />
+        <result column="auditor_name" property="auditorName" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_approval_id, auditor_id, auditor_name
+    </sql>
+
+</mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalBasecostMapper.xml

@@ -0,0 +1,19 @@
+<?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.ProjectApprovalBasecostMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectApprovalBasecost">
+        <id column="id" property="id" />
+        <result column="project_approval_id" property="projectApprovalId" />
+        <result column="base_id" property="baseId" />
+        <result column="base_name" property="baseName" />
+        <result column="base_amount" property="baseAmount" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_approval_id, base_id, base_name, base_amount
+    </sql>
+
+</mapper>

+ 48 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalMapper.xml

@@ -0,0 +1,48 @@
+<?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.ProjectApprovalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectApproval">
+        <id column="id" property="id" />
+        <result column="project_name" property="projectName" />
+        <result column="company_id" property="companyId" />
+        <result column="project_code" property="projectCode" />
+        <result column="incharger_id" property="inchargerId" />
+        <result column="plan_start_date" property="planStartDate" />
+        <result column="plan_end_date" property="planEndDate" />
+        <result column="progress" property="progress" />
+        <result column="level" property="level" />
+        <result column="status" property="status" />
+        <result column="finish_date" property="finishDate" />
+        <result column="creator_id" property="creatorId" />
+        <result column="creator_name" property="creatorName" />
+        <result column="create_date" property="createDate" />
+        <result column="contract_amount" property="contractAmount" />
+        <result column="budget" property="budget" />
+        <result column="base_man" property="baseMan" />
+        <result column="base_outsourcing" property="baseOutsourcing" />
+        <result column="base_risk1" property="baseRisk1" />
+        <result column="base_risk2" property="baseRisk2" />
+        <result column="base_fee" property="baseFee" />
+        <result column="fee_man" property="feeMan" />
+        <result column="customer_id" property="customerId" />
+        <result column="customer_name" property="customerName" />
+        <result column="is_public" property="isPublic" />
+        <result column="associate_degrees" property="associateDegrees" />
+        <result column="associate_degree_names" property="associateDegreeNames" />
+        <result column="task_gp_incharge" property="taskGpIncharge" />
+        <result column="category" property="category" />
+        <result column="category_name" property="categoryName" />
+        <result column="project_desc" property="projectDesc" />
+        <result column="current_stage_id" property="currentStageId" />
+        <result column="current_stage_name" property="currentStageName" />
+        <result column="output_value" property="outputValue" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_man, customer_id, customer_name, is_public, associate_degrees, associate_degree_names, task_gp_incharge, category, category_name, project_desc, current_stage_id, current_stage_name, output_value
+    </sql>
+
+</mapper>

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

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

+ 50 - 0
fhKeeper/formulahousekeeper/timesheet/src/http.js

@@ -101,6 +101,56 @@ export default {
         )
     },
 
+    JSONPost (url, data, response, exception) {
+        let user = sessionStorage.getItem('user') , token = "";
+        if(user != null){
+            token = JSON.parse(user).id
+            // data.token = token
+        }
+        if(localStorage.getItem('lang') == 'en') {
+            data.lang = 'english'
+        }
+        axios({
+            method: 'post',
+            url: handleUrl(url),
+            data,
+            timeout: TIME_OUT_MS,
+            headers: {
+                'Content-Type': 'application/json',
+                // 'Content-type': ' application/x-www-form-urlencoded; charset=UTF-8',
+                'Token': token
+            }
+        }).then(
+            (result) => {
+                response(handleResults(result))
+            }
+        ).catch(
+            (error) => {
+                if (exception) {
+                    var str = error + ''
+                    if(str.indexOf('504') != '-1' || str.indexOf('502') != '-1') {
+
+                        if (flgs == 0) {
+                            timer = setTimeout(() => {
+                                prompt()
+                            }, 100)
+                            flgs++
+                            clearTimeout(timer2)
+                            timer2 = setTimeout(() => {
+                                flgs = 0
+                            }, 12000)
+                        }
+                        // exception(false)
+                    } else {
+                        exception(error)
+                    }
+                } else {
+                    console.log(error, 3)
+                }
+            }
+        )
+    },
+
     WPGpost (url, data, response, exception) {
         let user = sessionStorage.getItem('user') , token = "";
         if(user != null){

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

@@ -3,6 +3,7 @@
   "navigation": {
     "reports": "Hours report",
     "projectManagement": "project management",
+    "projectApproval": "project approval",
     "contractManagement": "contract management",
     "professionalAudit": "Professional audit",
     "departmentAudit": "Department audit",

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

@@ -3,6 +3,7 @@
   "navigation": {
     "reports": "工时报告",
     "projectManagement": "项目管理",
+    "projectApproval": "立项管理",
     "contractManagement": "合同管理",
     "professionalAudit": "专业审核",
     "departmentAudit": "部门审核",

+ 15 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -20,6 +20,14 @@ const StringUtil = {
         projectEditDefaultFolder: false, // 修改默认文件夹 //
         projectViewAllTasks: false, // 查看全部任务 //
 
+        //立项管理
+        projectApprovalNew:false, //新增立项
+        projectApprovalView:false, //查看全部立项
+        projectApprovalExport:false, //导出立项
+        projectApprovalImport:false, //导入立项
+        projectApprovalCheck:false, //审核立项
+        projectApprovalEdit:false, //管理全部立项
+
         // 合同管理
         contractNew: false, // 新增合同 // 
         contractView: false, // 查看全部合同 // 
@@ -261,6 +269,13 @@ const StringUtil = {
         arr[i] == '全部分组耗用进度表' || arr[i] == '负责部门分组耗用进度表' ? obj.reportProjectConsumptionFirst = true : ''
         arr[i] == '全部项目耗用进度表' || arr[i] == '负责部门项目耗用进度表' ? obj.reportProjectConsumptionTwo = true : ''
         arr[i] == '全部员工任务进度表' || arr[i] == '负责部门员工任务进度表' ? obj.reportStaffTaskAccomplished = true : ''
+
+        arr[i] == '新增立项申请'  ? obj.projectApprovalNew = true : ''
+        arr[i] == '导入立项申请'  ? obj.projectApprovalImport = true : ''
+        arr[i] == '导出立项申请'  ? obj.projectApprovalExport = true : ''
+        arr[i] == '查看全部立项申请'  ? obj.projectApprovalView = true : ''
+        arr[i] == '管理全部立项申请'  ? obj.projectApprovalEdit = true : ''
+        arr[i] == '审核立项申请' ? obj.projectApprovalCheck = true : ''
     }
     return obj
   }

+ 15 - 0
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -31,6 +31,9 @@ import projectInside from  './views/project/projectInside.vue'
 import info from './views/project/info.vue'
 import projectGantt from './views/project/project_gantt.vue'
 
+// 立项管理
+import projectApproval from './views/projectApproval/projectApproval.vue'
+
 // 合同管理
 import contract from './views/contract/index.vue'
 
@@ -292,6 +295,18 @@ export const allRouters = [//组织架构
         // 其他信息
         meta: { text: 'navigation.projectManagement' } 
     },
+    {
+        path: '/',
+        component: Home,
+        name: '立项管理',
+        iconCls: 'iconfont firerock-iconxiangmu',
+        leaf: true,
+        children: [
+            { path: '/projectApproval', component: projectApproval, name: '立项管理' },
+        ],
+        // 其他信息
+        meta: { text: 'navigation.projectApproval' } 
+    },
     //预算工时审核
     {
         path: '/',

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

@@ -6148,7 +6148,7 @@ a {
             if (this.user.timeType.projectManDay == 1) {
                 this.getManDaySetting();
             }
-        }
+        },
     };
 </script>
 

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

@@ -0,0 +1,992 @@
+<template>
+    <section>
+        <!--工具条 top-->
+        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+            <el-form :inline="true">
+                <el-form-item >
+                    <!-- <div style="display: flex;align-items: center;height: 40px;"> -->
+                    <div v-if="true" style="display: flex;align-items: center;height: 40px;">
+                    <el-input v-model="keyword" class="input-with-select" :placeholder="searchField == '1' ? $t('peaseenterthe') : $t('peaseenterthe')" clearable="true" size="small">
+                        <el-select v-model="searchField" style="width:120px;"  slot="prepend" :placeholder="$t('defaultText.pleaseChoose')">
+                            <el-option :label="$t('headerTop.projectName')" value=1 ></el-option>
+                            <el-option :label="$t('Itemno')" value=2 ></el-option>
+                        </el-select>
+                        <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button>
+                    </el-input>
+                    </div>
+                </el-form-item>
+                <!-- 分类筛选 -->
+                <el-form-item >
+                    <span style="margin-left:5px;margin-right:5px;color:#606266;">{{ $t('fen-lei') }}</span>
+                    <el-select v-model="statusClf" style="width:140px;"  :placeholder="$t('defaultText.pleaseChoose')" clearable @change="searchClfList" size="small">
+                        <el-option v-for="item in baseClfList" :key="item.id" :label="item.name" :value="item.id" ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item style="float:right;">
+                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">{{'新增'}}</el-link>
+                </el-form-item>
+            </el-form>
+        </el-col>
+        <!--列表-->
+        <el-table ref="projectlistOfWudulist" border @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @selection-change="checkedWudulist">
+            <el-table-column type="selection" width="60" :selectable="isSelectable">
+            </el-table-column>
+            <el-table-column prop="projectCode" :label="$t('Itemno')"  width="150"></el-table-column>
+            <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" ></el-table-column>
+            <el-table-column prop="categoryName" :label="$t('projectclassification')"  width="140"></el-table-column>
+            <el-table-column prop="isPublic" :label="'项目类型'"  width="140">
+                <template slot-scope="scope">{{scope.row.isPublic==0?"正式项目":"非项目"}}</template>
+            </el-table-column>
+            <el-table-column prop="inchargerName" :label="$t('projectmanager')"  min-width="150">
+                <template slot-scope="scope">
+                    <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
+                        <span v-if="user.userNameNeedTranslate != 1">
+                            {{scope.row.inchargerName}}
+                        </span>
+                        <span v-if="user.userNameNeedTranslate == 1">
+                            <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                        </span>
+                    </el-link>
+                </template>
+            </el-table-column>
+            <!-- 级别 -->
+            <el-table-column :prop="user.timeType.projectLevelState == 1 ? 'levelName' : 'level'" :label="$t('ji-bie')" min-width="190"   v-if="user.company.packageProject == 1">
+                <template slot-scope="scope">
+                    <span v-if="user.timeType.projectLevelState == 1">{{scope.row.levelName}}</span>
+                    <span v-else>{{importanceListLable[scope.row.level - 1]}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="status" :label="'审核状态'" min-width="100" >
+                <template slot-scope="scope">
+                    {{scope.row.status == null?"-":approvalStatusStr[scope.row.status]}}
+                </template>
+            </el-table-column>
+            <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
+                <template slot-scope="scope">
+                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
+                    <el-button size="mini"  @click="restartPro(scope.row)">{{'通过'}}</el-button>
+                    <el-button size="mini"  @click="restartPro(scope.row)">{{'驳回'}}</el-button>
+                    <el-button size="mini"  @click="restartPro(scope.row)">{{'撤销'}}</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <!--工具条 footer-->
+        <el-col :span="24" class="toolbar">
+            <el-pagination :key="projectListPageComponentKey"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :page-sizes="[20 , 50 , 80 , 100]"
+                :page-size="size"
+                :current-page.sync="page"
+                layout="total, sizes, prev, pager, next"
+                :total="total"
+                style="float:right;"
+            ></el-pagination>
+        </el-col>
+
+        <!--新增界面-->
+        <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px" :top="'6vh'">
+            <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
+                <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
+                    <el-form-item :label="$t('Itemno')" :class="title == $t('newproject')" v-if="user.companyId!=936">
+                        <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
+                        <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName)" maxlength="50" show-word-limit="true"></el-input>
+                    </el-form-item>
+                    <el-form-item :label="$t('headerTop.projectName')" prop="name">
+                        <!-- <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input> -->
+                        <el-input v-model="addForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName) || isShowProjectName" maxlength="255" show-word-limit="true"></el-input>
+                    </el-form-item>
+                    <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
+                        <!-- <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
+                        <el-select v-model="addForm.category"  style="width:32%;" clearable filterable :disabled="canOnlyModParticipator">
+                            <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
+                        <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="canOnlyModParticipator">
+                            <el-option :value="0" :label="$t('zheng-shi-xiang-mu')"></el-option>
+                            <el-option :value="1" :label="$t('fei-xiang-mu')"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item :label="$t('other.projectDescription')" prop="projectDesc">
+                        <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
+                        <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000" :disabled="canOnlyModParticipator" show-word-limit></el-input>
+                    </el-form-item>
+                    <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
+                        <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
+
+                            <div slot="content" style="width:780px">{{addForm.userNames}}</div>
+                            <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                        </el-tooltip>
+
+                        <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == 1">
+                            <div slot="content" style="width:780px">
+                                <span v-for="(item, index) in addFormUserNames" :key="index">
+                                    <!-- {{item}} -->
+                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                    <span v-if="index < addFormUserNames.length - 1">,</span>
+                                </span>
+                            </div>
+                            <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
+                                <span v-for="(item, index) in addFormUserNames" :key="index">
+                                    <!-- {{item}} -->
+                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                    <span v-if="index < addFormUserNames.length - 1">,</span>
+                                </span>
+                            </div>
+                        </el-tooltip>
+                    </el-form-item>
+                    <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0)">
+                       <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
+                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
+                                <span style="float: left">{{ item.name }}</span>
+                            </el-option>
+                        </el-select>
+                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
+                    </el-form-item>
+
+                    <el-form-item :label="$t('newspaperauditor')">
+                        <el-select v-if="user.userNameNeedTranslate != '1'" @change="$forceUpdate()" v-model="addForm.auditUserIds"  :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" :multiple="user.timeType.reportAuditType != 6" >
+                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                        </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('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%;" 
+                        format="yyyy-MM-dd" 
+                        value-format="yyyy-MM-dd"
+                        :clearable="false" type="date" 
+                        :placeholder="$t('optiondate')"></el-date-picker>
+
+                        <span style="margin-left:63px;margin-right:10px;" >{{ $t('ji-hua-jie-shu-ri-qi') }}</span>
+                        <el-date-picker v-model="addForm.planEndDate" style="width:33%;"
+                        :editable="false" :disabled="canOnlyModParticipator"
+                        format="yyyy-MM-dd" 
+                        value-format="yyyy-MM-dd"
+                        :clearable="false" type="date" 
+                        :placeholder="$t('optiondate')"></el-date-picker>
+                    </el-form-item>
+                    <!-- 项目基线 -->
+                    <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1 && !canOnlyModParticipator && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                        <el-tabs v-model="activeName" @tab-click="handleClick">
+                        <el-tab-pane :label="$t('costbaseline')" name="baseCostPanel"  >
+                            <div style="padding-top:10px;">
+                                <!--新版 -->
+                                <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
+                                    <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
+                                    <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
+                                    :placeholder="$t('zheng-shu')" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
+                                </span>    
+
+                                <!-- 合计 -->
+                                <div style="margin-top: 10px;float:right;">
+                                    <span style="margin-right:50px;margin-right:10px;" v-if="user.company.packageProject==1">{{ $t('other.totals') }}</span>
+                                    <span v-if="addForm.budget <= 0 || addForm.budget == undefined">0</span>
+                                    <span v-else>{{addForm.budget | numberToCurrency}}</span>
+                                    <span style="margin-right:50px;margin-left:10px;">{{ $t('yuan') }}</span>
+                                </div>
+                            </div>
+                        </el-tab-pane>
+                        </el-tabs>
+                    </div>
+                
+                </el-form>  
+            </div>
+            <div slot="footer" class="dialog-footer;">
+                <el-button @click.native="deletePro(1, addForm)" v-if="(permissions.projectManagement || user.id==deleteVif) && addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
+            </div>
+        </el-dialog>
+        <!-- 按部门选择人员 -->
+        <el-dialog :title="$t('selectingParticipants')"  :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
+            <div v-if="user.userNameNeedTranslate == '1'">
+                <el-input placeholder="请输入内容" v-model.trim="filterText" class="input-with-select">
+                    <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
+                </el-input>
+            </div>
+            
+            <div class="tree" style="height:400px">
+                <el-scrollbar style="height:100%">
+                    <el-input
+                    :placeholder="$t('keywordfiltering')"
+                    v-model="filterText" v-if="user.userNameNeedTranslate != '1'">
+                    </el-input>
+                    <el-tree :data="deptMembData" :key="searchPersonnelFlgnum" show-checkbox :default-expand-all="searchPersonnelFlg" :props="defaultProps" node-key="id"
+                        ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
+                        highlight-current  :filter-node-method="filterNode">
+                        <span class="custom-tree-node" slot-scope="{ node, data }">
+                            <span v-if="user.userNameNeedTranslate == '1'">
+                                <span v-if="node.data.children">
+                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                </span>
+                                <span v-else>
+                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                </span>
+                            </span>
+                            <span v-if="user.userNameNeedTranslate != '1'">
+                                {{ node.label }}
+                            </span>
+                            <!-- {{ node.label }} -->
+                        </span>
+                    </el-tree>
+                </el-scrollbar>
+            </div>
+            <div>{{ $t('btn.choose') }}&nbsp;{{chosenMembCount}}&nbsp;{{ $t('other.people') }}</div>
+            <div slot="footer" class="dialog-footer">
+                <el-button  @click="chooseParticipVisible = false" >{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="chooseParticip()" >{{ $t('btn.determine') }}</el-button>
+            </div>
+        </el-dialog>
+         <!--用户详细信息弹出框-->
+         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+            <div class="line"><span>{{ $t('lable.name') +":"}}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+            </div>
+            <div class="line"><span>{{ $t('Worknumber') +":"}}</span><span>{{userDetail.jobNumber}}</span></div>
+            <div class="line"><span>{{ $t('lable.phone') +":"}}</span><span>{{userDetail.phone}}</span></div>
+            <div class="line"><span>{{ $t('jiao-se') +":"}}</span><span>{{userDetail.roleName}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') +":"}}</span>
+
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+            </div>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
+            </div>
+        </el-dialog>
+    </section>
+</template>
+
+<script>
+export default {
+name: '',
+components: {},
+props: { },
+data() { 
+return {
+    keyword:"",
+    searchField:"1",
+    user: JSON.parse(sessionStorage.getItem("user")),
+    total: 0,
+    page: 1,
+    size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
+    listLoading:false,
+    approvalStatusStr:["待审核","已通过","已驳回"],
+    importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
+    importanceListLable:[this.$t('zheng-chang'), this.$t('jin-ji'), this.$t('zhong-yao'), this.$t('zhong-yao-qie-jin-ji'), this.$t('di-feng-xian'), this.$t('zhong-feng-xian'), this.$t('gao-feng-xian')],
+    addFormVisible:false,
+    baseCostItemList:[],
+    permissions: JSON.parse(sessionStorage.getItem("permissions")),
+    addForm: {
+        name: '',
+        userId: [],
+        level:1,
+        bu:'',
+        id: '',
+        code: '',
+        projectDesc: '',
+        alarmType: 0
+    },
+    projectBaseCostData:[],
+    activeName:"baseCostPanel",
+    baseClfList:[],
+    addFormUserNames: [],
+    deptMembData: [
+        {
+            id: 0,
+            label: this.$t('lable.unassigned'),
+        }
+    ],
+    allMembData:[],
+    participator:[],
+    chosenListBackup: [], 
+    chooseParticipVisible:false,
+    rules: {
+        name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
+        code: [{ required: true, message: this.$t('qing-shu-ru-bian-hao'), trigger: "blur" }],
+        projectStageName: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
+        projectLevelName: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
+        deptId: [{ required: true, message: '请选择所属部门', trigger: "blur" }]
+    },
+    chosenMembCount:0,
+    dataDetail:{},
+    userDetailVisible:false,
+    userDetail:{},
+}
+},
+computed: {},
+watch: {},
+created () {},
+mounted () {
+    this.getList();
+    this.getProjectBaseConfigList();
+    this.getClfConfigList();
+    this.getDepartment();
+    this.getUsers();
+},
+methods: {
+    isSelectable(row,index){
+        if(row.creatorId == this.user.id || row.inchargerId == this.user.id || this.permissions.projectApprovalEdit){
+            return true
+        }else{
+            return false
+        }
+    },
+    submitInsert() {
+        this.$refs.form1.validate(valid => {
+            if (valid) {
+                this.addLoading = true;
+                let targetData = {};
+                targetData.projectName= this.addForm.name
+                if(this.addForm.projectDesc != null) {
+                    targetData.projectDesc=this.addForm.projectDesc
+                }
+                if(this.addForm.id != null) {
+                    targetData.id=this.addForm.id
+                }
+                if(this.addForm.isPublic != null) {
+                    targetData.isPublic=this.addForm.isPublic
+                }
+                if(this.addForm.userId.length != 0 && this.addForm.isPublic == 0) {
+                    let userArray=[]
+                    for(let i in this.addForm.userId){
+                        userArray.push({
+                            "userId":this.addForm.userId[i]
+                        })
+                    }
+                    targetData.participationApprovalList=userArray
+                }
+                if(this.addForm.inchargerId != null) {
+                    targetData.inchargerId=this.addForm.inchargerId
+                }
+                if(this.addForm.code != null) {
+                    targetData.projectCode=this.addForm.code
+                }
+                if(this.addForm.planStartDate != null) {
+                    targetData.planStartDate=this.addForm.planStartDate
+                }
+                if(this.addForm.planEndDate != null) {
+                    targetData.planEndDate=this.addForm.planEndDate
+                }
+                if(this.addForm.level != null) {
+                    targetData.level=this.addForm.level
+                }
+                if(this.addForm.contractAmount != null) {
+                    targetData.contractAmount=this.addForm.contractAmount
+                }
+                if (this.projectBaseCostData != null) {
+                    targetData.projectApprovalBasecostList=this.projectBaseCostData
+                    //计算总预算成本
+                    if (this.addForm.budget == null) {
+                        this.addForm.budget = 0;
+                    }
+                    targetData.budget=this.addForm.budget
+                }
+                if (this.addForm.contractAmount) {
+                    targetData.contractAmount=this.addForm.contractAmount
+                } else {
+                    targetData.contractAmount=0
+                }
+                if (this.user.timeType.outputValueStatus == 1){
+                    targetData.outputValue=this.addForm.outputValue ? this.addForm.outputValue : 0
+                }
+                //日报审核人
+                if (this.addForm.auditUserIds) {
+                    targetData.auditUserIds=this.addForm.auditUserIds
+                }
+                if(this.addForm.auditUserIds.length != 0) {
+                    let userArray=[]
+                    for(let i in this.addForm.auditUserIds){
+                        userArray.push({
+                            "auditorId":this.addForm.auditUserIds[i]
+                        })
+                    }
+                    targetData.projectApprovalAuditorList=userArray
+                }
+                if(this.addForm.category != null) {
+                    targetData.category=this.addForm.category
+                }
+                this.http.JSONPost("/project-approval/editProjectApproval",targetData,
+                res => {
+                    this.addLoading = false;
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: (this.addForm.id!=null?this.$t('xiu-gai'):this.$t('create'))+this.$t('other.successful'),
+                            type: "success"
+                        });
+                        this.addFormVisible = false;
+                        this.getList();
+                        if (this.user.company.packageEngineering == 1) {
+                            this.saveProjectProfessions(res.data);
+                        }
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.addLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            }
+        });
+    },
+    // 获取分类条目
+    getClfConfigList() {
+        this.http.get('/project-category/list',
+            res => {
+                if (res.code == "ok") {
+                    this.baseClfList = res.data;
+                //    console.log("获取分类条目",res.data);
+                    this.$forceUpdate();
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            },
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+                }
+            );
+        
+    },
+    //分页
+    handleCurrentChange(val) {
+        this.page = val;
+        this.getList();
+    },
+
+    handleSizeChange(val) {
+        this.size = val;
+        localStorage.projectPageSize = this.size;
+        this.page = 1
+        this.getList();
+    },
+    getProjectBaseConfigList() {
+        this.http.post('/project-basecost-setting/list',{},
+            res => {
+                if (res.code == "ok") {
+                    this.baseCostItemList = res.data;
+                    this.$forceUpdate();
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            },
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            }
+        );
+    },
+    //显示新增界面
+    handleAdd(i, item) {
+        if(i == -1) {
+            this.title = this.$t('newproject');
+            this.addForm = {
+                name: '',
+                isPublic:0,
+                userId: [],
+                userNames:'',
+                code:'',
+                inchargerId:null,
+                level: this.user.timeType.projectLevelState == 1 ? (this.levelList.length > 0 ? this.levelList[0].id : null) : 1,
+                customerId:null,
+                notifyUserNames:'',
+                chosenLeaders:[],
+                category:null,
+                creatorId: this.user.id,
+                projectMainId: '',
+                outputValue: '',
+                bu: [],
+                manDay:0,
+                fromOutside: 0,
+            }
+            this.projectBaseCostData = [];
+            this.auseList = [];
+            for (var m=0;m<this.baseCostItemList.length; m++) {
+                this.projectBaseCostData.push({baseId: this.baseCostItemList[m].id, baseName:this.baseCostItemList[m].name, baseAmount:0});
+            }
+        } else {
+            this.http.post('/project-approval/getDetail', {id: item.id},
+            res => {
+            if (res.code == "ok") {
+                this.dataDetail=res.data
+            }
+            });
+            var arr=[]
+            var names=""
+            var auditorArr=[]
+            if(this.dataDetail.participationApprovalList){
+                for(let i in this.dataDetail.participationApprovalList){
+                    arr.push(this.dataDetail.participationApprovalList[i].userId);
+                }
+                this.participator=this.dataDetail.participationApprovalList
+            }
+            if(this.dataDetail.participationApprovalList){
+                for(let i in this.dataDetail.participationApprovalList){
+                    names+=this.dataDetail.participationApprovalList[i].userName+",";
+                }
+            }
+            // if (names.length > 0) {
+            //     names = names.substring(0, names.length -1);
+            // }
+            if(this.dataDetail.projectApprovalAuditorList){
+                for(let i in this.dataDetail.projectApprovalAuditorList){
+                    auditorArr.push(this.dataDetail.projectApprovalAuditorList[i].auditorId)
+                }
+            }
+            if (names.length > 0) {
+                names = names.substring(0, names.length -1);
+            }
+            this.addForm = {
+                id: item.id,
+                name: item.projectName,
+                userId: arr,
+                auditUserIds:auditorArr,
+                userNames:names,
+                isPublic: item.isPublic,
+                code:item.projectCode,
+                inchargerId: item.inchargerId,
+                level: item.level,
+                planStartDate: item.planStartDate,
+                planEndDate: item.planEndDate,
+                budget: item.budget,
+                baseMan: item.baseMan,
+                contractAmount: item.contractAmount,
+                baseFee: item.baseFee,
+                baseRisk1: item.baseRisk1,
+                baseRisk2: item.baseRisk2,
+                baseOutsourcing: item.baseOutsourcing,
+                customerId:item.customerId==0?null:item.customerId,
+                category:item.category,
+                projectDesc: item.projectDesc,
+                creatorId: item.creatorId,
+                outputValue: item.outputValue,
+            }
+            this.changeParticipator();
+            this.getProjectBaseData(item.id);
+        }
+        console.log('=========>',this.participator)
+        this.addFormVisible = true;
+    },
+    //获取项目列表
+    getList() {
+        localStorage.projectPageIndex = this.page;
+        this.listLoading = true;
+        let parameter = {
+            pageIndex: this.page,
+            pageSize: this.size,
+            keyword:this.keyword,
+            searchField: this.searchField,
+            category:this.statusClf,
+            status: this.status,
+        }
+        this.http.post("/project-approval/listByPage", parameter,
+        res => {
+            this.listLoading = false;
+            if (res.code == "ok") {
+                var list = res.data.records;
+                this.list = list;
+                this.total = res.data.total;
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.listLoading = false;
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    // 项目基线合计
+    addUpfun() {
+        var total = 0;
+        for (var i=0;i<this.projectBaseCostData.length; i++) {
+            if (this.projectBaseCostData[i].baseAmount) {
+                total += parseFloat(this.projectBaseCostData[i].baseAmount);
+            }
+        }
+        this.addForm.budget = total;
+    },
+    restrictNumber(targetId) {
+        let inpu = document.getElementById(targetId);
+        inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+        inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+        inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+        inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+        if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+            inpu.value = parseFloat(inpu.value);
+        }
+    },
+    showChooseLeaderTree() {
+        this.chosenMembCount = this.chosenLeaders.length;
+        this.chooseLeaderVisible = true;
+    },
+    onLeaderTreeItemChange() {
+        var chosenList = this.$refs.chooseLeaderTree.getCheckedNodes();
+        var list = chosenList.filter(item=>item.isUser == 1);
+        this.chosenMembCount = list.length;
+    },
+
+    showChooseMembTree() {
+        this.deptMembData = JSON.parse(JSON.stringify(this.allMembData))
+        this.chosenMembCount = this.participator.length;
+        this.chooseParticipVisible = true;
+        this.filterText = ''
+        this.wxFilterText = ''
+        if(this.user.userNameNeedTranslate == 1) {
+            this.getDepartment()
+        }
+        let that = this
+        setTimeout(()=>{    
+            that.chosenListBackup = that.$refs.chooseMembTree.getCheckedNodes();
+        }, 500)
+    },
+    onTreeItemChange() {
+        var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+        var list = chosenList.filter(item=>item.isUser == 1);
+        this.chosenMembCount = list.length;
+    },
+    findUserInTree() {
+        if (this.filterName == '') {
+            this.deptMembData = this.allMembData;
+        } else {
+            var list = this.findRecursively(this.filterName, this.allMembData);
+            this.deptMembData = list;
+        }
+    },
+
+    findRecursively(username, list) {
+        var filterList = [];
+        for (var i=0;i<list.length; i++) {
+            if (list[i].isUser == 1) {
+                if (list[i].label.indexOf(username) >= 0) {
+                    //匹配上了
+                    filterList.push(list[i]);
+                }
+            } else if (list[i].children != null && list[i].children.length > 0) {
+                var subList = this.findRecursively(username, list[i].children);
+                if (subList.length > 0) {
+                    subList.forEach(s=>filterList.push(s));
+                }
+            }
+        }
+        return filterList;
+    },
+
+    //确定选择参与人
+    chooseParticip() {
+        this.chooseParticipVisible = false;
+        var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+        if(this.searchPersonnelFlg) {
+            chosenList = [...chosenList, ...this.chosenListBackup]
+        }
+        this.chosenMembList = chosenList.filter(item=>item.isUser == 1);
+        this.addForm.userNames = '';
+        this.addFormUserNames = []
+        this.addForm.userId = [];
+        this.participator = [];
+        for (var i=0;i<this.chosenMembList.length; i++) {
+            this.addForm.userId.push(this.chosenMembList[i].id);
+            this.addForm.userNames += this.chosenMembList[i].label+',';
+            this.addFormUserNames.push(this.chosenMembList[i].label)
+            var item = {id:this.chosenMembList[i].id, name:this.chosenMembList[i].label};
+            this.participator.push(item);
+        }
+        if (this.addForm.userNames.length > 0) {
+            this.addForm.userNames = this.addForm.userNames.substring(0, this.addForm.userNames.length-1);
+        }
+    },
+    // 获取部门列表
+    getDepartment() {
+        this.http.post("/department/listAllMemb", {},
+        res => {
+            if (res.code == "ok") {
+                var list = res.data;
+                //设置员工到部门下面
+                this.setUserToDept(list);
+                this.deptMembData = list;
+                console.log(this.deptMembData, '看看数据')
+                
+                //用于筛选过滤
+                this.allMembData = JSON.parse(JSON.stringify(this.deptMembData));
+            } else {
+                this.$message({
+                    message: res.msg,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    onTreeItemChange() {
+        var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+        var list = chosenList.filter(item=>item.isUser == 1);
+        this.chosenMembCount = list.length;
+    },
+    findUserInTree() {
+        if (this.filterName == '') {
+            this.deptMembData = this.allMembData;
+        } else {
+            var list = this.findRecursively(this.filterName, this.allMembData);
+            this.deptMembData = list;
+        }
+    },
+    addPersonCheck(){
+        var chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+        var list = chosenList.filter(item=>item.isUser == 1);
+        this.chosenMembCount = list.length;
+        // console.log(list);
+    },
+    addPersonSure(){
+        this.addGroupPersonPdialog = false
+        let chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+        let list = chosenList.filter(item=>item.isUser == 1);
+        let listIDs = []
+        let listNames = ''
+        let listNamesList = []
+        for(let i=0;i<list.length;i++){
+            listIDs.push(list[i].id)
+            listNames += list[i].label + ','
+            listNamesList.push(list[i].label)
+        }
+        this.addGroupPersonData.person = listIDs
+        this.addGroupPersonData.personNames = listNames
+        this.addGroupPersonDataPersonNames = listNamesList
+        console.log('触发', this.addGroupPersonDataPersonNames)
+    },
+    // 企业微信搜索
+    echartDepartment() {
+        console.log('我点击了搜索')
+        if(this.filterText != '') {
+            this.http.post("/user/getEmployeeList", {
+                keyword: this.filterText,
+                cursor: '',
+                departmentId: -1,
+                pageIndex: 1,
+                pageSize: 1000
+            },
+            res => {
+                if (res.code == "ok") {
+                    this.filterNodePersonnel = res.data.records.map(item => item.name)
+                    this.$refs.chooseMembTree.filter(this.filterText);
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            },
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+        } else {
+            this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
+            this.searchPersonnelFlg = false
+            this.getDepartment()
+        }
+    },
+    setUserToDept(list) {
+        for (var i in list) {
+            if (list[i].children != null) {
+                this.setUserToDept(list[i].children);
+            }
+            
+            if (list[i].userList != null) {
+                if (list[i].children == null) {
+                    list[i].children = [];
+                }
+                list[i].userList.forEach(element => {
+                    var obj = {id: element.id, label:element.name, parentId:element.departmentId, isUser:1};
+                    list[i].children.push(obj);
+                });
+            }
+        }
+    },
+    formDataToObject(formData) {
+        const object = {};
+        for (const [key, value] of formData.entries()) {
+            if (key in object) {
+            object[key] = [].concat(object[key], value);
+            } else {
+            object[key] = value;
+            }
+        }
+        return object;
+    },
+    searchList() {
+        this.page = 1;
+        this.getList();
+    },
+    // 分类筛选
+    searchClfList(){
+        this.page = 1;
+        this.getList();
+    },
+    getUsers() {
+        // this.http.post(this.port.manage.list, {
+        //     departmentId: -1,
+        //     pageIndex: 1,
+        //     // pageSize: 99999
+        //     pageSize: -1
+        // },
+        this.http.post('/user/getSimpleActiveUserList', {},
+        res => {
+            if (res.code == "ok") {
+                this.users = res.data;
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    // 自定义组件事件
+    selectCal(obj) {
+        if(obj.distinction == '1') {
+            this.inchagerId = obj.id
+            this.manageSelect()
+        } else if(obj.distinction == '2') {
+            this.participationId = obj.id
+            this.participationSelect()
+        } else if(obj.distinction == '3') {
+            this.addForm.inchargerId = obj.id
+            // console.log(this.participator)
+            this.participator = JSON.parse(JSON.stringify(this.participator))
+        } else if(obj.distinction =='4') {
+            this.projectProfessionList[obj.other].inchargerId = obj.id
+        } else if(obj.distinction =='5') {
+            this.paramInchargerId = obj.id
+        }else if(obj.distinction =='6') {
+            this.hasSetGroupInchargerId = obj.id
+        } else if(obj.distinction == '10') {
+            let userList = obj.arrUserList
+            let arr = []
+            for(var i in userList) {
+                arr.push(userList[i].id)
+            }
+            this.participator = JSON.parse(JSON.stringify(this.participator))
+            this.addForm.auditUserIds = arr
+        } else if(obj.distinction == '11') {
+            let userList = obj.id
+            console.log(obj)
+            this.curProfessionRow.membList[obj.other].membId = userList
+        }
+    },
+    getProjectBaseData(projectId) {
+        this.http.post('//project-approval-basecost/get',{projectId: projectId},
+                res => {
+                    if (res.code == "ok") {
+                        this.projectBaseCostData = res.data;
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+    },
+    selectPublic() {
+        if (this.addForm.isPublic == 1) {
+            this.participator = this.users;
+        } else {
+            this.participator = [];
+        }
+    },
+    //选择参与人
+    changeParticipator() {
+        //检查是否在参与人中,如果没有需要加入到参与人中
+        // console.log('addform',this.addForm.userId,this.users);
+        this.participator = [];
+        this.addForm.userId.forEach(u=>{
+            var list = this.users.filter(au=>au.id == u);
+            if (list.length > 0) {
+                var findUser = list[0];    
+                this.participator.push(findUser);
+            } else {
+                console.log('未找到用户: '+u);
+            }
+            
+        })
+    },
+    //显示用户详情
+    showUser(userId) {
+        this.userDetailVisible = true;
+        this.http.post(this.port.manage.userDetail, {
+            userId: userId
+        },
+        res => {
+            if (res.code == "ok") {
+                this.userDetail = res.data;
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+},
+}
+</script>
+<style scoped lang='sass'>
+</style>
+<style>
+.toolbar_formitem_n1{
+    margin-right: 0 !important;
+}
+</style>