Commit a8e212cd authored by tianhongyang's avatar tianhongyang

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 df13e2b9 660b2dcb
......@@ -64,7 +64,7 @@ public class CbDirectExpenseController extends BaseController {
/***
* 删除直接费费用项
*/
@GetMapping("/deleteExpense/{id}")
@DeleteMapping("/deleteExpense/{id}")
public R<Void> deleteExpense(@NotNull(message = "ID不能为空") @PathVariable Long id) {
return toAjax(baseService.deleteExpense(id));
}
......
......@@ -54,6 +54,15 @@ public class CbQuantitySummaryController extends BaseController {
return R.ok(baseService.subjectList(bo));
}
/**
* 实体工程材料-单位换算提示
*/
@GetMapping(value = "/conversionNotice")
public R conversionNotice(CbQuantitySummaryListBo bo) {
baseService.conversionNotice(bo);
return R.ok();
}
/**
* 更新月成本信息
*/
......
......@@ -4,7 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.annotation.CheckForNull;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;
import java.util.Date;
......@@ -19,61 +25,53 @@ public class CbCostMeasureActualSaveBo {
/**
* 计划成本措施费id
*/
@TableField(value = "plan_measure_id")
private Long planMeasureId;
/**
* 本月发生成本比例
*/
@TableField(value = "month_cost_rate")
@DecimalMin(value = "-1",message = "数据格式不正确")
@DecimalMax(value = "1",message = "数据格式不正确")
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;
......
......@@ -30,7 +30,12 @@ public interface CbQuantitySummaryMapper extends BaseMapperPlus<CbQuantitySummar
List<CbQuantitySummaryListVo> selectListBySubject(CbQuantitySummaryListBo bo);
/**
* 未换算数据
* @param bo
* @return
*/
List<CbQuantitySummaryListVo> unconvertedList(CbQuantitySummaryListBo bo);
}
......@@ -179,7 +179,7 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
treeNodeConfig.setIdKey("id");
treeNodeConfig.setParentIdKey("parentId");
treeNodeConfig.setChildrenKey("childrens");
treeNodeConfig.setChildrenKey("children");
//构建树形
List<Tree<Long>> trees = TreeUtil.build(dataList, costMeasureActualBo.getId(), treeNodeConfig, ((object, treeNode) -> {
treeNode.setId(object.getId());//id
......
......@@ -278,7 +278,9 @@ public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMappe
directExpense.setIsImport(false);
//取编码前两位字母,ZY代表专,LW代表劳,FG代表材
String code = directExpense.getCode().substring(0, 2);
String originCode = directExpense.getCode();
Assert.isFalse(originCode.length() < 2, "编码长度不足");
String code = originCode.substring(0, 2);
switch (code) {
case CbProjectConstants.DIRECT_EXPENSE_CODE_ZHUAN:
directExpense.setExpenseCategoryTag(CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_ZHUAN);
......
......@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils;
import com.dsk.component.DataAnalysisComponent;
......@@ -25,6 +24,7 @@ import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
......@@ -122,24 +122,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
projectFileList.addAll(this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_SUMMARY, CbProjectConstants.CB_TYPE_SUMMARY_NAME));
//修改文件和项目解析状态为解析中
transactionTemplate.execute(status -> {
try {
//修改项目状态:解析中
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
baseMapper.updateById(projectRecord);
//修改所有该项目的项目文件状态:解析中
CbProjectFileServiceImpl projectFileService = new CbProjectFileServiceImpl();
projectFileService.updateBatchById(projectFileList.stream().peek(projectFile -> {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
projectFile.setFailRemark(null);
}).collect(Collectors.toList()));
} catch (Exception e) {
status.setRollbackOnly();
e.printStackTrace();
throw new ServiceException("解析状态更新出错,请联系系统管理员");
}
return Boolean.TRUE;
});
((CbProjectRecordServiceImpl) AopContext.currentProxy()).editParseStatus(projectRecord, projectFileList);
//调各个成本类型的解析文件方法
Integer cbStage = projectRecord.getCbStage();
......@@ -162,6 +145,19 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
cbSummaryService.importCbSummary(projectId);
}
@Transactional(rollbackFor = Exception.class)
public void editParseStatus(CbProjectRecord projectRecord, List<CbProjectFile> projectFileList) {
//修改项目状态:解析中
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
baseMapper.updateById(projectRecord);
//修改所有该项目的项目文件状态:解析中
CbProjectFileServiceImpl projectFileService = new CbProjectFileServiceImpl();
projectFileService.updateBatchById(projectFileList.stream().peek(projectFile -> {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
projectFile.setFailRemark(null);
}).collect(Collectors.toList()));
}
/**
* 校验各个成本类型是否至少有1个文件
*
......
package com.dsk.cscec.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.cscec.domain.CbQuantitySummary;
import com.dsk.cscec.domain.CbQuantitySummaryActual;
import com.dsk.cscec.domain.CbSubject;
......@@ -17,6 +26,7 @@ import com.dsk.cscec.mapper.CbSubjectMapper;
import com.dsk.cscec.service.ICbQuantitySummaryActualService;
import com.dsk.cscec.service.ICbQuantitySummaryService;
import jodd.bean.BeanException;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -24,10 +34,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.time.Duration;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -145,5 +153,35 @@ public class CbQuantitySummaryServiceImpl extends ServiceImpl<CbQuantitySummaryM
int i = baseMapper.batchInsert(list);
return i == list.size();
}
@Override
public void conversionNotice(CbQuantitySummaryListBo bo) {
if (StringUtil.isBlank(bo.getRecordDate())) {
//默认当前月
bo.setRecordDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date()));
}
//是否是实体工程材料
CbSubject cbSubject = cbSubjectMapper.selectOne(new LambdaQueryWrapper<CbSubject>().eq(CbSubject::getCbSubjectName, bo.getCbSubjectName()));
if (ObjectUtil.isNull(cbSubject)) {
return;
}
if (cbSubject.getCbSubjectNo().startsWith("FG") || cbSubject.getCbSubjectNo().startsWith("JD")) {
//是否存在未换算数据
List<CbQuantitySummaryListVo> unconvertedList = baseMapper.unconvertedList(bo);
if (CollectionUtil.isEmpty(unconvertedList)) {
return;
}
//是否提示
String key = GlobalConstants.UNIT_CONVERSION_NOTICE + LoginHelper.getUserId() + "_" + bo.getProjectId() + "_" + bo.getCbSubjectName() + "_" + bo.getRecordDate();
if (ObjectUtil.isNull(RedisUtils.getCacheObject(key))) {
Date now = new Date();
long expireTime = DateUtil.between(now, DateUtil.endOfDay(now), DateUnit.SECOND);
RedisUtils.setCacheObject(key, "noticed", Duration.ofSeconds(expireTime));
Assert.isTrue(false, "系统检测到您近期未进行物料单位换算,请立即进行换算。");
}
}
}
}
......@@ -76,4 +76,21 @@
order by a.`number` asc
</select>
<select id="unconvertedList" resultType="com.dsk.cscec.domain.vo.CbQuantitySummaryListVo">
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_biz_code, cqsa.push_quantities
from cb_quantity_summary cqs
left join cb_quantity_summary_actual cqsa on cqs.id = cqsa.cb_quantity_summary_id
where cqs.del_falg = 0
and cqsa.quantities is not null
and (cqsa.conversion_unit is null or cqsa.conversion_unit = '')
and cqs.project_id = #{projectId}
and cqs.cb_stage = #{cbStage}
and cqsa.record_date = #{recordDate}
and cqs.cb_subject_name = #{cbSubjectName}
</select>
</mapper>
\ No newline at end of file
<template>
<div class="directCost-container">
<div class="directCost-main">
<div class="search">
<el-select v-model="date" placeholder="请选择">
<el-option v-for="(item,index) in datelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
</div>
<!--<div class="search">-->
<!--<el-select v-model="date" placeholder="请选择">-->
<!--<el-option v-for="(item,index) in datelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>-->
<!--</el-select>-->
<!--</div>-->
<div class="directCost-cont">
<div class="left">
<div class="left-side-menu">
......@@ -79,13 +79,13 @@
<el-input v-model="ruleForm.unit" placeholder="请输入单位"></el-input>
</el-form-item>
<el-form-item label="招标控制价单价" prop="tenderControlUnitPrice">
<el-input v-model="ruleForm.tenderControlUnitPrice" placeholder="请输入招标控制价单价"></el-input>
<el-input v-model="ruleForm.tenderControlUnitPrice" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入招标控制价单价"></el-input>
</el-form-item>
<el-form-item label="不含税成本单价" prop="excludeTaxCbUnitPrice">
<el-input v-model="ruleForm.excludeTaxCbUnitPrice" placeholder="请输入不含税成本单价"></el-input>
<el-input v-model="ruleForm.excludeTaxCbUnitPrice" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入不含税成本单价"></el-input>
</el-form-item>
<el-form-item label="含税成本单价" prop="includeTaxCbUnitPrice">
<el-input v-model="ruleForm.includeTaxCbUnitPrice" placeholder="请输入含税成本单价"></el-input>
<el-input v-model="ruleForm.includeTaxCbUnitPrice" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入含税成本单价"></el-input>
</el-form-item>
<el-form-item label="特征描述">
<el-input type="textarea" v-model="ruleForm.projectFeature" placeholder="请输入特征描述"></el-input>
......@@ -93,7 +93,7 @@
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible=false">取消</el-button>
<el-button type="primary">确定增加</el-button>
<el-button type="primary" @click="handleAdd">确定增加</el-button>
</div>
</el-dialog>
</div>
......@@ -158,16 +158,16 @@ export default {
menuDetails:{},
menuOptions: {
nodeName: "menuName",
nodeValue: "menuId",
nodeValue: "menuName",
children : "childrenList"
},
detailsId:'',
};
},
watch: {
projectDetailInfo: {
handler(newValue) {
this.comProjectDetailInfo = newValue ? newValue : {};
this.getCbDirectExpenseMenuTreeApi('1760222923030876161')
this.getCbDirectExpenseList('1763446872284012544')
// this.getProjectOtherStatistics(this.comProjectDetailInfo.projectId)
// this.getProjectOtherStatistics('1762014527685136385')
......@@ -185,7 +185,7 @@ export default {
},
//可访问data属性
created() {
this.getCbDirectExpenseMenuTreeApi('1760222923030876161')
},
mounted() {
......@@ -203,6 +203,11 @@ export default {
const _tempArray = result.data;
this.menuDetails=_tempArray
this.menuTreeList.push(_tempArray);
const defaultCurrent = this.findMenuNode(this.menuTreeList, "土石方部分");
console.log(defaultCurrent)
if (defaultCurrent) {
this.defaultActive = defaultCurrent.menuName;
}
}
} catch (error) {
......@@ -210,6 +215,7 @@ export default {
},
async getCbDirectExpenseList(params) {
try {
const result = await getCbDirectExpenseList(params);
if (result.code == 200) {
const _dataArray = result.data;
......@@ -232,7 +238,19 @@ export default {
return '';
},
handleDialogVisible(row){
this.dialogVisible=true
this.dialogVisible=true;
console.log(row)
this.detailsId=row.id;
},
handleAdd(){
this.ruleForm.qingId = this.detailsId
cbDirectExpenseAdd(JSON.stringify(this.ruleForm)).then(res=>{
if(res.code == 200){
this.dialogVisible = false
this.getCbDirectExpenseList('1763446872284012544')
}
})
},
handleDelete(row){
this.$confirm('是否删除费用项?', '提示', {
......@@ -256,6 +274,16 @@ export default {
});
});
},
findMenuNode(tree, nodeName) {
console.log(tree)
for (const item of tree) {
if (item.menuName == nodeName) return item;
if (item.childrenList instanceof Array) {
const result = this.findMenuNode(item.childrenList, nodeName);
if (result) return result;
}
}
},
},
}
</script>
......
......@@ -277,8 +277,6 @@ export default {
}
},
select(menuPath, menuPathArray){
console.log(menuPath)
console.log(menuPathArray)
this.defaultActive=menuPath;
let param = {
projectId:this.comProjectDetailInfo.projectId,
......
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