Browse Source

11482-【CR】【投资系统】增加审批流程-投资机会和项目立项后端代码

hxy 3 tháng trước cách đây
mục cha
commit
9b31f4d997

+ 216 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ApprovalController.java

@@ -0,0 +1,216 @@
+package com.ruoyi.web.controller.project;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.enums.FileType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.flowable.service.IApprovalService;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.invest.domain.dto.ApprovalDto;
+import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectCompanyService;
+import com.ruoyi.invest.service.ITProjectContactsService;
+import com.ruoyi.invest.service.ITProjectPoolService;
+import com.ruoyi.tool.service.ITUnifyFileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 项目立项Controller
+ * 
+ * @author ruoyi
+ * @date 2025-08-08
+ */
+@Api(tags = "项目立项")
+@RestController
+@RequestMapping("/project/approval")
+public class ApprovalController extends BaseController {
+    @Autowired
+    private IApprovalService approvalService;
+
+    @Autowired
+    private ITProjectCompanyService tProjectCompanyService;
+
+    @Autowired
+    private ITProjectContactsService tProjectContactsService;
+
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ITProjectPoolService tProjectPoolService;
+
+
+    //我的待办任务
+    @ApiOperation("我的待办任务列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyTaskList")
+    public TableDataInfo getMyTaskList(TProjectApproval tProjectApproval)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<ProjectApprovalVo> list=approvalService.getMyTaskList(getUserId().toString(),tProjectApproval);
+        return getDataTable(list);
+    }
+    //我的已办任务
+    @ApiOperation("我的已办任务列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyDoneTaskList")
+    public TableDataInfo getMyDoneTaskList(TProjectApproval tProjectApproval)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<ProjectApprovalVo> list=approvalService.getMyDoneTaskList(getUserId().toString(),tProjectApproval);
+        return getDataTable(list);
+    }
+    //我的待办任务
+    @ApiOperation("我的单据列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyList")
+    public TableDataInfo getMyList(TProjectApproval tProjectApproval)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<ProjectApprovalVo> list=approvalService.getMyList(getUserId().toString(),tProjectApproval);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取项目池详细信息
+     */
+    @ApiOperation("获取项目池详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:pool:query')")
+    @GetMapping(value = "/{pInstId}")
+    public AjaxResult getInfo(@PathVariable("pInstId") String pInstId)
+    {
+        return success(approvalService.selectTProjectApprovalByProcInstId(pInstId));
+    }
+    //发起流程
+    @ApiOperation(value = "投资机会申请发起流程")
+    @Log(title = "发起流程", businessType = BusinessType.INSERT)
+    @PostMapping("/start")
+    public AjaxResult start(@RequestBody TProjectApproval tProjectApproval) {
+
+       //return approvalService.set
+        return approvalService.start(tProjectApproval);
+    }
+    /**
+     * 新增项目池
+     */
+    @ApiOperation("新增项目池")
+    @PreAuthorize("@ss.hasPermi('invest:pool:add')")
+    @Log(title = "项目池", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectPool tProjectPool)
+    {
+        // todo 设置主键及创建人
+        tProjectPool.setCreateBy(getNickName());
+        tProjectPool.setId(IdUtils.fastSimpleUUID());
+        int number = tProjectPoolService.selectTProjectPoolCode(DateUtils.lastTwoDigits()+"-");
+        tProjectPool.setProjectCode(tProjectPool.getProjectGroup() + "-" + DateUtils.lastTwoDigits() + "-" + String.format("%03d",number+1));
+        TProjectCompany tProjectCompany = tProjectPool.gettProjectCompany();
+        tProjectCompany.setCreateBy(getNickName());
+        tProjectCompany.setId(IdUtils.fastSimpleUUID());
+        TProjectContacts tProjectContacts = tProjectPool.gettProjectContacts();
+        tProjectContacts.setCreateBy(getNickName());
+        tProjectContacts.setId(IdUtils.fastSimpleUUID());
+        // todo 设置项目联系人
+        tProjectPool.setProjectContacts(tProjectContacts.getId());
+        // todo 设置公司信息关联关系
+        tProjectCompany.setProjectPoolId(tProjectPool.getId());
+
+        // todo 保存公司附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getListFile(),
+                tProjectPool.getId(),
+                tProjectCompany.getId(),
+                String.valueOf(FileType.COMPANY.ordinal()),
+                getNickName());
+
+        // todo 保存BP附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getBpFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.BP.ordinal()),
+                getNickName());
+
+        // todo 保存其他附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getOtherFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.OTHER.ordinal()),
+                getNickName());
+
+        tProjectCompanyService.insertTProjectCompany(tProjectCompany);
+        tProjectContactsService.insertTProjectContacts(tProjectContacts);
+        // todo 增加项目创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目报备",getNickName());
+
+        return toAjax(tProjectPoolService.insertTProjectPool(tProjectPool));
+    }
+    @ApiOperation(value = "审批任务")
+    @PutMapping(value = "/complete")
+    public AjaxResult complete(@RequestBody ApprovalDto dto, HttpServletRequest request) {
+        // 从 DTO 中拆分参数
+        TProjectApproval tProjectApproval = dto.getProjectApproval();
+        TProjectMeeting tProjectMeeting = dto.getProjectMeeting();
+        TProjectScoring tProjectScoring =dto.getProjectScoring();
+        FlowBaseInfo flowBaseInfo= dto.getFlowBaseInfo();
+        return approvalService.complete(tProjectApproval,tProjectMeeting,tProjectScoring,flowBaseInfo,request);
+    }
+    /**
+     * 修改项目池
+     */
+    @ApiOperation("修改项目池")
+    @PreAuthorize("@ss.hasPermi('invest:pool:edit')")
+    @Log(title = "项目池", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectPool tProjectPool)
+    {
+        tProjectPool.setUpdateBy(getNickName());
+        TProjectCompany tProjectCompany = tProjectPool.gettProjectCompany();
+        tProjectCompany.setUpdateBy(getNickName());
+        TProjectContacts tProjectContacts = tProjectPool.gettProjectContacts();
+        tProjectContacts.setUpdateBy(getNickName());
+        tProjectContacts.setId(tProjectPool.getProjectContacts());
+        // 上传并返回新文件名称
+        // todo 保存公司附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getListFile(),
+                tProjectPool.getId(),
+                tProjectCompany.getCompanyId(),
+                String.valueOf(FileType.COMPANY.ordinal()),
+                getNickName());
+
+        // todo 保存BP附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getBpFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.BP.ordinal()),
+                getNickName());
+
+        // todo 保存其他附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getOtherFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.OTHER.ordinal()),
+                getNickName());
+
+        tProjectCompanyService.updateTProjectCompany(tProjectCompany);
+        tProjectContactsService.updateTProjectContacts(tProjectContacts);
+        return toAjax(tProjectPoolService.updateTProjectPool(tProjectPool));
+    }
+
+}

+ 229 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/InvestmentOpportunityController.java

@@ -0,0 +1,229 @@
+package com.ruoyi.web.controller.project;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.enums.FileType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.flowable.domain.vo.FlowTaskVo;
+import com.ruoyi.flowable.service.IInvestmentOpportunityService;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.invest.domain.dto.InvestDto;
+import com.ruoyi.invest.service.*;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.tool.service.ITUnifyFileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 项目池Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Api(tags = "投资机会")
+@RestController
+@RequestMapping("/project/investmentOpportunity")
+public class InvestmentOpportunityController extends BaseController
+{
+    @Autowired
+    private IInvestmentOpportunityService investmentOpportunityService;
+
+    @Autowired
+    private ITProjectCompanyService tProjectCompanyService;
+
+    @Autowired
+    private ITProjectContactsService tProjectContactsService;
+
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ITProjectPoolService tProjectPoolService;
+
+
+    //我的待办任务
+    @ApiOperation("我的待办任务列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyTaskList")
+    public TableDataInfo getMyTaskList(TProjectPool tProjectPool)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<TProjectPoolVo> list=investmentOpportunityService.getMyTaskList(getUserId().toString(),tProjectPool);
+        return getDataTable(list);
+    }
+    //我的已办任务
+    @ApiOperation("我的已办任务列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyDoneTaskList")
+    public TableDataInfo getMyDoneTaskList(TProjectPool tProjectPool)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<TProjectPoolVo> list=investmentOpportunityService.getMyDoneTaskList(getUserId().toString(),tProjectPool);
+        return getDataTable(list);
+    }
+    //我的待办任务
+    @ApiOperation("我的单据列表")
+    @PreAuthorize("@ss.hasPermi('invest:pool:list')")
+    @GetMapping("/getMyList")
+    public TableDataInfo getMyList(TProjectPool tProjectPool)
+    {
+        startPage();
+        //tProjectPool.setProjectStage("1");
+        List<TProjectPoolVo> list=investmentOpportunityService.getMyList(getUserId().toString(),tProjectPool);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取项目池详细信息
+     */
+    @ApiOperation("获取项目池详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:pool:query')")
+    @GetMapping(value = "/{pInstId}")
+    public AjaxResult getInfo(@PathVariable("pInstId") String pInstId)
+    {
+        return success(investmentOpportunityService.selectTProjectPoolByProcInstId(pInstId));
+    }
+    //发起流程
+    @ApiOperation(value = "投资机会申请发起流程")
+    @Log(title = "发起流程", businessType = BusinessType.INSERT)
+    @PostMapping("/start")
+    public AjaxResult start(
+                            @RequestBody TProjectPool tProjectPool
+                            ) {
+
+       //return investmentOpportunityService.set
+        return investmentOpportunityService.start(tProjectPool);
+    }
+    /**
+     * 新增项目池
+     */
+    @ApiOperation("新增项目池")
+    @PreAuthorize("@ss.hasPermi('invest:pool:add')")
+    @Log(title = "项目池", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectPool tProjectPool)
+    {
+        // todo 设置主键及创建人
+        tProjectPool.setCreateBy(getNickName());
+        tProjectPool.setId(IdUtils.fastSimpleUUID());
+        int number = tProjectPoolService.selectTProjectPoolCode(DateUtils.lastTwoDigits()+"-");
+        tProjectPool.setProjectCode(tProjectPool.getProjectGroup() + "-" + DateUtils.lastTwoDigits() + "-" + String.format("%03d",number+1));
+        TProjectCompany tProjectCompany = tProjectPool.gettProjectCompany();
+        tProjectCompany.setCreateBy(getNickName());
+        tProjectCompany.setId(IdUtils.fastSimpleUUID());
+        TProjectContacts tProjectContacts = tProjectPool.gettProjectContacts();
+        tProjectContacts.setCreateBy(getNickName());
+        tProjectContacts.setId(IdUtils.fastSimpleUUID());
+        // todo 设置项目联系人
+        tProjectPool.setProjectContacts(tProjectContacts.getId());
+        // todo 设置公司信息关联关系
+        tProjectCompany.setProjectPoolId(tProjectPool.getId());
+
+        // todo 保存公司附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getListFile(),
+                tProjectPool.getId(),
+                tProjectCompany.getId(),
+                String.valueOf(FileType.COMPANY.ordinal()),
+                getNickName());
+
+        // todo 保存BP附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getBpFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.BP.ordinal()),
+                getNickName());
+
+        // todo 保存其他附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getOtherFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.OTHER.ordinal()),
+                getNickName());
+
+        tProjectCompanyService.insertTProjectCompany(tProjectCompany);
+        tProjectContactsService.insertTProjectContacts(tProjectContacts);
+        // todo 增加项目创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目报备",getNickName());
+
+        return toAjax(tProjectPoolService.insertTProjectPool(tProjectPool));
+    }
+    @ApiOperation(value = "审批任务")
+    @PutMapping(value = "/complete")
+    public AjaxResult complete(@RequestBody InvestDto dto, HttpServletRequest request) {
+        // 从 DTO 中拆分参数
+        TProjectPool tProjectPool = dto.getProjectPool();
+        TProjectReview tProjectReview = dto.getProjectReview();
+        FlowBaseInfo flowBaseInfo= dto.getFlowBaseInfo();
+        return investmentOpportunityService.complete(tProjectPool,tProjectReview,flowBaseInfo,request);
+    }
+    /**
+     * 修改项目池
+     */
+    @ApiOperation("修改项目池")
+    @PreAuthorize("@ss.hasPermi('invest:pool:edit')")
+    @Log(title = "项目池", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectPool tProjectPool)
+    {
+        tProjectPool.setUpdateBy(getNickName());
+        TProjectCompany tProjectCompany = tProjectPool.gettProjectCompany();
+        tProjectCompany.setUpdateBy(getNickName());
+        TProjectContacts tProjectContacts = tProjectPool.gettProjectContacts();
+        tProjectContacts.setUpdateBy(getNickName());
+        tProjectContacts.setId(tProjectPool.getProjectContacts());
+        // 上传并返回新文件名称
+        // todo 保存公司附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getListFile(),
+                tProjectPool.getId(),
+                tProjectCompany.getCompanyId(),
+                String.valueOf(FileType.COMPANY.ordinal()),
+                getNickName());
+
+        // todo 保存BP附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getBpFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.BP.ordinal()),
+                getNickName());
+
+        // todo 保存其他附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectPool.getOtherFile(),
+                tProjectPool.getId(),
+                tProjectPool.getId(),
+                String.valueOf(FileType.OTHER.ordinal()),
+                getNickName());
+
+        tProjectCompanyService.updateTProjectCompany(tProjectCompany);
+        tProjectContactsService.updateTProjectContacts(tProjectContacts);
+        return toAjax(tProjectPoolService.updateTProjectPool(tProjectPool));
+    }
+
+
+
+
+
+
+
+}

+ 60 - 0
ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/ApprovalTaskListener.java

@@ -0,0 +1,60 @@
+package com.ruoyi.flowable.listener;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import com.ruoyi.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.delegate.TaskListener;
+import org.flowable.task.service.delegate.DelegateTask;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 任务监听器
+ *
+ * create(创建):在任务被创建且所有的任务属性设置完成后才触发
+ * assignment(指派):在任务被分配给某个办理人之后触发
+ * complete(完成):在配置了监听器的上一个任务完成时触发
+ * delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
+ *
+ * @author Tony
+ * @date 2021/4/20
+ */
+@Slf4j
+@Component
+public class ApprovalTaskListener implements TaskListener{
+    private static ISysUserService sysUserService;
+    private static SysDeptMapper sysDeptMapper;
+    @Autowired
+    public void setSysUserService(ISysUserService sysUserService) {
+        ApprovalTaskListener.sysUserService = sysUserService;
+    }
+    @Autowired
+    public void setSysDeptMapper(SysDeptMapper sysDeptMapper) {
+        ApprovalTaskListener.sysDeptMapper = sysDeptMapper;
+    }
+    @Override
+    public void notify(DelegateTask delegateTask) {
+
+        log.info("任务监听器:{}", delegateTask);
+        // TODO  获取事件类型 delegateTask.getEventName(),可以通过监听器给任务执行人发送相应的通知消息
+        String eventName= delegateTask.getEventName();
+        String taskDefKey= delegateTask.getTaskDefinitionKey();
+        Object obj = delegateTask.getVariable("INITIATOR");
+        SysUser user = sysUserService.selectUserById((Long) obj);
+        if("deptLeader".equals(taskDefKey)) {//部门负责人、
+            //部门负责人
+            String leader=sysDeptMapper.selectDeptLeader("投资部");
+            SysUser leaderUser=sysUserService.selectUserByUserName(leader);
+            delegateTask.setAssignee(leaderUser.getUserId().toString());
+        }else if("meeting".equals(taskDefKey)){
+            delegateTask.setAssignee(user.getUserId().toString());
+        }else if("file".equals(taskDefKey)){
+            delegateTask.setAssignee(user.getUserId().toString());
+        }
+
+    }
+
+}

+ 38 - 0
ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IApprovalService.java

@@ -0,0 +1,38 @@
+package com.ruoyi.flowable.service;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目池Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface IApprovalService
+{
+    List<ProjectApprovalVo> getMyTaskList(String userId, TProjectApproval tProjectApproval);
+    List<ProjectApprovalVo> getMyDoneTaskList(String userId, TProjectApproval tProjectApproval);
+    List<ProjectApprovalVo> getMyList(String userId,TProjectApproval tProjectApproval);
+
+    TProjectApproval selectTProjectApprovalByProcInstId(String pInstId);
+    /**
+     * 新增立项申请
+     *
+     * @param tProjectApproval 立项申请
+     * @return 结果
+     */
+
+    AjaxResult start(TProjectApproval tProjectApproval);
+    AjaxResult complete(TProjectApproval tProjectApproval, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow, HttpServletRequest request);
+
+
+
+
+}

+ 33 - 0
ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IInvestmentOpportunityService.java

@@ -0,0 +1,33 @@
+package com.ruoyi.flowable.service;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.invest.domain.FlowBaseInfo;
+import com.ruoyi.invest.domain.TProjectPool;
+import com.ruoyi.invest.domain.TProjectReview;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目池Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface IInvestmentOpportunityService
+{
+    List<TProjectPoolVo> getMyTaskList(String userId, TProjectPool tProjectPool);
+    List<TProjectPoolVo> getMyDoneTaskList(String userId, TProjectPool tProjectPool);
+    List<TProjectPoolVo> getMyList(String userId,TProjectPool tProjectPool);
+
+    TProjectPool selectTProjectPoolByProcInstId(String pInstId);
+
+    AjaxResult start(TProjectPool tProjectPool);
+    AjaxResult complete(TProjectPool tProjectPool, TProjectReview tProjectReview, FlowBaseInfo flow, HttpServletRequest request);
+
+
+
+
+}

+ 341 - 0
ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/ApprovalServiceImpl.java

@@ -0,0 +1,341 @@
+package com.ruoyi.flowable.service.impl;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.FileType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.flowable.common.constant.ProcessConstants;
+import com.ruoyi.flowable.common.constant.UUIDGenerator;
+import com.ruoyi.flowable.common.enums.FlowStatusEnum;
+import com.ruoyi.flowable.factory.FlowServiceFactory;
+import com.ruoyi.flowable.service.IFlowInstanceService;
+import com.ruoyi.flowable.service.IFlowService;
+import com.ruoyi.flowable.service.IApprovalService;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
+import com.ruoyi.invest.mapper.ApprovalMapper;
+import com.ruoyi.invest.mapper.TProjectPoolMapper;
+import com.ruoyi.invest.service.*;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.tool.service.ITUnifyFileService;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * 项目池Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class ApprovalServiceImpl extends FlowServiceFactory implements IApprovalService
+{
+    @Autowired
+    private ApprovalMapper approvalMapper;
+    @Autowired
+    private ITProjectApprovalService tProjectApprovalService;
+    @Autowired
+    private TProjectPoolMapper tProjectPoolMapper;
+    @Autowired
+    private ITProjectPoolService tProjectPoolService;
+
+    @Autowired
+    private ITProjectCompanyService tProjectCompanyService;
+
+    @Autowired
+    private ITProjectContactsService tProjectContactsService;
+
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private IFlowBaseInfoService activitiBaseInfoService;
+    @Autowired
+    private IFlowInstanceService flowInstanceService;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+    @Autowired
+    private ITProjectReviewService tProjectReviewService;
+
+    @Autowired
+    private IFlowService flowService;
+    @Autowired
+    private ITProjectMeetingService tProjectMeetingService;
+    @Autowired
+    private ITProjectScoringService tProjectScoringService;
+    @Override
+    public List<ProjectApprovalVo> getMyTaskList(String userId, TProjectApproval tProjectApproval){
+        return approvalMapper.getMyTaskList(userId, tProjectApproval);
+    }
+    @Override
+    public List<ProjectApprovalVo> getMyDoneTaskList(String userId, TProjectApproval tProjectApproval){
+        return approvalMapper.getMyDoneTaskList(userId, tProjectApproval);
+    }
+    @Override
+    public List<ProjectApprovalVo> getMyList(String userId,TProjectApproval tProjectApproval){
+        return approvalMapper.getMyList(userId, tProjectApproval);
+    }
+
+
+    /**
+     * 查询项目池
+     * 
+     * @param pInstId 流程实例Id
+     * @return 项目池
+     */
+    @Override
+    public TProjectApproval selectTProjectApprovalByProcInstId(String pInstId)
+    {
+        return approvalMapper.selectTProjectApprovalByProcInstId(pInstId);
+    }
+
+    @Override
+    public AjaxResult start(TProjectApproval tProjectApproval) {
+
+        // 根据key值获取最新的流程部署id
+        String pDefId = null;
+        ProcessInstance pInst = null;
+        try {
+            List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
+                    .processDefinitionKey("dgt-project-workflow")
+                    .orderByProcessDefinitionVersion().desc().list();
+            if(list.size()==0){
+                return AjaxResult.error("未找到该流程,无法开启流程!");
+            }
+            pDefId = list.get(0).getId();
+            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
+                    .latestVersion().singleResult();
+            if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
+                return AjaxResult.error("流程已被挂起,请先激活流程");
+            }
+            if(StringUtils.isNotBlank(pDefId)){
+
+                //设置参数
+                Map<String, Object> formProperties = new HashMap<String, Object>();
+                // 设置流程发起人Id到流程中
+                SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+                identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
+                formProperties.put("auditPass",tProjectApproval.isFlag()?true:false);
+                //暂存
+                formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
+                //投资部负责人
+                String leader=sysDeptMapper.selectDeptLeader("投资部");
+                formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
+                pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
+               // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
+                if(pInst!=null){
+                    String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
+                    String userId=SecurityUtils.getLoginUser().getUserId().toString();
+                    //保存信息
+                    tProjectApproval.setId(IdUtils.fastSimpleUUID());
+                    tProjectApproval.setProcInstId(pInst.getProcessInstanceId());
+                    tProjectApproval.setCreateBy(userId);
+                    // todo 保存立项资料
+                    tUnifyFileService.insertTUnifyFileList(tProjectApproval.getListFile(),
+                            tProjectApproval.getProjectPoolId(),
+                            tProjectApproval.getId(),
+                            String.valueOf(FileType.APPROVAL.ordinal()),
+                            nickName);
+
+                    // todo 更改立项状态
+                    tProjectPoolService.updateTProjectPoolByApprovalFlag(tProjectApproval.getProjectPoolId(),"1");
+
+                    // todo 短信提醒
+                    /*if(StringUtils.isNotEmpty(tProjectApproval.getParticipantsId())){
+                        StringUtils.str2List(tProjectApproval.getParticipantsId(),",",true,true).stream().forEach(str -> {
+                            SysUser user = sysUserService.selectUserById(Long.valueOf(str));
+                            String contents = "您好,"+user.getNickName()+"," + tProjectApproval.getProjectName() + "已发起立项申请。";
+                            try {
+                                SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
+                            } catch (IOException e) {
+                                logger.error("短信发送失败"+e.getMessage());
+                            }
+                        });
+                    }*/
+
+                    // todo 增加项目创建记录
+                    tProjectCirculationService.insertTProjectCirculation(tProjectApproval.getProjectPoolId(),"立项申请",nickName);
+
+                    tProjectApprovalService.insertTProjectApproval(tProjectApproval);
+
+                    FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
+                    flowBaseInfo.setCreateBy(userId);
+                    flowBaseInfo.setId(UUIDGenerator.uuid());
+                    flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
+                    flowBaseInfo.setProcDefId(pDefId);
+                    flowBaseInfo.setProcInsId(pInst.getId());
+                    flowBaseInfo.setTaskName("申请人");
+                    flowBaseInfo.setFlag(true);
+                    flowBaseInfo.setComment("[提交申请]");
+                    flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
+
+                    activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
+                    return AjaxResult.success();
+                }
+                return AjaxResult.error();
+            }
+            return AjaxResult.error();
+        } catch (Exception e) {
+            /*res.put("status",false);
+            res.put("msg", "流程定义id为空, 无法开启流程!");*/
+            e.printStackTrace();
+            return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
+
+        }
+
+
+    }
+    @Override
+    public AjaxResult complete(TProjectApproval tProjectApproval, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request){
+        //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
+        Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
+        if (Objects.isNull(task)) {
+            return AjaxResult.error("任务不存在");
+        }
+        //当前你登录人
+        SysUser userInfo=SecurityUtils.getLoginUser().getUser();
+        Map<String, Object> rs = new HashMap<String, Object>();
+        rs.put("status",true);
+        Map<String, Object> formProperties = new HashMap<>();
+        formProperties.put("auditPass", tProjectApproval.isFlag());
+        //会议投决人
+        if("meeting".equals(task.getTaskDefinitionKey())) {
+            List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));
+            formProperties.put("decisionList", userIds);
+        }
+
+        Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
+        try {
+            rs = flowService.taskComplete( task.getId(), tProjectApproval.isFlag(), formProperties, userInfo.getUserId().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+            rs.put("status", false);
+            rs.put("msg", "流程审批失败");
+        }
+        boolean status = (boolean) rs.get("status");
+        // 审核成功, 则记录审核信息
+        if (status) {
+            TProjectPool tProjectPool=new TProjectPool();
+            tProjectPool.setId(tProjectApproval.getProjectPoolId());
+            //发起会议
+            if ("meeting".equals(task.getTaskDefinitionKey())) {
+                tProjectMeeting.setId(IdUtils.fastSimpleUUID());
+                tProjectMeeting.setCreateBy(userInfo.getNickName());
+                tProjectMeeting.setProjectPoolId(tProjectApproval.getProjectPoolId());
+                if(tProjectMeeting.getMeetingType().equals("LX")||tProjectMeeting.getMeetingType().equals("TJ")){
+                    int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits()+"-");
+                    tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup()+"-"+ DateUtils.lastTwoDigits() +"-"+tProjectMeeting.getMeetingType()+"-"+ String.format("%03d",number+1));
+                }else{
+                    int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
+                    tProjectMeeting.setMeetingCode(DateUtils.dateNow()+ String.format("%03d",number+1));
+                }
+                // todo 保存附件信息
+                tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
+                        tProjectMeeting.getProjectPoolId(),
+                        tProjectMeeting.getId(),//会议ID
+                        String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
+                        userInfo.getNickName());
+
+                // todo 增加会议创建记录
+                tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(),tProjectMeeting.getMeetingTheme()+"(会议)",userInfo.getNickName());
+
+                // todo 发送短信-参与人-发起人
+                if(tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")){
+                    // todo 参与人
+                    /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
+                        StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
+                            SysUser user = sysUserService.selectUserById(Long.valueOf(str));
+                            String contents = "您好," + user.getNickName() + ",兹定于 " +
+                                    DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
+                                    "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
+                            try {
+                                SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
+                            } catch (IOException e) {
+                                logger.error("短信发送失败"+e.getMessage());
+                            }
+                        });
+                    }*/
+
+                    // todo 发起人
+                    /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
+                        SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
+                        String contents = "您好," + user.getNickName() + ",兹定于 " +
+                                DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
+                                "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
+                        try {
+                            SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
+                        } catch (IOException e) {
+                            logger.error("短信发送失败"+e.getMessage());
+                        }
+                    }*/
+                }
+
+                tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
+            }
+            //上传打分表
+            if("decision".equals(task.getTaskDefinitionKey())){
+                tProjectScoring.setCreateBy(userInfo.getNickName());
+                tProjectScoring.setProjectPoolId(tProjectApproval.getProjectPoolId());
+                // todo 增加项目创建记录
+                tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
+
+                tProjectScoringService.insertTProjectScoring(tProjectScoring);
+            }
+
+            //FlowBaseInfo flow = new FlowBaseInfo();
+            if(flow==null){
+                flow = new FlowBaseInfo();
+            }
+            flow.setId(UUIDGenerator.uuid());
+            flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
+            flow.setStatus(FlowStatusEnum.RUNNING.getName());
+            flow.setProcDefId(task.getProcessDefinitionId());
+            flow.setProcInsId(task.getProcessInstanceId());
+            flow.setTaskDefKey(task.getTaskDefinitionKey());
+            String isOk = tProjectApproval.isFlag() ? "[同意]" : "[驳回]";
+            if ("modifyApply".equals(task.getTaskDefinitionKey())) {
+                //tProjectPool.setStatus(tProjectPool.isFlag() ? 1 : 4);
+                isOk = tProjectApproval.isFlag() ? "[提交]" : "[关闭]";
+            } else {
+                //tProjectPool.setStatus(tProjectPool.isFlag() ? 2 : 0);
+            }
+            if (null != flow.getComment()) {
+                flow.setComment(isOk + flow.getComment());
+            } else {
+                flow.setComment(isOk);
+            }
+            flow.setTaskName(task.getName());
+            flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
+
+            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
+            // 表示流程已经审批结束了
+            if (processInstance == null) {
+                flow.setStatus(FlowStatusEnum.ENDED.getName());
+                if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
+                    tProjectPool.setProjectStage("5");
+                    tProjectPool.setUpdateBy(userInfo.getNickName());
+                    tProjectPoolService.updateTProjectPool(tProjectPool);
+                }
+            }
+            tProjectApprovalService.updateTProjectApproval(tProjectApproval);
+            activitiBaseInfoService.addActivitiBaseInfo(flow);
+        }
+        return AjaxResult.success();
+    }
+
+}

+ 293 - 0
ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/InvestmentOpportunityServiceImpl.java

@@ -0,0 +1,293 @@
+package com.ruoyi.flowable.service.impl;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.FileType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.flowable.common.constant.ProcessConstants;
+import com.ruoyi.flowable.common.constant.UUIDGenerator;
+import com.ruoyi.flowable.common.enums.FlowStatusEnum;
+import com.ruoyi.flowable.factory.FlowServiceFactory;
+import com.ruoyi.flowable.service.IFlowInstanceService;
+import com.ruoyi.flowable.service.IFlowService;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.invest.mapper.InvestmentOpportunityMapper;
+import com.ruoyi.flowable.service.IInvestmentOpportunityService;
+import com.ruoyi.invest.service.*;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.tool.service.ITUnifyFileService;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 项目池Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class InvestmentOpportunityServiceImpl extends FlowServiceFactory implements IInvestmentOpportunityService
+{
+    @Autowired
+    private InvestmentOpportunityMapper investmentOpportunityMapper;
+
+    @Autowired
+    private ITProjectPoolService tProjectPoolService;
+
+    @Autowired
+    private ITProjectCompanyService tProjectCompanyService;
+
+    @Autowired
+    private ITProjectContactsService tProjectContactsService;
+
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private IFlowBaseInfoService activitiBaseInfoService;
+    @Autowired
+    private IFlowInstanceService flowInstanceService;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+    @Autowired
+    private ITProjectReviewService tProjectReviewService;
+
+    @Autowired
+    private IFlowService flowService;
+    @Override
+    public List<TProjectPoolVo> getMyTaskList(String userId, TProjectPool tProjectPool){
+        return investmentOpportunityMapper.getMyTaskList(userId, tProjectPool);
+    }
+    @Override
+    public List<TProjectPoolVo> getMyDoneTaskList(String userId, TProjectPool tProjectPool){
+        return investmentOpportunityMapper.getMyDoneTaskList(userId, tProjectPool);
+    }
+    @Override
+    public List<TProjectPoolVo> getMyList(String userId,TProjectPool tProjectPool){
+        return investmentOpportunityMapper.getMyList(userId, tProjectPool);
+    }
+    /**
+     * 查询项目池
+     * 
+     * @param pInstId 流程实例Id
+     * @return 项目池
+     */
+    @Override
+    public TProjectPool selectTProjectPoolByProcInstId(String pInstId)
+    {
+        return investmentOpportunityMapper.selectTProjectPoolByProcInstId(pInstId);
+    }
+
+    @Override
+    public AjaxResult start(TProjectPool tProjectPool) {
+
+        // 根据key值获取最新的流程部署id
+        String pDefId = null;
+        ProcessInstance pInst = null;
+        try {
+            List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
+                    .processDefinitionKey("dgt-invest-workflow")
+                    .orderByProcessDefinitionVersion().desc().list();
+            if(list.size()==0){
+                return AjaxResult.error("未找到该流程,无法开启流程!");
+            }
+            pDefId = list.get(0).getId();
+            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
+                    .latestVersion().singleResult();
+            if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
+                return AjaxResult.error("流程已被挂起,请先激活流程");
+            }
+            if(StringUtils.isNotBlank(pDefId)){
+
+                //设置参数
+                Map<String, Object> formProperties = new HashMap<String, Object>();
+                // 设置流程发起人Id到流程中
+                SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+                identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
+                formProperties.put("auditPass",tProjectPool.isFlag()?true:false);
+                formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
+                String leader=sysDeptMapper.selectDeptLeader("投资部");
+                formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
+                pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
+               // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
+                if(pInst!=null){
+                    String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
+                    String userId=SecurityUtils.getLoginUser().getUserId().toString();
+                    //保存信息
+                    // todo 设置主键及创建人
+                    tProjectPool.setCreateBy(userId);
+                    tProjectPool.setId(IdUtils.fastSimpleUUID());
+                    tProjectPool.setProcInstId(pInst.getProcessInstanceId());
+                    int number = tProjectPoolService.selectTProjectPoolCode(DateUtils.lastTwoDigits()+"-");
+                    tProjectPool.setProjectCode(tProjectPool.getProjectGroup() + "-" + DateUtils.lastTwoDigits() + "-" + String.format("%03d",number+1));
+                    TProjectCompany tProjectCompany = tProjectPool.gettProjectCompany();
+                    tProjectCompany.setCreateBy(userId);
+                    tProjectCompany.setId(IdUtils.fastSimpleUUID());
+                    TProjectContacts tProjectContacts = tProjectPool.gettProjectContacts();
+                    tProjectContacts.setCreateBy(userId);
+                    tProjectContacts.setId(IdUtils.fastSimpleUUID());
+                    // todo 设置项目联系人
+                    tProjectPool.setProjectContacts(tProjectContacts.getId());
+                    // todo 设置公司信息关联关系
+                    tProjectCompany.setProjectPoolId(tProjectPool.getId());
+
+                    // todo 保存公司附件信息
+                    tUnifyFileService.insertTUnifyFileList(tProjectPool.getListFile(),
+                            tProjectPool.getId(),
+                            tProjectCompany.getId(),
+                            String.valueOf(FileType.COMPANY.ordinal()),
+                            nickName);
+
+                    // todo 保存BP附件信息
+                    tUnifyFileService.insertTUnifyFileList(tProjectPool.getBpFile(),
+                            tProjectPool.getId(),
+                            tProjectPool.getId(),
+                            String.valueOf(FileType.BP.ordinal()),
+                            nickName);
+
+                    // todo 保存其他附件信息
+                    tUnifyFileService.insertTUnifyFileList(tProjectPool.getOtherFile(),
+                            tProjectPool.getId(),
+                            tProjectPool.getId(),
+                            String.valueOf(FileType.OTHER.ordinal()),
+                            nickName);
+
+                    tProjectCompanyService.insertTProjectCompany(tProjectCompany);
+                    tProjectContactsService.insertTProjectContacts(tProjectContacts);
+                    // todo 增加项目创建记录
+                    tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目报备",nickName);
+                    tProjectPoolService.insertTProjectPool(tProjectPool);
+                    FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
+                    flowBaseInfo.setCreateBy(userId);
+                    flowBaseInfo.setId(UUIDGenerator.uuid());
+                    flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
+                    flowBaseInfo.setProcDefId(pDefId);
+                    flowBaseInfo.setProcInsId(pInst.getId());
+                    flowBaseInfo.setTaskName("申请人");
+                    flowBaseInfo.setFlag(true);
+                    flowBaseInfo.setComment("[提交申请]");
+                    flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
+
+                    activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
+                    return AjaxResult.success();
+                }
+                return AjaxResult.error();
+            }
+            return AjaxResult.error();
+        } catch (Exception e) {
+            /*res.put("status",false);
+            res.put("msg", "流程定义id为空, 无法开启流程!");*/
+            e.printStackTrace();
+            return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
+
+        }
+
+
+    }
+    @Override
+    public AjaxResult complete(TProjectPool tProjectPool, TProjectReview tProjectReview, FlowBaseInfo flow,HttpServletRequest request){
+        Task task=taskService.createTaskQuery().processInstanceId(tProjectPool.getProcInstId()).singleResult();
+        //Task task = taskService.createTaskQuery().taskId(taskVo.getId()).singleResult();
+        if (Objects.isNull(task)) {
+            return AjaxResult.error("任务不存在");
+        }
+        //当前你登录人
+        SysUser userInfo=SecurityUtils.getLoginUser().getUser();
+        Map<String, Object> rs = new HashMap<String, Object>();
+        rs.put("status",true);
+        Map<String, Object> formProperties = new HashMap<>();
+        formProperties.put("auditPass", tProjectPool.isFlag());
+        //部门负责人
+        String leader=sysDeptMapper.selectDeptLeader("投资部");
+        SysUser sysUser=sysUserService.selectUserByUserName(leader);
+        formProperties.put("MANAGER",sysUser.getUserId());
+        //taskService.complete(task.getId(), formProperties);
+        Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
+        try {
+            rs = flowService.taskComplete( task.getId(), tProjectPool.isFlag(), formProperties, userInfo.getUserId().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+            rs.put("status", false);
+            rs.put("msg", "流程审批失败");
+        }
+        boolean status = (boolean) rs.get("status");
+        // 审核成功, 则记录审核信息
+        if (status) {
+            //软件工程院审批
+            if ("softwareDept".equals(task.getTaskDefinitionKey())) {
+                tProjectReview.setCreateBy(userInfo.getNickName());
+                tProjectReview.setReviewPerson(userInfo.getNickName());
+                tProjectReview.setReviewPersonId(userInfo.getUserId().toString());
+                // todo 增加上传评审意见记录
+                tProjectCirculationService.insertTProjectCirculation(tProjectReview.getProjectPoolId(), "上传评估考察意见", userInfo.getNickName());
+                tProjectReviewService.insertTProjectReview(tProjectReview);
+                tProjectPool.setProjectStage("2");//评估考察
+            }
+
+            //FlowBaseInfo flow = new FlowBaseInfo();
+            if(flow==null){
+                flow = new FlowBaseInfo();
+            }
+            flow.setId(UUIDGenerator.uuid());
+            flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
+            flow.setStatus(FlowStatusEnum.RUNNING.getName());
+            flow.setProcDefId(task.getProcessDefinitionId());
+            flow.setProcInsId(task.getProcessInstanceId());
+            flow.setTaskDefKey(task.getTaskDefinitionKey());
+            String isOk = tProjectPool.isFlag() ? "[同意]" : "[驳回]";
+            if ("modifyApply".equals(task.getTaskDefinitionKey())) {
+                tProjectPool.setStatus(tProjectPool.isFlag() ? 1 : 4);
+                isOk = tProjectPool.isFlag() ? "[提交]" : "[关闭]";
+            } else {
+                tProjectPool.setStatus(tProjectPool.isFlag() ? 2 : 0);
+            }
+            if (null != flow.getComment()) {
+                flow.setComment(isOk + flow.getComment());
+            } else {
+                flow.setComment(isOk);
+            }
+            flow.setTaskName(task.getName());
+            flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
+            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
+            // 表示流程已经审批结束了
+            if (processInstance == null) {
+                flow.setStatus(FlowStatusEnum.ENDED.getName());
+                if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
+                    tProjectPool.setStatus(3);
+                    tProjectPool.setProjectStage("3");
+                }
+            }
+            tProjectPool.setUpdateBy(userInfo.getNickName());
+            // todo 增加项目创建记录
+            TProjectCirculation tProjectCirculation = new TProjectCirculation();
+            tProjectCirculation.setProjectPoolId(tProjectPool.getId());
+            tProjectCirculation.setStageName(tProjectPool.getStageName() + "-" + tProjectPool.getStateName());
+            tProjectCirculation.setCreateBy(userInfo.getNickName());
+            tProjectCirculationService.insertTProjectCirculation(tProjectCirculation);
+
+            tProjectPoolService.updateTProjectPool(tProjectPool);
+            activitiBaseInfoService.addActivitiBaseInfo(flow);
+        }
+        return AjaxResult.success();
+    }
+
+}

+ 13 - 0
ruoyi-system/src/main/java/com/ruoyi/invest/domain/dto/ApprovalDto.java

@@ -0,0 +1,13 @@
+package com.ruoyi.invest.domain.dto;
+
+import com.ruoyi.invest.domain.*;
+import lombok.Data;
+
+@Data
+public class ApprovalDto {
+    private TProjectPool projectPool;   // 嵌套对象
+    private TProjectApproval projectApproval;
+    private TProjectMeeting projectMeeting;
+    private TProjectScoring projectScoring;
+    private FlowBaseInfo flowBaseInfo;
+}

+ 13 - 0
ruoyi-system/src/main/java/com/ruoyi/invest/domain/dto/InvestDto.java

@@ -0,0 +1,13 @@
+package com.ruoyi.invest.domain.dto;
+
+import com.ruoyi.invest.domain.FlowBaseInfo;
+import com.ruoyi.invest.domain.TProjectPool;
+import com.ruoyi.invest.domain.TProjectReview;
+import lombok.Data;
+
+@Data
+public class InvestDto {
+    private TProjectPool projectPool;   // 嵌套对象
+    private TProjectReview projectReview;
+    private FlowBaseInfo flowBaseInfo;
+}

+ 29 - 0
ruoyi-system/src/main/java/com/ruoyi/invest/mapper/ApprovalMapper.java

@@ -0,0 +1,29 @@
+package com.ruoyi.invest.mapper;
+
+import com.ruoyi.invest.domain.TProjectApproval;
+import com.ruoyi.invest.domain.TProjectPool;
+import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目池Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ApprovalMapper {
+
+    /*待办任务*/
+    List<ProjectApprovalVo> getMyTaskList(@Param("userId") String userId,@Param("projectApproval")TProjectApproval tProjectApproval);
+    /*已办任务*/
+    List<ProjectApprovalVo> getMyDoneTaskList(@Param("userId") String userId, @Param("projectApproval")TProjectApproval tProjectApproval);
+    /*我的单据*/
+    List<ProjectApprovalVo> getMyList(@Param("userId") String userId, @Param("projectApproval")TProjectApproval tProjectApproval);
+    /*详情*/
+    public TProjectApproval selectTProjectApprovalByProcInstId(String ProcInstId);
+
+
+}

+ 29 - 0
ruoyi-system/src/main/java/com/ruoyi/invest/mapper/InvestmentOpportunityMapper.java

@@ -0,0 +1,29 @@
+package com.ruoyi.invest.mapper;
+
+import com.ruoyi.invest.domain.TProjectPool;
+import com.ruoyi.system.domain.vo.TProjectPoolVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目池Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface InvestmentOpportunityMapper {
+
+    /*待办任务*/
+    List<TProjectPoolVo> getMyTaskList(@Param("userId") String userId,@Param("projectPool")TProjectPool tProjectPool);
+    /*已办任务*/
+    List<TProjectPoolVo> getMyDoneTaskList(@Param("userId") String userId,@Param("projectPool")TProjectPool tProjectPool);
+    /*我的单据*/
+    List<TProjectPoolVo> getMyList(@Param("userId") String userId, @Param("projectPool")TProjectPool tProjectPool);
+    /*详情*/
+    public TProjectPool selectTProjectPoolByProcInstId(String ProcInstId);
+
+
+
+
+}

+ 20 - 0
ruoyi-system/src/main/java/com/ruoyi/invest/service/IFlowBaseInfoService.java

@@ -0,0 +1,20 @@
+package com.ruoyi.invest.service;
+
+import com.ruoyi.invest.domain.FlowBaseInfo;
+
+import java.util.List;
+
+public interface IFlowBaseInfoService {
+    boolean addActivitiBaseInfo(FlowBaseInfo flowBaseInfo);
+    List<FlowBaseInfo> searchFlowBaseInfoByProcInsId(String procInsId);
+    FlowBaseInfo selectCurrentApproval(String procInsId);
+    List<FlowBaseInfo> searchFlowBaseInfoByProcInsIdAndTaskDefKey(String procInsId, String taskDefKey);
+    boolean deleteFlowBaseInfo(FlowBaseInfo flowBaseInfo);
+    boolean deleteByProAndtaskDefkey(FlowBaseInfo flowBaseInfo);
+
+    Integer checkReStatus(FlowBaseInfo act);
+    List<FlowBaseInfo> searchFlowBaseInfoByProcInsIdAndTaskName(String procInsId, String taskName);
+
+    FlowBaseInfo selectLasterByProcInsId(String procInsId);
+
+}

+ 700 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TProjectPoolVo.java

@@ -0,0 +1,700 @@
+package com.ruoyi.system.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.ruoyi.invest.domain.*;
+import com.ruoyi.tool.domain.TUnifyFile;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目池对象 t_project_pool
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Data
+public class TProjectPoolVo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty("主键id")
+    private String id;
+
+    private String procInstId;
+
+    /** 项目名称 */
+    @Excel(name = "项目名称")
+    private String projectName;
+
+    /** 所属组别 */
+    @Excel(name = "所属组别")
+    private String projectGroup;
+
+    /** 录入日期 */
+    private Date recordDate;
+
+    /** 项目编号 */
+    @Excel(name = "项目编号")
+    private String projectCode;
+
+    /** 渠道 */
+    @Excel(name = "渠道")
+    private String channel;
+
+    /** 初次接触日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "初次接触日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date contactDate;
+
+    /** 立项通过日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "立项通过日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date projectDate;
+
+    /** 投决通过日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "投决通过日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date decisionDate;
+
+    /** 项目所属行业 */
+    @Excel(name = "项目所属行业")
+    private String industry;
+
+    /** 项目所属公司 */
+    @Excel(name = "项目所属公司")
+    private String company;
+
+    /** 项目情况描述 */
+    private String description;
+
+    /** 项目联系人 */
+    @Excel(name = "项目联系人")
+    private String projectContacts;
+
+    /** 投资负责人 */
+    @Excel(name = "投资负责人")
+    private String investHead;
+
+    /** 历次融资 */
+    @Excel(name = "历次融资")
+    private String previousFinancing;
+
+    /** 项目融资阶段 */
+    @Excel(name = "项目融资阶段")
+    private String financingStage;
+
+    /** 融资条件 */
+    private String financingCondition;
+
+    /** 预期融资金额(万元) */
+    @Excel(name = "预期融资金额")
+    private String financingMoney;
+
+    /** 预期融资时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+//    @Excel(name = "预期融资时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date financingDate;
+
+    /** 投资亮点 */
+    private String investSparkle;
+
+    /** 投前估值(万元) */
+    @Excel(name = "投前估值")
+    private String investValuation;
+
+    /** 预计投资金额(万元) */
+    @Excel(name = "预计投资金额")
+    private String investMoney;
+
+    /** 投资类型 */
+    @Excel(name = "投资类型")
+    private String investType;
+
+    /** 投资策略 */
+    @Excel(name = "投资策略")
+    private String investPloy;
+
+    /** 投资价值 */
+    @Excel(name = "投资价值")
+    private String investWorth;
+
+    /** 股权架构 */
+    private String shareholding;
+
+    /** 项目阶段 */
+    @Excel(name = "项目阶段")
+    private String projectStage;
+
+    /** 项目状态 */
+    @Excel(name = "项目状态")
+    private String projectState;
+
+    /** 备注 */
+    private String mark;
+
+    /** 状态 */
+    private String delFlag;
+
+    /** 公司信息 */
+    @ApiModelProperty("公司信息")
+    private TProjectCompany tProjectCompany;
+
+    /** 联系人信息 */
+    @ApiModelProperty("联系人信息")
+    private TProjectContacts tProjectContacts;
+
+    /** 渠道信息 */
+    @ApiModelProperty("渠道信息")
+    private TProjectChannel tProjectChannel;
+
+    /** 评审信息 */
+    @ApiModelProperty("评审信息")
+    private TProjectReview tProjectReview;
+
+    /** 会议信息 */
+    @ApiModelProperty("会议信息")
+    private TProjectMeeting tProjectMeeting;
+
+    /** 打分记录 */
+    @ApiModelProperty("打分记录")
+    private TProjectScoring tProjectScoring;
+
+    /** 尽调信息 */
+    @ApiModelProperty("尽调信息")
+    private TProjectInvestigate tProjectInvestigate;
+
+    /** 尽调人员信息 */
+    @ApiModelProperty("尽调人员信息")
+    private TProjectInvestigatePerson tProjectInvestigatePerson;
+
+    /**
+     * 附件信息
+     */
+    @ApiModelProperty("附件信息")
+    private List<TUnifyFile> listFile;
+
+    /**
+     * bp附件信息
+     */
+    @ApiModelProperty("bp附件信息")
+    private List<TUnifyFile> bpFile;
+
+    /**
+     * 其他附件信息
+     */
+    @ApiModelProperty("其他附件信息")
+    private List<TUnifyFile> otherFile;
+
+    /**
+     * 阶段名称
+     */
+    @ApiModelProperty("阶段名称")
+    private String stageName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty("状态名称")
+    private String stateName;
+
+    /**
+     * 立项申请状态
+     */
+    private String approvalFlag;
+
+    /**
+     * 尽调申请状态
+     */
+    private String investigateFlag;
+
+    /**
+     * 投决申请状态
+     */
+    private String decisionFlag;
+    //流程信息
+    @ApiModelProperty("流程实例ID")
+    private String procInsId;
+    @ApiModelProperty("流程ID")
+    private String procDefId;
+    //private String processDefName;
+    @ApiModelProperty("流程部署编号")
+    private String deployId;
+    //流程任务信息
+    @ApiModelProperty("任务编号")
+    private String taskId;
+    @ApiModelProperty("任务执行编号")
+    private String executionId;// 运行id
+    @ApiModelProperty("任务名称")
+    private String taskName;
+    @ApiModelProperty("任务Key")
+    private String taskDefKey;
+    private String taskCreateTiem; // 当前节点创建时间
+    //private String taskUserId; // 当前处理人
+    //private String status; // 流程状态
+    @ApiModelProperty("任务执行人Id")
+    private String assignee; // 该值未空表示 可签收,不未空表示 可处理
+    @ApiModelProperty("任务执行人名称")
+    private String assigneeName;
+    //流程发起人信息
+    @ApiModelProperty("流程发起人Id")
+    private String startUserId;
+    @ApiModelProperty("流程发起人名称")
+    private String startUserName;
+    @ApiModelProperty("流程发起人部门名称")
+    private String startDeptName;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setProjectName(String projectName)
+    {
+        this.projectName = projectName;
+    }
+
+    public String getProcInstId() {
+        return procInstId;
+    }
+
+    public void setProcInstId(String procInstId) {
+        this.procInstId = procInstId;
+    }
+
+    public String getProjectName()
+    {
+        return projectName;
+    }
+    public void setProjectGroup(String projectGroup)
+    {
+        this.projectGroup = projectGroup;
+    }
+
+    public String getProjectGroup()
+    {
+        return projectGroup;
+    }
+    public void setRecordDate(Date recordDate)
+    {
+        this.recordDate = recordDate;
+    }
+
+    public Date getRecordDate()
+    {
+        return recordDate;
+    }
+    public void setProjectCode(String projectCode)
+    {
+        this.projectCode = projectCode;
+    }
+
+    public String getProjectCode()
+    {
+        return projectCode;
+    }
+    public void setChannel(String channel)
+    {
+        this.channel = channel;
+    }
+
+    public String getChannel()
+    {
+        return channel;
+    }
+    public void setContactDate(Date contactDate)
+    {
+        this.contactDate = contactDate;
+    }
+
+    public Date getContactDate()
+    {
+        return contactDate;
+    }
+    public void setProjectDate(Date projectDate)
+    {
+        this.projectDate = projectDate;
+    }
+
+    public Date getProjectDate()
+    {
+        return projectDate;
+    }
+    public void setDecisionDate(Date decisionDate)
+    {
+        this.decisionDate = decisionDate;
+    }
+
+    public Date getDecisionDate()
+    {
+        return decisionDate;
+    }
+    public void setIndustry(String industry)
+    {
+        this.industry = industry;
+    }
+
+    public String getIndustry()
+    {
+        return industry;
+    }
+    public void setCompany(String company)
+    {
+        this.company = company;
+    }
+
+    public String getCompany()
+    {
+        return company;
+    }
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+    public void setProjectContacts(String projectContacts)
+    {
+        this.projectContacts = projectContacts;
+    }
+
+    public String getProjectContacts()
+    {
+        return projectContacts;
+    }
+    public void setInvestHead(String investHead)
+    {
+        this.investHead = investHead;
+    }
+
+    public String getInvestHead()
+    {
+        return investHead;
+    }
+    public void setPreviousFinancing(String previousFinancing)
+    {
+        this.previousFinancing = previousFinancing;
+    }
+
+    public String getPreviousFinancing()
+    {
+        return previousFinancing;
+    }
+    public void setFinancingStage(String financingStage)
+    {
+        this.financingStage = financingStage;
+    }
+
+    public String getFinancingStage()
+    {
+        return financingStage;
+    }
+    public void setFinancingCondition(String financingCondition)
+    {
+        this.financingCondition = financingCondition;
+    }
+
+    public String getFinancingCondition()
+    {
+        return financingCondition;
+    }
+    public void setFinancingMoney(String financingMoney)
+    {
+        this.financingMoney = financingMoney;
+    }
+
+    public String getFinancingMoney()
+    {
+        return financingMoney;
+    }
+    public void setFinancingDate(Date financingDate)
+    {
+        this.financingDate = financingDate;
+    }
+
+    public Date getFinancingDate()
+    {
+        return financingDate;
+    }
+    public void setInvestSparkle(String investSparkle)
+    {
+        this.investSparkle = investSparkle;
+    }
+
+    public String getInvestSparkle()
+    {
+        return investSparkle;
+    }
+    public void setInvestValuation(String investValuation)
+    {
+        this.investValuation = investValuation;
+    }
+
+    public String getInvestValuation()
+    {
+        return investValuation;
+    }
+    public void setInvestMoney(String investMoney)
+    {
+        this.investMoney = investMoney;
+    }
+
+    public String getInvestMoney()
+    {
+        return investMoney;
+    }
+    public void setInvestType(String investType)
+    {
+        this.investType = investType;
+    }
+
+    public String getInvestType()
+    {
+        return investType;
+    }
+    public void setInvestPloy(String investPloy)
+    {
+        this.investPloy = investPloy;
+    }
+
+    public String getInvestPloy()
+    {
+        return investPloy;
+    }
+    public void setInvestWorth(String investWorth)
+    {
+        this.investWorth = investWorth;
+    }
+
+    public String getInvestWorth()
+    {
+        return investWorth;
+    }
+    public void setShareholding(String shareholding)
+    {
+        this.shareholding = shareholding;
+    }
+
+    public String getShareholding()
+    {
+        return shareholding;
+    }
+    public void setProjectStage(String projectStage)
+    {
+        this.projectStage = projectStage;
+    }
+
+    public String getProjectStage()
+    {
+        return projectStage;
+    }
+    public void setProjectState(String projectState)
+    {
+        this.projectState = projectState;
+    }
+
+    public String getProjectState()
+    {
+        return projectState;
+    }
+    public void setMark(String mark)
+    {
+        this.mark = mark;
+    }
+
+    public String getMark()
+    {
+        return mark;
+    }
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public TProjectCompany gettProjectCompany() {
+        return tProjectCompany;
+    }
+
+    public void settProjectCompany(TProjectCompany tProjectCompany) {
+        this.tProjectCompany = tProjectCompany;
+    }
+
+    public TProjectContacts gettProjectContacts() {
+        return tProjectContacts;
+    }
+
+    public void settProjectContacts(TProjectContacts tProjectContacts) {
+        this.tProjectContacts = tProjectContacts;
+    }
+
+    public List<TUnifyFile> getListFile() {
+        return listFile;
+    }
+
+    public void setListFile(List<TUnifyFile> listFile) {
+        this.listFile = listFile;
+    }
+
+    public String getStageName() {
+        return stageName;
+    }
+
+    public void setStageName(String stageName) {
+        this.stageName = stageName;
+    }
+
+    public TProjectChannel gettProjectChannel() {
+        return tProjectChannel;
+    }
+
+    public void settProjectChannel(TProjectChannel tProjectChannel) {
+        this.tProjectChannel = tProjectChannel;
+    }
+
+    public String getStateName() {
+        return stateName;
+    }
+
+    public void setStateName(String stateName) {
+        this.stateName = stateName;
+    }
+
+    public List<TUnifyFile> getBpFile() {
+        return bpFile;
+    }
+
+    public void setBpFile(List<TUnifyFile> bpFile) {
+        this.bpFile = bpFile;
+    }
+
+    public List<TUnifyFile> getOtherFile() {
+        return otherFile;
+    }
+
+    public void setOtherFile(List<TUnifyFile> otherFile) {
+        this.otherFile = otherFile;
+    }
+
+    public TProjectReview gettProjectReview() {
+        return tProjectReview;
+    }
+
+    public void settProjectReview(TProjectReview tProjectReview) {
+        this.tProjectReview = tProjectReview;
+    }
+
+    public TProjectInvestigate gettProjectInvestigate() {
+        return tProjectInvestigate;
+    }
+
+    public void settProjectInvestigate(TProjectInvestigate tProjectInvestigate) {
+        this.tProjectInvestigate = tProjectInvestigate;
+    }
+
+    public String getApprovalFlag() {
+        return approvalFlag;
+    }
+
+    public void setApprovalFlag(String approvalFlag) {
+        this.approvalFlag = approvalFlag;
+    }
+
+    public String getInvestigateFlag() {
+        return investigateFlag;
+    }
+
+    public void setInvestigateFlag(String investigateFlag) {
+        this.investigateFlag = investigateFlag;
+    }
+
+    public String getDecisionFlag() {
+        return decisionFlag;
+    }
+
+    public void setDecisionFlag(String decisionFlag) {
+        this.decisionFlag = decisionFlag;
+    }
+
+    public TProjectInvestigatePerson gettProjectInvestigatePerson() {
+        return tProjectInvestigatePerson;
+    }
+
+    public void settProjectInvestigatePerson(TProjectInvestigatePerson tProjectInvestigatePerson) {
+        this.tProjectInvestigatePerson = tProjectInvestigatePerson;
+    }
+
+    public TProjectMeeting gettProjectMeeting() {
+        return tProjectMeeting;
+    }
+
+    public void settProjectMeeting(TProjectMeeting tProjectMeeting) {
+        this.tProjectMeeting = tProjectMeeting;
+    }
+
+    public TProjectScoring gettProjectScoring() {
+        return tProjectScoring;
+    }
+
+    public void settProjectScoring(TProjectScoring tProjectScoring) {
+        this.tProjectScoring = tProjectScoring;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("projectName", getProjectName())
+            .append("projectGroup", getProjectGroup())
+            .append("recordDate", getRecordDate())
+            .append("projectCode", getProjectCode())
+            .append("channel", getChannel())
+            .append("contactDate", getContactDate())
+            .append("projectDate", getProjectDate())
+            .append("decisionDate", getDecisionDate())
+            .append("industry", getIndustry())
+            .append("company", getCompany())
+            .append("description", getDescription())
+            .append("projectContacts", getProjectContacts())
+            .append("investHead", getInvestHead())
+            .append("previousFinancing", getPreviousFinancing())
+            .append("financingStage", getFinancingStage())
+            .append("financingCondition", getFinancingCondition())
+            .append("financingMoney", getFinancingMoney())
+            .append("financingDate", getFinancingDate())
+            .append("investSparkle", getInvestSparkle())
+            .append("investValuation", getInvestValuation())
+            .append("investMoney", getInvestMoney())
+            .append("investType", getInvestType())
+            .append("investPloy", getInvestPloy())
+            .append("investWorth", getInvestWorth())
+            .append("shareholding", getShareholding())
+            .append("projectStage", getProjectStage())
+            .append("projectState", getProjectState())
+            .append("mark", getMark())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 192 - 0
ruoyi-system/src/main/resources/mapper/invest/ApprovalMapper.xml

@@ -0,0 +1,192 @@
+<?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.ruoyi.invest.mapper.ApprovalMapper">
+
+    <resultMap type="TProjectApproval" id="TProjectApprovalResult">
+        <result property="id"    column="id"    />
+        <result property="procInstId" column="proc_inst_id"/>
+        <result property="projectPoolId"    column="project_pool_id"    />
+        <result property="projectOverview"    column="project_overview"    />
+        <result property="projectSparkle"    column="project_sparkle"    />
+        <result property="participantsId"    column="participants_id"    />
+        <result property="participants"    column="participants"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+    <resultMap type="ProjectApprovalVo" id="ProjectApprovalVoResult">
+        <result property="id"    column="id"    />
+        <result property="procInstId" column="proc_inst_id"/>
+        <result property="projectPoolId"    column="project_pool_id"    />
+        <result property="projectOverview"    column="project_overview"    />
+        <result property="projectSparkle"    column="project_sparkle"    />
+        <result property="participantsId"    column="participants_id"    />
+        <result property="participants"    column="participants"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+
+        <result property="projectName"    column="project_name"    />
+        <result property="industry"    column="industry"    />
+        <result property="investHead"    column="invest_head"    />
+        <result property="projectStage"    column="project_stage"    />
+        <result property="projectState"    column="project_state"    />
+
+        <result property="taskName" column="taskName"/>
+        <result property="taskId" column="taskId"/>
+        <result property="taskCreateTiem" column="taskCreateTiem"/>
+        <result property="assignee" column="assignee"/>
+        <result property="assigneeName" column="assigneeName"/>
+        <result property="taskDefKey" column="taskDefKey"/>
+        <result property="procDefId" column="procDefId"/>
+        <result property="procInstId" column="procInstId"/>
+        <result property="startUserId" column="startUserId"/>
+        <result property="startUserName" column="startUserName"/>
+        <result property="startDeptName" column="startDeptName"/>
+        <result property="executionId" column="executionId"/>
+        <result property="deployId" column="deployId"/>
+    </resultMap>
+    <sql id="selectTProjectApprovalVo">
+        select id, project_pool_id, project_overview, project_sparkle, participants_id, participants, remark, del_flag, create_by, create_time, update_by, update_time from t_project_approval
+    </sql>
+    <sql id="where_sql">
+        <if test="projectApproval.projectPoolId != null  and projectApproval.projectApproval.projectPoolId != ''"> and a.project_pool_id = #{projectApproval.projectPoolId}</if>
+        <if test="projectApproval.projectOverview != null  and projectApproval.projectOverview != ''"> and a.project_overview = #{projectApproval.projectOverview}</if>
+        <if test="projectApproval.projectSparkle != null  and projectApproval.projectSparkle != ''"> and a.project_sparkle = #{projectApproval.projectSparkle}</if>
+    </sql>
+    <select id="getMyTaskList" resultMap="ProjectApprovalVoResult">
+        select a.id,a.proc_inst_id, a.project_pool_id,tp.project_name, tp.industry,tp.project_stage,
+        tp.project_state,tp.invest_head, a.project_overview, a.project_sparkle, a.participants_id,
+        a.participants, a.remark, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time ,
+        p.PROC_INST_ID_ as 'procInsId',
+        p.PROC_DEF_ID_ as 'procDefId',
+        date_format(p.START_TIME_, '%Y-%m-%d %H:%i:%s') as 'applyTime',
+        date_format(p.END_TIME_, '%Y-%m-%d %H:%i:%s') as 'endTime',
+        p.START_USER_ID_ AS 'startUserId',
+        uu.nick_name AS 'startUserName',
+        dd.dept_name AS 'startDeptName',
+        t.NAME_ as 'taskName',
+        t.TASK_DEF_KEY_ as 'taskDefKey',
+        DATE_FORMAT(t.CREATE_TIME_ ,'%Y-%m-%d %H:%i') as 'taskCreateTiem',
+        t.ASSIGNEE_ AS 'assignee',
+        ui.nick_name AS 'assigneeName',
+        t.ID_ as 'taskId',
+        t.EXECUTION_ID_ AS 'executionId',
+        rp.DEPLOYMENT_ID_ AS 'deployId'
+        from t_project_approval a
+        left join t_project_pool tp on tp.id=a.project_pool_id
+        left join ACT_HI_PROCINST p on a.proc_inst_id = p.PROC_INST_ID_
+        LEFT JOIN (SELECT * FROM sys_user LIMIT 100000) uu ON p.START_USER_ID_ = uu.user_id
+        LEFT JOIN (SELECT * FROM sys_dept LIMIT 100000) dd ON uu.dept_id = dd.dept_id
+        left join ACT_RU_TASK t on a.proc_inst_id = t.PROC_INST_ID_
+        left join (select * from sys_user limit 100000) ui on t.ASSIGNEE_ = ui.user_id
+        left join ACT_RU_IDENTITYLINK ru on ru.TASK_ID_ = t.ID_
+        left join ACT_ID_MEMBERSHIP m on m.GROUP_ID_ = ru.GROUP_ID_ and m.USER_ID_ = #{userId}
+        LEFT JOIN act_re_procdef rp ON t.PROC_DEF_ID_ = rp.ID_
+        where
+        (t.ASSIGNEE_ = #{userId}
+        or (t.ASSIGNEE_ is null AND ru.TYPE_ = 'candidate'
+        AND (ru.USER_ID_ = #{userId}
+        OR ru.GROUP_ID_ IN (
+        select g.ID_ from ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership where g.ID_ = membership.GROUP_ID_ AND
+        membership.USER_ID_ = #{userId} )
+        )
+        )
+        )
+        and a.del_flag="0"
+        <include refid="where_sql"></include>
+    </select>
+    <select id="getMyDoneTaskList" resultMap="ProjectApprovalVoResult">
+        select a.id,a.proc_inst_id, a.project_pool_id,tp.project_name, tp.industry,tp.project_stage,
+        tp.project_state,tp.invest_head, a.project_overview, a.project_sparkle, a.participants_id,
+        a.participants, a.remark, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time ,
+        p.PROC_INST_ID_ as 'procInsId',
+        p.PROC_DEF_ID_ as 'procDefId',
+        date_format(p.START_TIME_, '%Y-%m-%d %H:%i:%s') as 'applyTime',
+        date_format(p.END_TIME_, '%Y-%m-%d %H:%i:%s') as 'endTime',
+        p.START_USER_ID_ AS 'startUserId',
+        uu.nick_name AS 'startUserName',
+        dd.dept_name AS 'startDeptName',
+        ht.ID_ AS 'taskId',
+        ht.NAME_ AS 'taskName',
+        ht.ASSIGNEE_ AS 'assignee',
+        ui.nick_name AS 'assigneeName',
+        rp.DEPLOYMENT_ID_ AS 'deployId'
+        from t_project_approval a
+        left join t_project_pool tp on tp.id=a.project_pool_id
+        left join ACT_HI_TASKINST ht on a.proc_inst_id = ht.PROC_INST_ID_
+        left join ACT_HI_PROCINST p on a.proc_inst_id = p.PROC_INST_ID_
+        LEFT JOIN (SELECT * FROM sys_user LIMIT 100000) uu ON p.START_USER_ID_ = uu.user_id
+        LEFT JOIN (SELECT * FROM sys_dept LIMIT 100000) dd ON uu.dept_id = dd.dept_id
+        left join (select * from sys_user limit 100000) ui on ht.ASSIGNEE_ = ui.user_id
+        left join ACT_RU_TASK t on a.proc_inst_id = t.PROC_INST_ID_
+        left join act_re_procdef rp ON t.PROC_DEF_ID_ = rp.ID_
+        where
+        ht.ASSIGNEE_ =  #{userId}
+        AND ht.END_TIME_ IS NOT NULL
+        and a.del_flag="0"
+        <include refid="where_sql"></include>
+        GROUP BY a.id
+        ORDER BY ht.END_TIME_ DESC;
+    </select>
+    <select id="getMyList" resultMap="ProjectApprovalVoResult">
+        select a.id,a.proc_inst_id, a.project_pool_id,tp.project_name, tp.industry,tp.project_stage,
+        tp.project_state,tp.invest_head, a.project_overview, a.project_sparkle, a.participants_id,
+        a.participants, a.remark, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time ,
+        u.nick_name as 'applyUserName',
+        p.PROC_INST_ID_ as 'procInsId',
+        p.PROC_DEF_ID_ as 'procDefId',
+        date_format(p.START_TIME_, '%Y-%m-%d %H:%i:%s') as 'applyTime',
+        date_format(p.END_TIME_, '%Y-%m-%d %H:%i:%s') as 'endTime',
+        p.START_USER_ID_ AS 'startUserId',
+        uu.nick_name AS 'startUserName',
+        dd.dept_name AS 'startDeptName',
+        t.NAME_ as 'taskName',
+        t.TASK_DEF_KEY_ as 'taskDefKey',
+        DATE_FORMAT(t.CREATE_TIME_ ,'%Y-%m-%d %H:%i') as 'taskCreateTiem',
+        t.ASSIGNEE_ as 'assignee',
+        GROUP_CONCAT(DISTINCT ui.nick_name SEPARATOR '\r\n') as 'assigneeName',
+        t.ID_ as 'taskId',
+        t.EXECUTION_ID_ AS 'executionId',
+        rp.DEPLOYMENT_ID_ AS 'deployId'
+        from t_project_approval a
+        left join t_project_pool tp on tp.id=a.project_pool_id
+        left join ACT_HI_PROCINST p on a.proc_inst_id = p.PROC_INST_ID_
+        LEFT JOIN (SELECT * FROM sys_user LIMIT 100000) uu ON p.START_USER_ID_ = uu.user_id
+        LEFT JOIN (SELECT * FROM sys_dept LIMIT 100000) dd ON uu.dept_id = dd.dept_id
+        left join sys_user u on a.create_by = u.user_id
+        left join ACT_RU_TASK t on a.proc_inst_id = t.PROC_INST_ID_
+        left join (select * from sys_user limit 100000) ui on t.ASSIGNEE_ = ui.user_id
+        left join ACT_RU_IDENTITYLINK ru on ru.TASK_ID_ = t.ID_
+        left join ACT_ID_MEMBERSHIP m on m.GROUP_ID_ = ru.GROUP_ID_ and m.USER_ID_ = #{userId}
+        left join act_re_procdef rp ON t.PROC_DEF_ID_ = rp.ID_
+        where a.create_by = #{userId} and a.proc_inst_id is not null and a.proc_inst_id != ''
+        and a.del_flag="0"
+        <include refid="where_sql"></include>
+        GROUP BY a.id
+    </select>
+    <!--<select id="selectTProjectPoolById" parameterType="String" resultMap="TProjectPoolResult">
+        <include refid="selectTProjectPoolVo"/>
+        where a.id = #{id}
+    </select>-->
+    <select id="selectTProjectApprovalByProcInstId" parameterType="java.lang.String" resultMap="TProjectApprovalResult">
+        select a.id,a.proc_inst_id, a.project_pool_id, a.project_overview, a.project_sparkle, a.participants_id,
+               a.participants, a.remark, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time ,
+               t.TASK_DEF_KEY_ as 'taskDefKey'
+        from t_project_approval a
+        left join ACT_RU_TASK t on a.proc_inst_id = t.PROC_INST_ID_
+        left join (select * from sys_user limit 100000) ui on t.ASSIGNEE_ = ui.user_id
+        left join sys_user u on a.create_by = u.user_id
+        where a.proc_inst_id = #{procInstId,jdbcType=VARCHAR}
+        GROUP BY a.id
+    </select>
+
+</mapper>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 358 - 0
ruoyi-system/src/main/resources/mapper/invest/InvestmentOpportunityMapper.xml