Commit 42ff28d0 authored by Administrator's avatar Administrator

Merge remote-tracking branch 'origin/V20231129-中建一局二公司' into V20231129-中建一局二公司

parents 3478638a 1548dd20
......@@ -3,6 +3,7 @@ package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
......@@ -83,9 +84,9 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
// cbProjectFileMapper.removeById(cbProjectFile.getId());
// } else {
try {
if (cbProjectFile.getFileName().equals("成本汇总项目结构汇总")) {
if (FileNameUtil.getPrefix(cbProjectFile.getFileName()).equals("成本汇总项目结构汇总")) {
saveCbSummaryProject(projectId, cbProjectFile);
} else if (cbProjectFile.getFileName().equals("成本汇总按成本科目")) {
} else if (FileNameUtil.getPrefix(cbProjectFile.getFileName()).equals("成本汇总按成本科目")) {
saveCbSummaryCostAccount(projectId, cbProjectFile);
} else {
throw new ServiceException("文件名错误");
......
......@@ -262,6 +262,17 @@ export const updateFeedSummaryRowsApi = (data) => request({
data
});
/**
* 推送工程用量
* @param {*} data
* @returns
*/
export const pushFeedSummaryRowsApi = (data) => request({
url: "/cb/quantity/summary/pushData",
method: "put",
data
});
//工程项目信息
......
......@@ -315,10 +315,11 @@ export default {
.el-table__fixed-right-patch {
width: 16px !important;
z-index: 9;
top: 0px;
background: #f0f3fa;
border: 1px solid #e6eaf1;
border-left: unset;
border-bottom: unset;
border-top: unset;
}
// 自动适配下 减去滚动条高度
.el-table__fixed {
......
......@@ -6,12 +6,13 @@ import Decimal from "decimal.js";
* @param {*} num2
* @returns
*/
export const add = (num1, num2) => {
export const add = (num1, num2, digit = 9, omit = false) => {
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();
const result = decimal1.plus(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
};
/**
......@@ -20,11 +21,13 @@ export const add = (num1, num2) => {
* @param {*} num2
* @returns
*/
export const subtract = (num1, num2) => {
export const subtract = (num1, num2, digit = 9, omit = false) => {
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.minus(decimal2).toString();
const result = decimal1.minus(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
};
/**
......@@ -33,11 +36,13 @@ export const subtract = (num1, num2) => {
* @param {*} num2
* @returns
*/
export const multiply = (num1, num2) => {
export const multiply = (num1, num2, digit = 9, omit = false) => {
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.times(decimal2).toString();
const result = decimal1.times(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
};
/**
......@@ -46,9 +51,11 @@ export const multiply = (num1, num2) => {
* @param {*} num2
* @returns
*/
export const divide = (num1, num2) => {
export const divide = (num1, num2, digit = 9, omit = false) => {
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.dividedBy(decimal2).toString();
const result = decimal1.dividedBy(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
};
......@@ -44,7 +44,6 @@
placeholder="起始时间"
v-model="startTime"
@change="startChangeTime"
:clearable="false"
:picker-options="{
start: '00:00',
step: '01:00',
......@@ -55,7 +54,6 @@
<el-time-select
placeholder="结束时间"
v-model="endTime"
:clearable="false"
:picker-options="{
start: '00:00',
step: '01:00',
......@@ -69,9 +67,11 @@
<div class="m-main">
<div class="main-item">
<div class="label">接收方式</div>
<!--<el-radio v-model="queryParams.radio" label="1">全部</el-radio>-->
<el-radio v-model="queryParams.receiveMode" label="0">手机短信</el-radio>
<!--<el-radio v-model="queryParams.radio" label="3">PC</el-radio>-->
<el-radio-group v-model="queryParams.receiveMode">
<!--<el-radio v-model="queryParams.radio" label="1">全部</el-radio>-->
<el-radio label="0" @click.native.prevent="clickRadio()">手机短信</el-radio>
<!--<el-radio v-model="queryParams.radio" label="3">PC</el-radio>-->
</el-radio-group>
</div>
<div class="main-item" style="line-height: 32px;">
<div class="label">手机号码</div>
......@@ -177,6 +177,9 @@
this.endTime = ""
},
handleAdd(){
if(this.queryParams.receiveMode === '0' && !this.queryParams.phones){
return this.$message.warning('手机号码不能为空');
}
let params={
pushFrequency:Number(this.queryParams.pushFrequency),
riskType:'',
......@@ -220,6 +223,9 @@
changeTime(val){
console.log(val)
},
clickRadio(){
this.queryParams.receiveMode = this.queryParams.receiveMode === '0' ? '1' : '0'
},
}
}
</script>
......
<template>
<el-dialog :visible.sync="dialogVisible" width="720px" append-to-body class="dialogVisible" title="单位换算">
<el-tabs v-model="currentList" @tab-click="handleClickTab">
<el-tab-pane
:key="index"
v-for="(item, index) in toggleTabs"
:label="item.name"
:name="item.value"
>
{{item.content}}
</el-tab-pane>
<div class="detail-cont-tab">
<div class="select">
<el-select v-model="type1" placeholder="请选择">
<el-option v-for="(item,index) in typeList" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
<i class="el-icon-sort icon"></i>
<el-select v-model="type2" placeholder="请选择">
<el-option v-for="(item,index) in typeList" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
</div>
<el-table
:data="tableData"
default-expand-all
border
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="50">
</el-table-column>
<el-table-column label="序号" width="50" align="left">
<template slot-scope="scope">
<span>{{scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="成本科目" width="190" prop="cbSubjectName"></el-table-column>
<el-table-column label="物料验收系统本月用料" width="195">
<template slot-scope="scope">
<span v-if="scope.row.quantities">{{scope.row.quantities}} {{scope.row.quantitiesUnit}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="换算后本月用料" prop="hsyl"></el-table-column>
</el-table>
</div>
</el-tabs>
<div slot="footer" class="dialog-footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary">保存结果</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: "unitConversion",
props: {
isVisible: {
type: Boolean,
default: false
},
dataList: {
type: Array,
default: () => []
},
},
data() {
return {
dialogVisible:this.isVisible,
currentList: "type1",
toggleTabs:[
{
value: "type1",
name: "长度",
},
{
value: "type2",
name: "面积",
},
{
value: "type3",
name: "重量",
},
{
value: "type4",
name: "体积",
},
// {
// value: "type4",
// name: "质量",
// },
// {
// value: "type5",
// name: "密度",
// },
],
type1:'',
type2:'',
typeList:[
{
dictLabel:'千米',
dictValue:'km'
},
{
dictLabel:'米',
dictValue:'m'
},
{
dictLabel:'分米',
dictValue:'dm'
},
{
dictLabel:'厘米',
dictValue:'cm'
},
{
dictLabel:'毫米',
dictValue:'mm'
},
{
dictLabel:'微米',
dictValue:'μm'
},
],
tableData:this.dataList,
tableList:[]
};
},
//可访问data属性
created() {
console.log(this.dataList)
},
//计算集
computed: {
},
//方法集
methods: {
handleClose () {
this.$emit('refresh')
},
handleClickTab(v){
this.type1='';
this.type2='';
if(v.label === '长度'){
this.typeList=[
{
dictLabel:'千米',
dictValue:'km'
},
{
dictLabel:'米',
dictValue:'m'
},
{
dictLabel:'分米',
dictValue:'dm'
},
{
dictLabel:'厘米',
dictValue:'cm'
},
{
dictLabel:'毫米',
dictValue:'mm'
},
{
dictLabel:'微米',
dictValue:'μm'
},
]
}
if(v.label === '面积'){
this.typeList=[
{
dictLabel:'平方千米',
dictValue:'km²'
},
{
dictLabel:'公顷',
dictValue:'ha'
},
{
dictLabel:'公亩',
dictValue:'a'
},
{
dictLabel:'平方米',
dictValue:'m²'
},
{
dictLabel:'平方分米',
dictValue:'dm²'
},
{
dictLabel:'平方厘米',
dictValue:'cm²'
},
{
dictLabel:'平方毫米',
dictValue:'mm²'
},
]
}
if(v.label === '体积'){
this.typeList=[
{
dictLabel:'吨',
dictValue:'T'
},
{
dictLabel:'千克',
dictValue:'kg'
},
{
dictLabel:'克',
dictValue:'g'
},
]
}
if(v.label === '体积'){
this.typeList=[
{
dictLabel:'立方千米',
dictValue:'km³'
},
{
dictLabel:'立方米',
dictValue:'m³'
},
{
dictLabel:'立方分米',
dictValue:'dm³'
},
{
dictLabel:'立方厘米',
dictValue:'cm³'
},
{
dictLabel:'立方毫米',
dictValue:'mm³'
},
{
dictLabel:'升',
dictValue:'L'
},
{
dictLabel:'分升',
dictValue:'dL'
},
{
dictLabel:'厘升',
dictValue:'cL'
},
{
dictLabel:'毫升',
dictValue:'mL'
},
{
dictLabel:'微升',
dictValue:'μL'
},
]
}
},
handleSelectionChange(val) {
console.log(val)
this.tableList=val;
}
},
}
</script>
<style lang="scss" scoped>
.dialogVisible{
::v-deep .el-dialog {
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
margin-top:0 !important;
.el-dialog__body{
flex:1;
overflow: auto;
padding:0;
border-top: 1px solid #EEEEEE;
border-bottom: 1px solid #EEEEEE;
.select{
margin-bottom: 16px;
}
.el-input{
width: 316px !important;
}
.el-tabs__nav-wrap{
padding: 0 16px;
}
.el-tabs__header{
margin: 0;
}
.detail-cont-tab{
padding: 24px 20px;
.icon{
transform: rotate(90deg);
color:#0081FF;
margin: 0 16px;
}
}
}
.el-dialog__footer{
padding: 16px 20px;
}
}
}
</style>
......@@ -24,7 +24,7 @@
</div>
<div class="project-table-list-haeder-right">
<!-- 实体工程材料单位换算 -->
<el-button type="primary" size="medium" class="unit-conversion-btn" v-if="currentParentName.indexOf('实体工程材料') != -1">单位换算</el-button>
<el-button type="primary" size="medium" class="unit-conversion-btn" v-if="isEntityMaterials">单位换算</el-button>
<!-- 填写实际成本 -->
<el-button type="primary" size="medium" class="actual-cost-btn" v-else
@click="addActualCostEditStatus ? saveActualCost() : fillActualCost()">{{addActualCostEditStatus ? '保存成本' : '填写实际成本'}}</el-button>
......@@ -35,7 +35,8 @@
<!-- 数据列表部分 -->
<div class="project-feedsummary-list-container">
<dsk-skeleton v-if="tableLoading"></dsk-skeleton>
<el-form :model="dataForm" ref="feedSummaryForm" :show-message="false" v-else-if="!tableLoading" class="feed-summary-form">
<!-- 非实体工程材料列表 -->
<el-form :model="dataForm" ref="feedSummaryForm" :show-message="false" v-else-if="!isEntityMaterials" class="feed-summary-form">
<custom-table :tableData="dataForm.tableDataList" :formColum="formColum" :max-height="true" :tableDataTotal="total" :paging="false"
:cell-class-name="cellClassName">
<template slot="action-field-bar" slot-scope="scope">
......@@ -46,16 +47,34 @@
</template>
<!-- 本月工程量 -->
<template slot="quantities" slot-scope="scope">
<!-- 统计行 -->
<template v-if="scope.rowIndex == '0'">
</template>
<el-form-item v-else-if="addActualCostEditStatus">
<!-- 编辑单元格 -->
<el-form-item :prop="`tableDataList.${scope.rowIndex}.quantities`" :rules="checkRules.amountCheck"
v-if="scope.rowIndex != '0' && addActualCostEditStatus" class="inner-edit-input-item">
<el-input placeholder="请输入" v-model="scope.row.quantities" clearable @input="v => statisticsSum(v,'quantities')"></el-input>
</el-form-item>
</template>
<!-- 本月采购单价 -->
<template slot="purchaseUnitPrice" slot-scope="scope">
<!-- 编辑单元格 -->
<el-form-item :prop="`tableDataList.${scope.rowIndex}.purchaseUnitPrice`" :rules="checkRules.amountCheck"
v-if="scope.rowIndex != '0' && addActualCostEditStatus" class="inner-edit-input-item">
<el-input placeholder="请输入" v-model="scope.row.purchaseUnitPrice" clearable
@input="v => statisticsSum(v,'purchaseUnitPrice')"></el-input>
</el-form-item>
</template>
</custom-table>
</el-form>
<!-- 实体工程材料列表 -->
<entity-materials-table v-else-if="isEntityMaterials" :tableData="dataForm.tableDataList" :formColum="entityMaterialsFormColum"
:max-height="true" :tableDataTotal="total" :paging="false" @selectionChange="selectionChange">
<template slot="action-field-bar" slot-scope="scope">
<div class="project-action-field-bar">
<span class="push-project">推送工程量</span>
</div>
</template>
</entity-materials-table>
</div>
</div>
</div>
......@@ -63,15 +82,20 @@
<!-- 填写实际成本触发 -->
<add-actual-cost v-model="showAddActualCost" :project-create-time="projectDetailInfo.createTime" @timeSelect="timeSelect"></add-actual-cost>
<!-- 单位换算弹窗 -->
<unit-conversion v-if="showUnitConversion" :isVisible="showUnitConversion" :dataList="unitConversionList" @refresh="handleDialogVisible()"></unit-conversion>
</div>
</template>
<script>
import ProjectSideMenu from "@/views/projectCostLedger/detail/components/ProjectSideMenu";
import { getFeedSummaryMenuTreeApi, getFeedSummaryMonthListApi, getFeedSummaryListApi, getFeedSummaryConversionNotice, updateFeedSummaryRowsApi } from "@/api/projectCostLedger";
import { getFeedSummaryMenuTreeApi, getFeedSummaryMonthListApi, getFeedSummaryListApi, getFeedSummaryConversionNotice, updateFeedSummaryRowsApi, pushFeedSummaryRowsApi } from "@/api/projectCostLedger";
import DskTableHeaderSetting from "@/components/DskTableHeaderSetting";
import DskSkeleton from "@/components/DskSkeleton";
import CustomTable from "@/components/CustomTable";
import EntityMaterialsTable from "@/components/CustomTable";
import AddActualCost from "./components/AddActualCost";
import unitConversion from "./components/unitConversion";
import { v4 } from 'uuid';
import dayjs from "dayjs";
import { cloneDeep } from "lodash-es";
......@@ -93,9 +117,7 @@ const statisticsPropNames = [
// 可编辑字段
const editPropNames = [
"quantities",
"totalQuantities",
"purchaseUnitPrice",
"createTime"
];
export default {
......@@ -125,16 +147,31 @@ export default {
handler(newValue) {
this.comProjectId = newValue;
}
},
recordDate: {
handler(newValue, oldValue) {
this.oldRecordDate = newValue;
}
}
},
components: {
ProjectSideMenu,
DskTableHeaderSetting,
CustomTable,
EntityMaterialsTable,
DskSkeleton,
AddActualCost
AddActualCost,
unitConversion
},
data() {
const amountCheckValidator = (rule, value, callback) => {
// 有值才进行验证
if (value || value == "0") {
const reg = /^(?!0\d)(?!0*\.0*$)\d+(\.\d+)?$/;
if (!reg.test(value)) return callback(new Error("请输入正确的数值"));
}
callback();
};
return {
menuOptions: {
nodeName: "name",
......@@ -171,16 +208,21 @@ export default {
},
{
label: '实际成本', prop: "sjcb", align: "center", uid: v4(), children: [
{ label: '本月工程量', prop: "quantities", minWidth: "150", uid: v4(), slot: true },
{ label: '截止本月工程量', prop: "totalQuantities", minWidth: "150", uid: v4(), slot: true },
{ label: '本月采购单价', prop: "purchaseUnitPrice", minWidth: "150", uid: v4(), slot: true },
{ label: '填写时间', prop: "createTime", minWidth: "150", uid: v4(), slot: true },
{ label: '本月工程量', prop: "quantities", minWidth: "160", uid: v4(), slot: true },
{ label: '截止本月工程量', prop: "totalQuantities", minWidth: "160", uid: v4(), slot: true },
{ label: '本月采购单价', prop: "purchaseUnitPrice", minWidth: "160", uid: v4(), slot: true },
{ label: '填写时间', prop: "createTime", minWidth: "160", uid: v4(), slot: true },
]
},
{ label: '推送工程量', prop: "pushQuantities", width: "95", uid: v4() },
{ label: '备注', prop: "remark", width: "115", uid: v4(), slot: true },
{ label: '操作', prop: "action-field-bar", width: "99", uid: v4(), fixed: "right" },
],
// 实体工程材料表头
entityMaterialsFormColum: [
{ label: '多选', prop: "staticSerialNumber", type: "selection", lock: true, width: "53", fixed: false, uid: v4() },
{ label: '操作', prop: "action-field-bar", width: "99", uid: v4(), fixed: "right" },
],
// 已记录月份集合
monthList: [],
// 源数据月份
......@@ -205,23 +247,41 @@ export default {
// 填写实际成本 编辑状态
addActualCostEditStatus: false,
// 当前选择的成本年份
selectActualCostTime: ""
selectActualCostTime: "",
checkRules: {
amountCheck: [
{ trigger: ["change"], validator: amountCheckValidator }
]
},
statisticsTimer: null,
// 单位换算弹窗
showUnitConversion:false,
//单位换算数据
unitConversionList:[]
};
},
//可访问data属性
created() {
this.init(this.comProjectDetailInfo);
},
beforeDestroy() {
this.clearStatisticsTimer();
},
//计算集
computed: {
hasTarget() {
return this.statisticsParentName.includes(this.currentParentName);
},
// 实体工程材料
isEntityMaterials() {
return this.currentParentName.indexOf('实体工程材料') != -1;
}
},
//方法集
methods: {
async init(detail = {}) {
async init(detail = {}, resetDate = "") {
try {
this.resetEditStatus();
const { projectId, cbStage } = detail;
if (!projectId) return;
const params = {
......@@ -230,14 +290,14 @@ export default {
};
await this.getFeedSummaryMenuTree(params);
await this.getFeedSummaryMonthList(params);
await this.initDefaultSetting();
await this.initDefaultSetting(resetDate);
} catch (error) {
console.log(error);
} finally {
this.tableLoading = false;
}
},
async initDefaultSetting() {
async initDefaultSetting(resetDate = "") {
try {
await this.$nextTick();
const menus = this.$refs["projectSideMenu"].getResultMenuList();
......@@ -247,7 +307,7 @@ export default {
this.currentNodeName = defaultCurrent.nodeName;
const parentName = defaultCurrent.parent ? this.getCurrentType(defaultCurrent.parent) : defaultCurrent.name;
if (parentName) this.currentParentName = parentName;
const params = this.createRequestConditions();
const params = this.createRequestConditions(resetDate);
await this.getFeedSummaryList(params);
}
} catch (error) {
......@@ -257,16 +317,18 @@ export default {
getNowMonth() {
return dayjs(new Date().valueOf()).format("YYYYMM");
},
createRequestConditions() {
createRequestConditions(resetDate = "") {
const { projectId, cbStage } = this.comProjectDetailInfo;
const params = {
projectId,
cbStage
};
params["cbSubjectName"] = this.currentNodeName;
// 判断当月是否存在于server返回month集合中
// 判断当月是否存在于server返回month集合中 有传入的重置时间 采用重置时间
const _now = this.getNowMonth();
if (this.includeNowMonth(_now)) {
if (resetDate && this.includeNowMonth(resetDate)) {
params["recordDate"] = resetDate;
} else if (this.includeNowMonth(_now)) {
params["recordDate"] = _now;
}
return params;
......@@ -323,11 +385,7 @@ export default {
}
// 循环统计 需要统计的列 总数
for (const prop of _statisticsPropNames) {
const sum = arraylist.reduce((pre, current, index) => {
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] ? current[prop] : 0 : parseFloat(current) ? current : 0;
return add(before, after);
}, 0);
const sum = this.sumHandler(arraylist, prop);
// 对应key 赋值结果
_template[prop] = sum;
}
......@@ -354,7 +412,7 @@ export default {
this.originMonthList = cloneDeep(data);
const _now = this.getNowMonth();
this.recordDate = _now;
this.oldRecordDate = _now;
// this.oldRecordDate = _now;
// 默认以当前月数据为准 若不包含当前月 需要手动push数据
if (!data.includes(_now)) {
data.push(_now);
......@@ -386,16 +444,14 @@ export default {
const _now = this.getNowMonth();
// 请求列表参数
const params = this.createRequestConditions();
// 清空了年月默认选中当前月
// 清空了年月 默认选中当前月
if (!month) {
this.recordDate = _now;
// 如果命中的旧月份 等于当前月 且 不处于编辑状态 说明清空的是当前月 不调用接口
// 如果命中的旧月份 等于当前月 且 不处于编辑状态 说明清空的是默认查询月 不调用接口
if (this.oldRecordDate == _now && !this.addActualCostEditStatus) return;
} else {
// 正常选择
params["recordDate"] = month;
// 记录历史切换年月
this.oldRecordDate = month;
}
this.resetEditStatus();
// 获取列表数据
......@@ -406,10 +462,9 @@ export default {
this.currentNodeName = currentId;
const parentName = currentTemp.parent ? this.getCurrentType(currentTemp.parent) : currentId;
if (parentName) this.currentParentName = parentName;
// 请求数据列表
const params = this.createRequestConditions();
this.getFeedSummaryList(params);
if (this.currentParentName.indexOf('实体工程材料') != -1) {
this.resetTableData();
// 实体工程材料
if (this.isEntityMaterials) {
const { projectId, cbStage } = this.comProjectDetailInfo;
const params = {
projectId,
......@@ -422,24 +477,76 @@ export default {
params["recordDate"] = _now;
}
this.getFeedSummaryConversionNotice(params);
} else {
// 非实体工程材料 获取数据
const params = this.createRequestConditions(this.recordDate);
this.getFeedSummaryList(params);
}
},
async getFeedSummaryConversionNotice(params) {
const data = await getFeedSummaryConversionNotice(params);
if (data.data == 500) {
// const data = {
// "code": 200,
// "msg": "系统检测到您近期未进行物料单位换算,请立即进行换算。",
// "data": [
// {
// "id": "1763389258189500519",
// "cbSubjectName": "钢筋",
// "companyNo": "FG-002-010025",
// "orgNo": "",
// "cbName": "热轧带肋钢筋HRB400E",
// "jobContent": "20mm 定尺12m",
// "calculationRule": "",
// "unit": "吨",
// "materialDescription": "",
// "guidePrice": "",
// "bidUnitPrice": 3513.27,
// "unitPriceDifference": null,
// "quantity": 0.317,
// "combinedPrice": 1113.70659,
// "combinedPriceTax": 1115.154424,
// "brandName": "",
// "bidSource": "请在此处填写",
// "remark": "",
// "quantities": 123123.0,
// "quantitiesUnit": "T",
// "conversionQuantities": null,
// "conversionUnit": null,
// "purchaseUnitPrice": null,
// "createTime": "2024-03-05 16:55:54",
// "totalQuantities": null,
// "actualId": "11111111",
// "pushQuantities": null,
// "ipmProjectCode": null,
// "ipmContractCode": null,
// "ipmJobCode": null
// }
// ]
// };
if (data.data) {
this.$confirm('系统检测到您近一月未进行物料单位换算,是否立即进行换算?', '温馨提示', {
confirmButtonText: '立即换算',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.unitConversionList=data.data;
this.showUnitConversion=true;
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
message: '已取消换算'
});
});
} else if (data.data instanceof Array) {
const _temp = data.data;
this.$set(this.dataForm, "tableDataList", cloneDeep(_temp));
this.originTableDataList = cloneDeep(_temp);
this.total = _temp.length;
}
},
// 复选框回调
selectionChange(array) {
},
getCurrentType(parent) {
if (parent.level == 2) {
......@@ -461,9 +568,76 @@ export default {
fillActualCost() {
this.showAddActualCost = true;
},
clearStatisticsTimer() {
clearTimeout(this.statisticsTimer);
this.statisticsTimer = null;
},
// 实时统计
statisticsSum(value, prop) {
this.clearStatisticsTimer();
// 填写一秒后触发
this.statisticsTimer = setTimeout(() => {
const sum = this.sumHandler(this.dataForm.tableDataList, prop, true);
// 更新统计值
this.$set(this.dataForm.tableDataList[0], prop, sum);
}, 500);
},
sumHandler(dataList, prop, hasTotal = false) {
const reg = /^(?!0\d)(?!0*\.0*$)\d+(\.\d+)?$/;
const sum = dataList.reduce((pre, current, index) => {
if (hasTotal && index == 0) return 0;
const before = Object.prototype.toString.call(pre) == "[object Object]" ? reg.test(pre[prop]) ? pre[prop] : 0 : parseFloat(pre) ? pre : 0;
const after = Object.prototype.toString.call(current) == "[object Object]" ? reg.test(current[prop]) ? current[prop] : 0 : parseFloat(current) ? current : 0;
return add(before, after);
}, 0);
return sum;
},
// 保存
saveActualCost() {
this.$refs["feedSummaryForm"].validate(async flag => {
if (flag) {
// 进行差异化对比
let resultData = this.differentCompare();
console.log(resultData, "差异数据");
if (!resultData.length) {
this.resetEditStatus();
const params = this.createRequestConditions();
await this.getFeedSummaryList(params);
return;
}
// 有差异提交数据
resultData = resultData.map(item => {
return {
id: item.actualId,
cbQuantitySummaryId: item.id,
quantities: item.quantities ? item.quantities : 0,
purchaseUnitPrice: item.purchaseUnitPrice ? item.purchaseUnitPrice : 0,
recordDate: this.recordDate
};
});
const result = await updateFeedSummaryRowsApi(resultData);
if (result.code == 200) {
this.$message.success("保存成功");
await this.init(this.comProjectDetailInfo, this.selectActualCostTime);
await this.editRegionToViewPort();
}
}
});
},
differentCompare() {
const originData = this.originTableDataList;
/**
* @type {Array<object>}
*/
let data = cloneDeep(this.dataForm.tableDataList);
const different = data.filter((item, index) => {
if (index == 0) return false;
const flag = editPropNames.some(prop => {
return item[prop] != originData[index][prop];
});
return flag;
});
return cloneDeep(different);
},
// 编辑状态下 进行了其它操作
resetEditStatus() {
......@@ -472,16 +646,24 @@ export default {
this.addActualCostEditStatus = false;
this.selectActualCostTime = "";
/**
* 判断 当前需要编辑 或者新增的成本年份是否存在于server返回的month数组中
* 判断 当前需要编辑 或者新增的成本年份是否存在于server返回的month数组中 不存在则删除 该月份 然后 选中当前月
* 默认本月
*/
if (!_selectActualCostTime) return;
if (!this.originMonthList.includes(_selectActualCostTime) && _selectActualCostTime != this.getNowMonth()) {
const index = this.monthList.findIndex(item => item.value == _selectActualCostTime);
if (index != -1) {
this.monthList.splice(index, 1);
this.recordDate = this.getNowMonth();
}
}
},
// 重置表格数据
resetTableData() {
this.$set(this.dataForm, "tableDataList", []);
this.originTableDataList = [];
this.total = 0;
},
async timeSelect(selectTime) {
// 编辑状态
this.addActualCostEditStatus = true;
......@@ -497,11 +679,10 @@ export default {
value: selectTime
});
_temp = this.monthsSort(_temp);
console.log(_temp);
// console.log(_temp);
this.monthList = _temp;
}
this.recordDate = selectTime;
this.oldRecordDate = selectTime;
params["recordDate"] = selectTime;
// 获取选中月数据
await this.getFeedSummaryList(params);
......@@ -512,7 +693,7 @@ export default {
await this.$nextTick();
// 获取编辑列所处位置
const container = document.querySelector(".el-table__body-wrapper");
/**
/**
* @type {HTMLTableCellElement}
*/
const editElement = container.querySelector(".el-table__row [class *= can-edit-column-]");
......@@ -532,7 +713,11 @@ export default {
return `can-edit-column-${property}`;
}
return "";
}
},
//关闭单位换算弹窗
handleDialogVisible () {
this.showUnitConversion = false
},
},
}
</script>
......@@ -640,6 +825,35 @@ export default {
font-size: 14px;
font-weight: 350;
}
.inner-edit-input-item {
margin-bottom: 0px;
.el-form-item__content {
line-height: 32px;
}
&.is-error {
.el-input__inner {
&:focus {
border-color: #ff4949;
}
}
}
.el-input__inner {
line-height: 32px;
height: 32px;
border-radius: 2px;
padding-left: 8px;
&:focus {
border-color: #0081ff;
}
}
.el-input__clear {
line-height: 32px;
}
}
}
}
}
......
......@@ -55,52 +55,7 @@
</div>
</div>
<el-dialog :visible.sync="dialogVisible" width="720px" append-to-body class="dialogVisible" title="单位换算">
<el-tabs v-model="currentList" @tab-click="handleClickTab">
<el-tab-pane
:key="index"
v-for="(item, index) in toggleTabs"
:label="item.name"
:name="item.value"
>
{{item.content}}
</el-tab-pane>
<div class="detail-cont-tab">
<div class="select">
<el-select v-model="type1" placeholder="请选择">
<el-option v-for="(item,index) in typeList" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
<i class="el-icon-sort icon"></i>
<el-select v-model="type2" placeholder="请选择">
<el-option v-for="(item,index) in typeList" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
</div>
<el-table
:data="tableData1"
default-expand-all
border
highlight-current-row
>
<el-table-column
type="selection"
width="50">
</el-table-column>
<el-table-column label="序号" width="50" align="left">
<template slot-scope="scope">
<span>{{scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="成本科目" width="190" prop="cbkm"></el-table-column>
<el-table-column label="物料验收系统本月用料" width="195" prop="wlyl"></el-table-column>
<el-table-column label="换算后本月用料" prop="hsyl"></el-table-column>
</el-table>
</div>
</el-tabs>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible=false">取消</el-button>
<el-button type="primary">保存结果</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
......@@ -166,60 +121,9 @@ export default {
nodeName: "itemContent",
nodeValue: "menuId",
},
dialogVisible:false,
currentList: "type1",
toggleTabs:[
{
value: "type1",
name: "长度",
},
{
value: "type2",
name: "面积",
},
{
value: "type3",
name: "体积",
},
// {
// value: "type4",
// name: "质量",
// },
// {
// value: "type5",
// name: "密度",
// },
],
tableData1:[],
tableDataTotal1:0,
type1:'',
type2:'',
typeList:[
{
dictLabel:'千米',
dictValue:'千米'
},
{
dictLabel:'米',
dictValue:'米'
},
{
dictLabel:'分米',
dictValue:'分米'
},
{
dictLabel:'厘米',
dictValue:'厘米'
},
{
dictLabel:'毫米',
dictValue:'毫米'
},
{
dictLabel:'微米',
dictValue:'微米'
},
],
};
},
watch: {
......@@ -297,118 +201,7 @@ export default {
sortChange(){
},
handleClickTab(v){
this.type1='';
this.type2='';
if(v.label === '长度'){
this.typeList=[
{
dictLabel:'千米',
dictValue:'千米'
},
{
dictLabel:'米',
dictValue:'米'
},
{
dictLabel:'分米',
dictValue:'分米'
},
{
dictLabel:'厘米',
dictValue:'厘米'
},
{
dictLabel:'毫米',
dictValue:'毫米'
},
{
dictLabel:'微米',
dictValue:'微米'
},
]
}
if(v.label === '面积'){
this.typeList=[
{
dictLabel:'平方千米',
dictValue:'平方千米'
},
{
dictLabel:'公顷',
dictValue:'公顷'
},
{
dictLabel:'公亩',
dictValue:'公亩'
},
{
dictLabel:'平方米',
dictValue:'平方米'
},
{
dictLabel:'平方分米',
dictValue:'平方分米'
},
{
dictLabel:'平方厘米',
dictValue:'平方厘米'
},
{
dictLabel:'平方毫米',
dictValue:'平方毫米'
},
]
}
if(v.label === '体积'){
this.typeList=[
{
dictLabel:'立方千米',
dictValue:'立方千米'
},
{
dictLabel:'立方米',
dictValue:'立方米'
},
{
dictLabel:'立方分米',
dictValue:'立方分米'
},
{
dictLabel:'立方厘米',
dictValue:'立方厘米'
},
{
dictLabel:'立方毫米',
dictValue:'立方毫米'
},
{
dictLabel:'升',
dictValue:'升'
},
{
dictLabel:'分升',
dictValue:'分升'
},
{
dictLabel:'毫升',
dictValue:'毫升'
},
{
dictLabel:'微升',
dictValue:'微升'
},
{
dictLabel:'厘升',
dictValue:'厘升'
},
{
dictLabel:'公石',
dictValue:'公石'
},
]
}
},
},
}
</script>
......@@ -436,43 +229,4 @@ export default {
padding: 16px;
}
}
.dialogVisible{
::v-deep .el-dialog {
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
margin-top:0 !important;
.el-dialog__body{
flex:1;
overflow: auto;
padding:0;
border-top: 1px solid #EEEEEE;
border-bottom: 1px solid #EEEEEE;
.select{
margin-bottom: 16px;
}
.el-input{
width: 316px !important;
}
.el-tabs__nav-wrap{
padding: 0 16px;
}
.el-tabs__header{
margin: 0;
}
.detail-cont-tab{
padding: 24px 20px;
.icon{
transform: rotate(90deg);
color:#0081FF;
margin: 0 16px;
}
}
}
.el-dialog__footer{
padding: 16px 20px;
}
}
}
</style>
......@@ -142,6 +142,7 @@ export default {
this.$emit("close", menuPath, menuPathArray);
},
menuSelect(menuPath) {
if (this.comDefaultActive == menuPath) return;
const result = this.getCurrentData(menuPath);
this.$emit("select", menuPath, result);
},
......
......@@ -198,8 +198,6 @@ export default {
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) {
......
......@@ -390,7 +390,7 @@
//查看进度
detailpro(row){
this.uploadData = row
this.prodetail = true
this.prodetail = false//状态不管是否查看,目前手动设置为可修改
this.isupload = true
},
//删除项目
......
......@@ -290,7 +290,6 @@
this.formdata = JSON.parse(JSON.stringify(this.uploadData))
this.formdata.cbStage = this.formdata.cbStage.toString()
this.getDetail()
console.log(this.formdata )
},
methods:{
importdata(){
......
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