Commit 8c872332 authored by chenyuefang's avatar chenyuefang

成本汇总相关

parent 9e231a13
...@@ -186,16 +186,14 @@ tenant: ...@@ -186,16 +186,14 @@ tenant:
- d_customer_tax_certificate - d_customer_tax_certificate
- f_supplier_limited - f_supplier_limited
- f_ads_bsi_kpi_proj_two - f_ads_bsi_kpi_proj_two
- cb_account_summary - cb_summary
- cb_account_summary_actual - cb_summary_actual
- cb_cost_measure - cb_cost_measure
- cb_cost_measure_actual - cb_cost_measure_actual
- cb_direct_expense - cb_direct_expense
- cb_project_expense_summary - cb_project_expense_summary
- cb_project_file - cb_project_file
- cb_project_record - cb_project_record
- cb_project_summary
- cb_project_summary_actual
- cb_quantity_summary - cb_quantity_summary
- cb_quantity_summary_actual - cb_quantity_summary_actual
- cb_scene_expense_children - cb_scene_expense_children
......
...@@ -2,11 +2,17 @@ package com.dsk.cscec.controller; ...@@ -2,11 +2,17 @@ package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.service.CbSummaryService; import com.dsk.cscec.service.CbSummaryService;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/** /**
* 成本汇总(CbSummary)表控制层 * 成本汇总(CbSummary)表控制层
...@@ -24,4 +30,46 @@ public class CbSummaryController extends BaseController { ...@@ -24,4 +30,46 @@ public class CbSummaryController extends BaseController {
private CbSummaryService cbSummaryService; private CbSummaryService cbSummaryService;
/**
* 成本汇总左侧列表
*
* @param bo
* @return
*/
@GetMapping("/cbNameList")
public R<List<Map<String, Object>>> getCbNameList(CbSummaryBo bo) {
return R.ok(cbSummaryService.getCbNameList(bo));
}
//成本汇总数据列表
@GetMapping("/list")
public R getList(CbSummaryActualListBo bo) {
return R.ok(cbSummaryService.getActualList(bo));
}
/**
* 已添加成本月份
*
* @param bo
* @return
*/
@GetMapping("/expenseDateList")
public R<List<String>> getExpenseDateList(@Validated CbSummaryBo bo) {
return R.ok(cbSummaryService.getExpenseDateList(bo));
}
/**
* 编辑成本
*
* @param boList
* @return
*/
@PutMapping("/editActual")
public R editActual(@RequestBody List<CbSummaryActualBo> boList) {
return cbSummaryService.insertOrUpdateActual(boList) == true ? R.ok() : R.fail();
}
//锁定成本-至少有一条实际数据?
//导出excel-缺模板
} }
...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId; ...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
...@@ -27,11 +28,11 @@ public class CbSummaryActual implements Serializable { ...@@ -27,11 +28,11 @@ public class CbSummaryActual implements Serializable {
/** /**
* 本月费用(含税) * 本月费用(含税)
*/ */
private Double taxInclusiveExpense; private BigDecimal taxInclusiveExpense;
/** /**
* 本月费用(不含税) * 本月费用(不含税)
*/ */
private Double taxExclusiveExpense; private BigDecimal taxExclusiveExpense;
/** /**
* 费用日期 * 费用日期
*/ */
......
package com.dsk.cscec.domain.bo;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* 成本汇总-每月费用Bo
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryActualBo extends BaseEntity {
/**
* 主键id
*/
private Long id;
/**
* 成本汇总id
*/
@NotNull(message = "成本汇总id不能为空")
private Long cbSummaryId;
/**
* 本月费用(含税)
*/
private BigDecimal taxInclusiveExpense;
/**
* 本月费用(不含税)
*/
private BigDecimal taxExclusiveExpense;
/**
* 费用日期
*/
@NotEmpty(message = "费用日期不能为空")
private String expenseDate;
}
package com.dsk.cscec.domain.bo;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 成本汇总-列表查询Bo
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryActualListBo extends BaseEntity {
/**
* 主键id
*/
private Long id;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType;
/**
* 费用日期
*/
private String expenseDate;
}
package com.dsk.cscec.domain.bo;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 成本汇总Bo
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryBo extends BaseEntity {
/**
* 主键id
*/
private Long id;
/**
* 父级id
*/
private Long parentId;
/**
* 层级
*/
private Integer level;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType;
}
package com.dsk.cscec.domain.vo;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 成本汇总Bo
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryActualListVo extends BaseEntity {
/**
* 主键id
*/
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 序号
*/
private String number;
/**
* 名称/成本科目
*/
private String cbName;
/**
* 不含税成本合价
*/
private String taxExclusiveTotal;
/**
* 成本税金合价
*/
private String cbTaxesTotal;
/**
* 含税成本合价
*/
private String taxInclusiveTotal;
/**
* 成本占比
*/
private String cbProportion;
/**
* 含税成本平米指标
*/
private String taxInclusivePmTarget;
/**
* 备注
*/
private String remark;
/**
* 费用id
*/
private Long actualId;
/**
* 本月费用(含税)
*/
private BigDecimal taxInclusiveExpense;
/**
* 本月费用(不含税)
*/
private BigDecimal taxExclusiveExpense;
/**
* 费用日期
*/
private String expenseDate;
/**
* 是否锁定(0否,1是)
*/
private Integer lockStatus;
private List<CbSummaryActualListVo> children;
}
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 成本汇总(CbSummary)-项目汇总导入Vo
*
* @author cyf
* @since 2024-02-06
*/
@Data
@NoArgsConstructor
public class CbSummaryProjectImportVo implements Serializable {
private static final long serialVersionUID = -20126964599875841L;
/**
* 序号
*/
@ExcelProperty(value = "序号")
private String number;
/**
* 名称
*/
@ExcelProperty(value = "名称")
private String cbName;
/**
* 不含税成本合价
*/
@ExcelProperty(value = "不含税成本合价")
private String taxExclusiveTotal;
/**
* 成本税金合价
*/
@ExcelProperty(value = "成本税金合价")
private String cbTaxesTotal;
/**
* 含税成本合价
*/
@ExcelProperty(value = "含税成本合价")
private String taxInclusiveTotal;
/**
* 成本占比
*/
@ExcelProperty(value = "成本占比")
private String cbProportion;
/**
* 含税成本平米指标
*/
@ExcelProperty(value = "含税成本平米指标")
private String taxInclusivePmTarget;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
...@@ -2,6 +2,9 @@ package com.dsk.cscec.mapper; ...@@ -2,6 +2,9 @@ package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummaryActual; import com.dsk.cscec.domain.CbSummaryActual;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 成本汇总-每月费用(CbSummaryActual)表数据库访问层 * 成本汇总-每月费用(CbSummaryActual)表数据库访问层
...@@ -10,5 +13,12 @@ import com.dsk.cscec.domain.CbSummaryActual; ...@@ -10,5 +13,12 @@ import com.dsk.cscec.domain.CbSummaryActual;
* @since 2024-02-06 * @since 2024-02-06
*/ */
public interface CbSummaryActualMapper extends BaseMapper<CbSummaryActual> { public interface CbSummaryActualMapper extends BaseMapper<CbSummaryActual> {
/**
* 批量新增或按主键更新数据(MyBatis原生foreach方法)
*
* @param entities List<CbSummaryActual> 实例对象列表
* @return 影响行数
*/
int insertOrUpdateBatch(@Param("entities") List<CbSummaryActual> entities);
} }
...@@ -2,6 +2,12 @@ package com.dsk.cscec.mapper; ...@@ -2,6 +2,12 @@ package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummary; import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/** /**
* 成本汇总(CbSummary)表数据库访问层 * 成本汇总(CbSummary)表数据库访问层
...@@ -11,4 +17,21 @@ import com.dsk.cscec.domain.CbSummary; ...@@ -11,4 +17,21 @@ import com.dsk.cscec.domain.CbSummary;
*/ */
public interface CbSummaryMapper extends BaseMapper<CbSummary> { public interface CbSummaryMapper extends BaseMapper<CbSummary> {
List<CbSummaryActualListVo> getByParentId(@Param("parentId") Long parentId, @Param("expenseDate") String expenseDate);
/**
* 获取已添加成本月份
*
* @param bo
* @return
*/
List<String> getExpenseDateList(@Param("bo") CbSummaryBo bo);
/**
* 根据level获取名称/成本科目
*
* @param bo
* @return
*/
List<Map<String, Object>> selectByLevel(@Param("bo") CbSummaryBo bo);
} }
...@@ -2,6 +2,13 @@ package com.dsk.cscec.service; ...@@ -2,6 +2,13 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSummary; import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import java.util.List;
import java.util.Map;
/** /**
...@@ -12,4 +19,38 @@ import com.dsk.cscec.domain.CbSummary; ...@@ -12,4 +19,38 @@ import com.dsk.cscec.domain.CbSummary;
*/ */
public interface CbSummaryService extends IService<CbSummary> { public interface CbSummaryService extends IService<CbSummary> {
//项目汇总导入 todo
void importCbProject(Long projectId, Integer cbStage);
/**
* 获取一级名称/成本科目列表
*
* @param bo
* @return
*/
List<Map<String, Object>> getCbNameList(CbSummaryBo bo);
/**
* 根据父级id获取子级数据
*
* @param bo
* @return
*/
List<CbSummaryActualListVo> getActualList(CbSummaryActualListBo bo);
/**
* 获取已添加成本月份
*
* @param bo
* @return
*/
List<String> getExpenseDateList(CbSummaryBo bo);
/**
* 新增/更新每月费用
*
* @param boList
* @return
*/
boolean insertOrUpdateActual(List<CbSummaryActualBo> boList);
} }
package com.dsk.cscec.service.impl; package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.mapper.CbSummaryMapper; import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbSummary; import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.CbSummaryActual;
import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbSummaryActualMapper;
import com.dsk.cscec.mapper.CbSummaryMapper;
import com.dsk.cscec.service.CbSummaryService; import com.dsk.cscec.service.CbSummaryService;
import jodd.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
/** /**
* 成本汇总(CbSummary)表服务实现类 * 成本汇总(CbSummary)表服务实现类
...@@ -14,5 +35,138 @@ import org.springframework.stereotype.Service; ...@@ -14,5 +35,138 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary> implements CbSummaryService { public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary> implements CbSummaryService {
@Autowired
private CbProjectFileMapper cbProjectFileMapper;
@Autowired
private CbSummaryActualMapper cbSummaryActualMapper;
@Override
public void importCbProject(Long projectId, Integer cbStage) {
//获取文件信息
List<CbProjectFile> cbProjectFiles = cbProjectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectId)
.eq(CbProjectFile::getCbStage, cbStage)
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_SUMMARY)
);
//解析数据
cbProjectFiles.forEach(cbProjectFile -> {
MultipartFile file = null;//todo
if (cbProjectFile.getFileName().contains("项目")) {
} else if (cbProjectFile.getFileName().contains("项目")) {
} else {
//修改文件状态
cbProjectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
cbProjectFile.setFailRemark("文件名错误!");
cbProjectFileMapper.updateById(cbProjectFile);
}
});
}
@Override
public List<Map<String, Object>> getCbNameList(CbSummaryBo bo) {
List<Map<String, Object>> resultList = new ArrayList<>();
//项目汇总
if (1 == bo.getCbType()) {
//获取一级数据
bo.setLevel(1);
List<Map<String, Object>> cbNames = baseMapper.selectByLevel(bo);
if (CollectionUtil.isEmpty(cbNames)) {
return null;
}
Map<String, Object> xmhz = new HashMap<>();
xmhz.put("id", 0l);
xmhz.put("cbName", "成本汇总");
resultList.add(xmhz);
resultList.addAll(cbNames);
}
//成本科目汇总
if (2 == bo.getCbType()) {
bo.setLevel(0);
List<Map<String, Object>> cbNameTop = baseMapper.selectByLevel(bo);
bo.setLevel(1);
List<Map<String, Object>> cbNames = baseMapper.selectByLevel(bo);
resultList.addAll(cbNameTop);//todo
resultList.addAll(cbNames);
}
return resultList;
}
@Override
public List<CbSummaryActualListVo> getActualList(CbSummaryActualListBo bo) {
//项目汇总
if (1 == bo.getCbType()) {
return getProjectSumList(bo);
}
//成本科目汇总
if (2 == bo.getCbType()) {
//todo
}
return null;
}
/**
* 项目汇总列表
*
* @param bo
* @return
*/
private List<CbSummaryActualListVo> getProjectSumList(CbSummaryActualListBo bo) {
CbSummary cbSummary = baseMapper.selectById(bo.getId());
if (ObjectUtil.isEmpty(cbSummary)) {
return null;
}
if (StringUtil.isBlank(bo.getExpenseDate())) {
//默认当前月
bo.setExpenseDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date()));
}
List<CbSummaryActualListVo> childrenList = baseMapper.getByParentId(bo.getId(), bo.getExpenseDate());
if (0 == cbSummary.getLevel()) {
return childrenList;
} else {
childrenList.forEach(children -> {
CbSummaryActualListBo childBo = new CbSummaryActualListBo();
childBo.setId(children.getId());
childBo.setExpenseDate(bo.getExpenseDate());
children.setChildren(getProjectSumList(childBo));
});
return childrenList;
}
}
@Override
public List<String> getExpenseDateList(CbSummaryBo bo) {
return baseMapper.getExpenseDateList(bo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean insertOrUpdateActual(List<CbSummaryActualBo> boList) {
if (CollectionUtil.isEmpty(boList)) {
return false;
}
List<CbSummaryActual> actualList = BeanUtil.copyToList(boList, CbSummaryActual.class);
CbSummaryActual actualUpdate = actualList.get(0);
CbSummaryActual actual = cbSummaryActualMapper.selectOne(new LambdaQueryWrapper<CbSummaryActual>()
.eq(CbSummaryActual::getCbSummaryId, actualUpdate.getCbSummaryId())
.eq(CbSummaryActual::getExpenseDate, actualUpdate.getExpenseDate())
.eq(CbSummaryActual::getDelFlag, 0)
);
if (ObjectUtil.isNotNull(actual) && 1 == actual.getLockStatus()) {
throw new ServiceException("当前成本已锁定,不允许编辑!");
}
return cbSummaryActualMapper.insertOrUpdateBatch(actualList) > 0;
}
} }
...@@ -17,5 +17,15 @@ ...@@ -17,5 +17,15 @@
id, cb_summary_id, tax_inclusive_expense, tax_exclusive_expense, expense_date, lock_status, create_time, del_flag id, cb_summary_id, tax_inclusive_expense, tax_exclusive_expense, expense_date, lock_status, create_time, del_flag
</sql> </sql>
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into cb_summary_actual(cb_summary_id, tax_inclusive_expense, tax_exclusive_expense,expense_date)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.cbSummaryId}, #{entity.taxInclusiveExpense}, #{entity.taxExclusiveExpense}, #{entity.expenseDate})
</foreach>
on duplicate key update
cb_summary_id = values(cb_summary_id) , tax_inclusive_expense = values(tax_inclusive_expense) ,
tax_exclusive_expense = values(tax_exclusive_expense) , expense_date = values(expense_date)
</insert>
</mapper> </mapper>
...@@ -28,5 +28,43 @@ ...@@ -28,5 +28,43 @@
cb_taxes_total, tax_inclusive_total, cb_proportion, tax_inclusive_pm_target, remark, create_time, del_flag, cb_taxes_total, tax_inclusive_total, cb_proportion, tax_inclusive_pm_target, remark, create_time, del_flag,
cb_type cb_type
</sql> </sql>
<select id="getByParentId" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date,csa.lock_status
from cb_summary csu
left join cb_summary_actual csa on csu.id = csa.cb_summary_id and csa.expense_date = #{expenseDate} AND csa.del_flag = 0
<where>
csu.parent_id = #{parentId}
and csu.del_flag = 0
</where>
order by csu.sort
</select>
<select id="getExpenseDateList" resultType="string">
select csa.expense_date
from cb_summary_actual csa
left join cb_summary csu on csu.id = csa.cb_summary_id
where
csu.project_id = #{bo.projectId}
and csu.cb_stage = #{bo.cbStage}
and csu.cb_type = #{bo.cbType}
and csu.del_flag = 0
and csa.del_flag = 0
group by csa.expense_date
order by csa.expense_date asc
</select>
<select id="selectByLevel" resultType="map">
select csu.id,csu.cb_name as cbName
from cb_summary csu
where
csu.del_flag = 0
and csu.project_id = #{bo.projectId}
and csu.cb_stage = #{bo.cbStage}
and csu.cb_type = #{bo.cbType}
and csu.level = #{bo.level}
order by csu.sort
</select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment