diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/controller/PayDraftingGroupResearchProjectController.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/controller/PayDraftingGroupResearchProjectController.java
new file mode 100644
index 00000000..3ad28620
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/controller/PayDraftingGroupResearchProjectController.java
@@ -0,0 +1,215 @@
+package com.jero.drafting.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jero.common.api.vo.Result;
+import com.jero.common.aspect.annotation.AutoLog;
+import com.jero.common.exception.JeroBootException;
+import com.jero.common.system.base.controller.JeroController;
+import com.jero.common.util.ValidUtil;
+import com.jero.drafting.entity.PayDraftingGroupResearchProject;
+import com.jero.drafting.entity.PayDraftingGroupSubItemContacts;
+import com.jero.drafting.service.IPayDraftingGroupResearchProjectService;
+import com.jero.drafting.service.IPayDraftingGroupService;
+import com.jero.drafting.service.IPayDraftingGroupSubItemContactsService;
+import com.jero.modules.oss.service.IOSSFileService;
+import com.jero.project.entity.PayResearchProject;
+import com.jero.project.service.IPayResearchProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ *
+ * 起草组 在研项目表 前端控制器
+ *
+ *
+ * @author sz
+ * @since 2024-01-05
+ */
+@Api(tags="起草组 在研项目")
+@RestController
+@RequestMapping("/drafting/payDraftingGroupResearchProject")
+@Slf4j
+public class PayDraftingGroupResearchProjectController extends JeroController {
+ @Autowired
+ private IPayDraftingGroupResearchProjectService payDraftingGroupResearchProjectService;
+
+ @Autowired
+ private IOSSFileService iossFileService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param payResearchProject
+ * @param pageNo
+ * @param pageSize
+ * @param
+ * @return
+ */
+ @AutoLog(value = "起草组-在研项目-分页列表查询")
+ @ApiOperation(value="起草组-在研项目-分页列表查询", notes="起草组-在研项目-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(PayDraftingGroupResearchProject payResearchProject,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize
+ ) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if(StringUtils.isNotBlank(payResearchProject.getDraftingGroupId())){
+ queryWrapper.eq("drafting_group_id",payResearchProject.getDraftingGroupId());
+ }else {
+ return Result.error("起草组id为空!");
+ }
+ if(StringUtils.isNotBlank(payResearchProject.getProjectName())){
+ queryWrapper.like("project_name",payResearchProject.getProjectName());
+ }
+ Page page = new Page<>(pageNo, pageSize);
+ IPage pageList = payDraftingGroupResearchProjectService.pageList(page,queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 新增
+ *
+ * @param payResearchProject
+ * @return
+ */
+ @Transactional
+ @AutoLog(value = "起草组-在研项目-新增")
+ @ApiOperation(value="起草组-在研项目-新增", notes="起草组-在研项目-新增")
+ @PostMapping(value = "/add")
+ public Result> add(@RequestBody PayDraftingGroupResearchProject payResearchProject) {
+ StringBuilder msg = ValidUtil.validateAll(payResearchProject);
+ if (!StringUtils.isBlank(msg)) {
+ return Result.error(msg.toString());
+ }
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("drafting_group_id",payResearchProject.getDraftingGroupId());
+ queryWrapper.eq("project_name",payResearchProject.getProjectName());
+ int count = payDraftingGroupResearchProjectService.count(queryWrapper);
+ if (count>0) {
+ return Result.error("项目名称已存在");
+ }
+ payDraftingGroupResearchProjectService.save(payResearchProject);
+ if(StringUtils.isNotBlank(payResearchProject.getFiles())){
+ String files = payResearchProject.getFiles();
+ List filesList = Arrays.asList(files.split(","));
+ for(String s:filesList){
+ if(StringUtils.isBlank(s)){
+ throw new JeroBootException("文件id不能为空!");
+ }
+ UUID uuid = UUID.randomUUID();
+ payDraftingGroupResearchProjectService.saveFile(uuid.toString(),s,payResearchProject.getId());
+ }
+ }
+ return Result.OK("新增成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @Transactional
+ @AutoLog(value = "起草组-在研项目-通过id删除")
+ @ApiOperation(value="起草组-在研项目-通过id删除", notes="起草组-在研项目-通过id删除")
+ @GetMapping(value = "/delete")
+ public Result> delete(@RequestParam(name="id",required=true) String id) {
+ if (StringUtils.isBlank(id)) {
+ return Result.error("id不能为空");
+ }
+ //删除关联文件表
+ payDraftingGroupResearchProjectService.deleteFile(id);
+ //删除文件表
+ PayDraftingGroupResearchProject payResearchProject = payDraftingGroupResearchProjectService.getById(id);
+ if (Objects.isNull(payResearchProject)) {
+ return Result.error("对象不存在");
+ }
+ if(StringUtils.isNotBlank(payResearchProject.getFiles())){
+ List filesList = Arrays.asList(payResearchProject.getFiles().split(","));
+ iossFileService.removeByIds(filesList);
+ }
+ payDraftingGroupResearchProjectService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "起草组-在研项目-批量删除")
+ @ApiOperation(value="起草组-在研项目-批量删除", notes="起草组-在研项目-批量删除")
+ @GetMapping(value = "/deleteBatch")
+ public Result> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ if (StringUtils.isBlank(ids)) {
+ return Result.error("id不能为空");
+ }
+ List strings = Arrays.asList(ids.split(","));
+ for(String s:strings){
+ delete(s);
+ }
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param payResearchProject
+ * @return
+ */
+ @Transactional
+ @AutoLog(value = "起草组-在研项目-编辑")
+ @ApiOperation(value="起草组-在研项目-编辑", notes="起草组-在研项目-编辑")
+ @PostMapping(value = "/edit")
+ public Result> edit(@RequestBody PayDraftingGroupResearchProject payResearchProject) {
+ StringBuilder msg = ValidUtil.validateAll(payResearchProject);
+ if (!StringUtils.isBlank(msg)) {
+ return Result.error(msg.toString());
+ }
+ if (StringUtils.isBlank(payResearchProject.getId())) {
+ return Result.error("在研项目的id不能为空");
+ }
+ PayDraftingGroupResearchProject dbPayResearchProject = payDraftingGroupResearchProjectService.getById(payResearchProject.getId());
+ if (Objects.isNull(dbPayResearchProject)) {
+ return Result.error("该项目不存在");
+ }
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("project_name",payResearchProject.getProjectName());
+ queryWrapper.eq("drafting_group_id",payResearchProject.getDraftingGroupId());
+ queryWrapper.ne("id",payResearchProject.getId());
+ int count = payDraftingGroupResearchProjectService.count(queryWrapper);
+ if (count>0) {
+ return Result.error("项目名称已存在,请修改");
+ }
+ //删除关联文件表
+ payDraftingGroupResearchProjectService.deleteFile(payResearchProject.getId());
+ //重新加入关系表
+ if(StringUtils.isNotBlank(payResearchProject.getFiles())){
+ String files = payResearchProject.getFiles();
+ List filesList = Arrays.asList(files.split(","));
+ for(String s:filesList){
+ if(StringUtils.isBlank(s)){
+ throw new JeroBootException("文件id不能为空!");
+ }
+ UUID uuid = UUID.randomUUID();
+ payDraftingGroupResearchProjectService.saveFile(uuid.toString(),s,payResearchProject.getId());
+ }
+ }
+ //更新
+ payDraftingGroupResearchProjectService.updateById(payResearchProject);
+ return Result.OK("编辑成功!");
+ }
+}
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupResearchProject.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupResearchProject.java
new file mode 100644
index 00000000..7d5d12d3
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupResearchProject.java
@@ -0,0 +1,84 @@
+package com.jero.drafting.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jero.data.entity.Files;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+@TableName("pay_drafting_group_research_project")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="pay_drafting_group_research_project对象", description="pay_drafting_group_research_project")
+public class PayDraftingGroupResearchProject {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @ApiModelProperty(value = "主键")
+ private String id;
+
+ /**起草组id*/
+ @NotNull(message ="起草组id不能为空")
+ @ApiModelProperty(value = "起草组id")
+ private String draftingGroupId;
+
+ /**项目名称*/
+ @Excel(name = "项目名称", width = 15)
+ @NotNull(message ="项目名称不能为空")
+ @Size(max = 50,message = "项目名称长度不超过50个字符")
+ @ApiModelProperty(value = "项目名称")
+ private String projectName;
+ /**主要起草单位*/
+ @Excel(name = "主要起草单位", width = 15)
+ @ApiModelProperty(value = "主要起草单位")
+ @NotEmpty(message = "主要起草单位不能为空")
+ private String draftCompany;
+ /**过程文件*/
+ @Excel(name = "过程文件", width = 15)
+ @ApiModelProperty(value = "过程文件(多个都好隔开)")
+ @NotEmpty(message = "过程文件不能为空")
+ private String files;
+
+ /**文件集合*/
+ @TableField(exist = false)
+ @Excel(name = "文件集合", width = 15)
+ @ApiModelProperty(value = "文件集合")
+ private List filesList;
+
+ /**项目进度*/
+ @Excel(name = "项目进度", width = 15)
+ @ApiModelProperty(value = "项目进度")
+ @NotEmpty(message = "项目进度不能为空")
+ private java.lang.String projectSchedule;
+ /**创建人*/
+ @ApiModelProperty(value = "创建人")
+ private java.lang.String createBy;
+ /**创建时间*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @ApiModelProperty(value = "创建时间")
+ private java.util.Date createTime;
+ /**更新人*/
+ @ApiModelProperty(value = "更新人")
+ private java.lang.String updateBy;
+ /**更新时间*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @ApiModelProperty(value = "更新时间")
+ private java.util.Date updateTime;
+}
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupSubItem.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupSubItem.java
index 30ef7f3a..d3c07945 100644
--- a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupSubItem.java
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/entity/PayDraftingGroupSubItem.java
@@ -5,9 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
-import com.jero.common.aspect.annotation.Dict;
-import com.jero.contract.entity.PayIncomeContract;
-import com.jero.project.entity.PayWorkingGroupSubItemContacts;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -15,12 +12,8 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
-import javax.validation.constraints.DecimalMax;
-import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDate;
import java.util.Date;
import java.util.List;
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/PayDraftingGroupResearchProjectMapper.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/PayDraftingGroupResearchProjectMapper.java
new file mode 100644
index 00000000..ad91ef74
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/PayDraftingGroupResearchProjectMapper.java
@@ -0,0 +1,27 @@
+package com.jero.drafting.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jero.drafting.entity.PayDraftingGroupResearchProject;
+import com.jero.drafting.entity.PayDraftingGroupSubItem;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ *
+ * 起草组 在研项目表 Mapper 接口
+ *
+ *
+ * @author sz
+ * @since 2024-01-05
+ */
+public interface PayDraftingGroupResearchProjectMapper extends BaseMapper {
+
+ IPage pageList(Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+ void saveFile(@Param("id")String id,@Param("fileId")String fileId,@Param("projectId") String projectId);
+
+ void deleteFile(@Param("id")String id);
+}
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/xml/PayDraftingGroupResearchProjectMapper.xml b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/xml/PayDraftingGroupResearchProjectMapper.xml
new file mode 100644
index 00000000..dfb90df8
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/mapper/xml/PayDraftingGroupResearchProjectMapper.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ insert into pay_drafting_group_research_project_file (id,project_id,file_id) value (#{id},#{projectId},#{fileId})
+
+
+
+
+
+ delete from pay_drafting_group_research_project_file ppf where ppf.project_id=#{id}
+
+
+
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/IPayDraftingGroupResearchProjectService.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/IPayDraftingGroupResearchProjectService.java
new file mode 100644
index 00000000..e6803146
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/IPayDraftingGroupResearchProjectService.java
@@ -0,0 +1,42 @@
+package com.jero.drafting.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jero.drafting.entity.PayDraftingGroupResearchProject;
+import com.jero.drafting.entity.PayDraftingGroupSubItemContacts;
+import com.jero.project.entity.PayResearchProject;
+
+/**
+ *
+ * 起草组 在研项目表 服务类
+ *
+ *
+ * @author sz
+ * @since 2024-01-05
+ */
+public interface IPayDraftingGroupResearchProjectService extends IService {
+
+ /**
+ * 分页条件查询
+ * @param page
+ * @param queryWrapper
+ * @return
+ */
+ IPage pageList(Page page, QueryWrapper queryWrapper);
+
+ /**
+ * 新增
+ * @param id
+ * @param fileId
+ * @param projectId
+ */
+ void saveFile(String id, String fileId, String projectId);
+
+ /**
+ * 通过id删除
+ * @param id
+ */
+ void deleteFile(String id);
+}
diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/impl/PayDraftingGroupResearchProjectServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/impl/PayDraftingGroupResearchProjectServiceImpl.java
new file mode 100644
index 00000000..d02f14d3
--- /dev/null
+++ b/jero-boot-incoming-payment/src/main/java/com/jero/drafting/service/impl/PayDraftingGroupResearchProjectServiceImpl.java
@@ -0,0 +1,65 @@
+package com.jero.drafting.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jero.drafting.entity.PayDraftingGroupResearchProject;
+import com.jero.drafting.entity.PayDraftingGroupSubItemContacts;
+import com.jero.drafting.mapper.PayDraftingGroupResearchProjectMapper;
+import com.jero.drafting.mapper.PayDraftingGroupSubItemContactsMapper;
+import com.jero.drafting.service.IPayDraftingGroupResearchProjectService;
+import com.jero.drafting.service.IPayDraftingGroupSubItemContactsService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+/**
+ *
+ * 起草组 在研项目表 服务实现类
+ *
+ *
+ * @author sz
+ * @since 2024-01-05
+ */
+@Service
+@Transactional
+public class PayDraftingGroupResearchProjectServiceImpl extends ServiceImpl implements IPayDraftingGroupResearchProjectService {
+
+ @Resource
+ private PayDraftingGroupResearchProjectMapper researchProjectMapper;
+
+ /**
+ * 分页条件查询
+ * @param page
+ * @param queryWrapper
+ * @return
+ */
+ @Override
+ public IPage pageList(Page page, QueryWrapper queryWrapper) {
+ return researchProjectMapper.pageList(page,queryWrapper);
+ }
+
+ /**
+ * 新增
+ * @param id
+ * @param fileId
+ * @param projectId
+ */
+ @Override
+ public void saveFile(String id, String fileId, String projectId) {
+ researchProjectMapper.saveFile(id,fileId,projectId);
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ */
+ @Override
+ public void deleteFile(String id) {
+ researchProjectMapper.deleteFile(id);
+ }
+}