diff --git a/src/main/java/cn/palmte/work/config/activiti/ActConstant.java b/src/main/java/cn/palmte/work/config/activiti/ActConstant.java
index f2e1dc7..c51e9b8 100644
--- a/src/main/java/cn/palmte/work/config/activiti/ActConstant.java
+++ b/src/main/java/cn/palmte/work/config/activiti/ActConstant.java
@@ -51,4 +51,23 @@ public class ActConstant {
     public static final String NUMBER_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
 
 
+    /**
+     * 概算
+     */
+    public static final String PROCESS_DEFKEY_ESTIMATE = "estimate";
+    /**
+     * 预算
+     */
+    public static final String PROCESS_DEFKEY_BUDGET   = "budget";
+    /**
+     * 结算
+     */
+    public static final String PROCESS_DEFKEY_SETTLE   = "settle";
+    /**
+     * 决算
+     */
+    public static final String PROCESS_DEFKEY_FINAL    = "final";
+
+    public static final String KEY_PROJECT_ID = "projectId";
+    public static final String KEY_PROJECT_TYPE = "projectType";
 }
diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
index 897ebc8..3280232 100644
--- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
+++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
@@ -109,9 +109,8 @@ public class ProjectController extends BaseController{
      * 预算保存并提交审核
      */
     @RequestMapping("/estimateAddSaveAndApprove")
-    public String estimateAddSaveAndApprove(Project project, EstimateBean estimateBean, Map<String, Object> model) {
-        projectService.estimateAddSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_PENDING);
-        //TODO 发起审核
+    public String estimateAddSaveAndApprove(Project project, EstimateBean estimateBean, Map<String, Object> model) throws Exception {
+        projectService.estimateAddSaveAndApprove(project, estimateBean, InterfaceUtil.getAdmin());
         return "redirect:/project/list";
     }
 
@@ -133,9 +132,8 @@ public class ProjectController extends BaseController{
     }
 
     @RequestMapping("/estimateEditSaveAndApprove")
-    public String estimateEditSaveAndApprove(Project project, EstimateBean estimateBean, Map<String, Object> model) {
-        projectService.estimateEditSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_PENDING);
-        //TODO 发起审核
+    public String estimateEditSaveAndApprove(Project project, EstimateBean estimateBean, Map<String, Object> model) throws Exception {
+        projectService.estimateEditSaveAndApprove(project, estimateBean, InterfaceUtil.getAdmin());
         return "redirect:/project/list";
     }
 
@@ -181,8 +179,8 @@ public class ProjectController extends BaseController{
      * 进行项目预算保存并提交审核
      */
     @RequestMapping("/budgetEditSaveAndApprove")
-    public String budgetEditSaveAndApprove(Project project, BudgetBean budgetBean, Map<String, Object> model) {
-        projectService.budgetEditSave(project, budgetBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_PENDING);
+    public String budgetEditSaveAndApprove(Project project, BudgetBean budgetBean, Map<String, Object> model) throws Exception {
+        projectService.budgetEditSaveAndApprove(project, budgetBean, InterfaceUtil.getAdmin());
         return "redirect:/project/list";
     }
 
diff --git a/src/main/java/cn/palmte/work/model/ProjectInstanceRelation.java b/src/main/java/cn/palmte/work/model/ProjectInstanceRelation.java
new file mode 100644
index 0000000..710bbfe
--- /dev/null
+++ b/src/main/java/cn/palmte/work/model/ProjectInstanceRelation.java
@@ -0,0 +1,80 @@
+package cn.palmte.work.model;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 项目与流程实例的关系
+ */
+@Entity
+@Table(name = "project_instance_relation")
+public class ProjectInstanceRelation {
+    /**
+     * id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @GenericGenerator(name = "persistenceGenerator", strategy = "increment")
+    private Integer id;
+
+    @Column(name = "project_id")
+    private int projectId;
+
+    /**
+     * 流程类型:estimate、budget、settle、final
+     */
+    @Column(name = "process_type")
+    private String processType;
+
+    /**
+     * 流程实例id
+     */
+    @Column(name = "process_ins_id")
+    private String processInsId;
+
+    @Column(name = "create_time")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public int getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(int projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProcessType() {
+        return processType;
+    }
+
+    public void setProcessType(String processType) {
+        this.processType = processType;
+    }
+
+    public String getProcessInsId() {
+        return processInsId;
+    }
+
+    public void setProcessInsId(String processInsId) {
+        this.processInsId = processInsId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java b/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java
new file mode 100644
index 0000000..875236d
--- /dev/null
+++ b/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java
@@ -0,0 +1,6 @@
+package cn.palmte.work.model;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ProjectInstanceRelationRepository extends JpaRepository<ProjectInstanceRelation,Integer> {
+}
diff --git a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java
new file mode 100644
index 0000000..2b73f39
--- /dev/null
+++ b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java
@@ -0,0 +1,67 @@
+package cn.palmte.work.service;
+
+import cn.palmte.work.config.activiti.ActConstant;
+import cn.palmte.work.model.Admin;
+import cn.palmte.work.model.Project;
+import cn.palmte.work.model.ProjectInstanceRelation;
+import cn.palmte.work.model.ProjectInstanceRelationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * @author xiongshiyan at 2021/10/29 , contact me with email yanshixiong@126.com or phone 15208384257
+ */
+@Service
+public class ProjectInstanceService {
+    @Autowired
+    private ActProcInsService actProcInsService;
+    @Autowired
+    private ProjectInstanceRelationRepository projectInstanceRelationRepository;
+
+
+    /**
+     * 开启一个概算流程实例
+     */
+    public void startEstimateProcessInstance(Project p, Admin admin) throws Exception {
+        startProcess(p, admin, ActConstant.PROCESS_DEFKEY_ESTIMATE);
+    }
+    /**
+     * 开启一个预算流程实例
+     */
+    public void startBudgetProcessInstance(Project p, Admin admin) throws Exception {
+        startProcess(p, admin, ActConstant.PROCESS_DEFKEY_BUDGET);
+    }
+    /**
+     * 开启一个结算流程实例
+     */
+    public void startSettleProcessInstance(Project p, Admin admin) throws Exception {
+        startProcess(p, admin, ActConstant.PROCESS_DEFKEY_SETTLE);
+    }
+    /**
+     * 开启一个决算流程实例
+     */
+    public void startFinalProcessInstance(Project p, Admin admin) throws Exception {
+        startProcess(p, admin, ActConstant.PROCESS_DEFKEY_FINAL);
+    }
+
+    private void startProcess(Project p, Admin admin, String processDefkey) throws Exception {
+        HashMap<String, Object> variables = new HashMap<>();
+        variables.put(ActConstant.START_PROCESS_USERID, admin.getId());
+        variables.put(ActConstant.KEY_PROJECT_ID, p.getId());
+        variables.put(ActConstant.KEY_PROJECT_TYPE, p.getType());
+
+        String processInstanceId = actProcInsService.startProcessInstance(processDefkey, variables);
+
+        //保存流程实例id与项目的关联关系
+        ProjectInstanceRelation relation = new ProjectInstanceRelation();
+        relation.setProjectId(p.getId());
+        relation.setProcessType(processDefkey);
+        relation.setProcessInsId(processInstanceId);
+        relation.setCreateTime(new Date());
+        projectInstanceRelationRepository.saveAndFlush(relation);
+    }
+
+}
diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java
index 97ac1b5..d9b9427 100644
--- a/src/main/java/cn/palmte/work/service/ProjectService.java
+++ b/src/main/java/cn/palmte/work/service/ProjectService.java
@@ -1,9 +1,8 @@
 package cn.palmte.work.service;
 
 import cn.palmte.work.bean.*;
-import cn.palmte.work.model.Admin;
-import cn.palmte.work.model.Project;
-import cn.palmte.work.model.ProjectRepository;
+import cn.palmte.work.config.activiti.ActConstant;
+import cn.palmte.work.model.*;
 import cn.palmte.work.utils.InterfaceUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -14,6 +13,7 @@ import top.jfunc.common.db.utils.Pagination;
 import top.jfunc.common.utils.StrUtil;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -30,6 +30,8 @@ public class ProjectService {
     private ProjectEstimateService projectEstimateService;
     @Autowired
     private ProjectBudgetService projectBudgetService;
+    @Autowired
+    private ProjectInstanceService projectInstanceService;
 
 
     private QueryHelper getQueryHelper(Map<String, String> searchInfo, int pageNumber, int pageSize) {
@@ -115,17 +117,48 @@ public class ProjectService {
         return projectRepository.findOne(id);
     }
 
+    /**
+     * 新增概算保存项目并发起审核
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    public Project estimateAddSaveAndApprove(Project project,
+                                             EstimateBean estimateBean,
+                                             Admin admin) throws Exception {
+        Project p = estimateAddSave(project, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING);
+
+        projectInstanceService.startEstimateProcessInstance(p, admin);
+
+        return project;
+    }
+
     /**
      * 新增概算保存项目
      */
     @Transactional(rollbackFor = RuntimeException.class)
-    public Project estimateAddSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) {
+    public Project estimateAddSave(Project project,
+                                   EstimateBean estimateBean,
+                                   Admin admin,
+                                   ApproveStatusEnum approveStatusEnum) {
         Project p = addProject(project, admin, approveStatusEnum);
         projectEstimateService.saveEstimate(p, estimateBean);
 
         return project;
     }
 
+    /**
+     * 编辑概算保存项目并发起审核
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    public Project estimateEditSaveAndApprove(Project project,
+                                    EstimateBean estimateBean,
+                                    Admin admin) throws Exception {
+        Project p = estimateEditSave(project, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING);
+
+        //TODO 此处找到以前的概算审批实例,然后完成任务
+        //projectInstanceService.startEstimateProcessInstance(p, admin);
+
+        return p;
+    }
     /**
      * 编辑概算保存项目
      */
@@ -146,6 +179,10 @@ public class ProjectService {
         projectEstimateService.saveEstimate(p, estimateBean);
         return p;
     }
+
+
+
+
     private Project addProject(Project project, Admin admin, ApproveStatusEnum approveStatusEnum) {
         project.setTypeDesc(TypeEnum.parseType(project.getType()).getTypeDesc());
         project.setStatus(StatusEnum.CREATED.getStatus());
@@ -193,6 +230,15 @@ public class ProjectService {
         return p;
     }
 
+    /**
+     * 编辑预算保存项目并审核
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    public Project budgetEditSaveAndApprove(Project project, BudgetBean budgetBean, Admin admin) throws Exception {
+        Project p = budgetEditSave(project, budgetBean, admin, ApproveStatusEnum.APPROVAL_PENDING);
+        projectInstanceService.startBudgetProcessInstance(p, admin);
+        return p;
+    }
     /**
      * 编辑预算保存项目
      */