Commit 331d1b81 authored by tanyang's avatar tanyang

措施费相关接口优化

parent 61c79e19
......@@ -67,6 +67,9 @@ user:
spring:
application:
name: ${ruoyi.name}
jpa:
open-in-view: false
# 资源信息
messages:
# 国际化资源文件路径
......@@ -324,14 +327,16 @@ lock4j:
management:
endpoints:
enabled-by-default: false
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
logfile:
external-file: ./logs/sys-console.log
# endpoints:
# web:
# exposure:
# include: '*'
# endpoint:
# health:
# show-details: ALWAYS
# logfile:
# external-file: ./logs/sys-console.log
gv:
img-path: D:\dsk\dsk-operate-sys\
......
......@@ -3,6 +3,7 @@ package com.dsk.cscec.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.dsk.common.annotation.Log;
......@@ -24,11 +25,13 @@ import com.dsk.cscec.domain.bo.CbCostMeasureActualSaveBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import com.dsk.cscec.domain.vo.CbCostMeasuresImportVo;
import com.dsk.cscec.domain.vo.CbCostMeasuresItemVo;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryVo;
import com.dsk.cscec.listener.ProjectCostMeasureImportListener;
import com.dsk.cscec.service.CbProjectExpenseSummaryService;
import com.dsk.cscec.service.ICbCostMeasureService;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.listener.SysUserImportListener;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
......@@ -63,6 +66,22 @@ public class CbCostMeasureController {
private CbProjectExpenseSummaryService cbProjectExpenseSummaryService;
/**
* 获取实际月份列表
*
* @param cbCostMeasureBo CB成本衡量范围
* @return {@link R}<{@link List}<{@link String}>>
*/
@SaIgnore
@GetMapping(value = "/actual/months")
public R<List<String>> actualMonths(CbCostMeasureActualBo cbCostMeasureBo) {
List<String> data = cbCostMeasureService.actualMonthList(cbCostMeasureBo);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
/**
* 措施费一级大类
* 根据项目查询措施费一级大类
......@@ -91,8 +110,13 @@ public class CbCostMeasureController {
// @SaCheckPermission("cb:costmeasures:list")
@SaIgnore
@GetMapping("/list")
public R<List<CbCostMeasureActualVo>> list(CbCostMeasureActualBo cbCostMeasure) {
List<CbCostMeasureActualVo> data= cbCostMeasureService.selectDataList(cbCostMeasure);
public R<List> list(CbCostMeasureActualBo cbCostMeasure) {
if(ObjectUtil.isNotEmpty(cbCostMeasure)&&cbCostMeasure.getId()==0){
Integer dataType=2;
List<CbProjectExpenseSummaryVo> dataList = cbCostMeasureService.getSummaryData(cbCostMeasure.getProjectId(),dataType,cbCostMeasure.getMonth());
return R.ok(dataList);
}
List<Tree<Long>> data= cbCostMeasureService.selectDataList(cbCostMeasure);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
......@@ -133,6 +157,24 @@ public class CbCostMeasureController {
/**
* 获取上一次推送工程量
*
* @param measuresId 推送BO
* @return {@link R}<{@link List}<{@link CbCostMeasureActualVo}>>
*/
// @SaCheckPermission("cb:costmeasures:actual:push")
@SaIgnore
@GetMapping("/last/project/volume/{measuresId}")
public R<Object> lastProjectVolume(@PathVariable("measuresId") Long measuresId) {
Assert.notNull(measuresId,"措施费记录id不能为空!");
Object pushJson= cbCostMeasureService.lastProjectVolume(measuresId);
return R.ok("操作成功",pushJson);
}
/**
* 获取批量措施费列表
......@@ -200,10 +242,10 @@ public class CbCostMeasureController {
@Log(title = "措施费汇总获取")
// @SaCheckPermission("system:user:import")
@PostMapping(value = "/summary/data")
public R<List<CbProjectExpenseSummary>> summaryData(Long projectId) throws Exception {
public R<List<CbProjectExpenseSummaryVo>> summaryData(Long projectId,String month) throws Exception {
Integer dataType=2;
List<CbProjectExpenseSummary> cbProjectExpenseSummaries = cbProjectExpenseSummaryService.queryCbSceneExpenseSummaryDataByType(projectId, dataType);
return R.ok(cbProjectExpenseSummaries);
List<CbProjectExpenseSummaryVo> dataList = cbCostMeasureService.getSummaryData(projectId,dataType,month);
return R.ok(dataList);
}
......
......@@ -16,33 +16,33 @@ public class CbCostMeasureActualPushBo {
/**
* 截止本月工程量
* 本月实际工程量
*/
private BigDecimal costEffective;
/**
* 本月实际工程量
*/
@TableField(value = "current_project_volume")
private BigDecimal currentProjectVolume;
/**
* 推送工程量
*/
@TableField(value = "submit_project_volume")
private BigDecimal submitProjectVolume;
/**
* 年月
*/
@TableField(value = "`month`")
private String month;
/**
* 推送时间
*/
@TableField(value = "push_time")
private Date pushTime;
/**
* 推送数据json
*/
@TableField(value = "push_data_json")
private String pushDataJson;
/**
......
......@@ -9,6 +9,7 @@ import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
public class CbCostMeasureActualVo {
......@@ -17,6 +18,10 @@ public class CbCostMeasureActualVo {
*/
private Long id;
private Long parentId;
/**
* 序号
*/
......@@ -138,6 +143,9 @@ public class CbCostMeasureActualVo {
private Date pushTime;
private String pushDataJson;
/**
* 修改人
*/
......@@ -162,6 +170,10 @@ public class CbCostMeasureActualVo {
@TableField(value = "update_time")
private Date updateTime;
private List<CbCostMeasureActualVo> childrens;
public static final String COL_ID = "id";
public static final String COL_PLAN_MEASURE_ID = "plan_measure_id";
......
package com.dsk.cscec.domain.vo;
import com.baomidou.mybatisplus.annotation.*;
import com.dsk.common.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 项目费用汇总表
*/
@Data
public class CbProjectExpenseSummaryVo {
/**
* 主键ID
*/
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目文件ID
*/
private Long projectFileId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 序号
*/
private String number;
/**
* 数据类型(2:措施项目、3:其他项目、4:现场经费)
*/
private Integer dataType;
/**
* 名称
*/
private String expenseName;
/**
* 数值
*/
private String expenseValue;
/**
* 占比
*/
private String proportion;
/**
* 本月工程量
*/
private BigDecimal monthsProjectQuantity;
}
\ No newline at end of file
......@@ -13,4 +13,6 @@ public interface CbCostMeasureActualMapper extends BaseMapper<CbCostMeasureActua
int updateByPrimaryKeySelective(CbCostMeasureActual record);
List<CbCostMeasureActualVo> selectDataList(CbCostMeasureActualBo costMeasureActualBo);
List<CbCostMeasureActualVo> getMonthActualCostList(Long projectId, String month);
}
\ No newline at end of file
......@@ -7,10 +7,13 @@ import com.dsk.cscec.domain.CbCostMeasure;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.bo.CbCostMeasureActualBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CbCostMeasureMapper extends BaseMapper<CbCostMeasure> {
List<CbCostMeasureActualVo> selectListByProjectAndNo(CbCostMeasureActualBo cbCostMeasure);
List<String> actualMonthList(CbCostMeasureActualBo cbCostMeasureBo);
}
\ No newline at end of file
......@@ -19,5 +19,6 @@ import java.util.Map;
*/
public interface ICbCostMeasureActualService extends IService<CbCostMeasureActual> {
List<CbCostMeasureActualVo> getMonthActualCostList(Long projectId, String month);
}
package com.dsk.cscec.service;
import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.entity.SysDictData;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbCostMeasure;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
import com.dsk.cscec.domain.bo.CbCostMeasureActualBo;
import com.dsk.cscec.domain.bo.CbCostMeasureActualPushBo;
import com.dsk.cscec.domain.bo.CbCostMeasureActualSaveBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import com.dsk.cscec.domain.vo.CbCostMeasuresItemVo;
import org.springframework.web.multipart.MultipartFile;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryVo;
import java.io.InputStream;
import java.util.List;
......@@ -29,7 +25,7 @@ public interface ICbCostMeasureService extends IService<CbCostMeasure> {
List<Map<String, Object>> listByLevel(Long projectId, int i);
List<CbCostMeasureActualVo> selectDataList(CbCostMeasureActualBo cbCostMeasure);
List<Tree<Long>> selectDataList(CbCostMeasureActualBo cbCostMeasure);
void saveBatchCostMeasureActual(List<CbCostMeasureActualSaveBo> boList);
......@@ -40,5 +36,11 @@ public interface ICbCostMeasureService extends IService<CbCostMeasure> {
void parseCbCostMeasureFile(Long projectId);
boolean reparseCbCostMeasureFile(Long projectId,Long projectFileId);
String lastProjectVolume(Long measuresId);
List<String> actualMonthList(CbCostMeasureActualBo cbCostMeasureBo);
List<CbProjectExpenseSummaryVo> getSummaryData(Long projectId, Integer dataType,String month);
}
package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;
......@@ -16,6 +21,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.JsonUtils;
import com.dsk.common.utils.TreeBuildUtils;
import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.*;
......@@ -25,6 +31,7 @@ import com.dsk.cscec.domain.bo.CbCostMeasureActualSaveBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import com.dsk.cscec.domain.vo.CbCostMeasuresImportVo;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryImportVo;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryVo;
import com.dsk.cscec.listener.ProjectCostMeasureImportListener;
import com.dsk.cscec.listener.ProjectCostMeasureSummaryImportListener;
import com.dsk.cscec.service.*;
......@@ -37,11 +44,10 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Slf4j
@Service
......@@ -161,27 +167,53 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
}
@Override
public List<CbCostMeasureActualVo> selectDataList(CbCostMeasureActualBo costMeasureActualBo) {
public List<Tree<Long>> selectDataList(CbCostMeasureActualBo costMeasureActualBo) {
List<CbCostMeasureActualVo> dataList = new ArrayList<>();
Assert.notNull(costMeasureActualBo.getProjectId(), "项目ID不能为空");
CbProjectRecord byId = cbProjectRecordService.getById(costMeasureActualBo.getProjectId());
Assert.notNull(byId, "项目信息不能为空");
checkProjectExist(costMeasureActualBo.getProjectId());
//查询项目某项措施费所有计划成本
dataList = baseMapper.selectListByProjectAndNo(costMeasureActualBo);
// if (CollectionUtil.isEmpty(dataList)) {
// return dataList;
// }
// // 查询项目某项措施费某月所有实际成本
// List<CbCostMeasureActualVo> actualVoList= cbCostMeasureActualMapper.selectDataList(costMeasureActualBo);
// if (CollectionUtil.isEmpty(actualVoList)) {
// return dataList;
// }
// for (CbCostMeasureActualVo cbCostMeasureActualVo : actualVoList) {
//
// }
return dataList;
//配置类
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
treeNodeConfig.setIdKey("id");
treeNodeConfig.setParentIdKey("parentId");
treeNodeConfig.setChildrenKey("childrens");
//构建树形
List<Tree<Long>> trees = TreeUtil.build(dataList, costMeasureActualBo.getId(), treeNodeConfig, ((object, treeNode) -> {
treeNode.setId(object.getId());//id
treeNode.setParentId(object.getParentId());//父id
// 扩展属性 ...
treeNode.putExtra("itemContent", object.getItemContent());
treeNode.putExtra("number", object.getNumber());
treeNode.putExtra("workContent", object.getWorkContent());
treeNode.putExtra("unit", object.getUnit());
treeNode.putExtra("quantity", object.getQuantity());
treeNode.putExtra("unitPriceExcludingTax", object.getUnitPriceExcludingTax());
treeNode.putExtra("usageTime", object.getUsageTime());
treeNode.putExtra("amountExcludingTax", object.getAmountExcludingTax());
treeNode.putExtra("taxRate", object.getTaxRate());
treeNode.putExtra("amountIncludingTax", object.getAmountIncludingTax());
treeNode.putExtra("amortizationRatio", object.getAmortizationRatio());
treeNode.putExtra("amountIncludeTaxAmortized", object.getAmountIncludeTaxAmortized());
treeNode.putExtra("amountExcludeTaxAmortized", object.getAmountExcludeTaxAmortized());
treeNode.putExtra("taxAmount", object.getTaxAmount());
treeNode.putExtra("remarks", object.getRemarks());
treeNode.putExtra("costSubject", object.getCostSubject());
treeNode.putExtra("taxType", object.getTaxType());
treeNode.putExtra("planMeasureId", object.getPlanMeasureId());
treeNode.putExtra("monthCostRate", object.getMonthCostRate());
treeNode.putExtra("costEffective", object.getCostEffective());
treeNode.putExtra("currentProjectVolume", object.getCurrentProjectVolume());
treeNode.putExtra("submitProjectVolume", object.getSubmitProjectVolume());
treeNode.putExtra("month", object.getMonth());
treeNode.putExtra("pushTime", object.getPushTime());
treeNode.putExtra("pushDataJson", object.getPushDataJson());
treeNode.putExtra("createTime", object.getCreateTime());
}));
return trees;
}
@Override
......@@ -212,7 +244,7 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
@SneakyThrows
@Override
public List<String> importExcelSummaryData(InputStream inputStream, Long projectId,Long fileId, Integer dataType) {
public List<String> importExcelSummaryData(InputStream inputStream, Long projectId, Long fileId, Integer dataType) {
CbProjectRecord byId = cbProjectRecordService.getById(projectId);
Assert.notNull(byId, "项目信息不能为空");
......@@ -256,7 +288,7 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
if ("措施费".equals(prefix)) {
byte[] bytes = HttpUtil.downloadBytes(cbProjectFile.getFileOssUrl());
InputStream inputStream = new ByteArrayInputStream(bytes);
List<String> errlist = importExcelSummaryData(inputStream, projectId,cbProjectFile.getId(), 2);
List<String> errlist = importExcelSummaryData(inputStream, projectId, cbProjectFile.getId(), 2);
if (CollectionUtil.isNotEmpty(errlist)) {
cbProjectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
} else {
......@@ -274,7 +306,8 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
}
}
private void checkProjectExist(Long projectId){
private void checkProjectExist(Long projectId) {
CbProjectRecord byId = cbProjectRecordService.getById(projectId);
Assert.notNull(byId, "项目信息不能为空");
}
......@@ -296,7 +329,7 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
if ("措施费".equals(prefix)) {
byte[] bytes = HttpUtil.downloadBytes(cbProjectFile.getFileOssUrl());
InputStream inputStream = new ByteArrayInputStream(bytes);
List<String> errlist = importExcelSummaryData(inputStream, projectId,projectFileId, 2);
List<String> errlist = importExcelSummaryData(inputStream, projectId, projectFileId, 2);
if (CollectionUtil.isNotEmpty(errlist)) {
cbProjectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
} else {
......@@ -319,6 +352,55 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
return false;
}
@Override
public String lastProjectVolume(Long measuresId) {
LambdaQueryWrapper<CbCostMeasureActual> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(CbCostMeasureActual::getPlanMeasureId, measuresId)
.isNotNull(CbCostMeasureActual::getPushTime)
.orderByDesc(CbCostMeasureActual::getUpdateTime).last(" limit 1");
CbCostMeasureActual cbCostMeasureActual = cbCostMeasureActualService.getOne(lambdaQueryWrapper);
if (ObjectUtil.isNotEmpty(cbCostMeasureActual)) {
return cbCostMeasureActual.getPushDataJson();
}
return null;
}
@Override
public List<String> actualMonthList(CbCostMeasureActualBo cbCostMeasureBo) {
List<String> months = baseMapper.actualMonthList(cbCostMeasureBo);
return months;
}
@Override
public List<CbProjectExpenseSummaryVo> getSummaryData(Long projectId, Integer dataType, String month) {
List<CbProjectExpenseSummaryVo> dataList = new ArrayList<>();
List<CbProjectExpenseSummary> cbProjectExpenseSummaries = cbProjectExpenseSummaryService.queryCbSceneExpenseSummaryDataByType(projectId, dataType);
if (CollectionUtil.isEmpty(cbProjectExpenseSummaries)) {
return new ArrayList<>();
}
Map<String, BigDecimal> map = new HashMap<>();
//查询本月实际工程量
List<CbCostMeasureActualVo> monthActualCostList = cbCostMeasureActualService.getMonthActualCostList(projectId, month);
if (CollectionUtil.isNotEmpty(monthActualCostList)) {
map = monthActualCostList.stream()
.collect(Collectors.toMap(
CbCostMeasureActualVo::getItemContent, // 把CbCostMeasureActualVo属性提取为map的key
CbCostMeasureActualVo::getCostEffective // 把CbCostMeasureActualVo属性提取为map的value
));
}
for (CbProjectExpenseSummary cbProjectExpenseSummary : cbProjectExpenseSummaries) {
CbProjectExpenseSummaryVo summaryVo = BeanUtil.copyProperties(cbProjectExpenseSummary, CbProjectExpenseSummaryVo.class);
summaryVo.setMonthsProjectQuantity(map.get(cbProjectExpenseSummary.getExpenseName()));
dataList.add(summaryVo);
}
return dataList;
}
/**
* 根据当前序号、项目id、成本阶段查询父级信息
......
......@@ -3,11 +3,14 @@ package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbCostMeasure;
import com.dsk.cscec.domain.CbCostMeasureActual;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import com.dsk.cscec.mapper.CbCostMeasureActualMapper;
import com.dsk.cscec.mapper.CbCostMeasureMapper;
import com.dsk.cscec.service.ICbCostMeasureActualService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author tanyang
* @create 2024-02-07 9:38
......@@ -15,4 +18,8 @@ import org.springframework.stereotype.Service;
@Service
public class ICbCostMeasureActualServiceImpl extends ServiceImpl<CbCostMeasureActualMapper, CbCostMeasureActual> implements ICbCostMeasureActualService {
@Override
public List<CbCostMeasureActualVo> getMonthActualCostList(Long projectId, String month) {
return baseMapper.getMonthActualCostList(projectId,month);
}
}
......@@ -174,4 +174,14 @@
AND t.cb_stage=#{cbStage}
AND t1.`month`=#{month}
</select>
<select id="getMonthActualCostList" resultType="com.dsk.cscec.domain.vo.CbCostMeasureActualVo">
SELECT t1.item_content, t.cost_effective
FROM cb_cost_measure_actual t
inner JOIN cb_cost_measure t1 ON t1.id=t.plan_measure_id
WHERE
t1.project_id=1
AND t1.parent_id=0
AND t.`month`='202406'
</select>
</mapper>
\ No newline at end of file
......@@ -36,7 +36,7 @@
id, project_id, cb_stage, parent_id, `level`, `number`, `no`,item_content, work_content,
unit, quantity, unit_price_excluding_tax, usage_time, amount_excluding_tax, tax_rate,
amount_including_tax, amortization_ratio, amount_exclude_tax_amortized, amount_include_tax_amortized,
tax_amount, remarks, cost_subject, tax_type, create_time, update_time
tax_amount, remarks, cost_subject, tax_type,data_source, create_time, update_time
</sql>
......@@ -54,4 +54,15 @@
AND t.`no` like concat(#{id},'.%')
ORDER BY id ASC
</select>
<select id="actualMonthList" resultType="java.lang.String">
SELECT
t1.`month`
FROM cb_cost_measure t
inner JOIN cb_cost_measure_actual t1 ON t1.plan_measure_id=t.id
WHERE
t.project_id=#{projectId}
and t1.del_flag=0
GROUP BY t1.`month` ORDER BY t1.`month` desc
</select>
</mapper>
\ No newline at end of file
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