Browse Source

11482-【CR】【投资系统】增加审批流程-文件资料管理-分为7项

hxy 2 months ago
parent
commit
b3044842d7
21 changed files with 5679 additions and 0 deletions
  1. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/BPController.java
  2. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/DecisionReportController.java
  3. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/FinancialEvaluationController.java
  4. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/InitiationReportController.java
  5. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/LegalDueDiligenceController.java
  6. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/MarketResearchController.java
  7. 162 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/ProjectTechnologyController.java
  8. 44 0
      ruoyi-ui/src/api/file/businessPlan.js
  9. 44 0
      ruoyi-ui/src/api/file/decisionReport.js
  10. 44 0
      ruoyi-ui/src/api/file/financialEvaluation.js
  11. 44 0
      ruoyi-ui/src/api/file/initiationReport.js
  12. 44 0
      ruoyi-ui/src/api/file/legalDueDiligence.js
  13. 44 0
      ruoyi-ui/src/api/file/marketResearch.js
  14. 44 0
      ruoyi-ui/src/api/file/projectTechnology.js
  15. 618 0
      ruoyi-ui/src/views/file/businessPlan/index.vue
  16. 604 0
      ruoyi-ui/src/views/file/decisionReport/index.vue
  17. 603 0
      ruoyi-ui/src/views/file/financialEvaluation/index.vue
  18. 603 0
      ruoyi-ui/src/views/file/initiationReport/index.vue
  19. 603 0
      ruoyi-ui/src/views/file/legalDueDiligence/index.vue
  20. 603 0
      ruoyi-ui/src/views/file/marketResearch/index.vue
  21. 603 0
      ruoyi-ui/src/views/file/projectTechnology/index.vue

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/BPController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 商业计划书Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "文件资料管理-商业计划书")
+@RestController
+@RequestMapping("/file/businessPlan")
+public class BPController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询商业计划书列表
+     */
+    @ApiOperation("查询商业计划书列表")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("a");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出商业计划书列表
+     */
+    @ApiOperation("导出商业计划书列表")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:export')")
+    @Log(title = "商业计划书", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("a");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "商业计划书数据");
+    }
+
+    /**
+     * 获取商业计划书详细信息
+     */
+    @ApiOperation("获取商业计划书详细信息")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增商业计划书
+     */
+    @ApiOperation("新增商业计划书")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:add')")
+    @Log(title = "商业计划书", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//商业计划书ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:商业计划书
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(商业计划书)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改商业计划书
+     */
+    @ApiOperation("修改商业计划书")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:edit')")
+    @Log(title = "商业计划书", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//商业计划书ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:商业计划书
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除商业计划书
+     */
+    @ApiOperation("删除商业计划书")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:remove')")
+    @Log(title = "商业计划书", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('file:businessPlan:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/DecisionReportController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 投决申请报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "文件资料管理-投决申请报告")
+@RestController
+@RequestMapping("/file/decisionReport")
+public class DecisionReportController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询投决申请报告列表
+     */
+    @ApiOperation("查询投决申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("q");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出投决申请报告列表
+     */
+    @ApiOperation("导出投决申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "投决申请报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("q");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "投决申请报告数据");
+    }
+
+    /**
+     * 获取投决申请报告详细信息
+     */
+    @ApiOperation("获取投决申请报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增投决申请报告
+     */
+    @ApiOperation("新增投决申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "投决申请报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//投决申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:投决申请报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(投决申请报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改投决申请报告
+     */
+    @ApiOperation("修改投决申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "投决申请报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//投决申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:投决申请报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除投决申请报告
+     */
+    @ApiOperation("删除投决申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "投决申请报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/FinancialEvaluationController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 财务评估报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "研究资料管理-财务评估报告")
+@RestController
+@RequestMapping("/file/financialEvaluation")
+public class FinancialEvaluationController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询财务评估报告列表
+     */
+    @ApiOperation("查询财务评估报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("o");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出财务评估报告列表
+     */
+    @ApiOperation("导出财务评估报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "财务评估报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("o");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "财务评估报告数据");
+    }
+
+    /**
+     * 获取财务评估报告详细信息
+     */
+    @ApiOperation("获取财务评估报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增财务评估报告
+     */
+    @ApiOperation("新增财务评估报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "财务评估报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//财务评估报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:财务评估报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(财务评估报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改财务评估报告
+     */
+    @ApiOperation("修改财务评估报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "财务评估报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//财务评估报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:财务评估报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除财务评估报告
+     */
+    @ApiOperation("删除财务评估报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "财务评估报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/InitiationReportController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 立项申请报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "文件资料管理-立项申请报告")
+@RestController
+@RequestMapping("/file/initiationReport")
+public class InitiationReportController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询立项申请报告列表
+     */
+    @ApiOperation("查询立项申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("l");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出立项申请报告列表
+     */
+    @ApiOperation("导出立项申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "立项申请报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("l");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "立项申请报告数据");
+    }
+
+    /**
+     * 获取立项申请报告详细信息
+     */
+    @ApiOperation("获取立项申请报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增立项申请报告
+     */
+    @ApiOperation("新增立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "立项申请报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//立项申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:立项申请报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(立项申请报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改立项申请报告
+     */
+    @ApiOperation("修改立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "立项申请报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//立项申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:立项申请报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除立项申请报告
+     */
+    @ApiOperation("删除立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "立项申请报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/LegalDueDiligenceController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 法务评估报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "研究资料管理-法务评估报告")
+@RestController
+@RequestMapping("/file/legalDueDiligence")
+public class LegalDueDiligenceController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询立项申请报告列表
+     */
+    @ApiOperation("查询立项申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("p");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出立项申请报告列表
+     */
+    @ApiOperation("导出立项申请报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "立项申请报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("p");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "立项申请报告数据");
+    }
+
+    /**
+     * 获取立项申请报告详细信息
+     */
+    @ApiOperation("获取立项申请报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增立项申请报告
+     */
+    @ApiOperation("新增立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "立项申请报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//立项申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:立项申请报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(立项申请报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改立项申请报告
+     */
+    @ApiOperation("修改立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "立项申请报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//立项申请报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:立项申请报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除立项申请报告
+     */
+    @ApiOperation("删除立项申请报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "立项申请报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/MarketResearchController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 项目行研报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "研究资料管理-项目行研报告")
+@RestController
+@RequestMapping("/file/marketResearch")
+public class MarketResearchController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询项目行研报告列表
+     */
+    @ApiOperation("查询项目行研报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("m");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出项目行研报告列表
+     */
+    @ApiOperation("导出项目行研报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "项目行研报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("m");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "项目行研报告数据");
+    }
+
+    /**
+     * 获取项目行研报告详细信息
+     */
+    @ApiOperation("获取项目行研报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增项目行研报告
+     */
+    @ApiOperation("新增项目行研报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "项目行研报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//项目行研报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:项目行研报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(项目行研报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改项目行研报告
+     */
+    @ApiOperation("修改项目行研报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "项目行研报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//项目行研报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:项目行研报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除项目行研报告
+     */
+    @ApiOperation("删除项目行研报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "项目行研报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 162 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/file/ProjectTechnologyController.java

@@ -0,0 +1,162 @@
+package com.ruoyi.web.controller.file;
+
+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.poi.ExcelUtil;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.invest.domain.TProjectInformation;
+import com.ruoyi.invest.service.ITProjectCirculationService;
+import com.ruoyi.invest.service.ITProjectInformationService;
+import com.ruoyi.system.service.ISysDictDataService;
+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.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 项目技术报告Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-26
+ */
+@Api(tags = "研究资料管理-项目技术报告")
+@RestController
+@RequestMapping("/file/projectTechnology")
+public class ProjectTechnologyController extends BaseController
+{
+    @Autowired
+    private ITProjectInformationService tProjectInformationService;
+    @Autowired
+    private ITProjectCirculationService tProjectCirculationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询项目技术报告列表
+     */
+    @ApiOperation("查询项目技术报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TProjectInformation tProjectInformation)
+    {
+        startPage();
+        tProjectInformation.setFileType("n");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出项目技术报告列表
+     */
+    @ApiOperation("导出项目技术报告列表")
+    @PreAuthorize("@ss.hasPermi('invest:information:export')")
+    @Log(title = "项目技术报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setFileType("n");
+        List<TProjectInformation> list = tProjectInformationService.selectTProjectInformationList(tProjectInformation)
+                .stream().map(n -> {
+                    n.setProjectPoolId(n.gettProjectPool().getProjectName());
+                    n.setFileType(dictDataService.selectDictLabel("file_type",n.getFileType()));
+                    n.setProjectStage(dictDataService.selectDictLabel("project_stage",n.getProjectStage()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TProjectInformation> util = new ExcelUtil<TProjectInformation>(TProjectInformation.class);
+        util.exportExcel(response, list, "项目技术报告数据");
+    }
+
+    /**
+     * 获取项目技术报告详细信息
+     */
+    @ApiOperation("获取项目技术报告详细信息")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tProjectInformationService.selectTProjectInformationById(id));
+    }
+
+    /**
+     * 新增项目技术报告
+     */
+    @ApiOperation("新增项目技术报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:add')")
+    @Log(title = "项目技术报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TProjectInformation tProjectInformation)
+    {
+        tProjectInformation.setId(IdUtils.fastSimpleUUID());
+        tProjectInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//项目技术报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:项目技术报告
+                getNickName());
+
+        // todo 增加文件创建记录
+        tProjectCirculationService.insertTProjectCirculation(tProjectInformation.getProjectPoolId(),tProjectInformation.getFileName()+"(项目技术报告)",getNickName());
+
+        return toAjax(tProjectInformationService.insertTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 修改项目技术报告
+     */
+    @ApiOperation("修改项目技术报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:edit')")
+    @Log(title = "项目技术报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TProjectInformation tProjectInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tProjectInformation.getListFile(),
+                tProjectInformation.getProjectPoolId(),
+                tProjectInformation.getId(),//项目技术报告ID
+                String.valueOf(FileType.INFORMATION.ordinal()),//文件类型:项目技术报告
+                getNickName());
+
+        return toAjax(tProjectInformationService.updateTProjectInformation(tProjectInformation));
+    }
+
+    /**
+     * 删除项目技术报告
+     */
+    @ApiOperation("删除项目技术报告")
+    @PreAuthorize("@ss.hasPermi('invest:information:remove')")
+    @Log(title = "项目技术报告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        //删除附件
+        tUnifyFileService.updateTUnifyFileBusinessIds(ids);
+        return toAjax(tProjectInformationService.updateTProjectInformationByIds(ids));
+    }
+
+    /**
+     * 根据项目ID获取会议记录
+     */
+    @ApiOperation("根据项目ID获取会议记录")
+    @PreAuthorize("@ss.hasPermi('invest:information:query')")
+    @GetMapping(value = "/listProjectPoolId")
+    public AjaxResult listProjectPoolId(String projectPoolId)
+    {
+        return success(tProjectInformationService.listProjectPoolId(projectPoolId));
+    }
+}

+ 44 - 0
ruoyi-ui/src/api/file/businessPlan.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listBusinessPlan(query) {
+  return request({
+    url: '/file/businessPlan/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getBusinessPlan(id) {
+  return request({
+    url: '/file/businessPlan/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addBusinessPlan(data) {
+  return request({
+    url: '/file/businessPlan',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateBusinessPlan(data) {
+  return request({
+    url: '/file/businessPlan',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delBusinessPlan(id) {
+  return request({
+    url: '/file/businessPlan/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/decisionReport.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listDecisionReport(query) {
+  return request({
+    url: '/file/decisionReport/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getDecisionReport(id) {
+  return request({
+    url: '/file/decisionReport/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addDecisionReport(data) {
+  return request({
+    url: '/file/decisionReport',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateDecisionReport(data) {
+  return request({
+    url: '/file/decisionReport',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delDecisionReport(id) {
+  return request({
+    url: '/file/decisionReport/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/financialEvaluation.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listFinancialEvaluation(query) {
+  return request({
+    url: '/file/financialEvaluation/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getFinancialEvaluation(id) {
+  return request({
+    url: '/file/financialEvaluation/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addFinancialEvaluation(data) {
+  return request({
+    url: '/file/financialEvaluation',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateFinancialEvaluation(data) {
+  return request({
+    url: '/file/financialEvaluation',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delFinancialEvaluation(id) {
+  return request({
+    url: '/file/financialEvaluation/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/initiationReport.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listInitiationReport(query) {
+  return request({
+    url: '/file/initiationReport/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getInitiationReport(id) {
+  return request({
+    url: '/file/initiationReport/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addInitiationReport(data) {
+  return request({
+    url: '/file/initiationReport',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateInitiationReport(data) {
+  return request({
+    url: '/file/initiationReport',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delInitiationReport(id) {
+  return request({
+    url: '/file/initiationReport/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/legalDueDiligence.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listLegalDueDiligence(query) {
+  return request({
+    url: '/file/legalDueDiligence/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getLegalDueDiligence(id) {
+  return request({
+    url: '/file/legalDueDiligence/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addLegalDueDiligence(data) {
+  return request({
+    url: '/file/legalDueDiligence',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateLegalDueDiligence(data) {
+  return request({
+    url: '/file/legalDueDiligence',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delLegalDueDiligence(id) {
+  return request({
+    url: '/file/legalDueDiligence/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/marketResearch.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listMarketResearch(query) {
+  return request({
+    url: '/file/marketResearch/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getMarketResearch(id) {
+  return request({
+    url: '/file/marketResearch/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addMarketResearch(data) {
+  return request({
+    url: '/file/marketResearch',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateMarketResearch(data) {
+  return request({
+    url: '/file/marketResearch',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delMarketResearch(id) {
+  return request({
+    url: '/file/marketResearch/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/file/projectTechnology.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询商业计划书列表
+export function listProjectTechnology(query) {
+  return request({
+    url: '/file/projectTechnology/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商业计划书详细
+export function getProjectTechnology(id) {
+  return request({
+    url: '/file/projectTechnology/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商业计划书
+export function addProjectTechnology(data) {
+  return request({
+    url: '/file/projectTechnology',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商业计划书
+export function updateProjectTechnology(data) {
+  return request({
+    url: '/file/projectTechnology',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商业计划书
+export function delProjectTechnology(id) {
+  return request({
+    url: '/file/projectTechnology/' + id,
+    method: 'delete'
+  })
+}

+ 618 - 0
ruoyi-ui/src/views/file/businessPlan/index.vue

@@ -0,0 +1,618 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:businessPlan:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:businessPlan:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:businessPlan:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:businessPlan:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="businessPlanList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:businessPlan:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:businessPlan:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别" disabled>
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listBusinessPlan,
+  getBusinessPlan,
+  delBusinessPlan,
+  addBusinessPlan,
+  updateBusinessPlan,
+} from "@/api/file/businessPlan";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      businessPlanList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+        fileInfoId: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listBusinessPlan(this.queryParams).then((response) => {
+        this.businessPlanList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "a";
+      console.log(this.form.fileType)
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      console.log(row);
+      let id = row.id || this.ids;
+      let uploadType="";
+      getBusinessPlan(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          console.log(row.fileInfoId+"-------------------")
+          if(row.fileInfoId){
+            id=row.fileInfoId;
+            //uploadType="9";
+            this.$refs.fileItems.getListFileInfoId(id);
+          }else{
+            this.$refs.fileItems.getListFileBusinessId(id);
+          }
+
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateBusinessPlan(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addBusinessPlan(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delBusinessPlan(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/businessPlan/export",
+        {
+          ...this.queryParams,
+        },
+        `businessPlan_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 604 - 0
ruoyi-ui/src/views/file/decisionReport/index.vue

@@ -0,0 +1,604 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:information:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:information:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:information:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:information:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="informationList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:information:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:information:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别" disabled>
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listDecisionReport,
+  getDecisionReport,
+  delDecisionReport,
+  addDecisionReport,
+  updateDecisionReport,
+} from "@/api/file/decisionReport";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      decisionReportList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listDecisionReport(this.queryParams).then((response) => {
+        this.decisionReportList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "q";
+      console.log(this.form.fileType)
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getDecisionReport(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateDecisionReport(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDecisionReport(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delDecisionReport(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/decisionReport/export",
+        {
+          ...this.queryParams,
+        },
+        `decisionReport_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 603 - 0
ruoyi-ui/src/views/file/financialEvaluation/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:financialEvaluation:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:financialEvaluation:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:financialEvaluation:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:financialEvaluation:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="financialEvaluationList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:financialEvaluation:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:financialEvaluation:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别">
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listFinancialEvaluation,
+  getFinancialEvaluation,
+  delFinancialEvaluation,
+  addFinancialEvaluation,
+  updateFinancialEvaluation,
+} from "@/api/file/financialEvaluation";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      financialEvaluationList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listFinancialEvaluation(this.queryParams).then((response) => {
+        this.financialEvaluationList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "o";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getFinancialEvaluation(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateFinancialEvaluation(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addFinancialEvaluation(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delFinancialEvaluation(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/financialEvaluation/export",
+        {
+          ...this.queryParams,
+        },
+        `financialEvaluation_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 603 - 0
ruoyi-ui/src/views/file/initiationReport/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:initiationReport:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:initiationReport:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:initiationReport:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:initiationReport:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="initiationReportList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:initiationReport:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:initiationReport:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别">
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listInitiationReport,
+  getInitiationReport,
+  delInitiationReport,
+  addInitiationReport,
+  updateInitiationReport,
+} from "@/api/file/initiationReport";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      initiationReportList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listInitiationReport(this.queryParams).then((response) => {
+        this.initiationReportList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "l";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getInitiationReport(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateInitiationReport(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInitiationReport(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delInitiationReport(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/initiationReport/export",
+        {
+          ...this.queryParams,
+        },
+        `initiationReport_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 603 - 0
ruoyi-ui/src/views/file/legalDueDiligence/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:legalDueDiligence:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:legalDueDiligence:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:legalDueDiligence:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:legalDueDiligence:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="legalDueDiligenceList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:legalDueDiligence:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:legalDueDiligence:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别">
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listLegalDueDiligence,
+  getLegalDueDiligence,
+  delLegalDueDiligence,
+  addLegalDueDiligence,
+  updateLegalDueDiligence,
+} from "@/api/file/legalDueDiligence";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      legalDueDiligenceList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listLegalDueDiligence(this.queryParams).then((response) => {
+        this.legalDueDiligenceList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "p";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getLegalDueDiligence(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateLegalDueDiligence(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLegalDueDiligence(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delLegalDueDiligence(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/legalDueDiligence/export",
+        {
+          ...this.queryParams,
+        },
+        `legalDueDiligence_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 603 - 0
ruoyi-ui/src/views/file/marketResearch/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:marketResearch:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:marketResearch:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:marketResearch:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:marketResearch:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="marketResearchList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:marketResearch:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:marketResearch:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别">
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listMarketResearch,
+  getMarketResearch,
+  delMarketResearch,
+  addMarketResearch,
+  updateMarketResearch,
+} from "@/api/file/marketResearch";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      marketResearchList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listMarketResearch(this.queryParams).then((response) => {
+        this.marketResearchList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "m";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getMarketResearch(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateMarketResearch(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addMarketResearch(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delMarketResearch(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/marketResearch/export",
+        {
+          ...this.queryParams,
+        },
+        `marketResearch_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 603 - 0
ruoyi-ui/src/views/file/projectTechnology/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+    <el-form
+      v-if="type !== '2'"
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="70px"
+    >
+      <el-form-item label="文件名称" prop="fileName">
+        <el-input
+          v-model.trim="queryParams.fileName"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文件类别" prop="fileType">
+        <el-select v-model="queryParams.fileType" placeholder="全部" clearable>
+          <el-option
+            v-for="dict in dict.type.file_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8" v-if="type !== '2'">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['file:projectTechnology:add']"
+        >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['file:projectTechnology:edit']"
+        >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['file:projectTechnology:remove']"
+        >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['file:projectTechnology:export']"
+        >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="projectTechnologyList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        v-if="type === '1'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column
+        label="文件名称"
+        width="300"
+        align="center"
+        prop="fileName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.fileName">
+            {{ scope.row.fileName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="文件类别"
+        width="160"
+        align="center"
+        prop="fileType"
+      >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.fileType"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="项目名称"
+        width="200"
+        align="center"
+        prop="tProjectPool.projectName"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.tProjectPool.projectName">
+            {{ scope.row.tProjectPool.projectName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="项目阶段" align="center" prop="projectStage">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.project_stage"
+            :value="scope.row.projectStage"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" width="120" align="center" prop="remark">
+        <template slot-scope="scope">
+          <div :title="scope.row.remark">
+            {{ scope.row.remark }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建人"
+        width="120"
+        align="center"
+        prop="createBy"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createBy">
+            {{ scope.row.createBy }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        width="160"
+        align="center"
+        prop="createTime"
+      >
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="120"
+        fixed="right"
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['file:projectTechnology:edit']"
+          >修改</el-button
+          >
+          <el-button
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['file:projectTechnology:remove']"
+          >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文件资料对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="1000px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="fileForm"
+        :model="form"
+        :rules="rules"
+        label-width="90px"
+      >
+        <el-form-item label="文件名称" prop="fileName">
+          <el-input
+            maxlength="100"
+            v-model="form.fileName"
+            placeholder="请输入文件名称"
+          />
+        </el-form-item>
+
+        <el-form-item label="文件类别" prop="fileType">
+          <el-select v-model="form.fileType" placeholder="请选择文件类别">
+            <el-option
+              v-for="dict in dict.type.file_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <div
+            class="el-input__inner inputSimulation yichu1"
+            @click="handleProjectItem"
+            :class="{ show_disabled: pageType === '1' }"
+            :title="form.projectName"
+          >
+            {{ form.projectName ? form.projectName : "请选择项目" }}
+          </div>
+          <projectItem
+            ref="projectItem"
+            @getProjectInfo="getProjectInfo"
+          ></projectItem>
+        </el-form-item>
+        <el-form-item label="项目阶段" prop="projectStage">
+          <el-select v-model="form.projectStage" disabled placeholder="">
+            <el-option
+              v-for="dict in dict.type.project_stage"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="会议编号" prop="fileBusinessId">
+          <div
+            class="el-input__inner inputSimulation"
+            @click="handleMeetingItem"
+          >
+            {{ form.meetingTheme ? form.meetingTheme : "请选择会议" }}
+          </div>
+          <meetingItem
+            ref="meetingItem"
+            @getMeetingInfo="getMeetingInfo"
+          ></meetingItem>
+        </el-form-item> -->
+        <el-form-item label="文件" prop="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItems"
+            :id="form.id"
+            @getFileList="getFileList"
+          ></fileItem>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" class="special-el-form-item">
+          <el-input
+            maxlength="200"
+            rows="4"
+            type="textarea"
+            v-model="form.remark"
+            placeholder="请输入备注"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-preventReClick
+        >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listProjectTechnology,
+  getProjectTechnology,
+  delProjectTechnology,
+  addProjectTechnology,
+  updateProjectTechnology,
+} from "@/api/file/projectTechnology";
+import projectItem from "../../invest/components/projectItem";
+import fileItem from "../../invest/components/fileItem";
+import meetingItem from "../../invest/components/meetingItem";
+export default {
+  props: {
+    type: {
+      type: String,
+      default: "1", //1=显示全部列表  2=显示某项目下的详情列表
+    },
+    projectId: {
+      type: String,
+    },
+  },
+  components: { projectItem, fileItem, meetingItem },
+  dicts: ["file_type", "project_stage"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      pageType: null,
+      id: "",
+      fileList: [],
+      // 遮罩层
+      loading: true,
+
+      // 选中数组
+      ids: [],
+      idsName: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文件资料表格数据
+      projectTechnologyList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fileName: null,
+        fileType: null,
+        projectStage: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        fileName: [{ required: true, trigger: "blur", message: "请输入" }],
+        projectName: [{ required: true, trigger: "blur", message: "请选择" }],
+        fileType: [{ required: true, trigger: "change", message: "请选择" }],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+    };
+  },
+  created() {
+    if (this.projectId) {
+      this.queryParams.projectPoolId = this.projectId;
+    }
+    this.getList();
+  },
+  methods: {
+    // 获取公司信息
+    getProjectInfo(info) {
+      if (info.length > 0) {
+        this.form.projectPoolId = info[0].id;
+        this.form.projectName = info[0].projectName;
+        this.form.projectStage = info[0].projectStage;
+        this.form.projectState = info[0].projectState;
+        this.$refs.fileForm.clearValidate(["projectName"]);
+      }
+    },
+    //展示人员
+    handleProjectItem() {
+      this.$refs.projectItem.showProjectItem = true;
+    },
+    // 获取会议信息
+    // getMeetingInfo(info) {
+    //   if (info.length > 0) {
+    //     this.form.fileBusinessId = info[0].id;
+    //     this.form.meetingTheme = info[0].meetingTheme;
+    //   }
+    // },
+    handleMeetingItem() {
+      this.$refs.meetingItem.showMeetingItem = true;
+    },
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList && fileList.length > 0) {
+        this.$refs.fileForm.clearValidate(["listFile"]);
+      }else{
+        this.fileList = [];
+      }
+    },
+    /** 查询文件资料列表 */
+    getList() {
+      this.loading = true;
+      if (this.projectId) {
+        this.queryParams.projectPoolId = this.projectId;
+      }
+      listProjectTechnology(this.queryParams).then((response) => {
+        this.projectTechnologyList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fileName: null,
+        fileType: null,
+        projectPoolId: null,
+        projectName: null,
+        projectStage: null,
+        meetingTheme: null,
+        fileBusinessId: null,
+        delFlag: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.orderByColumn = "createTime";
+      this.queryParams.isAsc = "desc";
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.idsName = selection.map((item) => item.fileName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd(projectId) {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      if (projectId && typeof projectId === "string") {
+        this.pageType = "1";
+        let projectItemMessage = this.$store.getters.projectItemMessage;
+        this.form.projectPoolId = projectItemMessage.id;
+        this.form.projectName = projectItemMessage.projectName;
+        this.form.projectStage = projectItemMessage.projectStage;
+      }
+      this.open = true;
+      this.title = "添加文件资料";
+      // 设置新增时的默认文件类别
+      this.form.fileType = "n";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      let that = this;
+      this.reset();
+      // 1. 判断参数是否为事件对象(页面级按钮点击)
+      if (row instanceof PointerEvent) {
+        // 从全局选中的数据中获取 ID(假设用 selectRowList 存储选中项)
+        row = this.selectRowList[0];
+      }
+      const id = row.id || this.ids;
+      getProjectTechnology(id).then((response) => {
+        this.form = response.data;
+        this.form.projectName = response.data.tProjectPool.projectName;
+        this.form.projectStage = response.data.tProjectPool.projectStage;
+        this.open = true;
+        this.title = "修改文件资料";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      //取消该项校验
+      // console.log(this.fileList.length > 0);
+      this.$refs["fileForm"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateProjectTechnology(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProjectTechnology(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.fileName ? row.fileName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delProjectTechnology(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "file/projectTechnology/export",
+        {
+          ...this.queryParams,
+        },
+        `projectTechnology_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>