Commit 5ca3ac93 authored by huangjie's avatar huangjie

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 19490c24 5853e47e
...@@ -186,6 +186,21 @@ tenant: ...@@ -186,6 +186,21 @@ 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_account_summary_actual
- cb_cost_measure
- cb_cost_measure_actual
- cb_direct_expense
- cb_project_expense_summary
- cb_project_file
- cb_project_record
- cb_project_summary
- cb_project_summary_actual
- cb_quantity_summary
- cb_quantity_summary_actual
- cb_scene_expense_children
- cb_scene_expense_month
- cb_subject
# MyBatisPlus配置 # MyBatisPlus配置
# https://baomidou.com/config/ # https://baomidou.com/config/
......
...@@ -3,6 +3,7 @@ package com.dsk.common.excel; ...@@ -3,6 +3,7 @@ package com.dsk.common.excel;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.dsk.common.annotation.Excel; import com.dsk.common.annotation.Excel;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.exception.UtilException; import com.dsk.common.exception.UtilException;
import com.dsk.common.utils.DateUtils; import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.DictUtils; import com.dsk.common.utils.DictUtils;
...@@ -13,6 +14,7 @@ import com.dsk.common.utils.file.ImageUtils; ...@@ -13,6 +14,7 @@ import com.dsk.common.utils.file.ImageUtils;
import com.dsk.common.utils.poi.ExcelHandlerAdapter; import com.dsk.common.utils.poi.ExcelHandlerAdapter;
import com.dsk.common.utils.poi.ExcelUtil; import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.common.utils.reflect.ReflectUtils; import com.dsk.common.utils.reflect.ReflectUtils;
import org.apache.commons.collections4.list.CursorableLinkedList;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.FieldUtils;
...@@ -40,6 +42,8 @@ import java.time.LocalDate; ...@@ -40,6 +42,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/** /**
* Excel相关处理 * Excel相关处理
...@@ -207,6 +211,7 @@ public class ExcelUtils<T> { ...@@ -207,6 +211,7 @@ public class ExcelUtils<T> {
sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol));
} }
} }
public void createExportMessage() { public void createExportMessage() {
if (dateStatus) { if (dateStatus) {
subMergedFirstRowNum++; subMergedFirstRowNum++;
...@@ -226,6 +231,7 @@ public class ExcelUtils<T> { ...@@ -226,6 +231,7 @@ public class ExcelUtils<T> {
rownum++; rownum++;
} }
} }
public void createExportDate() { public void createExportDate() {
if (dateStatus) { if (dateStatus) {
subMergedFirstRowNum++; subMergedFirstRowNum++;
...@@ -330,8 +336,8 @@ public class ExcelUtils<T> { ...@@ -330,8 +336,8 @@ public class ExcelUtils<T> {
exportExcel(response); exportExcel(response);
} }
public ByteArrayOutputStream exportExcel( List<T> list, String sheetName, String title, boolean dateStatus) { public ByteArrayOutputStream exportExcel(List<T> list, String sheetName, String title, boolean dateStatus) {
ByteArrayOutputStream ba= new ByteArrayOutputStream(); ByteArrayOutputStream ba = new ByteArrayOutputStream();
this.init(list, sheetName, title, Excel.Type.EXPORT, dateStatus); this.init(list, sheetName, title, Excel.Type.EXPORT, dateStatus);
try { try {
writeSheet(); writeSheet();
...@@ -356,11 +362,11 @@ public class ExcelUtils<T> { ...@@ -356,11 +362,11 @@ public class ExcelUtils<T> {
* @param dateStatus 是否添加导出时间 * @param dateStatus 是否添加导出时间
* @return * @return
*/ */
public String localInit( List<T> list, String sheetName, String title, boolean dateStatus) { public String localInit(List<T> list, String sheetName, String title, boolean dateStatus) {
String fileName = title + "-" + System.currentTimeMillis() + ".xlsx"; String fileName = title + "-" + System.currentTimeMillis() + ".xlsx";
this.init(list, sheetName, title, Excel.Type.EXPORT, dateStatus); this.init(list, sheetName, title, Excel.Type.EXPORT, dateStatus);
writeSheet(); writeSheet();
try (FileOutputStream fileOutputStream = new FileOutputStream(FILE_PATH.concat(fileName))){ try (FileOutputStream fileOutputStream = new FileOutputStream(FILE_PATH.concat(fileName))) {
wb.write(fileOutputStream); wb.write(fileOutputStream);
return fileName; return fileName;
} catch (Exception e) { } catch (Exception e) {
...@@ -1384,11 +1390,37 @@ public class ExcelUtils<T> { ...@@ -1384,11 +1390,37 @@ public class ExcelUtils<T> {
public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception { public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception {
this.type = Excel.Type.IMPORT; this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is); this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>(); List<T> resList = new ArrayList<T>();
// 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0);
dealwithSheet(resList, sheet, titleNum);
return resList;
}
/**
* 对excel表单所有表格转换成list
*
* @param titleNum 标题占用行数
* @param is 输入流
* @return 转换后集合
*/
public List<T> importExcelAllSheet(InputStream is, int titleNum) throws Exception {
this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is);
List<T> resList = new ArrayList<>();
int sheetCount = wb.getNumberOfSheets();
System.out.println("工作表个数为:" + sheetCount);
IntStream.rangeClosed(0, sheetCount - 1).parallel().forEach(sheetNum -> {
Sheet sheet = wb.getSheetAt(sheetNum);
dealwithSheet(resList, sheet, titleNum);
});
return resList;
}
private void dealwithSheet(List<T> resList, Sheet sheet, int titleNum) {
try {
if (sheet == null) { if (sheet == null) {
throw new IOException("文件sheet不存在"); throw new IOException(sheet.getSheetName() + "为空表!");
} }
boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
Map<String, PictureData> pictures; Map<String, PictureData> pictures;
...@@ -1424,6 +1456,7 @@ public class ExcelUtils<T> { ...@@ -1424,6 +1456,7 @@ public class ExcelUtils<T> {
fieldsMap.put(column, objects); fieldsMap.put(column, objects);
} }
} }
for (int i = titleNum + 1; i <= rows; i++) { for (int i = titleNum + 1; i <= rows; i++) {
// 从第2行开始取数据,默认第一行是表头. // 从第2行开始取数据,默认第一行是表头.
Row row = sheet.getRow(i); Row row = sheet.getRow(i);
...@@ -1431,12 +1464,15 @@ public class ExcelUtils<T> { ...@@ -1431,12 +1464,15 @@ public class ExcelUtils<T> {
if (isRowEmpty(row)) { if (isRowEmpty(row)) {
continue; continue;
} }
T entity = null; T entity = null;
for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) { for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) {
Object val = this.getCellValue(row, entry.getKey()); Object val = this.getCellValue(row, entry.getKey());
// 如果不存在实例则新建. // 如果不存在实例则新建.
entity = (entity == null ? clazz.newInstance() : entity); entity = (entity == null ? clazz.newInstance() : entity);
// 从map中得到对应列的field. // 从map中得到对应列的field.
Field field = (Field) entry.getValue()[0]; Field field = (Field) entry.getValue()[0];
Excel attr = (Excel) entry.getValue()[1]; Excel attr = (Excel) entry.getValue()[1];
...@@ -1475,6 +1511,7 @@ public class ExcelUtils<T> { ...@@ -1475,6 +1511,7 @@ public class ExcelUtils<T> {
} }
if (!ObjectUtils.isEmpty(fieldType)) { if (!ObjectUtils.isEmpty(fieldType)) {
String propertyName = field.getName(); String propertyName = field.getName();
if (StringUtils.isNotEmpty(attr.targetAttr())) { if (StringUtils.isNotEmpty(attr.targetAttr())) {
propertyName = field.getName() + "." + attr.targetAttr(); propertyName = field.getName() + "." + attr.targetAttr();
} else if (StringUtils.isNotEmpty(attr.readConverterExp())) { } else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
...@@ -1487,10 +1524,14 @@ public class ExcelUtils<T> { ...@@ -1487,10 +1524,14 @@ public class ExcelUtils<T> {
ReflectUtils.invokeSetter(entity, propertyName, val); ReflectUtils.invokeSetter(entity, propertyName, val);
} }
} }
list.add(entity); synchronized (resList){
resList.add(entity);
}
} }
} }
return list; } catch (Exception e) {
e.printStackTrace();
}
} }
} }
package com.dsk.component;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.excel.ExcelUtils;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.cscec.service.ICbQuantitySummaryActualService;
import com.dsk.cscec.service.ICbQuantitySummaryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.io.FileInputStream;
import java.util.List;
import java.util.stream.Collectors;
/**
* 数据解析组件
*
* @Author lcl
* @Data 2024/2/7 17:43
*/
@Component
public class DataAnalysisComponent {
@Autowired
private ICbQuantitySummaryService quantitySummaryService;
/**
* 工料汇总数据解析
*/
@Async
public void quantitySummaryDataAnalysis(CbProjectBaseBo bo) throws Exception {
//查询工料汇总导入文件
List<CbProjectFile> fileList = projectFileService.list(Wrappers.<CbProjectFile>lambdaQuery()
.eq(CbProjectFile::getProjectId, bo.getProjectId())
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY)
.eq(CbProjectFile::getCbStage, bo.getCbStage()));
if (ObjectUtils.isEmpty(fileList)) return;
//文件处理
for (CbProjectFile file : fileList) {
if (file.getDelFlag() == 0) {
if (file.getFileParseStatus() == 3) break;
//文件下载
//解析数据
List<CbQuantitySummary> importList = new ExcelUtils<>(CbQuantitySummary.class).importExcelAllSheet(new FileInputStream(""), 1);
if (importList.isEmpty()) {
throw new ServiceException("表格中不存在待导入数据!");
}
importList = importList.stream().parallel()
.filter(item -> !ObjectUtils.isEmpty(item.getCbName()))
.peek(item -> {
item.setProjectId(1L);
item.setCbStage(0);
item.setCbProjectFileId(1L);
}).collect(Collectors.toList());
if (importList.isEmpty()) {
throw new ServiceException("表格中不存在有效数据数据!");
}
//分批次插入
if (importList.size() > 1000) {
int index = 0;
int sum = importList.size();
while (index < sum) {
List<CbQuantitySummary> divideList = importList.subList(index, Math.max((index + 1) * 1000, sum));
boolean b = quantitySummaryService.saveBatch(divideList);
if (!b) {
throw new ServiceException("数据插入失败!");
}
index += 1000;
}
} else {
boolean b = quantitySummaryService.saveBatch(importList);
if (!b) {
throw new ServiceException("数据插入失败!");
}
}
} else {
quantitySummaryService.remove(Wrappers.<CbQuantitySummary>lambdaQuery().eq(CbQuantitySummary::getCbProjectFileId, file.getId()));
}
}
}
@Autowired
private CbProjectFileService projectFileService;
}
package com.dsk.cscec.constant;
/**
* 二期项目常量信息
*
* @author sxk
* @date 2024.02.05
* @time 15:29
*/
public interface CbProjectConstants {
/**
* 成本阶段:标前
*/
Integer CB_STAGE_BEFORE_BID = 0;
/**
* 成本阶段:标后
*/
Integer CB_STAGE_AFTER_BID = 1;
/**
* 成本阶段:转固
*/
Integer CB_STAGE_TO_SOLID = 2;
/**
* 项目文件状态:待解析
*/
Integer PROJECT_FILE_STATUS_WAIT_PARSE = 0;
/**
* 项目文件状态:解析中
*/
Integer PROJECT_FILE_STATUS_PARSING = 1;
/**
* 项目文件状态:解析成功
*/
Integer PROJECT_FILE_STATUS_PARSE_SUCCESS = 2;
/**
* 项目文件状态:解析失败
*/
Integer PROJECT_FILE_STATUS_PARSE_FAIL = 3;
/**
* 删除状态:未删除
*/
Integer DELETE_FLAG_EXIST = 0;
/**
* 删除状态:已删除
*/
Integer DELETE_FLAG_NOT_EXIST = 2;
/**
* 是否获取项目详情:是
*/
Integer IS_GET_PROJECT_DETAIL = 0;
/**
* 是否获取项目详情:否
*/
Integer NOT_GET_PROJECT_DETAIL = 1;
//成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
/**
* 成本类型:直接费成本
*/
Integer CB_TYPE_DIRECT_EXPENSE = 0;
/**
* 成本类型:工料汇总
*/
Integer CB_TYPE_QUANTITY_SUMMARY = 1;
/**
* 成本类型:措施项目
*/
Integer CB_TYPE_MEASURE_PROJECT = 2;
/**
* 成本类型:其他项目
*/
Integer CB_TYPE_OTHER_PROJECT = 3;
/**
* 成本类型:现场经费
*/
Integer CB_TYPE_SCENE_EXPENSE = 4;
/**
* 成本类型:成本汇总
*/
Integer CB_TYPE_ACCOUNT_SUMMARY = 5;
}
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.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.dsk.common.annotation.Log;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.entity.SysDictData;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.cscec.domain.CbCostMeasure;
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.CbCostMeasuresImportVo;
import com.dsk.cscec.domain.vo.CbCostMeasuresItemVo;
import com.dsk.cscec.listener.ProjectCostMeasureImportListener;
import com.dsk.cscec.service.ICbCostMeasureService;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.listener.SysUserImportListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 措施费导入
*
* @author tanyang
* @create 2024-02-04 11:44
**/
@RequestMapping("/cb/cost/measures")
@RestController
public class CbCostMeasureController {
@Autowired
private ICbCostMeasureService cbCostMeasureService;
/**
* 措施费一级大类
* 根据项目查询措施费一级大类
*
* @param projectId 项目ID
* @return {@link R}<{@link List}<{@link Map}<{@link String}, {@link Object}>>>
*/
@SaIgnore
@GetMapping(value = "/type/{projectId}")
public R<List<Map<String, Object>>> dictType(@PathVariable Long projectId) {
List<Map<String, Object>> data = cbCostMeasureService.listByLevel(projectId,0);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
/**
* 措施费列表
* 查询措施费列表
*
* @param cbCostMeasure CB成本衡量标准
* @return {@link R}<{@link List}<{@link CbCostMeasureActualVo}>>
*/
// @SaCheckPermission("cb:costmeasures:list")
@SaIgnore
@GetMapping("/list")
public R<List<CbCostMeasureActualVo>> list(CbCostMeasureActualBo cbCostMeasure) {
List<CbCostMeasureActualVo> data= cbCostMeasureService.selectDataList(cbCostMeasure);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
/**
* 批量保存或修改每月措施费
*/
// @SaCheckPermission("cb:costmeasures:actual:saveBatch")
@SaIgnore
@PostMapping("/saveBatch")
public R saveBatch(@RequestBody List<CbCostMeasureActualSaveBo> boList) {
Assert.notEmpty(boList,"措施费填写信息不能为空!");
cbCostMeasureService.saveBatchCostMeasureActual(boList);
return R.ok();
}
/**
* 推送工程量
* 措施费-推送每月工程量
*
* @param pushBo 推送BO
* @return {@link R}<{@link List}<{@link CbCostMeasureActualVo}>>
*/
// @SaCheckPermission("cb:costmeasures:actual:push")
@SaIgnore
@PostMapping("/push/project/volume")
public R pushProjectVolume(@RequestBody CbCostMeasureActualPushBo pushBo) {
Assert.notNull(pushBo,"推送工程量信息不能为空!");
cbCostMeasureService.pushCostMeasureActual(pushBo);
return R.ok();
}
/**
* 获取批量措施费列表
*/
@Log(title = "措施费导出", businessType = BusinessType.EXPORT)
// @SaCheckPermission("system:user:export")
@PostMapping("/export")
public void exportProjectMeasures(HttpServletResponse response) {
String BATCH_IMPORT_FAIL_USERS = GlobalConstants.GLOBAL_REDIS_KEY + "batch_import_fail_users";
String key = BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
ExcelUtil.exportExcel(RedisUtils.getCacheList(key), "措施费", CbCostMeasuresImportVo.class, response);
RedisUtils.deleteObject(key);
}
/**
* 导入数据
*
* @param file 导入文件
* @param projectId 项目id
*/
// @SaIgnore
@Log(title = "措施费导入", businessType = BusinessType.IMPORT)
// @SaCheckPermission("system:user:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, Long projectId) throws Exception {
cbCostMeasureService.importExcelData(file,projectId);
return R.ok();
}
/**
* 导入数据
*
* @param file 导入文件
* @param projectId 项目id
*/
@SaIgnore
@Log(title = "措施费汇总导入", businessType = BusinessType.IMPORT)
// @SaCheckPermission("system:user:import")
@PostMapping(value = "/summary/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importSummaryData(@RequestPart("file") MultipartFile file, Long projectId) throws Exception {
Integer dataType=2;
cbCostMeasureService.importExcelSummaryData(file,projectId,dataType);
return R.ok();
}
public static void main(String[] args) throws FileNotFoundException {
List list =new ArrayList<>();
File file=new File("E:\\dingding\\202401\\导入表格\\措施费\\大型机械费.xlsx");
FileInputStream inputStream=new FileInputStream(file);
ExcelResult<CbCostMeasuresImportVo> result = ExcelUtil.importExcel(inputStream, CbCostMeasuresImportVo.class, new ProjectCostMeasureImportListener(1L,1));
String analysis = result.getAnalysis();
List<CbCostMeasuresImportVo> list1 = result.getList();
System.out.println(">>>>>>>>>>"+analysis);
// System.out.println(JSONUtil.toJsonStr(list));
}
}
package com.dsk.cscec.controller;
import com.dsk.cscec.service.CbDirectExpenseService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 直接费成本表(CbDirectExpense)表控制层
*
* @author sxk
* @since 2024-02-05 14:43:31
*/
@RestController
@RequestMapping("cbDirectExpense")
public class CbDirectExpenseController {
/**
* 服务对象
*/
@Resource
private CbDirectExpenseService baseService;
}
package com.dsk.cscec.controller;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.annotation.Log;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.ProjectFileUploadBo;
import com.dsk.cscec.domain.bo.QueryCbProjectFileDetailBo;
import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.system.domain.vo.SysOssVo;
import com.dsk.system.service.ISysOssService;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 项目成本文件表(CbProjectFile)表控制层
*
* @author sxk
* @since 2024-02-05 14:01:03
*/
@RestController
@RequestMapping("cbProjectFile")
public class CbProjectFileController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbProjectFileService baseService;
@Resource
private ISysOssService iSysOssService;
/**
* 上传项目台账文件
*/
@Log(title = "项目台账上传OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/uploadCbProjectFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Map<String, String>> uploadCbProjectFile(@Validated @ModelAttribute ProjectFileUploadBo fileUploadBo) throws UnsupportedEncodingException {
MultipartFile file = fileUploadBo.getFile();
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
SysOssVo oss = iSysOssService.upload(file);
//添加项目上传文件记录
try {
baseService.addProjectFile(fileUploadBo, oss);
} catch (ServiceException e) {
//删除oss中的文件
iSysOssService.deleteWithValidByIds(Collections.singletonList(oss.getOssId()), true);
throw e;
}
Map<String, String> map = new HashMap<>(2);
map.put("fileName", oss.getOriginalName());
map.put("fileOssId", oss.getOssId().toString());
map.put("fileOssUrl", oss.getUrl());
return R.ok(map);
}
/**
* 删除项目台账文件
*/
@DeleteMapping("/deleteCbProjectFile/{fileId}")
public R<Void> deleteCbProjectFile(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) {
return toAjax(baseService.deleteProjectFile(fileId));
}
///**
// * 根据项目ID获取项目文件详情
// */
//@GetMapping("/getProjectFileDetail")
//public R<List<CbProjectFile>> getProjectFileDetail(@Validated @RequestBody QueryCbProjectFileDetailBo queryBo) {
// return R.ok(baseService.getProjectFileDetail(queryBo));
//}
}
\ No newline at end of file
package com.dsk.cscec.controller;
import cn.hutool.core.lang.Assert;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.cscec.service.IDProjectService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
/**
* 项目台账表(CbProjectRecord)表控制层
*
* @author sxk
* @since 2024-02-05 11:37:49
*/
@RestController
@RequestMapping("cbProjectRecord")
public class CbProjectRecordController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbProjectRecordService baseService;
@Resource
private IDProjectService dProjectService;
/**
* 校验项目编码是否存在
*/
@GetMapping("/checkProjectCodeExist/{projectCode}")
public R<Boolean> checkProjectCodeExist(@NotBlank(message = "项目编码不能为空") @PathVariable String projectCode) {
return R.ok(dProjectService.checkProjectCodeExist(projectCode));
}
/**
* 新增项目
*/
@PostMapping("/addProject")
public R<CbProjectRecord> addProject(@Validated @RequestBody AddCbProjectBo addCbProjectBo) {
CbProjectRecord projectRecord = baseService.addProject(addCbProjectBo);
Assert.notNull(projectRecord, "新增项目失败,请联系管理员");
return R.ok(projectRecord);
}
///**
// * 根据项目文件导入数据
// */
//@PostMapping("/importData")
//public R<Void> importData(@Validated @RequestBody ImportCbProjectDataBo importDataBo){
// return toAjax(baseService.importData(importDataBo));
//}
}
package com.dsk.cscec.controller;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
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.service.ICbQuantitySummaryService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表控制层
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/cb/quantity/summary")
public class CbQuantitySummaryController extends BaseController {
private final ICbQuantitySummaryService baseService;
/**
* 工料汇总科目树
*
* @return
*/
@GetMapping(value = "/subjectTree")
public R<Map<String, Object>> subjectTree(CbProjectBaseBo bo) {
return R.ok(baseService.subjectTree(bo));
}
/**
* 已记录月份集合
*/
@GetMapping(value = "/monthList")
public R<List<String>> monthList(CbQuantitySummaryListBo bo) {
return R.ok(baseService.monthList(bo));
}
/**
* 科目月份列表
*/
@GetMapping(value = "/subjectList")
public R<List<CbQuantitySummaryListVo>> subjectList(CbQuantitySummaryListBo bo) {
return R.ok(baseService.subjectList(bo));
}
/**
* 更新月成本信息
*/
@PutMapping(value = "/updateActual")
@RepeatSubmit
public R<Void> updateActual(@RequestBody List<CbQuantitySummaryActual> list) {
baseService.updateActual(list);
return R.ok();
}
/**
* 数据推送
*/
@PutMapping(value = "/pushData")
@RepeatSubmit
public R<Void> pushData(@RequestBody CbQuantitySummaryActual bo) {
baseService.pushData(bo);
return R.ok();
}
}
package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.cscec.service.CbSummaryService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 成本汇总(CbSummary)表控制层
*
* @author cyf
* @since 2024-02-06
*/
@RestController
@RequestMapping("/cbSummary")
public class CbSummaryController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbSummaryService cbSummaryService;
}
package com.dsk.cscec.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 项目每月实际措施费
*/
@Data
@TableName(value="cb_cost_measure")
public class CbCostMeasure {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 父项id
*/
private Long parentId;
/**
* 层级数
*/
private Integer level;
private String number;
private String no;
/**
* 清单内容
*/
private String itemContent;
/**
* 工作内容、做法/规格型号/施工现场配置说明
*/
private String workContent;
/**
* 单位
*/
private String unit;
/**
* 工程量
*/
private BigDecimal quantity;
/**
* 不含税单价
*/
private String unitPriceExcludingTax;
/**
* 使用时间
*/
private String usageTime;
/**
* 不含税合价
*/
private String amountExcludingTax;
/**
* 税率(%)
*/
private String taxRate;
/**
* 含税合价
*/
private String amountIncludingTax;
/**
* 摊销比例(%)
*/
private String amortizationRatio;
/**
* 摊销后不含税合价
*/
private String amountExcludeTaxAmortized;
/**
* 摊销后含税合价
*/
private String amountIncludeTaxAmortized;
/**
* 税金(元)
*/
private String taxAmount;
/**
* 备注
*/
private String remarks;
/**
* 成本科目
*/
private String costSubject;
/**
* 税金类型
*/
private String taxType;
/**
* 数据来源(0:导入,1:手动添加)
*/
private Integer dataSource;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
\ No newline at end of file
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
@Data
@TableName(value = "cb_cost_measure_actual")
public class CbCostMeasureActual {
/**
* 主键
*/
@TableId(value = "id", type = IdType.INPUT)
private Long id;
/**
* 计划成本措施费id
*/
@TableField(value = "plan_measure_id")
private Long planMeasureId;
/**
* 本月发生成本比例
*/
@TableField(value = "month_cost_rate")
private BigDecimal monthCostRate;
/**
* 成本合价
*/
@TableField(value = "cost_effective")
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;
/**
* 是否删除
*/
@TableField(value = "del_flag")
private Integer delFlag;
/**
* 修改人
*/
@TableField(value = "update_user")
private String updateUser;
/**
* 修改人id
*/
@TableField(value = "update_id")
private Long updateId;
/**
* 创建时间
*/
@TableField(value = "create_time")
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time")
private Date updateTime;
public static final String COL_ID = "id";
public static final String COL_PLAN_MEASURE_ID = "plan_measure_id";
public static final String COL_MONTH_COST_RATE = "month_cost_rate";
public static final String COL_COST_EFFECTIVE = "cost_effective";
public static final String COL_CURRENT_PROJECT_VOLUME = "current_project_volume";
public static final String COL_SUBMIT_PROJECT_VOLUME = "submit_project_volume";
public static final String COL_MONTH = "month";
public static final String COL_PUSH_TIME = "push_time";
public static final String COL_PUSH_DATA_JSON = "push_data_json";
public static final String COL_DEL_FLAG = "del_flag";
public static final String COL_UPDATE_USER = "update_user";
public static final String COL_UPDATE_ID = "update_id";
public static final String COL_CREATE_TIME = "create_time";
public static final String COL_UPDATE_TIME = "update_time";
}
\ No newline at end of file
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 直接费成本表(CbDirectExpense)实体类
*
* @author sxk
* @since 2024-02-05 14:43:33
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbDirectExpense extends BaseEntity implements Serializable {
private static final long serialVersionUID = -47221883482254959L;
/**
* 主键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;
/**
* 编码
*/
private String code;
/**
* 名称
*/
private String expenseName;
/**
* 清单/费用项分类标识
*/
private String expenseCategoryTag;
/**
* 项目特征
*/
private String projectFeature;
/**
* 单位
*/
private String unit;
/**
* 工程量表达式
*/
private String engineeringVolumeExpression;
/**
* 工程量
*/
private String engineeringVolume;
/**
* 成本科目
*/
private String cbSubject;
/**
* 招标控制价单价
*/
private String tenderControlUnitPrice;
/**
* 招标控制价合价
*/
private String tenderControlSumPrice;
/**
* 不含税成本单价
*/
private String excludeTaxCbUnitPrice;
/**
* 不含税成本合价
*/
private String excludeTaxCbSumPrice;
/**
* 成本税金合计
*/
private String cbTaxSum;
/**
* 含税成本单价
*/
private String includeTaxCbUnitPrice;
/**
* 含税成本合价
*/
private String includeTaxCbSumPrice;
/**
* 合价偏差
*/
private String sumPriceDeviation;
/**
* 盈亏率
*/
private String profitLossRatio;
/**
* 标准成本费用
*/
private String standardCbItem;
/**
* 数据源(0:导入、1:手动新增)
*/
private Integer dataOrigin;
/**
* 删除状态(0:否、2:是)
*/
private Integer delFlag;
/**
* 备注
*/
private String failRemark;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import lombok.Data;
/**
* 项目费用汇总表
*/
@Data
@TableName(value = "cb_project_expense_summary")
public class CbProjectExpenseSummary {
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
@TableField(value = "project_id")
private Long projectId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
@TableField(value = "cb_stage")
private Integer cbStage;
/**
* 序号
*/
@TableField(value = "`number`")
private String number;
/**
* 数据类型(0:现场经费、1:其他费用)
*/
@TableField(value = "data_type")
private Integer dataType;
/**
* 名称
*/
@TableField(value = "expense_name")
private String expenseName;
/**
* 数值
*/
@TableField(value = "expense_value")
private String expenseValue;
/**
* 占比
*/
@TableField(value = "proportion")
private String proportion;
/**
* 删除状态(0:否、2:是)
*/
@TableField(value = "del_flag")
private Integer delFlag;
/**
* 创建者
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time")
private Date createTime;
public static final String COL_ID = "id";
public static final String COL_PROJECT_ID = "project_id";
public static final String COL_CB_STAGE = "cb_stage";
public static final String COL_NUMBER = "number";
public static final String COL_DATA_TYPE = "data_type";
public static final String COL_EXPENSE_NAME = "expense_name";
public static final String COL_EXPENSE_VALUE = "expense_value";
public static final String COL_PROPORTION = "proportion";
public static final String COL_DEL_FLAG = "del_flag";
public static final String COL_CREATE_BY = "create_by";
public static final String COL_CREATE_TIME = "create_time";
}
\ No newline at end of file
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 项目成本文件表(CbProjectFile)实体类
*
* @author sxk
* @since 2024-02-05 14:01:05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbProjectFile extends BaseEntity implements Serializable {
private static final long serialVersionUID = 290150095443621411L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
*/
private Integer cbType;
/**
* 文件名称
*/
private String fileName;
/**
* OSS文件ID
*/
private String fileOssId;
/**
* OSS文件路径
*/
private String fileOssUrl;
/**
* 项目文件状态(0:待解析、1:解析中、2:解析成功、3:解析失败)
*/
private Integer fileParseStatus;
/**
* 失败备注
*/
private String failRemark;
/**
* 删除状态(0:否、2:是)
*/
private Integer delFlag;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 项目台账表(CbProjectRecord)实体类
*
* @author sxk
* @since 2024-02-05 11:37:52
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbProjectRecord extends BaseEntity implements Serializable {
private static final long serialVersionUID = 380419400445207916L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目名称
*/
private String projectName;
/**
* 项目文件状态(0:待解析、1:解析中、2:解析成功、3:解析失败)
*/
private Integer projectFileStatus;
/**
* IPM项目编码
*/
private String ipmProjectNo;
/**
* 是否获取项目详情(0:是、1:否)
*/
private Integer isGetProjectDetail;
/**
* 文件名称
*/
private String projectFileName;
/**
* 删除状态(0:否、2:是)
*/
private Integer delFlag;
}
package com.dsk.cscec.domain;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import com.dsk.common.annotation.Excel;
import lombok.Data;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表实体类
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
@Data
@TableName("cb_quantity_summary")
public class CbQuantitySummary implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id")
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 序号
*/
@Excel(name = "序号")
private Integer number;
/**
* 成本阶段(0:标前成本 1:标后成本 2:转固成本)
*/
private Integer cbStage;
/**
* 成本科目名称(合约规划)
*/
@Excel(name = "成本科目")
private String cbSubjectName;
/**
* 成本科目编号(合约规划编号)
*/
private String cbSubjectNo;
/**
* 公司编码
*/
@Excel(name = "编码")
private String companyNo;
/**
* 集团编码
*/
@Excel(name = "集团编码")
private String orgNo;
/**
* 成本名称
*/
@Excel(name = "名称")
private String cbName;
/**
* 工作内容
*/
@Excel(name = "工作内容")
private String jobContent;
/**
* 计算规则
*/
@Excel(name = "计算规则")
private String calculationRule;
/**
* 计量单位
*/
@Excel(name = "单位")
private String unit;
/**
* 材料说明
*/
@Excel(name = "甲供材料说明")
private String materialDescription;
/**
* 指导价格
*/
@Excel(name = "指导价格")
private String guidePrice;
/**
* 投标选用单价(不含税)
*/
@Excel(name = "投标选用单价(不含税)")
private Double bidUnitPrice;
/**
* 单价差额
*/
@Excel(name = "单价差额")
private Double unitPriceDifference;
/**
* 数量
*/
@Excel(name = "数量")
private Double quantity;
/**
* 合价(不含税)
*/
@Excel(name = "合价(不含税)")
private Double combinedPrice;
/**
* 合价(含税)
*/
@Excel(name = "合价(含税)")
private Double combinedPriceTax;
/**
* 品牌名称
*/
@Excel(name = "品牌名称")
private String brandName;
/**
* 投标选用来源
*/
@Excel(name = "投标选用来源")
private String bidSource;
/**
* 备注
*/
@Excel(name = "备注")
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFalg;
}
package com.dsk.cscec.domain;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
* 成本-工料汇总月记录(CbQuantitySummaryActual)表实体类
*
* @author lcl
* @since 2024-02-05 11:12:47
*/
@Data
@TableName("cb_quantity_summary_actual")
public class CbQuantitySummaryActual implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.INPUT)
private String id;
/**
* 成本汇总基本数据id
*/
private Long cbQuantitySummaryId;
/**
* 工程量(本月用料)
*/
private Double quantities;
/**
* 本月用料单位
*/
private String quantitiesUnit;
/**
* 换算后本月用料
*/
private Double conversionQuantities;
/**
* 换算单位
*/
private String conversionUnit;
/**
* 采购单价
*/
private Double purchaseUnitPrice;
/**
* 创建时间
*/
private Date createTime;
/**
* 推送时间
*/
private Date pushTime;
/**
* 记录所属年月
*/
private String recordDate;
/**
* 推送工程量
*/
private Double pushQuantities;
/**
* IPM项目编码
*/
private String ipmProjectCode;
/**
* IPM合同编码
*/
private String ipmContractCode;
/**
* IPM作业编码
*/
private String ipmBizCode;
}
package com.dsk.cscec.domain;
import java.util.Date;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 成本科目(CostSubject)表实体类
*
* @author lcl
* @since 2024-02-05 09:29:46
*/
@Data
@TableName("cb_subject")
public class CbSubject implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id")
private Long id;
/**
* 层级
*/
private Integer level;
/**
* 成本科目名称(合约规划)
*/
private String cbSubjectName;
/**
* 成本科目编号(合约规划编号)
*/
private String cbSubjectNo;
/**
* 分判模式
*/
private String subjudgmentMode;
/**
* 税金类型
*/
private String taxType;
/**
* 状态 0:有效 1:无效
*/
private Integer status;
/**
* 类型 0: 未归类 1:房建
*/
private Integer type;
private Date createTime;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 成本汇总(CbSummary)实体类
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummary implements Serializable {
private static final long serialVersionUID = -20126964599875841L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 父级id
*/
private Long parentId;
/**
* 层级
*/
private Integer level;
/**
* 排序
*/
private Integer sort;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
/**
* 序号
*/
private String number;
/**
* 名称/成本科目
*/
private String cbName;
/**
* 不含税成本合价
*/
private String taxExclusiveTotal;
/**
* 成本税金合价
*/
private String cbTaxesTotal;
/**
* 含税成本合价
*/
private String taxInclusiveTotal;
/**
* 成本占比
*/
private String cbProportion;
/**
* 含税成本平米指标
*/
private String taxInclusivePmTarget;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除状态(0:否、2:是)
*/
private Integer delFlag;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 成本汇总-每月费用(CbSummaryActual)实体类
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryActual implements Serializable {
private static final long serialVersionUID = -85978330087467049L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 成本汇总id
*/
private Long cbSummaryId;
/**
* 本月费用(含税)
*/
private Double taxInclusiveExpense;
/**
* 本月费用(不含税)
*/
private Double taxExclusiveExpense;
/**
* 费用日期
*/
private String expenseDate;
/**
* 是否锁定(0否,1是)
*/
private Integer lockStatus;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除状态(0:否、2:是)
*/
private Integer delFlag;
}
package com.dsk.cscec.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.02.05
* @time 15:26
*/
@Data
public class AddCbProjectBo {
/**
* 项目名称
*/
private String projectName;
/**
* IPM项目编码
*/
private String ipmProjectNo;
/**
* 是否获取项目详情(0:否、1:是)
*/
@NotNull(message = "是否获取项目详情不能为空")
private Integer isGetProjectDetail;
/**
* 文件名称
*/
private String projectFileName;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
@NotNull(message = "未选择成本阶段")
private Integer cbStage;
}
package com.dsk.cscec.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class CbCostMeasureActualBo {
/**
* 措施费用项id
*/
private Long id;
/**
* 年月
*/
private String month;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
}
\ No newline at end of file
package com.dsk.cscec.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class CbCostMeasureActualPushBo {
/**
* 主键
*/
private Long id;
/**
* 截止本月工程量
*/
@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;
/**
* IPM项目编码
*/
private String ipmProjectCode;
/**
* IPM合同编码
*/
private String ipmContractCode;
/**
* IPM作业编码
*/
private String ipmBizCode;
}
\ No newline at end of file
package com.dsk.cscec.domain.bo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class CbCostMeasureActualSaveBo {
/**
* 主键
*/
private Long id;
/**
* 计划成本措施费id
*/
@TableField(value = "plan_measure_id")
private Long planMeasureId;
/**
* 本月发生成本比例
*/
@TableField(value = "month_cost_rate")
private BigDecimal monthCostRate;
/**
* 成本合价
*/
@TableField(value = "cost_effective")
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;
/**
* 修改人
*/
@TableField(value = "update_user")
private String updateUser;
/**
* 修改人id
*/
@TableField(value = "update_id")
private String updateId;
}
\ No newline at end of file
package com.dsk.cscec.domain.bo;
import lombok.Data;
/**
* 项目成本基础参数
*
* @Author lcl
* @Data 2024/2/6 9:24
*/
@Data
public class CbProjectBaseBo {
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段(0:标前成本 1:标后成本 2:转固成本)
*/
private Integer cbStage;
}
package com.dsk.cscec.domain.bo;
import lombok.Data;
/**
* @Author lcl
* @Data 2024/2/6 13:37
*/
@Data
public class CbQuantitySummaryListBo extends CbProjectBaseBo {
/**
* 成本科目
*/
private String cbSubjectName;
/**
* 记录月份
*/
private String recordDate;
}
package com.dsk.cscec.domain.bo;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.02.06
* @time 16:07
*/
@Data
public class ProjectFileUploadBo {
private MultipartFile file;
@NotNull(message = "项目ID不能为空")
private Long projectId;
@NotNull(message = "成本阶段不能为空")
private Integer cbStage;
@NotNull(message = "成本类型不能为空")
private Integer cbType;
}
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class CbCostMeasureActualVo {
/**
* 主键id
*/
private Long id;
/**
* 序号
*/
private String number;
/**
* 清单内容
*/
private String itemContent; // 清单内容
/**
* 工作内容
*/
private String workContent; // 工作内容、做法/规格型号/施工现场配置说明
/**
* 单位
*/
private String unit; // 单位
/**
* 工程量
*/
private BigDecimal quantity; // 工程量
/**
* 不含税单价
*/
private String unitPriceExcludingTax; // 不含税单价
/**
* 使用时间
*/
private String usageTime; // 使用时间
/**
* 不含税合价
*/
private String amountExcludingTax; //
/**
* 税率(%)
*/
private String taxRate; // 税率(%)
/**
* 含税合价
*/
private String amountIncludingTax; //
/**
* 摊销比例(%)
*/
private String amortizationRatio; //
/**
* 摊销后不含税合价
*/
private String amountExcludeTaxAmortized; //
/**
* 摊销后含税合价
*/
private String amountIncludeTaxAmortized; //
/**
* 税金(元)
*/
private String taxAmount; //
/**
* 备注
*/
private String remarks; //
/**
* 成本科目
*/
private String costSubject; // 成本科目
/**
* 税金类型
*/
private String taxType; //
/**
* 计划成本措施费id
*/
private Long planMeasureId;
/**
* 本月发生成本比例
*/
private BigDecimal monthCostRate;
/**
* 成本合价
*/
private BigDecimal costEffective;
/**
* 截止本月工程量
*/
private BigDecimal currentProjectVolume;
/**
* 推送工程量
*/
private BigDecimal submitProjectVolume;
/**
* 年月
*/
private String month;
/**
* 推送时间
*/
private Date pushTime;
/**
* 修改人
*/
@TableField(value = "update_user")
private String updateUser;
/**
* 修改人id
*/
@TableField(value = "update_id")
private String updateId;
/**
* 创建时间
*/
@TableField(value = "create_time")
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time")
private Date updateTime;
public static final String COL_ID = "id";
public static final String COL_PLAN_MEASURE_ID = "plan_measure_id";
public static final String COL_MONTH_COST_RATE = "month_cost_rate";
public static final String COL_COST_EFFECTIVE = "cost_effective";
public static final String COL_CURRENT_PROJECT_VOLUME = "current_project_volume";
public static final String COL_SUBMIT_PROJECT_VOLUME = "submit_project_volume";
public static final String COL_MONTH = "month";
public static final String COL_PUSH_TIME = "push_time";
public static final String COL_PUSH_DATA_JSON = "push_data_json";
public static final String COL_DEL_FLAG = "del_flag";
public static final String COL_UPDATE_USER = "update_user";
public static final String COL_UPDATE_ID = "update_id";
public static final String COL_CREATE_TIME = "create_time";
public static final String COL_UPDATE_TIME = "update_time";
}
\ No newline at end of file
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 措施费导入数据
*
* @author tanyang
* @create 2024-02-04 13:49
**/
@Data
public class CbCostMeasuresImportVo {
@ExcelProperty(value = "序号")
private String number; // 清单内容
@ExcelProperty(value = "清单内容")
private String itemContent; // 清单内容
@ExcelProperty(value = "工作内容")
private String workContent; // 工作内容、做法/规格型号/施工现场配置说明
@ExcelProperty(value = "单位")
private String unit; // 单位
@ExcelProperty(value = "工程量")
private BigDecimal quantity; // 工程量
@ExcelProperty(value = "不含税单价")
private String unitPriceExcludingTax; // 不含税单价
@ExcelProperty(value = "使用时间")
private String usageTime; // 使用时间
@ExcelProperty(value = "不含税合价")
private String amountExcludingTax; // 不含税合价
@ExcelProperty(value = "税率(%)")
private String taxRate; // 税率(%)
@ExcelProperty(value = "含税合价")
private String amountIncludingTax; // 含税合价
@ExcelProperty(value = "摊销比例(%)")
private String amortizationRatio; // 摊销比例(%)
@ExcelProperty(value = "摊销后不含税合价")
private String amountExcludeTaxAmortized; // 摊销后不含税合价
@ExcelProperty(value = "摊销后含税合价")
private String amountIncludeTaxAmortized; // 摊销后含税合价
@ExcelProperty(value = "税金(元)")
private String taxAmount; // 税金(元)
@ExcelProperty(value = "备注")
private String remarks; // 备注
@ExcelProperty(value = "成本科目")
private String costSubject; // 成本科目
@ExcelProperty(value = "税金类型")
private String taxType; // 税金类型
// @ExcelProperty(value = "主键")
private Long id; // 主键
// @ExcelProperty(value = "项目ID")
private Long cbProjectId; // 项目ID
private Long parentId; // 父项id
private Integer level; // 层级数
private String no; // 处理后内容
}
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 措施费导入数据
*
* @author tanyang
* @create 2024-02-04 13:49
**/
@Data
public class CbCostMeasuresItemVo {
private String itemContent; // 清单内容
private Long id; // 主键
}
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 措施费导入数据
*
* @author tanyang
* @create 2024-02-04 13:49
**/
@Data
public class CbProjectExpenseSummaryImportVo {
@ExcelProperty(value = "名称")
private String expenseName; // 名称
@ExcelProperty(value = "数值")
private String expenseValue; // 数值
@ExcelProperty(value = "占比")
private String proportion; // 占比
// @ExcelProperty(value = "序号")
private String number; // 清单内容
private Long id; // 主键
private Long cbProjectId; // 项目ID
private Long parentId; // 父项id
private Integer dataType; // 数据类型(0:现场经费、1:其他费用、2:措施费)
private String no; // 处理后内容
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.util.Date;
/**
* @Author lcl
* @Data 2024/2/6 14:46
*/
@Data
public class CbQuantitySummaryListVo {
private Long id;
/**
* 成本科目名称(合约规划)
*/
private String cbSubjectName;
/**
* 公司编码
*/
private String companyNo;
/**
* 集团编码
*/
private String orgNo;
/**
* 成本名称
*/
private String cbName;
/**
* 工作内容
*/
private String jobContent;
/**
* 计算规则
*/
private String calculationRule;
/**
* 计量单位
*/
private String unit;
/**
* 材料说明
*/
private String materialDescription;
/**
* 指导价格
*/
private String guidePrice;
/**
* 投标选用单价(不含税)
*/
private Double bidUnitPrice;
/**
* 单价差额
*/
private Double unitPriceDifference;
/**
* 数量
*/
private Double quantity;
/**
* 合价(不含税)
*/
private Double combinedPrice;
/**
* 合价(含税)
*/
private Double combinedPriceTax;
/**
* 品牌名称
*/
private String brandName;
/**
* 投标选用来源
*/
private String bidSource;
/**
* 备注
*/
private String remark;
/**
* 工程量(本月用料)
*/
private Double quantities;
/**
* 单位
*/
private String quantitiesUnit;
/**
* 换算后本月用料
*/
private Double conversionQuantities;
/**
* 换算单位
*/
private String conversionUnit;
/**
* 采购单价
*/
private Double purchaseUnitPrice;
/**
* 创建时间
*/
private Date createTime;
/**
* 截至本月总量
*/
private Double totalQuantities;
/**
* 本月已填写成本Id
*/
private String actualId;
/**
* 推送工程量
*/
private Double pushQuantities;
/**
* IPM项目编码
*/
private String ipmProjectCode;
/**
* IPM合同编码
*/
private String ipmContractCode;
/**
* IPM作业编码
*/
private String ipmJobCode;
}
package com.dsk.cscec.listener;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.cscec.domain.CbCostMeasure;
import com.dsk.cscec.domain.vo.CbCostMeasuresImportVo;
import com.dsk.cscec.service.impl.CbCostMeasureServiceImpl;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 系统用户自定义导入
*
* @author Lion Li
*/
@Slf4j
public class ProjectCostMeasureImportListener extends AnalysisEventListener<CbCostMeasuresImportVo> implements ExcelListener<CbCostMeasuresImportVo> {
private final CbCostMeasureServiceImpl cbCostMeasureService;
//
// private final String password;
private final Long projectId;
private final Integer cbStage;
private List<CbCostMeasuresImportVo> dataList = new ArrayList<>();
// private final String operName;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public ProjectCostMeasureImportListener(Long projectId, Integer cbStage) {
// String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
this.cbCostMeasureService = SpringUtils.getBean(CbCostMeasureServiceImpl.class);
this.cbStage = cbStage;
this.projectId = projectId;
// this.operName = LoginHelper.getUsername();
}
@Override
public void invoke(CbCostMeasuresImportVo importVo, AnalysisContext context) {
Integer rowIndex = context.readRowHolder().getRowIndex();
if (StrUtil.isEmpty(importVo.getItemContent())) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
}
String number = importVo.getNumber();
if (StrUtil.isEmpty(number)) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
}
Boolean numberMatch = false;
String regex = "[\\((]*[一|二|三|四|五|六|七|八|九|十]+[\\))]*";
Pattern pattern = Pattern.compile("^\\d+(\\.\\d+)*$");
Pattern pattern3 = Pattern.compile("^([1-9][0-9]*|0)$");
if (ReUtil.isMatch(regex, number) || ReUtil.isMatch(pattern, number)||ReUtil.isMatch(pattern3, number)) {
numberMatch = true;
} else {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号格式错误");
}
if(numberMatch){
if (ReUtil.isMatch(regex, number)){
String replace = number.replaceAll("[\\\\((]|[\\\\))]", "");
int no = Convert.chineseToNumber(replace);
importVo.setNo(String.valueOf(no));
}else{
importVo.setNo(importVo.getNumber());
}
dataList.add(importVo);
}
// JSONConfig jsonConfig=new JSONConfig();
// jsonConfig.setIgnoreNullValue(false);
// System.out.println(JSONUtil.toJsonStr(importVo,jsonConfig));
//
//
// Integer parentId=null;
//
//保存sheet为一级节点
// ReadSheetHolder readSheetHolder = context.readSheetHolder();
// CbCostMeasure rootCbCostMeasure=new CbCostMeasure();
// rootCbCostMeasure.setItemContent(readSheetHolder.getSheetName());
// rootCbCostMeasure.setLevel(0);
// rootCbCostMeasure.setCbProjectId(projectId);
// rootCbCostMeasure.setCbStage(cbStage);
// LambdaQueryWrapper<CbCostMeasure> tWrapper = Wrappers.lambdaQuery(rootCbCostMeasure);
// CbCostMeasure rootMeasure = cbCostMeasureService.getOne(tWrapper);
// if(ObjectUtil.isEmpty(rootMeasure)){
// cbCostMeasureService.save(rootCbCostMeasure);
// }
// //保存下级节点
// String itemContent = importVo.getItemContent();
// String number = importVo.getNumber();
//
//
// //判断是否二级节点
// String regex = "[\\((][一|二|三|四|五|六|七|八|九|十]+[\\))]";
// if(StrUtil.isNotEmpty(itemContent)&& ReUtil.isMatch(regex,itemContent)&&StrUtil.isEmpty(importVo.getTaxType())){
// CbCostMeasure firstCbCostMeasure=new CbCostMeasure();
// firstCbCostMeasure.setItemContent(itemContent);
// firstCbCostMeasure.setLevel(1);
// firstCbCostMeasure.setProjectId(projectId);
// firstCbCostMeasure.setCbStage(cbStage);
// LambdaQueryWrapper<CbCostMeasure> firstWrapper = Wrappers.lambdaQuery(firstCbCostMeasure);
// CbCostMeasure firstMeasure = cbCostMeasureService.getOne(firstWrapper);
// if(ObjectUtil.isEmpty(firstMeasure)){
// cbCostMeasureService.save(firstMeasure);
// parentId=rootCbCostMeasure.getId();
// }
// }
// cbCostMeasureService.save();
// SysUser user = this.userService.selectUserByUserName(userVo.getUserName());
// try {
// // 验证是否存在这个用户
// if (ObjectUtil.isNull(user)) {
// user = BeanUtil.toBean(userVo, SysUser.class);
// ValidatorUtils.validate(user);
// user.setPassword(password);
// user.setCreateBy(operName);
// userService.insertUser(user);
// successNum++;
// successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功");
// } else if (isUpdateSupport) {
// Long userId = user.getUserId();
// user = BeanUtil.toBean(userVo, SysUser.class);
// user.setUserId(userId);
// ValidatorUtils.validate(user);
// userService.checkUserAllowed(user);
// userService.checkUserDataScope(user.getUserId());
// user.setUpdateBy(operName);
// userService.updateUser(user);
// successNum++;
// successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功");
// } else {
// failureNum++;
// failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在");
// }
// } catch (Exception e) {
// failureNum++;
// String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
// failureMsg.append(msg).append(e.getMessage());
// log.error(msg, e);
// }
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbCostMeasuresImportVo> getExcelResult() {
return new ExcelResult<CbCostMeasuresImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<CbCostMeasuresImportVo> getList() {
return dataList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
package com.dsk.cscec.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
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.common.helper.LoginHelper;
import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
import com.dsk.cscec.domain.vo.CbCostMeasuresImportVo;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryImportVo;
import com.dsk.cscec.service.CbProjectExpenseSummaryService;
import com.dsk.cscec.service.impl.CbCostMeasureServiceImpl;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* 系统用户自定义导入
*
* @author Lion Li
*/
@Slf4j
public class ProjectCostMeasureSummaryImportListener extends AnalysisEventListener<CbProjectExpenseSummaryImportVo> implements ExcelListener<CbProjectExpenseSummaryImportVo> {
private final CbProjectExpenseSummaryService cbProjectExpenseSummaryService;
//
// private final String password;
private final Long projectId;
private final Integer cbStage;
private final Integer dataType;
private List<CbProjectExpenseSummaryImportVo> dataList = new ArrayList<>();
// private final String operName;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public ProjectCostMeasureSummaryImportListener(Long projectId, Integer cbStage,Integer dataType) {
this.cbProjectExpenseSummaryService = SpringUtils.getBean(CbProjectExpenseSummaryService.class);
this.cbStage = cbStage;
this.projectId = projectId;
this.dataType=dataType;
}
@Override
public void invoke(CbProjectExpenseSummaryImportVo importVo, AnalysisContext context) {
CbProjectExpenseSummary cbProjectExpenseSummary=new CbProjectExpenseSummary();
BeanUtil.copyProperties(importVo,cbProjectExpenseSummary);
cbProjectExpenseSummary.setProjectId(projectId);
cbProjectExpenseSummary.setCbStage(cbStage);
cbProjectExpenseSummary.setDataType(dataType);
cbProjectExpenseSummary.setCreateBy(LoginHelper.getUsername());
cbProjectExpenseSummaryService.save(cbProjectExpenseSummary);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbProjectExpenseSummaryImportVo> getExcelResult() {
return new ExcelResult<CbProjectExpenseSummaryImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<CbProjectExpenseSummaryImportVo> getList() {
return dataList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbCostMeasureActual;
import com.dsk.cscec.domain.bo.CbCostMeasureActualBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import java.util.List;
public interface CbCostMeasureActualMapper extends BaseMapper<CbCostMeasureActual> {
int insertSelective(CbCostMeasureActual record);
int updateByPrimaryKeySelective(CbCostMeasureActual record);
List<CbCostMeasureActualVo> selectDataList(CbCostMeasureActualBo costMeasureActualBo);
}
\ No newline at end of file
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.core.domain.entity.SysDictData;
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 java.util.List;
public interface CbCostMeasureMapper extends BaseMapper<CbCostMeasure> {
List<CbCostMeasureActualVo> selectListByProjectAndNo(CbCostMeasureActualBo cbCostMeasure);
}
\ No newline at end of file
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbDirectExpense;
/**
* 直接费成本表(CbDirectExpense)表数据库访问层
*
* @author sxk
* @since 2024-02-05 14:43:31
*/
public interface CbDirectExpenseMapper extends BaseMapper<CbDirectExpense> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
public interface CbProjectExpenseSummaryMapper extends BaseMapper<CbProjectExpenseSummary> {
}
\ No newline at end of file
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbProjectFile;
/**
* 项目成本文件表(CbProjectFile)表数据库访问层
*
* @author sxk
* @since 2024-02-05 14:01:03
*/
public interface CbProjectFileMapper extends BaseMapper<CbProjectFile> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbProjectRecord;
/**
* 项目台账表(CbProjectRecord)表数据库访问层
*
* @author sxk
* @since 2024-02-05 11:37:49
*/
public interface CbProjectRecordMapper extends BaseMapper<CbProjectRecord> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
/**
* 成本-工料汇总月记录(CbQuantitySummaryActual)表数据库访问层
*
* @author lcl
* @since 2024-02-05 11:12:47
*/
public interface CbQuantitySummaryActualMapper extends BaseMapper<CbQuantitySummaryActual> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.common.core.mapper.BaseMapperPlus;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbQuantitySummaryListBo;
import com.dsk.cscec.domain.vo.CbQuantitySummaryListVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表数据库访问层
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
public interface CbQuantitySummaryMapper extends BaseMapperPlus<CbQuantitySummaryMapper,CbQuantitySummary,CbQuantitySummary> {
List<Map<String, Object>> selectSubject(CbProjectBaseBo bo);
int selectOtherSubjectCount(CbProjectBaseBo bo);
List<String> selectMonthList(CbQuantitySummaryListBo bo);
List<CbQuantitySummaryListVo> selectListBySubject(CbQuantitySummaryListBo bo);
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSubject;
/**
* 成本科目(CostSubject)表数据库访问层
*
* @author lcl
* @since 2024-02-05 09:29:47
*/
public interface CbSubjectMapper extends BaseMapper<CbSubject> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummaryActual;
/**
* 成本汇总-每月费用(CbSummaryActual)表数据库访问层
*
* @author cyf
* @since 2024-02-06
*/
public interface CbSummaryActualMapper extends BaseMapper<CbSummaryActual> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummary;
/**
* 成本汇总(CbSummary)表数据库访问层
*
* @author cyf
* @since 2024-02-06
*/
public interface CbSummaryMapper extends BaseMapper<CbSummary> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbDirectExpense;
/**
* 直接费成本表(CbDirectExpense)表服务接口
*
* @author sxk
* @since 2024-02-05 14:43:34
*/
public interface CbDirectExpenseService extends IService<CbDirectExpense> {
}
package com.dsk.cscec.service;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
import com.baomidou.mybatisplus.extension.service.IService;
public interface CbProjectExpenseSummaryService extends IService<CbProjectExpenseSummary>{
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.QueryCbProjectFileDetailBo;
import com.dsk.cscec.domain.bo.ProjectFileUploadBo;
import com.dsk.system.domain.vo.SysOssVo;
import java.util.List;
/**
* 项目成本文件表(CbProjectFile)表服务接口
*
* @author sxk
* @since 2024-02-05 14:01:06
*/
public interface CbProjectFileService extends IService<CbProjectFile> {
/**
* 添加项目上传文件记录
*
* @param fileUploadBo 上传信息
* @param oss oss信息
*/
void addProjectFile(ProjectFileUploadBo fileUploadBo, SysOssVo oss);
/**
* 逻辑删除项目上传文件记录
*
* @param fileId 文件ID
* @return 删除结果
*/
Integer deleteProjectFile(Long fileId);
///**
// * 根据项目ID获取项目文件详情
// *
// * @param queryBo 查询体
// * @return 文件详情列表
// */
//List<CbProjectFile> getProjectFileDetail(QueryCbProjectFileDetailBo queryBo);
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
/**
* 项目台账表(CbProjectRecord)表服务接口
*
* @author sxk
* @since 2024-02-05 11:37:53
*/
public interface CbProjectRecordService extends IService<CbProjectRecord> {
/**
* 新增项目
*
* @param addCbProjectBo 新增对象
* @return 新增结果
*/
CbProjectRecord addProject(AddCbProjectBo addCbProjectBo);
///**
// * 根据项目文件导入数据
// *
// * @param importDataBo 导入对象
// * @return 导入结果
// */
//Boolean importData(ImportCbProjectDataBo importDataBo);
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSummaryActual;
/**
* 成本汇总-每月费用(CbSummaryActual)表服务接口
*
* @author cyf
* @since 2024-02-06
*/
public interface CbSummaryActualService extends IService<CbSummaryActual> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSummary;
/**
* 成本汇总(CbSummary)表服务接口
*
* @author cyf
* @since 2024-02-06
*/
public interface CbSummaryService extends IService<CbSummary> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbCostMeasure;
import com.dsk.cscec.domain.CbCostMeasureActual;
import com.dsk.cscec.domain.bo.CbCostMeasureActualBo;
import com.dsk.cscec.domain.bo.CbCostMeasureActualSaveBo;
import com.dsk.cscec.domain.vo.CbCostMeasureActualVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表服务接口
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
public interface ICbCostMeasureActualService extends IService<CbCostMeasureActual> {
}
package com.dsk.cscec.service;
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.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 java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表服务接口
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
public interface ICbCostMeasureService extends IService<CbCostMeasure> {
void importExcelData(MultipartFile file, Long projectId);
List<Map<String, Object>> listByLevel(Long projectId, int i);
List<CbCostMeasureActualVo> selectDataList(CbCostMeasureActualBo cbCostMeasure);
void saveBatchCostMeasureActual(List<CbCostMeasureActualSaveBo> boList);
void pushCostMeasureActual(CbCostMeasureActualPushBo pushBo);
void importExcelSummaryData(MultipartFile file, Long projectId,Integer dataType);
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
/**
* 成本-工料汇总月记录(CbQuantitySummaryActual)表服务接口
*
* @author lcl
* @since 2024-02-05 11:12:47
*/
public interface ICbQuantitySummaryActualService extends IService<CbQuantitySummaryActual> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbQuantitySummaryListBo;
import com.dsk.cscec.domain.vo.CbQuantitySummaryListVo;
import java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表服务接口
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
public interface ICbQuantitySummaryService extends IService<CbQuantitySummary> {
Map<String, Object> subjectTree(CbProjectBaseBo bo);
List<String> monthList(CbQuantitySummaryListBo bo);
List<CbQuantitySummaryListVo> subjectList(CbQuantitySummaryListBo bo);
void updateActual(List<CbQuantitySummaryActual> list);
void pushData(CbQuantitySummaryActual bo);
}
...@@ -52,5 +52,13 @@ public interface IDProjectService extends IService<DProject> { ...@@ -52,5 +52,13 @@ public interface IDProjectService extends IService<DProject> {
* @return 项目详情 * @return 项目详情
*/ */
ProjectDetailVo queryProjectDetail(ProjectDetailBo projectDetailBo); ProjectDetailVo queryProjectDetail(ProjectDetailBo projectDetailBo);
/**
* 校验项目编码是否存在
*
* @param projectCode 项目编码
* @return 校验结果
*/
Boolean checkProjectCodeExist(String projectCode);
} }
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbDirectExpense;
import com.dsk.cscec.mapper.CbDirectExpenseMapper;
import com.dsk.cscec.service.CbDirectExpenseService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 直接费成本表(CbDirectExpense)表服务实现类
*
* @author sxk
* @since 2024-02-05 14:43:34
*/
@Service("cbDirectExpenseService")
public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMapper, CbDirectExpense> implements CbDirectExpenseService {
@Resource
private CbDirectExpenseMapper baseMapper;
}
package com.dsk.cscec.service.impl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
import com.dsk.cscec.mapper.CbProjectExpenseSummaryMapper;
import com.dsk.cscec.service.CbProjectExpenseSummaryService;
@Service
public class CbProjectExpenseSummaryServiceImpl extends ServiceImpl<CbProjectExpenseSummaryMapper, CbProjectExpenseSummary> implements CbProjectExpenseSummaryService{
}
package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.QueryCbProjectFileDetailBo;
import com.dsk.cscec.domain.bo.ProjectFileUploadBo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.system.domain.vo.SysOssVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* 项目成本文件表(CbProjectFile)表服务实现类
*
* @author sxk
* @since 2024-02-05 14:01:06
*/
@Service("cbProjectFileService")
public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, CbProjectFile> implements CbProjectFileService {
@Resource
private CbProjectFileMapper baseMapper;
@Resource
private CbProjectRecordMapper projectRecordMapper;
/**
* 添加项目上传文件记录
*
* @param fileUploadBo 上传信息
* @param oss oss信息
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void addProjectFile(ProjectFileUploadBo fileUploadBo, SysOssVo oss) {
//校验项目是否存在
if (!projectRecordMapper.exists(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getId, fileUploadBo.getProjectId())
.eq(CbProjectRecord::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST))) {
throw new ServiceException("项目ID无效,该项目不存在");
}
CbProjectFile projectFile = BeanUtil.toBean(fileUploadBo, CbProjectFile.class);
projectFile.setFileName(oss.getOriginalName());
projectFile.setFileOssId(oss.getOssId().toString());
projectFile.setFileOssUrl(oss.getUrl());
//项目文件状态:解析中
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
//删除状态:未删除
projectFile.setDelFlag(CbProjectConstants.DELETE_FLAG_EXIST);
baseMapper.insert(projectFile);
}
/**
* 逻辑删除项目上传文件记录
*
* @param fileId 文件ID
* @return 删除结果
*/
@Override
public Integer deleteProjectFile(Long fileId) {
CbProjectFile projectFile = baseMapper.selectById(fileId);
Assert.notNull(projectFile,"该文件不存在");
projectFile.setDelFlag(CbProjectConstants.DELETE_FLAG_NOT_EXIST);
return baseMapper.updateById(projectFile);
}
///**
// * 根据项目ID获取项目文件详情
// *
// * @param queryBo 查询体
// * @return 文件详情列表
// */
//@Override
//public List<CbProjectFile> getProjectFileDetail(QueryCbProjectFileDetailBo queryBo) {
// return baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
// .eq(CbProjectFile::getProjectId, queryBo.getProjectId())
// .eq(CbProjectFile::getCbStage, queryBo.getCbStage())
// //成本类型:未确定,即创建项目后未上传任何文件
// .ne(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_NOT_CONFIRM)
// .eq(CbProjectFile::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST)
// //项目文件状态:未上传
// .eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_NOT_UPLOAD)
// .or()
// //项目文件状态:待解析
// .eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_WAIT_PARSE));
//}
}
package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectRecordService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* 项目台账表(CbProjectRecord)表服务实现类
*
* @author sxk
* @since 2024-02-05 11:37:53
*/
@Service("cbProjectRecordService")
public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMapper, CbProjectRecord> implements CbProjectRecordService {
@Resource
private CbProjectRecordMapper baseMapper;
@Resource
private CbProjectFileMapper projectFileMapper;
/**
* 新增项目
*
* @param addCbProjectBo 新增对象
* @return 新增结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public CbProjectRecord addProject(AddCbProjectBo addCbProjectBo) {
CbProjectRecord projectRecord = BeanUtil.toBean(addCbProjectBo, CbProjectRecord.class);
//项目文件状态:待解析
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_WAIT_PARSE);
//删除状态:否
projectRecord.setDelFlag(CbProjectConstants.DELETE_FLAG_EXIST);
if (baseMapper.insert(projectRecord) > 0) {
CbProjectFile projectFile = new CbProjectFile();
projectFile.setProjectId(projectRecord.getId());
projectFile.setCbStage(projectRecord.getCbStage());
//项目文件状态:未上传
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_NOT_UPLOAD);
//成本类型:未确定
projectFile.setCbType(CbProjectConstants.CB_TYPE_NOT_CONFIRM);
projectFile.setDelFlag(CbProjectConstants.DELETE_FLAG_EXIST);
projectFileMapper.insert(projectFile);
return projectRecord;
}
return null;
}
///**
// * 根据项目文件导入数据
// *
// * @param importDataBo 导入对象
// * @return 导入结果
// */
//@Override
//public Boolean importData(ImportCbProjectDataBo importDataBo) {
// Long projectId = importDataBo.getProjectId();
// Integer cbStage = importDataBo.getCbStage();
// //校验项目是否存在
// Assert.isTrue(baseMapper.exists(new LambdaQueryWrapper<CbProjectRecord>()
// .eq(CbProjectRecord::getId, projectId)
// .eq(CbProjectRecord::getCbStage, cbStage)
// .eq(CbProjectRecord::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST)), "该项目不存在");
// //TODO:调各个成本类型的导入文件方法
//
// return null;
//}
}
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.mapper.CbQuantitySummaryActualMapper;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
import com.dsk.cscec.service.ICbQuantitySummaryActualService;
import org.springframework.stereotype.Service;
/**
* 成本-工料汇总月记录(CbQuantitySummaryActual)表服务实现类
*
* @author lcl
* @since 2024-02-05 11:12:47
*/
@Service
public class CbQuantitySummaryActualServiceImpl extends ServiceImpl<CbQuantitySummaryActualMapper, CbQuantitySummaryActual> implements ICbQuantitySummaryActualService {
}
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.excel.ExcelUtils;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
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.service.CbProjectFileService;
import com.dsk.cscec.service.ICbQuantitySummaryActualService;
import com.dsk.cscec.service.ICbQuantitySummaryService;
import jodd.bean.BeanException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表服务实现类
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
@Slf4j
@Service
public class CbQuantitySummaryServiceImpl extends ServiceImpl<CbQuantitySummaryMapper, CbQuantitySummary> implements ICbQuantitySummaryService {
@Autowired
private ICbQuantitySummaryActualService baseActualService;
@Override
public Map<String, Object> subjectTree(CbProjectBaseBo bo) {
Map<String, Object> resultMap = new HashMap<>();
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()
.collect(
Collectors.groupingBy(item -> item.get("one").toString(),
Collectors.groupingBy(item -> item.get("two").toString(),
Collectors.groupingBy(item -> item.get("three").toString()))));
resultMap.put("房建类成本科目", map);
}
int otherSubjectCount = baseMapper.selectOtherSubjectCount(bo);
if (otherSubjectCount > 0) {
resultMap.put("未归类项目", "other");
}
return resultMap;
}
@Override
public List<String> monthList(CbQuantitySummaryListBo bo) {
return baseMapper.selectMonthList(bo);
}
@Override
public List<CbQuantitySummaryListVo> subjectList(CbQuantitySummaryListBo bo) {
return baseMapper.selectListBySubject(bo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateActual(List<CbQuantitySummaryActual> list) {
if (ObjectUtils.isEmpty(list)) throw new BeanException("数据不能为空");
for (CbQuantitySummaryActual actual : list) {
if (ObjectUtils.isEmpty(actual.getCbQuantitySummaryId())) throw new BeanException("基础数据id不能为空!");
if (ObjectUtils.isEmpty(actual.getQuantities())) throw new BeanException("工程量(本月用料)不能为空!");
if (ObjectUtils.isEmpty(actual.getRecordDate())) throw new BeanException("填写月份不能为空!");
actual.setId(ObjectUtils.isEmpty(actual.getId()) ? SecureUtil.md5(actual.getCbQuantitySummaryId() + actual.getRecordDate()) : actual.getId());
boolean b = baseActualService.saveOrUpdate(actual);
if (!b) {
log.error("CbQuantitySummaryServiceImpl.updateActual() data insert error! data:" + JSONUtil.toJsonStr(actual));
throw new ServiceException("数据添加错误!");
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void pushData(CbQuantitySummaryActual bo) {
//数据记录
if (ObjectUtils.isEmpty(bo.getId())) throw new BeanException("id不能为空!");
if (ObjectUtils.isEmpty(bo.getPushQuantities())) throw new BeanException("推送工程量不能为空!");
if (ObjectUtils.isEmpty(bo.getIpmProjectCode())) throw new BeanException("IPM项目编码不能为空!");
if (ObjectUtils.isEmpty(bo.getIpmContractCode())) throw new BeanException("IPM合同编码不能为空!");
if (ObjectUtils.isEmpty(bo.getIpmBizCode())) throw new BeanException("IPM作业编码不能为空!");
boolean update = baseActualService.updateById(bo);
if (!update) {
log.error("CbQuantitySummaryServiceImpl.pushData() data update error! data:" + JSONUtil.toJsonStr(bo));
throw new ServiceException("数据添加错误!");
}
//TODO 推送数据
}
}
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbSummaryActual;
import com.dsk.cscec.mapper.CbSummaryActualMapper;
import com.dsk.cscec.service.CbSummaryActualService;
import org.springframework.stereotype.Service;
/**
* 成本汇总-每月费用(CbSummaryActual)表服务实现类
*
* @author cyf
* @since 2024-02-06
*/
@Service
public class CbSummaryActualServiceImpl extends ServiceImpl<CbSummaryActualMapper, CbSummaryActual> implements CbSummaryActualService {
}
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.mapper.CbSummaryMapper;
import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.service.CbSummaryService;
import org.springframework.stereotype.Service;
/**
* 成本汇总(CbSummary)表服务实现类
*
* @author cyf
* @since 2024-02-06
*/
@Service
public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary> implements CbSummaryService {
}
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.mapper.CbCostMeasureActualMapper;
import com.dsk.cscec.mapper.CbCostMeasureMapper;
import com.dsk.cscec.service.ICbCostMeasureActualService;
import org.springframework.stereotype.Service;
/**
* @author tanyang
* @create 2024-02-07 9:38
**/
@Service
public class ICbCostMeasureActualServiceImpl extends ServiceImpl<CbCostMeasureActualMapper, CbCostMeasureActual> implements ICbCostMeasureActualService {
}
...@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.cscec.constant.AdvisoryBodyManageQueryConstants; import com.dsk.cscec.constant.AdvisoryBodyManageQueryConstants;
import com.dsk.cscec.domain.AdvisoryBody; import com.dsk.cscec.domain.AdvisoryBody;
...@@ -20,7 +19,6 @@ import com.dsk.cscec.domain.DProject; ...@@ -20,7 +19,6 @@ import com.dsk.cscec.domain.DProject;
import com.dsk.cscec.domain.bo.CooperateProjectDetailSearchBo; import com.dsk.cscec.domain.bo.CooperateProjectDetailSearchBo;
import com.dsk.cscec.domain.bo.ProjectDetailBo; import com.dsk.cscec.domain.bo.ProjectDetailBo;
import com.dsk.cscec.domain.bo.ProjectSearchBo; import com.dsk.cscec.domain.bo.ProjectSearchBo;
import com.dsk.cscec.domain.vo.AdvisoryBodyExistVo;
import com.dsk.cscec.domain.vo.CooperateProjectDetailSearchVo; import com.dsk.cscec.domain.vo.CooperateProjectDetailSearchVo;
import com.dsk.cscec.domain.vo.ProjectDetailVo; import com.dsk.cscec.domain.vo.ProjectDetailVo;
import com.dsk.cscec.domain.vo.ProjectSearchVo; import com.dsk.cscec.domain.vo.ProjectSearchVo;
...@@ -248,5 +246,17 @@ public class IDProjectServiceImpl extends ServiceImpl<DProjectMapper, DProject> ...@@ -248,5 +246,17 @@ public class IDProjectServiceImpl extends ServiceImpl<DProjectMapper, DProject>
} }
return projectDetailVo; return projectDetailVo;
} }
/**
* 校验项目编码是否存在
*
* @param projectCode 项目编码
* @return 校验结果
*/
@Override
public Boolean checkProjectCodeExist(String projectCode) {
return baseMapper.exists(new LambdaQueryWrapper<DProject>()
.eq(DProject::getProjectCode, projectCode));
}
} }
<?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.CbCostMeasureActualMapper">
<resultMap id="BaseResultMap" type="com.dsk.cscec.domain.CbCostMeasureActual">
<!--@mbg.generated-->
<!--@Table cb_cost_measure_actual-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="plan_measure_id" jdbcType="BIGINT" property="planMeasureId" />
<result column="month_cost_rate" jdbcType="DECIMAL" property="monthCostRate" />
<result column="cost_effective" jdbcType="DECIMAL" property="costEffective" />
<result column="current_project_volume" jdbcType="DECIMAL" property="currentProjectVolume" />
<result column="submit_project_volume" jdbcType="DECIMAL" property="submitProjectVolume" />
<result column="month" jdbcType="VARCHAR" property="month" />
<result column="push_time" jdbcType="TIMESTAMP" property="pushTime" />
<result column="push_data_json" jdbcType="LONGVARCHAR" property="pushDataJson" />
<result column="del_flag" jdbcType="INTEGER" property="delFlag" />
<result column="update_user" jdbcType="VARCHAR" property="updateUser" />
<result column="update_id" jdbcType="VARCHAR" property="updateId" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, plan_measure_id, month_cost_rate, cost_effective, current_project_volume, submit_project_volume,
`month`, push_time, push_data_json, del_flag, update_user, update_id, create_time,
update_time
</sql>
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.dsk.cscec.domain.CbCostMeasureActual" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into cb_cost_measure_actual
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="planMeasureId != null">
plan_measure_id,
</if>
<if test="monthCostRate != null">
month_cost_rate,
</if>
<if test="costEffective != null">
cost_effective,
</if>
<if test="currentProjectVolume != null">
current_project_volume,
</if>
<if test="submitProjectVolume != null">
submit_project_volume,
</if>
<if test="month != null">
`month`,
</if>
<if test="pushTime != null">
push_time,
</if>
<if test="pushDataJson != null">
push_data_json,
</if>
<if test="delFlag != null">
del_flag,
</if>
<if test="updateUser != null">
update_user,
</if>
<if test="updateId != null">
update_id,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="planMeasureId != null">
#{planMeasureId,jdbcType=BIGINT},
</if>
<if test="monthCostRate != null">
#{monthCostRate,jdbcType=DECIMAL},
</if>
<if test="costEffective != null">
#{costEffective,jdbcType=DECIMAL},
</if>
<if test="currentProjectVolume != null">
#{currentProjectVolume,jdbcType=DECIMAL},
</if>
<if test="submitProjectVolume != null">
#{submitProjectVolume,jdbcType=DECIMAL},
</if>
<if test="month != null">
#{month,jdbcType=VARCHAR},
</if>
<if test="pushTime != null">
#{pushTime,jdbcType=TIMESTAMP},
</if>
<if test="pushDataJson != null">
#{pushDataJson,jdbcType=LONGVARCHAR},
</if>
<if test="delFlag != null">
#{delFlag,jdbcType=INTEGER},
</if>
<if test="updateUser != null">
#{updateUser,jdbcType=VARCHAR},
</if>
<if test="updateId != null">
#{updateId,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.dsk.cscec.domain.CbCostMeasureActual">
<!--@mbg.generated-->
update cb_cost_measure_actual
<set>
<if test="planMeasureId != null">
plan_measure_id = #{planMeasureId,jdbcType=BIGINT},
</if>
<if test="monthCostRate != null">
month_cost_rate = #{monthCostRate,jdbcType=DECIMAL},
</if>
<if test="costEffective != null">
cost_effective = #{costEffective,jdbcType=DECIMAL},
</if>
<if test="currentProjectVolume != null">
current_project_volume = #{currentProjectVolume,jdbcType=DECIMAL},
</if>
<if test="submitProjectVolume != null">
submit_project_volume = #{submitProjectVolume,jdbcType=DECIMAL},
</if>
<if test="month != null">
`month` = #{month,jdbcType=VARCHAR},
</if>
<if test="pushTime != null">
push_time = #{pushTime,jdbcType=TIMESTAMP},
</if>
<if test="pushDataJson != null">
push_data_json = #{pushDataJson,jdbcType=LONGVARCHAR},
</if>
<if test="delFlag != null">
del_flag = #{delFlag,jdbcType=INTEGER},
</if>
<if test="updateUser != null">
update_user = #{updateUser,jdbcType=VARCHAR},
</if>
<if test="updateId != null">
update_id = #{updateId,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<select id="selectDataList" resultType="com.dsk.cscec.domain.vo.CbCostMeasureActualVo">
SELECT t1.plan_measure_id,
t1.month_cost_rate,
t1.cost_effective,
t1.month_cost_rate,
t1.current_project_volume,
t1.submit_project_volume,
t1.`month`,
t1.push_time
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 t.cb_stage=#{cbStage}
AND t1.`month`=#{month}
</select>
</mapper>
\ No newline at end of file
<?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.CbCostMeasureMapper">
<resultMap id="BaseResultMap" type="com.dsk.cscec.domain.CbCostMeasure">
<!--@mbg.generated-->
<!--@Table cb_cost_measure-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="project_id" jdbcType="BIGINT" property="projectId" />
<result column="cb_stage" jdbcType="INTEGER" property="cbStage" />
<result column="parent_id" jdbcType="BIGINT" property="parentId" />
<result column="level" jdbcType="INTEGER" property="level" />
<result column="number" jdbcType="VARCHAR" property="number" />
<result column="no" jdbcType="VARCHAR" property="no" />
<result column="item_content" jdbcType="VARCHAR" property="itemContent" />
<result column="work_content" jdbcType="VARCHAR" property="workContent" />
<result column="unit" jdbcType="VARCHAR" property="unit" />
<result column="quantity" jdbcType="DECIMAL" property="quantity" />
<result column="unit_price_excluding_tax" jdbcType="VARCHAR" property="unitPriceExcludingTax" />
<result column="usage_time" jdbcType="VARCHAR" property="usageTime" />
<result column="amount_excluding_tax" jdbcType="VARCHAR" property="amountExcludingTax" />
<result column="tax_rate" jdbcType="VARCHAR" property="taxRate" />
<result column="amount_including_tax" jdbcType="VARCHAR" property="amountIncludingTax" />
<result column="amortization_ratio" jdbcType="VARCHAR" property="amortizationRatio" />
<result column="amount_exclude_tax_amortized" jdbcType="VARCHAR" property="amountExcludeTaxAmortized" />
<result column="amount_include_tax_amortized" jdbcType="VARCHAR" property="amountIncludeTaxAmortized" />
<result column="tax_amount" jdbcType="VARCHAR" property="taxAmount" />
<result column="remarks" jdbcType="VARCHAR" property="remarks" />
<result column="cost_subject" jdbcType="VARCHAR" property="costSubject" />
<result column="tax_type" jdbcType="VARCHAR" property="taxType" />
<result column="data_source" jdbcType="INTEGER" property="dataSource" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
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
</sql>
<select id="selectListByProjectAndNo" resultType="com.dsk.cscec.domain.vo.CbCostMeasureActualVo">
SELECT t.*,t1.plan_measure_id,t1.month_cost_rate, t1.cost_effective, t1.current_project_volume,t1.submit_project_volume,t1.`month`,t1.push_time FROM cb_cost_measure t
left JOIN (
SELECT t1.plan_measure_id,t1.month_cost_rate, t1.cost_effective, t1.current_project_volume,t1.submit_project_volume,t1.`month`,t1.push_time 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 t.cb_stage=#{cbStage}
AND t1.`month`=#{month}) t1 ON t1.plan_measure_id=t.id
WHERE
t.project_id=#{projectId}
AND t.cb_stage=#{cbStage}
AND t.`level`!=0
AND t.`no` like concat(#{id},'.%')
ORDER BY id ASC
</select>
</mapper>
\ No newline at end of file
<?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.CbDirectExpenseMapper">
</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.CbProjectExpenseSummaryMapper">
<resultMap id="BaseResultMap" type="com.dsk.cscec.domain.CbProjectExpenseSummary">
<!--@mbg.generated-->
<!--@Table cb_project_expense_summary-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="project_id" jdbcType="BIGINT" property="projectId" />
<result column="cb_stage" jdbcType="INTEGER" property="cbStage" />
<result column="number" jdbcType="VARCHAR" property="number" />
<result column="data_type" jdbcType="INTEGER" property="dataType" />
<result column="expense_name" jdbcType="VARCHAR" property="expenseName" />
<result column="expense_value" jdbcType="VARCHAR" property="expenseValue" />
<result column="proportion" jdbcType="VARCHAR" property="proportion" />
<result column="del_flag" jdbcType="INTEGER" property="delFlag" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, project_id, cb_stage, `number`, data_type, expense_name, expense_value, proportion,
del_flag, create_by, create_time
</sql>
</mapper>
\ No newline at end of file
<?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>
<?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.CbProjectRecordMapper">
</mapper>
\ No newline at end of file
<?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.CbQuantitySummaryMapper">
<select id="selectSubject" resultType="java.util.Map">
select
cs1.cb_subject_name as one, cs2.cb_subject_name as two, cs3.cb_subject_name as three
from cb_subject cs1
join cb_subject cs2 on (cs2.cb_subject_no like concat(cs1.cb_subject_no,'%') and cs2.`level` = 2 )
join cb_subject cs3 on (cs3.cb_subject_no like concat(cs2.cb_subject_no,'%') and cs3.`level` = 3 )
join cb_quantity_summary cqs on (cqs.cb_subject_name = cs3.cb_subject_name and cqs.del_falg = 0 and cqs.project_id = #{projectId} and cqs.cb_stage = #{cbStage} )
where cs1.`level` = 1
group by cs1.cb_subject_name,cs2.cb_subject_name,cs3.cb_subject_name
</select>
<select id="selectOtherSubjectCount" resultType="java.lang.Integer">
select
count(cqs.id)
from cb_quantity_summary cqs
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} and cs1.id is null
</select>
<select id="selectMonthList" resultType="java.lang.String">
select
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}
group by cqsa.record_date
order by cqsa.record_date
</select>
<select id="selectListBySubject" resultType="com.dsk.cscec.domain.vo.CbQuantitySummaryListVo">
select a.*, ifnull(sum(a.quantities),0) totalQuantities from (
select
cqs.id, cqs.cb_subject_name, cqs.company_no, cqs.org_no, cqs.cb_name, cqs.job_content, cqs.calculation_rule,
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
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}
<if test="recordDate != null and recordDate != ''"> and cqsa.record_date &lt;= #{recordDate} </if>
order by cqsa.record_date desc
) a
group by a.id
order by a.`number` asc
</select>
</mapper>
\ No newline at end of file
<?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.CbSummaryActualMapper">
<resultMap type="com.dsk.cscec.domain.CbSummaryActual" id="CbSummaryActualMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="cbSummaryId" column="cb_summary_id" jdbcType="INTEGER"/>
<result property="taxInclusiveExpense" column="tax_inclusive_expense" jdbcType="NUMERIC"/>
<result property="taxExclusiveExpense" column="tax_exclusive_expense" jdbcType="NUMERIC"/>
<result property="expenseDate" column="expense_date" jdbcType="VARCHAR"/>
<result property="lockStatus" column="lock_status" jdbcType="INTEGER"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
</resultMap>
<sql id="baseColumn">
id, cb_summary_id, tax_inclusive_expense, tax_exclusive_expense, expense_date, lock_status, create_time, del_flag
</sql>
</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.CbSummaryMapper">
<resultMap type="com.dsk.cscec.domain.CbSummary" id="CbSummaryMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="parentId" column="parent_id" jdbcType="INTEGER"/>
<result property="level" column="level" jdbcType="INTEGER"/>
<result property="sort" column="sort" jdbcType="INTEGER"/>
<result property="projectId" column="project_id" jdbcType="INTEGER"/>
<result property="cbStage" column="cb_stage" jdbcType="INTEGER"/>
<result property="cbProjectFileId" column="cb_project_file_id" jdbcType="INTEGER"/>
<result property="number" column="number" jdbcType="VARCHAR"/>
<result property="cbName" column="cb_name" jdbcType="VARCHAR"/>
<result property="taxExclusiveTotal" column="tax_exclusive_total" jdbcType="VARCHAR"/>
<result property="cbTaxesTotal" column="cb_taxes_total" jdbcType="VARCHAR"/>
<result property="taxInclusiveTotal" column="tax_inclusive_total" jdbcType="VARCHAR"/>
<result property="cbProportion" column="cb_proportion" jdbcType="VARCHAR"/>
<result property="taxInclusivePmTarget" column="tax_inclusive_pm_target" jdbcType="VARCHAR"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
<result property="cbType" column="cb_type" jdbcType="INTEGER"/>
</resultMap>
<sql id="baseColumn">
id, parent_id, level, sort, project_id, cb_stage, cb_project_file_id, number, cb_name, tax_exclusive_total,
cb_taxes_total, tax_inclusive_total, cb_proportion, tax_inclusive_pm_target, remark, create_time, del_flag,
cb_type
</sql>
</mapper>
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
<!-- tab列表 --> <!-- tab列表 -->
<div class="dsk-tab-items-container"> <div class="dsk-tab-items-container">
<div class="dsk-tab-items-container-inner"> <div class="dsk-tab-items-container-inner">
<div class="dsk-tab-item" v-for="item of tabs" :key="item.id" :class="{'tab-current' : item.value == currentValue}" @click="tabChoose(item)"> <div class="dsk-tab-item" v-for="item of tabs" :key="item.id" :class="{'tab-current' : item.value == currentValue}">
<div class="dsk-tab-item-name">{{item.name}}</div> <div class="dsk-tab-item-name" @click="tabChoose(item)">{{item.name}}</div>
</div> </div>
<!-- 下滑条 --> <!-- 下滑条 -->
<div class="dsk-tab-sliding-bar" v-if="tabs.length" :style="{width : `${silidingBarWidth}px`,transform : `translateX(${silidingBarLeft}px)`}"> <div class="dsk-tab-sliding-bar" v-if="tabs.length" :style="{width : `${silidingBarWidth}px`,transform : `translateX(${silidingBarLeft}px)`}">
......
...@@ -705,6 +705,7 @@ export const constantRoutes = [ ...@@ -705,6 +705,7 @@ export const constantRoutes = [
} }
] ]
}, },
// 子系统 // 子系统
// { // {
// path: '', // path: '',
......
...@@ -1030,3 +1030,28 @@ export function generateRandomLowerCaseLetter() { ...@@ -1030,3 +1030,28 @@ export function generateRandomLowerCaseLetter() {
const randomIndex = Math.floor(Math.random() * alphabet.length); const randomIndex = Math.floor(Math.random() * alphabet.length);
return alphabet[randomIndex]; return alphabet[randomIndex];
} }
/**
* 获取直系祖先到本身组成的数组
* @param {object} data
* @param {string | number} targetId
* @param {string} idKey
* @param {Array<any>} ancestors
* @returns
*/
export function findAncestors(data, targetId, idKey = "id", childrenKey = "children", ancestors = []) {
if (data[idKey] === targetId) {
return [...ancestors, data]; // 找到目标节点,将其添加到祖先数组中并返回
}
if (data[childrenKey]?.length) {
for (const child of data[childrenKey]) {
const result = findAncestors(child, targetId, idKey, childrenKey, [...ancestors, data]); // 递归调用,将当前节点添加到祖先数组中
if (result) {
return result; // 如果找到了目标节点,则停止继续遍历并返回结果
}
}
}
return null; // 如果遍历完所有节点都没有找到目标节点,则返回null
}
<!-- 表格组件 -->
<template>
<div class="infoTable-container">
<h2 v-if="title !== '' && isSubTitle" class="infoTable-title">
{{ title }}
</h2>
<el-form v-if="Object.keys(obj).length > 0" class="infoTable-form" label-position="left">
<template v-for="(item, index) in list">
<el-form-item :style="item.span?{width: `${100/(24/item.span)}%`}:{}" :label="item.name" :label-width="labelWidth?labelWidth+'px':'130px'" :key="index" :class="[
{ 'infoTable-form-view': item.style },
{ 'infoTable-form-item': !item.style },
{ 'infoTable-form-row': item.rowstyle }
]">
<div>
<template v-if="item.slot === true">
<slot :name="item.prop" :data="obj"></slot>
</template>
<span v-else> {{ obj[item.prop] ?obj[item.prop] !==""?item.formatter?item.formatter(obj[item.prop]):obj[item.prop]:'-' :'-' }}</span>
</div>
</el-form-item>
</template>
</el-form>
<div v-else class="no-data">
<div class="no-data-box" v-if="show">
<img :src="noData" alt="暂时没有找到相关数据" />
<span>暂时没有找到相关数据</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: "InfoTable",
components: {
},
props: {
list: {
type: Array,
default: () => [],
},
title: {
type: String,
default: "",
},
obj: {
type: Object,
default: () => { }
},
labelWidth: {
type: Number,
default: null
},
isSubTitle: {
type: Boolean,
default: false,
},
},
data() {
return {
show:false,
// 当前移入单元格内容
noData: require("@/assets/images/detail/noData.png")
};
},
created() {
},
mounted(){
this.show = true;
},
methods: {
},
};
</script>
<style lang="scss" scoped>
.infoTable-container {
.infoTable-title {
font-size: 16px;
font-family: Microsoft YaHei-Bold, Microsoft YaHei;
font-weight: bold;
padding-left: 8px;
border-left: 2px solid #58637B;
color: #000000;
text-shadow: 0px 0px 10px rgba(0, 37, 106, 0.10000000149011612);
margin: 0 0 16px 0;
}
.infoTable-form {
display: flex;
flex-wrap: wrap;
border-left: 1px solid #e5e9f5;
border-top: 1px solid #e5e9f5;
border-collapse: collapse;
.infoTable-form-item {
width: 50%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 13px;
}
.infoTable-form-view {
width: 100%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 13px;
}
.infoTable-form-row {
width: 33%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 13px;
}
::v-deep .el-form-item__label {
height: 100%;
background-color: #F0F3FA;
padding: 8px 12px 8px 12px;
font-size: 13px;
font-weight: normal;
color: rgba(35,35,35,0.8);
display: flex;
align-items: center;
line-height: normal;
}
::v-deep .el-form-item__content {
padding-left: 12px;
font-size: 13px;
color: #232323;
}
::v-deep .el-form-item__content {
border-left: 1px solid #e5e9f5;
height: 100%;
display: flex;
align-items: center;
}
::v-deep .el-col {
border-bottom: 1px solid #e5e9f5;
}
}
.no-data {
font-size: 14px;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-weight: 400;
color: #999999;
text-shadow: 0px 0px 10px rgba(0, 37, 106, 0.10000000149011612);
max-width: 1200px;
height: 328px;
display: flex;
justify-content: center;
align-items: center;
background: #ffffff;
border-radius: 0px 0px 0px 0px;
opacity: 1;
border: 1px solid #eeeeee;
.no-data-box {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 64px;
height: 79px;
margin-bottom: 16px;
}
}
}
::v-deep .el-form-item__content {
line-height: 22px;
padding: 6px 4px;
}
}
</style>
<template>
<div class="detail-container">
直接费成本
</div>
</template>
<script>
import InfoTable from '../../../../component/infoTable';
export default {
name: "directCost",
components: {InfoTable},
data() {
return {
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
},
}
</script>
<style lang="scss" scoped>
.detail-container {
width: 100%;
box-sizing: border-box;
padding: 0 24px;
background: #ffffff;
}
</style>
<template>
<div class="detail-container">
<div class="detail-cont">
<info-table class="info-tab" :list="defaultList1" :obj="forInfo" :labelWidth="labelWidth" title="项目基本情况" :isSubTitle="true"></info-table>
</div>
<div class="detail-cont">
<info-table class="info-tab" :list="defaultList2" :obj="forInfo" :labelWidth="labelWidth" title="项目特征信息" :isSubTitle="true"></info-table>
</div>
<div class="detail-cont">
<h2 class="infoTable-title">项目投标时的要点</h2>
<el-tabs v-model="currentList">
<el-tab-pane
:key="index"
v-for="(item, index) in toggleTabs"
:label="item.name"
:name="item.value"
>
{{item.content}}
</el-tab-pane>
</el-tabs>
<div class="detail-cont-tab">
<info-table class="info-tab" v-if="currentList === 'yd1'" :list="defaultListYd1" :obj="forInfoYd1" :labelWidth="labelWidth"></info-table>
<info-table class="info-tab" v-if="currentList === 'yd2'" :list="defaultListYd2" :obj="forInfoYd2" :labelWidth="labelWidth"></info-table>
<info-table class="info-tab" v-if="currentList === 'yd3'" :list="defaultListYd3" :obj="forInfoYd3" :labelWidth="labelWidth"></info-table>
<info-table class="info-tab" v-if="currentList === 'yd4'" :list="defaultListYd4" :obj="forInfoYd4" :labelWidth="labelWidth"></info-table>
<info-table class="info-tab" v-if="currentList === 'yd5'" :list="defaultListYd5" :obj="forInfoYd5" :labelWidth="labelWidth"></info-table>
</div>
</div>
<div class="detail-cont">
<info-table class="info-tab" :list="defaultList3" :obj="forInfo" :labelWidth="labelWidth" title="评标办法" :isSubTitle="true"></info-table>
</div>
<div class="detail-cont">
<h2 class="infoTable-title">投标各时间节点</h2>
<el-tabs v-model="currentList1">
<el-tab-pane label="投标各时间节点" name="jd1"></el-tab-pane>
<el-tab-pane label="开(回)标时间及地点" name="jd2"></el-tab-pane>
</el-tabs>
<div class="detail-cont-tab">
<info-table class="info-tab" v-if="currentList1 === 'jd1'" :list="defaultListJd1" :obj="forInfoJd1" :labelWidth="labelWidth"></info-table>
<info-table class="info-tab" v-if="currentList1 === 'jd2'" :list="defaultListJd2" :obj="forInfoJd2" :labelWidth="labelWidth"></info-table>
</div>
</div>
</div>
</template>
<script>
import InfoTable from '../../../../component/infoTable';
export default {
name: "projectInformation",
components: {InfoTable},
data() {
return {
labelWidth: 250,
forInfo: {
name:'宝安中学(集团)初中部改扩建工程施工总承包(二次公告)',
},
defaultList1: [
// { name: '工程名称', prop: 'name', slot: true },
{ name: '工程名称', prop: 'name', style: true },
{ name: '工程所在地', prop: 'creditNo' },
{ name: '工程详细地址', prop: 'operName' },
{ name: '业态', prop: 'status' },
{ name: '工程类型', prop: 'startDate' },
{ name: '计价模式(清单/定额)', prop: 'registCapi' },
{ name: '承包形式(EPC/DB/EP/PC)', prop: 'actualCapi'},
{ name: '合同类型', prop: 'checkDate' },
{ name: '建设单位', prop: 'orgNo' },
{ name: '设计单位', prop: 'regNo' },
{ name: '勘察单位', prop: 'creditNo' },
{ name: '监理单位', prop: 'econKind' },
{ name: '代理公司(或工料测量师)', prop: 'term'},
{ name: '招标形式', prop: 'qualification' },
{ name: '承包方式', prop: 'provinceCode'},
{ name: '资金来源', prop: 'belongOrg' },
{ name: '分包标准费用项价格库', prop: 'colleguesNum'},
{ name: '材料机械标准费用价格库', prop: 'colleguesNum'},
{ name: '专业类别', prop: 'scope'},
{ name: '平台项目名称', prop: 'scope'},
{ name: '核定总人数', prop: 'scope'},
{ name: '折算收入不含税系数(应纳税率)', prop: 'scope'},
{ name: '收入清单增值税率', prop: 'scope'},
],
defaultList2: [
{ name: '地上建筑面积', prop: 'creditNo' },
{ name: '地下建筑面积', prop: 'operName' },
{ name: '坑底面积', prop: 'status' },
{ name: '占地面积', prop: 'startDate' },
{ name: '结构类型', prop: 'registCapi' },
{ name: '基础类型', prop: 'actualCapi'},
{ name: '单体个数', prop: 'checkDate', style: true },
{ name: '地上层数', prop: 'orgNo' },
{ name: '地下层数', prop: 'regNo' },
{ name: '建筑高度', prop: 'creditNo' },
{ name: '地下深度', prop: 'econKind' },
{ name: '首层(m)', prop: 'term'},
{ name: '标准层(m)', prop: 'qualification' },
{ name: '其他说明', prop: 'provinceCode', style: true},
],
currentList: "yd1",
toggleTabs: [
{
value: "yd1",
name: "招标范围",
},
{
value: "yd2",
name: "指定分包/指定供应",
},
{
value: "yd3",
name: "商务标书投标文件组成(详细)",
},
{
value: "yd4",
name: "工期要求(天数,起止时间)",
},
{
value: "yd5",
name: "质量标准及质量要求",
},
],
forInfoYd1:{
time:'2023-10-20'
},
defaultListYd1: [
{ name: '建筑工程', prop: 'time' },
{ name: '装饰工程', prop: 'operName' },
{ name: '机电工程', prop: 'status' },
{ name: '配套工程', prop: 'startDate' },
{ name: '专业工程暂估', prop: 'startDate', style: true },
],
forInfoYd2:{
time:'2023-10-20'
},
defaultListYd2: [
{ name: '指定分包', prop: 'time' },
{ name: '指定供应', prop: 'operName' },
{ name: '报价方式/合同形式', prop: 'startDate', style: true },
],
forInfoYd3:{
time:'2023-10-20'
},
defaultListYd3: [
{ name: '电子标', prop: 'startDate', style: true },
],
forInfoYd4:{
time:'2023-10-20'
},
defaultListYd4: [
{ name: '计划开工日期', prop: 'time' },
{ name: '计划竣工日期', prop: 'operName' },
{ name: '总工期(天)', prop: 'status' },
{ name: '缺陷责任', prop: 'startDate' },
],
forInfoYd5:{
time:'2023-10-20'
},
defaultListYd5: [
{ name: '质量标准', prop: 'time' },
{ name: '质量要求', prop: 'operName' },
{ name: '品牌要求', prop: 'status' },
{ name: '报价中需要注意的其他问题/风险', prop: 'startDate' },
],
defaultList3: [
{ name: '评标程序', prop: 'creditNo' },
{ name: '专家组成', prop: 'operName' },
{ name: '评标原则', prop: 'status' },
{ name: '定标原则', prop: 'startDate' },
{ name: '招标控制价(如有)', prop: 'startDate' },
{ name: '报价上限(如有)', prop: 'startDate' },
],
currentList1: "jd1",
forInfoJd1:{
time:'2023-10-20'
},
defaultListJd1: [
{ name: '标前会议(或者领取投标文件的时间)', prop: 'time' },
{ name: '投标人提出疑问的截止时间', prop: 'operName' },
{ name: '招标人答复疑问的截止时间', prop: 'status' },
{ name: '现场踏勤时间', prop: 'startDate' },
{ name: '招标控制价(如有)', prop: 'startDate' },
{ name: '报价上限(如有)', prop: 'startDate' },
],
forInfoJd2:{
time:'2023-10-20'
},
defaultListJd2: [
{ name: '时间', prop: 'time' },
{ name: '地点', prop: 'operName' },
{ name: '开标时的要求', prop: 'status' },
{ name: '投标有效期', prop: 'startDate' },
],
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
},
}
</script>
<style lang="scss" scoped>
.detail-container {
width: 100%;
box-sizing: border-box;
padding: 0 24px;
background: #ffffff;
.infoTable-title {
font-size: 16px;
font-family: Microsoft YaHei-Bold, Microsoft YaHei;
font-weight: bold;
padding-left: 8px;
border-left: 2px solid #58637B;
color: #000000;
text-shadow: 0px 0px 10px rgba(0, 37, 106, 0.10000000149011612);
margin: 0 0 16px 0;
}
.detail-cont{
padding:16px 0;
::v-deep .el-tabs {
height: 48px;
line-height: 48px;
.el-tabs__nav-wrap::after {
position: static !important;
}
}
}
.detail-cont-tab{
margin-top: 20px;
}
}
</style>
<template>
<div class="feed-summary-container">
<div class="feed-summary-inner">
<div class="left-side-menu">
<project-side-menu></project-side-menu>
</div>
</div>
</div>
</template>
<script>
import ProjectSideMenu from "@/views/projectCostLedger/detail/components/ProjectSideMenu";
export default {
name: "feedSummary",
components: {
ProjectSideMenu
},
data() {
return {
menuTreeList: []
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
},
}
</script>
<style lang="scss" scoped>
.feed-summary-container {
width: 100%;
height: 100%;
.feed-summary-inner {
width: 100%;
height: 100%;
display: flex;
align-items: center;
.left-side-menu {
width: 220px;
min-width: 220px;
height: 100%;
}
}
}
</style>
<template>
<div class="project-menu-item-container">
</div>
</template>
<script>
export default {
name : "projectMenuItem",
data() {
return {
}
},
//可访问data属性
created(){
},
//计算集
computed:{
},
//方法集
methods:{
},
}
</script>
<style lang="scss" scoped>
.project-menu-item-container {
}
</style>
This diff is collapsed.
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