Commit 60662645 authored by danfuman's avatar danfuman

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 215d4087 cf194c3d
...@@ -188,6 +188,7 @@ tenant: ...@@ -188,6 +188,7 @@ tenant:
- f_ads_bsi_kpi_proj_two - f_ads_bsi_kpi_proj_two
- cb_summary - cb_summary
- cb_summary_actual - cb_summary_actual
- cb_summary_actual_lock
- cb_cost_measure - cb_cost_measure
- cb_cost_measure_actual - cb_cost_measure_actual
- cb_direct_expense - cb_direct_expense
......
...@@ -7,6 +7,7 @@ import com.dsk.common.core.domain.R; ...@@ -7,6 +7,7 @@ import com.dsk.common.core.domain.R;
import com.dsk.common.utils.poi.ExcelUtil; import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.cscec.domain.bo.CbSummaryActualBo; import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo; 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.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo; import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.domain.vo.CbSummaryCostAccountExportVo; import com.dsk.cscec.domain.vo.CbSummaryCostAccountExportVo;
...@@ -64,10 +65,20 @@ public class CbSummaryController extends BaseController { ...@@ -64,10 +65,20 @@ public class CbSummaryController extends BaseController {
* @return * @return
*/ */
@GetMapping("/expenseDateList") @GetMapping("/expenseDateList")
public R<List<String>> getExpenseDateList(@Validated CbSummaryBo bo) { public R<List<Map<String,Object>>> getExpenseDateList(@Validated CbSummaryBo bo) {
return R.ok(cbSummaryService.getExpenseDateList(bo)); return R.ok(cbSummaryService.getExpenseDateList(bo));
} }
/**
* 已锁定月份
* @param bo
* @return
*/
@GetMapping("/expenseDateList/locked")
public R<List<String>> getLockedList(@Validated CbSummaryBo bo) {
return R.ok(cbSummaryService.getLockedList(bo));
}
/** /**
* 编辑成本 * 编辑成本
* *
...@@ -79,9 +90,25 @@ public class CbSummaryController extends BaseController { ...@@ -79,9 +90,25 @@ public class CbSummaryController extends BaseController {
return cbSummaryService.insertOrUpdateActual(boList) == true ? R.ok() : R.fail(); return cbSummaryService.insertOrUpdateActual(boList) == true ? R.ok() : R.fail();
} }
//锁定成本前提示未填项(按一级大类) /**
* 锁定成本前提示未填项(按一级大类)
* @param bo
* @return
*/
@GetMapping("/getUnfilled")
public R getUnfilled(CbSummaryActualLockBo bo){
return cbSummaryService.getUnfilled(bo);
}
//锁定成本 /**
* 按月份锁定成本
* @param bo
* @return
*/
@PostMapping("/lockActual")
public R lockActual(@RequestBody CbSummaryActualLockBo bo) {
return cbSummaryService.lockActual(bo) == true ? R.ok() : R.fail();
}
/** /**
* 导出excel-按月导出所有 * 导出excel-按月导出所有
...@@ -89,7 +116,7 @@ public class CbSummaryController extends BaseController { ...@@ -89,7 +116,7 @@ public class CbSummaryController extends BaseController {
* @param response * @param response
*/ */
@PostMapping("/export") @PostMapping("/export")
public void export(CbSummaryActualListBo bo, HttpServletResponse response) { public void export(@RequestBody CbSummaryActualListBo bo, HttpServletResponse response) {
List<CbSummaryActualListVo> actualListVoList = cbSummaryService.getAll(bo); List<CbSummaryActualListVo> actualListVoList = cbSummaryService.getAll(bo);
if(bo.getCbType()==1){ if(bo.getCbType()==1){
List<CbSummaryProjectExportVo> list = BeanUtil.copyToList(actualListVoList,CbSummaryProjectExportVo.class); List<CbSummaryProjectExportVo> list = BeanUtil.copyToList(actualListVoList,CbSummaryProjectExportVo.class);
......
package com.dsk.cscec.domain; package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
...@@ -83,6 +84,7 @@ public class CbSummary implements Serializable { ...@@ -83,6 +84,7 @@ public class CbSummary implements Serializable {
/** /**
* 删除状态(0:否、2:是) * 删除状态(0:否、2:是)
*/ */
@TableLogic
private Integer delFlag; private Integer delFlag;
/** /**
* 成本类型(1项目汇总,2成本科目汇总) * 成本类型(1项目汇总,2成本科目汇总)
......
...@@ -40,7 +40,7 @@ public class CbSummaryActual implements Serializable { ...@@ -40,7 +40,7 @@ public class CbSummaryActual implements Serializable {
/** /**
* 是否锁定(0否,1是) * 是否锁定(0否,1是)
*/ */
private Integer lockStatus; // private Integer lockStatus;
/** /**
* 创建时间 * 创建时间
*/ */
......
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
/**
* 成本汇总-每月成本锁定(CbSummaryActualLock)实体类
*
* @author makejava
* @since 2024-02-19
*/
@Data
public class CbSummaryActualLock implements Serializable {
private static final long serialVersionUID = 849892917534518164L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 费用日期
*/
private String expenseDate;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic
private Integer delFlag;
}
...@@ -15,6 +15,10 @@ public class CbSummaryActualListBo extends BaseEntity { ...@@ -15,6 +15,10 @@ public class CbSummaryActualListBo extends BaseEntity {
* 主键id * 主键id
*/ */
private Long id; private Long id;
/**
* 项目id
*/
private Long projectId;
/** /**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本) * 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/ */
......
package com.dsk.cscec.domain.bo;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 成本汇总-每月成本锁定(CbSummaryActualLock)bo
*
* @author cyf
* @since 2024-02-19
*/
@Data
public class CbSummaryActualLockBo extends BaseEntity {
/**
* 项目id
*/
private Long projectId;
/**
* 费用日期
*/
private String expenseDate;
/**
* 成本类型(1项目汇总,2成本科目汇总)
*/
private Integer cbType;
}
...@@ -26,6 +26,10 @@ public class CbSummaryActualListVo extends BaseEntity { ...@@ -26,6 +26,10 @@ public class CbSummaryActualListVo extends BaseEntity {
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本) * 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/ */
private Integer cbStage; private Integer cbStage;
/**
* 层级
*/
private Integer level;
/** /**
* 序号 * 序号
*/ */
...@@ -82,10 +86,6 @@ public class CbSummaryActualListVo extends BaseEntity { ...@@ -82,10 +86,6 @@ public class CbSummaryActualListVo extends BaseEntity {
* 费用日期 * 费用日期
*/ */
private String expenseDate; private String expenseDate;
/**
* 是否锁定(0否,1是)
*/
private Integer lockStatus;
private List<CbSummaryActualListVo> children; private List<CbSummaryActualListVo> children;
} }
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummaryActualLock;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 成本汇总-每月成本锁定(CbSummaryActualLock)表数据库访问层
*
* @author makejava
* @since 2024-02-19
*/
public interface CbSummaryActualLockMapper extends BaseMapper<CbSummaryActualLock> {
/**
* 获取已锁定成本月份
*
* @param bo
* @return
*/
List<String> getLockedList(@Param("bo") CbSummaryBo bo);
}
...@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; ...@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummaryActual; import com.dsk.cscec.domain.CbSummaryActual;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 成本汇总-每月费用(CbSummaryActual)表数据库访问层 * 成本汇总-每月费用(CbSummaryActual)表数据库访问层
...@@ -21,4 +23,11 @@ public interface CbSummaryActualMapper extends BaseMapper<CbSummaryActual> { ...@@ -21,4 +23,11 @@ public interface CbSummaryActualMapper extends BaseMapper<CbSummaryActual> {
*/ */
int insertOrUpdateBatch(@Param("entities") List<CbSummaryActual> entities); int insertOrUpdateBatch(@Param("entities") List<CbSummaryActual> entities);
/**
* 截至本月费用
* @param cbSummaryId
* @param expenseDate
* @return
*/
Map<String, BigDecimal> getTotal(@Param("cbSummaryId") Long cbSummaryId, @Param("expenseDate") String expenseDate);
} }
...@@ -23,6 +23,14 @@ public interface CbSummaryMapper extends BaseMapper<CbSummary> { ...@@ -23,6 +23,14 @@ public interface CbSummaryMapper extends BaseMapper<CbSummary> {
CbSummaryActualListVo getById(@Param("id") Long id, @Param("expenseDate") String expenseDate); CbSummaryActualListVo getById(@Param("id") Long id, @Param("expenseDate") String expenseDate);
/**
* 根据ids获取实际成本
* @param entities
* @param expenseDate
* @return
*/
List<CbSummaryActualListVo> getByIds(@Param("entities") List<CbSummary> entities, @Param("expenseDate") String expenseDate);
/** /**
* 根据月份获取所有项目汇总数据 * 根据月份获取所有项目汇总数据
* *
...@@ -45,7 +53,7 @@ public interface CbSummaryMapper extends BaseMapper<CbSummary> { ...@@ -45,7 +53,7 @@ public interface CbSummaryMapper extends BaseMapper<CbSummary> {
* @param bo * @param bo
* @return * @return
*/ */
List<String> getExpenseDateList(@Param("bo") CbSummaryBo bo); List<Map<String,Object>> getExpenseDateList(@Param("bo") CbSummaryBo bo);
/** /**
* 根据level获取名称/成本科目 * 根据level获取名称/成本科目
......
package com.dsk.cscec.service; package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.CbSummary; import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryActualBo; import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo; 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.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo; import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
...@@ -44,7 +46,15 @@ public interface CbSummaryService extends IService<CbSummary> { ...@@ -44,7 +46,15 @@ public interface CbSummaryService extends IService<CbSummary> {
* @param bo * @param bo
* @return * @return
*/ */
List<String> getExpenseDateList(CbSummaryBo bo); List<Map<String,Object>> getExpenseDateList(CbSummaryBo bo);
/**
* 获取已锁定成本月份
*
* @param bo
* @return
*/
List<String> getLockedList(CbSummaryBo bo);
/** /**
* 新增/更新每月费用 * 新增/更新每月费用
...@@ -54,6 +64,20 @@ public interface CbSummaryService extends IService<CbSummary> { ...@@ -54,6 +64,20 @@ public interface CbSummaryService extends IService<CbSummary> {
*/ */
boolean insertOrUpdateActual(List<CbSummaryActualBo> boList); boolean insertOrUpdateActual(List<CbSummaryActualBo> boList);
/**
* 获取未填写成本一级大类
* @param bo
* @return
*/
R getUnfilled(CbSummaryActualLockBo bo);
/**
* 锁定成本
* @param bo
* @return
*/
boolean lockActual(CbSummaryActualLockBo bo);
/** /**
* 导出列表获取 * 导出列表获取
* @param bo * @param bo
......
...@@ -7,20 +7,16 @@ import cn.hutool.core.lang.Assert; ...@@ -7,20 +7,16 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.core.domain.R;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants; import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile; import com.dsk.cscec.domain.*;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.CbSummaryActual;
import com.dsk.cscec.domain.bo.CbSummaryActualBo; import com.dsk.cscec.domain.bo.CbSummaryActualBo;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo; 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.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo; import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import com.dsk.cscec.mapper.CbProjectFileMapper; import com.dsk.cscec.mapper.*;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.mapper.CbSummaryActualMapper;
import com.dsk.cscec.mapper.CbSummaryMapper;
import com.dsk.cscec.service.CbSummaryService; import com.dsk.cscec.service.CbSummaryService;
import jodd.util.StringUtil; import jodd.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -28,6 +24,7 @@ import org.springframework.stereotype.Service; ...@@ -28,6 +24,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -50,6 +47,9 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -50,6 +47,9 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
@Autowired @Autowired
private CbProjectRecordMapper cbProjectRecordMapper; private CbProjectRecordMapper cbProjectRecordMapper;
@Autowired
private CbSummaryActualLockMapper cbSummaryActualLockMapper;
@Override @Override
public void importCbProject(Long projectId, Integer cbStage) { public void importCbProject(Long projectId, Integer cbStage) {
//获取文件信息 //获取文件信息
...@@ -96,33 +96,43 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -96,33 +96,43 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
@Override @Override
public List<CbSummaryActualListVo> getActualList(CbSummaryActualListBo bo) { public List<CbSummaryActualListVo> getActualList(CbSummaryActualListBo bo) {
Assert.notNull(bo.getId(),"id不能为空"); Assert.notNull(bo.getId(), "id不能为空");
Assert.notNull(bo.getCbType(),"成本类型不能为空"); Assert.notNull(bo.getCbType(), "成本类型不能为空");
if (StringUtil.isBlank(bo.getExpenseDate())) { if (StringUtil.isBlank(bo.getExpenseDate())) {
//默认当前月 //默认当前月
bo.setExpenseDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date())); bo.setExpenseDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date()));
} }
//当前父级数据
CbSummary cbSummary = baseMapper.selectById(bo.getId()); CbSummaryActualListVo cbSummaryActualListVo = baseMapper.getById(bo.getId(), bo.getExpenseDate());
if (ObjectUtil.isEmpty(cbSummary)) { if (ObjectUtil.isEmpty(cbSummaryActualListVo)) {
return null; return null;
} }
//截至本月费用汇总
Map<String, BigDecimal> parentTotal = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
cbSummaryActualListVo.setTaxExclusiveExpenseTotal(parentTotal.get("taxExclusiveExpenseTotal"));
cbSummaryActualListVo.setTaxInclusiveExpenseTotal(parentTotal.get("taxInclusiveExpenseTotal"));
List<CbSummaryActualListVo> childrenList = baseMapper.getByParentId(bo.getId(), bo.getExpenseDate()); List<CbSummaryActualListVo> childrenList = baseMapper.getByParentId(bo.getId(), bo.getExpenseDate());
if (0 == cbSummary.getLevel() && 1 == bo.getCbType()) { //截至本月费用汇总
//项目汇总 childrenList.forEach(children -> {
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
});
if (0 == cbSummaryActualListVo.getLevel() && 1 == bo.getCbType()) {
//项目汇总一级列表
return childrenList; return childrenList;
}else if(0 == cbSummary.getLevel() && 2 == bo.getCbType()) { } else if (0 == cbSummaryActualListVo.getLevel() && 2 == bo.getCbType()) {
//成本科目汇总 //成本科目汇总一级列表
CbSummaryActualListVo cbSummaryActualListVo = baseMapper.getById(bo.getId(), bo.getExpenseDate());
cbSummaryActualListVo.setChildren(childrenList); cbSummaryActualListVo.setChildren(childrenList);
List<CbSummaryActualListVo> list = new ArrayList<>(); List<CbSummaryActualListVo> list = new ArrayList<>();
list.add(cbSummaryActualListVo); list.add(cbSummaryActualListVo);
return list; return list;
}else { } else {
//递归列表
childrenList = getProjectSumList(bo); childrenList = getProjectSumList(bo);
CbSummaryActualListVo cbSummaryActualListVo = baseMapper.getById(bo.getId(),bo.getExpenseDate());
cbSummaryActualListVo.setChildren(childrenList); cbSummaryActualListVo.setChildren(childrenList);
List<CbSummaryActualListVo> list = new ArrayList<>(); List<CbSummaryActualListVo> list = new ArrayList<>();
...@@ -133,7 +143,7 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -133,7 +143,7 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
} }
/** /**
* 成本汇总列表 * 成本汇总递归列表
* *
* @param bo * @param bo
* @return * @return
...@@ -146,6 +156,10 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -146,6 +156,10 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
childBo.setId(children.getId()); childBo.setId(children.getId());
childBo.setExpenseDate(bo.getExpenseDate()); childBo.setExpenseDate(bo.getExpenseDate());
children.setChildren(getProjectSumList(childBo)); children.setChildren(getProjectSumList(childBo));
//截至本月费用汇总
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(children.getId(), bo.getExpenseDate());
children.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
children.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
}); });
return childrenList; return childrenList;
...@@ -153,50 +167,142 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -153,50 +167,142 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
} }
@Override @Override
public List<String> getExpenseDateList(CbSummaryBo bo) { public List<Map<String, Object>> getExpenseDateList(CbSummaryBo bo) {
Assert.notNull(bo.getProjectId(),"项目id不能为空"); Assert.notNull(bo.getProjectId(), "项目id不能为空");
Assert.notNull(bo.getCbStage(),"成本阶段不能为空"); // Assert.notNull(bo.getCbStage(),"成本阶段不能为空");
Assert.notNull(bo.getCbType(),"成本类型不能为空"); Assert.notNull(bo.getCbType(), "成本类型不能为空");
return baseMapper.getExpenseDateList(bo); return baseMapper.getExpenseDateList(bo);
} }
@Override
public List<String> getLockedList(CbSummaryBo bo) {
Assert.notNull(bo.getProjectId(), "项目id不能为空");
Assert.notNull(bo.getCbType(), "成本类型不能为空");
return cbSummaryActualLockMapper.getLockedList(bo);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean insertOrUpdateActual(List<CbSummaryActualBo> boList) { public boolean insertOrUpdateActual(List<CbSummaryActualBo> boList) {
if (CollectionUtil.isEmpty(boList)) { if (CollectionUtil.isEmpty(boList)) {
return false; return false;
} }
boList.forEach(bo->{ boList.forEach(bo -> {
Assert.notNull(bo.getCbSummaryId(),"成本汇总id不能为空"); Assert.notNull(bo.getCbSummaryId(), "成本汇总id不能为空");
Assert.notNull(bo.getExpenseDate(),"费用日期不能为空"); Assert.notNull(bo.getExpenseDate(), "费用日期不能为空");
}); });
List<CbSummaryActual> actualList = BeanUtil.copyToList(boList, CbSummaryActual.class);
//todo CbSummary cbSummary = baseMapper.selectById(boList.get(0).getCbSummaryId());
// throw new ServiceException("当前成本已锁定,不允许编辑!"); Assert.isFalse(ObjectUtil.isNull(cbSummary), "成本汇总数据不存在!");
String expenseDate = boList.get(0).getExpenseDate();
boolean exists = cbSummaryActualLockMapper.exists(
new LambdaQueryWrapper<CbSummaryActualLock>()
.eq(CbSummaryActualLock::getProjectId, cbSummary.getProjectId())
.eq(CbSummaryActualLock::getExpenseDate, expenseDate)
.eq(CbSummaryActualLock::getCbType, cbSummary.getCbType())
);
Assert.isFalse(exists, "该月成本已锁定");
List<CbSummaryActual> actualList = BeanUtil.copyToList(boList, CbSummaryActual.class);
return cbSummaryActualMapper.insertOrUpdateBatch(actualList) > 0; return cbSummaryActualMapper.insertOrUpdateBatch(actualList) > 0;
} }
@Override
public R getUnfilled(CbSummaryActualLockBo bo) {
Assert.notNull(bo.getCbType(), "成本类型不能为空");
Assert.notNull(bo.getProjectId(), "项目id不能为空");
Assert.notBlank(bo.getExpenseDate(), "费用日期不能为空");
StringBuilder unfilled = new StringBuilder();
//获取一级大类成本id
List<CbSummary> firstList = baseMapper.selectList(
new LambdaQueryWrapper<CbSummary>()
.eq(CbSummary::getProjectId, bo.getProjectId())
.eq(CbSummary::getLevel, 1)
.eq(CbSummary::getCbType, bo.getCbType())
.orderByAsc(CbSummary::getSort)
);
firstList.forEach(firstCb -> {
//获取大类下的所有子级id
List<CbSummary> allList = new ArrayList<>();
allList.add(firstCb);
allList.addAll(getAllChild(firstCb.getId(), new ArrayList<>()));
//根据子级id查询是否填写实际成本
List<CbSummaryActualListVo> vos = baseMapper.getByIds(allList, bo.getExpenseDate());
if (CollectionUtil.isEmpty(vos)) {
unfilled.append(firstCb.getCbName()).append("、");
}
});
if (unfilled.length() > 0) {
unfilled.deleteCharAt(unfilled.lastIndexOf("、"));
unfilled.append(" 未填写成本,是否继续锁定?");
return R.fail(unfilled.toString());
} else {
return R.ok();
}
}
private List<CbSummary> getAllChild(Long id, List<CbSummary> resultList) {
List<CbSummary> childList = baseMapper.selectList(
new LambdaQueryWrapper<CbSummary>()
.eq(CbSummary::getParentId, id)
);
if (CollectionUtil.isNotEmpty(childList)) {
resultList.addAll(childList);
childList.forEach(child -> {
getAllChild(child.getId(), resultList);
});
}
return resultList;
}
@Override
public boolean lockActual(CbSummaryActualLockBo bo) {
Assert.notNull(bo.getCbType(), "成本类型不能为空");
Assert.notNull(bo.getProjectId(), "项目id不能为空");
Assert.notBlank(bo.getExpenseDate(), "费用日期不能为空");
boolean exists = cbSummaryActualLockMapper.exists(
new LambdaQueryWrapper<CbSummaryActualLock>()
.eq(CbSummaryActualLock::getProjectId, bo.getProjectId())
.eq(CbSummaryActualLock::getExpenseDate, bo.getExpenseDate())
.eq(CbSummaryActualLock::getCbType, bo.getCbType())
);
Assert.isFalse(exists, "该月成本已锁定,请勿重复操作!");
CbSummaryActualLock lock = BeanUtil.copyProperties(bo, CbSummaryActualLock.class);
return cbSummaryActualLockMapper.insert(lock) > 0;
}
@Override @Override
public List<CbSummaryActualListVo> getAll(CbSummaryActualListBo bo) { public List<CbSummaryActualListVo> getAll(CbSummaryActualListBo bo) {
Assert.notNull(bo.getId(), "项目id不能为空"); Assert.notNull(bo.getProjectId(), "项目id不能为空");
Assert.notNull(bo.getCbType(), "成本类型不能为空"); Assert.notNull(bo.getCbType(), "成本类型不能为空");
Assert.notNull(bo.getExpenseDate(), "费用日期不能为空"); Assert.notNull(bo.getExpenseDate(), "费用日期不能为空");
//获取项目成本阶段 //获取项目成本阶段
CbProjectRecord cbProjectRecord = cbProjectRecordMapper.selectById(bo.getId()); CbProjectRecord cbProjectRecord = cbProjectRecordMapper.selectById(bo.getProjectId());
if (ObjectUtil.isNull(cbProjectRecord)) { if (ObjectUtil.isNull(cbProjectRecord)) {
throw new ServiceException("当前项目不存在"); throw new ServiceException("当前项目不存在");
} }
bo.setCbStage(cbProjectRecord.getCbStage()); // bo.setCbStage(cbProjectRecord.getCbStage());
List<CbSummaryActualListVo> resultList = new ArrayList<>();
if (bo.getCbType() == 1) { if (bo.getCbType() == 1) {
return baseMapper.getProjectAll(bo); resultList = baseMapper.getProjectAll(bo);
} else { } else {
return baseMapper.getCostAccountAll(bo); resultList = baseMapper.getCostAccountAll(bo);
} }
//todo 截至本月费用汇总 //截至本月费用汇总
resultList.forEach(cbSummaryActualListVo -> {
Map<String, BigDecimal> total = cbSummaryActualMapper.getTotal(cbSummaryActualListVo.getId(), bo.getExpenseDate());
cbSummaryActualListVo.setTaxExclusiveExpenseTotal(total.get("taxExclusiveExpenseTotal"));
cbSummaryActualListVo.setTaxInclusiveExpenseTotal(total.get("taxInclusiveExpenseTotal"));
});
return resultList;
} }
} }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.cscec.mapper.CbSummaryActualLockMapper">
<resultMap type="com.dsk.cscec.domain.CbSummaryActualLock" id="CbSummaryActualLockMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="projectId" column="project_id" jdbcType="INTEGER"/>
<result property="expenseDate" column="expense_date" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
</resultMap>
<sql id="baseColumn">
id, project_id, expense_date, create_time, del_flag
</sql>
<select id="getLockedList" resultType="java.lang.String">
select csal.expense_date
from cb_summary_actual_lock csal
where
csal.project_id = #{bo.projectId}
and csal.cb_type = #{bo.cbType}
and csal.del_flag = 0
order by csal.expense_date desc
</select>
</mapper>
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
<result property="taxInclusiveExpense" column="tax_inclusive_expense" jdbcType="NUMERIC"/> <result property="taxInclusiveExpense" column="tax_inclusive_expense" jdbcType="NUMERIC"/>
<result property="taxExclusiveExpense" column="tax_exclusive_expense" jdbcType="NUMERIC"/> <result property="taxExclusiveExpense" column="tax_exclusive_expense" jdbcType="NUMERIC"/>
<result property="expenseDate" column="expense_date" jdbcType="VARCHAR"/> <result property="expenseDate" column="expense_date" jdbcType="VARCHAR"/>
<result property="lockStatus" column="lock_status" jdbcType="INTEGER"/> <!-- <result property="lockStatus" column="lock_status" jdbcType="INTEGER"/>-->
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="INTEGER"/> <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
</resultMap> </resultMap>
<sql id="baseColumn"> <sql id="baseColumn">
id, cb_summary_id, tax_inclusive_expense, tax_exclusive_expense, expense_date, lock_status, create_time, del_flag id, cb_summary_id, tax_inclusive_expense, tax_exclusive_expense, expense_date, create_time, del_flag
</sql> </sql>
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true"> <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
...@@ -27,5 +27,16 @@ ...@@ -27,5 +27,16 @@
cb_summary_id = values(cb_summary_id) , tax_inclusive_expense = values(tax_inclusive_expense) , cb_summary_id = values(cb_summary_id) , tax_inclusive_expense = values(tax_inclusive_expense) ,
tax_exclusive_expense = values(tax_exclusive_expense) , expense_date = values(expense_date) tax_exclusive_expense = values(tax_exclusive_expense) , expense_date = values(expense_date)
</insert> </insert>
<select id="getTotal" resultType="map">
select ifnull(sum(csa.tax_inclusive_expense),0) taxInclusiveExpenseTotal,
ifnull(sum(csa.tax_exclusive_expense),0) taxExclusiveExpenseTotal
from cb_summary_actual csa
<where>
csa.cb_summary_id = #{cbSummaryId}
and csa.expense_date &lt;= #{expenseDate}
and csa.del_flag = 0
</where>
</select>
</mapper> </mapper>
...@@ -50,15 +50,32 @@ ...@@ -50,15 +50,32 @@
</where> </where>
</select> </select>
<select id="getByIds" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select csu.*,csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense,csa.expense_date
from cb_summary csu
left join cb_summary_actual csa on csu.id = csa.cb_summary_id
<where>
csa.expense_date = #{expenseDate}
and csa.del_flag = 0
and csu.del_flag = 0
and csu.id in
<foreach collection="entities" item="entity" separator="," open="(" close=")">
#{entity.id}
</foreach>
</where>
</select>
<select id="getProjectAll" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo"> <select id="getProjectAll" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select select
<include refid="baseColumn"></include>, <include refid="baseColumn"></include>,
csa.tax_inclusive_expense,csa.tax_exclusive_expense csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense
from cb_summary csu 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 csa on csu.id = csa.cb_summary_id and csa.expense_date = #{bo.expenseDate} AND csa.del_flag = 0
<where> <where>
csu.project_id = #{bo.id} csu.project_id = #{bo.projectId}
and csu.cb_stage = #{bo.cbStage} <if test="bo.cbStage != null">
and csu.cb_stage = #{bo.cbStage}
</if>
and csu.cb_type = #{bo.cbType} and csu.cb_type = #{bo.cbType}
and csu.del_flag = 0 and csu.del_flag = 0
and csu.level != 0 and csu.level != 0
...@@ -69,30 +86,33 @@ ...@@ -69,30 +86,33 @@
<select id="getCostAccountAll" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo"> <select id="getCostAccountAll" resultType="com.dsk.cscec.domain.vo.CbSummaryActualListVo">
select select
<include refid="baseColumn"></include>, <include refid="baseColumn"></include>,
csa.tax_inclusive_expense,csa.tax_exclusive_expense csa.id actualId,csa.tax_inclusive_expense,csa.tax_exclusive_expense
from cb_summary csu 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 csa on csu.id = csa.cb_summary_id and csa.expense_date = #{bo.expenseDate} AND csa.del_flag = 0
<where> <where>
csu.project_id = #{bo.projectId} csu.project_id = #{bo.projectId}
and csu.cb_stage = #{bo.cbStage} <if test="bo.cbStage != null">
and csu.cb_stage = #{bo.cbStage}
</if>
and csu.cb_type = #{bo.cbType} and csu.cb_type = #{bo.cbType}
and csu.del_flag = 0 and csu.del_flag = 0
</where> </where>
order by csu.sort order by csu.sort
</select> </select>
<select id="getExpenseDateList" resultType="string"> <select id="getExpenseDateList" resultType="map">
select csa.expense_date select csa.expense_date expenseDate,
if(csal.id is null,0,1) as isLock
from cb_summary_actual csa from cb_summary_actual csa
left join cb_summary csu on csu.id = csa.cb_summary_id left join cb_summary csu on csu.id = csa.cb_summary_id
left join cb_summary_actual_lock csal on csal.project_id = csu.project_id and csal.expense_date = csa.expense_date and csal.del_flag = 0
where where
csu.project_id = #{bo.projectId} csu.project_id = #{bo.projectId}
and csu.cb_stage = #{bo.cbStage}
and csu.cb_type = #{bo.cbType} and csu.cb_type = #{bo.cbType}
and csu.del_flag = 0 and csu.del_flag = 0
and csa.del_flag = 0 and csa.del_flag = 0
group by csa.expense_date group by csa.expense_date
order by csa.expense_date asc order by csa.expense_date desc
</select> </select>
<select id="selectByLevel" resultType="map"> <select id="selectByLevel" resultType="map">
......
...@@ -7,3 +7,74 @@ export function checkProjectCodeExist (data) { ...@@ -7,3 +7,74 @@ export function checkProjectCodeExist (data) {
method: 'get', method: 'get',
}) })
} }
//新增项目
export function addProject (data) {
return request({
url: '/cbProjectRecord/addProject',
method: 'post',
data:data,
})
}
//修改项目
export function editProjectInfo (data) {
return request({
url: '/cbProjectRecord/editProjectInfo',
method: 'PUT',
data:data,
})
}
//新增新阶段项目
export function addNewStageProject (data) {
return request({
url: '/cbProjectRecord/addNewStageProject',
method: 'POST',
data:data,
})
}
//获取当前项目文件上传
export function getProjectFileUploadDetail (projectId) {
return request({
url: '/cbProjectFile/getProjectFileUploadDetail/'+projectId,
method: 'get',
})
}
//获取草稿箱列表
export function getDraftDialogList (projectId) {
return request({
url: '/cbProjectRecord/getDraftDialogList',
method: 'get',
})
}
//上传文件
export function uploadCbProjectFile (data) {
return request({
url: '/cbProjectFile/uploadCbProjectFile',
method: 'post',
data
})
}
//删除文件
export function deleteCbProjectFile (fileId) {
return request({
url: '/cbProjectFile/deleteCbProjectFile/'+fileId,
method: 'Delete',
})
}
//删除草稿
export function deleteDraft (projectId) {
return request({
url: '/cbProjectRecord/deleteDraft/'+projectId,
method: 'Delete',
})
}
//查询当前项目可删除成本阶段
export function getProjectCbStageNotDraft (relatedId) {
return request({
url: '/cbProjectRecord/getProjectCbStageNotDraft/'+relatedId,
method: 'get',
})
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="feed-summary-container"> <div class="feed-summary-container">
<div class="feed-summary-inner"> <div class="feed-summary-inner">
<div class="left-side-menu"> <div class="left-side-menu">
<project-side-menu :menuTree="menuTreeList"></project-side-menu> <project-side-menu :menuTree="menuTreeList" :unique-opened="false" :default-active="defaultActive"></project-side-menu>
</div> </div>
</div> </div>
</div> </div>
...@@ -16,6 +16,7 @@ export default { ...@@ -16,6 +16,7 @@ export default {
}, },
data() { data() {
return { return {
defaultActive: "",
menuTreeList: [ menuTreeList: [
{ {
nodeName: "房建类成本科目", nodeName: "房建类成本科目",
...@@ -81,7 +82,7 @@ export default { ...@@ -81,7 +82,7 @@ export default {
}, },
//可访问data属性 //可访问data属性
created() { created() {
}, },
//计算集 //计算集
computed: { computed: {
......
<template> <template>
<div class="project-menu-item-container"> <div class="project-menu-item-container">
<template>
<!-- 有下级菜单 -->
<template v-if="checkHasChidren">
<el-submenu :index="menuItem.nodeValue" ref="projectSubMenuItem" class="project-sub-menu-item">
<template slot="title">
<i class="el-icon-location"></i>
<span>111</span>
</template>
</el-submenu>
</template>
<template v-else>
</div> </template>
</template>
</div>
</template> </template>
<script> <script>
export default { export default {
name : "projectMenuItem", name: "projectMenuItem",
data() { props: {
return { menuItem: {
type: Object,
required: true,
default: () => ({})
}
},
data() {
return {
} };
}, },
//可访问data属性 //可访问data属性
created(){ created() {
}, },
//计算集 //计算集
computed:{ computed: {
checkHasChidren() {
return !!(this.menuItem && this.menuItem?.children && this.menuItem.children.length);
}
},
//方法集
methods: {
}, },
//方法集
methods:{
},
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.project-menu-item-container { .project-menu-item-container {
} }
</style> </style>
<template> <template>
<div class="project-side-menu-container"> <div class="project-side-menu-container">
<el-menu mode="vertical" class="project-side-menu-instance"> <el-menu mode="vertical" class="project-side-menu-instance" :unique-opened="uniqueOpened" :default-active="defaultActive" @select="menuSelect"
@open="subMenuOpen" @close="subMenuClose">
<template v-for="(item,index) of tempMenuTree"> <template v-for="(item,index) of tempMenuTree">
<project-menu-item :menuItem="item" :key="item.nodeValue"></project-menu-item> <project-menu-item :menuItem="item" :key="item.nodeValue"></project-menu-item>
</template> </template>
...@@ -31,6 +32,16 @@ export default { ...@@ -31,6 +32,16 @@ export default {
icon: "icon", icon: "icon",
suffixIcon: "suffixIcon" suffixIcon: "suffixIcon"
}) })
},
// 只保持打开一个菜单
uniqueOpened: {
type: Boolean,
default: false
},
// 默认打开的菜单
defaultActive: {
type: String,
default: ""
} }
}, },
watch: { watch: {
...@@ -69,6 +80,16 @@ export default { ...@@ -69,6 +80,16 @@ export default {
}, },
//方法集 //方法集
methods: { methods: {
// 事件订阅
subMenuOpen(menuPath) {
this.$emit("open", menuPath);
},
subMenuClose(menuPath) {
this.$emit("close", menuPath);
},
menuSelect(menuPath) {
this.$emit("select", menuPath);
},
// 初始化树形结构 // 初始化树形结构
initMenuTree(array = []) { initMenuTree(array = []) {
if (array?.length) { if (array?.length) {
...@@ -162,19 +183,21 @@ export default { ...@@ -162,19 +183,21 @@ export default {
overflow: auto; overflow: auto;
/* 重置一级二级菜单 高度行高 */ /* 重置一级二级菜单 高度行高 */
/* .el-submenu__title { .project-sub-menu-item {
height: 32px; & > .el-submenu__title {
line-height: 32px; height: 32px;
line-height: 32px;
&:hover { &:hover {
background-color: unset; background-color: unset;
background: linear-gradient( background: linear-gradient(
91deg, 91deg,
rgba(0, 129, 255, 0.1) 0%, rgba(0, 129, 255, 0.1) 0%,
rgba(0, 129, 255, 0) 100% rgba(0, 129, 255, 0) 100%
); );
}
} }
} */ }
} }
} }
</style> </style>
...@@ -16,12 +16,12 @@ ...@@ -16,12 +16,12 @@
<el-input v-model="formdata.customerName" placeholder="请输入IPM项目编码" clearable></el-input> <el-input v-model="formdata.customerName" placeholder="请输入IPM项目编码" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本阶段"> <el-form-item label="成本阶段">
<el-select v-model="formdata.customerClass" multiple placeholder="请选择" :collapse-tags="true" clearable> <el-select v-model="formdata.customerClass" placeholder="请选择" :collapse-tags="true" clearable>
<el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option> <el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="项目状态"> <el-form-item label="项目状态">
<el-select v-model="formdata.customerClass" multiple placeholder="请选择" :collapse-tags="true" clearable> <el-select v-model="formdata.customerClass" placeholder="请选择" :collapse-tags="true" clearable>
<el-option v-for="(item,index) in ztStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option> <el-option v-for="(item,index) in ztStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<div class="totals">{{total}}</div> <div class="totals">{{total}}</div>
<div class="btns"> <div class="btns">
<div class="btn btn_primary h32" @click="addPro">导入项目</div> <div class="btn btn_primary h32" @click="addPro">导入项目</div>
<div class="btn btn_default h32" @click="getcgx">草稿箱 (0)</div> <div class="btn btn_default h32" @click="getcgx">草稿箱 ({{cgxtotal}})</div>
</div> </div>
</div> </div>
<div class="table-item-jf table-item"> <div class="table-item-jf table-item">
...@@ -64,19 +64,19 @@ ...@@ -64,19 +64,19 @@
<el-table-column label="工程名称" width="416" :resizable="false"> <el-table-column label="工程名称" width="416" :resizable="false">
<template slot-scope="scope"> <template slot-scope="scope">
<div style="display:flex;align-items:center"> <div style="display:flex;align-items:center">
<el-tooltip placement="top" v-if="scope.row.customerText.length>20"> <!--<el-tooltip placement="top" v-if="scope.row.customerText.length>20">-->
<div slot="content">{{scope.row.customerText}}</div> <!--<div slot="content">{{scope.row.customerText}}</div>-->
<div class="renling"> <!--<div class="renling">-->
<router-link v-if="scope.row.companyId" :to="`/enterprise/${encodeStr(scope.row.companyId)}?path=cooperationRecord&companyName=${scope.row.customerName}`" tag="a" <!--<router-link v-if="scope.row.companyId" :to="`/enterprise/${encodeStr(scope.row.companyId)}?path=cooperationRecord&companyName=${scope.row.customerName}`" tag="a"-->
class="wordprimary" v-html="scope.row.customerName"></router-link> <!--class="wordprimary" v-html="scope.row.customerName"></router-link>-->
<span v-else v-html="scope.row.customerName"></span> <!--<span v-else v-html="scope.row.customerName"></span>-->
</div> <!--</div>-->
</el-tooltip> <!--</el-tooltip>-->
<div class="renling" v-else> <!--<div class="renling" v-else>-->
<router-link v-if="scope.row.companyId" :to="`/enterprise/${encodeStr(scope.row.companyId)}?path=cooperationRecord&companyName=${scope.row.customerName}`" tag="a" <!--<router-link v-if="scope.row.companyId" :to="`/enterprise/${encodeStr(scope.row.companyId)}?path=cooperationRecord&companyName=${scope.row.customerName}`" tag="a"-->
class="wordprimary" v-html="scope.row.customerName"></router-link> <!--class="wordprimary" v-html="scope.row.customerName"></router-link>-->
<span v-else v-html="scope.row.customerName"></span> <!--<span v-else v-html="scope.row.customerName"></span>-->
</div> <!--</div>-->
</div> </div>
</template> </template>
...@@ -107,9 +107,9 @@ ...@@ -107,9 +107,9 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" min-width="256" :resizable="false" fixed="right"> <el-table-column label="操作" min-width="256" :resizable="false" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<span class="wordprimary tabs" @click="goAccess(scope.row)">修改项目信息</span> <span class="wordprimary tabs" @click="editpro(scope.row)">修改项目信息</span>
<span class="wordprimary tabs" @click="goAssessment(scope.row)">查看导入进度</span> <span class="wordprimary tabs" @click="detailpro(scope.row)">查看导入进度</span>
<span class="worddel tabs" @click="goDisposal(scope.row)">删除</span> <span class="worddel tabs" @click="deleetpro(scope.row)">删除</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -121,12 +121,30 @@ ...@@ -121,12 +121,30 @@
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
<el-dialog title="删除项目" :visible.sync="deletevisible" width="480px" custom-class='dialog-supplier'>
<el-divider></el-divider>
<div class="protypes">
<div class="ck" v-if="typenum>1">项目台账共有3个阶段</div>
<div class="ck" v-else>是否删除此项目?删除后无法返回。</div>
<div class="ck"><el-checkbox :indeterminate="indeterminate" v-model="checkAll" @change="handleCheckAllChange">删除全部</el-checkbox></div>
<el-checkbox-group v-model="checkds" @change="handleCheck">
<div class="ck" v-for="(item,index) in allchecks">
<el-checkbox :key="index" :label="item.label">{{item.text}}</el-checkbox>
</div>
</el-checkbox-group>
</div>
<el-divider></el-divider>
<div style="padding: 16px 20px 24px;text-align: right">
<el-button size="small" @click="deletevisible = false">取消</el-button>
<el-button type="primary" size="small" @click="getDelete">确定删除</el-button>
</div>
</el-dialog>
<el-dialog <el-dialog
class="pro-news" class="pro-news"
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="480px"> width="480px">
<div class="poptitle"> <div class="poptitle">
<span>新建商机</span> <span>{{protitle}}</span>
</div> </div>
<el-form class="popform" label-width="97px" :model="queryParam" :rules="rules" ref="ruleForm"> <el-form class="popform" label-width="97px" :model="queryParam" :rules="rules" ref="ruleForm">
<el-form-item label="项目名称" class="row"> <el-form-item label="项目名称" class="row">
...@@ -141,26 +159,29 @@ ...@@ -141,26 +159,29 @@
<el-input type="text" placeholder="请输入文件名称" v-model="queryParam.projectFileName"></el-input> <el-input type="text" placeholder="请输入文件名称" v-model="queryParam.projectFileName"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本阶段" class="row" prop="cbStage"> <el-form-item label="成本阶段" class="row" prop="cbStage">
<el-select placeholder="请选择成本阶段" v-model="queryParam.cbStage"> <el-checkbox v-model="ischeck" v-if="isedit" class="checkcb"></el-checkbox>
<el-select placeholder="请选择成本阶段" v-model="queryParam.cbStage" :disabled="!ischeck">
<el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option> <el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form > </el-form >
<div class="popbot"> <div class="popbot">
<div class="btn btn_cancel h32" @click="dialogVisible = false">取消</div> <div class="btn btn_cancel h32" @click="dialogVisible = false">取消</div>
<div class="btn btn_primary h32" @click="insertPro" :class="{'btn_disabled':!queryParam.cbStage}" :disabled="!queryParam.cbStage">下一步,导入数据</div> <div class="btn btn_primary h32" v-if="isedit && !ischeck" @click="savepro">保存</div>
<div class="btn btn_primary h32" v-if="isedit && ischeck" @click="changepro">下一步,导入数据</div>
<div class="btn btn_primary h32" v-if="!isedit && !ischeck" @click="insertPro" :class="{'btn_disabled':!queryParam.cbStage}" :disabled="!queryParam.cbStage">下一步,导入数据</div>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
<proupload v-if="isupload"></proupload> <proupload v-if="isupload" :uploadData="uploadData" :cbStagelist="cbStagelist" :prodetail="prodetail" @closeupload="colsepro"></proupload>
<el-dialog title="草稿箱" :visible.sync="cgxVisible" width="960px" custom-class='dialog-supplier'> <el-dialog title="草稿箱" :visible.sync="cgxVisible" width="960px" custom-class='dialog-supplier'>
<el-divider></el-divider> <el-divider></el-divider>
<div style="padding: 24px 20px;"> <div style="padding: 24px 20px;">
<skeleton v-if="cgxSkeleton"></skeleton> <skeleton v-if="cgxSkeleton"></skeleton>
<div class="table-item-jf table-item" v-if="!cgxSkeleton"> <div class="table-item-jf table-item" v-if="!cgxSkeleton">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}" <el-table :data="cgxlist" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}"
v-sticky-header.always="{offsetTop : '-16px',offsetBottom : '10px'}" class="table-item1 fixed-table" v-sticky-header.always="{offsetTop : '-16px',offsetBottom : '10px'}" class="table-item1 fixed-table"
border highlight-current-row> border highlight-current-row>
...@@ -171,30 +192,32 @@ ...@@ -171,30 +192,32 @@
<!--</el-table-column>--> <!--</el-table-column>-->
<el-table-column label="项目名称" width="451px" > <el-table-column label="项目名称" width="451px" >
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.legalPerson||'--'}}</span> <span>{{scope.row.projectName||'--'}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="成本阶段" width="105px"> <el-table-column label="成本阶段" width="105px">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.legalPerson||'--'}}</span> <div v-for="(item,index) in cbStagelist" :key="index+11">
<span v-if="scope.row.cbStage == item.dictValue">{{item.dictLabel}}</span>
</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="更新时间" width="205px" :resizable="false"> <el-table-column label="更新时间" width="205px" :resizable="false">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.legalPerson||'--'}}</span> <span>{{scope.row.updateTime||'--'}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<span class="wordprimary">继续编辑</span> <span class="wordprimary" @click="jxbj(scope.row)">继续编辑</span>
<span class="worddel">删除</span> <span class="worddel" @click="deletecg(scope.row.id)">删除</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div class="pagination clearfix" v-show="total>formdata.pageSize"> <div class="pagination clearfix" v-show="total>cgPagesize">
<el-pagination background :page-size="formdata.pageSize" :current-page.sync="formdata.pageNum" <el-pagination background :page-size="cgPagesize" :current-page.sync="cgPagenum"
@current-change="handleCurrentChange" layout="prev, pager, next" @current-change="getCGXlist" layout="prev, pager, next"
:total="cgxtotal"> :total="cgxtotal">
</el-pagination> </el-pagination>
</div> </div>
...@@ -204,7 +227,14 @@ ...@@ -204,7 +227,14 @@
</template> </template>
<script> <script>
import '@/assets/styles/public.scss' import '@/assets/styles/public.scss'
import { checkProjectCodeExist } from '@/api/projectCostLedger/index' import {
addNewStageProject,
addProject,
checkProjectCodeExist,
deleteDraft,
editProjectInfo,
getDraftDialogList,getProjectCbStageNotDraft
} from '@/api/projectCostLedger/index'
import { getDicts } from '@/api/system/dict/data' import { getDicts } from '@/api/system/dict/data'
import proupload from '@/views/projectCostLedger/upload/index' import proupload from '@/views/projectCostLedger/upload/index'
import skeleton from '@/views/project/projectList/component/skeleton' import skeleton from '@/views/project/projectList/component/skeleton'
...@@ -214,9 +244,11 @@ ...@@ -214,9 +244,11 @@
components:{proupload,skeleton}, components:{proupload,skeleton},
data() { data() {
return { return {
typenum:2,
formdata:{}, formdata:{},
isSkeleton:false, isSkeleton:false,
total:10, total:10,
protitle:'',
dialogVisible:false, dialogVisible:false,
cbStagelist:[], cbStagelist:[],
ztStagelist:[], ztStagelist:[],
...@@ -232,10 +264,24 @@ ...@@ -232,10 +264,24 @@
cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },], cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },],
}, },
isupload:false, isupload:false,
tableData:[], tableData:[{}],
cgxVisible:true, cgxVisible:false,
cgxSkeleton:false, cgxSkeleton:false,
cgxtotal:10, cgxtotal:0,
cgxlist:[],
uploadData:{
cbStage:0,
},//新增项目返回的数据
cgPagesize:10,
cgPagenum:1,
prodetail:false,
isedit:false,//是否修改项目
ischeck:false,//是否可选
deletevisible:false,
indeterminate:false,//半选状态
checkAll:false,
checkds:[],
allchecks:[],//可以用的项目阶段
}; };
}, },
//可访问data属性 //可访问data属性
...@@ -249,7 +295,10 @@ ...@@ -249,7 +295,10 @@
getDicts('pro_ztstage').then(res=>{ getDicts('pro_ztstage').then(res=>{
this.ztStagelist = res.data this.ztStagelist = res.data
}) })
//获取草稿箱
this.getCGXlist()
//获取列表
this.getlist()
}, },
//计算集 //计算集
computed: { computed: {
...@@ -257,7 +306,79 @@ ...@@ -257,7 +306,79 @@
}, },
//方法集 //方法集
methods: { methods: {
getlist(){
},
handleCheckAllChange(val){
this.checkAll = val
this.checkds = []
if(val == true){
this.allchecks.forEach(item=>{
this.checkds.push(item.label)
})
}
this.indeterminate = false
},
handleCheck(){
if(this.checkds.length == this.typenum){
this.checkAll = true
}else{
this.checkAll = false
}
this.indeterminate = this.checkds.length > 0 && this.checkds.length < this.typenum
},
//修改项目
editpro(row){
this.isedit = true
this.ischeck = false
this.prodetail = false
this.dialogVisible = true
this.queryParam = {}
this.queryParam = [...this.queryParam,...row]
this.protitle = '修改项目信息'
},
//查看进度
detailpro(row){
this.uploadData = row
this.uploadData.id = this.uploadData.projectId
this.prodetail = true
},
//删除项目
deleetpro(row){
this.deletevisible = true
this.prodetail = false
getProjectCbStageNotDraft(row.relatedId).then(res=>{
let list = res.data
let cb = this.cbStagelist
let datas = []
list.forEach(item =>{
cb.for(i=>{
if(item.dictValue == i){
let arr = {'label':i,'text':item.dictLabel}
datas.push(arr)
}
})
})
this.allchecks = datas
this.typenum = list.length
this.checkds = []
})
},
getDelete(){
// this.checkds 勾选了要删除的数据
this.getlist()
},
//返回列表
colsepro(){
this.isupload = false
this.getCGXlist()
this.getlist()
},
addPro(){ addPro(){
this.ischeck = true
this.isedit = false
this.dialogVisible = true this.dialogVisible = true
this.queryParam = { this.queryParam = {
projectName: '',//项目名称 projectName: '',//项目名称
...@@ -266,10 +387,12 @@ ...@@ -266,10 +387,12 @@
projectFileName: '',// 文件名称 projectFileName: '',// 文件名称
cbStage: ''//成本阶段 cbStage: ''//成本阶段
} }
this.protitle = '新增项目'
}, },
getSearch(){ getSearch(){
this.formdata.pageNum = 1 this.formdata.pageNum = 1
// this.customerAll()
this.getlist()
}, },
getipmProjectNo(){ getipmProjectNo(){
//点击且校验了当前编码有数据才获取 //点击且校验了当前编码有数据才获取
...@@ -301,8 +424,35 @@ ...@@ -301,8 +424,35 @@
}, },
//添加项目 //添加项目
insertPro(){ insertPro(){
let id = '' addProject(JSON.stringify(this.queryParam)).then(res=>{
if(res.code == 200){
this.uploadData = res.data
this.isupload = true
}
})
},
//修改项目
savepro(){
editProjectInfo(JSON.stringify(this.queryParam)).then(res=>{
if(res.code == 200){
this.dialogVisible = false
this.getlist()
}
})
},
//修改阶段
changepro(){
addNewStageProject(JSON.parse(JSON.stringify(this.queryParam))).then(res=>{
this.uploadData = res.data
this.uploadData.id = this.uploadData.projectId
this.isupload = true
})
},
//继续编辑
jxbj(data){
this.uploadData = data
this.isupload = true this.isupload = true
this.cgxVisible = false
}, },
handleCurrentChange(val){ handleCurrentChange(val){
this.formdata.pageNum = val this.formdata.pageNum = val
...@@ -320,7 +470,46 @@ ...@@ -320,7 +470,46 @@
return "enterprise-name-row"; return "enterprise-name-row";
}, },
getcgx(){ getcgx(){
this.cgxVisible = true if(this.cgxtotal>0){
this.getCGXlist(1)
this.cgxVisible = true
}
},
getCGXlist(page){
this.cgxSkeleton = true
this.cgPagenum = page
let param = {
pageSize: this.cgPagesize,
pageNum: this.cgPagenum
}
getDraftDialogList(param).then(res=>{
this.cgxtotal = res.total
this.cgxlist = res.rows
this.cgPagenum = res.currentPage
this.cgxSkeleton = false
})
},
deletecg(id){
this.$confirm('是否确定删除此项目,删除后无法找回。', '提示', {
confirmButtonText: '确定删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteDraft(id).then(res=>{
if(res.code == 200){
this.$message({
type: 'success',
message: '删除成功!'
});
this.getCGXlist(1)
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
}, },
}, },
} }
...@@ -426,7 +615,10 @@ ...@@ -426,7 +615,10 @@
.row { .row {
margin-bottom: 16px; margin-bottom: 16px;
position: relative; position: relative;
.checkcb{
position: absolute;
left: -100px;
}
.el-form-item__label { .el-form-item__label {
font-weight: 400; font-weight: 400;
opacity: 0.8; opacity: 0.8;
...@@ -546,7 +738,29 @@ ...@@ -546,7 +738,29 @@
padding: 0; padding: 0;
} }
} }
.wordprimary{
margin-left: 12px;
}
.worddel{ .worddel{
color: #FA5351; color: #FA5351;
padding-left: 12px;
cursor: pointer;
} }
.pagination{
padding-top: 16px;
text-align: right;
}
.protypes{
padding: 24px 20px;
.ck{
margin-bottom: 12px;
height: 22px;
font-size: 14px;
color: rgba(35,35,35,0.8);
line-height: 22px;
&:last-child{
margin-bottom: 0;
}
}
}
</style> </style>
<template> <template>
<div class="project-cost-ledger-inner"> <div class="project-cost-ledger-inner">
<el-upload
ref="uploadpro"
class="upload-demo"
:multiple="true"
accept=".xls,.xlsx"
action=""
drag
:auto-upload="false"
:on-change="handleFileListChange"
:headers="headers">
</el-upload>
<div class="pro-upload"> <div class="pro-upload">
<div class="title_wrap i"> <div class="title_wrap i">
<div class="title-small"><span>项目成本台账 <i class="el-icon-arrow-right"></i> </span>导入项目</div> <div class="title-small"><span>项目成本台账 <i class="el-icon-arrow-right"></i> </span>导入项目</div>
...@@ -11,16 +23,16 @@ ...@@ -11,16 +23,16 @@
<el-form :model="formdata" label-width="82px" :rules="rules" label-position="right" :inline="true"> <el-form :model="formdata" label-width="82px" :rules="rules" label-position="right" :inline="true">
<el-row> <el-row>
<el-form-item label="项目名称"> <el-form-item label="项目名称">
<el-input v-model="formdata.customerName" disabled placeholder="请输入工程名称" clearable></el-input> <el-input v-model="formdata.projectName" disabled placeholder="请输入工程名称" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="IPM项目编码" label-width="100px"> <el-form-item label="IPM项目编码" label-width="100px">
<el-input v-model="formdata.customerName" disabled placeholder="请输入IPM项目编码" clearable></el-input> <el-input v-model="formdata.ipmProjectNo" disabled placeholder="请输入IPM项目编码" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="文件名称" label-width="100px"> <el-form-item label="文件名称" label-width="100px">
<el-input v-model="formdata.customerName" disabled placeholder="请输入文件名称" clearable></el-input> <el-input v-model="formdata.projectFileName" disabled placeholder="请输入文件名称" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本阶段" prop="cbStage"> <el-form-item label="成本阶段" prop="cbStage">
<el-select v-model="formdata.cbStage" disabled multiple placeholder="请选择" :collapse-tags="true" <el-select v-model="formdata.cbStage" disabled placeholder="请选择" :collapse-tags="true"
clearable> clearable>
<el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" <el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue"
:key="index"></el-option> :key="index"></el-option>
...@@ -39,152 +51,168 @@ ...@@ -39,152 +51,168 @@
<el-row> <el-row>
<el-form-item label="直接费成本" prop="zjfcb"> <el-form-item label="直接费成本" prop="zjfcb">
<div class="filelist"> <div class="filelist">
<div class="fileli"> <div class="fileli" v-for="(item,index) in directExpense">
<div> <div>
<img src="../../../assets/images/icon_wrapper.png"> <img src="../../../assets/images/icon_wrapper.png">
<div class="name">宝安中学(集团)初中部改扩建工程施工总承包(二次公告)-加固修缮工程.xls</div> <div class="name">{{item.fileName}}</div>
<div class="prostatus i1">解析成功</div> <template v-if="item.fileParseStatus">
<div class="cz"> <div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div>重新上传</div> <div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div>删除</div> <div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div> </div>
</div> </div>
<div class="wrong"> <div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:解析失败的原因展示 失败原因:{{item.failRemark||'--'}}
</div>
</div>
<div class="fileli">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">宝安中学(集团)初中部改扩建工程施工总承包(二次公告)-加固修缮工程.xls</div>
<div class="prostatus i2">解析中</div>
<div class="cz">
<div>重新上传</div>
<div>删除</div>
</div>
</div>
</div>
<div class="fileli">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">宝安中学(集团)初中部改扩建工程施工总承包(二次公告)-加固修缮工程.xls</div>
<div class="prostatus i3">解析失败</div>
<div class="cz">
<div>重新上传</div>
<div>删除</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(0)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<el-form-item label="工料汇总" prop="glhz"> <el-form-item label="工料汇总" prop="glhz">
<div class="filelist">
<div class="fileli" v-for="(item,index) in quantitySummary">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">{{item.fileName}}</div>
<template v-if="item.fileParseStatus">
<div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div>
</div>
<div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:{{item.failRemark||'--'}}
</div>
</div>
</div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(1)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<el-form-item label="措施项目" prop="csxm"> <el-form-item label="措施项目" prop="csxm">
<div class="filelist">
<div class="fileli" v-for="(item,index) in measureProject">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">{{item.fileName}}</div>
<template v-if="item.fileParseStatus">
<div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div>
</div>
<div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:{{item.failRemark||'--'}}
</div>
</div>
</div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(2)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<el-form-item label="其他项目" prop="qtxm"> <el-form-item label="其他项目" prop="qtxm">
<div class="filelist">
<div class="fileli" v-for="(item,index) in otherProject">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">{{item.fileName}}</div>
<template v-if="item.fileParseStatus">
<div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div>
</div>
<div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:{{item.failRemark||'--'}}
</div>
</div>
</div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(3)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<el-form-item label="现场经费" prop="xcjf"> <el-form-item label="现场经费" prop="xcjf">
<div class="filelist">
<div class="fileli" v-for="(item,index) in sceneExpense">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">{{item.fileName}}</div>
<template v-if="item.fileParseStatus">
<div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div>
</div>
<div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:{{item.failRemark||'--'}}
</div>
</div>
</div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(4)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<el-form-item label="成本汇总" prop="cbhz"> <el-form-item label="成本汇总" prop="cbhz">
<div class="filelist">
<div class="fileli" v-for="(item,index) in cbSummary">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">{{item.fileName}}</div>
<template v-if="item.fileParseStatus">
<div class="prostatus i2" v-if="item.fileParseStatus == 1">解析中</div>
<div class="prostatus i1" v-if="item.fileParseStatus == 2">解析成功</div>
<div class="prostatus i3" v-if="item.fileParseStatus == 3">解析失败</div>
</template>
<div class="cz" v-if="item.fileParseStatus != 1">
<div v-if="item.fileParseStatus != 3"><a :href="item.fileOssUrl">下载</a></div>
<div v-if="item.fileParseStatus == 3 && prodetail == false">重新上传</div>
<div class="i" @click="deletefille(item.id)" v-if="prodetail == false">删除</div>
</div>
</div>
<div class="wrong" v-if="item.fileParseStatus&&item.fileParseStatus == 3">
失败原因:{{item.failRemark||'--'}}
</div>
</div>
</div>
<div class="upload"> <div class="upload">
<el-upload <el-button class="uploadpro" @click="uplpro(5)"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button class="uploadpro"><img src="../../../assets/images/tips-plus.png">上传文件</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
</el-upload>
</div> </div>
</el-form-item> </el-form-item>
</el-row> </el-row>
...@@ -193,7 +221,7 @@ ...@@ -193,7 +221,7 @@
<el-divider></el-divider> <el-divider></el-divider>
<div class="pro-btns"> <div class="pro-btns">
<el-button type="primary" size="small" >导入数据</el-button> <el-button type="primary" size="small" >导入数据</el-button>
<el-button size="small">返回</el-button> <el-button size="small" @click="goback">返回</el-button>
</div> </div>
</div> </div>
...@@ -201,16 +229,25 @@ ...@@ -201,16 +229,25 @@
</template> </template>
<script> <script>
import { getDicts } from '@/api/system/dict/data' import { getToken } from '@/utils/auth'
// import { getDicts } from '@/api/system/dict/data'
import { deleteCbProjectFile, getProjectFileUploadDetail, uploadCbProjectFile } from '@/api/projectCostLedger/index'
export default { export default {
name: 'upload', name: 'upload',
props: {
uploadData: Object,
cbStagelist: Array,
prodetail: Boolean,//是否是查看 true 不可编辑 false 可编辑
},
data(){ data(){
return{ return{
formdata:{ formdata:{
cbStage:null, cbStage:"",
},
headers: {
Authorization: "Bearer " + getToken(),
}, },
cbStagelist:[],
rules:{ rules:{
cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },], cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },],
}, },
...@@ -223,28 +260,127 @@ ...@@ -223,28 +260,127 @@
xcjf:[{ required: true, trigger: 'blur' },], xcjf:[{ required: true, trigger: 'blur' },],
cbhz:[{ required: true, trigger: 'blur' },], cbhz:[{ required: true, trigger: 'blur' },],
}, },
fileList:[],
//各个类型数据集
directExpense:[],
quantitySummary:[],
measureProject:[],
otherProject:[],
sceneExpense:[],
cbSummary:[],
uploadtype:0,//上传的版块类型
} }
}, },
created() { created() {
//成本阶段 this.formdata = JSON.parse(JSON.stringify(this.uploadData))
getDicts('pro_cbstage').then(res => { this.formdata.cbStage = this.formdata.cbStage.toString()
this.cbStagelist = res.data this.getDetail()
})
}, },
methods:{ methods:{
handleRemove(file, fileList) { goback(){
console.log(file, fileList); this.$emit('closeupload')
}, },
handlePreview(file) { getDetail(){
console.log(file); this.directExpense=[]
this.quantitySummary=[]
this.measureProject=[]
this.otherProject=[]
this.sceneExpense=[]
this.cbSummary=[]
getProjectFileUploadDetail(this.uploadData.id).then(res=>{
if(res.code == 200){
if(res.data){
this.directExpense = [...this.directExpense,...res.data.directExpense]
this.quantitySummary = [...this.quantitySummary,...res.data.quantitySummary]
this.measureProject = [...this.measureProject,...res.data.measureProject]
this.otherProject = [...this.otherProject,...res.data.otherProject]
this.sceneExpense = [...this.sceneExpense,...res.data.sceneExpense]
this.cbSummary = [...this.cbSummary,...res.data.cbSummary]
}
}
})
}, },
handleExceed(files, fileList) { uplpro(type){
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`); if(!this.prodetail){
this.uploadtype = type
this.$refs.uploadpro.$el.querySelector('input').click()
}
},
deletefille(id){
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteCbProjectFile(id).then(res=>{
if(res.code == 200){
this.$message({
type: 'success',
message: '删除成功!'
});
this.getDetail()
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
},
handleFileListChange(file, fileList) {
var testmsg = file.name.substring(file.name.lastIndexOf(".") + 1);
const extension = testmsg === "xlsx";
const extension1 = testmsg === "xls";
if (!extension && !extension1 ) {
this.$message({
message: "上传文件只能是.xls,.xlsx格式!",
type: "warning",
});
return false;
}
const isLt2M = file.size / 1024 / 1024 < 10
if (!isLt2M) {
this.$refs.upload.clearFiles()
this.$message({
message: '上传文件大小不能超过 10MB!',
type: 'warning'
})
return false
}
const formdata = new FormData()
formdata.append("file",new File([file.raw],encodeURIComponent(file.name)))
formdata.append("projectId",this.formdata.id)
formdata.append("cbType",this.uploadtype)
uploadCbProjectFile(formdata).then(res=>{
if(res.code == 200){
let data = res.data
data.id = data.fileId
switch (this.uploadtype) {
case 0:
this.directExpense.push(data)
break;
case 1:
this.quantitySummary.push(data)
break;
case 2:
this.measureProject.push(data)
break;
case 3:
this.otherProject.push(data)
break;
case 4:
this.sceneExpense.push(data)
break;
case 5:
this.cbSummary.push(data)
break;
default:
break
}
}
})
}, },
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
}
} }
} }
</script> </script>
...@@ -358,7 +494,7 @@ ...@@ -358,7 +494,7 @@
margin-left: 12px; margin-left: 12px;
color: #0081FF; color: #0081FF;
display: inline-block; display: inline-block;
&:last-child{ &.i{
color: #FF3C3C; color: #FF3C3C;
} }
} }
...@@ -414,5 +550,9 @@ ...@@ -414,5 +550,9 @@
margin-left: 12px; margin-left: 12px;
} }
} }
.upload-demo{
opacity: 0;
position: absolute;
z-index: -9999;
}
</style> </style>
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