Forráskód Böngészése

11482-【CR】【投资系统】增加审批流程-资料管理拆分

hxy 6 hónapja
szülő
commit
66020c9503
27 módosított fájl, 6894 hozzáadás és 0 törlés
  1. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/BusinessPlanController.java
  2. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/FinancialStatementsController.java
  3. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/InvestmentAmountController.java
  4. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/InvestmentPotentialController.java
  5. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectApprovalController.java
  6. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectFounderProfileController.java
  7. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectInitiationKeyController.java
  8. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectMeetingMinutesController.java
  9. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/RiskAssessmentController.java
  10. 44 0
      ruoyi-ui/src/api/study/businessPlan.js
  11. 44 0
      ruoyi-ui/src/api/study/financialStatements.js
  12. 44 0
      ruoyi-ui/src/api/study/investmentAmount.js
  13. 44 0
      ruoyi-ui/src/api/study/investmentPotential.js
  14. 44 0
      ruoyi-ui/src/api/study/projectApproval.js
  15. 44 0
      ruoyi-ui/src/api/study/projectFounderProfile.js
  16. 44 0
      ruoyi-ui/src/api/study/projectInitiationKey.js
  17. 44 0
      ruoyi-ui/src/api/study/projectMeetingMinutes.js
  18. 44 0
      ruoyi-ui/src/api/study/riskAssessment.js
  19. 579 0
      ruoyi-ui/src/views/study/businessPlan/index.vue
  20. 579 0
      ruoyi-ui/src/views/study/financialStatements/index.vue
  21. 579 0
      ruoyi-ui/src/views/study/investmentAmount/index.vue
  22. 579 0
      ruoyi-ui/src/views/study/investmentPotential/index.vue
  23. 579 0
      ruoyi-ui/src/views/study/projectApproval/index.vue
  24. 579 0
      ruoyi-ui/src/views/study/projectFounderProfile/index.vue
  25. 579 0
      ruoyi-ui/src/views/study/projectInitiationKey/index.vue
  26. 579 0
      ruoyi-ui/src/views/study/projectMeetingMinutes/index.vue
  27. 579 0
      ruoyi-ui/src/views/study/riskAssessment/index.vue

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/BusinessPlanController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/businessPlan")
+public class BusinessPlanController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询商业计划书列表
+     */
+    @ApiOperation("查询商业计划书列表")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("a");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出商业计划书列表
+     */
+    @ApiOperation("导出商业计划书列表")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:export')")
+    @Log(title = "商业计划书", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("a");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "商业计划书数据");
+    }
+
+    /**
+     * 获取商业计划书详细信息
+     */
+    @ApiOperation("获取商业计划书详细信息")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增商业计划书
+     */
+    @ApiOperation("新增商业计划书")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:add')")
+    @Log(title = "商业计划书", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改商业计划书
+     */
+    @ApiOperation("修改商业计划书")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:edit')")
+    @Log(title = "商业计划书", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除商业计划书
+     */
+    @ApiOperation("删除商业计划书")
+    @PreAuthorize("@ss.hasPermi('study:businessPlan:remove')")
+    @Log(title = "商业计划书", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/FinancialStatementsController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/financialStatements")
+public class FinancialStatementsController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询财务报表列表
+     */
+    @ApiOperation("查询财务报表列表")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("g");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出财务报表列表
+     */
+    @ApiOperation("导出财务报表列表")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:export')")
+    @Log(title = "财务报表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("g");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "财务报表数据");
+    }
+
+    /**
+     * 获取财务报表详细信息
+     */
+    @ApiOperation("获取财务报表详细信息")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增财务报表
+     */
+    @ApiOperation("新增财务报表")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:add')")
+    @Log(title = "财务报表", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改财务报表
+     */
+    @ApiOperation("修改财务报表")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:edit')")
+    @Log(title = "财务报表", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除财务报表
+     */
+    @ApiOperation("删除财务报表")
+    @PreAuthorize("@ss.hasPermi('study:financialStatements:remove')")
+    @Log(title = "财务报表", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/InvestmentAmountController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/investmentAmount")
+public class InvestmentAmountController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询投资金额分析报告列表
+     */
+    @ApiOperation("查询投资金额分析报告列表")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("i");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出投资金额分析报告列表
+     */
+    @ApiOperation("导出投资金额分析报告列表")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:export')")
+    @Log(title = "投资金额分析报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("i");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "投资金额分析报告数据");
+    }
+
+    /**
+     * 获取投资金额分析报告详细信息
+     */
+    @ApiOperation("获取投资金额分析报告详细信息")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增投资金额分析报告
+     */
+    @ApiOperation("新增投资金额分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:add')")
+    @Log(title = "投资金额分析报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改投资金额分析报告
+     */
+    @ApiOperation("修改投资金额分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:edit')")
+    @Log(title = "投资金额分析报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除投资金额分析报告
+     */
+    @ApiOperation("删除投资金额分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentAmount:remove')")
+    @Log(title = "投资金额分析报告", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/InvestmentPotentialController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/investmentPotential")
+public class InvestmentPotentialController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询投资潜力分析报告列表
+     */
+    @ApiOperation("查询投资潜力分析报告列表")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("h");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出投资潜力分析报告列表
+     */
+    @ApiOperation("导出投资潜力分析报告列表")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:export')")
+    @Log(title = "投资潜力分析报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("h");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "投资潜力分析报告数据");
+    }
+
+    /**
+     * 获取投资潜力分析报告详细信息
+     */
+    @ApiOperation("获取投资潜力分析报告详细信息")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增投资潜力分析报告
+     */
+    @ApiOperation("新增投资潜力分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:add')")
+    @Log(title = "投资潜力分析报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改投资潜力分析报告
+     */
+    @ApiOperation("修改投资潜力分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:edit')")
+    @Log(title = "投资潜力分析报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除投资潜力分析报告
+     */
+    @ApiOperation("删除投资潜力分析报告")
+    @PreAuthorize("@ss.hasPermi('study:investmentPotential:remove')")
+    @Log(title = "投资潜力分析报告", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectApprovalController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/projectApproval")
+public class ProjectApprovalController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询立项审批文件列表
+     */
+    @ApiOperation("查询立项审批文件列表")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("b");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出立项审批文件列表
+     */
+    @ApiOperation("导出立项审批文件列表")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:export')")
+    @Log(title = "立项审批文件", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("b");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "立项审批文件数据");
+    }
+
+    /**
+     * 获取立项审批文件详细信息
+     */
+    @ApiOperation("获取立项审批文件详细信息")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增立项审批文件
+     */
+    @ApiOperation("新增立项审批文件")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:add')")
+    @Log(title = "立项审批文件", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改立项审批文件
+     */
+    @ApiOperation("修改立项审批文件")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:edit')")
+    @Log(title = "立项审批文件", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除立项审批文件
+     */
+    @ApiOperation("删除立项审批文件")
+    @PreAuthorize("@ss.hasPermi('study:projectApproval:remove')")
+    @Log(title = "立项审批文件", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectFounderProfileController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/projectFounderProfile")
+public class ProjectFounderProfileController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询项目创始人档案列表
+     */
+    @ApiOperation("查询项目创始人档案列表")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("f");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出项目创始人档案列表
+     */
+    @ApiOperation("导出项目创始人档案列表")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:export')")
+    @Log(title = "项目创始人档案", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("f");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "项目创始人档案数据");
+    }
+
+    /**
+     * 获取项目创始人档案详细信息
+     */
+    @ApiOperation("获取项目创始人档案详细信息")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增项目创始人档案
+     */
+    @ApiOperation("新增项目创始人档案")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:add')")
+    @Log(title = "项目创始人档案", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改项目创始人档案
+     */
+    @ApiOperation("修改项目创始人档案")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:edit')")
+    @Log(title = "项目创始人档案", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除项目创始人档案
+     */
+    @ApiOperation("删除项目创始人档案")
+    @PreAuthorize("@ss.hasPermi('study:projectFounderProfile:remove')")
+    @Log(title = "项目创始人档案", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectInitiationKeyController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/projectInitiationKey")
+public class ProjectInitiationKeyController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询立项关键信息列表
+     */
+    @ApiOperation("查询立项关键信息列表")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("c");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出立项关键信息列表
+     */
+    @ApiOperation("导出立项关键信息列表")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:export')")
+    @Log(title = "立项关键信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("c");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "立项关键信息数据");
+    }
+
+    /**
+     * 获取立项关键信息详细信息
+     */
+    @ApiOperation("获取立项关键信息详细信息")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增立项关键信息
+     */
+    @ApiOperation("新增立项关键信息")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:add')")
+    @Log(title = "立项关键信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改立项关键信息
+     */
+    @ApiOperation("修改立项关键信息")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:edit')")
+    @Log(title = "立项关键信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除立项关键信息
+     */
+    @ApiOperation("删除立项关键信息")
+    @PreAuthorize("@ss.hasPermi('study:projectInitiationKey:remove')")
+    @Log(title = "立项关键信息", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/ProjectMeetingMinutesController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/projectMeetingMinutes")
+public class ProjectMeetingMinutesController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询项目会议纪要列表
+     */
+    @ApiOperation("查询项目会议纪要列表")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("e");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出项目会议纪要列表
+     */
+    @ApiOperation("导出项目会议纪要列表")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:export')")
+    @Log(title = "项目会议纪要", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("e");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "项目会议纪要数据");
+    }
+
+    /**
+     * 获取项目会议纪要详细信息
+     */
+    @ApiOperation("获取项目会议纪要详细信息")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增项目会议纪要
+     */
+    @ApiOperation("新增项目会议纪要")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:add')")
+    @Log(title = "项目会议纪要", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改项目会议纪要
+     */
+    @ApiOperation("修改项目会议纪要")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:edit')")
+    @Log(title = "项目会议纪要", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除项目会议纪要
+     */
+    @ApiOperation("删除项目会议纪要")
+    @PreAuthorize("@ss.hasPermi('study:projectMeetingMinutes:remove')")
+    @Log(title = "项目会议纪要", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/study/RiskAssessmentController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.study;
+
+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.TStudyInformation;
+import com.ruoyi.invest.service.ITStudyInformationService;
+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("/study/riskAssessment")
+public class RiskAssessmentController extends BaseController
+{
+    @Autowired
+    private ITStudyInformationService tStudyInformationService;
+
+    @Autowired
+    private ITUnifyFileService tUnifyFileService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    /**
+     * 查询风险评估报告列表
+     */
+    @ApiOperation("查询风险评估报告列表")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TStudyInformation tStudyInformation)
+    {
+        startPage();
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("j");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出风险评估报告列表
+     */
+    @ApiOperation("导出风险评估报告列表")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:export')")
+    @Log(title = "风险评估报告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setCreateBy(getNickName());//默认登陆人权限
+        tStudyInformation.setContractType("j");
+        List<TStudyInformation> list = tStudyInformationService.selectTStudyInformationList(tStudyInformation)
+                .stream().map(n -> {
+                    n.setContractType(dictDataService.selectDictLabel("file_type",n.getContractType()));
+                    return n;
+                })
+                .collect(Collectors.toList());
+        ExcelUtil<TStudyInformation> util = new ExcelUtil<TStudyInformation>(TStudyInformation.class);
+        util.exportExcel(response, list, "风险评估报告数据");
+    }
+
+    /**
+     * 获取风险评估报告详细信息
+     */
+    @ApiOperation("获取风险评估报告详细信息")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return success(tStudyInformationService.selectTStudyInformationById(id));
+    }
+
+    /**
+     * 新增风险评估报告
+     */
+    @ApiOperation("新增风险评估报告")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:add')")
+    @Log(title = "风险评估报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TStudyInformation tStudyInformation)
+    {
+        tStudyInformation.setId(IdUtils.fastSimpleUUID());
+        tStudyInformation.setCreateBy(getNickName());
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+
+        return toAjax(tStudyInformationService.insertTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 修改风险评估报告
+     */
+    @ApiOperation("修改风险评估报告")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:edit')")
+    @Log(title = "风险评估报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStudyInformation tStudyInformation)
+    {
+        // todo 保存附件信息
+        tUnifyFileService.insertTUnifyFileList(tStudyInformation.getListFile(),
+                null,
+                tStudyInformation.getId(),
+                String.valueOf(FileType.GEN.ordinal()),
+                getNickName());
+        
+        return toAjax(tStudyInformationService.updateTStudyInformation(tStudyInformation));
+    }
+
+    /**
+     * 删除风险评估报告
+     */
+    @ApiOperation("删除风险评估报告")
+    @PreAuthorize("@ss.hasPermi('study:riskAssessment:remove')")
+    @Log(title = "风险评估报告", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(tStudyInformationService.updateTStudyInformationByIds(ids));
+    }
+}

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

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

+ 44 - 0
ruoyi-ui/src/api/study/financialStatements.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询财务报表列表
+export function listFinancialStatements(query) {
+  return request({
+    url: '/study/financialStatements/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询财务报表详细
+export function getFinancialStatements(id) {
+  return request({
+    url: '/study/financialStatements/' + id,
+    method: 'get'
+  })
+}
+
+// 新增财务报表
+export function addFinancialStatements(data) {
+  return request({
+    url: '/study/financialStatements',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改财务报表
+export function updateFinancialStatements(data) {
+  return request({
+    url: '/study/financialStatements',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除财务报表
+export function delFinancialStatements(id) {
+  return request({
+    url: '/study/financialStatements/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/investmentAmount.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询投资金额分析报告列表
+export function listInvestmentAmount(query) {
+  return request({
+    url: '/study/investmentAmount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询投资金额分析报告详细
+export function getInvestmentAmount(id) {
+  return request({
+    url: '/study/investmentAmount/' + id,
+    method: 'get'
+  })
+}
+
+// 新增投资金额分析报告
+export function addInvestmentAmount(data) {
+  return request({
+    url: '/study/investmentAmount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改投资金额分析报告
+export function updateInvestmentAmount(data) {
+  return request({
+    url: '/study/investmentAmount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除投资金额分析报告
+export function delInvestmentAmount(id) {
+  return request({
+    url: '/study/investmentAmount/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/investmentPotential.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listInvestmentPotential(query) {
+  return request({
+    url: '/study/investmentPotential/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getInvestmentPotential(id) {
+  return request({
+    url: '/study/investmentPotential/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addInvestmentPotential(data) {
+  return request({
+    url: '/study/investmentPotential',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateInvestmentPotential(data) {
+  return request({
+    url: '/study/investmentPotential',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delInvestmentPotential(id) {
+  return request({
+    url: '/study/investmentPotential/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/projectApproval.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listProjectApproval(query) {
+  return request({
+    url: '/study/projectApproval/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getProjectApproval(id) {
+  return request({
+    url: '/study/projectApproval/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addProjectApproval(data) {
+  return request({
+    url: '/study/projectApproval',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateProjectApproval(data) {
+  return request({
+    url: '/study/projectApproval',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delProjectApproval(id) {
+  return request({
+    url: '/study/projectApproval/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/projectFounderProfile.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listProjectFounderProfile(query) {
+  return request({
+    url: '/study/projectFounderProfile/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getProjectFounderProfile(id) {
+  return request({
+    url: '/study/projectFounderProfile/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addProjectFounderProfile(data) {
+  return request({
+    url: '/study/projectFounderProfile',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateProjectFounderProfile(data) {
+  return request({
+    url: '/study/projectFounderProfile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delProjectFounderProfile(id) {
+  return request({
+    url: '/study/projectFounderProfile/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/projectInitiationKey.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listProjectInitiationKey(query) {
+  return request({
+    url: '/study/projectInitiationKey/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getProjectInitiationKey(id) {
+  return request({
+    url: '/study/projectInitiationKey/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addProjectInitiationKey(data) {
+  return request({
+    url: '/study/projectInitiationKey',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateProjectInitiationKey(data) {
+  return request({
+    url: '/study/projectInitiationKey',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delProjectInitiationKey(id) {
+  return request({
+    url: '/study/projectInitiationKey/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/projectMeetingMinutes.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listProjectMeetingMinutes(query) {
+  return request({
+    url: '/study/projectMeetingMinutes/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getProjectMeetingMinutes(id) {
+  return request({
+    url: '/study/projectMeetingMinutes/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addProjectMeetingMinutes(data) {
+  return request({
+    url: '/study/projectMeetingMinutes',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateProjectMeetingMinutes(data) {
+  return request({
+    url: '/study/projectMeetingMinutes',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delProjectMeetingMinutes(id) {
+  return request({
+    url: '/study/projectMeetingMinutes/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/study/riskAssessment.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询研究资料管理列表
+export function listRiskAssessment(query) {
+  return request({
+    url: '/study/riskAssessment/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询研究资料管理详细
+export function getRiskAssessment(id) {
+  return request({
+    url: '/study/riskAssessment/' + id,
+    method: 'get'
+  })
+}
+
+// 新增研究资料管理
+export function addRiskAssessment(data) {
+  return request({
+    url: '/study/riskAssessment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改研究资料管理
+export function updateRiskAssessment(data) {
+  return request({
+    url: '/study/riskAssessment',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除研究资料管理
+export function delRiskAssessment(id) {
+  return request({
+    url: '/study/riskAssessment/' + id,
+    method: 'delete'
+  })
+}

+ 579 - 0
ruoyi-ui/src/views/study/businessPlan/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study: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="handleSelectData(1)"
+          v-hasPermi="['study:businessPlan:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study: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="['study:businessPlan:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="businessPlanList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:businessPlan:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listBusinessPlan, getBusinessPlan, delBusinessPlan, addBusinessPlan, updateBusinessPlan } from "@/api/study/businessPlan";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "BusinessPlan",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      businessPlanList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      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,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "a";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getBusinessPlan(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getBusinessPlan(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].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.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delBusinessPlan(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/businessPlan/export",
+        {
+          ...this.queryParams,
+        },
+        `businessPlan_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/financialStatements/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:financialStatements:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:financialStatements:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:financialStatements: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="['study:financialStatements:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="financialStatementsList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:financialStatements:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:financialStatements: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listFinancialStatements, getFinancialStatements, delFinancialStatements, addFinancialStatements, updateFinancialStatements } from "@/api/study/financialStatements";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "FinancialStatements",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      financialStatementsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listFinancialStatements(this.queryParams).then((response) => {
+        this.financialStatementsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "g";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getFinancialStatements(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getFinancialStatements(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateFinancialStatements(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addFinancialStatements(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delFinancialStatements(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/financialStatements/export",
+        {
+          ...this.queryParams,
+        },
+        `financialStatements_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/investmentAmount/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:investmentAmount:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:investmentAmount:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:investmentAmount: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="['study:investmentAmount:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="investmentAmountList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:investmentAmount:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:investmentAmount: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listInvestmentAmount, getInvestmentAmount, delInvestmentAmount, addInvestmentAmount, updateInvestmentAmount } from "@/api/study/investmentAmount";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "InvestmentAmount",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      investmentAmountList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listInvestmentAmount(this.queryParams).then((response) => {
+        this.investmentAmountList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "i";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getInvestmentAmount(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getInvestmentAmount(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateInvestmentAmount(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInvestmentAmount(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delInvestmentAmount(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/investmentAmount/export",
+        {
+          ...this.queryParams,
+        },
+        `investmentAmount_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/investmentPotential/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:investmentPotential:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:investmentPotential:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:investmentPotential: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="['study:investmentPotential:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="investmentPotentialList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:investmentPotential:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:investmentPotential: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listInvestmentPotential, getInvestmentPotential, delInvestmentPotential, addInvestmentPotential, updateInvestmentPotential } from "@/api/study/investmentPotential";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "InvestmentPotential",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      investmentPotentialList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listInvestmentPotential(this.queryParams).then((response) => {
+        this.investmentPotentialList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "h";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getInvestmentPotential(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getInvestmentPotential(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateInvestmentPotential(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInvestmentPotential(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delInvestmentPotential(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/investmentPotential/export",
+        {
+          ...this.queryParams,
+        },
+        `investmentPotential_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/projectApproval/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:projectApproval:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:projectApproval:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:projectApproval: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="['study:projectApproval:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="projectApprovalList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:projectApproval:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:projectApproval: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listProjectApproval, getProjectApproval, delProjectApproval, addProjectApproval, updateProjectApproval } from "@/api/study/projectApproval";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "ProjectApproval",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      projectApprovalList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listProjectApproval(this.queryParams).then((response) => {
+        this.projectApprovalList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "b";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectApproval(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectApproval(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateProjectApproval(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProjectApproval(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delProjectApproval(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/projectApproval/export",
+        {
+          ...this.queryParams,
+        },
+        `projectApproval_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/projectFounderProfile/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:projectFounderProfile:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:projectFounderProfile:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:projectFounderProfile: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="['study:projectFounderProfile:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="projectFounderProfileList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:projectFounderProfile:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:projectFounderProfile: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listProjectFounderProfile, getProjectFounderProfile, delProjectFounderProfile, addProjectFounderProfile, updateProjectFounderProfile } from "@/api/study/projectFounderProfile";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "ProjectFounderProfile",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      projectFounderProfileList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listProjectFounderProfile(this.queryParams).then((response) => {
+        this.projectFounderProfileList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "f";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectFounderProfile(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectFounderProfile(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateProjectFounderProfile(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProjectFounderProfile(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delProjectFounderProfile(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/projectFounderProfile/export",
+        {
+          ...this.queryParams,
+        },
+        `projectFounderProfile_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/projectInitiationKey/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:projectInitiationKey:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:projectInitiationKey:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:projectInitiationKey: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="['study:projectInitiationKey:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="projectInitiationKeyList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:projectInitiationKey:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:projectInitiationKey: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listProjectInitiationKey, getProjectInitiationKey, delProjectInitiationKey, addProjectInitiationKey, updateProjectInitiationKey } from "@/api/study/projectInitiationKey";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "ProjectInitiationKey",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      projectInitiationKeyList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listProjectInitiationKey(this.queryParams).then((response) => {
+        this.projectInitiationKeyList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "c";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectInitiationKey(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectInitiationKey(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateProjectInitiationKey(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProjectInitiationKey(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delProjectInitiationKey(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/projectInitiationKey/export",
+        {
+          ...this.queryParams,
+        },
+        `projectInitiationKey_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/projectMeetingMinutes/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:projectMeetingMinutes:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:projectMeetingMinutes:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:projectMeetingMinutes: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="['study:projectMeetingMinutes:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="projectMeetingMinutesList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:projectMeetingMinutes:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:projectMeetingMinutes: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listProjectMeetingMinutes, getProjectMeetingMinutes, delProjectMeetingMinutes, addProjectMeetingMinutes, updateProjectMeetingMinutes } from "@/api/study/projectMeetingMinutes";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "ProjectMeetingMinutes",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      projectMeetingMinutesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listProjectMeetingMinutes(this.queryParams).then((response) => {
+        this.projectMeetingMinutesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "e";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectMeetingMinutes(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getProjectMeetingMinutes(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateProjectMeetingMinutes(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProjectMeetingMinutes(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delProjectMeetingMinutes(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/projectMeetingMinutes/export",
+        {
+          ...this.queryParams,
+        },
+        `projectMeetingMinutes_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>

+ 579 - 0
ruoyi-ui/src/views/study/riskAssessment/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="资料名称" prop="contractName">
+        <el-input
+          v-model.trim="queryParams.contractName"
+          placeholder="请输入资料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="资料类别" prop="contractType">
+        <el-select
+          v-model="queryParams.contractType"
+          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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['study:riskAssessment:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(1)"
+          v-hasPermi="['study:riskAssessment:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="single"
+          @click="handleSelectData(2)"
+          v-hasPermi="['study:riskAssessment: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="['study:riskAssessment:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      ref="dataTable"
+      @row-click="clickRow"
+      class="tableWrapper"
+      v-loading="loading"
+      border
+      :data="riskAssessmentList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column
+        type="index"
+        label="序号"
+        width="50"
+        align="center"
+      ></el-table-column>
+      <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
+      <el-table-column label="资料名称" align="center" prop="contractName">
+        <template slot-scope="scope">
+          <div
+            :title="scope.row.contractName"
+            class="public-text-blue public-cursor"
+            @click="handleDetail(scope.row)"
+          >
+            {{ scope.row.contractName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料类别" align="center" prop="contractType">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.file_type"
+            :value="scope.row.contractType"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="备注" 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="创建人" 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="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <div :title="scope.row.createTime">
+            {{ scope.row.createTime }}
+          </div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        label="附件业务ID"
+        align="center"
+        prop="fileBusinessId"
+      /> -->
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['study:riskAssessment:edit']"
+            >修改</el-button
+          >
+          <!-- <el-button
+            v-if="user.nickName !== scope.row.createBy"
+            class="custom-blue-color"
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleDetail(scope.row)"
+            >详情</el-button
+          > -->
+          <el-button
+            v-if="user.nickName === scope.row.createBy"
+            class="custom-red-color"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['study:riskAssessment: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="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input
+            maxlength="100"
+            v-model="form.contractName"
+            placeholder="请输入资料名称"
+          />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select
+            v-model="form.contractType"
+            placeholder="请选择资料类别"
+            style="width: 100%"
+            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="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">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 研究资料详情 -->
+    <el-dialog
+      title="研究资料详情"
+      :visible.sync="openDetail"
+      width="1250px"
+      append-to-body
+    >
+      <el-form
+        class="special-el-form"
+        ref="form"
+        :model="form"
+        label-width="80px"
+      >
+        <el-form-item label="资料名称" prop="contractName">
+          <el-input maxlength="100" v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="资料类别" prop="contractType">
+          <el-select v-model="form.contractType" disabled style="width: 100%">
+            <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="listFile" class="special-el-form-item">
+          <fileItem
+            ref="fileItemsDet"
+            :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"
+            disabled
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openDetail = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRiskAssessment, getRiskAssessment, delRiskAssessment, addRiskAssessment, updateRiskAssessment } from "@/api/study/riskAssessment";
+
+import { mapGetters } from "vuex";
+import fileItem from "../../invest/components/fileItem";
+export default {
+  name: "RiskAssessment",
+  components: { fileItem },
+  dicts: ["file_type"],
+  data() {
+    const validateLogo = (rule, value, callback) => {
+      if (this.fileList.length <= 0) {
+        callback(new Error("请上传文件"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      fileList: [],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选中数组
+      selectRowList: [],
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 研究资料管理表格数据
+      riskAssessmentList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contractName: null,
+        contractType: null,
+        fileBusinessId: null,
+        orderByColumn: "createTime",
+        isAsc: "desc",
+      },
+      // 表单参数
+      form: {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        listFile: null,
+      },
+      // 表单校验
+      rules: {
+        contractName: [{ required: true, trigger: "blur", message: "请输入" }],
+        contractType: [
+          { required: true, trigger: "change", message: "请选择" },
+        ],
+        listFile: [{ required: true, validator: validateLogo }],
+      },
+      openDetail: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["user"]),
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取fileList
+    getFileList(fileList) {
+      this.fileList = fileList;
+      if (fileList.length > 0) {
+        this.$refs.form.clearValidate(["listFile"]);
+      }
+    },
+
+    /** 查询研究资料管理列表 */
+    getList() {
+      this.loading = true;
+      listRiskAssessment(this.queryParams).then((response) => {
+        this.riskAssessmentList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        contractName: null,
+        contractType: null,
+        delFlag: null,
+        fileBusinessId: 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.contractName);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+      this.selectRowList = selection;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      let that = this;
+      this.fileList = [];
+      this.reset();
+      this.open = true;
+      this.title = "添加研究资料管理";
+      // 设置新增时的默认资料类别
+      this.form.contractType = "j";
+      setTimeout(() => {
+        that.$refs.fileItems.fileList = [];
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getRiskAssessment(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改研究资料管理";
+        setTimeout(() => {
+          this.$refs.fileItems.fileList = [];
+          this.$refs.fileItems.getListFileBusinessId(id);
+        }, 300);
+      });
+    },
+    // 详情
+    handleDetail(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getRiskAssessment(id).then((response) => {
+        this.form = response.data;
+        this.openDetail = true;
+        setTimeout(() => {
+          this.$refs.fileItemsDet.fileList = [];
+          this.$refs.fileItemsDet.getListFileBusinessId(id);
+          this.$refs.fileItemsDet.handleButton();
+        }, 300);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.listFile = this.fileList;
+          if (this.form.id != null) {
+            updateRiskAssessment(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addRiskAssessment(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const idsName = row.contractName ? row.contractName : this.idsName;
+      this.$modal
+        .confirm('是否确认删除"' + idsName + '"?')
+        .then(function () {
+          return delRiskAssessment(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "study/riskAssessment/export",
+        {
+          ...this.queryParams,
+        },
+        `riskAssessment_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    clickRow(row) {
+      this.$refs.dataTable.toggleRowSelection(row);
+    },
+    handleSelectData(type) {
+      // type 1=修改 2=删除
+      if (this.selectRowList.length == 1) {
+        const row = this.selectRowList[0];
+        // 创建人
+        if (row.createBy === this.user.nickName) {
+          if (type === 1) {
+            // 修改
+            this.handleUpdate(row);
+          } else if (type === 2) {
+            // 删除
+            this.handleDelete(row);
+          }
+        } else {
+          this.$message({
+            message: "无权限",
+            duration: 1200,
+            type: "error",
+          });
+        }
+      } else {
+        this.$message({
+          message: "只能选择一条数据",
+          duration: 1200,
+          type: "warning",
+        });
+      }
+    },
+  },
+};
+</script>