Browse Source

会计科目

zhoulisky 10 months ago
parent
commit
bb5c8ac2d6
18 changed files with 437 additions and 227 deletions
  1. BIN
      doc/export-template/企业会计科目设置.xls
  2. BIN
      doc/xls导入模板/企业会计科目设置-导入模板.xls
  3. 5 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/Subject.java
  4. 54 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/SubjectEnterprise.java
  5. 64 14
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/SubjectController.java
  6. 8 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmController.java
  7. 33 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/SubjectEnterpriseExcel.java
  8. 28 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectEnterpriseMapper.java
  9. 44 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectEnterpriseMapper.xml
  10. 2 149
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectMapper.java
  11. 3 6
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectMapper.xml
  12. 3 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmMapper.java
  13. 13 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmMapper.xml
  14. 36 14
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/ISubjectService.java
  15. 9 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmService.java
  16. 121 39
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/SubjectServiceImpl.java
  17. 14 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java
  18. BIN
      kd-service/kd-scientific/src/main/resources/export-template/企业会计科目.xls

BIN
doc/export-template/企业会计科目设置.xls


BIN
doc/xls导入模板/企业会计科目设置-导入模板.xls


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

@@ -6,6 +6,8 @@
  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  import io.swagger.v3.oas.annotations.media.Schema;
  import io.swagger.v3.oas.annotations.media.Schema;
+ import jakarta.validation.constraints.NotBlank;
+ import jakarta.validation.constraints.NotNull;
  import lombok.Data;
  import lombok.Data;
 
 
  import java.io.Serial;
  import java.io.Serial;
@@ -30,12 +32,15 @@
 
 
      @JsonSerialize(using = ToStringSerializer.class)
      @JsonSerialize(using = ToStringSerializer.class)
      @Schema(description = "父级科目")
      @Schema(description = "父级科目")
+	 @NotNull(message = "请选择父级科目")
      private Long parentId;
      private Long parentId;
 
 
      @Schema(description = "科目代码")
      @Schema(description = "科目代码")
+	 @NotBlank(message = "请填写科目代码")
      private String code;
      private String code;
 
 
      @Schema(description = "科目名称")
      @Schema(description = "科目名称")
+	 @NotBlank(message = "请填写科目名称")
      private String name;
      private String name;
 
 
      @Schema(description = "会计科目")
      @Schema(description = "会计科目")

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

@@ -0,0 +1,54 @@
+ package org.sky.scientific.pojo.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.databind.annotation.JsonSerialize;
+ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+ import io.swagger.v3.oas.annotations.media.Schema;
+ import jakarta.validation.constraints.NotNull;
+ import lombok.Data;
+
+ import java.io.Serial;
+ import java.io.Serializable;
+
+ /**
+  * 企业会计科目 实体类
+  *
+   */
+ @Data
+ @TableName("kd_subject_enterprise")
+ @Schema(description = "Subject对象")
+ public class SubjectEnterprise implements Serializable {
+
+     @Serial
+     private static final long serialVersionUID = 1L;
+
+     @JsonSerialize(using = ToStringSerializer.class)
+     @Schema(description = "主键")
+     @TableId(value = "id", type = IdType.ASSIGN_ID)
+     private Long id;
+
+     @JsonSerialize(using = ToStringSerializer.class)
+     @Schema(description = "会计科目id")
+	 @NotNull(message = "请选择会计科目")
+     private Long subjectId;
+
+	 @Schema(description = "会计科目名称")
+	 private String subjectName;
+
+     @Schema(description = "企业科目代码")
+     private String code;
+
+     @Schema(description = "企业科目名称")
+     private String name;
+
+	 @Schema(description = "高新研发费用科目")
+	 @TableField(exist = false)
+		 private String rdSubject;
+
+	 @Schema(description = "加计扣除研发费用科目")
+	 @TableField(exist = false)
+	 private String adSubject;
+ }

+ 64 - 14
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/SubjectController.java

@@ -1,19 +1,26 @@
 package org.sky.scientific.controller;
 package org.sky.scientific.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.boot.ctrl.KdController;
+import org.sky.core.mp.support.Condition;
+import org.sky.core.mp.support.Query;
+import org.sky.core.secure.annotation.IsAdmin;
 import org.sky.core.tenant.annotation.NonDS;
 import org.sky.core.tenant.annotation.NonDS;
 import org.sky.core.tool.api.R;
 import org.sky.core.tool.api.R;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.pojo.entity.Subject;
+import org.sky.scientific.pojo.entity.SubjectEnterprise;
 import org.sky.scientific.pojo.vo.SubjectVO;
 import org.sky.scientific.pojo.vo.SubjectVO;
 import org.sky.scientific.service.ISubjectService;
 import org.sky.scientific.service.ISubjectService;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -27,24 +34,67 @@ import java.util.Map;
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
 @RequestMapping("/subject")
 @RequestMapping("/subject")
-@Tag(name = "研发费用会计科目设置")
+@Tag(name = "会计科目设置")
 public class SubjectController extends KdController {
 public class SubjectController extends KdController {
 
 
 	private final ISubjectService service;
 	private final ISubjectService service;
 
 
-//	@GetMapping("/list")
-//	@ApiOperationSupport(order = 1)
-//	@Operation(summary = "列表")
-//	public R<List<SubjectVO>> list(SubjectQueryDto dto) {
-//		List<SubjectVO> list = service.allSubject(dto);
-//		return R.data(list);
-//	}
-
 	@GetMapping("/lazy-list")
 	@GetMapping("/lazy-list")
 	@ApiOperationSupport(order = 2)
 	@ApiOperationSupport(order = 2)
-	@Operation(summary = "懒加载列表")
+	@Operation(summary = "研发费用会计科目设置-懒加载列表")
 	public R<List<SubjectVO>> lazyList(Long parentId, @Parameter(hidden = true) @RequestParam Map<String, Object> subject){
 	public R<List<SubjectVO>> lazyList(Long parentId, @Parameter(hidden = true) @RequestParam Map<String, Object> subject){
 		List<SubjectVO> list = service.lazyList(parentId, subject);
 		List<SubjectVO> list = service.lazyList(parentId, subject);
 		return R.data(list);
 		return R.data(list);
 	}
 	}
+
+	@PostMapping("submit")
+	@ApiOperationSupport(order = 4)
+	@Operation(summary = "研发费用会计科目设置-新增或修改")
+	public R submit(@Valid @RequestBody Subject subject) {
+		return R.status(service.submitSubject(subject));
+	}
+
+	@DeleteMapping("/remove/{subjectId}")
+	@ApiOperationSupport(order = 6)
+	@Operation(summary = "研发费用会计科目设置-删除", description = "传入ids")
+	public R removeSubject(@PathVariable(value = "subjectId") Long subjectId) {
+		return R.status(service.deleteSubject(subjectId));
+	}
+
+	@GetMapping("/enterprise/page")
+	@ApiOperationSupport(order = 15)
+	@Operation(summary = "企业会计科目设置-分页", description = "传入xmGoods")
+	public R<IPage<SubjectEnterprise>> selectSubjectEnterprisePage(SubjectEnterprise dto, Query query) {
+		IPage<SubjectEnterprise> pages = service.selectSubjectEnterpriseList(Condition.getPage(query), dto);
+		return R.data(pages);
+	}
+
+	@PostMapping("/enterprise/submit")
+	@ApiOperationSupport(order = 17)
+	@Operation(summary = "企业会计科目设置-新增或修改", description = "传入xmGoods")
+	public R submitSubjectEnterprise(@Valid @RequestBody SubjectEnterprise subjectEnterprise) {
+		return R.status(service.submitSubjectEnterprise(subjectEnterprise));
+	}
+
+	@PostMapping("/enterprise/import")
+	@ApiOperationSupport(order = 19)
+	@Operation(summary = "企业会计科目设置-导入", description = "传入excel")
+	public R importSubjectEnterprise(MultipartFile file) {
+		return R.data(service.importSubjectEnterprise(file));
+	}
+
+	@PostMapping("/enterprise/remove")
+	@ApiOperationSupport(order = 22)
+	@Operation(summary = "企业会计科目设置-批量删除", description = "传入ids")
+	public R removeSubjectEnterprise(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(service.deleteBatchSubjectEnterprise(Func.toLongList(ids)));
+	}
+
+	@IsAdmin
+	@GetMapping("/enterprise/export")
+	@ApiOperationSupport(order = 25)
+	@Operation(summary = "企业会计科目设置-导出数据", description = "传入xmGoods")
+	public void exportSubjectEnterprise(SubjectEnterprise dto, HttpServletResponse response) {
+		service.exportSubjectEnterprise(response, dto);
+	}
 }
 }

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

@@ -53,6 +53,14 @@ public class XmController extends KdController {
 		return R.data(pages);
 		return R.data(pages);
 	}
 	}
 
 
+	@GetMapping("/assist/list")
+	@ApiOperationSupport(order = 1)
+	@Operation(summary = "辅助核算-列表", description  = "yearAndMonth:2025")
+	public R<IPage<JSONObject>> assistList(XmDTO xm, Query query) {
+		IPage<JSONObject> pages = service.selectAssistList(Condition.getPage(query), xm);
+		return R.data(pages);
+	}
+
 	@GetMapping("/detail")
 	@GetMapping("/detail")
 	@ApiOperationSupport(order = 2)
 	@ApiOperationSupport(order = 2)
 	@Operation(summary = "科研项目-详情", description  = "传入xm")
 	@Operation(summary = "科研项目-详情", description  = "传入xm")

+ 33 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/SubjectEnterpriseExcel.java

@@ -0,0 +1,33 @@
+ package org.sky.scientific.excel;
+
+ import io.swagger.v3.oas.annotations.media.Schema;
+ import lombok.Data;
+
+ import java.io.Serial;
+ import java.io.Serializable;
+
+ /**
+  * 企业会计科目 实体类
+  *
+   */
+ @Data
+ public class SubjectEnterpriseExcel implements Serializable {
+
+     @Serial
+     private static final long serialVersionUID = 1L;
+
+	 @Schema(description = "对应会计科目")
+ 	 private String subjectName;
+
+     @Schema(description = "企业科目代码")
+     private String code;
+
+     @Schema(description = "企业科目名称")
+     private String name;
+
+	 @Schema(description = "对应高新研发费用科目")
+ 	 private String rdSubject;
+
+	 @Schema(description = "对应加计扣除研发费用科目")
+ 	 private String adSubject;
+ }

+ 28 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectEnterpriseMapper.java

@@ -0,0 +1,28 @@
+package org.sky.scientific.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.sky.scientific.pojo.entity.SubjectEnterprise;
+
+import java.util.List;
+
+
+/**
+ * SubjectEnterpriseMapper 接口
+ *
+ */
+public interface SubjectEnterpriseMapper extends BaseMapper<SubjectEnterprise> {
+
+	/**
+	 * 查询列表
+	 * @param page
+	 * @param subjectEnterprise
+	 * @return
+	 */
+	List<SubjectEnterprise> selectSubjectEnterpriseList(IPage<SubjectEnterprise> page, @Param("ew") SubjectEnterprise subjectEnterprise);
+
+	int insertBatch(List<SubjectEnterprise> insertList);
+
+	int deleteBatch(List<Long> ids);
+}

+ 44 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectEnterpriseMapper.xml

@@ -0,0 +1,44 @@
+<?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.SubjectEnterpriseMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="ResultMap" type="org.sky.scientific.pojo.entity.SubjectEnterprise">
+        <id column="id" property="id"/>
+        <result column="subject_id" property="subjectId"/>
+        <result column="subject_name" property="subjectName"/>
+        <result column="code" property="code"/>
+        <result column="name" property="name"/>
+        <result column="rd_subject" property="rdSubject"/>
+        <result column="ad_subject" property="adSubject"/>
+    </resultMap>
+
+    <insert id="insertBatch">
+        insert into kd_subject_enterprise(subject_id, subject_name, code, name)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.subjectId},#{item.subjectName},#{item.code},#{item.name})
+        </foreach>
+    </insert>
+
+    <delete id="deleteBatch">
+        delete from kd_subject_enterprise
+        where id in
+        <foreach item="item" collection="list" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </delete>
+
+
+    <select id="selectSubjectEnterpriseList" resultMap="ResultMap">
+        select e.id, e.subject_id, e.code, e.name, s.rd_subject, s.ad_subject, e.subject_name
+        from kd_subject_enterprise e
+        left join kd_subject s on e.subject_id = s.id
+        where 1=1
+        <if test="ew.code != null and ew.code != ''">and e.code = #{ew.code} </if>
+        <if test="ew.name != null and ew.name != ''">and e.name like concat('%',#{ew.name},'%')</if>
+        <if test="ew.subjectName != null and ew.subjectName != ''">and e.subject_name like concat('%',#{ew.subjectName},'%')</if>
+        <if test="ew.rdSubject != null and ew.rdSubject != ''">and s.rd_subject like concat('%',#{ew.rdSubject},'%')</if>
+        <if test="ew.adSubject != null and ew.adSubject != ''">and s.ad_subject like concat('%',#{ew.adSubject},'%')</if>
+    </select>
+</mapper>

+ 2 - 149
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectMapper.java

@@ -14,155 +14,8 @@ import java.util.Map;
  */
  */
 public interface SubjectMapper extends BaseMapper<Subject> {
 public interface SubjectMapper extends BaseMapper<Subject> {
 
 
-//	List<Subject> selectSubjectList(SubjectQueryDto queryDto);
-
     List<SubjectVO> lazyList(Long parentId, Map<String, Object> menu);
     List<SubjectVO> lazyList(Long parentId, Map<String, Object> menu);
 
 
-//	/**
-//	 * 懒加载列表
-//	 *
-//	 * @param parentId
-//	 * @param param
-//	 * @return
-//	 */
-//	List<SubjectVO> lazyList(Long parentId, Map<String, Object> param);
-//
-//	/**
-//	 * 懒加载菜单列表
-//	 *
-//	 * @param parentId
-//	 * @param param
-//	 * @return
-//	 */
-//	List<MenuVO> lazyMenuList(Long parentId, Map<String, Object> param);
-//
-//	/**
-//	 * 树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<TreeNode> tree();
-//
-//	/**
-//	 * 授权树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<TreeNode> grantTree();
-//
-//	/**
-//	 * 授权树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<TreeNode> grantTreeByRole(List<Long> roleId);
-//
-//	/**
-//	 * 顶部菜单树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<TreeNode> grantTopTree();
-//
-//	/**
-//	 * 顶部菜单树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<TreeNode> grantTopTreeByRole(List<Long> roleId);
-//
-//	/**
-//	 * 数据权限授权树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<TreeNode> grantDataScopeTree();
-//
-//	/**
-//	 * 接口权限授权树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<TreeNode> grantApiScopeTree();
-//
-//	/**
-//	 * 数据权限授权树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<TreeNode> grantDataScopeTreeByRole(List<Long> roleId);
-//
-//	/**
-//	 * 接口权限授权树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<TreeNode> grantApiScopeTreeByRole(List<Long> roleId);
-//
-//	/**
-//	 * 所有菜单
-//	 *
-//	 * @return
-//	 */
-//	List<Menu> allMenu();
-//
-//	/**
-//	 * 权限配置菜单
-//	 *
-//	 * @param roleId
-//	 * @param topMenuId
-//	 * @return
-//	 */
-//	List<Menu> roleMenu(List<Long> roleId, Long topMenuId);
-//
-//	/**
-//	 * 权限配置菜单
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<Menu> roleMenuByRoleId(List<Long> roleId);
-//
-//	/**
-//	 * 权限配置菜单
-//	 *
-//	 * @param topMenuId
-//	 * @return
-//	 */
-//	List<Menu> roleMenuByTopMenuId(Long topMenuId);
-//
-//	/**
-//	 * 菜单树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<Menu> routes(List<Long> roleId);
-//
-//	/**
-//	 * 按钮树形结构
-//	 *
-//	 * @return
-//	 */
-//	List<Menu> allButtons();
-//
-//	/**
-//	 * 按钮树形结构
-//	 *
-//	 * @param roleId
-//	 * @return
-//	 */
-//	List<Menu> buttons(List<Long> roleId);
-//
-//	/**
-//	 * 获取配置的角色权限
-//	 *
-//	 * @param roleIds
-//	 * @return
-//	 */
-//	List<MenuDTO> authRoutes(List<Long> roleIds);
+	boolean deleteSubject(Long subjectId);
+
 }
 }

+ 3 - 6
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/SubjectMapper.xml

@@ -25,12 +25,9 @@
         <result column="has_children" property="hasChildren"/>
         <result column="has_children" property="hasChildren"/>
     </resultMap>
     </resultMap>
 
 
-<!--    <select id="selectSubjectList" resultMap="ResultMap">-->
-<!--        select * from kd_subject-->
-<!--        where 1=1-->
-<!--        <if test="code != null and code != ''">and code = #{code} </if>-->
-<!--        <if test="name != null and name != ''">and name like concat('%',#{name},'%')</if>-->
-<!--    </select>-->
+    <delete id="deleteSubject">
+        delete from kd_subject where id = #{subjectId}
+    </delete>
 
 
     <select id="lazyList" resultMap="ResultVoMap">
     <select id="lazyList" resultMap="ResultVoMap">
         SELECT
         SELECT

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

@@ -1,6 +1,7 @@
 
 
 package org.sky.scientific.mapper;
 package org.sky.scientific.mapper;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -75,4 +76,6 @@ public interface XmMapper extends BaseMapper<XmEntity> {
 	 * @return
 	 * @return
 	 */
 	 */
     List<XmEntity> listByYearAndMonth(String yearAndMonth);
     List<XmEntity> listByYearAndMonth(String yearAndMonth);
+
+	List<JSONObject> selectAssistList(IPage<JSONObject> page, @Param("ew") XmDTO xm);
 }
 }

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

@@ -146,4 +146,17 @@
         FROM kd_xm xm
         FROM kd_xm xm
         where #{yearAndMonth} between DATE_FORMAT(XMKSSJ, '%Y%m') and DATE_FORMAT(XMJSSJ,'%Y%m')
         where #{yearAndMonth} between DATE_FORMAT(XMKSSJ, '%Y%m') and DATE_FORMAT(XMJSSJ,'%Y%m')
     </select>
     </select>
+
+    <select id="selectAssistList" resultType="com.alibaba.fastjson.JSONObject">
+             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[<=]]> #{ew.yearAndMonth} 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[<=]]> #{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.yearAndMonth} between DATE_FORMAT(XMKSSJ, '%Y') and DATE_FORMAT(XMJSSJ,'%Y')
+            <if test="ew.xmmc != null and ew.xmmc != ''">and xm.xmmc like concat('%',#{ew.xmmc},'%')</if>
+            <if test="ew.xmbh!=null and ew.xmbh!=''">and xm.xmbh like concat('%',#{ew.xmbh},'%')</if>
+     </select>
 </mapper>
 </mapper>

+ 36 - 14
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/ISubjectService.java

@@ -1,19 +1,41 @@
- package org.sky.scientific.service;
+package org.sky.scientific.service;
 
 
- import com.baomidou.mybatisplus.extension.service.IService;
- import org.sky.scientific.pojo.entity.Subject;
- import org.sky.scientific.pojo.vo.SubjectVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.servlet.http.HttpServletResponse;
+import org.sky.scientific.pojo.entity.Subject;
+import org.sky.scientific.pojo.entity.SubjectEnterprise;
+import org.sky.scientific.pojo.vo.SubjectVO;
+import org.springframework.web.multipart.MultipartFile;
 
 
- import java.util.List;
- import java.util.Map;
+import java.util.List;
+import java.util.Map;
 
 
- /**
-  * 服务类
-  *
-  */
- public interface ISubjectService extends IService<Subject> {
+/**
+ * 服务类
+ */
+public interface ISubjectService extends IService<Subject> {
 
 
-//	 List<SubjectVO> allSubject(SubjectQueryDto queryDto);
+	List<SubjectVO> lazyList(Long parentId, Map<String, Object> subject);
 
 
-	 List<SubjectVO> lazyList(Long parentId, Map<String, Object> subject);
- }
+	/**
+	 * 企业会计科目列表
+	 * @param page
+	 * @param subjectEnterprise
+	 * @return
+	 */
+	IPage<SubjectEnterprise> selectSubjectEnterpriseList(IPage<SubjectEnterprise> page, SubjectEnterprise subjectEnterprise);
+
+	boolean submitSubject(Subject subject);
+
+	boolean deleteSubject(Long subjectId);
+
+	boolean importSubjectEnterprise(MultipartFile file);
+
+	boolean submitSubjectEnterprise(SubjectEnterprise subjectEnterprise);
+
+	boolean deleteBatchSubjectEnterprise(List< Long>ids);
+
+	void exportSubjectEnterprise(HttpServletResponse response,SubjectEnterprise dto);
+
+}

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

@@ -1,6 +1,7 @@
 
 
 package org.sky.scientific.service;
 package org.sky.scientific.service;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.sky.core.mp.base.BaseService;
 import org.sky.core.mp.base.BaseService;
@@ -64,4 +65,12 @@ public interface IXmService extends BaseService<XmEntity> {
 	 * @return
 	 * @return
 	 */
 	 */
 	XmVO selectByXmId(Long xmId);
 	XmVO selectByXmId(Long xmId);
+
+	/**
+	 * 查询年度研发项目列表,项目周期包含yearAndMonth的研发项目
+	 * @param page
+	 * @param xm
+	 * @return
+	 */
+	IPage<JSONObject> selectAssistList(IPage<JSONObject> page, XmDTO xm);
 }
 }

+ 121 - 39
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/SubjectServiceImpl.java

@@ -1,17 +1,41 @@
 package org.sky.scientific.service.impl;
 package org.sky.scientific.service.impl;
 
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import org.sky.core.excel.util.ExcelUtil;
+import org.sky.core.log.exception.ServiceException;
+import org.sky.core.mp.support.Condition;
+import org.sky.core.mp.support.Query;
 import org.sky.core.tool.node.ForestNodeMerger;
 import org.sky.core.tool.node.ForestNodeMerger;
+import org.sky.core.tool.utils.BeanUtil;
+import org.sky.core.tool.utils.Charsets;
+import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.SubjectEnterpriseExcel;
+import org.sky.scientific.mapper.SubjectEnterpriseMapper;
 import org.sky.scientific.mapper.SubjectMapper;
 import org.sky.scientific.mapper.SubjectMapper;
 import org.sky.scientific.pojo.entity.Subject;
 import org.sky.scientific.pojo.entity.Subject;
+import org.sky.scientific.pojo.entity.SubjectEnterprise;
 import org.sky.scientific.pojo.vo.SubjectVO;
 import org.sky.scientific.pojo.vo.SubjectVO;
 import org.sky.scientific.service.ISubjectService;
 import org.sky.scientific.service.ISubjectService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Objects;
 
 
 /**
 /**
  * 服务实现类
  * 服务实现类
@@ -22,25 +46,7 @@ public class SubjectServiceImpl extends ServiceImpl<SubjectMapper, Subject> impl
 
 
 	private final static String PARENT_ID = "parentId";
 	private final static String PARENT_ID = "parentId";
 
 
-//	@Override
-//	public List<SubjectVO> allSubject(SubjectQueryDto queryDto) {
-//		List<Subject> allSubject = baseMapper.selectSubjectList(queryDto);
-//		List<SubjectVO> list = allSubject.stream().map(menu -> BeanUtil.copyProperties(menu, SubjectVO.class)).toList();
-//
-//		Map<Long, SubjectVO> subjectMap = new HashMap<>();
-//
-//		// First pass: create a map for quick lookup
-//		for (SubjectVO sub : list) {
-//			subjectMap.put(sub.getId(), sub);
-//		}
-//
-//		// Second pass: build parent subjects list for each subject
-//		for (SubjectVO sub : list) {
-//			buildParentSubjects(sub, subjectMap);
-//		}
-//
-// 		return list;
-//	}
+	private final SubjectEnterpriseMapper subjectEnterpriseMapper;
 
 
 	@Override
 	@Override
 	public List<SubjectVO> lazyList(Long parentId, Map<String, Object> subject) {
 	public List<SubjectVO> lazyList(Long parentId, Map<String, Object> subject) {
@@ -51,24 +57,100 @@ public class SubjectServiceImpl extends ServiceImpl<SubjectMapper, Subject> impl
 		return ForestNodeMerger.merge(list);
 		return ForestNodeMerger.merge(list);
 	}
 	}
 
 
-//    private void buildParentSubjects(SubjectVO subject, Map<Long, SubjectVO> subjectMap) {
-//		List<SubjectVO> parentSubjects = new ArrayList<>();
-//		Long currentParentId = subject.getParentId();
-//
-//		while (currentParentId != null && currentParentId != 0) {
-//			Subject parent = subjectMap.get(currentParentId);
-//			if (parent == null) break;
-//
-//			// Create a simplified parent object with only id, code, and name
-//			SubjectVO parentCopy = new SubjectVO();
-//			parentCopy.setId(parent.getId());
-//			parentCopy.setCode(parent.getCode());
-//			parentCopy.setName(parent.getName());
-//
-//			parentSubjects.add(0, parentCopy); // Add to beginning to maintain order
-//			currentParentId = parent.getParentId();
-//		}
-//
-//		subject.setParentSubjects(parentSubjects);
-//	}
+	@Override
+	public IPage<SubjectEnterprise> selectSubjectEnterpriseList(IPage<SubjectEnterprise> page, SubjectEnterprise subjectEnterprise) {
+		return page.setRecords(subjectEnterpriseMapper.selectSubjectEnterpriseList(page, subjectEnterprise));
+	}
+
+	@Override
+	public boolean submitSubject(Subject subject) {
+		if (Func.isEmpty(subject.getId())) {
+			//新增
+			return save(subject);
+		} else {
+			//修改
+			return updateById(subject);
+		}
+	}
+
+	@Override
+	public boolean deleteSubject(Long subjectId) {
+		//查询是否有子项
+		if(baseMapper.selectCount(Wrappers.<Subject>lambdaQuery().eq(Subject::getParentId, subjectId)) > 0){
+			throw new ServiceException("请先删除子项!");
+		}
+		return baseMapper.deleteSubject(subjectId);
+	}
+
+	@Override
+	public boolean importSubjectEnterprise(MultipartFile file) {
+		List<SubjectEnterpriseExcel> data = ExcelUtil.read(file, 0, 2, SubjectEnterpriseExcel.class);
+		if (CollectionUtil.isEmpty(data)) {
+			throw new ServiceException("未能从模板中读取数据,请检查模板格式是否正确");
+		}
+		List<SubjectEnterprise> insertList = new ArrayList<>();
+		int batchCount = 20;
+		for (SubjectEnterpriseExcel excel : data) {
+			SubjectEnterprise entity = Objects.requireNonNull(BeanUtil.copyProperties(excel, SubjectEnterprise.class));
+
+			Subject dbSubject = baseMapper.selectOne(Wrappers.<Subject>lambdaQuery().eq(Subject::getName, excel.getSubjectName()));
+			if (dbSubject == null) {
+				throw new ServiceException("对应会计科目:" + excel.getSubjectName() + "不存在");
+			}
+			entity.setSubjectId(dbSubject.getId());
+			insertList.add(entity);
+			if (insertList.size() % batchCount == 0) {
+				if (subjectEnterpriseMapper.insertBatch(insertList) > 0) {
+					insertList.clear();
+				}
+			}
+		}
+
+		if (Func.isEmpty(insertList)) {
+			subjectEnterpriseMapper.insertBatch(insertList);
+		}
+		return true;
+	}
+
+	@Override
+	public boolean deleteBatchSubjectEnterprise(List<Long> ids) {
+		return subjectEnterpriseMapper.deleteBatch((ids)) > 0;
+	}
+
+	@SneakyThrows
+	@Override
+	public void exportSubjectEnterprise(HttpServletResponse response,SubjectEnterprise dto){
+
+		IPage<SubjectEnterprise> page = Condition.getPage(new Query().setCurrent(1).setSize(Integer.MAX_VALUE));
+		List<SubjectEnterprise> list = this.selectSubjectEnterpriseList(page, dto).getRecords();
+
+ 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/企业会计科目.xls");
+		response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("企业会计科目.xls", Charsets.UTF_8));
+		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+			.withTemplate((templateFileName))
+			.excelType(ExcelTypeEnum.XLS)
+			.build();
+
+		WriteSheet writeSheet = EasyExcel.writerSheet().build();
+		//设置list集合数据
+		excelWriter.fill(new FillWrapper("list", list), writeSheet);
+		excelWriter.finish();
+		if (templateFileName != null) {
+			templateFileName.close();
+		}
+	}
+
+	@Override
+	public boolean submitSubjectEnterprise(SubjectEnterprise subjectEnterprise) {
+		if (Func.isNull(subjectEnterprise.getId())) {
+			//新增
+			return subjectEnterpriseMapper.insert(subjectEnterprise) == 1;
+		} else {
+			//修改
+			return subjectEnterpriseMapper.updateById(subjectEnterprise) == 1;
+		}
+	}
+
 }
 }

+ 14 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java

@@ -10,12 +10,14 @@ import jakarta.annotation.Resource;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.CollectionUtil;
-import org.sky.core.tool.utils.DateUtil;
 import org.sky.core.tool.utils.StringUtil;
 import org.sky.core.tool.utils.StringUtil;
 import org.sky.scientific.excel.XmExcel;
 import org.sky.scientific.excel.XmExcel;
 import org.sky.scientific.mapper.*;
 import org.sky.scientific.mapper.*;
 import org.sky.scientific.pojo.dto.XmDTO;
 import org.sky.scientific.pojo.dto.XmDTO;
-import org.sky.scientific.pojo.entity.*;
+import org.sky.scientific.pojo.entity.CgZlEntity;
+import org.sky.scientific.pojo.entity.XmEntity;
+import org.sky.scientific.pojo.entity.XmJdxbgEntity;
+import org.sky.scientific.pojo.entity.XmJtbEntity;
 import org.sky.scientific.pojo.vo.XmSummary;
 import org.sky.scientific.pojo.vo.XmSummary;
 import org.sky.scientific.pojo.vo.XmVO;
 import org.sky.scientific.pojo.vo.XmVO;
 import org.sky.scientific.pojo.vo.XmYszbVO;
 import org.sky.scientific.pojo.vo.XmYszbVO;
@@ -23,7 +25,6 @@ import org.sky.scientific.service.IXmService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -56,8 +57,7 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 	@Override
 	@Override
 	public IPage<XmEntity> selectXmList(IPage<XmEntity> page, XmDTO xm) {
 	public IPage<XmEntity> selectXmList(IPage<XmEntity> page, XmDTO xm) {
 		if (StringUtil.isBlank(xm.getYearAndMonth())) {
 		if (StringUtil.isBlank(xm.getYearAndMonth())) {
-			xm.setYearAndMonth(DateUtil.format(new Date(), DateUtil.PATTERN_YYYYMM));
-//			throw new ServiceException("参数yearAndMonth不能为空");
+			throw new ServiceException("参数yearAndMonth不能为空");
 		}
 		}
 		return page.setRecords(baseMapper.selectXmPage(page, xm));
 		return page.setRecords(baseMapper.selectXmPage(page, xm));
 	}
 	}
@@ -143,6 +143,15 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 		return baseMapper.selectByXmId(xmId);
 		return baseMapper.selectByXmId(xmId);
 	}
 	}
 
 
+	@Override
+	public IPage<JSONObject> selectAssistList(IPage<JSONObject> page, XmDTO xm) {
+		if (StringUtil.isBlank(xm.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+
+		return page.setRecords(baseMapper.selectAssistList(page, xm));
+	}
+
 	/**
 	/**
 	 * 判断项目名称是否有效
 	 * 判断项目名称是否有效
 	 *
 	 *

BIN
kd-service/kd-scientific/src/main/resources/export-template/企业会计科目.xls