Commit 7c52784c 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 2a908cf9 afaf8647
......@@ -10,6 +10,7 @@ import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryActualLockBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.domain.vo.CbSummaryActualVo;
import com.dsk.cscec.domain.vo.CbSummaryCostAccountExportVo;
import com.dsk.cscec.domain.vo.CbSummaryProjectExportVo;
import com.dsk.cscec.service.CbSummaryService;
......@@ -58,6 +59,11 @@ public class CbSummaryController extends BaseController {
return R.ok(cbSummaryService.getActualList(bo));
}
@GetMapping("/allList")
public R<List<CbSummaryActualVo>> getAllList(CbSummaryActualListBo bo) {
return R.ok(cbSummaryService.getAllList(bo));
}
/**
* 已添加成本月份
*
......
......@@ -13,7 +13,7 @@ import java.util.List;
* @since 2024-02-06
*/
@Data
public class CbSummaryActualListVo extends BaseEntity {
public class CbSummaryActualListVo {
/**
* 主键id
*/
......@@ -69,19 +69,20 @@ public class CbSummaryActualListVo extends BaseEntity {
/**
* 本月费用(含税)
*/
private BigDecimal taxInclusiveExpense;
private Double taxInclusiveExpense;
/**
* 本月费用(不含税)
*/
private BigDecimal taxExclusiveExpense;
private Double taxExclusiveExpense;
/**
* 截至本月费用(含税)
*/
private BigDecimal taxInclusiveExpenseTotal;
private Double taxInclusiveExpenseTotal;
/**
* 截至本月费用(不含税)
*/
private BigDecimal taxExclusiveExpenseTotal;
private Double taxExclusiveExpenseTotal;
/**
* 费用日期
*/
......
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.util.List;
/**
* 成本汇总
*
* @author cyf
* @since 2024-02-06
*/
@Data
public class CbSummaryActualVo {
/**
* 主键id
*/
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 层级
*/
private Integer level;
/**
* 序号
*/
private String number;
/**
* 名称/成本科目
*/
private String cbName;
/**
* 不含税成本合价
*/
private String taxExclusiveTotal;
/**
* 成本税金合价
*/
private String cbTaxesTotal;
/**
* 含税成本合价
*/
private String taxInclusiveTotal;
/**
* 成本占比
*/
private String cbProportion;
/**
* 含税成本平米指标
*/
private String taxInclusivePmTarget;
/**
* 备注
*/
private String remark;
/**
* 费用id
*/
private Long actualId;
/**
* 本月费用(含税)
*/
private Double taxInclusiveExpense;
/**
* 本月费用(不含税)
*/
private Double taxExclusiveExpense;
/**
* 截至本月费用(含税)
*/
private Double taxInclusiveExpenseTotal;
/**
* 截至本月费用(不含税)
*/
private Double taxExclusiveExpenseTotal;
/**
* 费用日期
*/
private String expenseDate;
private List<CbSummaryActualVo> children;
}
......@@ -19,5 +19,9 @@ public interface CbCostMeasureActualMapper extends BaseMapper<CbCostMeasureActua
List<CbCostMeasureActualVo> getMonthActualCostList(@Param("projectId") Long projectId,@Param("month") String month);
// List<CbCostMeasureActualVo> getMonthActualCostListByLevel(@Param("level") Integer level,@Param("projectId") Long projectId,@Param("month") String month);
BigDecimal selectSumData(CbCostMeasureActualSaveBo bo);
BigDecimal selectMonthProjectVolumeByLevel(@Param("level") Integer level,@Param("projectId") Long projectId,@Param("month") String month);
}
\ No newline at end of file
......@@ -4,4 +4,5 @@ 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
......@@ -8,6 +8,7 @@ import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryActualLockBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.domain.vo.CbSummaryActualVo;
import java.util.List;
import java.util.Map;
......@@ -42,7 +43,7 @@ public interface CbSummaryService extends IService<CbSummary> {
* @return
*/
List<CbSummaryActualListVo> getActualList(CbSummaryActualListBo bo);
List<CbSummaryActualVo> getAllList(CbSummaryActualListBo bo);
/**
* 获取已添加成本月份
*
......
......@@ -6,6 +6,7 @@ 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.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
......@@ -23,5 +24,7 @@ public interface ICbCostMeasureActualService extends IService<CbCostMeasureActua
List<CbCostMeasureActualVo> getMonthActualCostList(Long projectId, String month);
BigDecimal selectSumData(CbCostMeasureActualSaveBo bo);
BigDecimal selectMonthProjectVolumeByLevel(Integer level, Long projectId, String month);
}
......@@ -245,6 +245,12 @@ public class CbCostMeasureServiceImpl extends ServiceImpl<CbCostMeasureMapper, C
saveList.add(cbCostMeasureActual);
}
cbCostMeasureActualService.saveOrUpdateBatch(saveList);
CbCostMeasureActual cbCostMeasureActual = saveList.get(0);
//todo 查询最新的二级费用合计, 用于更新一级费用项
// cbCostMeasureActualService.selectMonthProjectVolumeByLevel(1,cbCostMeasureActual.GET);
//更新
}
@Override
......
......@@ -19,6 +19,7 @@ import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryActualLockBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.domain.vo.CbSummaryActualVo;
import com.dsk.cscec.domain.vo.CbSummaryCostAccountImportVo;
import com.dsk.cscec.domain.vo.CbSummaryProjectImportVo;
import com.dsk.cscec.listener.CbSummaryCostAccountImportListener;
......@@ -329,18 +330,18 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
if (ObjectUtil.isEmpty(cbSummaryActualListVo)) {
return list;
}
//截至本月费用汇总
Map<String, BigDecimal> parentTotal = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
cbSummaryActualListVo.setTaxExclusiveExpenseTotal(parentTotal.get("taxExclusiveExpenseTotal"));
cbSummaryActualListVo.setTaxInclusiveExpenseTotal(parentTotal.get("taxInclusiveExpenseTotal"));
// //截至本月费用汇总
// Map<String, BigDecimal> parentTotal = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
// cbSummaryActualListVo.setTaxExclusiveExpenseTotal(parentTotal.get("taxExclusiveExpenseTotal").doubleValue());
// cbSummaryActualListVo.setTaxInclusiveExpenseTotal(parentTotal.get("taxInclusiveExpenseTotal").doubleValue());
List<CbSummaryActualListVo> childrenList = baseMapper.getByParentId(bo.getId(), bo.getExpenseDate());
//截至本月费用汇总
childrenList.parallelStream().forEach(children -> {
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
});
// //截至本月费用汇总
// childrenList.parallelStream().forEach(children -> {
// Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
// children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal").doubleValue());
// children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal").doubleValue());
// });
if (CollectionUtil.isNotEmpty(childrenList)) {
cbSummaryActualListVo.setHasChildren(1);
} else {
......@@ -375,6 +376,60 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
}
@Override
public List<CbSummaryActualVo> getAllList(CbSummaryActualListBo bo) {
Assert.notNull(bo.getId(), "id不能为空");
Assert.notNull(bo.getCbType(), "成本类型不能为空");
if (StringUtil.isBlank(bo.getExpenseDate())) {
//默认当前月
bo.setExpenseDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date()));
}
List<CbSummaryActualListVo> list = new ArrayList<>();
//当前父级数据
CbSummaryActualListVo cbSummaryActualListVo = baseMapper.getById(bo.getId(), bo.getExpenseDate());
if (ObjectUtil.isEmpty(cbSummaryActualListVo) || null == cbSummaryActualListVo.getId()) {
return new ArrayList<>();
}
// //截至本月费用汇总
// Map<String, BigDecimal> parentTotal = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
// cbSummaryActualListVo.setTaxExclusiveExpenseTotal(parentTotal.get("taxExclusiveExpenseTotal").doubleValue());
// cbSummaryActualListVo.setTaxInclusiveExpenseTotal(parentTotal.get("taxInclusiveExpenseTotal").doubleValue());
List<CbSummaryActualListVo> childrenList = baseMapper.getByParentId(bo.getId(), bo.getExpenseDate());
// //截至本月费用汇总
// childrenList.parallelStream().forEach(children -> {
// Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
// children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal").doubleValue());
// children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal").doubleValue());
// });
// if (CollectionUtil.isNotEmpty(childrenList)) {
// cbSummaryActualListVo.setHasChildren(1);
// } else {
// cbSummaryActualListVo.setHasChildren(0);
// }
if (0 == cbSummaryActualListVo.getLevel() && 1 == bo.getCbType()) {
//项目汇总一级列表
list = childrenList;
// return childrenList;
} else if (0 == cbSummaryActualListVo.getLevel() && 2 == bo.getCbType()) {
//成本科目汇总一级列表
cbSummaryActualListVo.setChildren(childrenList);
list.add(cbSummaryActualListVo);
// return list;
} else {
//递归列表
childrenList = getProjectSumList(bo);
cbSummaryActualListVo.setChildren(childrenList);
list.add(cbSummaryActualListVo);
// return list;
}
List<CbSummaryActualVo> resultList = BeanUtil.copyToList(list,CbSummaryActualVo.class);
return resultList;
}
/**
* 成本汇总递归列表
*
......@@ -389,10 +444,10 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
childBo.setId(children.getId());
childBo.setExpenseDate(bo.getExpenseDate());
children.setChildren(getProjectSumList(childBo));
//截至本月费用汇总
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
// //截至本月费用汇总
// Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
// children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal").doubleValue());
// children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal").doubleValue());
});
return childrenList;
......@@ -533,8 +588,8 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
//截至本月费用汇总
resultList.forEach(cbSummaryActualListVo -> {
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
cbSummaryActualListVo.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
cbSummaryActualListVo.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
cbSummaryActualListVo.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal").doubleValue());
cbSummaryActualListVo.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal").doubleValue());
});
return resultList;
}
......
......@@ -29,4 +29,9 @@ public class ICbCostMeasureActualServiceImpl extends ServiceImpl<CbCostMeasureAc
public BigDecimal selectSumData(CbCostMeasureActualSaveBo bo) {
return baseMapper.selectSumData(bo);
}
@Override
public BigDecimal selectMonthProjectVolumeByLevel(Integer level, Long projectId, String month) {
return baseMapper.selectMonthProjectVolumeByLevel(level,projectId,month);
}
}
......@@ -177,7 +177,7 @@
</select>
<select id="getMonthActualCostList" resultType="com.dsk.cscec.domain.vo.CbCostMeasureActualVo">
SELECT t1.item_content, t.cost_effective
SELECT t1.item_content, t.project_volume
FROM cb_cost_measure_actual t
inner JOIN cb_cost_measure t1 ON t1.id=t.plan_measure_id
WHERE
......@@ -190,4 +190,14 @@
SELECT SUM(t.project_volume) measureTotal FROM cb_cost_measure_actual t WHERE t.plan_measure_id=#{planMeasureId}
and t.month &lt;#{month}
</select>
<select id="selectMonthProjectVolumeByLevel" resultType="java.math.BigDecimal">
SELECT SUM(t.project_volume)
FROM cb_cost_measure_actual t
inner JOIN cb_cost_measure t1 ON t1.id=t.plan_measure_id
WHERE
t1.project_id=#{projectId}
AND t1.level=#{level}
AND t.`month`=#{month}
</select>
</mapper>
\ No newline at end of file
......@@ -30,20 +30,25 @@
</sql>
<select id="getByParentId" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date,
ifnull(sum(csa1.tax_inclusive_expense),0) taxInclusiveExpenseTotal,ifnull(sum(csa1.tax_exclusive_expense),0) taxExclusiveExpenseTotal
from cb_summary csu
left join cb_summary_actual csa on csu.id = csa.cb_summary_id and csa.expense_date = #{expenseDate} AND csa.del_flag = 0
left join cb_summary_actual csa1 on csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND csa.del_flag = 0
<where>
csu.parent_id = #{parentId}
and csu.del_flag = 0
</where>
group by csu.id
order by csu.sort
</select>
<select id="getById" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date,
ifnull(sum(csa1.tax_inclusive_expense),0) taxInclusiveExpenseTotal,ifnull(sum(csa1.tax_exclusive_expense),0) taxExclusiveExpenseTotal
from cb_summary csu
left join cb_summary_actual csa on csu.id = csa.cb_summary_id and csa.expense_date = #{expenseDate} AND csa.del_flag = 0
left join cb_summary_actual csa1 on csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND csa.del_flag = 0
<where>
csu.id = #{id}
and csu.del_flag = 0
......
......@@ -16,7 +16,7 @@ export function checkProjectCodeExist(data) {
return request({
url: '/cbProjectRecord/checkProjectCodeExist',
method: 'get',
params:data,
params: data,
});
}
//新增项目
......@@ -404,7 +404,7 @@ export const getCostSummaryMonthListApi = (params = {}) => request({
});
/**
* 获取成本汇总数据列表
* 获取成本汇总数据列表 懒加载
* @param {*} params
* @returns
*/
......@@ -414,3 +414,70 @@ export const getCostSummaryListApi = (params = {}) => request({
params
});
/**
* 获取全量成本汇总列表
* @param {*} params
* @returns
*/
export const getCostSummaryAllListApi = (params = {}) => request({
url: "/cbSummary/allList",
method: "get",
params
});
/**
* 锁定成本前提示未填项
* @param {*} params
* @returns
*/
export const validateBeforeCostLockApi = (params = {}) => request({
url: "/cbSummary/getUnfilled",
method: "get",
params
});
/**
* 确定锁定成本
* @param {*} data
* @returns
*/
export const setCostLockApi = (data = {}) => request({
url: "/cbSummary/lockActual",
method: "post",
data
});
/**
* 获取已经锁定成本月份
* @param {*} params
* @returns
*/
export const getLockMonthListApi = (params = {}) => request({
url: "/cbSummary/expenseDateList/locked",
method: "get",
params
});
/**
* 成本汇总导出
* @param {*} data
* @returns
*/
export const exportCostLockExcelApi = (data = {}) => request({
url: "/cbSummary/export",
method: "post",
data,
isFile: true,
responseType: "blob"
});
/**
* 编辑成本 保存成本
* @param {*} data
* @returns
*/
export const saveCostModifyApi = (data = {}) => request({
url: "/cbSummary/editActual",
method: "put",
data
});
......@@ -6,13 +6,13 @@ import Decimal from "decimal.js";
* @param {*} num2
* @returns
*/
export const add = (num1, num2, digit = 9, omit = false) => {
export const add = (num1, num2, digit = 9, intLen = 20, 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);
const result = decimal1.plus(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toSignificantDigits(intLen).toString();
};
/**
......@@ -21,13 +21,13 @@ export const add = (num1, num2, digit = 9, omit = false) => {
* @param {*} num2
* @returns
*/
export const subtract = (num1, num2, digit = 9, omit = false) => {
export const subtract = (num1, num2, digit = 9, intLen = 20, 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);
const result = decimal1.minus(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toSignificantDigits(intLen).toString();
};
/**
......@@ -36,13 +36,13 @@ export const subtract = (num1, num2, digit = 9, omit = false) => {
* @param {*} num2
* @returns
*/
export const multiply = (num1, num2, digit = 9, omit = false) => {
export const multiply = (num1, num2, digit = 9, intLen = 20, 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);
const result = decimal1.times(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toSignificantDigits(intLen).toString();
};
/**
......@@ -51,13 +51,13 @@ export const multiply = (num1, num2, digit = 9, omit = false) => {
* @param {*} num2
* @returns
*/
export const divide = (num1, num2, digit = 9, omit = false) => {
export const divide = (num1, num2, digit = 9, intLen = 20, 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);
const result = decimal1.dividedBy(decimal2);
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toString();
return omit ? result.toFixed(digit, Decimal.ROUND_UP) : result.toDecimalPlaces(digit, Decimal.ROUND_UP).toSignificantDigits(intLen).toString();
};
// 检测结果是否是负数
......
import axios from 'axios'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import store from '@/store'
import { getToken,getTenantid } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import axios from 'axios';
import { Notification, MessageBox, Message, Loading } from 'element-ui';
import store from '@/store';
import { getToken, getTenantid } from '@/utils/auth';
import errorCode from '@/utils/errorCode';
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import cache from '@/plugins/cache';
import { saveAs } from 'file-saver';
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时
timeout: 20000
})
});
// request拦截器
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
config.headers['tenantid'] = getTenantid() //携带租户id
config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
config.headers['tenantid'] = getTenantid(); //携带租户id
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
......@@ -64,119 +64,127 @@ service.interceptors.request.use(config => {
// }
// }
// }
return config
return config;
}, error => {
console.log(error)
if(error.message.indexOf('timeout')<0 ){ //超时报错不提示
Promise.reject(error)
console.log(error);
if (error.message.indexOf('timeout') < 0) { //超时报错不提示
Promise.reject(error);
}
})
});
//频繁发送请求时,返回慢的数据覆盖了返回快的数据
let pending = []
let CancelToken = axios.CancelToken
let pending = [];
let CancelToken = axios.CancelToken;
let cancelPending = (config) => {
pending.forEach((item, index) => {
if (config) {
// if (item.UrlPath === '/combine/info/memberList' || item.UrlPath === '/combine/info/businessList' || item.UrlPath === '/combine/info/bidPage') {
if (item.UrlPath === config.url && ['/combine/info/memberList','/combine/info/businessList','/combine/info/bidPage'].includes(config.url)) {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
if (item.UrlPath === config.url && ['/combine/info/memberList', '/combine/info/businessList', '/combine/info/bidPage'].includes(config.url)) {
item.Cancel(); // 取消请求
pending.splice(index, 1); // 移除当前请求记录
};
} else {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
item.Cancel(); // 取消请求
pending.splice(index, 1); // 移除当前请求记录
}
})
}
});
};
// 响应拦截器
service.interceptors.response.use(res => {
const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
sessionStorage.removeItem('views')
location.href = '/index/gys';
})
const { config, headers } = res;
const apiList = ['/login', '/system/user/profile/updatePwd']; //需要提示错误的接口
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default'];
// 文件下载
if (config.isFile) {
return {
data: res.data,
fileName: headers["content-disposition"]
};
}
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data;
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
sessionStorage.removeItem('views');
location.href = '/index/gys';
});
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) {
Message({ message: msg, type: 'error' })
return Promise.reject(new Error(msg))
} else if (code === 601) {
Message({ message: msg, type: 'warning' })
return Promise.reject('error')
} else if (code !== 200) {
Notification.error({ title: msg })
return Promise.reject('error')
} else {
// cancelPending(res.config)
return res.data
}
},error => {
console.log(error);
console.log('err' + error)
let { message } = error;
/*if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}*/
if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理
Message({ message: message, type: 'warning', duration: 5 * 1000 })
}else{
// Message({ message: message, type: 'error', duration: 5 * 1000 })
}
if(error.message.indexOf('timeout')<0 ){ //超时报错不提示
return Promise.reject(error)
return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
} else if (code === 500) {
Message({ message: msg, type: 'error' });
return Promise.reject(new Error(msg));
} else if (code === 601) {
Message({ message: msg, type: 'warning' });
return Promise.reject('error');
} else if (code !== 200) {
Notification.error({ title: msg });
return Promise.reject('error');
} else {
// cancelPending(res.config)
return res.data;
}
}, error => {
console.log(error);
console.log('err' + error);
let { message } = error;
/*if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}*/
if (message == '数据正在处理,请勿重复提交') { //重复提交,提示样式特殊处理
Message({ message: message, type: 'warning', duration: 5 * 1000 });
} else {
// Message({ message: message, type: 'error', duration: 5 * 1000 })
}
// return Promise.reject(error)
if (error.message.indexOf('timeout') < 0) { //超时报错不提示
return Promise.reject(error);
}
)
// return Promise.reject(error)
}
);
// 通用下载方法
export function download(url, params, filename, config) {
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", });
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
transformRequest: [(params) => { return tansParams(params); }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
...config
}).then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data])
saveAs(blob, filename)
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
Message.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
Message.error('下载文件出现错误,请联系管理员!')
console.error(r);
Message.error('下载文件出现错误,请联系管理员!');
downloadLoadingInstance.close();
})
});
}
export default service
export default service;
<template>
<el-dialog title="填写实际成本" :visible="comDialogStatus" class="cost-month-select-container" @close="dialogClose" :destroy-on-close="true"
:close-on-click-modal="false">
<div class=" dialog-content-inner">
<!-- 成本年份 -->
<div class="cost-year-container">
<span>成本年份</span>
<el-date-picker v-model="time" type="month" placeholder="请选择所需要添加的成本月份" format="yyyy年MM月" value-format="yyyy-MM" class="project-record-date"
@change="timeChange" :picker-options="pickerOptions"></el-date-picker>
</div>
</div>
<!-- 底部按钮 -->
<div class="dialog-content-footer">
<div class="cancel-or-ok">
<el-button size="medium" @click="cancel" class="cancel-select-year">取消</el-button>
<el-button type="primary" size="medium" @click="ok" class="ok-select-year">确定</el-button>
</div>
</div>
</el-dialog>
</template>
<script>
import dayjs from "dayjs";
export default {
name: "costMonthSelect",
props: {
dialogStatus: {
type: Boolean,
default: false
},
projectCreateTime: {
type: String,
default: ""
},
disableMonths: {
type: Array,
default: () => []
}
},
model: {
prop: "dialogStatus",
event: "dialogStatusChange"
},
watch: {
dialogStatus(newValue) {
this.comDialogStatus = newValue;
}
},
data() {
return {
comDialogStatus: this.dialogStatus,
time: "",
pickerOptions: {
disabledDate: this.disabledDateHandler
}
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
// 时间选择变化
timeChange(time) {
// console.log(time);
},
cancel() {
this.comDialogStatus = false;
},
ok() {
if (!this.time) {
return this.$message.error("请选择成本年份");
}
// 发布事件
this.$emit("timeSelect", dayjs(this.time).format("YYYYMM"));
this.comDialogStatus = false;
},
reset() {
this.time = "";
},
dialogClose() {
this.$emit("dialogStatusChange", false);
this.reset();
},
disabledDateHandler(optionTime) {
// 选项年月
const _optionTime = dayjs(optionTime).format("YYYYMM");
// 当前项目年月
const _thresholdTime = dayjs(this.projectCreateTime).format("YYYYMM");
// 当前项目年
const _thresholdYear = _thresholdTime.slice(0, 4);
// 当前项目月份 补0
const _thresholdMonth = _thresholdTime.slice(4);
// 是否小于当前项目年月 或 大于 当前项目年月 往后推五年 以及成本月份被锁定 禁用
const lastYearMonth = parseInt(`${parseInt(_thresholdYear) + 5}${_thresholdMonth}`);
if (parseInt(_optionTime) < parseInt(_thresholdTime) || parseInt(_optionTime) > lastYearMonth || this.disableMonths.includes(_optionTime)) {
return true;
}
return false;
}
},
}
</script>
<style lang="scss" scoped>
.cost-month-select-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;
box-sizing: border-box;
.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;
box-sizing: border-box;
.dialog-content-inner {
min-height: 120px;
padding: 24px 20px;
}
.cost-year-container {
display: flex;
align-items: center;
& > span {
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
margin-right: 16px;
white-space: nowrap;
}
.project-record-date {
width: 100%;
.el-input__inner {
height: 30px;
line-height: 30px;
padding: 0px 12px;
border-radius: 2px;
border-color: #dcdfe6;
font-size: 14px;
color: #232323;
font-weight: 350;
}
.el-input__suffix {
right: 12px;
.el-input__icon {
line-height: 30px;
width: auto;
}
}
.el-input__prefix {
display: none;
}
}
}
.dialog-content-footer {
height: 64px;
padding: 0px 20px;
display: flex;
justify-content: flex-end;
align-items: center;
border-top: 1px solid #eeeeee;
box-sizing: border-box;
.cancel-or-ok {
display: flex;
height: 100%;
align-items: center;
.el-button {
padding: 0px 16px;
display: flex;
align-items: center;
justify-content: center;
height: 32px;
font-size: 14px;
&.cancel-select-year {
color: rgba(35, 35, 35, 0.8);
border: 1px solid #dcdfe6;
background: #fff;
}
&.ok-select-year {
background: #0081ff;
border-color: #0081ff;
}
}
}
}
}
}
}
</style>
<template>
<el-dialog title="提示" width="480px" :visible="comLockCostTipDialog" :close-on-click-modal="false" class="lock-cost-tip-container"
@close="dialogClose" :destroy-on-close="true">
<div class="lock-cost-tip-content">{{tipContent}}</div>
<!-- 底部按钮 -->
<div class="lock-cost-tip-footer">
<div class="cancel-btn" @click="cancel">取消</div>
<div class="ok-btn" @click="ok">确定锁定</div>
</div>
</el-dialog>
</template>
<script>
export default {
name: "lockCostTip",
model: {
prop: "lockCostTipDialog",
event: "update:lockCostTipDialog"
},
props: {
lockCostTipDialog: {
type: Boolean,
default: false
},
tipContent: {
type: String,
default: ""
}
},
watch: {
lockCostTipDialog: {
handler(newValue) {
this.comLockCostTipDialog = newValue;
}
}
},
data() {
return {
comLockCostTipDialog: this.lockCostTipDialog
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
dialogClose() {
this.$emit("update:lockCostTipDialog", false);
},
cancel() {
this.comLockCostTipDialog = false;
},
ok() {
this.$emit("ok");
}
},
}
</script>
<style lang="scss" scoped>
.lock-cost-tip-container {
::v-deep .el-dialog {
min-height: 240px;
margin-top: 0px !important;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 4px;
.el-dialog__header {
padding: 0px 20px;
height: 56px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #eeeeee;
.el-dialog__title {
color: #232323;
font-size: 16px;
font-weight: bold;
}
.el-dialog__headerbtn {
position: static;
width: 16px;
height: 16px;
}
}
.el-dialog__body {
padding: 0px;
.lock-cost-tip-content {
min-height: 120px;
padding: 24px 20px;
box-sizing: border-box;
color: rgba(35, 35, 35, 0.8);
line-height: 20px;
font-size: 14px;
font-weight: 350;
}
.lock-cost-tip-footer {
height: 64px;
width: 100%;
border-top: 1px solid #eeeeee;
padding: 0px 20px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: flex-end;
.cancel-btn,
.ok-btn {
height: 32px;
padding: 0px 16px;
border-radius: 4px;
box-sizing: border-box;
font-size: 14px;
font-weight: 350;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.cancel-btn {
margin-right: 12px;
color: rgba(35, 35, 35, 0.8);
border: 1px solid #dcdfe6;
}
.ok-btn {
background: #0081ff;
color: #fff;
}
}
}
}
}
</style>
<template>
<el-dialog title="填写实际成本" :visible="comDialogStatus" class="add-actual-cost-container" @close="dialogClose">
<div class="dialog-content-inner">
<el-dialog title="填写实际成本" :visible="comDialogStatus" class="add-actual-cost-container" @close="dialogClose" :destroy-on-close="true"
:close-on-click-modal="false">
<div class=" dialog-content-inner">
<!-- 成本年份 -->
<div class="cost-year-container">
<span>成本年份</span>
......@@ -93,7 +94,7 @@ export default {
// 当前项目月份 补0
const _thresholdMonth = _thresholdTime.slice(4);
// 是否小于当前项目年月 或 大于 当前项目年月 往后推五年
const lastYearMonth = parseInt(`${parseInt(_thresholdYear) + 5}${_thresholdMonth}`);;
const lastYearMonth = parseInt(`${parseInt(_thresholdYear) + 5}${_thresholdMonth}`);
if (parseInt(_optionTime) < parseInt(_thresholdTime) || parseInt(_optionTime) > lastYearMonth) {
return true;
}
......
......@@ -4,17 +4,17 @@
<div class="dialog-body-content">
<el-form :model="pushForm" ref="pushForm" :rules="rules" class="push-form">
<el-form-item label="分包项目名称">
<el-input :value="pushForm.projectDetailInfo.projectName" :disabled="true"></el-input>
<el-input :value="pushForm.projectName" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="本月实际工程量">
<el-input :value="pushForm.totalQuantities" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="需推送工程量" prop="pushQuantities" :rules="pushQuantitiesValidator(pushForm.totalQuantities)">
<el-input v-model="pushForm.pushQuantities" placeholder="请填写需推送工程量"></el-input>
<el-input v-model="pushForm.pushQuantities" @input="pushQuantitiesIpt" placeholder="请填写需推送工程量"></el-input>
</el-form-item>
<!-- ipm项目编码 -->
<el-form-item label="IPM项目编码">
<el-input v-model="pushForm.projectDetailInfo.ipmProjectNo" placeholder="请输入IPM项目编码"></el-input>
<el-input v-model="pushForm.ipmProjectCode" placeholder="请输入IPM项目编码"></el-input>
</el-form-item>
<!-- ipm合同编码 -->
<el-form-item label="IPM合同编码">
......@@ -34,7 +34,7 @@
</el-dialog>
</template>
<script>
import { subtract, targetIsNegative } from "@/utils/decimal";
import { subtract, targetIsNegative, add } from "@/utils/decimal";
import { cloneDeep } from 'lodash-es';
export default {
name: "pushProjectUseDialog",
......@@ -80,15 +80,12 @@ export default {
comPushProjectUseDialog: this.pushProjectUseDialog,
pushForm: {
id: "",
projectName: "",
totalQuantities: "",
pushQuantities: "",
ipmProjectCode: "",
ipmContractCode: "",
ipmBizCode: "",
totalQuantities: "",
projectDetailInfo: {
projectName: "",
ipmProjectNo: ""
}
},
rules: {}
};
......@@ -115,11 +112,20 @@ export default {
}
}];
},
pushQuantitiesIpt(value) {
const reg = /^(?!0\d)(?!0+$)(?!0*\.0*$)\d+(\.\d+)?$/;
if (reg.test(value)) {
this.pushForm.pushQuantities = add(0, value);
}
},
clearValidate() {
const form = this.$refs["pushForm"];
if (form) form.clearValidate();
},
dialogClose() {
this.$emit("dialogClose");
this.pushForm = this.$options.data.call(this).pushForm;
const form = this.$refs["pushForm"];
if (form) form.clearValidate();
this.clearValidate();
this.$emit("close", false);
},
dialogOpen() {
......
......@@ -2,8 +2,8 @@
<div class="field-expenses-container">
<div class="field-expenses-inner">
<div class="left-side-menu">
<project-side-menu ref="projectSideMenu" :menuTree="menuTreeList" :menuOptions="menuOptions" :unique-opened="false"
v-model="currentNodeValue" @select="menuSelect">
<project-side-menu ref="projectSideMenu" :menuTree="menuTreeList" :menuOptions="menuOptions" :unique-opened="false" v-model="currentNodeValue"
@select="menuSelect">
<template slot="现场经费-1">
<img src="@/assets/images/projectCostLedger/icon_cost_detail_6.svg" alt="">
<div class="project-sub-menu-title-text">现场经费</div>
......@@ -174,7 +174,10 @@ export default {
},
//计算集
computed: {
// 是否是现场经费
isDefaultSumMenu() {
return this.currentNodeName == "现场经费";
}
},
//方法集
methods: {
......@@ -203,12 +206,13 @@ export default {
try {
await this.$nextTick();
const menus = this.$refs["projectSideMenu"].getResultMenuList();
const defaultCurrent = this.findMenuNode(menus, "现场经费");
const first = this.$refs["projectSideMenu"].getFirstLevelWithDeepId();
const defaultCurrent = this.findMenuNode(menus, "现场经费") ? this.findMenuNode(menus, "现场经费") : this.findMenuNode(menus, first, "nodeValue");
if (defaultCurrent) {
this.currentNodeValue = defaultCurrent.nodeValue;
this.currentNodeName = defaultCurrent.nodeName;
const params = this.createRequestConditions();
await this.getFieldExpensesList(params);
this.isDefaultSumMenu ? await this.getFieldExpensesList(params) : await this.getFieldExpensesOtherList(params);
}
} catch (error) {
console.log(error);
......@@ -223,7 +227,7 @@ export default {
projectId,
cbStage
};
params["cbSubjectName"] = this.currentNodeValue;
params["fileId"] = this.currentNodeValue;
// 判断当月是否存在于server返回month集合中
const _now = this.getNowMonth();
if (this.includeNowMonth(_now)) {
......@@ -243,6 +247,7 @@ export default {
if (result) return result;
}
}
return null;
},
async getFieldExpensesList(params = {}) {
try {
......@@ -354,12 +359,8 @@ export default {
const menuName = currentTemp.nodeName;
this.currentNodeName = menuName;
// 请求数据列表
const isDefault = menuName == "现场经费";
const params = isDefault ? this.createRequestConditions() : {
projectId: this.comProjectDetailInfo.projectId,
fileId: currentId
};
if (isDefault) {
const params = this.createRequestConditions();
if (this.isDefaultSumMenu) {
this.getFieldExpensesList(params);
} else {
this.getFieldExpensesOtherList(params);
......
<template>
<div class="project-side-menu-container">
<el-menu mode="vertical" class="project-side-menu-instance" :unique-opened="uniqueOpened" :default-active="createMenuIndex(comDefaultActive)"
:default-openeds="comDefaultOpeneds" @select="menuSelect" @open="subMenuOpen" @close="subMenuClose" ref="customElMenu">
<template v-for="(item, index) of tempMenuTree">
<project-menu-item :menuItem="item" :key="`${item.nodeValue}-${item.level}`">
<template :slot="`${item.nodeName}-${item.level}`" slot-scope="scope">
<slot :name="`${scope.data.nodeName}-${scope.data.level}`" :data="scope.data"></slot>
</template>
</project-menu-item>
</template>
</el-menu>
<transition name="fade" :appear="true" mode="out-in">
<el-menu v-if="tempMenuTree.length" mode="vertical" class="project-side-menu-instance" :unique-opened="uniqueOpened"
:default-active="createMenuIndex(comDefaultActive)" :default-openeds="comDefaultOpeneds" @select="menuSelect" @open="subMenuOpen"
@close="subMenuClose" ref="customElMenu">
<template v-for="(item, index) of tempMenuTree">
<project-menu-item :menuItem="item" :key="`${item.nodeValue}-${item.level}`">
<template :slot="`${item.nodeName}-${item.level}`" slot-scope="scope">
<slot :name="`${scope.data.nodeName}-${scope.data.level}`" :data="scope.data"></slot>
</template>
</project-menu-item>
</template>
</el-menu>
</transition>
</div>
</template>
<script>
......@@ -201,6 +204,9 @@ export default {
await this.$nextTick();
this.openTargetAllSubMenu(this.comDefaultOpeneds);
}
} else {
this.tempMenuTree = [];
this.tempMenuOptions = this.$options.data.call(this).tempMenuOptions;
}
},
mergeMenuOptions(options) {
......@@ -275,12 +281,14 @@ export default {
position: relative;
width: 100%;
height: 100%;
border-right: 1px solid #eeeeee;
background: #fff;
overflow: auto;
::v-deep .project-side-menu-instance {
width: 100%;
height: 100%;
border-right: 1px solid #eeeeee;
overflow: auto;
border-right: unset;
background: unset;
/* 重置一级二级菜单 高度行高 */
.project-menu-item-container {
......
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