Commit b8a60ab0 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 c0375da5 179344ec
...@@ -2,12 +2,15 @@ package com.dsk.web.schedule; ...@@ -2,12 +2,15 @@ package com.dsk.web.schedule;
import com.dsk.common.tenant.helper.TenantHelper; import com.dsk.common.tenant.helper.TenantHelper;
import com.dsk.cscec.service.AdvisoryBodyService; import com.dsk.cscec.service.AdvisoryBodyService;
import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.system.service.ISysTenantService; import com.dsk.system.service.ISysTenantService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/** /**
* 租户相关定时任务类 * 租户相关定时任务类
* *
...@@ -18,9 +21,12 @@ import org.springframework.stereotype.Component; ...@@ -18,9 +21,12 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class TenantTimerTask { public class TenantTimerTask {
@Resource
private final ISysTenantService tenantService; private ISysTenantService tenantService;
private final AdvisoryBodyService advisoryBodyService; @Resource
private AdvisoryBodyService advisoryBodyService;
@Resource
private CbProjectRecordService projectRecordService;
/** /**
* 每10分钟扫描并禁用已过期租户账号 * 每10分钟扫描并禁用已过期租户账号
...@@ -40,4 +46,12 @@ public class TenantTimerTask { ...@@ -40,4 +46,12 @@ public class TenantTimerTask {
TenantHelper.ignore(advisoryBodyService::updateAdvisoryBodyBusinessScope); TenantHelper.ignore(advisoryBodyService::updateAdvisoryBodyBusinessScope);
} }
/**
* 每2分钟刷新一次项目台账列表内"解析中"项目的状态
*/
@Scheduled(cron = "0 0/2 * * * ?")
public void updateCbProjectRecordParseStatus() {
log.info("每2分钟刷新一次项目台账列表内\"解析中\"项目的状态");
TenantHelper.ignore(projectRecordService::updateCbProjectRecordParseStatus);
}
} }
\ No newline at end of file
...@@ -88,5 +88,32 @@ public interface CbProjectConstants { ...@@ -88,5 +88,32 @@ public interface CbProjectConstants {
*/ */
int CB_TYPE_SUMMARY = 5; int CB_TYPE_SUMMARY = 5;
String CB_TYPE_SUMMARY_NAME = "成本汇总"; String CB_TYPE_SUMMARY_NAME = "成本汇总";
/**
* 直接费清单/费用项分类标识:清
*/
String DIRECT_EXPENSE_CATEGORY_TAG_QING = "清";
/**
* 直接费清单/费用项分类标识:专
*/
String DIRECT_EXPENSE_CATEGORY_TAG_ZHUAN = "专";
/**
* 直接费清单/费用项分类标识:劳
*/
String DIRECT_EXPENSE_CATEGORY_TAG_LAO = "劳";
/**
* 直接费清单/费用项分类标识:材
*/
String DIRECT_EXPENSE_CATEGORY_TAG_CAI = "材";
/**
* 直接费编码:专
*/
String DIRECT_EXPENSE_CODE_ZHUAN = "ZY";
/**
* 直接费编码:劳
*/
String DIRECT_EXPENSE_CODE_LAO = "LW";
/**
* 直接费编码:材
*/
String DIRECT_EXPENSE_CODE_CAI = "FG";
} }
package com.dsk.cscec.controller; package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.cscec.domain.bo.AddCbDirectExpenseBo;
import com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo;
import com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo;
import com.dsk.cscec.service.CbDirectExpenseService; import com.dsk.cscec.service.CbDirectExpenseService;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.List;
/** /**
* 直接费成本表(CbDirectExpense)表控制层 * 直接费成本表(CbDirectExpense)表控制层
...@@ -14,12 +21,53 @@ import javax.annotation.Resource; ...@@ -14,12 +21,53 @@ import javax.annotation.Resource;
*/ */
@RestController @RestController
@RequestMapping("cbDirectExpense") @RequestMapping("cbDirectExpense")
public class CbDirectExpenseController { public class CbDirectExpenseController extends BaseController {
/** /**
* 服务对象 * 服务对象
*/ */
@Resource @Resource
private CbDirectExpenseService baseService; private CbDirectExpenseService baseService;
/**
* 获取直接费菜单
*/
@GetMapping("/getMenuList/{projectId}")
public R<CbDirectExpenseMenuVo> getMenuList(@NotNull(message = "项目ID不能为空") @PathVariable Long projectId) {
return R.ok(baseService.getMenuList(projectId));
}
/**
* 直接费数据解析
*/
@GetMapping("/parseDirectExpenseData/{projectId}")
public R<Void> parseDirectExpenseData(@PathVariable Long projectId) throws Exception {
baseService.parseDirectExpenseData(projectId, 1);
return R.ok();
}
/**
* 获取直接费数据详情
*/
@GetMapping("/getDataDetail/{menuId}")
public R<List<CbDirectExpenseDataDetailVo>> getDataDetail(@NotNull(message = "菜单ID不能为空") @PathVariable Long menuId) {
return R.ok(baseService.getDataDetail(menuId));
}
/**
* 新增直接费费用项
*/
@PostMapping("/addExpense")
public R<Void> addExpense(@Validated @RequestBody AddCbDirectExpenseBo addBo) {
return toAjax(baseService.addExpense(addBo));
}
/***
* 删除直接费费用项
*/
@GetMapping("/deleteExpense/{id}")
public R<Void> deleteExpense(@NotNull(message = "ID不能为空") @PathVariable Long id) {
return toAjax(baseService.deleteExpense(id));
}
} }
...@@ -8,6 +8,7 @@ import com.dsk.common.enums.BusinessType; ...@@ -8,6 +8,7 @@ import com.dsk.common.enums.BusinessType;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.CbProjectFile; import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.AddProjectFileUploadBo; import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.DeleteCbProjectFileBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo; import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.cscec.service.CbProjectFileService; import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.system.domain.vo.SysOssVo; import com.dsk.system.domain.vo.SysOssVo;
...@@ -75,11 +76,11 @@ public class CbProjectFileController extends BaseController { ...@@ -75,11 +76,11 @@ public class CbProjectFileController extends BaseController {
} }
/** /**
* 删除项目台账文件 * 删除项目台账文件及对应数据
*/ */
@DeleteMapping("/deleteCbProjectFile/{fileId}") @DeleteMapping("/deleteCbProjectFile")
public R<Void> deleteCbProjectFile(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) { public R<Void> deleteCbProjectFile(@Validated @RequestBody DeleteCbProjectFileBo deleteBo) {
return toAjax(baseService.deleteProjectFile(new Long[]{fileId})); return toAjax(baseService.deleteProjectFile(deleteBo));
} }
/** /**
......
...@@ -2,6 +2,7 @@ package com.dsk.cscec.domain; ...@@ -2,6 +2,7 @@ package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.annotation.Excel;
import com.dsk.common.core.domain.BaseEntity; import com.dsk.common.core.domain.BaseEntity;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
...@@ -24,112 +25,127 @@ public class CbDirectExpense extends BaseEntity implements Serializable { ...@@ -24,112 +25,127 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
@TableId(value = "id") @TableId(value = "id")
private Long id; private Long id;
/** /**
* 项目ID * 排序
*/
private Long projectId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/ */
private Integer cbStage; private Integer sort;
/** /**
* 父级ID * 父级ID
*/ */
private Long parentId; private Long parentId;
/** /**
* 项目文件ID * 层级
*/ */
private Long projectFileId; private Integer level;
/** /**
* 序号 * 项目ID
*/ */
private String number; private Long projectId;
/** /**
* 排序 * 项目文件ID
*/ */
private Integer sort; private Long projectFileId;
/** /**
* 编码 * 编码
*/ */
@Excel(name = "编码")
private String code; private String code;
/** /**
* 名称 * 名称
*/ */
@Excel(name = "名称")
private String expenseName; private String expenseName;
/** /**
* 清单/费用项分类标识 * 清单/费用项分类标识
*/ */
@Excel(name = "清单/费用项分类标识")
private String expenseCategoryTag; private String expenseCategoryTag;
/** /**
* 项目特征 * 项目特征
*/ */
@Excel(name = "项目特征")
private String projectFeature; private String projectFeature;
/** /**
* 单位 * 单位
*/ */
@Excel(name = "单位")
private String unit; private String unit;
/** /**
* 工程量表达式 * 工程量表达式
*/ */
@Excel(name = "工程量表达式")
private String engineeringVolumeExpression; private String engineeringVolumeExpression;
/** /**
* 工程量 * 工程量
*/ */
@Excel(name = "工程量")
private String engineeringVolume; private String engineeringVolume;
/** /**
* 成本科目 * 成本科目
*/ */
@Excel(name = "成本科目")
private String cbSubject; private String cbSubject;
/** /**
* 招标控制价单价 * 招标控制价单价
*/ */
@Excel(name = "招标控制价单价")
private String tenderControlUnitPrice; private String tenderControlUnitPrice;
/** /**
* 招标控制价合价 * 招标控制价合价
*/ */
@Excel(name = "招标控制价合价")
private String tenderControlSumPrice; private String tenderControlSumPrice;
/** /**
* 不含税成本单价 * 不含税成本单价
*/ */
@Excel(name = "不含税成本单价")
private String excludeTaxCbUnitPrice; private String excludeTaxCbUnitPrice;
/** /**
* 不含税成本合价 * 不含税成本合价
*/ */
@Excel(name = "不含税成本合价")
private String excludeTaxCbSumPrice; private String excludeTaxCbSumPrice;
/** /**
* 成本税金合计 * 成本税金合计
*/ */
@Excel(name = "成本税金合计")
private String cbTaxSum; private String cbTaxSum;
/** /**
* 含税成本单价 * 含税成本单价
*/ */
@Excel(name = "含税成本单价")
private String includeTaxCbUnitPrice; private String includeTaxCbUnitPrice;
/** /**
* 含税成本合价 * 含税成本合价
*/ */
@Excel(name = "含税成本合价")
private String includeTaxCbSumPrice; private String includeTaxCbSumPrice;
/** /**
* 合价偏差 * 合价偏差
*/ */
@Excel(name = "合价偏差")
private String sumPriceDeviation; private String sumPriceDeviation;
/** /**
* 盈亏率 * 盈亏率
*/ */
@Excel(name = "盈亏率")
private String profitLossRatio; private String profitLossRatio;
/** /**
* 标准成本费用 * 标准成本费用
*/ */
@Excel(name = "标准成本费用")
private String standardCbItem; private String standardCbItem;
/** /**
* 数据源(0:导入、1:手动新增) * 备注
*/
@Excel(name = "备注")
private String remark;
/**
* 是否为导入数据
*/ */
private Integer dataOrigin; private Boolean isImport;
/** /**
* 删除状态(0:否、2:是) * 删除状态(0:否、2:是)
*/ */
@TableLogic(value = "0", delval = "2") @TableLogic(value = "0", delval = "2")
private Integer delFlag; private Integer delFlag;
/**
* 备注
*/
private String failRemark;
} }
package com.dsk.cscec.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.03.01
* @time 17:59
*/
@Data
public class AddCbDirectExpenseBo {
/**
* 清ID
*/
@NotNull(message = "清ID不能为空")
private Long qingId;
/**
* 编码
*/
@NotBlank(message = "编码不能为空")
private String code;
/**
* 项目名称
*/
@NotBlank(message = "项目名称不能为空")
private String expenseName;
/**
* 单位
*/
@NotBlank(message = "单位不能为空")
private String unit;
/**
* 单价
*/
@NotBlank(message = "单价不能为空")
private String tenderControlUnitPrice;
/**
* 特征描述
*/
private String projectFeature;
}
\ No newline at end of file
package com.dsk.cscec.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.02.28
* @time 10:45
*/
@Data
public class DeleteCbProjectFileBo {
@NotNull(message = "文件ID不能为空")
private Long fileId;
@NotNull(message = "成本类型不能为空")
private Integer cbType;
}
package com.dsk.cscec.domain.vo;
import com.dsk.cscec.domain.CbDirectExpense;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
/**
* @author sxk
* @date 2024.03.01
* @time 17:03
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbDirectExpenseDataDetailVo extends CbDirectExpense {
/**
* 子集
*/
private List<CbDirectExpenseDataDetailVo> childrenList = new ArrayList<>();
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author sxk
* @date 2024.03.01
* @time 09:34
*/
@Data
public class CbDirectExpenseMenuVo {
/**
* 菜单ID
*/
private Long menuId;
/**
* 父级ID
*/
private Long parentId;
/**
* 菜单名称
*/
private String menuName;
/**
* 菜单层级
*/
private Integer menuLevel;
/**
* 子菜单
*/
private List<CbDirectExpenseMenuVo> childrenList = new ArrayList<>();
}
...@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; ...@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* 成本汇总-项目汇总自定义导入 * 成本汇总-项目汇总自定义导入
...@@ -83,6 +84,17 @@ public class CbSummaryProjectImportListener extends AnalysisEventListener<CbSumm ...@@ -83,6 +84,17 @@ public class CbSummaryProjectImportListener extends AnalysisEventListener<CbSumm
importVo.setLevel(1); importVo.setLevel(1);
} else if (importVo.getNumber().matches("^[0-9]*[1-9][0-9]*$")) {//判断是否为正整数 } else if (importVo.getNumber().matches("^[0-9]*[1-9][0-9]*$")) {//判断是否为正整数
importVo.setLevel(Integer.valueOf(importVo.getNumber())); importVo.setLevel(Integer.valueOf(importVo.getNumber()));
//判断上一条数据level是否与当前一致或为上一级
Optional<CbSummaryProjectImportVo> max = resultList.stream().max(Comparator.comparing(CbSummaryProjectImportVo::getSort));
CbSummaryProjectImportVo preImportVo = null;
if (!max.isPresent()) {
preImportVo = max.get();
} else {
throw new ServiceException("'序号'列数据错误,无法匹配层级!");
}
if (importVo.getLevel() > preImportVo.getLevel() && importVo.getLevel() != preImportVo.getLevel() + 1) {
throw new ServiceException("'序号'列数据错误,无法匹配层级!");
}
} }
......
...@@ -2,6 +2,10 @@ package com.dsk.cscec.mapper; ...@@ -2,6 +2,10 @@ package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbDirectExpense; import com.dsk.cscec.domain.CbDirectExpense;
import com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 直接费成本表(CbDirectExpense)表数据库访问层 * 直接费成本表(CbDirectExpense)表数据库访问层
...@@ -10,6 +14,14 @@ import com.dsk.cscec.domain.CbDirectExpense; ...@@ -10,6 +14,14 @@ import com.dsk.cscec.domain.CbDirectExpense;
* @since 2024-02-05 14:43:31 * @since 2024-02-05 14:43:31
*/ */
public interface CbDirectExpenseMapper extends BaseMapper<CbDirectExpense> { public interface CbDirectExpenseMapper extends BaseMapper<CbDirectExpense> {
/**
* 查询清单/费用项分类标识为数字的数字
*
* @param projectId 项目ID
* @param regx 正则表达式1-10
* @param deleteFlagExist 删除标识
*/
List<CbDirectExpenseMenuVo> selectMenuData(@Param("projectId") Long projectId, @Param("regx") String regx, @Param("deleteFlagExist") Integer deleteFlagExist);
} }
...@@ -2,6 +2,11 @@ package com.dsk.cscec.service; ...@@ -2,6 +2,11 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbDirectExpense; import com.dsk.cscec.domain.CbDirectExpense;
import com.dsk.cscec.domain.bo.AddCbDirectExpenseBo;
import com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo;
import com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo;
import java.util.List;
/** /**
* 直接费成本表(CbDirectExpense)表服务接口 * 直接费成本表(CbDirectExpense)表服务接口
...@@ -10,6 +15,43 @@ import com.dsk.cscec.domain.CbDirectExpense; ...@@ -10,6 +15,43 @@ import com.dsk.cscec.domain.CbDirectExpense;
* @since 2024-02-05 14:43:34 * @since 2024-02-05 14:43:34
*/ */
public interface CbDirectExpenseService extends IService<CbDirectExpense> { public interface CbDirectExpenseService extends IService<CbDirectExpense> {
/**
* 获取直接费菜单
*
* @param projectId 项目ID
* @return 直接费菜单
*/
CbDirectExpenseMenuVo getMenuList(Long projectId);
/**
* 直接费数据解析
*
* @param projectId 项目ID
* @param cbStage 成本阶段
*/
void parseDirectExpenseData(Long projectId, Integer cbStage) throws Exception;
/**
* 获取直接费数据详情
*
* @param menuId 菜单ID
* @return 数据详情
*/
List<CbDirectExpenseDataDetailVo> getDataDetail(Long menuId);
/**
* 新增直接费费用项
*
* @param addBo 费用项
* @return 新增结果
*/
Integer addExpense(AddCbDirectExpenseBo addBo);
/**
* 删除直接费费用项
*
* @param id 费用ID
* @return 删除结果
*/
Integer deleteExpense(Long id);
} }
...@@ -3,6 +3,7 @@ package com.dsk.cscec.service; ...@@ -3,6 +3,7 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectFile; import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.AddProjectFileUploadBo; import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.DeleteCbProjectFileBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo; import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.system.domain.vo.SysOssVo; import com.dsk.system.domain.vo.SysOssVo;
...@@ -32,12 +33,12 @@ public interface CbProjectFileService extends IService<CbProjectFile> { ...@@ -32,12 +33,12 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss); CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss);
/** /**
* 批量逻辑删除项目上传文件记录 * 删除项目台账文件及对应数据
* *
* @param fileIds 文件ID * @param deleteBo 待删除文件信息
* @return 删除结果 * @return 删除结果
*/ */
Integer deleteProjectFile(Long[] fileIds); Integer deleteProjectFile(DeleteCbProjectFileBo deleteBo);
/** /**
* 获取项目文件上传详情 * 获取项目文件上传详情
...@@ -49,9 +50,10 @@ public interface CbProjectFileService extends IService<CbProjectFile> { ...@@ -49,9 +50,10 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
/** /**
* 查询项目文件解析列表 * 查询项目文件解析列表
*
* @param projectId 项目ID * @param projectId 项目ID
* @param cbType 成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总) * @param cbType 成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
* @param cbStage 成本阶段(0:标前成本、1:标后成本、2:转固成本) * @param cbStage 成本阶段(0:标前成本、1:标后成本、2:转固成本)
* @return * @return
*/ */
List<CbProjectFile> selectAnalysisList(Long projectId, Integer cbType, Integer cbStage); List<CbProjectFile> selectAnalysisList(Long projectId, Integer cbType, Integer cbStage);
...@@ -66,5 +68,5 @@ public interface CbProjectFileService extends IService<CbProjectFile> { ...@@ -66,5 +68,5 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
* @param errmsg RMSG * @param errmsg RMSG
* @return boolean * @return boolean
*/ */
boolean UpdateProjectFileStatus(Long fileId,String errmsg,Integer status); boolean UpdateProjectFileStatus(Long fileId, String errmsg, Integer status);
} }
...@@ -104,4 +104,9 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> { ...@@ -104,4 +104,9 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
* @return 删除结果 * @return 删除结果
*/ */
Integer deleteDraft(Long projectId); Integer deleteDraft(Long projectId);
/**
* 每2分钟刷新一次项目台账列表内"解析中"项目的状态
*/
void updateCbProjectRecordParseStatus();
} }
package com.dsk.cscec.service.impl; package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
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.excel.ExcelUtils;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.StringUtils;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbDirectExpense; import com.dsk.cscec.domain.CbDirectExpense;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbDirectExpenseBo;
import com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo;
import com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo;
import com.dsk.cscec.mapper.CbDirectExpenseMapper; import com.dsk.cscec.mapper.CbDirectExpenseMapper;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbDirectExpenseService; import com.dsk.cscec.service.CbDirectExpenseService;
import com.dsk.system.service.ISysOssService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/** /**
* 直接费成本表(CbDirectExpense)表服务实现类 * 直接费成本表(CbDirectExpense)表服务实现类
...@@ -18,5 +43,298 @@ import javax.annotation.Resource; ...@@ -18,5 +43,298 @@ import javax.annotation.Resource;
public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMapper, CbDirectExpense> implements CbDirectExpenseService { public class CbDirectExpenseServiceImpl extends ServiceImpl<CbDirectExpenseMapper, CbDirectExpense> implements CbDirectExpenseService {
@Resource @Resource
private CbDirectExpenseMapper baseMapper; private CbDirectExpenseMapper baseMapper;
@Resource
private CbProjectFileMapper projectFileMapper;
@Resource
private ISysOssService ossService;
@Resource
private TransactionTemplate transactionTemplate;
@Resource
private CbProjectRecordMapper projectRecordMapper;
private final String regx = "^([1-9]|10)$";
/**
* 获取直接费菜单
*
* @param projectId 项目ID
* @return 直接费菜单
*/
@Override
public CbDirectExpenseMenuVo getMenuList(Long projectId) {
//校验项目是否存在
this.checkProjectExist(projectId);
//查询清单/费用项分类标识为数字的数字
List<CbDirectExpenseMenuVo> menuVoList = baseMapper.selectMenuData(projectId, regx, CbProjectConstants.DELETE_FLAG_EXIST);
Assert.isFalse(menuVoList.isEmpty(), "当前项目不存在直接费菜单");
CbDirectExpenseMenuVo root = menuVoList.get(0);
//生成菜单树形
this.generateMenuTree(root, menuVoList);
return root;
}
//生成菜单树形
private void generateMenuTree(CbDirectExpenseMenuVo root, List<CbDirectExpenseMenuVo> menuVoList) {
menuVoList.forEach(menu -> {
if (Objects.equals(root.getMenuId(), menu.getParentId())) {
root.getChildrenList().add(menu);
generateMenuTree(menu, menuVoList);
}
});
}
/**
* 直接费数据解析
*
* @param projectId 项目ID
* @param cbStage 成本阶段
*/
@Override
public void parseDirectExpenseData(Long projectId, Integer cbStage) throws Exception {
//查找该项目下所有相关文件
List<CbProjectFile> projectFileList = projectFileMapper.selectAnalysisList(projectId, CbProjectConstants.CB_TYPE_DIRECT_EXPENSE, cbStage);
if (ObjectUtils.isEmpty(projectFileList)) {
return;
}
//处理待解析文件
a:
for (CbProjectFile projectFile : projectFileList) {
//文件下载
InputStream inputStream = ossService.downFileIO(projectFile.getFileOssId());
if (ObjectUtil.isNull(inputStream)) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",文件数据不存在");
projectFile.setFailRemark("文件数据不存在");
projectFileMapper.updateById(projectFile);
continue;
}
//解析数据
List<CbDirectExpense> importList = new ExcelUtils<>(CbDirectExpense.class).importExcelAllSheet(inputStream, 0);
if (importList.isEmpty()) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",表格中不存在待导入数据");
projectFile.setFailRemark("表格中不存在待导入数据!");
projectFileMapper.updateById(projectFile);
continue;
}
//导入顺序标识
AtomicReference<Integer> sort = new AtomicReference<>(1);
//清单/费用项分类数字层级标识
AtomicReference<Integer> numLevel = new AtomicReference<>(-1);
//清单/费用项分类"清"层级标识
AtomicReference<Integer> qingLevel = new AtomicReference<>(-1);
//筛选有效数据
List<CbDirectExpense> directExpenseList = importList.stream().parallel()
.filter(item -> StringUtils.isNotBlank(item.getExpenseName())
&& StringUtils.isNotBlank(item.getExpenseCategoryTag()))
.collect(Collectors.toList());
if (directExpenseList.size() != importList.size()) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",表格中\"名称\"列或\"清单/费用项分类标识\"列存在空数据");
projectFile.setFailRemark("表格中\"名称\"列或\"清单/费用项分类标识\"列存在空数据");
projectFileMapper.updateById(projectFile);
continue;
}
//遍历数据集合,设置属性值
for (int i = 0; i < directExpenseList.size(); i++) {
CbDirectExpense item = directExpenseList.get(i);
//设置导入顺序
item.setSort(sort.get());
//根据清单/费用项分类标识设置层级
String expenseCategoryTag = item.getExpenseCategoryTag();
expenseCategoryTag = expenseCategoryTag.trim();
if (expenseCategoryTag.matches(regx)) {
//如果是数字,则层级为对应数字
int level = Integer.parseInt(expenseCategoryTag);
//数字层级只能为1-10级
if (level < 1 || level > 10) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",表格中\"清单/费用项分类标识\"列的数字只能为1-10");
projectFile.setFailRemark("表格中\"清单/费用项分类标识\"列的数字只能为1-10");
projectFileMapper.updateById(projectFile);
continue a;
}
numLevel.set(level);
item.setLevel(numLevel.get());
} else if (CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_QING.equals(expenseCategoryTag)) {
//如果是清,则为倒数第二级,且清可以在任意数字层级下
qingLevel.set(numLevel.get() + 1);
item.setLevel(qingLevel.get());
} else {
//如果是专、劳、材,则为最底级,且均为清的子集
item.setLevel(qingLevel.get() + 1);
}
//根据清单/费用项分类标识设置主键
item.setId(IdUtil.getSnowflakeNextId());
//防止雪花时间戳相同,小睡一下
Thread.sleep(1);
//设置父级ID
if (i == 0) {
//如果是第一条数据,父级ID设置为0
item.setParentId(0L);
} else {
//找到当前Level的最近一条上一级Level,对应的ID就是parentId
for (int j = i - 1; j >= 0; j--) {
//当前对象
CbDirectExpense currentLevelEntity = directExpenseList.get(i);
//上一级对象
CbDirectExpense preLevelEntity = directExpenseList.get(j);
if ((currentLevelEntity.getLevel() - 1) == preLevelEntity.getLevel()) {
currentLevelEntity.setParentId(preLevelEntity.getId());
break;
}
}
}
item.setProjectId(projectId);
item.setProjectFileId(projectFile.getId());
item.setIsImport(true);
sort.getAndSet(sort.get() + 1);
}
transactionTemplate.execute(status -> {
try {
CbDirectExpenseServiceImpl impl = new CbDirectExpenseServiceImpl();
//分批次插入
if (directExpenseList.size() > 1000) {
int index = 0;
int total = directExpenseList.size();
while (index < total) {
List<CbDirectExpense> divideList = directExpenseList.subList(index, Math.min(index += 1000, total));
Assert.isTrue(impl.saveBatch(divideList), "数据插入失败");
}
} else {
Assert.isTrue(impl.saveBatch(directExpenseList), "数据插入失败");
}
//更新文件状态
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败");
} catch (Exception e) {
status.setRollbackOnly();
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
e.printStackTrace();
projectFile.setFailRemark(e.getMessage());
projectFileMapper.updateById(projectFile);
}
return Boolean.TRUE;
});
}
}
/**
* 获取直接费数据详情
*
* @param menuId 菜单ID
* @return 数据详情
*/
@Override
public List<CbDirectExpenseDataDetailVo> getDataDetail(Long menuId) {
//查询该菜单下的清
List<CbDirectExpenseDataDetailVo> qingList = BeanUtil.copyToList(baseMapper.selectList(new LambdaQueryWrapper<CbDirectExpense>()
.eq(CbDirectExpense::getParentId, menuId)
.eq(CbDirectExpense::getExpenseCategoryTag, CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_QING)), CbDirectExpenseDataDetailVo.class);
Assert.isFalse(qingList.isEmpty(), "该菜单下无数据");
//生成数据树形
qingList.forEach(qing -> {
qing.getChildrenList().addAll(BeanUtil.copyToList(baseMapper.selectList(new LambdaQueryWrapper<CbDirectExpense>()
.eq(CbDirectExpense::getParentId, qing.getId())), CbDirectExpenseDataDetailVo.class));
});
return qingList;
}
/**
* 新增直接费费用项
*
* @param addBo 费用项
* @return 新增结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer addExpense(AddCbDirectExpenseBo addBo) {
//校验清是否存在
CbDirectExpense qing = this.checkExpenseExist(addBo.getQingId());
CbDirectExpense directExpense = BeanUtil.toBean(addBo, CbDirectExpense.class);
//排序设为清下面最后一条
directExpense.setSort(baseMapper.selectOne(new LambdaQueryWrapper<CbDirectExpense>()
.eq(CbDirectExpense::getParentId, qing.getId())
.orderByDesc(CbDirectExpense::getSort)
.last("LIMIT 1")).getSort() + 1);
directExpense.setParentId(qing.getId());
directExpense.setLevel(qing.getLevel() + 1);
directExpense.setProjectId(qing.getProjectId());
directExpense.setProjectFileId(-1L);
directExpense.setIsImport(false);
//TODO:单价对应哪个字段需要等产品确认
//取编码前两位字母,ZY代表专,LW代表劳,FG代表材
String code = directExpense.getCode().substring(0, 2);
switch (code) {
case CbProjectConstants.DIRECT_EXPENSE_CODE_ZHUAN:
directExpense.setExpenseCategoryTag(CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_ZHUAN);
break;
case CbProjectConstants.DIRECT_EXPENSE_CODE_LAO:
directExpense.setExpenseCategoryTag(CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_LAO);
break;
case CbProjectConstants.DIRECT_EXPENSE_CODE_CAI:
directExpense.setExpenseCategoryTag(CbProjectConstants.DIRECT_EXPENSE_CATEGORY_TAG_CAI);
break;
default:
throw new ServiceException("编码错误");
}
return baseMapper.insert(directExpense);
}
/**
* 删除直接费费用项
*
* @param id 费用ID
* @return 删除结果
*/
@Override
public Integer deleteExpense(Long id) {
//校验费用项是否存在
CbDirectExpense directExpense = this.checkExpenseExist(id);
Assert.isFalse(directExpense.getIsImport(), "不允许删除导入数据");
return baseMapper.deleteById(id);
}
/**
* 校验项目是否存在
*
* @param projectId 项目ID
* @return 项目实体
*/
private CbProjectRecord checkProjectExist(Long projectId) {
CbProjectRecord projectRecord = projectRecordMapper.selectById(projectId);
Assert.notNull(projectRecord, "该项目不存在");
return projectRecord;
}
/**
* 校验清是否存在
*
* @param id 费用ID
* @return 数据实体
*/
private CbDirectExpense checkExpenseExist(Long id) {
CbDirectExpense directExpense = baseMapper.selectById(id);
Assert.notNull(directExpense, "ID无效");
return directExpense;
}
} }
...@@ -102,8 +102,8 @@ public class CbProjectExpenseSummaryServiceImpl extends ServiceImpl<CbProjectExp ...@@ -102,8 +102,8 @@ public class CbProjectExpenseSummaryServiceImpl extends ServiceImpl<CbProjectExp
.collect(Collectors.toList()); .collect(Collectors.toList());
if (summaryList.size() != importList.size()) { if (summaryList.size() != importList.size()) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",表格中存在\"名称\"列为空数据!"); log.error("FileId:" + projectFile.getId() + ",表格中\"名称\"列存在空数据!");
projectFile.setFailRemark("表格中存在\"名称\"列为空数据"); projectFile.setFailRemark("表格中\"名称\"列存在空数据");
projectFileMapper.updateById(projectFile); projectFileMapper.updateById(projectFile);
continue; continue;
} }
......
...@@ -2,26 +2,25 @@ package com.dsk.cscec.service.impl; ...@@ -2,26 +2,25 @@ package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
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.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.bo.AddProjectFileUploadBo; import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.DeleteCbProjectFileBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo; import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.cscec.mapper.CbProjectFileMapper; import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper; import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectFileService; import com.dsk.cscec.service.*;
import com.dsk.system.domain.vo.SysOssVo; import com.dsk.system.domain.vo.SysOssVo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 项目成本文件表(CbProjectFile)表服务实现类 * 项目成本文件表(CbProjectFile)表服务实现类
...@@ -36,7 +35,26 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -36,7 +35,26 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
@Resource @Resource
private CbProjectRecordMapper projectRecordMapper; private CbProjectRecordMapper projectRecordMapper;
@Resource @Resource
private CbProjectFileMapper projectFileMapper; private CbDirectExpenseService directExpenseService;
@Resource
private ICbQuantitySummaryService quantitySummaryService;
@Resource
private ICbQuantitySummaryActualService quantitySummaryActualService;
//@Resource
//private ICbCostMeasureService costMeasureService;
@Resource
private ICbCostMeasureActualService costMeasureActualActualService;
//@Resource
//private CbProjectOtherService projectOtherService;
@Resource
private CbSceneExpenseChildrenService sceneExpenseChildrenService;
private CbProjectExpenseSummaryService projectExpenseSummaryService;
@Resource
private CbSummaryService summaryService;
@Resource
private CbSummaryActualService summaryActualService;
@Resource
private CbSummaryActualLockService summaryActualLockService;
/** /**
* 校验同一成本类型下是否存在相同文件 * 校验同一成本类型下是否存在相同文件
...@@ -47,7 +65,7 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -47,7 +65,7 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
public Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo) { public Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo) {
String filename = fileUploadBo.getFile().getOriginalFilename(); String filename = fileUploadBo.getFile().getOriginalFilename();
assert filename != null; assert filename != null;
projectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>() baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, fileUploadBo.getProjectId()) .eq(CbProjectFile::getProjectId, fileUploadBo.getProjectId())
.eq(CbProjectFile::getCbType, fileUploadBo.getCbType())).forEach(projectFile -> { .eq(CbProjectFile::getCbType, fileUploadBo.getCbType())).forEach(projectFile -> {
//仅对比文件名,不考虑文件格式 //仅对比文件名,不考虑文件格式
...@@ -82,34 +100,81 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -82,34 +100,81 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
} }
/** /**
* 批量逻辑删除项目上传文件记录 * 删除项目台账文件及对应数据
* *
* @param fileIds 文件ID * @param deleteBo 待删除文件信息
* @return 删除结果 * @return 删除结果
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Integer deleteProjectFile(Long[] fileIds) { public Integer deleteProjectFile(DeleteCbProjectFileBo deleteBo) {
int flag = 0; Long fileId = deleteBo.getFileId();
//查询待删除文件 //查询待删除文件
List<CbProjectFile> fileList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>() CbProjectFile file = baseMapper.selectById(fileId);
.in(ObjectUtil.isNotNull(fileIds), CbProjectFile::getId, Arrays.asList(fileIds))); //不允许删除解析中的文件
for (CbProjectFile file : fileList) { Integer fileParseStatus = file.getFileParseStatus();
//不允许删除解析中的文件 Assert.isFalse(fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING),
Integer fileParseStatus = file.getFileParseStatus(); "文件正在解析中,不允许删除");
Assert.isFalse(fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING),
"文件正在解析中,不允许删除"); //解析成功、解析失败的文件需要删除对应的导入数据和每月成本数据
//准备中、的文件设为已删除,否则设为待删除 if (fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS) ||
//设为待删除是为了方便各个成本类型删除数据 fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL)) {
if (fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)) { switch (deleteBo.getCbType()) {
flag = baseMapper.deleteById(file); case CbProjectConstants.CB_TYPE_DIRECT_EXPENSE:
} else { //直接费没有每月成本,所以直接删除导入数据即可
flag = baseMapper.update(null, new UpdateWrapper<CbProjectFile>() Assert.isTrue(directExpenseService.removeBatchByIds(directExpenseService.list(new LambdaQueryWrapper<CbDirectExpense>()
.set("del_flag", CbProjectConstants.DELETE_FLAG_WAIT_DELETE) .eq(CbDirectExpense::getProjectFileId, file.getId()))), "直接费成本数据删除失败");
.eq("id", file.getId())); break;
case CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY:
//工料汇总
List<CbQuantitySummary> quantitySummaryList = quantitySummaryService.list(new LambdaQueryWrapper<CbQuantitySummary>()
.eq(CbQuantitySummary::getCbProjectFileId, file.getId()));
//删除每月成本数据(关联导入数据主键)
quantitySummaryActualService.removeBatchByIds(quantitySummaryActualService.list(new LambdaQueryWrapper<CbQuantitySummaryActual>()
.in(CbQuantitySummaryActual::getCbQuantitySummaryId, quantitySummaryList.stream().map(CbQuantitySummary::getId).collect(Collectors.toList()))));
//删除导入数据(关联文件ID)
quantitySummaryService.removeBatchByIds(quantitySummaryList);
break;
case CbProjectConstants.CB_TYPE_MEASURE_PROJECT:
//措施项目
//List<CbCostMeasure> costMeasureList = costMeasureService.list(new LambdaQueryWrapper<CbCostMeasure>()
// .eq(CbCostMeasure::getProjectFileId, fileId));
////删除每月成本数据(关联导入数据主键)
//costMeasureActualActualService.removeBatchByIds(costMeasureActualActualService.list(new LambdaQueryWrapper<CbCostMeasureActual>()
// .in(CbCostMeasureActual::getPlanMeasureId, costMeasureList.stream().map(CbCostMeasure::getId).collect(Collectors.toList()))));
////删除导入数据(关联文件ID)
//costMeasureService.removeBatchByIds(costMeasureList);
break;
case CbProjectConstants.CB_TYPE_OTHER_PROJECT:
//其他项目
break;
case CbProjectConstants.CB_TYPE_SCENE_EXPENSE:
//现场经费
//删除汇总数据(关联文件ID)
projectExpenseSummaryService.removeBatchByIds(projectExpenseSummaryService.list(new LambdaQueryWrapper<CbProjectExpenseSummary>()
.eq(CbProjectExpenseSummary::getProjectFileId, fileId)));
//汇总以外的数据(关联文件ID)
sceneExpenseChildrenService.removeBatchByIds(sceneExpenseChildrenService.list(new LambdaQueryWrapper<CbSceneExpenseChildren>()
.eq(CbSceneExpenseChildren::getProjectFileId, fileId)));
break;
case CbProjectConstants.CB_TYPE_SUMMARY:
//成本汇总
//删除锁定数据(关联项目ID)
summaryActualLockService.removeBatchByIds(summaryActualLockService.list(new LambdaQueryWrapper<CbSummaryActualLock>()
.eq(CbSummaryActualLock::getProjectId, file.getProjectId())));
//删除每月成本数据(关联导入数据主键)
List<CbSummary> summaryList = summaryService.list(new LambdaQueryWrapper<CbSummary>()
.eq(CbSummary::getCbProjectFileId, fileId));
summaryActualService.removeBatchByIds(summaryActualService.list(new LambdaQueryWrapper<CbSummaryActual>()
.in(CbSummaryActual::getCbSummaryId, summaryList.stream().map(CbSummary::getId).collect(Collectors.toList()))));
//删除导入数据(关联文件ID)
summaryService.removeBatchByIds(summaryList);
break;
default:
throw new ServiceException("成本类型错误");
} }
} }
return flag; return baseMapper.deleteById(file);
} }
/** /**
...@@ -168,8 +233,8 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -168,8 +233,8 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
} }
@Override @Override
public boolean UpdateProjectFileStatus(Long fileId, String errmsg,Integer status) { public boolean UpdateProjectFileStatus(Long fileId, String errmsg, Integer status) {
CbProjectFile cbProjectFile=new CbProjectFile(); CbProjectFile cbProjectFile = new CbProjectFile();
cbProjectFile.setId(fileId); cbProjectFile.setId(fileId);
cbProjectFile.setFailRemark(errmsg); cbProjectFile.setFailRemark(errmsg);
cbProjectFile.setFileParseStatus(status); cbProjectFile.setFileParseStatus(status);
......
...@@ -23,6 +23,7 @@ import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo; ...@@ -23,6 +23,7 @@ import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.mapper.CbProjectFileMapper; import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper; import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.*; import com.dsk.cscec.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -39,6 +40,7 @@ import java.util.stream.Collectors; ...@@ -39,6 +40,7 @@ import java.util.stream.Collectors;
* @since 2024-02-05 11:37:53 * @since 2024-02-05 11:37:53
*/ */
@Service("cbProjectRecordService") @Service("cbProjectRecordService")
@Slf4j
public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMapper, CbProjectRecord> implements CbProjectRecordService { public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMapper, CbProjectRecord> implements CbProjectRecordService {
@Resource @Resource
private CbProjectRecordMapper baseMapper; private CbProjectRecordMapper baseMapper;
...@@ -56,6 +58,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -56,6 +58,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
private CbProjectOtherService projectOtherService; private CbProjectOtherService projectOtherService;
@Resource @Resource
private ICbCostMeasureService costMeasureService; private ICbCostMeasureService costMeasureService;
@Resource
private CbDirectExpenseService directExpenseService;
/** /**
* 新增项目 * 新增项目
...@@ -124,10 +128,11 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -124,10 +128,11 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
projectFile.setFailRemark(null); projectFile.setFailRemark(null);
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
//TODO:调各个成本类型的解析文件方法 //调各个成本类型的解析文件方法
Integer cbStage = projectRecord.getCbStage(); Integer cbStage = projectRecord.getCbStage();
String username = Objects.requireNonNull(LoginHelper.getLoginUser()).getUsername(); String username = Objects.requireNonNull(LoginHelper.getLoginUser()).getUsername();
//直接费成本 //直接费成本
directExpenseService.parseDirectExpenseData(projectId, cbStage);
//工料汇总 //工料汇总
CbProjectBaseBo projectBaseBo = new CbProjectBaseBo(); CbProjectBaseBo projectBaseBo = new CbProjectBaseBo();
projectBaseBo.setProjectId(projectId); projectBaseBo.setProjectId(projectId);
...@@ -178,7 +183,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -178,7 +183,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
//判断是否有历史阶段 //判断是否有历史阶段
searchVo.setHasChildren(baseMapper.selectCount(new LambdaQueryWrapper<CbProjectRecord>() searchVo.setHasChildren(baseMapper.selectCount(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, searchVo.getRelatedId()) .eq(CbProjectRecord::getRelatedId, searchVo.getRelatedId())
.ne(CbProjectRecord::getProjectFileStatus,CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)) > 1 .ne(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)) > 1
); );
//关键字标红 //关键字标红
...@@ -416,6 +421,41 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -416,6 +421,41 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
return baseMapper.deleteById(projectRecord); return baseMapper.deleteById(projectRecord);
} }
/**
* 每2分钟刷新一次项目台账列表内"解析中"项目的状态
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateCbProjectRecordParseStatus() {
//查询所有解析中的项目
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PARSING));
a:
for (CbProjectRecord projectRecord : projectRecordList) {
//查询该项目的所有文件
List<CbProjectFile> projectFileList = projectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectRecord.getId()));
int failNum = 0;
for (CbProjectFile projectFile : projectFileList) {
//如果有一个文件处于解析中,则该项目的解析状态继续保持解析中
if (projectFile.getFileParseStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING)) {
continue a;
} else if (projectFile.getFileParseStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL)) {
failNum++;
}
}
//所有文件遍历完后,如果存在解析失败的文件,则项目的解析状态改为解析失败
if (failNum > 0) {
log.info("项目台账列表:ID为" + projectRecord.getId() + "的项目解析失败");
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
baseMapper.updateById(projectRecord);
}
}
}
/** /**
* 校验项目是否存在 * 校验项目是否存在
* *
......
...@@ -129,7 +129,7 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens ...@@ -129,7 +129,7 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens
} }
//筛选有效数据 //筛选有效数据
List<CbSceneExpenseChildrenImportBo> summaryList = importList.stream().parallel() List<CbSceneExpenseChildrenImportBo> chidrenList = importList.stream().parallel()
//筛选名称列不为空数据 //筛选名称列不为空数据
.filter(item -> StringUtils.isNotBlank(item.getExpenseName())) .filter(item -> StringUtils.isNotBlank(item.getExpenseName()))
.peek(item -> { .peek(item -> {
...@@ -154,10 +154,10 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens ...@@ -154,10 +154,10 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens
item.setCreateTime(new Date()); item.setCreateTime(new Date());
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
if (summaryList.size() != importList.size()) { if (chidrenList.size() != importList.size()) {
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL);
log.error("FileId:" + projectFile.getId() + ",表格中存在\"名称\"列为空数据"); log.error("FileId:" + projectFile.getId() + ",表格中\"名称\"列存在空数据");
projectFile.setFailRemark("表格中存在\"名称\"列为空数据"); projectFile.setFailRemark("表格中\"名称\"列存在空数据");
projectFileMapper.updateById(projectFile); projectFileMapper.updateById(projectFile);
continue; continue;
} }
...@@ -165,7 +165,7 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens ...@@ -165,7 +165,7 @@ public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpens
try { try {
//批量插入数据 //批量插入数据
CbSceneExpenseChildrenServiceImpl impl = new CbSceneExpenseChildrenServiceImpl(); CbSceneExpenseChildrenServiceImpl impl = new CbSceneExpenseChildrenServiceImpl();
Assert.isTrue(impl.saveBatch(BeanUtil.copyToList(summaryList, CbSceneExpenseChildren.class)), "数据插入失败"); Assert.isTrue(impl.saveBatch(BeanUtil.copyToList(chidrenList, CbSceneExpenseChildren.class)), "数据插入失败");
//更新文件状态 //更新文件状态
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS); projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS);
Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败"); Assert.isTrue(projectFileMapper.updateById(projectFile) > 0, "解析成功后文件状态更新失败");
......
...@@ -149,9 +149,12 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -149,9 +149,12 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
} }
//获取父级id //获取父级id
Integer parentLevel = cbSummary.getLevel() - 1; Integer parentLevel = cbSummary.getLevel() - 1;
CbSummary parent = cbSummaryList.stream().filter(summary -> summary.getSort() < cbSummary.getSort() && summary.getLevel() == parentLevel) CbSummary parent = null;
.max(Comparator.comparing(CbSummary::getSort)).get(); Optional<CbSummary> max = cbSummaryList.stream().filter(summary -> summary.getSort() < cbSummary.getSort() && summary.getLevel() == parentLevel)
.max(Comparator.comparing(CbSummary::getSort));
if (max.isPresent()) {
parent = max.get();
}
if(ObjectUtil.isNull(parent)){ if(ObjectUtil.isNull(parent)){
throw new ServiceException("'序号'列数据错误,无法匹配层级!"); throw new ServiceException("'序号'列数据错误,无法匹配层级!");
} }
...@@ -223,10 +226,23 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary ...@@ -223,10 +226,23 @@ public class CbSummaryServiceImpl extends ServiceImpl<CbSummaryMapper, CbSummary
if (cbSummary.getLevel() == 0) { if (cbSummary.getLevel() == 0) {
continue; continue;
} }
//获取父级id CbSummary parent = null;
Integer parentLevel = cbSummary.getLevel() - 1; //通过序号获取parentId
CbSummary parent = cbSummaryList.stream().filter(summary -> summary.getSort() < cbSummary.getSort() && summary.getLevel() == parentLevel) if (StringUtil.count(cbSummary.getNumber(), "-") > 1) {
.max(Comparator.comparing(CbSummary::getSort)).get(); String parentNumber = cbSummary.getNumber().substring(0, cbSummary.getNumber().lastIndexOf("-"));
Optional<CbSummary> max = cbSummaryList.stream().limit(cbSummary.getSort()).filter(summary -> summary.getNumber().equals(parentNumber))
.max(Comparator.comparing(CbSummary::getSort));
if (max.isPresent()) {
parent = max.get();
}
} else {
Integer parentLevel = cbSummary.getLevel() - 1;
Optional<CbSummary> max = cbSummaryList.stream().filter(summary -> summary.getSort() < cbSummary.getSort() && summary.getLevel() == parentLevel)
.max(Comparator.comparing(CbSummary::getSort));
if (max.isPresent()) {
parent = max.get();
}
}
if(ObjectUtil.isNull(parent)){ if(ObjectUtil.isNull(parent)){
throw new ServiceException("'序号'列数据错误,无法匹配层级!"); throw new ServiceException("'序号'列数据错误,无法匹配层级!");
} }
......
...@@ -2,5 +2,13 @@ ...@@ -2,5 +2,13 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.cscec.mapper.CbDirectExpenseMapper"> <mapper namespace="com.dsk.cscec.mapper.CbDirectExpenseMapper">
<select id="selectMenuData" resultType="com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo">
select cde.id menuId, cde.parent_id, cde.expense_name menuName, cde.level menuLevel
from cb_direct_expense cde
where cde.project_id = #{projectId}
and cde.expense_category_tag regexp #{regx}
and cde.del_flag = #{deleteFlagExist}
order by cde.sort
</select>
</mapper> </mapper>
...@@ -134,7 +134,7 @@ ...@@ -134,7 +134,7 @@
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 = #{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 csa1.del_flag = 0) left join cb_summary_actual csa1 on (csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND csa1.del_flag = 0)
left join cb_direct_expense cde on (csu.project_id = cde.project_id and csu.cb_stage = cde.cb_stage and cde.del_flag = 0) left join cb_direct_expense cde on (csu.project_id = cde.project_id and cde.del_flag = 0)
where csu.id = #{id} and csu.del_flag = 0 where csu.id = #{id} and csu.del_flag = 0
group by csu.id group by csu.id
order by csu.sort order by csu.sort
...@@ -147,7 +147,7 @@ ...@@ -147,7 +147,7 @@
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 = #{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 csa1.del_flag = 0) left join cb_summary_actual csa1 on (csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND csa1.del_flag = 0)
left join cb_direct_expense cde on (csu.project_id = cde.project_id and csu.cb_stage = cde.cb_stage and cde.del_flag = 0) left join cb_direct_expense cde on (csu.project_id = cde.project_id and cde.del_flag = 0)
where csu.parent_id = #{parentId} and csu.del_flag = 0 where csu.parent_id = #{parentId} and csu.del_flag = 0
group by csu.id group by csu.id
order by csu.sort order by csu.sort
......
...@@ -66,10 +66,11 @@ export function importData(projectId) { ...@@ -66,10 +66,11 @@ export function importData(projectId) {
} }
//获取草稿箱列表 //获取草稿箱列表
export function getDraftDialogList(projectId) { export function getDraftDialogList(data) {
return request({ return request({
url: '/cbProjectRecord/getDraftDialogList', url: '/cbProjectRecord/getDraftDialogList',
method: 'get', method: 'get',
params:data
}); });
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<template slot-scope="scope">{{pagingHandler(hasQueryParams,queryParams,scope)}}</template> <template slot-scope="scope">{{pagingHandler(hasQueryParams,queryParams,scope)}}</template>
</el-table-column> </el-table-column>
<template v-for="(item,index) in formColum"> <template v-for="(item,index) in formColum">
<!-- 自定义表头组件 不恒等false才展示当前列 -->
<template v-if="item.use !== false"> <template v-if="item.use !== false">
<!-- 复选框列 --> <!-- 复选框列 -->
<el-table-column v-if="item.type == 'selection'" type="selection" :key="item.uid ? item.uid : index" <el-table-column v-if="item.type == 'selection'" type="selection" :key="item.uid ? item.uid : index"
...@@ -24,33 +25,25 @@ ...@@ -24,33 +25,25 @@
:resizable="false"> :resizable="false">
<template slot-scope="scope">{{pagingHandler(hasQueryParams,queryParams,scope)}}</template> <template slot-scope="scope">{{pagingHandler(hasQueryParams,queryParams,scope)}}</template>
</el-table-column> </el-table-column>
<!-- 普通列 --> <!-- 正常列 -->
<el-table-column v-else :key="item.uid ? item.uid : index" :label="item.label" :prop="item.prop" :width="item.width" <el-table-column v-else :key="item.uid ? item.uid : index" :label="item.label" :prop="item.prop" :width="item.width"
:min-width="item.minWidth" :align="item.align?item.align:'left'" :fixed="item.fixed" :min-width="item.minWidth" :align="item.align?item.align:'left'" :fixed="item.fixed"
:sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false" :resizable="false" :sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false" :resizable="false"
:show-overflow-tooltip="item.showOverflowTooltip"> :show-overflow-tooltip="item.showOverflowTooltip">
<template v-if="item.children&&item.children.length"> <!-- 自定义表头 -->
<el-table-column v-for="(cld, i) in item.children" :key="i" :prop="cld.prop" :label="cld.label" :width="cld.width" :resizable="false"> <template v-if="item.slotHeader" slot="header">
<template slot-scope="cldscope">
<template v-if="cld.slot">
<slot :name="cld.prop" :row="cldscope.row" :data="cld"></slot>
</template>
<template v-else>
<span>{{cldscope.row[cld.prop] || '-'}}</span>
</template>
</template>
</el-table-column>
</template>
<template v-else-if="item.slotHeader" slot="header">
<slot :name="item.slotName"></slot> <slot :name="item.slotName"></slot>
</template> </template>
<!-- 非自定义表头 -->
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 有自定义插槽 -->
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot> <slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot>
<!-- 操作栏 --> <!-- 操作栏 -->
<slot v-else-if="item.prop == 'action-field-bar'" name="action-field-bar" :row="scope.row" :index="scope.$index" :data="item"></slot> <slot v-else-if="item.prop == 'action-field-bar'" name="action-field-bar" :row="scope.row" :index="scope.$index" :data="item"></slot>
<span v-else> <!-- 没有插槽 -->
<div v-else>
{{ scope.row[item.prop] || '-' }} {{ scope.row[item.prop] || '-' }}
</span> </div>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
......
...@@ -37,7 +37,9 @@ ...@@ -37,7 +37,9 @@
<div class="project-feedsummary-list-container"> <div class="project-feedsummary-list-container">
<dsk-skeleton v-if="tableLoading"></dsk-skeleton> <dsk-skeleton v-if="tableLoading"></dsk-skeleton>
<table-list-com :tableData="tableDataList" :formColum="formColum" v-else-if="!tableLoading" :maxHeight="true" :tableDataTotal="total" <table-list-com :tableData="tableDataList" :formColum="formColum" v-else-if="!tableLoading" :maxHeight="true" :tableDataTotal="total"
:paging="false"></table-list-com> :paging="false">
</table-list-com>
</div> </div>
</div> </div>
</div> </div>
...@@ -97,11 +99,11 @@ export default { ...@@ -97,11 +99,11 @@ export default {
comProjectId: this.projectId, comProjectId: this.projectId,
menuTreeList: [], menuTreeList: [],
// 加载数据列表 // 加载数据列表
tableLoading: false, tableLoading: true,
total: 0, total: 0,
// 列表表头 // 列表表头
formColum: [ formColum: [
{ label: '序号', prop: "staticSerialNumber", type: "index", lock: true, width: "52", fixed: false, uid: v4() }, { label: '序号', prop: "staticSerialNumber", type: "index", lock: true, width: "53", fixed: false, uid: v4() },
{ label: '成本科目', prop: "cbSubjectName", width: "137", uid: v4() }, { label: '成本科目', prop: "cbSubjectName", width: "137", uid: v4() },
{ label: '公司编码', prop: "companyNo", width: "137", uid: v4() }, { label: '公司编码', prop: "companyNo", width: "137", uid: v4() },
{ label: '集团编码', prop: "orgNo", width: "137", uid: v4() }, { label: '集团编码', prop: "orgNo", width: "137", uid: v4() },
...@@ -110,6 +112,11 @@ export default { ...@@ -110,6 +112,11 @@ export default {
{ label: '计算规则', prop: "calculationRule", width: "137", uid: v4() }, { label: '计算规则', prop: "calculationRule", width: "137", uid: v4() },
{ label: '单位', prop: "unit", width: "57", uid: v4() }, { label: '单位', prop: "unit", width: "57", uid: v4() },
{ label: '甲供材料说明', prop: "materialDescription", width: "137", uid: v4() }, { label: '甲供材料说明', prop: "materialDescription", width: "137", uid: v4() },
{
label: '计划成本', prop: "jhcb", width: "809", align: "center", slot: true, uid: v4(), children: [
{ label: '指导价格', prop: "guidePrice", width: "81", uid: v4() }
]
},
], ],
// 已记录月份集合 // 已记录月份集合
monthList: [], monthList: [],
...@@ -194,6 +201,7 @@ export default { ...@@ -194,6 +201,7 @@ export default {
}, },
async getFeedSummaryList(params = {}) { async getFeedSummaryList(params = {}) {
try { try {
this.tableLoading = true;
const list = await getFeedSummaryListApi(params); const list = await getFeedSummaryListApi(params);
if (list.code == 200 && list.data instanceof Array) { if (list.code == 200 && list.data instanceof Array) {
this.tableDataList = list.data; this.tableDataList = list.data;
...@@ -201,6 +209,8 @@ export default { ...@@ -201,6 +209,8 @@ export default {
} }
} catch (error) { } catch (error) {
} finally {
this.tableLoading = false;
} }
}, },
async getFeedSummaryMenuTree(params) { async getFeedSummaryMenuTree(params) {
...@@ -226,8 +236,6 @@ export default { ...@@ -226,8 +236,6 @@ export default {
// 默认以当前月数据为准 若不包含当前月 需要手动push数据 // 默认以当前月数据为准 若不包含当前月 需要手动push数据
if (!data.includes(_now)) { if (!data.includes(_now)) {
data.push(_now); data.push(_now);
data.push("202401");
data.push("202312");
} }
this.monthList = data.map(item => { this.monthList = data.map(item => {
return { return {
...@@ -397,8 +405,24 @@ export default { ...@@ -397,8 +405,24 @@ export default {
height: calc(100% - 48px); height: calc(100% - 48px);
/* overflow: auto; */ /* overflow: auto; */
.table-list-com-ins { .dsk-skeleton-outer-container {
padding: 0px;
height: 100%;
}
::v-deep .table-list-com-ins {
height: 100%; height: 100%;
.table-item {
.el-table {
th {
height: 80px;
}
.cell {
font-size: 14px;
font-weight: 350;
}
}
}
} }
} }
} }
......
...@@ -70,15 +70,15 @@ ...@@ -70,15 +70,15 @@
<div style="display:flex;align-items:center"> <div style="display:flex;align-items:center">
<el-tooltip placement="top" v-if="scope.row.projectText.length>20"> <el-tooltip placement="top" v-if="scope.row.projectText.length>20">
<div class="renling"> <div class="renling">
<router-link v-if="scope.row.isGetProjectDetail" :to="`/projectCostLedger/detail?projectId=${scope.row.id}`" tag="a" <router-link v-if="scope.row.projectFileStatus==2" :to="`/projectCostLedger/detail?projectId=${scope.row.id}`" tag="a"
class="wordprimary" v-html="scope.row.projectName"></router-link> class="wordprimary" v-html="scope.row.projectName"></router-link>
<span v-else v-html="scope.row.projectName"></span> <span v-else v-html="scope.row.projectName||'--'"></span>
</div> </div>
</el-tooltip> </el-tooltip>
<div class="renling" v-else> <div class="renling" v-else>
<router-link v-if="scope.row.isGetProjectDetail" :to="`/projectCostLedger/detail?projectId=${scope.row.id}`" tag="a" <router-link v-if="scope.row.projectFileStatus==2" :to="`/projectCostLedger/detail?projectId=${scope.row.id}`" tag="a"
class="wordprimary" v-html="scope.row.projectName"></router-link> class="wordprimary" v-html="scope.row.projectName"></router-link>
<span v-else v-html="scope.row.projectName"></span> <span v-else v-html="scope.row.projectName||'--'"></span>
</div> </div>
</div> </div>
...@@ -156,6 +156,7 @@ ...@@ -156,6 +156,7 @@
</el-dialog> </el-dialog>
<!--新增、修改弹窗--> <!--新增、修改弹窗-->
<el-dialog <el-dialog
:close-on-click-modal="false"
class="pro-news" class="pro-news"
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="480px"> width="480px">
...@@ -231,7 +232,7 @@ ...@@ -231,7 +232,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div class="pagination clearfix" v-show="total>cgPagesize"> <div class="pagination clearfix" v-show="cgxtotal>cgPagesize">
<el-pagination background :page-size="cgPagesize" :current-page.sync="cgPagenum" <el-pagination background :page-size="cgPagesize" :current-page.sync="cgPagenum"
@current-change="getCGXlist" layout="prev, pager, next" @current-change="getCGXlist" layout="prev, pager, next"
:total="cgxtotal"> :total="cgxtotal">
...@@ -468,7 +469,7 @@ ...@@ -468,7 +469,7 @@
pageSize:50, pageSize:50,
pageNum:1, pageNum:1,
} }
// this.customerAll() this.getlist()
}, },
//添加项目 //添加项目
insertPro(){ insertPro(){
...@@ -503,10 +504,11 @@ ...@@ -503,10 +504,11 @@
this.uploadData = data this.uploadData = data
this.isupload = true this.isupload = true
this.cgxVisible = false this.cgxVisible = false
this.prodetail = false
}, },
handleCurrentChange(val){ handleCurrentChange(val){
this.formdata.pageNum = val this.formdata.pageNum = val
this.customerAll() this.getlist()
}, },
setHeaderRow() { setHeaderRow() {
return "owner-table-list-header"; return "owner-table-list-header";
......
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
</div> </div>
<el-divider></el-divider> <el-divider></el-divider>
<div class="pro-btns"> <div class="pro-btns">
<el-button type="primary" size="small" @click="importdata">导入数据</el-button> <el-button type="primary" size="small" @click="importdata" v-if="!prodetail">导入数据</el-button>
<el-button size="small" @click="goback">返回</el-button> <el-button size="small" @click="goback">返回</el-button>
</div> </div>
...@@ -296,13 +296,15 @@ ...@@ -296,13 +296,15 @@
importdata(){ importdata(){
this.visible = true this.visible = true
let valid = true let valid = true
if(this.directExpense&&this.quantitySummary&&this.measureProject&&this.otherProject&&this.sceneExpense&&this.cbSummary){ if(this.directExpense.length>0&&this.quantitySummary.length>0
&&this.measureProject.length>0&&this.otherProject.length>0
&&this.sceneExpense.length>0&&this.cbSummary.length>0){
valid = true valid = true
}else{ importData(this.formdata.id).then(res=>{})
}else{
valid = false valid = false
} }
if (valid) { if (valid) {
importData(this.formdata.id).then(res=>{})
this.issub = true this.issub = true
this.directExpense.forEach(item=>{ this.directExpense.forEach(item=>{
item.fileParseStatus = 1 item.fileParseStatus = 1
......
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