Commit 03a4bb26 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 6bba27e3 c2273ad1
...@@ -105,6 +105,7 @@ public class DataAnalysisComponent { ...@@ -105,6 +105,7 @@ public class DataAnalysisComponent {
throw new ServiceException("数据插入失败!"); throw new ServiceException("数据插入失败!");
} }
file.setFileParseStatus(2); file.setFileParseStatus(2);
file.setFailRemark("");
boolean b = projectFileService.updateById(file); boolean b = projectFileService.updateById(file);
if (!b) { if (!b) {
throw new ServiceException("文件状态更新失败!"); throw new ServiceException("文件状态更新失败!");
......
...@@ -2,6 +2,8 @@ package com.dsk.cscec.domain.vo; ...@@ -2,6 +2,8 @@ package com.dsk.cscec.domain.vo;
import lombok.Data; import lombok.Data;
import java.util.Date;
/** /**
* @author sxk * @author sxk
* @date 2024.03.06 * @date 2024.03.06
...@@ -25,7 +27,10 @@ public class CbProjectHeadInfoVo { ...@@ -25,7 +27,10 @@ public class CbProjectHeadInfoVo {
* 成本阶段(0:标前成本、1:标后成本、2:转固成本) * 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/ */
private Integer cbStage; private Integer cbStage;
/**
* 创建时间
*/
private Date createTime;
/** /**
* 客商名称(客户名称) * 客商名称(客户名称)
*/ */
......
...@@ -218,6 +218,8 @@ public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMappe ...@@ -218,6 +218,8 @@ public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMappe
} }
//更新文件状态 //更新文件状态
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
//场景:若第一次解析失败了,用户未删除失败的文件,又解析一次,这时解析成功了,因此将失败备注置空
projectFile.setFailRemark(null);
Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败"); Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败");
} catch (Exception e) { } catch (Exception e) {
status.setRollbackOnly(); status.setRollbackOnly();
......
...@@ -114,6 +114,8 @@ public class CbProjectExpenseSummaryServiceImpl extends ServiceImpl<CbProjectExp ...@@ -114,6 +114,8 @@ public class CbProjectExpenseSummaryServiceImpl extends ServiceImpl<CbProjectExp
Assert.isTrue(impl.saveBatch(summaryList), "数据插入失败"); Assert.isTrue(impl.saveBatch(summaryList), "数据插入失败");
//更新文件状态 //更新文件状态
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
//场景:若第一次解析失败了,用户未删除失败的文件,又解析一次,这时解析成功了,因此将失败备注置空
projectFile.setFailRemark(null);
Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败"); Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败");
} catch (Exception e) { } catch (Exception e) {
status.setRollbackOnly(); status.setRollbackOnly();
......
...@@ -473,12 +473,13 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -473,12 +473,13 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
} }
} }
//所有文件遍历完后,如果存在解析失败的文件,则项目的解析状态改为解析失败,否则改为解析成功
if (failNum > 0) { if (failNum > 0) {
//如果存在解析失败的文件,则项目的解析状态改为解析失败
log.info("项目台账列表:ID为" + projectRecord.getId() + "的项目解析失败"); log.info("项目台账列表:ID为" + projectRecord.getId() + "的项目解析失败");
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL); projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
baseMapper.updateById(projectRecord); baseMapper.updateById(projectRecord);
} else { } else {
//否则改为解析成功
log.info("项目台账列表:ID为" + projectRecord.getId() + "的项目解析成功"); log.info("项目台账列表:ID为" + projectRecord.getId() + "的项目解析成功");
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS); projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
baseMapper.updateById(projectRecord); baseMapper.updateById(projectRecord);
......
...@@ -168,6 +168,8 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens ...@@ -168,6 +168,8 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens
Assert.isTrue(impl.saveBatch(BeanUtil.copyToList(chidrenList, CbSceneExpenseChildren.class)), "数据插入失败"); Assert.isTrue(impl.saveBatch(BeanUtil.copyToList(chidrenList, CbSceneExpenseChildren.class)), "数据插入失败");
//更新文件状态 //更新文件状态
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
//场景:若第一次解析失败了,用户未删除失败的文件,又解析一次,这时解析成功了,因此将失败备注置空
projectFile.setFailRemark(null);
Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败"); Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败");
} catch (Exception e) { } catch (Exception e) {
status.setRollbackOnly(); status.setRollbackOnly();
......
...@@ -76,6 +76,7 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -76,6 +76,7 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
//解析数据 //解析数据
cbProjectFiles.forEach(cbProjectFile -> { cbProjectFiles.forEach(cbProjectFile -> {
cbProjectFile.setFailRemark(null);
// if (cbProjectFile.getDelFlag() == 1) { // if (cbProjectFile.getDelFlag() == 1) {
// //根据fileId删除相关基础数据,并删除文件 // //根据fileId删除相关基础数据,并删除文件
// baseMapper.delete(new LambdaQueryWrapper<CbSummary>().eq(CbSummary::getCbProjectFileId, cbProjectFile.getId())); // baseMapper.delete(new LambdaQueryWrapper<CbSummary>().eq(CbSummary::getCbProjectFileId, cbProjectFile.getId()));
......
...@@ -5,7 +5,7 @@ VUE_APP_TITLE = 重庆大司空信息科技有限公司 ...@@ -5,7 +5,7 @@ VUE_APP_TITLE = 重庆大司空信息科技有限公司
ENV = 'development' ENV = 'development'
# 数字化经营履约全生命链路管理系统/开发环境 # 数字化经营履约全生命链路管理系统/开发环境
VUE_APP_BASE_API = '/prod-api' VUE_APP_BASE_API = 'http://localhost:9098'
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"author": "若依", "author": "若依",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"dev": "vue-cli-service serve", "dev": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service serve",
"devmac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", "devmac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build:prod": "vue-cli-service build", "build:prod": "vue-cli-service build",
"build:test": "vue-cli-service build --mode test", "build:test": "vue-cli-service build --mode test",
......
import Decimal from "decimal.js";
/**
* 加法
* @param {*} num1
* @param {*} num2
* @returns
*/
export const add = (num1, num2) => {
const flag = (!parseFloat(num1) && parseFloat(num1) != "0") || (!parseFloat(num2) && parseFloat(num2) != "0");
if (flag) throw new Error("传入参数错误,参数不为number");
const decimal1 = new Decimal(num1);
const decimal2 = new Decimal(num2);
return decimal1.plus(decimal2).toString();
};
/**
* 减法
* @param {*} num1
* @param {*} num2
* @returns
*/
export const subtract = (num1, num2) => {
const flag = (!parseFloat(num1) && parseFloat(num1) != "0") || (!parseFloat(num2) && parseFloat(num2) != "0");
const decimal1 = new Decimal(num1);
const decimal2 = new Decimal(num2);
return decimal1.minus(decimal2).toString();
};
/**
* 乘法
* @param {*} num1
* @param {*} num2
* @returns
*/
export const multiply = (num1, num2) => {
const flag = (!parseFloat(num1) && parseFloat(num1) != "0") || (!parseFloat(num2) && parseFloat(num2) != "0");
const decimal1 = new Decimal(num1);
const decimal2 = new Decimal(num2);
return decimal1.times(decimal2).toString();
};
/**
* 除法
* @param {*} num1
* @param {*} num2
* @returns
*/
export const divide = (num1, num2) => {
const flag = (!parseFloat(num1) && parseFloat(num1) != "0") || (!parseFloat(num2) && parseFloat(num2) != "0");
const decimal1 = new Decimal(num1);
const decimal2 = new Decimal(num2);
return decimal1.dividedBy(decimal2).toString();
};
<template>
<el-dialog title="填写实际成本" :visible="comDialogStatus" class="add-actual-cost-container">
</el-dialog>
</template>
<script>
export default {
name: "AddActualCost",
props: {
dialogStatus: {
type: Boolean,
default: false
}
},
model: {
prop: "dialogStatus",
event: "dialogStatusChange"
},
watch: {
dialogStatus(newValue) {
this.comDialogStatus = newValue;
}
},
data() {
return {
comDialogStatus: this.dialogStatus
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
},
}
</script>
<style lang="scss" scoped>
.add-actual-cost-container {
::v-deep .el-dialog {
margin-top: 0px !important;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 4px;
width: 480px;
.el-dialog__header {
height: 56px;
padding: 0px 20px;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #eeeeee;
.el-dialog__title {
font-size: 16px;
font-weight: bold;
color: #232323;
}
.el-dialog__headerbtn {
position: static;
width: 16px;
height: 16px;
.el-dialog__close {
font-size: 16px;
}
}
}
.el-dialog__body {
padding: 0px;
min-height: 120px;
padding: 24px 20px;
box-sizing: border-box;
}
}
}
</style>
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
<table-list-com :tableData="tableDataList" :formColum="formColum" v-else-if="!tableLoading" :maxHeight="true" :tableDataTotal="total" <table-list-com :tableData="tableDataList" :formColum="formColum" v-else-if="!tableLoading" :maxHeight="true" :tableDataTotal="total"
:paging="false"> :paging="false">
<template slot="action-field-bar" slot-scope="scope"> <template slot="action-field-bar" slot-scope="scope">
<div class="project-action-field-bar" v-if="scope.row.id == '0'"> <div class="project-action-field-bar" v-if="scope.row.id != '0'">
<span class="push-project">推送工程量</span> <span class="push-project">推送工程量</span>
</div> </div>
<span v-else>-</span> <span v-else>-</span>
...@@ -48,6 +48,10 @@ ...@@ -48,6 +48,10 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 填写实际成本触发 -->
<add-actual-cost v-model="showAddActualCost"></add-actual-cost>
</div> </div>
</template> </template>
<script> <script>
...@@ -56,9 +60,25 @@ import { getFeedSummaryMenuTreeApi, getFeedSummaryMonthListApi, getFeedSummaryLi ...@@ -56,9 +60,25 @@ import { getFeedSummaryMenuTreeApi, getFeedSummaryMonthListApi, getFeedSummaryLi
import DskTableHeaderSetting from "@/components/DskTableHeaderSetting"; import DskTableHeaderSetting from "@/components/DskTableHeaderSetting";
import DskSkeleton from "@/components/DskSkeleton"; import DskSkeleton from "@/components/DskSkeleton";
import TableListCom from "@/components/TableListCom"; import TableListCom from "@/components/TableListCom";
import AddActualCost from "./components/AddActualCost";
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import dayjs from "dayjs"; import dayjs from "dayjs";
import { cloneDeep } from "lodash-es"; import { cloneDeep } from "lodash-es";
import { add } from "@/utils/decimal";
// 需要统计的字段名
const statisticsPropNames = [
"guidePrice",
"bidUnitPrice",
"unitPriceDifference",
"quantity",
"combinedPrice",
"combinedPriceTax",
"quantities",
"totalQuantities",
"purchaseUnitPrice"
];
export default { export default {
name: "feedSummary", name: "feedSummary",
props: { props: {
...@@ -92,7 +112,8 @@ export default { ...@@ -92,7 +112,8 @@ export default {
ProjectSideMenu, ProjectSideMenu,
DskTableHeaderSetting, DskTableHeaderSetting,
TableListCom, TableListCom,
DskSkeleton DskSkeleton,
AddActualCost
}, },
data() { data() {
return { return {
...@@ -156,18 +177,8 @@ export default { ...@@ -156,18 +177,8 @@ export default {
// 数据列表 // 数据列表
tableDataList: [], tableDataList: [],
statisticsParentName: ["劳务分包工程", "专业分包工程"], statisticsParentName: ["劳务分包工程", "专业分包工程"],
// 需要统计的字段名 // 填写实际成本弹窗
statisticsPropNames: [ showAddActualCost: false
"guidePrice",
"bidUnitPrice",
"unitPriceDifference",
"quantity",
"combinedPrice",
"combinedPriceTax",
"quantities",
"totalQuantities",
"purchaseUnitPrice"
]
}; };
}, },
//可访问data属性 //可访问data属性
...@@ -251,7 +262,8 @@ export default { ...@@ -251,7 +262,8 @@ export default {
const _temp = list.data; const _temp = list.data;
// 计算总和 // 计算总和
if (this.hasTarget) { if (this.hasTarget) {
const row = this.countRowParams(_temp, this.statisticsPropNames); const row = this.countRowParams(_temp, statisticsPropNames);
_temp.unshift(row);
} }
this.tableDataList = _temp; this.tableDataList = _temp;
this.total = _temp.length; this.total = _temp.length;
...@@ -262,7 +274,7 @@ export default { ...@@ -262,7 +274,7 @@ export default {
this.tableLoading = false; this.tableLoading = false;
} }
}, },
countRowParams(arraylist = [], statisticsPropNames) { countRowParams(arraylist = [], _statisticsPropNames) {
if (arraylist.length) { if (arraylist.length) {
const _template = {}; const _template = {};
const _temp = cloneDeep(arraylist[0]); const _temp = cloneDeep(arraylist[0]);
...@@ -272,17 +284,24 @@ export default { ...@@ -272,17 +284,24 @@ export default {
if (key == "id") { if (key == "id") {
_template[key] = "0"; _template[key] = "0";
continue; continue;
} else if (key == "cbSubjectName") {
_template[key] = "合计";
continue;
} }
_template[key] = ""; _template[key] = "";
} }
console.log(_template);
// 循环统计 需要统计的列 总数 // 循环统计 需要统计的列 总数
for (const prop of statisticsPropNames) { for (const prop of _statisticsPropNames) {
const sum = arraylist.reduce((pre, current, index) => { const sum = arraylist.reduce((pre, current, index) => {
const before = Object.prototype.toString.call(pre) == "[object Object]" ? pre[prop] : parseFloat(pre) ? pre : 0; const before = Object.prototype.toString.call(pre) == "[object Object]" ? pre[prop] ? pre[prop] : 0 : parseFloat(pre) ? pre : 0;
const after = Object.prototype.toString.call(current) == "[object Object]" ? current[prop] : parseFloat(current) ? current : 0; const after = Object.prototype.toString.call(current) == "[object Object]" ? current[prop] ? current[prop] : 0 : parseFloat(current) ? current : 0;
return add(before, after);
}, 0); }, 0);
// 对应key 赋值结果
_template[prop] = sum;
} }
return _template;
} }
}, },
async getFeedSummaryMenuTree(params) { async getFeedSummaryMenuTree(params) {
...@@ -374,7 +393,7 @@ export default { ...@@ -374,7 +393,7 @@ export default {
}, },
// 填写或修改新的 成本月份 // 填写或修改新的 成本月份
fillActualCost() { fillActualCost() {
this.showAddActualCost = true;
} }
}, },
} }
......
...@@ -193,8 +193,8 @@ export default { ...@@ -193,8 +193,8 @@ export default {
const detail = await getProjectDetailApi(projectId); const detail = await getProjectDetailApi(projectId);
if (detail.code == 200 && detail.data) { if (detail.code == 200 && detail.data) {
if (detail.data.id) detail.data["projectId"] = detail.data.id; if (detail.data.id) detail.data["projectId"] = detail.data.id;
detail.data["projectId"] = "1754425038355890177"; // detail.data["projectId"] = "1754425038355890177";
detail.data["cbStage"] = 0; // detail.data["cbStage"] = 0;
this.detailInfo = detail.data; this.detailInfo = detail.data;
} }
} catch (error) { } catch (error) {
......
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