Commit 8288d067 authored by danfuman's avatar danfuman

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys...

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys into V20231129-中建一局二公司
parents 3d253a4b 91da1548
......@@ -49,7 +49,8 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
# url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://172.17.0.12:3306/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
username: dev
password: DskSzh!456
# 从库数据源
......@@ -101,9 +102,10 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
redis:
host: 111.204.34.146
# host: 111.204.34.146
host: 172.17.0.12
# 端口,默认为6379
port: 63379
port: 6379
# 数据库索引
database: 13
# 密码
......
......@@ -49,7 +49,8 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
# url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://172.17.0.12:3306/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
username: dev
password: DskSzh!456
# 从库数据源
......@@ -101,9 +102,10 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
redis:
host: 111.204.34.146
# host: 111.204.34.146
host: 172.17.0.12
# 端口,默认为6379
port: 63379
port: 6379
# 数据库索引
database: 13
# 密码
......
......@@ -79,9 +79,9 @@ public class DataAnalysisComponent {
List<CbQuantitySummary> quantitySummaryList = importList.stream().parallel()
.filter(item -> !ObjectUtils.isEmpty(item.getCbName()))
.peek(item -> {
item.setProjectId(1L);
item.setCbStage(0);
item.setCbProjectFileId(1L);
item.setProjectId(bo.getProjectId());
item.setCbStage(bo.getCbStage());
item.setCbProjectFileId(file.getId());
}).collect(Collectors.toList());
if (quantitySummaryList.isEmpty()) {
throw new ServiceException("表格中不存在有效数据数据!");
......
......@@ -40,6 +40,10 @@ public interface CbProjectConstants {
* 删除状态:未删除
*/
Integer DELETE_FLAG_EXIST = 0;
/**
* 删除状态:待删除
*/
Integer DELETE_FLAG_WAIT_DELETE = 1;
/**
* 删除状态:已删除
*/
......
......@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* 项目成本文件表(CbProjectFile)表控制层
......@@ -49,6 +50,12 @@ public class CbProjectFileController extends BaseController {
public R<Map<String, String>> uploadCbProjectFile(@Validated @ModelAttribute AddProjectFileUploadBo fileUploadBo) throws UnsupportedEncodingException {
MultipartFile file = fileUploadBo.getFile();
Assert.notNull(file, "上传文件不能为空");
//校验格式
String fileFormat = Objects.requireNonNull(fileUploadBo.getFile().getOriginalFilename()).substring(fileUploadBo.getFile().getOriginalFilename().lastIndexOf("."));
Assert.isTrue(".xlsx".equals(fileFormat) || ".xls".equals(fileFormat), "文件格式不正确");
//校验同一成本类型下是否存在相同文件
baseService.checkProjectFileExist(fileUploadBo);
SysOssVo oss = iSysOssService.upload(file);
//添加项目上传文件记录
CbProjectFile cbProjectFile;
......@@ -72,7 +79,7 @@ public class CbProjectFileController extends BaseController {
*/
@DeleteMapping("/deleteCbProjectFile/{fileId}")
public R<Void> deleteCbProjectFile(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) {
return toAjax(baseService.deleteProjectFile(fileId));
return toAjax(baseService.deleteProjectFile(new Long[]{fileId}));
}
/**
......
......@@ -6,11 +6,8 @@ import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.cscec.service.IDProjectService;
import org.springframework.validation.annotation.Validated;
......@@ -19,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
......@@ -69,10 +67,18 @@ public class CbProjectRecordController extends BaseController {
* 获取项目台账列表
*/
@GetMapping("/getProjectList")
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
public TableDataInfo<CbProjectRecordSearchVo> getProjectList(@RequestBody CbProjectSearchBo searchBo, PageQuery pageQuery) {
return baseService.getProjectList(searchBo, pageQuery);
}
/**
* 获取项目历史阶段信息(懒加载)
*/
@GetMapping("/getProjectHistoryInfo")
public R<List<CbProjectRecord>> getProjectHistoryInfo(@RequestBody CbProjectHistorySearchBo searchBo) {
return R.ok(baseService.getProjectHistoryInfo(searchBo));
}
/**
* 修改项目信息
*/
......@@ -97,16 +103,29 @@ public class CbProjectRecordController extends BaseController {
return R.ok(baseService.addNewStageProject(newProjectBo));
}
/**
* 查询当前项目可删除成本阶段
* 即查询当前项目非草稿的成本阶段
*/
@GetMapping("/getProjectCbStageNotDraft/{relatedId}")
public R<List<Integer>> getProjectCbStageNotDraft(@PathVariable Long relatedId) {
return R.ok(baseService.getProjectCbStageNotDraft(relatedId));
}
/**
* 批量删除项目
*/
@DeleteMapping("/batchDeleteProject/{projectIds}")
public R<Void> batchDeleteProject(@NotNull(message = "项目ID不能为空") @PathVariable Long[] projectIds) {
return toAjax(baseService.batchDeleteProject(Arrays.asList(projectIds)));
}
/**
* 获取草稿弹窗列表
*/
@GetMapping("/getDraftDialogList")
public R<List<CbProjectRecord>> getDraftDialogList() {
List<CbProjectRecord> draftList = baseService.getDraftDialogList();
if (draftList.isEmpty()) {
return R.ok("暂无草稿记录");
}
return R.ok(draftList);
public TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery) {
return baseService.getDraftDialogList(pageQuery);
}
/**
......
......@@ -34,7 +34,7 @@ public class CbQuantitySummaryController extends BaseController {
* @return
*/
@GetMapping(value = "/subjectTree")
public R<Map<String, Object>> subjectTree(CbProjectBaseBo bo) {
public R<List<Map<String, Object>>> subjectTree(CbProjectBaseBo bo) {
return R.ok(baseService.subjectTree(bo));
}
......
package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.cscec.service.CbSceneExpenseChildrenService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表控制层
*
* @author sxk
* @since 2024-02-22 09:58:57
*/
@RestController
@RequestMapping("cbSceneExpenseChildren")
public class CbSceneExpenseChildrenController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbSceneExpenseChildrenService baseService;
}
package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.cscec.service.CbSceneExpenseMonthService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表控制层
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@RestController
@RequestMapping("cbSceneExpenseMonth")
public class CbSceneExpenseMonthController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbSceneExpenseMonthService baseService;
}
......@@ -128,6 +128,13 @@ public class CbSummaryController extends BaseController {
}
//导入
/**
* 解析并保存数据
* @param projectId
*/
@PostMapping("/analysisData")
public void analysisData(Long projectId){
cbSummaryService.importCbProject(projectId);
}
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -34,6 +35,10 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
* 父级ID
*/
private Long parentId;
/**
* 项目文件ID
*/
private Long projectFileId;
/**
* 序号
*/
......@@ -121,6 +126,7 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
/**
* 备注
......
......@@ -48,7 +48,7 @@ public class CbProjectFile extends BaseEntity implements Serializable {
*/
private String fileOssUrl;
/**
* 项目文件状态(0:待解析、1:解析中、2:解析成功、3:解析失败)
* 项目文件状态(0:准备中、1:解析中、2:解析成功、3:解析失败)
*/
private Integer fileParseStatus;
/**
......
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)实体类
*
* @author sxk
* @since 2024-02-22 09:59:00
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbSceneExpenseChildren extends BaseEntity implements Serializable {
private static final long serialVersionUID = 895279707061984760L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 父级ID
*/
private Long parentId;
/**
* 序号
*/
private String number;
/**
* 排序
*/
private Integer sort;
/**
* 数据类型(0:工资统筹、1:现场管理费、2:其他费用)
*/
private Integer dataType;
/**
* 名称
*/
private String expenseName;
/**
* 单位
*/
private String unit;
/**
* 成本数量-工资统筹表
*/
private Integer cbCount;
/**
* 使用时间-其他费用表
*/
private Integer useTime;
/**
* 工程量-现场管理费表
*/
private String engineeringVolume;
/**
* 公司单价/不含税单价
*/
private String unitPrice;
/**
* 目标成本合价(不含税)/不含税合价
*/
private String excludeTaxSumPrice;
/**
* 目标成本合价(含税)/含税合价
*/
private String includeTaxSumPrice;
/**
* 成本科目
*/
private String cbSubject;
/**
* 税金类型
*/
private String taxType;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
/**
* 备注
*/
private String remark;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)实体类
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbSceneExpenseMonth extends BaseEntity implements Serializable {
private static final long serialVersionUID = -73353509267146384L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 现场经费ID
*/
private Long sceneExpenseId;
/**
* 本月费用
*/
private Double currentMonthExpense;
/**
* 费用日期
*/
private String expenseDate;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
}
......@@ -49,6 +49,9 @@ public class CbSubject implements Serializable {
* 类型 0: 未归类 1:房建
*/
private Integer type;
private Date createTime;
private Integer sort;
}
package com.dsk.cscec.domain.vo;
package com.dsk.cscec.domain.bo;
import lombok.Data;
import java.util.List;
/**
* @author sxk
* @date 2024.02.18
* @time 15:08
* @time 15:04
*/
@Data
public class ProjectRecordSearchVo {
public class CbProjectHistorySearchBo {
/**
* 项目ID
*/
private Long id;
private Long projectId;
/**
* 项目名称
*/
......@@ -24,11 +22,11 @@ public class ProjectRecordSearchVo {
*/
private String ipmProjectNo;
/**
* 文件名称
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private String projectFileName;
private Integer cbStage;
/**
* 项目数据
* 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/
private List<ProjectRecordDataVo> dataVoList;
private Integer projectFileStatus;
}
......@@ -10,7 +10,7 @@ import java.util.Date;
* @time 15:18
*/
@Data
public class ProjectRecordDataVo {
public class CbProjectRecordDataVo {
/**
* 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/
......
package com.dsk.cscec.domain.vo;
import com.dsk.cscec.domain.CbProjectRecord;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* @author sxk
* @date 2024.02.18
* @time 15:08
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbProjectRecordSearchVo extends CbProjectRecord {
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否有子集
*/
private Boolean hasChildren;
}
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 成本汇总(CbSummary)-成本科目汇总导入Vo
*
* @author cyf
* @since 2024-02-06
*/
@Data
@NoArgsConstructor
public class CbSummaryCostAccountImportVo implements Serializable {
private static final long serialVersionUID = -20126964599875841L;
/**
* 排序
*/
private Integer sort;
/**
* 层级
*/
private Integer level;
/**
* 项目id
*/
private Long projectId;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType = 2;
/**
* 序号
*/
@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;
}
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
......@@ -18,7 +16,26 @@ import java.util.Date;
@NoArgsConstructor
public class CbSummaryProjectImportVo implements Serializable {
private static final long serialVersionUID = -20126964599875841L;
/**
* 排序
*/
private Integer sort;
/**
* 层级
*/
private Integer level;
/**
* 项目id
*/
private Long projectId;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType = 1;
/**
* 序号
*/
......
package com.dsk.cscec.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.vo.CbSummaryCostAccountImportVo;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* 成本汇总-成本科目汇总自定义导入
*
* @author cyf
*/
@Slf4j
public class CbSummaryCostAccountImportListener extends AnalysisEventListener<CbSummaryCostAccountImportVo> implements ExcelListener<CbSummaryCostAccountImportVo> {
private final Long projectId;
private final Long fileId;
private ArrayList<CbSummaryCostAccountImportVo> resultList = new ArrayList<>();
private int sort = 0;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public CbSummaryCostAccountImportListener(Long projectId, Long fileId) {
this.projectId = projectId;
this.fileId = fileId;
}
@Override
public void invoke(CbSummaryCostAccountImportVo importVo, AnalysisContext context) {
importVo.setProjectId(projectId);
importVo.setCbProjectFileId(fileId);
importVo.setSort(++sort);
//层级处理
if (StringUtil.isNotBlank(importVo.getNumber())) {
//序号包含n个 - 为n+1级
int count = StringUtil.count(importVo.getNumber(), "-");
importVo.setLevel(count + 1);
} else {
failureNum++;
failureMsg.append("<br/>").append("第" + sort + "条数据序号为空");
return;
}
//父级数据处理
if (sort == 1) {
importVo.setLevel(0);
}
resultList.add(importVo);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbSummaryCostAccountImportVo> getExcelResult() {
return new ExcelResult<CbSummaryCostAccountImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "失败原因:共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "成本科目汇总数据已全部解析成功!共 " + getList().size() + " 条");
}
return successMsg.toString();
}
@Override
public List<CbSummaryCostAccountImportVo> getList() {
return resultList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
package com.dsk.cscec.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.vo.CbSummaryProjectImportVo;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 成本汇总-项目汇总自定义导入
*
* @author cyf
*/
@Slf4j
public class CbSummaryProjectImportListener extends AnalysisEventListener<CbSummaryProjectImportVo> implements ExcelListener<CbSummaryProjectImportVo> {
// private final CbSummaryService cbSummaryService;
private final Long projectId;
private final Long fileId;
private ArrayList<CbSummaryProjectImportVo> resultList = new ArrayList<>();
private int sort = 0;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public CbSummaryProjectImportListener(Long projectId, Long fileId) {
// this.cbSummaryService = SpringUtils.getBean(CbSummaryService.class);
this.projectId = projectId;
this.fileId = fileId;
}
@Override
public void invoke(CbSummaryProjectImportVo importVo, AnalysisContext context) {
//第一个序号不能为空? todo
//添加父级数据
if (sort == 0) {
CbSummaryProjectImportVo firstVo = new CbSummaryProjectImportVo();
firstVo.setLevel(0);
firstVo.setCbName("成本汇总");
firstVo.setProjectId(projectId);
firstVo.setCbProjectFileId(fileId);
firstVo.setSort(sort);
resultList.add(firstVo);
}
importVo.setProjectId(projectId);
importVo.setCbProjectFileId(fileId);
importVo.setSort(++sort);
//层级处理
if (StringUtil.isBlank(importVo.getNumber())) {//序号为空则为上一个序号不为空的子级
//按sort倒序取number不为空的最大level
Object[] objects = resultList.stream().sorted(Comparator.comparingInt(CbSummaryProjectImportVo::getSort).reversed())
.filter(vo -> StringUtil.isNotBlank(vo.getNumber())).limit(1).map(CbSummaryProjectImportVo::getLevel).toArray();
//数据序号错误 todo
Integer lastLevel = (Integer) objects[0];
importVo.setLevel(lastLevel + 1);
} else if (importVo.getNumber().matches("[\u4E00-\u9FA5]+")) {//判断是否为中文,如果是中文则为一级
importVo.setLevel(1);
} else if (importVo.getNumber().matches("^[0-9]*[1-9][0-9]*$")) {//判断是否为正整数
importVo.setLevel(Integer.valueOf(importVo.getNumber()));
}
// failureNum++;
// failureMsg.append("<br/>").append(failureNum);
resultList.add(importVo);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbSummaryProjectImportVo> getExcelResult() {
return new ExcelResult<CbSummaryProjectImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "失败原因:共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "项目汇总数据已全部解析成功!共 " + getList().size() + " 条");
}
return successMsg.toString();
}
@Override
public List<CbSummaryProjectImportVo> getList() {
return resultList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
......@@ -2,9 +2,13 @@ package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import org.apache.ibatis.annotations.Param;
/**
* 项目台账表(CbProjectRecord)表数据库访问层
......@@ -16,7 +20,15 @@ public interface CbProjectRecordMapper extends BaseMapper<CbProjectRecord> {
/**
* 获取项目台账列表
*/
Page<ProjectRecordSearchVo> selectPageProjectRecordList(Page<ProjectRecordSearchVo> build, QueryWrapper<CbProjectRecord> wrapper);
Page<CbProjectRecordSearchVo> selectPageProjectRecordList(IPage<CbProjectSearchBo> build,
@Param("searchBo") CbProjectSearchBo searchBo,
@Param("deleteFlagExist") Integer deleteFlagExist,
@Param("projectFileStatusPreparing") Integer projectFileStatusPreparing);
/**
* 获取草稿弹窗列表
*/
Page<CbProjectRecord> selectPageDraftDialogList(@Param("page") Page<CbProjectRecord> page, @Param(Constants.WRAPPER) QueryWrapper<CbProjectRecord> wrapper);
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表数据库访问层
*
* @author sxk
* @since 2024-02-22 09:58:57
*/
public interface CbSceneExpenseChildrenMapper extends BaseMapper<CbSceneExpenseChildren> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表数据库访问层
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
public interface CbSceneExpenseMonthMapper extends BaseMapper<CbSceneExpenseMonth> {
}
......@@ -13,6 +13,13 @@ import com.dsk.system.domain.vo.SysOssVo;
* @since 2024-02-05 14:01:06
*/
public interface CbProjectFileService extends IService<CbProjectFile> {
/**
* 校验同一成本类型下是否存在相同文件
*
* @param fileUploadBo 上传信息
*/
Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo);
/**
* 添加项目上传文件记录
*
......@@ -23,12 +30,12 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss);
/**
* 逻辑删除项目上传文件记录
* 批量逻辑删除项目上传文件记录
*
* @param fileId 文件ID
* @param fileIds 文件ID
* @return 删除结果
*/
Integer deleteProjectFile(Long fileId);
Integer deleteProjectFile(Long[] fileIds);
/**
* 获取项目文件上传详情
......@@ -37,5 +44,4 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
* @return 文件列表
*/
QueryProjectFileUploadDetailVo getProjectFileUploadDetail(Long projectId);
}
......@@ -4,11 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import java.util.List;
......@@ -41,7 +38,15 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
* @param pageQuery 分页对象
* @return 分页数据
*/
TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery);
TableDataInfo<CbProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery);
/**
* 获取项目历史阶段信息(懒加载)
*
* @param searchBo 查询条件
* @return 历史阶段信息
*/
List<CbProjectRecord> getProjectHistoryInfo(CbProjectHistorySearchBo searchBo);
/**
* 修改项目信息
......@@ -67,12 +72,29 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
*/
CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo);
/**
* 查询当前项目非草稿的成本阶段
*
* @param relatedId 关联ID
* @return 已有数据的成本阶段
*/
List<Integer> getProjectCbStageNotDraft(Long relatedId);
/**
* 批量删除项目
*
* @param projectIds 项目ID
* @return 删除结果
*/
Integer batchDeleteProject(List<Long> projectIds);
/**
* 获取草稿弹窗列表
*
* @return 草稿弹窗列表
* @param pageQuery 分页对象
* @return 分页数据
*/
List<CbProjectRecord> getDraftDialogList();
TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery);
/**
* 删除草稿
......
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表服务接口
*
* @author sxk
* @since 2024-02-22 09:59:01
*/
public interface CbSceneExpenseChildrenService extends IService<CbSceneExpenseChildren> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表服务接口
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
public interface CbSceneExpenseMonthService extends IService<CbSceneExpenseMonth> {
}
......@@ -2,6 +2,7 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
......@@ -21,8 +22,11 @@ import java.util.Map;
*/
public interface CbSummaryService extends IService<CbSummary> {
//项目汇总导入 todo
void importCbProject(Long projectId, Integer cbStage);
/**
* 项目汇总导入
* @param projectId
*/
void importCbProject(Long projectId);
/**
* 获取一级名称/成本科目列表
......
......@@ -18,7 +18,7 @@ import java.util.Map;
*/
public interface ICbQuantitySummaryService extends IService<CbQuantitySummary> {
Map<String, Object> subjectTree(CbProjectBaseBo bo);
List<Map<String, Object>> subjectTree(CbProjectBaseBo bo);
List<String> monthList(CbQuantitySummaryListBo bo);
......
......@@ -2,7 +2,9 @@ package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
......@@ -17,6 +19,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
......@@ -32,13 +35,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
private CbProjectFileMapper baseMapper;
@Resource
private CbProjectRecordMapper projectRecordMapper;
@Resource
private CbProjectFileMapper projectFileMapper;
/**
* 校验同一成本类型下是否存在相同文件
*
* @param fileUploadBo 上传信息
*/
@Override
public Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo) {
String filename = fileUploadBo.getFile().getOriginalFilename();
assert filename != null;
projectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, fileUploadBo.getProjectId())
.eq(CbProjectFile::getCbType, fileUploadBo.getCbType())).forEach(projectFile -> {
//仅对比文件名,不考虑文件格式
Assert.isFalse(projectFile.getFileName().substring(0, projectFile.getFileName().lastIndexOf(".")).equals(filename.substring(0, filename.lastIndexOf(".")))
, "当前成本类型下存在同名文件,请重新上传");
});
return true;
}
/**
* 添加项目上传文件记录
*
* @param fileUploadBo 上传信息
* @param oss oss信息
* @return
* @return 文件记录
*/
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -58,16 +82,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
}
/**
* 逻辑删除项目上传文件记录
* 批量逻辑删除项目上传文件记录
*
* @param fileId 文件ID
* @param fileIds 文件ID
* @return 删除结果
*/
@Override
public Integer deleteProjectFile(Long fileId) {
CbProjectFile projectFile = baseMapper.selectById(fileId);
Assert.notNull(projectFile, "该文件不存在");
return baseMapper.deleteById(projectFile);
@Transactional(rollbackFor = Exception.class)
public Integer deleteProjectFile(Long[] fileIds) {
int flag = 0;
//查询待删除文件
List<CbProjectFile> fileList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.in(ObjectUtil.isNotNull(fileIds), CbProjectFile::getId, Arrays.asList(fileIds)));
for (CbProjectFile file : fileList) {
//不允许删除解析中的文件
Integer fileParseStatus = file.getFileParseStatus();
Assert.isFalse(fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING),
"文件正在解析中,不允许删除");
//准备中、的文件设为已删除,否则设为待删除
//设为待删除是为了方便各个成本类型删除数据
if (fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)) {
flag = baseMapper.deleteById(file);
} else {
flag = baseMapper.update(null, new UpdateWrapper<CbProjectFile>()
.set("del_flag", CbProjectConstants.DELETE_FLAG_WAIT_DELETE)
.eq("id", file.getId()));
}
}
return flag;
}
/**
......@@ -91,7 +133,7 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
QueryProjectFileUploadDetailVo draftDetailVo = new QueryProjectFileUploadDetailVo();
draftDetailVo.setProjectId(projectId);
if (projectFileList.isEmpty()) {
return draftDetailVo;
return null;
}
//按照成本类型分类填充
......
......@@ -3,6 +3,7 @@ package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
......@@ -16,7 +17,7 @@ import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectRecordService;
......@@ -139,24 +140,68 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
* @return 分页数据
*/
@Override
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
QueryWrapper<CbProjectRecord> wrapper = Wrappers.query();
wrapper
.like(StringUtils.isNotBlank(searchBo.getProjectName()), "project_name", searchBo.getProjectName())
.like(StringUtils.isNotBlank(searchBo.getIpmProjectNo()), "ipm_project_no", searchBo.getIpmProjectNo());
public TableDataInfo<CbProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
Page<CbProjectRecordSearchVo> page = baseMapper.selectPageProjectRecordList(pageQuery.build(), searchBo, CbProjectConstants.DELETE_FLAG_EXIST, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING);
//TODO:成本阶段、文件解析状态筛选
Integer cbStage = searchBo.getCbStage();
Integer projectFileStatus = searchBo.getProjectFileStatus();
for (CbProjectRecordSearchVo searchVo : page.getRecords()) {
//判断是否有历史阶段
searchVo.setHasChildren(baseMapper.selectCount(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, searchVo.getRelatedId())) > 1);
//关键字标红
if (StringUtils.isNotBlank(searchBo.getProjectName())) {
searchVo.setProjectName(StringUtils.markInRed(searchVo.getProjectName(), searchBo.getProjectName()));
}
Page<ProjectRecordSearchVo> page = baseMapper.selectPageProjectRecordList(pageQuery.build(), wrapper);
for (ProjectRecordSearchVo searchVo : page.getRecords()) {
Long projectId = searchVo.getId();
//page.
//补充更新时间、更新人
CbProjectFile projectFile = projectFileMapper.selectOne(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, searchVo.getId())
.orderByDesc(CbProjectFile::getUpdateTime)
.last("LIMIT 1"));
searchVo.setUpdateBy(projectFile.getUpdateBy());
searchVo.setUpdateTime(projectFile.getUpdateTime());
}
return TableDataInfo.build(page);
}
/**
* 获取项目历史阶段信息(懒加载)
*
* @param searchBo 查询条件
* @return 历史阶段信息
*/
@Override
public List<CbProjectRecord> getProjectHistoryInfo(CbProjectHistorySearchBo searchBo) {
//校验项目是否存在
CbProjectRecord projectRecord = this.checkProjectExist(searchBo.getProjectId());
//查询所有历史阶段项目(不含准备中的项目)
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, projectRecord.getRelatedId())
.ne(CbProjectRecord::getId, projectRecord.getId())
.ne(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
.like(StringUtils.isNotBlank(searchBo.getProjectName()), CbProjectRecord::getProjectName, searchBo.getProjectName())
.eq(StringUtils.isNotBlank(searchBo.getIpmProjectNo()), CbProjectRecord::getIpmProjectNo, searchBo.getIpmProjectNo())
.eq(ObjectUtil.isNotNull(searchBo.getCbStage()), CbProjectRecord::getCbStage, searchBo.getCbStage())
.eq(ObjectUtil.isNotNull(searchBo.getProjectFileStatus()), CbProjectRecord::getProjectFileStatus, searchBo.getProjectFileStatus()));
projectRecordList.forEach(record -> {
//关键字标红
if (StringUtils.isNotBlank(searchBo.getProjectName())) {
record.setProjectName(StringUtils.markInRed(record.getProjectFileName(), searchBo.getProjectName()));
}
//补充更新时间、更新人
CbProjectFile projectFile = projectFileMapper.selectOne(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, record.getId())
.orderByDesc(CbProjectFile::getUpdateTime)
.last("LIMIT 1"));
record.setUpdateBy(projectFile.getUpdateBy());
record.setUpdateTime(projectFile.getUpdateTime());
});
return projectRecordList;
}
/**
* 修改项目信息
*
......@@ -233,13 +278,70 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
return null;
}
/**
* 查询当前项目非草稿的成本阶段
*
* @param relatedId 关联ID
* @return 已有数据的成本阶段
*/
@Override
public List<Integer> getProjectCbStageNotDraft(Long relatedId) {
//通过关联ID校验项目是否存在
List<CbProjectRecord> projectRecordList = this.checkRelatedIdExist(relatedId);
ArrayList<Integer> cbStageList = new ArrayList<>();
projectRecordList.forEach(projectRecord -> {
//文件状态为解析成功or解析失败即为有数据
if (!projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
&& !projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING)
&& projectFileMapper.exists(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectRecord.getId())
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS)
.or()
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL))) {
cbStageList.add(projectRecord.getCbStage());
}
});
return cbStageList;
}
/**
* 批量删除项目
*
* @param projectIds 项目ID
* @return 删除结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer batchDeleteProject(List<Long> projectIds) {
int flag = 0;
for (Long projectId : projectIds) {
//校验项目是否存在
CbProjectRecord projectRecord = this.checkProjectExist(projectId);
//不允许删除正在解析中的项目
Assert.isFalse(projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING)
, "存在解析中的项目,删除失败");
//TODO:各个成本类型数据和对应每月成本数据暂不做删除,项目台账列表查不出来自然也无法查看数据
//删除项目文件记录
flag = projectFileMapper.delete(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectId));
//删除项目记录
Assert.isTrue(flag > 0, "操作异常,请联系管理员");
flag = baseMapper.deleteById(projectId);
}
return flag;
}
/**
* 通过关联ID校验项目是否存在
*
* @return 该关联ID下的所有项目记录
*/
private List<CbProjectRecord> checkRelatedIdExist(Long relatedId) {
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>().eq(CbProjectRecord::getRelatedId, relatedId));
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, relatedId));
Assert.isFalse(projectRecordList.isEmpty(), "关联ID无效");
return projectRecordList;
}
......@@ -247,12 +349,17 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
/**
* 获取草稿弹窗列表
*
* @return 草稿弹窗列表
* @param pageQuery 分页对象
* @return 分页数据
*/
@Override
public List<CbProjectRecord> getDraftDialogList() {
return baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING));
public TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery) {
QueryWrapper<CbProjectRecord> wrapper = Wrappers.query();
wrapper
.eq("project_file_status", CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
.eq("del_flag", CbProjectConstants.DELETE_FLAG_EXIST)
.orderByDesc("update_time");
return TableDataInfo.build(baseMapper.selectPageDraftDialogList(pageQuery.build(), wrapper));
}
/**
......
......@@ -2,14 +2,17 @@ package com.dsk.cscec.service.impl;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
import com.dsk.cscec.domain.CbSubject;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbQuantitySummaryListBo;
import com.dsk.cscec.domain.vo.CbQuantitySummaryListVo;
import com.dsk.cscec.mapper.CbQuantitySummaryMapper;
import com.dsk.cscec.mapper.CbSubjectMapper;
import com.dsk.cscec.service.ICbQuantitySummaryActualService;
import com.dsk.cscec.service.ICbQuantitySummaryService;
import jodd.bean.BeanException;
......@@ -19,6 +22,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -36,10 +41,12 @@ public class CbQuantitySummaryServiceImpl extends ServiceImpl<CbQuantitySummaryM
@Autowired
private ICbQuantitySummaryActualService baseActualService;
@Resource
private CbSubjectMapper cbSubjectMapper;
@Override
public Map<String, Object> subjectTree(CbProjectBaseBo bo) {
Map<String, Object> resultMap = new HashMap<>();
public List<Map<String, Object>> subjectTree(CbProjectBaseBo bo) {
List<Map<String, Object>> resultList = new ArrayList<>();
List<Map<String, Object>> list = baseMapper.selectSubject(bo);
if (!ObjectUtils.isEmpty(list)) {
Map<String, Map<String, Map<String, List<Map<String, Object>>>>> map = list.stream()
......@@ -47,13 +54,42 @@ public class CbQuantitySummaryServiceImpl extends ServiceImpl<CbQuantitySummaryM
Collectors.groupingBy(item -> item.get("one").toString(),
Collectors.groupingBy(item -> item.get("two").toString(),
Collectors.groupingBy(item -> item.get("three").toString()))));
resultMap.put("房建类成本科目", map);
Map<String, Object> resMap = new HashMap<>();
List<Map<String, Object>> resList = new ArrayList<>();
resMap.put("name", "房建类成本科目");
resMap.put("sort", 1);
for (Map.Entry<String, Map<String, Map<String, List<Map<String, Object>>>>> entry : map.entrySet()) {
Map<String, Object> oneMap = new HashMap<>();
List<Map<String, Object>> oneList = new ArrayList<>();
oneMap.put("name", entry.getKey());
oneMap.put("sort", cbSubjectMapper.selectOne(Wrappers.<CbSubject>lambdaQuery().eq(CbSubject::getCbSubjectName,entry.getKey())).getSort());
for (Map.Entry<String, Map<String, List<Map<String, Object>>>> twoEntry : entry.getValue().entrySet()) {
Map<String, Object> twoMap = new HashMap<>();
List<Map<String, Object>> twoList = new ArrayList<>();
twoMap.put("name", twoEntry.getKey());
for (Map.Entry<String, List<Map<String, Object>>> threeEntry : twoEntry.getValue().entrySet()) {
Map<String, Object> threeMap = new HashMap<>();
threeMap.put("name", threeEntry.getKey());
twoList.add(threeMap);
}
twoMap.put("children", twoList);
oneList.add(twoMap);
}
oneMap.put("children", oneList);
resList.add(oneMap);
}
resMap.put("children", resList);
resultList.add(resMap);
}
int otherSubjectCount = baseMapper.selectOtherSubjectCount(bo);
if (otherSubjectCount > 0) {
resultMap.put("未归类项目", "other");
Map<String, Object> resMap = new HashMap<>();
resMap.put("name", "未归类项目");
resMap.put("sort", 2);
resultList.add(resMap);
}
return resultMap;
return resultList;
}
@Override
......
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
import com.dsk.cscec.mapper.CbSceneExpenseChildrenMapper;
import com.dsk.cscec.service.CbSceneExpenseChildrenService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表服务实现类
*
* @author sxk
* @since 2024-02-22 09:59:01
*/
@Service("cbSceneExpenseChildrenService")
public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpenseChildrenMapper, CbSceneExpenseChildren> implements CbSceneExpenseChildrenService {
@Resource
private CbSceneExpenseChildrenMapper baseMapper;
}
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
import com.dsk.cscec.mapper.CbSceneExpenseMonthMapper;
import com.dsk.cscec.service.CbSceneExpenseMonthService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表服务实现类
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@Service("cbSceneExpenseMonthService")
public class CbSceneExpenseMonthServiceImpl extends ServiceImpl<CbSceneExpenseMonthMapper, CbSceneExpenseMonth> implements CbSceneExpenseMonthService {
@Resource
private CbSceneExpenseMonthMapper baseMapper;
}
<?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="com.dsk.cscec.mapper.CbProjectFileMapper">
</mapper>
\ No newline at end of file
......@@ -2,11 +2,48 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.cscec.mapper.CbProjectRecordMapper">
<!--获取项目台账列表-->
<select id="selectPageProjectRecordList" resultType="com.dsk.cscec.domain.vo.ProjectRecordSearchVo">
select cpr.id,
<select id="selectPageProjectRecordList" resultType="com.dsk.cscec.domain.vo.CbProjectRecordSearchVo">
select
cpr.id,
cpr.related_id,
cpr.project_name,
cpr.cb_stage,
cpr.project_file_status,
cpr.ipm_project_no,
cpr.project_file_name
cpr.is_get_project_detail,
cpr.project_file_name,
cpr.create_time
from cb_project_record cpr
left join cb_project_record cprr
on cpr.related_id = cprr.related_id
and cpr.cb_stage &lt; cprr.cb_stage
where
cprr.cb_stage is null
and
cpr.del_flag=#{deleteFlagExist}
<if test="searchBo.projectName != null and searchBo.projectName != ''">
and cpr.project_name like concat('%',#{searchBo.projectName},'%')
</if>
<if test="searchBo.ipmProjectNo != null and searchBo.ipmProjectNo != ''">
and cpr.ipm_project_no = #{searchBo.ipmProjectNo}
</if>
<if test="searchBo.cbStage != null">
and cpr.cb_stage = #{searchBo.cbStage}
</if>
<if test="searchBo.projectFileStatus != null">
and project_file_status = #{searchBo.projectFileStatus}
</if>
and
cpr.project_file_status != #{projectFileStatusPreparing}
order by cpr.create_time desc
</select>
<!--获取草稿弹窗列表-->
<select id="selectPageDraftDialogList" resultType="com.dsk.cscec.domain.CbProjectRecord">
select cpr.id,
cpr.project_name,
cpr.cb_stage,
cpr.update_time
from cb_project_record cpr
${ew.getCustomSqlSegment};
</select>
......
......@@ -26,7 +26,14 @@
cqsa.record_date
from cb_quantity_summary cqs
join cb_quantity_summary_actual cqsa on cqs.id = cqsa.cb_quantity_summary_id
where cqs.del_falg = 0 and cqs.project_id = #{projectId} and cqs.cb_stage = #{cbStage} and cqs.cb_subject_name = #{cbSubjectName}
left join cb_subject cs1 on cqs.cb_subject_name = cs1.cb_subject_name
where cqs.del_falg = 0 and cqs.project_id = #{projectId} and cqs.cb_stage = #{cbStage}
<if test="cbSubjectName != null and cbSubjectName !=''">
<choose>
<when test="cbSubjectName == '未归类项目'"> and cs1.id is null </when>
<otherwise> and cqs.cb_subject_name = #{cbSubjectName} </otherwise>
</choose>
</if>
group by cqsa.record_date
order by cqsa.record_date
</select>
......@@ -38,11 +45,18 @@
cqs.unit, cqs.material_description, cqs.guide_price, cqs.bid_unit_price, cqs.unit_price_difference, cqs.quantity,
cqs.combined_price, cqs.combined_price_tax, cqs.brand_name, cqs.bid_source, cqs.remark, cqs.`number`, cqsa.quantities,
cqsa.quantities_unit, cqsa.conversion_quantities, cqsa.conversion_unit, cqsa.purchase_unit_price, cqsa.create_time,
cqsa.id actualId, cqsa.ipm_project_code, cqsa.ipm_contract_code, cqsa.ipm_job_code, cqsa.push_quantities
cqsa.id actualId, cqsa.ipm_project_code, cqsa.ipm_contract_code, cqsa.ipm_biz_code, cqsa.push_quantities
from cb_quantity_summary cqs
left join cb_quantity_summary_actual cqsa on cqs.id = cqsa.cb_quantity_summary_id
where cqs.del_falg = 0 and cqs.project_id = #{projectId} and cqs.cb_stage = #{cbStage} and cqs.cb_subject_name = #{cbSubjectName}
left join cb_subject cs1 on cqs.cb_subject_name = cs1.cb_subject_name
where cqs.del_falg = 0 and cqs.project_id = #{projectId} and cqs.cb_stage = #{cbStage}
<if test="recordDate != null and recordDate != ''"> and cqsa.record_date &lt;= #{recordDate} </if>
<if test="cbSubjectName != null and cbSubjectName !=''">
<choose>
<when test="cbSubjectName == '未归类项目'"> and cs1.id is null </when>
<otherwise> and cqs.cb_subject_name = #{cbSubjectName} </otherwise>
</choose>
</if>
order by cqsa.record_date desc
) a
group by a.id
......
<?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="com.dsk.cscec.mapper.CbSceneExpenseChildrenMapper">
</mapper>
<?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="com.dsk.cscec.mapper.CbSceneExpenseMonthMapper">
</mapper>
......@@ -121,7 +121,7 @@
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
......
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