Commit 1fa13cdf 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 bb9713fb 7d5aafc3
......@@ -48,7 +48,7 @@ public class DataAnalysisComponent {
* 工料汇总数据解析
*/
@Async
public void quantitySummaryDataAnalysis(CbProjectBaseBo bo) throws Exception {
public void quantitySummaryDataAnalysis(CbProjectBaseBo bo){
//查询工料汇总导入文件
List<CbProjectFile> fileList = projectFileService.selectAnalysisList(bo.getProjectId(), CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY, bo.getCbStage());
......@@ -59,17 +59,13 @@ public class DataAnalysisComponent {
//文件下载
InputStream inputStream = ossService.downFileIO(file.getFileOssId());
if (ObjectUtil.isNull(inputStream)) {
file.setFileParseStatus(3);
file.setFailRemark("文件数据不存在");
projectFileService.updateById(file);
addFileErrorMsg(file, "文件数据不存在");
break;
}
//解析数据
List<CbQuantitySummary> importList = new ExcelUtils<>(CbQuantitySummary.class).importExcelAllSheet(inputStream, 1);
if (importList.isEmpty()) {
file.setFileParseStatus(3);
file.setFailRemark("表格中不存在待导入数据!");
projectFileService.updateById(file);
addFileErrorMsg(file, "表格中不存在待导入数据");
break;
}
List<CbQuantitySummary> quantitySummaryList = importList.stream().parallel()
......@@ -80,7 +76,8 @@ public class DataAnalysisComponent {
item.setCbProjectFileId(file.getId());
}).collect(Collectors.toList());
if (quantitySummaryList.isEmpty()) {
throw new ServiceException("表格中不存在有效数据!");
addFileErrorMsg(file, "表格中不存在有效数据");
break;
}
transactionTemplate.execute(status -> {
......@@ -114,18 +111,20 @@ public class DataAnalysisComponent {
}
} catch (Exception e) {
status.setRollbackOnly();
file.setFileParseStatus(3);
file.setFailRemark(e.getMessage());
projectFileService.updateById(file);
addFileErrorMsg(file, e.getMessage());
}
return Boolean.TRUE;
});
} catch (Exception e) {
file.setFileParseStatus(3);
file.setFailRemark(e.getMessage());
projectFileService.updateById(file);
addFileErrorMsg(file, e.getMessage());
}
}
}
private void addFileErrorMsg(CbProjectFile file, String errorMsg) {
file.setFileParseStatus(3);
file.setFailRemark(errorMsg);
projectFileService.updateById(file);
}
}
......@@ -21,6 +21,11 @@ public class CbProjectHeadInfoVo {
* IPM项目编码
*/
private String ipmProjectNo;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 客商名称(客户名称)
*/
......
......@@ -44,10 +44,10 @@ public class CbProjectOtherImportListener extends AnalysisEventListener<CbProjec
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
// }
String number = importVo.getNumber();
if (StrUtil.isEmpty(number)) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
}
// if (StrUtil.isEmpty(number)) {
// failureNum++;
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
// }
importVo.setCbProjectFileId(fileId);
Boolean numberMatch = false;
......@@ -57,10 +57,11 @@ public class CbProjectOtherImportListener extends AnalysisEventListener<CbProjec
if (ReUtil.isMatch(regex, number) || ReUtil.isMatch(pattern, number)||ReUtil.isMatch(pattern3, number)) {
numberMatch = true;
} else {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号格式错误");
}
// else {
// failureNum++;
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号格式错误");
// }
if(numberMatch){
if (ReUtil.isMatch(regex, number)){
String replace = number.replaceAll("[\\\\((]|[\\\\))]", "");
......@@ -69,8 +70,8 @@ public class CbProjectOtherImportListener extends AnalysisEventListener<CbProjec
}else{
importVo.setDealWithNumber(importVo.getNumber());
}
dataList.add(importVo);
}
dataList.add(importVo);
}
@Override
......
......@@ -226,19 +226,19 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
String number = importVo.getNumber();
CbProjectOther cbProjectOther = new CbProjectOther();
BeanUtil.copyProperties(importVo, cbProjectOther);
//保存一级节点
if (ReUtil.isMatch(firstPattern, number) || ReUtil.isMatch(pattern3, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
cbProjectOther.setParentId(rootMeasuresId);
} else if (ReUtil.isMatch(secondPattern, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
// 根据no查询父级节点
CbProjectOther parentCbCostMeasure = getCbProjectOther(rootMeasuresId, number, projectId, cbStage);
String[] split = number.split("\\.");
cbProjectOther.setParentId(parentCbCostMeasure.getId());
}
if (ObjectUtil.isNotEmpty(cbProjectOther.getDealWithNumber())) {
String newNo = String.valueOf(rootMeasuresId).concat(".").concat(cbProjectOther.getDealWithNumber());
cbProjectOther.setDealWithNumber(newNo);
}
cbProjectOther.setProjectId(projectId);
cbProjectOther.setCbStage(cbStage);
this.save(cbProjectOther);
......@@ -246,6 +246,8 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
}
}
file.setFileParseStatus(2);
projectFileService.updateById(file);
}
}
......@@ -279,6 +281,8 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
projectExpenseSummaryService.save(projectExpenseSummary);
}
}
file.setFileParseStatus(2);
projectFileService.updateById(file);
}
/**
......
......@@ -5,10 +5,10 @@ import request from '@/utils/request';
* @param {*} params
* @returns
*/
export const getProjectDetailApi = (params = {}) => request({
url: "",
export const getProjectDetailApi = (projectId) => request({
url: `/cbProjectRecord/getCbProjectHeadInfo/${projectId}`,
method: "get",
params
params: {}
});
//校验项目编码是否存在
......@@ -60,7 +60,7 @@ export function getProjectFileUploadDetail(projectId) {
//根据项目文件导入数据
export function importData(projectId) {
return request({
url: '/cbProjectRecord/importData/'+projectId,
url: '/cbProjectRecord/importData/' + projectId,
method: 'post',
});
}
......@@ -70,7 +70,7 @@ export function getDraftDialogList(data) {
return request({
url: '/cbProjectRecord/getDraftDialogList',
method: 'get',
params:data
params: data
});
}
......@@ -193,7 +193,7 @@ export function saveBatch(data) {
return request({
url: '/cb/cost/measures/saveBatch',
method: 'post',
data:data,
data: data,
});
}
......@@ -265,7 +265,7 @@ export function cbDirectExpenseAdd(data) {
return request({
url: '/cbDirectExpense/addExpense',
method: 'post',
data:data,
data: data,
});
}
......
......@@ -92,7 +92,7 @@ export default {
tabChoose(item) {
if (item.value == this.currentValue) return;
this.$emit("currentTabChange", item.value);
this.$emit("tabToggle", item.value);
this.$emit("tabToggle", item.value, item);
this.initSlidingBar();
}
},
......
......@@ -37,13 +37,13 @@
<!-- 有自定义插槽 -->
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item">
<!-- 默认取值 -->
{{ scope.row[item.prop] || scope.row[item.prop] == '0' ? scope.row[item.prop] : '-' }}
{{ scope.row[item.prop] ? scope.row[item.prop] : '-' }}
</slot>
<!-- 操作栏 不需要设置slot-->
<slot v-else-if="item.prop == 'action-field-bar'" name="action-field-bar" :row="scope.row" :index="scope.$index" :data="item"></slot>
<!-- 没有插槽 -->
<div v-else>
{{ scope.row[item.prop] || scope.row[item.prop] == '0' ? scope.row[item.prop] : '-' }}
{{ scope.row[item.prop] ? scope.row[item.prop] : '-' }}
</div>
</template>
</el-table-column>
......
......@@ -64,7 +64,7 @@ export default {
.cooperation-desk-account-project,
.cooperation-desk-account-enterprise {
overflow: hidden;
height: calc(100% - 48px);
height: calc(100%);
}
}
}
......
......@@ -59,7 +59,7 @@ export default {
.cooperation-desk-account-project,
.cooperation-desk-account-enterprise {
overflow: hidden;
height: calc(100% - 48px);
height: calc(100%);
}
}
}
......
......@@ -2,8 +2,8 @@
<div class="feed-summary-container">
<div class="feed-summary-inner">
<div class="left-side-menu">
<project-side-menu :menuTree="menuTreeList" :menuOptions="menuOptions" :unique-opened="false" :default-active="currentNodeName"
@select="menuSelect">
<project-side-menu ref="projectSideMenu" :menuTree="menuTreeList" :menuOptions="menuOptions" :unique-opened="false"
:default-active="currentNodeName" @select="menuSelect">
<template slot="房建类成本科目-1">
<img src="@/assets/images/projectCostLedger/icon_cost_detail_2.svg" alt="">
<div class="project-sub-menu-title-text">房建类成本科目</div>
......@@ -28,7 +28,7 @@
<!-- 实体工程材料单位换算 -->
<el-button type="primary" size="medium" class="unit-conversion-btn" v-if="currentParentName.indexOf('实体工程材料') != -1">单位换算</el-button>
<!-- 填写实际成本 -->
<el-button type="primary" size="medium" class="actual-cost-btn" v-else>填写实际成本</el-button>
<el-button type="primary" size="medium" class="actual-cost-btn" v-else @click="fillActualCost">填写实际成本</el-button>
<!-- 表头设置组件 -->
<dsk-table-header-setting :settingList="formColum" @settingChange="settingChange"></dsk-table-header-setting>
</div>
......@@ -39,9 +39,10 @@
<table-list-com :tableData="tableDataList" :formColum="formColum" v-else-if="!tableLoading" :maxHeight="true" :tableDataTotal="total"
:paging="false">
<template slot="action-field-bar" slot-scope="scope">
<div class="project-action-field-bar">
<div class="project-action-field-bar" v-if="scope.row.id">
<span class="push-project">推送工程量</span>
</div>
<span v-else>-</span>
</template>
</table-list-com>
</div>
......@@ -108,7 +109,7 @@ export default {
// 列表表头
formColum: [
{ label: '序号', prop: "staticSerialNumber", type: "index", lock: true, width: "53", fixed: false, uid: v4() },
{ label: '成本科目', prop: "cbSubjectName", width: "137", uid: v4(),slot : true },
{ label: '成本科目', prop: "cbSubjectName", width: "137", uid: v4(), slot: true },
{ label: '公司编码', prop: "companyNo", width: "137", uid: v4() },
{ label: '集团编码', prop: "orgNo", width: "137", uid: v4() },
{ label: '名称', prop: "cbName", width: "232", uid: v4() },
......@@ -153,7 +154,8 @@ export default {
// 当前选中的成本科目
currentNodeName: "",
// 数据列表
tableDataList: []
tableDataList: [],
statisticsParentName: ["劳务分包工程", "专业分包工程"]
};
},
//可访问data属性
......@@ -162,7 +164,9 @@ export default {
},
//计算集
computed: {
hasTarget() {
return this.statisticsParentName.includes(this.currentParentName);
}
},
//方法集
methods: {
......@@ -179,14 +183,20 @@ export default {
await this.initDefaultSetting();
} catch (error) {
console.log(error);
} finally {
this.tableLoading = false;
}
},
async initDefaultSetting() {
try {
const defaultCurrent = this.findMenuNode(this.menuTreeList, "结构劳务分包");
await this.$nextTick();
const menus = this.$refs["projectSideMenu"].getResultMenuList();
const defaultCurrent = this.findMenuNode(menus, "结构劳务分包");
// 默认选中结构劳务分包
if (defaultCurrent) {
this.currentNodeName = defaultCurrent.name;
this.currentNodeName = defaultCurrent.nodeName;
const parentName = defaultCurrent.parent ? this.getCurrentType(defaultCurrent.parent) : defaultCurrent.name;
if (parentName) this.currentParentName = parentName;
const params = this.createRequestConditions();
await this.getFeedSummaryList(params);
}
......@@ -212,11 +222,11 @@ export default {
includeNowMonth(time) {
return this.originMonthList.includes(time);
},
findMenuNode(tree, nodeName) {
findMenuNode(tree, nodeName, targetName = "nodeName") {
for (const item of tree) {
if (item.name == nodeName) return item;
if (item[targetName] == nodeName) return item;
if (item.children instanceof Array) {
const result = this.findMenuNode(item.children, nodeName);
const result = this.findMenuNode(item.children, nodeName, targetName);
if (result) return result;
}
}
......@@ -226,15 +236,31 @@ export default {
this.tableLoading = true;
const list = await getFeedSummaryListApi(params);
if (list.code == 200 && list.data instanceof Array) {
this.tableDataList = list.data;
this.total = list.data.length;
const _temp = list.data;
// 计算总和
if (this.hasTarget) {
const row = this.countRowParams(_temp);
}
this.tableDataList = _temp;
this.total = _temp.length;
}
} catch (error) {
console.log(error);
} finally {
this.tableLoading = false;
}
},
countRowParams(arraylist = []) {
if (arraylist.length) {
const _template = {};
const _temp = cloneDeep(arraylist[0]);
const keys = Object.keys(_temp);
for (const key of keys) {
_template[key] = "";
}
console.log(_template);
}
},
async getFeedSummaryMenuTree(params) {
try {
const result = await getFeedSummaryMenuTreeApi(params);
......@@ -317,6 +343,10 @@ export default {
}
},
// 填写或修改新的 成本月份
fillActualCost() {
}
},
}
</script>
......
......@@ -55,12 +55,11 @@ export default {
//方法集
methods: {
init(current) {
if (!current) return;
if (this?.comBreadCrumbTree?.length) {
const _temp = cloneDeep(this.comBreadCrumbTree);
// 根节点path 为root
_temp[0].path = "root";
this.currentBreadCurmbList = this.createBreadCrumb(current, _temp);
this.currentBreadCurmbList = current ? this.createBreadCrumb(current, _temp) : this.createBreadCrumb("root", _temp);
}
},
createBreadCrumb(current, data) {
......
......@@ -3,20 +3,20 @@
<div class="project-cost-ledger-detail-header-inner">
<project-bread-crumb :current="current" :breadCrumbTree="breadCrumbTree" @breadCrumbTrigger="breadCrumbTrigger"></project-bread-crumb>
<!-- 项目名称 -->
<div class="project-detail-header-name">宝安中学(集团)初中部改扩建工程施工总承包(二次公告)</div>
<div class="project-detail-header-name">{{comDetailInfo.projectName ? comDetailInfo.projectName : "-"}}</div>
<!-- 项目信息 -->
<div class="project-detail-plate">
<div class="detail-plate-item project-code" v-if="isShowProjectCode.includes(current)">
<span class="plate-item-name">项目编码:</span>
<span>AB21131212131</span>
<span>{{comDetailInfo.ipmProjectNo ? comDetailInfo.ipmProjectNo : "-"}}</span>
</div>
<div class="detail-plate-item">
<span class="plate-item-name">客户名称:</span>
<span>广联达科技股份有限公司天津分公司天津分公司</span>
<span>{{comDetailInfo.merchantName ? comDetailInfo.merchantName : "-"}}</span>
</div>
<div class="detail-plate-item">
<span class="plate-item-name">签订单位:</span>
<span>中建一局集团第二建筑有限公司</span>
<span>{{comDetailInfo.signingUnit ? comDetailInfo.signingUnit : "-"}}</span>
</div>
</div>
</div>
......@@ -28,14 +28,26 @@ export default {
name: "projectDetailHeader",
props: {
current: String,
breadCrumbTree: Array
breadCrumbTree: Array,
detailInfo: {
type: Object,
default: () => ({})
}
},
components: {
ProjectBreadCrumb
},
watch: {
detailInfo: {
handler(newValue) {
this.comDetailInfo = newValue ? newValue : {};
}
}
},
data() {
return {
isShowProjectCode: ["basicEngineeringInformation", "directCost", "feedSummary", "cost"],
comDetailInfo: this.detailInfo ? this.detailInfo : {}
};
},
//可访问data属性
......
......@@ -101,6 +101,10 @@ export default {
},
//方法集
methods: {
// 获取最终菜单结构
getResultMenuList() {
return this.tempMenuTree;
},
// 展开所有指定层级的菜单 默认二级
openTargetAllSubMenu(openeds = [], level = 2) {
// 组件外传入了值 使用传入值,否则默认获取二级菜单打开二级
......@@ -111,7 +115,7 @@ export default {
// 递归查找当前二级目录index
const _tempTree = this.tempMenuTree;
const result = this.findTargetLevelIndex(_tempTree, 2, []);
this.comDefaultOpeneds = result;
// this.comDefaultOpeneds = result;
}
},
findTargetLevelIndex(data = [], level = level, result = []) {
......
<template>
<div class="project-cost-ledger-detail">
<div class="project-cost-ledger-detail-inner">
<project-detail-header :current="current" :breadCrumbTree="createProjectBreadCrumbTree"></project-detail-header>
<project-detail-header :detail-info="detailInfo" :current="current"
:breadCrumbTree="createProjectBreadCrumbTree(toggleTabs)"></project-detail-header>
<!-- tab切换栏 -->
<dsk-tab-toggle v-model="current" :tabs="toggleTabs" @tabToggle="tabToggle" :disabled="tabsDisabled"></dsk-tab-toggle>
<!-- tab切换组件容器 -->
......@@ -65,11 +66,7 @@ export default {
projectId: "",
current: "",
// 详情信息变量
detailInfo: {
projectId: "1754425038355890177",
cbStage: 0,
cbType: 1
},
detailInfo: {},
tabsDisabled: false,
toggleTabs: [
{
......@@ -80,31 +77,37 @@ export default {
{
value: "directCost",
name: "直接费成本",
cbType: 0,
id: v4()
},
{
value: "feedSummary",
name: "工料汇总",
cbType: 1,
id: v4()
},
{
name: "措施项目",
value: "measureItem",
cbType: 2,
id: v4()
},
{
name: "其他项目",
value: "otherItems",
cbType: 3,
id: v4()
},
{
name: "现场经费",
value: "fieldExpenses",
cbType: 4,
id: v4()
},
{
name: "成本汇总",
value: "cost",
cbType: 5,
id: v4()
},
{
......@@ -125,9 +128,22 @@ export default {
},
//计算集
computed: {
createProjectBreadCrumbTree() {
},
//方法集
methods: {
async init() {
try {
// 监听组件emit事件订阅 需要刷新数据
this.$on("refreshDetail", this.getProjectDetail);
await this.getProjectQuery();
} catch (error) {
}
},
createProjectBreadCrumbTree(tabs) {
try {
const _tempArray = cloneDeep(this.toggleTabs.map(item => {
const _tempArray = cloneDeep(tabs.map(item => {
item.path = item.value;
item.breadcrumbName = item.name;
return item;
......@@ -141,34 +157,21 @@ export default {
triggerHandle: false,
childrenBreadCrumb: _tempArray
}],
};
return [_temp];
} catch (error) {
console.log(error);
}
}
},
//方法集
methods: {
async init() {
try {
// 监听组件emit事件订阅 需要刷新数据
this.$on("refreshDetail", this.getProjectDetail);
await this.getProjectQuery();
} catch (error) {
}
},
async getProjectQuery() {
try {
this.tabsDisabled = true;
const { query } = this.$route;
// if (!query.projectId) {
// this.$message.error("缺少项目id");
// this.tabsDisabled = true;
// return;
// };
if (!query.projectId) {
this.$message.error("缺少项目id");
this.tabsDisabled = true;
return;
};
this.projectId = query.projectId;
// 获取详情 保证详情获取完毕 再执行tab命中 进行生命周期
await this.getProjectDetail(query.projectId);
......@@ -178,6 +181,7 @@ export default {
// 默认命中工程项目信息
this.current = "basicEngineeringInformation";
};
this.setCbType(this.current);
this.tabsDisabled = false;
} catch (error) {
console.log(error);
......@@ -185,14 +189,36 @@ export default {
},
async getProjectDetail(projectId) {
try {
const detail = await getProjectDetailApi(projectId);
if (detail.code == 200 && detail.data) {
if (detail.data.id) detail.data["projectId"] = detail.data.id;
detail.data["projectId"] = "1754425038355890177";
detail.data["cbStage"] = 0;
this.detailInfo = detail.data;
}
} catch (error) {
console.log(error);
}
},
getCurrentTab(current) {
if (current) {
const result = this.toggleTabs.find(item => item.value == current);
return result;
}
},
setCbType(current) {
if (!current) {
delete this.detailInfo["cbType"];
return;
}
const _temp = this.getCurrentTab(current);
if (_temp && (_temp.cbType ?? false)) {
this.$set(this.detailInfo, "cbType", _temp.cbType);
}
},
// 当前命中的current
tabToggle(value) {
tabToggle(value, valueCurrentObj) {
this.setCbType(value);
}
},
}
......
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