Browse Source

会计口径-研发费用辅助明细账

zhouli 9 months ago
parent
commit
13c5ab8c54

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

@@ -18,6 +18,9 @@ public class XmCostDetailsDTO implements Serializable {
 	@Schema(description = "所属年月")
 	private String yearAndMonth;
 
+	@Schema(description = "租户id", hidden = true)
+	private String tenantId;
+
 	@Schema(description = "研发项目名称")
 	private String xmmc;
 

+ 32 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/FinanceCostDetailVO.java

@@ -0,0 +1,32 @@
+package org.sky.scientific.pojo.vo;
+
+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.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class FinanceCostDetailVO {
+
+	@Schema(description = "项目编号")
+	private String xmbh;
+
+	@Schema(description = "项目名称")
+	private String xmmc;
+
+	@Schema(description = "")
+	private List<FinanceCostItemVO> costList;
+
+
+
+
+}
+
+
+
+

+ 61 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/FinanceCostItemVO.java

@@ -0,0 +1,61 @@
+package org.sky.scientific.pojo.vo;
+
+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.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FinanceCostItemVO{
+
+	@Schema(description = "凭证日期")
+	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
+	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	private Date recordDate;
+
+	@Schema(description = "凭证字号")
+	private String voucherNumber;
+
+	@Schema(description = "摘要")
+	private String digest;
+
+	@Schema(description = "企业科目id")
+	private Long eSubjectId;
+
+	@Schema(description = "系统三级科目编码,用于归集费用")
+	private String subjectCode;
+
+	@Schema(description = "金额")
+	private BigDecimal amount;
+
+	@Schema(description = "账簿名称")
+	private String cashbook;
+
+	@Schema(description = "1、人员人工")
+	private Double ryrg;
+
+	@Schema(description = "2、直接投入")
+	private Double zjtr;
+
+	@Schema(description = "3、折旧费用与长期摊销费用")
+	private Double zjfyycqdtfy;
+
+	@Schema(description = "4、设计费")
+	private Double sjf;
+
+	@Schema(description = "5、无形资产摊销")
+	private Double wxzctx;
+
+	@Schema(description = "6、装备调试费用与试验费用")
+	private Double zbtsfyysyfy;
+
+	@Schema(description = "7、其他费用")
+	private Double qtfy;
+
+	@Schema(description = "8、委外研发")
+	private Double wwyf;
+}

+ 12 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmCostDetailsController.java

@@ -17,10 +17,13 @@ import org.sky.core.tool.api.R;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.pojo.dto.XmCostDetailsDTO;
 import org.sky.scientific.pojo.entity.XmCostDetailsEntity;
+import org.sky.scientific.pojo.vo.FinanceCostDetailVO;
 import org.sky.scientific.service.IXmCostDetailsService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * 研发费用支出明细账 控制器
  *
@@ -72,4 +75,13 @@ public class XmCostDetailsController extends KdController {
 		service.exportXmCostDetails(response,dto);
 	}
 
+	@GetMapping("/finance-list")
+	@ApiOperationSupport(order = 20)
+	@Operation(summary = "会计口径-研发费用辅助明细账")
+	public R<List<FinanceCostDetailVO>> financeCostDetail(XmCostDetailsDTO dto) {
+		return R.data(service.financeCostDetail(dto));
+	}
+
+
+
 }

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

@@ -25,4 +25,6 @@ public interface SubjectEnterpriseMapper extends BaseMapper<SubjectEnterprise> {
 	int insertBatch(List<SubjectEnterprise> insertList);
 
 	int deleteBatch(List<Long> ids);
+
+
 }

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

@@ -3,8 +3,10 @@ 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.core.tenant.annotation.TenantIgnore;
 import org.sky.scientific.pojo.dto.XmCostDetailsDTO;
 import org.sky.scientific.pojo.entity.XmCostDetailsEntity;
+import org.sky.scientific.pojo.vo.FinanceCostDetailVO;
 
 import java.util.List;
 
@@ -34,4 +36,13 @@ public interface XmCostDetailsMapper extends BaseMapper<XmCostDetailsEntity> {
 	List<XmCostDetailsEntity> selectPageByYear(IPage<XmCostDetailsEntity> page, @Param("ew") XmCostDetailsDTO dto);
 
 	int physicalDeleteByIds(List<Long> ids);
+
+	/**
+	 * 会计口径-研发费用辅助明细账
+	 * @param dto
+	 * @return
+	 */
+
+	@TenantIgnore
+    List<FinanceCostDetailVO> financeCostDetail(XmCostDetailsDTO dto);
 }

+ 41 - 7
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmCostDetailsMapper.xml

@@ -40,11 +40,9 @@
         LEFT JOIN
         (
             SELECT
-                xm.id,
+                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%m') <![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 = 'XMBH' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMBH) AS
-                         XMBH
+                             XMMC
             FROM kd_xm xm
             WHERE xm.is_deleted = 0
         ) xm on xm.id = d.xm_id
@@ -60,9 +58,8 @@
         LEFT JOIN
         (
             SELECT
-                xm.id,
-                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') = #{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 = 'XMBH' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y') = #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMBH) AS XMBH
+                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') = #{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 = d.xm_id
@@ -72,4 +69,41 @@
             <if test="ew.amountMin!=null and ew.amountMax!=null"> and d.amount between #{ew.amountMin} and #{ew.amountMax}</if>
     </select>
 
+
+    <resultMap id="FinanceCostDetailVO" type="org.sky.scientific.pojo.vo.FinanceCostDetailVO">
+        <result column="XMBH" property="xmbh"/>
+        <result column="XMMC" property="xmmc"/>
+
+        <collection property="costList" ofType="org.sky.scientific.pojo.vo.FinanceCostItemVO">
+            <result column="record_date" property="recordDate"/>
+            <result column="voucher_number" property="voucherNumber"/>
+            <result column="digest" property="digest"/>
+            <result column="e_subject_id" property="eSubjectId"/>
+            <result column="subject_code" property="subjectCode"/>
+            <result column="amount" property="amount"/>
+            <result column="cashbook" property="cashbook"/>
+        </collection>
+    </resultMap>
+    <select id="financeCostDetail" resultMap="FinanceCostDetailVO">
+        SELECT xm.XMBH,xm.XMMC,kxcd.record_date,kxcd.voucher_number,kxcd.digest,kxcd.amount,kxcd.cashbook, kxcd.e_subject_id,s.subject_code
+        FROM kd_xm_cost_details kxcd
+        LEFT JOIN
+        (
+            SELECT se.id, se.subject_id ,sub.parent_id, sub1.`code` as subject_code
+            FROM kd_subject_enterprise se
+            LEFT JOIN kd_subject sub on sub.id = se.subject_id
+            LEFT JOIN kd_subject sub1 on sub1.id = sub.parent_id
+        )s ON s.id = kxcd.e_subject_id
+        LEFT JOIN
+        (
+            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%m') <![CDATA[<=]]> #{yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMMC) AS XMMC
+            FROM kd_xm xm
+            WHERE xm.is_deleted = 0
+        ) xm on xm.id = kxcd.xm_id
+        WHERE kxcd.tenant_id = #{tenantId} and kxcd.year_and_month = #{yearAndMonth}
+        <if test="xmmc!=null and xmmc!=''">and xm.XMMC like concat('%',#{xmmc},'%') </if>
+     </select>
+
 </mapper>

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

@@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import org.sky.core.mp.base.BaseService;
 import org.sky.scientific.pojo.dto.XmCostDetailsDTO;
 import org.sky.scientific.pojo.entity.XmCostDetailsEntity;
+import org.sky.scientific.pojo.vo.FinanceCostDetailVO;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -55,4 +56,11 @@ public interface IXmCostDetailsService extends BaseService<XmCostDetailsEntity>
 	 * @return
 	 */
 	void exportXmCostDetails(HttpServletResponse response, XmCostDetailsDTO dto);
+
+	/**
+	 * 会计口径-研发费用辅助明细账
+	 * @param dto
+	 * @return
+	 */
+	List<FinanceCostDetailVO> financeCostDetail(XmCostDetailsDTO dto);
 }

+ 13 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/SubjectServiceImpl.java

@@ -144,19 +144,29 @@ public class SubjectServiceImpl extends ServiceImpl<SubjectMapper, Subject> impl
 
 	@Override
 	public boolean submitSubjectEnterprise(SubjectEnterprise subjectEnterprise) {
-		SubjectEnterprise dbEntity = subjectEnterpriseMapper.selectOne(Wrappers.<SubjectEnterprise>lambdaQuery().eq(SubjectEnterprise::getName, subjectEnterprise.getName()));
+		SubjectEnterprise dbEntityByName = subjectEnterpriseMapper.selectOne(Wrappers.<SubjectEnterprise>lambdaQuery()
+			.eq(SubjectEnterprise::getName, subjectEnterprise.getName()));
+
+		SubjectEnterprise dbEntityByCode = subjectEnterpriseMapper.selectOne(Wrappers.<SubjectEnterprise>lambdaQuery()
+			.eq(SubjectEnterprise::getCode, subjectEnterprise.getCode()));
 
 		if (Func.isNull(subjectEnterprise.getId())) {
 			//新增
-			if (dbEntity != null) {
+			if (dbEntityByName != null && Func.equals(dbEntityByName.getName(), subjectEnterprise.getName())) {
 				throw new ServiceException("科目名称已存在");
 			}
+			if (dbEntityByCode != null && Func.equals(dbEntityByCode.getCode(), subjectEnterprise.getCode())) {
+				throw new ServiceException("科目代码已存在");
+			}
 			return subjectEnterpriseMapper.insert(subjectEnterprise) == 1;
 		} else {
 			//修改
-			if (dbEntity != null && Func.equals(dbEntity.getName(), subjectEnterprise.getName()) && !Func.equals(dbEntity.getId(), subjectEnterprise.getId())) {
+			if (dbEntityByName != null && Func.equals(dbEntityByName.getName(), subjectEnterprise.getName()) && !Func.equals(dbEntityByName.getId(), subjectEnterprise.getId())) {
 				throw new ServiceException("科目名称已存在");
 			}
+			if (dbEntityByCode != null && Func.equals(dbEntityByCode.getCode(), subjectEnterprise.getCode()) && !Func.equals(dbEntityByCode.getId(), subjectEnterprise.getId())) {
+				throw new ServiceException("科目代码已存在");
+			}
 			return subjectEnterpriseMapper.updateById(subjectEnterprise) == 1;
 		}
 	}

+ 58 - 16
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmCostDetailsServiceImpl.java

@@ -8,6 +8,7 @@ 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.secure.utils.SecureUtil;
 import org.sky.core.tool.utils.*;
 import org.sky.scientific.excel.XmCostDetailsExcel;
 import org.sky.scientific.mapper.SubjectEnterpriseMapper;
@@ -17,14 +18,13 @@ import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.pojo.dto.XmCostDetailsDTO;
 import org.sky.scientific.pojo.entity.SubjectEnterprise;
 import org.sky.scientific.pojo.entity.XmCostDetailsEntity;
+import org.sky.scientific.pojo.vo.FinanceCostDetailVO;
+import org.sky.scientific.pojo.vo.FinanceCostItemVO;
 import org.sky.scientific.service.IXmCostDetailsService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 研发费用支出明细账 服务实现类
@@ -42,15 +42,15 @@ public class XmCostDetailsServiceImpl extends BaseServiceImpl<XmCostDetailsMappe
 
 	@Override
 	public IPage<XmCostDetailsEntity> selectXmCostDetailsPage(IPage<XmCostDetailsEntity> page, XmCostDetailsDTO dto) {
-		if(Func.isBlank(dto.getYearAndMonth())){
+		if (Func.isBlank(dto.getYearAndMonth())) {
 			throw new ServiceException("参数yearAndMonth不能为空");
 		}
 		List<XmCostDetailsEntity> list = null;
-		if(dto.getYearAndMonth().length() == 6){
+		if (dto.getYearAndMonth().length() == 6) {
 			list = baseMapper.selectPageByYearAndMonth(page, dto);
-		}else if(dto.getYearAndMonth().length() == 4){
+		} else if (dto.getYearAndMonth().length() == 4) {
 			list = baseMapper.selectPageByYear(page, dto);
-		}else {
+		} else {
 			throw new ServiceException("参数yearAndMonth格式错误,yyyyMM或yyyy");
 		}
 		return page.setRecords(list);
@@ -94,13 +94,13 @@ public class XmCostDetailsServiceImpl extends BaseServiceImpl<XmCostDetailsMappe
 			judgeDate(excel.getRecordDate(), yearAndMonth);
 
 			if (Func.isBlank(excel.getXmmc())) {
-				throw new ServiceException("序号["+excel.getSerialNumber()+"]的研发项目名称不能为空");
+				throw new ServiceException("序号[" + excel.getSerialNumber() + "]的研发项目名称不能为空");
 			}
-			if(Func.isBlank(excel.getESubjectCode())){
-				throw new ServiceException("序号["+excel.getSerialNumber()+"]的企业科目代码不能为空");
+			if (Func.isBlank(excel.getESubjectCode())) {
+				throw new ServiceException("序号[" + excel.getSerialNumber() + "]的企业科目代码不能为空");
 			}
-			if(Func.isBlank(excel.getESubjectName())){
-				throw new ServiceException("序号["+excel.getSerialNumber()+"]的企业科目名称不能为空");
+			if (Func.isBlank(excel.getESubjectName())) {
+				throw new ServiceException("序号[" + excel.getSerialNumber() + "]的企业科目名称不能为空");
 			}
 //			if(excel.getSubjectName().contains("\\") && excel.getSubjectName().split("\\\\").length != 4){
 //				throw new ServiceException("序号["+excel.getSerialNumber()+"]的科目名称应该为四级科目");
@@ -116,8 +116,8 @@ public class XmCostDetailsServiceImpl extends BaseServiceImpl<XmCostDetailsMappe
 
 //			Subject dbSubject = subjectMapper.selectOne(Wrappers.<Subject>lambdaQuery().eq(Subject::getCode, excel.getSubjectCode()));
 			SubjectEnterprise dbSubject = subjectEnterpriseMapper.selectOne(Wrappers.<SubjectEnterprise>lambdaQuery().eq(SubjectEnterprise::getCode, excel.getESubjectCode()));
-			if(Func.isNull(dbSubject)){
-				throw new ServiceException("序号["+excel.getSerialNumber()+"]的企业科目代码不存在");
+			if (Func.isNull(dbSubject)) {
+				throw new ServiceException("序号[" + excel.getSerialNumber() + "]的企业科目代码不存在");
 			}
 			entity.setESubjectId(dbSubject.getId());
 			entity.setESubjectCode(dbSubject.getCode());
@@ -132,7 +132,7 @@ public class XmCostDetailsServiceImpl extends BaseServiceImpl<XmCostDetailsMappe
 			}
 		}
 
-		if(Func.isNotEmpty(insertList)){
+		if (Func.isNotEmpty(insertList)) {
 			this.saveBatch(insertList);
 		}
 		return true;
@@ -143,6 +143,48 @@ public class XmCostDetailsServiceImpl extends BaseServiceImpl<XmCostDetailsMappe
 
 	}
 
+	@Override
+	public List<FinanceCostDetailVO> financeCostDetail(XmCostDetailsDTO dto) {
+		if (Func.isBlank(dto.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		dto.setTenantId(SecureUtil.getTenantId());
+		List<FinanceCostDetailVO> list = baseMapper.financeCostDetail(dto);
+		for (FinanceCostDetailVO tmp : list) {
+			List<FinanceCostItemVO> vos = tmp.getCostList();
+			for (FinanceCostItemVO vo : vos) {
+				if(Arrays.asList("53010101","53010201").contains(vo.getSubjectCode())){
+					//人员人工费用
+					vo.setRyrg(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010102","53010202").contains(vo.getSubjectCode())){
+					//直接投入费用
+					vo.setZjtr(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010103","53010203").contains(vo.getSubjectCode())){
+					//折旧费用与长期待摊费用
+					vo.setZjfyycqdtfy(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010104","53010204").contains(vo.getSubjectCode())){
+					//无形资产摊销费用
+					vo.setWxzctx(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010105","53010205").contains(vo.getSubjectCode())){
+					//设计费用
+					vo.setSjf(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010106","53010206").contains(vo.getSubjectCode())){
+					//装备调试费用与试验费用
+					vo.setZbtsfyysyfy(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010107","53010207").contains(vo.getSubjectCode())){
+					//委托外部研究开发费用
+					vo.setWwyf(vo.getAmount().doubleValue());
+				}else if(Arrays.asList("53010108","53010208").contains(vo.getSubjectCode())){
+					//其他费用
+					vo.setQtfy(vo.getAmount().doubleValue());
+				}else {
+					throw new ServiceException("费用归集出错啦");
+				}
+			}
+		}
+		return list;
+	}
+
 	public static void judgeDate(Date date, String yearAndMonth) {
 		//日期,必须时当月日期
 		if (date != null) {