Просмотр исходного кода

会计/加计扣除/高新-研发项目清单

zhouli месяцев назад: 9
Родитель
Сommit
924bb75fb2

+ 13 - 1
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmFinanceEntity.java

@@ -4,12 +4,15 @@ package org.sky.scientific.pojo.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.sky.core.tenant.mp.TenantEntity;
 
 import java.io.Serial;
+import java.util.List;
 
 /**
  * 会计/加计扣除/高新-研发项目清单 实体类
@@ -25,8 +28,12 @@ public class XmFinanceEntity extends TenantEntity {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
+	@Schema(description = "所属年份")
+	@NotBlank(message = "参数yearAndMonth不能为空")
+	private String yearAndMonth;
+
 	@Schema(description = "研发项目ID")
-	@NotNull(message = "研发项目ID不能为空")
+//	@NotNull(message = "研发项目ID不能为空")
 	private Long xmId;
 
 	@Schema(description = "研发项目编号")
@@ -40,4 +47,9 @@ public class XmFinanceEntity extends TenantEntity {
 	@NotNull(message = "参数type不能为空")
 	@Schema(description = "类型,1:会计,2:加计扣除,3:高新")
 	private Integer type;
+
+	@NotEmpty(message = "请选择研发项目,可多选")
+	@Schema(description = "新增时将多选的项目id放入数组")
+	@TableField(exist = false)
+	private List<Long> xmIdList;
 }

+ 34 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmController.java

@@ -19,6 +19,7 @@ import org.sky.core.secure.KdUser;
 import org.sky.core.secure.annotation.IsAdmin;
 import org.sky.core.tool.api.R;
 import org.sky.core.tool.utils.DateUtil;
+import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.XmExcel;
 import org.sky.scientific.pojo.dto.XmDTO;
 import org.sky.scientific.pojo.entity.XmEntity;
@@ -56,6 +57,14 @@ public class XmController extends KdController {
 		return R.data(pages);
 	}
 
+	@GetMapping("/list-year")
+	@ApiOperationSupport(order = 1)
+	@Operation(summary = "年度科研项目-列表", description  = "传入xm")
+	public R<List<XmEntity>> list(String year) {
+		List<XmEntity> list = service.selectXmListByYear(year);
+		return R.data(list);
+	}
+
 	@GetMapping("/assist/list")
 	@ApiOperationSupport(order = 1)
 	@Operation(summary = "辅助核算-列表", description  = "yearAndMonth:2025")
@@ -114,4 +123,29 @@ public class XmController extends KdController {
 	public R<IPage<XmFinanceEntity>> selectXmFinancePage(Query query, XmFinanceEntity dto) {
 		return R.data(xmFinanceService.selectXmFinancePage(Condition.getPage(query), dto));
 	}
+
+	@PostMapping("finance/fetch")
+	@ApiOperationSupport(order = 21)
+	@Operation(summary = "会计/加计扣除/高新-研发项目清单-引入", description = "传入yearAndMonth、type即可")
+	public R<Boolean> fetchFinance(XmFinanceEntity entity){
+		return R.status(xmFinanceService.fetchFinance(entity));
+	}
+
+	@PostMapping("finance/save")
+	@ApiOperationSupport(order = 21)
+	@Operation(summary = "会计/加计扣除/高新-研发项目清单-新增")
+	public R<Boolean> saveFinance(@Valid @RequestBody XmFinanceEntity entity){
+		return R.status(xmFinanceService.saveFinance(entity));
+	}
+
+	@PostMapping("finance/remove")
+	@ApiOperationSupport(order = 22)
+	@Operation(summary = "会计/加计扣除/高新-研发项目清单-批量删除", description = "传入ids")
+	public R removeFinance(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(xmFinanceService.physicalDeleteByIds(Func.toLongList(ids)));
+	}
+
+
+
+
 }

+ 7 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmFinanceMapper.java

@@ -21,4 +21,11 @@ public interface XmFinanceMapper extends BaseMapper<XmFinanceEntity> {
 	 * @return
 	 */
 	List<XmFinanceEntity> selectXmFinancePage(IPage<XmFinanceEntity> page, @Param("ew") XmFinanceEntity dto);
+
+	/**
+	 * 批量删除
+	 * @param ids
+	 * @return
+	 */
+    boolean physicalDeleteByIds(List<Long> ids);
 }

+ 10 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmFinanceMapper.xml

@@ -18,6 +18,14 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
 
+    <delete id="physicalDeleteByIds">
+        DELETE FROM kd_xm_finance
+        WHERE id IN
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
+
     <select id="selectXmFinancePage" resultMap="ResultMap">
         SELECT kxf.*, xm.XMBH, xm.XMMC
         FROM kd_xm_finance kxf
@@ -30,9 +38,9 @@
               COALESCE((SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMKSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMKSSJ) AS XMKSSJ,
               COALESCE((SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMJSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMJSSJ) AS XMJSSJ
            FROM kd_xm xm
-           WHERE #{ew.year_and_month} between XMKSSJ and XMJSSJ
+           WHERE #{ew.yearAndMonth} between XMKSSJ and XMJSSJ
         ) xm ON xm.id = kxf.xm_id
-        WHERE kxf.year_and_month = #{ew.year_and_month} and kxf.type = #{ew.type}
+        WHERE kxf.year_and_month = #{ew.yearAndMonth} and kxf.type = #{ew.type}
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.XMMC like concat('%',#{ew.xmmc},'%')</if>
     </select>
 </mapper>

+ 7 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmMapper.java

@@ -33,6 +33,13 @@ public interface XmMapper extends BaseMapper<XmEntity> {
 	 */
 	List<XmEntity> selectXmPage(IPage page, @Param("ew")XmDTO xm);
 
+	/**
+	 * 项目列表,查询年度项目
+	 * @param year
+	 * @return
+	 */
+	List<XmEntity> selectXmListByYear(@Param("year") String year);
+
 
 	/**
 	 * 获取导出数据

+ 11 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmMapper.xml

@@ -47,6 +47,17 @@
         WHERE DATE_FORMAT(XMKSSJ, '%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth}
     </select>
 
+    <select id="selectXmListByYear" resultMap="ResultMap">
+        SELECT
+            xm.id,
+            xm.XMBH,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMMC' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') <![CDATA[<=]]> #{year} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMMC) AS XMMC,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMKSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') <![CDATA[<=]]> #{year} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMKSSJ) AS XMKSSJ,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMJSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') <![CDATA[<=]]> #{year} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMJSSJ) AS XMJSSJ
+        FROM kd_xm xm
+        WHERE #{year} between DATE_FORMAT(XMKSSJ, '%Y') and DATE_FORMAT(XMJSSJ, '%Y')
+    </select>
+
     <select id="exportXm" resultType="org.sky.scientific.excel.XmExcel">
         SELECT * FROM kd_xm ${ew.customSqlSegment}
     </select>

+ 23 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmFinanceService.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.sky.core.mp.base.BaseService;
 import org.sky.scientific.pojo.entity.XmFinanceEntity;
 
+import java.util.List;
+
 /**
  * 会计/加计扣除/高新-研发项目清单 服务类
  *
@@ -15,4 +17,25 @@ public interface IXmFinanceService extends BaseService<XmFinanceEntity> {
 
 
 	IPage<XmFinanceEntity> selectXmFinancePage(IPage<XmFinanceEntity> page, XmFinanceEntity dto);
+
+	/**
+	 * 新增
+	 * @param entity
+	 * @return
+	 */
+	boolean saveFinance(XmFinanceEntity entity);
+
+	/**
+	 * 批量删除
+	 * @param ids
+	 * @return
+	 */
+	boolean physicalDeleteByIds(List<Long> ids);
+
+	/**
+	 * 引入
+	 * @param entity
+	 * @return
+	 */
+	boolean fetchFinance(XmFinanceEntity entity);
 }

+ 8 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmService.java

@@ -29,6 +29,14 @@ public interface IXmService extends BaseService<XmEntity> {
 	 * @return
 	 */
 	IPage<XmEntity> selectXmList(IPage<XmEntity> page, XmDTO xm);
+
+	/**
+	 * 年度项目列表
+	 * @param year
+	 * @return
+	 */
+	List<XmEntity> selectXmListByYear(String year);
+
 	/**
 	 * 导出数据
 	 *

+ 101 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmFinanceServiceImpl.java

@@ -4,13 +4,20 @@ package org.sky.scientific.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
+import org.sky.core.mp.support.Condition;
+import org.sky.core.mp.support.Query;
+import org.sky.core.tool.utils.Func;
 import org.sky.scientific.mapper.XmFinanceMapper;
 import org.sky.scientific.mapper.XmMapper;
+import org.sky.scientific.pojo.entity.XmEntity;
 import org.sky.scientific.pojo.entity.XmFinanceEntity;
 import org.sky.scientific.service.IXmFinanceService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -28,7 +35,101 @@ public class XmFinanceServiceImpl extends BaseServiceImpl<XmFinanceMapper, XmFin
 
 	@Override
 	public IPage<XmFinanceEntity> selectXmFinancePage(IPage<XmFinanceEntity> page, XmFinanceEntity dto) {
+		if (Func.isBlank(dto.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		if (dto.getType() == null || !Arrays.asList(1, 2, 3).contains(dto.getType())) {
+			throw new ServiceException("参数type为空或者错误");
+		}
 		List<XmFinanceEntity> list = baseMapper.selectXmFinancePage(page, dto);
 		return page.setRecords(list);
 	}
+
+	@Override
+	public boolean saveFinance(XmFinanceEntity entity) {
+		if (Func.isBlank(entity.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		if (entity.getType() == null || !Arrays.asList(1, 2, 3).contains(entity.getType())) {
+			throw new ServiceException("参数type为空或者错误");
+		}
+		//根据yearAndMonth查询年度项目
+		List<XmEntity> xmListByYear = xmMapper.selectXmListByYear(entity.getYearAndMonth());
+		if (Func.isEmpty(xmListByYear)) {
+			throw new ServiceException(entity.getYearAndMonth() + "年度内无研发项目可新增");
+		}
+
+		//根据yearAndMonth和type查询已有项目
+		Query query = new Query().setCurrent(1).setSize(Integer.MAX_VALUE);
+		List<XmFinanceEntity> dbXmFinanceList = baseMapper.selectXmFinancePage(Condition.getPage(query), entity);
+
+		//年度研发项目
+		List<Long> xmIdList = xmListByYear.stream().map(XmEntity::getId).toList();
+
+		//已添加的研发项目
+		List<Long> XmIdFinances = dbXmFinanceList.stream().map(XmFinanceEntity::getXmId).toList();
+		//去重,差集
+		List<Long> collect = xmIdList.stream().filter(item -> !XmIdFinances.contains(item)).toList();
+
+		if (Func.isEmpty(collect)) {
+			return true;
+		}
+
+		List<XmFinanceEntity> list = new ArrayList<>();
+		for (Long xmId :collect) {
+			XmFinanceEntity finance = new XmFinanceEntity();
+			finance.setYearAndMonth(entity.getYearAndMonth());
+			finance.setXmId(xmId);
+			finance.setType(entity.getType());
+			list.add(finance);
+		}
+		return this.saveBatch(list);
+	}
+
+	@Override
+	public boolean physicalDeleteByIds(List<Long> ids) {
+		return baseMapper.physicalDeleteByIds(ids);
+	}
+
+	@Override
+	public boolean fetchFinance(XmFinanceEntity entity) {
+		if (Func.isBlank(entity.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		if (entity.getType() == null || !Arrays.asList(1, 2, 3).contains(entity.getType())) {
+			throw new ServiceException("参数type为空或者错误");
+		}
+		//根据yearAndMonth查询年度项目
+		List<XmEntity> xmListByYear = xmMapper.selectXmListByYear(entity.getYearAndMonth());
+		if (Func.isEmpty(xmListByYear)) {
+			throw new ServiceException(entity.getYearAndMonth() + "年度内无研发项目可引入");
+		}
+		//根据yearAndMonth和type查询已有项目
+		Query query = new Query().setCurrent(1).setSize(Integer.MAX_VALUE);
+		List<XmFinanceEntity> dbXmFinanceList = baseMapper.selectXmFinancePage(Condition.getPage(query), entity);
+		if (Func.isEmpty(dbXmFinanceList)) {
+			//本年度无会计/加计扣除/高新-研发项目清单,直接保存
+
+		}
+		//年度研发项目
+		List<Long> xmIdList = xmListByYear.stream().map(XmEntity::getId).toList();
+
+		//已添加的研发项目
+		List<Long> XmIdFinances = dbXmFinanceList.stream().map(XmFinanceEntity::getXmId).toList();
+		//去重,差集
+		List<Long> collect = xmIdList.stream().filter(item -> !XmIdFinances.contains(item)).toList();
+		//保存
+		if (Func.isEmpty(collect)) {
+			throw new ServiceException("无研发项目可引入");
+		}
+		List<XmFinanceEntity> insertList = new ArrayList<>();
+		for (Long xmId : collect) {
+			XmFinanceEntity dto = new XmFinanceEntity();
+			dto.setYearAndMonth(entity.getYearAndMonth());
+			dto.setType(entity.getType());
+			dto.setXmId(xmId);
+			insertList.add(dto);
+		}
+		return this.saveBatch(insertList);
+	}
 }

+ 9 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java

@@ -11,6 +11,7 @@ import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.DateUtil;
+import org.sky.core.tool.utils.Func;
 import org.sky.core.tool.utils.StringUtil;
 import org.sky.scientific.excel.XmExcel;
 import org.sky.scientific.mapper.*;
@@ -66,6 +67,14 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 	}
 
 	@Override
+	public List<XmEntity> selectXmListByYear(String year) {
+		if(Func.isBlank(year)){
+			throw new ServiceException("参数year不能为空");
+		}
+		return baseMapper.selectXmListByYear(year);
+	}
+
+	@Override
 	public List<XmExcel> exportXm(Wrapper<XmEntity> queryWrapper) {
 		List<XmExcel> xmList = baseMapper.exportXm(queryWrapper);
 		//xmList.forEach(xm -> {