Browse Source

其他费用-基本信息台账

zhoulisky 10 months ago
parent
commit
598e384dd3
15 changed files with 524 additions and 2 deletions
  1. BIN
      doc/xls导入模板/基本信息台账-其他费用P071-导入模板.xls
  2. BIN
      doc/xls导入模板/科研房屋建筑物明细表-导入模板.xls
  3. BIN
      doc/xls导入模板/设计费用、装备调与试验台账-导入模板202507.xls
  4. 5 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmDesignCostQuery.java
  5. 45 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmOtherCostQuery.java
  6. 14 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmDesignCostEntity.java
  7. 64 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmOtherCostEntity.java
  8. 85 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmOtherCostController.java
  9. 51 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/XmOtherCostExcel.java
  10. 3 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmDesignCostMapper.xml
  11. 41 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmOtherCostMapper.java
  12. 65 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmOtherCostMapper.xml
  13. 43 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmOtherCostService.java
  14. 1 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmDesignCostServiceImpl.java
  15. 107 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmOtherCostServiceImpl.java

BIN
doc/xls导入模板/基本信息台账-其他费用P071-导入模板.xls


BIN
doc/xls导入模板/科研房屋建筑物明细表-导入模板.xls


BIN
doc/xls导入模板/设计费用、装备调与试验台账-导入模板202507.xls


+ 5 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmDesignCostQuery.java

@@ -2,6 +2,7 @@
 package org.sky.scientific.pojo.dto;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 import java.util.Date;
@@ -15,6 +16,10 @@ import java.util.Date;
 @Data
 public class XmDesignCostQuery{
 
+	@Schema(description = "所属年月,如:202505")
+	@NotBlank(message = "参数yearAndMonth不能为空")
+	private String yearAndMonth;
+
 	@Schema(description = "研发项目名称")
 	private String xmmc;
 

+ 45 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmOtherCostQuery.java

@@ -0,0 +1,45 @@
+
+package org.sky.scientific.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.sky.core.tool.utils.DateUtil;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 项目-其他费用-基本信息台账 实体类
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+@Data
+public class XmOtherCostQuery implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "所属年月,如:202505")
+	private String yearAndMonth;
+
+	@Schema(description ="项目名称")
+ 	private String xmmc;
+
+	@Schema(description = "日期,小")
+	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
+	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	private Date recordDateMin;
+
+	@Schema(description = "日期,大")
+	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
+	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	private Date recordDateMax;
+
+	@Schema(description = "费用内容,会计科目中的其他费用(三级)中的四级科目id")
+	private Long subjectId;
+
+}

+ 14 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmDesignCostEntity.java

@@ -1,9 +1,12 @@
 
 package org.sky.scientific.pojo.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.sky.core.tenant.mp.TenantEntity;
@@ -30,12 +33,23 @@ public class XmDesignCostEntity extends TenantEntity {
 	private static final long serialVersionUID = 1L;
 
 	@Schema(description = "所属年月,如:202505")
+	@NotBlank(message = "参数yearAndMonth不能为空")
 	private String yearAndMonth;
 
 	@Schema(description = "项目ID")
+	@NotNull(message = "请选择研发项目")
 	private Long xmId;
 
+	@Schema(description ="项目名称")
+	@TableField(exist = false)
+	private String xmmc;
+
+	@Schema(description ="项目编号")
+	@TableField(exist = false)
+	private String xmbh;
+
 	@Schema(description = "费用类型")
+	@NotBlank(message = "请选择费用类型")
 	private String costType;
 
 	@Schema(description = "日期")

+ 64 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmOtherCostEntity.java

@@ -0,0 +1,64 @@
+
+package org.sky.scientific.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tenant.mp.TenantEntity;
+import org.sky.core.tool.utils.DateUtil;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目-其他费用-基本信息台账 实体类
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+@Data
+@TableName("kd_xm_other_cost")
+@Schema(description = "XmOtherCost对象")
+@EqualsAndHashCode(callSuper = true)
+public class XmOtherCostEntity extends TenantEntity {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "所属年月,如:202505")
+	private String yearAndMonth;
+
+	@Schema(description = "项目ID")
+	private Long xmId;
+
+	@Schema(description ="项目名称")
+	@TableField(exist = false)
+	private String xmmc;
+
+	@Schema(description ="项目编号")
+	@TableField(exist = false)
+	private String xmbh;
+
+	@Schema(description = "费用类型")
+	private String costType;
+
+	@Schema(description = "日期")
+	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
+	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	private Date recordDate;
+
+	@Schema(description = "费用内容,会计科目中的其他费用(三级)中的四级科目id")
+	private Long subjectId;
+
+	@Schema(description = "费用内容,会计科目中的其他费用(三级)中的四级科目名称")
+	private String subjectName;
+
+	@Schema(description = "金额")
+	private BigDecimal amount;
+
+}

+ 85 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmOtherCostController.java

@@ -0,0 +1,85 @@
+
+package org.sky.scientific.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import org.sky.core.boot.ctrl.KdController;
+import org.sky.core.excel.util.ExcelUtil;
+import org.sky.core.mp.support.Condition;
+import org.sky.core.mp.support.Query;
+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.XmOtherCostExcel;
+import org.sky.scientific.pojo.dto.XmOtherCostQuery;
+import org.sky.scientific.pojo.entity.XmOtherCostEntity;
+import org.sky.scientific.service.IXmOtherCostService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目-其他费用-基本信息台账
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/xm/other-cost")
+@Tag(name = "项目-其他费用-基本信息台账")
+public class XmOtherCostController extends KdController {
+
+	private final IXmOtherCostService service;
+
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 1)
+	@Operation(summary = "分页")
+	public R<IPage<XmOtherCostEntity>> page(XmOtherCostQuery param, Query query) {
+		IPage<XmOtherCostEntity> pages = service.selectPage(Condition.getPage(query), param);
+		return R.data(pages);
+	}
+
+	@PostMapping("import")
+	@ApiOperationSupport(order = 2)
+	@Operation(summary = "导入")
+	public R importCost(MultipartFile file, String yearAndMonth) {
+		service.importData(file, yearAndMonth);
+		return R.success("操作成功");
+	}
+
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@Operation(summary = "新增或修改")
+	public R submit(@Valid @RequestBody XmOtherCostEntity entity) {
+		return R.status(service.submit(entity));
+	}
+
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@Operation(summary = "删除", description  = "传入ids")
+	public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(service.physicalDeleteByIds(Func.toLongList(ids)));
+	}
+
+	@IsAdmin
+	@GetMapping("/export")
+	@ApiOperationSupport(order = 9)
+	@Operation(summary = "导出数据", description  = "传入xmDesignCost")
+	public void exportXmDesignCost(@Parameter(hidden = true) @RequestParam Map<String, Object> xmDesignCost, KdUser kdUser, HttpServletResponse response) {
+		QueryWrapper<XmOtherCostEntity> queryWrapper = Condition.getQueryWrapper(xmDesignCost, XmOtherCostEntity.class);
+		List<XmOtherCostExcel> list = service.export(queryWrapper);
+		ExcelUtil.export(response, "项目-其他费用-基本信息台账" + DateUtil.time(), "项目-其他费用-基本信息台账数据表", list, XmOtherCostExcel.class);
+	}
+}

+ 51 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/XmOtherCostExcel.java

@@ -0,0 +1,51 @@
+
+package org.sky.scientific.excel;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.sky.core.tool.utils.DateUtil;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 项目-其他费用-基本信息台账 Excel实体类
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+@Data
+public class XmOtherCostExcel implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@ExcelProperty("序号")
+	private Integer xh;
+
+	@ExcelProperty("研发项目编号")
+	private String xmbh;
+
+	@ExcelProperty("研发项目名称")
+	private String xmmc;
+
+	@ExcelProperty("费用类型")
+	private String costType;
+
+ 	@ExcelProperty("日期")
+	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
+	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	private Date recordDate;
+
+ 	@ExcelProperty("费用内容")
+	private String subjectName;
+
+ 	@ExcelProperty("金额(元)")
+	private BigDecimal amount;
+}

+ 3 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmDesignCostMapper.xml

@@ -8,6 +8,8 @@
         <result column="tenant_id" property="tenantId"/>
         <result column="year_and_month" property="yearAndMonth"/>
         <result column="xm_id" property="xmId"/>
+        <result column="xmmc" property="xmmc"/>
+        <result column="xmbh" property="xmbh"/>
         <result column="cost_type" property="costType"/>
         <result column="record_date" property="recordDate"/>
         <result column="contract_name" property="contractName"/>
@@ -33,7 +35,7 @@
                 COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMBH' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMBH) AS XMBH
             FROM kd_xm xm
             WHERE xm.is_deleted = 0
-        ) xm on xm.id = xa.xm_id
+        ) xm on xm.id = dc.xm_id
         <where>
             <if test="ew.xmmc != null and ew.xmmc!=''">
                 and xm.XMMC like concat('%',#{ew.xmmc},'%')

+ 41 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmOtherCostMapper.java

@@ -0,0 +1,41 @@
+
+package org.sky.scientific.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.sky.scientific.excel.XmOtherCostExcel;
+import org.sky.scientific.pojo.dto.XmOtherCostQuery;
+import org.sky.scientific.pojo.entity.XmOtherCostEntity;
+
+import java.util.List;
+
+/**
+ * 项目-其他费用-基本信息台账 Mapper 接口
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+public interface XmOtherCostMapper extends BaseMapper<XmOtherCostEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page 分页参数
+	 * @param xmOtherCost 查询参数
+	 * @return List<XmOtherCostVO>
+	 */
+	List<XmOtherCostEntity> selectXmOtherCostPage(IPage page, @Param("ew") XmOtherCostQuery param);
+
+
+	/**
+	 * 获取导出数据
+	 *
+	 * @param queryWrapper 查询条件
+	 * @return List<XmOtherCostExcel>
+	 */
+	List<XmOtherCostExcel> exportXmOtherCost(@Param("ew") Wrapper<XmOtherCostEntity> queryWrapper);
+
+	boolean physicalDeleteByIds(List<Long> ids);
+}

+ 65 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmOtherCostMapper.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.sky.scientific.mapper.XmOtherCostMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="ResultMap" type="org.sky.scientific.pojo.entity.XmOtherCostEntity">
+        <result column="id" property="id"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="year_and_month" property="yearAndMonth"/>
+        <result column="xm_id" property="xmId"/>
+        <result column="xmmc" property="xmmc"/>
+        <result column="xmbh" property="xmbh"/>
+        <result column="cost_type" property="costType"/>
+        <result column="record_date" property="recordDate"/>
+        <result column="subject_id" property="subjectId"/>
+        <result column="subject_name" property="subjectName"/>
+        <result column="amount" property="amount"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <delete id="physicalDeleteByIds">
+        DELETE FROM kd_xm_other_cost
+        WHERE ID in <foreach item="item" collection="list" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
+
+
+    <select id="selectXmOtherCostPage" resultMap="ResultMap" parameterType="org.sky.scientific.pojo.dto.XmOtherCostQuery">
+        select xoc,* , xm.XMBH, xm.XMMC
+        from kd_xm_other_cost xoc
+        LEFT JOIN
+        (
+            SELECT
+                xm.id,
+                COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMBH' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMBH) AS 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%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMMC) AS XMMC
+            FROM kd_xm xm
+            WHERE xm.is_deleted = 0
+        ) xm on xm.id = xoc.xm_id
+        <where>
+            <if test="ew.xmmc != null and ew.xmmc!=''">
+                and xm.XMMC like concat('%',#{ew.xmmc},'%')
+            </if>
+            <if test="ew.subjectId!=null">
+                and xoc.subject_id = #{ew.subjectId}
+            </if>
+            <if test="ew.recordDateMin!=null and ew.recordDateMax!=null">
+                and xoc.record_date between #{ew.recordDateMin} and #{ew.recordDateMax}
+            </if>
+        </where>
+    </select>
+
+
+    <select id="exportXmOtherCost" resultType="org.sky.scientific.excel.XmOtherCostExcel">
+        SELECT * FROM kd_xm_other_cost ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 43 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmOtherCostService.java

@@ -0,0 +1,43 @@
+package org.sky.scientific.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.sky.core.mp.base.BaseService;
+import org.sky.scientific.excel.XmOtherCostExcel;
+import org.sky.scientific.pojo.dto.XmOtherCostQuery;
+import org.sky.scientific.pojo.entity.XmOtherCostEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 项目-其他费用-基本信息台账 服务类
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+public interface IXmOtherCostService extends BaseService<XmOtherCostEntity> {
+	/**
+	 * 自定义分页
+	 *
+	 * @param page 分页参数
+	 * @param param 查询参数
+	 * @return IPage<XmOtherCostEntity>
+	 */
+	IPage<XmOtherCostEntity> selectPage(IPage<XmOtherCostEntity> page, XmOtherCostQuery param);
+
+
+	/**
+	 * 导出数据
+	 *
+	 * @param queryWrapper 查询条件
+	 * @return List<XmOtherCostExcel>
+	 */
+	List<XmOtherCostExcel> export(Wrapper<XmOtherCostEntity> queryWrapper);
+
+    void importData(MultipartFile file, String yearAndMonth);
+
+	boolean submit(XmOtherCostEntity entity);
+
+	boolean physicalDeleteByIds(List<Long> ids);
+}

+ 1 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmDesignCostServiceImpl.java

@@ -65,7 +65,7 @@ public class XmDesignCostServiceImpl extends BaseServiceImpl<XmDesignCostMapper,
 		List<XmDesignCostEntity> insertList = new ArrayList<>();
 		for (XmDesignCostExcel data : dataList) {
 
-			if(!Func.equals(yearAndMonth,DateUtil.format(data.getRecordDate(), DateUtil.PATTERN_YYYYMM))){
+			if(!Func.isNull(data.getRecordDate()) && !Func.equals(yearAndMonth,DateUtil.format(data.getRecordDate(), DateUtil.PATTERN_YYYYMM))){
 				throw new ServiceException("日期["+data.getRecordDate()+"]不属于["+yearAndMonth+"]");
 			}
 

+ 107 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmOtherCostServiceImpl.java

@@ -0,0 +1,107 @@
+
+package org.sky.scientific.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import org.sky.core.excel.util.ExcelUtil;
+import org.sky.core.log.exception.ServiceException;
+import org.sky.core.mp.base.BaseServiceImpl;
+import org.sky.core.tool.utils.*;
+import org.sky.scientific.excel.XmOtherCostExcel;
+import org.sky.scientific.mapper.XmMapper;
+import org.sky.scientific.mapper.XmOtherCostMapper;
+import org.sky.scientific.pojo.dto.XmOtherCostQuery;
+import org.sky.scientific.pojo.entity.XmOtherCostEntity;
+import org.sky.scientific.service.IXmOtherCostService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 项目-其他费用-基本信息台账 服务实现类
+ *
+ * @author Kd
+ * @since 2025-07-28
+ */
+@Service
+@AllArgsConstructor
+public class XmOtherCostServiceImpl extends BaseServiceImpl<XmOtherCostMapper, XmOtherCostEntity> implements IXmOtherCostService {
+
+	private final XmMapper xmMapper;
+
+	@Override
+	public IPage<XmOtherCostEntity> selectPage(IPage<XmOtherCostEntity> page, XmOtherCostQuery param) {
+		return page.setRecords(baseMapper.selectXmOtherCostPage(page, param));
+	}
+
+
+	@Override
+	public List<XmOtherCostExcel> export(Wrapper<XmOtherCostEntity> queryWrapper) {
+		List<XmOtherCostExcel> list = baseMapper.exportXmOtherCost(queryWrapper);
+		return list;
+	}
+
+	@Override
+	@Transactional
+	public void importData(MultipartFile file, String yearAndMonth) {
+		if (StringUtil.isBlank(yearAndMonth)) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+
+		List<XmOtherCostExcel> dataList = ExcelUtil.read(file, XmOtherCostExcel.class);
+		if (CollectionUtil.isEmpty(dataList)) {
+			throw new ServiceException("导入数据为空");
+		}
+
+		List<XmOtherCostEntity> insertList = new ArrayList<>();
+		for (XmOtherCostExcel data : dataList) {
+			XmOtherCostEntity entity = Objects.requireNonNull(BeanUtil.copyProperties(data, XmOtherCostEntity.class));
+
+			//TODO 根据四级科目查询科目id,且三级科目必须要其他费用,如果不存在则报错
+			Long subjectId = null;
+//				xmMapper.getSubjectIdBySubjectName(data.getSubjectName());
+			if (Func.isNull(subjectId)) {
+				throw new ServiceException("序号[" + data.getXh() + "]的费用内容[" + data.getSubjectName() + "]不是其他费用的四级科目");
+			}
+
+			if (!Func.equals(yearAndMonth, DateUtil.format(data.getRecordDate(), DateUtil.PATTERN_YYYYMM))) {
+				throw new ServiceException("序号[" + data.getXh() + "]的日期[" + data.getRecordDate() + "]不属于[" + yearAndMonth + "]");
+			}
+
+			if (StringUtil.isAllBlank(data.getXmmc(), data.getXmbh())) {
+				throw new ServiceException("序号[" + data.getXh() + "]的研发项目编号和名称都为空,请重新填写数据");
+			}
+			//根据项目名称或编号查询xmId
+			Long xmId = xmMapper.getXmIdByXmmcOrXmbh(yearAndMonth, data.getXmmc(), data.getXmbh());
+			if (xmId == null) {
+				throw new ServiceException("序号[" + data.getXh() + "]的研发项目不存在,请检查模板数据");
+			}
+
+			entity.setXmId(xmId);
+			entity.setYearAndMonth(yearAndMonth);
+			entity.setSubjectId(subjectId);
+			insertList.add(entity);
+		}
+
+		this.saveBatch(insertList);
+	}
+
+	@Override
+	public boolean submit(XmOtherCostEntity entity) {
+		if (StringUtil.isBlank(entity.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		return this.saveOrUpdate(entity);
+	}
+
+	@Override
+	public boolean physicalDeleteByIds(List<Long> ids) {
+		return baseMapper.physicalDeleteByIds(ids);
+	}
+
+}