Commit a3dec409 authored by tianhongyang's avatar tianhongyang

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys...

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys into V20231129-中建一局二公司
parents c39b8360 fd469e9c
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.CbSummaryActualListBo;
import com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo;
import com.dsk.cscec.service.ICbGainLossAnalysisService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 成本-盈亏分析对比
*
* @Author lcl
* @Data 2024/2/18 14:01
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/cb/gain/loss/analysis")
public class CbGainLossAnalysisController extends BaseController {
private final ICbGainLossAnalysisService baseService;
/**
* 数据列表
*/
@GetMapping("/list")
public R<List<CbGainLossAnalysisListVo>> getList(CbSummaryActualListBo bo) {
return R.ok(baseService.getList(bo));
}
}
package com.dsk.cscec.controller;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.lang.Assert;
import com.dsk.common.annotation.Log;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.QueryProjectFileUploadDetailBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.system.domain.vo.SysOssVo;
......@@ -48,19 +48,19 @@ public class CbProjectFileController extends BaseController {
@PostMapping(value = "/uploadCbProjectFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Map<String, String>> uploadCbProjectFile(@Validated @ModelAttribute AddProjectFileUploadBo fileUploadBo) throws UnsupportedEncodingException {
MultipartFile file = fileUploadBo.getFile();
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
Assert.notNull(file, "上传文件不能为空");
SysOssVo oss = iSysOssService.upload(file);
//添加项目上传文件记录
CbProjectFile cbProjectFile;
try {
baseService.addProjectFile(fileUploadBo, oss);
cbProjectFile = baseService.addProjectFile(fileUploadBo, oss);
} catch (ServiceException e) {
//删除oss中的文件
iSysOssService.deleteWithValidByIds(Collections.singletonList(oss.getOssId()), true);
throw e;
}
Map<String, String> map = new HashMap<>(2);
map.put("fileId", cbProjectFile.getId().toString());
map.put("fileName", oss.getOriginalName());
map.put("fileOssId", oss.getOssId().toString());
map.put("fileOssUrl", oss.getUrl());
......@@ -78,8 +78,8 @@ public class CbProjectFileController extends BaseController {
/**
* 获取项目文件上传详情
*/
@GetMapping("/getProjectFileUploadDetail")
public R<QueryProjectFileUploadDetailVo> getProjectFileUploadDetail(@Validated @RequestBody QueryProjectFileUploadDetailBo uploadDetailBo) {
return R.ok(baseService.getProjectFileUploadDetail(uploadDetailBo));
@GetMapping("/getProjectFileUploadDetail/{projectId}")
public R<QueryProjectFileUploadDetailVo> getProjectFileUploadDetail(@NotNull(message = "项目ID不能为空") @PathVariable Long projectId) {
return R.ok(baseService.getProjectFileUploadDetail(projectId));
}
}
\ No newline at end of file
......@@ -2,11 +2,15 @@ package com.dsk.cscec.controller;
import cn.hutool.core.lang.Assert;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.bo.ImportCbProjectDataBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.cscec.service.IDProjectService;
import org.springframework.validation.annotation.Validated;
......@@ -14,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
......@@ -54,12 +59,20 @@ public class CbProjectRecordController extends BaseController {
/**
* 根据项目文件导入数据
*/
@PostMapping("/importData")
public R<Void> importData(@Validated @RequestBody ImportCbProjectDataBo importDataBo) {
baseService.importData(importDataBo);
@PostMapping("/importData/{projectId}")
public R<Void> importData(@NotNull(message = "项目ID不能为空") @PathVariable Long projectId) throws Exception {
baseService.importData(projectId);
return R.ok("已开始解析成本数据,过程需3~10分钟,稍后可到项目列表查看导入结果");
}
/**
* 获取项目台账列表
*/
@GetMapping("/getProjectList")
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
return baseService.getProjectList(searchBo, pageQuery);
}
/**
* 修改项目信息
*/
......@@ -68,14 +81,21 @@ public class CbProjectRecordController extends BaseController {
return toAjax(baseService.editProjectInfo(editBo));
}
///**
// * 获取项目台账列表
// */
//@GetMapping("/getProjectList")
//public R<List<CbProjectRecord>> getProjectList() {
// List<CbProjectRecord> projectList = baseService.getProjectList();
// return R.ok(projectList);
//}
/**
* 获取新阶段项目可选成本阶段
*/
@GetMapping("/getProjectAvailableCbStage/{relatedId}")
public R<List<Integer>> getProjectAvailableCbStage(@NotNull(message = "关联ID不能为空") @PathVariable Long relatedId) {
return R.ok(baseService.getProjectAvailableCbStage(relatedId));
}
/**
* 新增新阶段项目
*/
@PostMapping("/addNewStageProject")
public R<CbProjectRecord> addNewStageProject(@Validated @RequestBody AddNewCbProjectBo newProjectBo) {
return R.ok(baseService.addNewStageProject(newProjectBo));
}
/**
* 获取草稿弹窗列表
......@@ -89,5 +109,12 @@ public class CbProjectRecordController extends BaseController {
return R.ok(draftList);
}
/**
* 删除草稿
*/
@DeleteMapping("/deleteDraft/{projectId}")
public R<Void> deleteDraft(@NotNull(message = "项目ID不能为空") @PathVariable Long projectId) {
return toAjax(baseService.deleteDraft(projectId));
}
}
......@@ -32,7 +32,7 @@ public class CbProjectFile extends BaseEntity implements Serializable {
*/
private Integer cbStage;
/**
* 成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
* 成本类型(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
*/
private Integer cbType;
/**
......@@ -56,7 +56,7 @@ public class CbProjectFile extends BaseEntity implements Serializable {
*/
private String failRemark;
/**
* 删除状态(0:否、2:是)
* 删除状态(0:否、1:待删除、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
......
package com.dsk.cscec.domain.bo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.02.07
* @time 11:28
* @date 2024.02.19
* @time 14:22
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ImportCbProjectDataBo {
public class AddNewCbProjectBo extends EditProjectInfoBo {
/**
* 项目ID
* 关联ID(关联多个阶段)
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
@NotNull(message = "关联ID不能为空")
private Long relatedId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
......
......@@ -12,11 +12,18 @@ import javax.validation.constraints.NotNull;
*/
@Data
public class AddProjectFileUploadBo {
/**
* 文件
*/
private MultipartFile file;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
@NotNull(message = "成本阶段不能为空")
private Integer cbStage;
/**
* 成本类型
*/
@NotNull(message = "成本类型不能为空")
private Integer cbType;
}
......@@ -2,23 +2,27 @@ package com.dsk.cscec.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author sxk
* @date 2024.02.06
* @time 14:17
* @date 2024.02.18
* @time 15:04
*/
@Data
public class QueryProjectFileUploadDetailBo {
public class CbProjectSearchBo {
/**
* 项目名称
*/
private String projectName;
/**
* 项目ID
* IPM项目编码
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
private String ipmProjectNo;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
@NotNull(message = "成本阶段不能为空")
private Integer cbStage;
/**
* 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/
private Integer projectFileStatus;
}
......@@ -33,8 +33,4 @@ public class EditProjectInfoBo {
* 文件名称
*/
private String projectFileName;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Author lcl
* @Data 2024/2/19 9:42
*/
@Data
public class CbGainLossAnalysisListVo implements Serializable {
private Long id;
/**
* 名称
*/
private String cbName;
/**
* 招标控制价(招标控制价合价)
*/
private String tenderSumPrice;
/**
* 招标控制价(不含税招标合价)
*/
private String taxExcludeTenderSumPrice;
/**
* 招标控制价(含税招标合价)
*/
private String taxIncludeTenderSumPrice;
/**
* 投标报价(投标报价合价)
*/
private String bidSumPrice;
/**
* 投标报价(不含税投标合价)
*/
private String taxExcludeBidSumPrice;
/**
* 投标报价(含税投标合价)
*/
private String taxIncludebBidSumPrice;
/**
* 成本汇总(不含税成本合价)
*/
private String taxExclusiveTotal;
/**
* 成本汇总(成本税金合价)
*/
private String cbTaxesTotal;
/**
* 成本汇总(含税成本合价)
*/
private String taxInclusiveTotal;
/**
* 造价指标(招标控制价)
*/
private String costTender;
/**
* 造价指标(投标报价)
*/
private String costBid;
/**
* 造价指标(成本)
*/
private String costExpense;
/**
* 含税成本占比
*/
private String taxInclusiveExpenseProportion;
/**
* 招标控制价(含税合价偏差)
*/
private String tenderSumPriceDeviation;
/**
* 招标控制价(含税盈亏率)
*/
private String tenderProfitLossRatio;
/**
* 投标报价(含税合价偏差)
*/
private String bidSumPriceDeviation;
/**
* 投标报价(含税盈亏率)
*/
private String bidProfitLossRatio;
/**
* 实际成本费用(本月费用(含税))
*/
private String taxInclusiveExpense;
/**
* 实际成本费用(本月费用(不含税))
*/
private String taxExclusiveExpense;
/**
* 实际成本费用(截至本月费用(含税))
*/
private String sumTaxInclusiveExpense;
/**
* 实际成本费用(截至本月费用(不含税))
*/
private String sumTaxExclusiveExpense;
private List<CbGainLossAnalysisListVo> children;
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.util.Date;
/**
* @author sxk
* @date 2024.02.18
* @time 15:18
*/
@Data
public class ProjectRecordDataVo {
/**
* 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/
private Integer projectFileStatus;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.util.List;
/**
* @author sxk
* @date 2024.02.18
* @time 15:08
*/
@Data
public class ProjectRecordSearchVo {
/**
* 项目ID
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* IPM项目编码
*/
private String ipmProjectNo;
/**
* 文件名称
*/
private String projectFileName;
/**
* 项目数据
*/
private List<ProjectRecordDataVo> dataVoList;
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
/**
* 项目台账表(CbProjectRecord)表数据库访问层
......@@ -10,6 +13,10 @@ import com.dsk.cscec.domain.CbProjectRecord;
* @since 2024-02-05 11:37:49
*/
public interface CbProjectRecordMapper extends BaseMapper<CbProjectRecord> {
/**
* 获取项目台账列表
*/
Page<ProjectRecordSearchVo> selectPageProjectRecordList(Page<ProjectRecordSearchVo> build, QueryWrapper<CbProjectRecord> wrapper);
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.bo.CbSummaryBo;
import com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo;
import com.dsk.cscec.domain.vo.CbSummaryActualListVo;
import org.apache.ibatis.annotations.Param;
......@@ -53,4 +54,11 @@ public interface CbSummaryMapper extends BaseMapper<CbSummary> {
* @return
*/
List<Map<String, Object>> selectByLevel(@Param("bo") CbSummaryBo bo);
CbGainLossAnalysisListVo getGainLossAnalysisById(@Param("id") Long id, @Param("expenseDate") String expenseDate);
List<CbGainLossAnalysisListVo> getGainLossAnalysisByParentId(@Param("id") Long parentId, @Param("expenseDate") String expenseDate);
}
......@@ -3,7 +3,6 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.QueryProjectFileUploadDetailBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.system.domain.vo.SysOssVo;
......@@ -19,8 +18,9 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
*
* @param fileUploadBo 上传信息
* @param oss oss信息
* @return 文件实体
*/
void addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss);
CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss);
/**
* 逻辑删除项目上传文件记录
......@@ -33,9 +33,9 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
/**
* 获取项目文件上传详情
*
* @param uploadDetailBo 查询信息
* @param projectId 项目ID
* @return 文件列表
*/
QueryProjectFileUploadDetailVo getProjectFileUploadDetail(QueryProjectFileUploadDetailBo uploadDetailBo);
QueryProjectFileUploadDetailVo getProjectFileUploadDetail(Long projectId);
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.bo.ImportCbProjectDataBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import java.util.List;
......@@ -26,9 +30,18 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
/**
* 根据项目文件导入数据
*
* @param importDataBo 导入对象
* @param projectId 项目ID
*/
void importData(ImportCbProjectDataBo importDataBo);
void importData(Long projectId) throws Exception;
/**
* 获取项目台账列表
*
* @param searchBo 查询条件
* @param pageQuery 分页对象
* @return 分页数据
*/
TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery);
/**
* 修改项目信息
......@@ -38,10 +51,34 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
*/
Integer editProjectInfo(EditProjectInfoBo editBo);
/**
* 获取新阶段项目可选成本阶段
*
* @param relatedId 关联ID
* @return 可选成本阶段
*/
List<Integer> getProjectAvailableCbStage(Long relatedId);
/**
* 新增新阶段项目
*
* @param newProjectBo 新增对象
* @return 新增结果
*/
CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo);
/**
* 获取草稿弹窗列表
*
* @return 草稿弹窗列表
*/
List<CbProjectRecord> getDraftDialogList();
/**
* 删除草稿
*
* @param projectId 项目ID
* @return 删除结果
*/
Integer deleteDraft(Long projectId);
}
package com.dsk.cscec.service;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo;
import java.util.List;
public interface ICbGainLossAnalysisService {
List<CbGainLossAnalysisListVo> getList(CbSummaryActualListBo bo);
}
package com.dsk.cscec.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.cscec.domain.CbSummary;
import com.dsk.cscec.domain.bo.CbSummaryActualListBo;
import com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo;
import com.dsk.cscec.mapper.CbSummaryMapper;
import com.dsk.cscec.service.ICbGainLossAnalysisService;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author lcl
* @Data 2024/2/18 14:03
*/
@Slf4j
@Service
public class CbGainLossAnalysisServiceImpl implements ICbGainLossAnalysisService {
@Resource
private CbSummaryMapper cbSummaryMapper;
@Override
public List<CbGainLossAnalysisListVo> getList(CbSummaryActualListBo bo) {
Assert.notNull(bo.getId(),"id不能为空");
List<CbGainLossAnalysisListVo> resultList = new ArrayList<>();
if (StringUtil.isBlank(bo.getExpenseDate())) {
//默认当前月
bo.setExpenseDate(DatePattern.SIMPLE_MONTH_FORMAT.format(new Date()));
}
CbSummary cbSummary = cbSummaryMapper.selectById(bo.getId());
if (ObjectUtil.isEmpty(cbSummary)) {
return resultList;
}
List<CbGainLossAnalysisListVo> childrenList = cbSummaryMapper.getGainLossAnalysisByParentId(bo.getId(), bo.getExpenseDate());
if (0 == cbSummary.getLevel()) {
resultList = childrenList;
}else {
childrenList = getProjectSumList(bo);
CbGainLossAnalysisListVo cbGainLossAnalysisListVo = cbSummaryMapper.getGainLossAnalysisById(bo.getId(),bo.getExpenseDate());
cbGainLossAnalysisListVo.setChildren(childrenList);
resultList.add(cbGainLossAnalysisListVo);
}
return resultList;
}
/**
* 盈亏对比分析列表
*
*/
private List<CbGainLossAnalysisListVo> getProjectSumList(CbSummaryActualListBo bo) {
List<CbGainLossAnalysisListVo> childrenList = cbSummaryMapper.getGainLossAnalysisByParentId(bo.getId(), bo.getExpenseDate());
childrenList.forEach(children -> {
CbSummaryActualListBo childBo = new CbSummaryActualListBo();
childBo.setId(children.getId());
childBo.setExpenseDate(bo.getExpenseDate());
children.setChildren(getProjectSumList(childBo));
});
return childrenList;
}
}
......@@ -4,12 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddProjectFileUploadBo;
import com.dsk.cscec.domain.bo.QueryProjectFileUploadDetailBo;
import com.dsk.cscec.domain.vo.QueryProjectFileUploadDetailVo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
......@@ -40,22 +38,23 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
*
* @param fileUploadBo 上传信息
* @param oss oss信息
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss) {
public CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss) {
//校验项目是否存在
this.checkProjectExist(fileUploadBo.getProjectId());
CbProjectRecord projectRecord = this.checkProjectExist(fileUploadBo.getProjectId());
CbProjectFile projectFile = BeanUtil.toBean(fileUploadBo, CbProjectFile.class);
projectFile.setCbStage(projectRecord.getCbStage());
projectFile.setFileName(oss.getOriginalName());
projectFile.setFileOssId(oss.getOssId());
projectFile.setFileOssUrl(oss.getUrl());
//项目文件状态:准备中
projectFile.setFileParseStatus(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING);
//删除状态:未删除
projectFile.setDelFlag(CbProjectConstants.DELETE_FLAG_EXIST);
baseMapper.insert(projectFile);
return projectFile;
}
/**
......@@ -68,26 +67,24 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
public Integer deleteProjectFile(Long fileId) {
CbProjectFile projectFile = baseMapper.selectById(fileId);
Assert.notNull(projectFile, "该文件不存在");
projectFile.setDelFlag(CbProjectConstants.DELETE_FLAG_NOT_EXIST);
return baseMapper.updateById(projectFile);
return baseMapper.deleteById(projectFile);
}
/**
* 获取项目文件上传详情
*
* @param uploadDetailBo 查询信息
* @param projectId 项目ID
* @return 文件列表
*/
@Override
public QueryProjectFileUploadDetailVo getProjectFileUploadDetail(QueryProjectFileUploadDetailBo uploadDetailBo) {
Long projectId = uploadDetailBo.getProjectId();
public QueryProjectFileUploadDetailVo getProjectFileUploadDetail(Long projectId) {
//校验项目是否存在
this.checkProjectExist(projectId);
List<CbProjectFile> projectFileList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectId)
//成本阶段
.eq(CbProjectFile::getCbStage, uploadDetailBo.getCbStage())
//.eq(CbProjectFile::getCbStage, uploadDetailBo.getCbStage())
//删除状态:否
.eq(CbProjectFile::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST));
......@@ -127,13 +124,12 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
* 校验项目是否存在
*
* @param projectId 项目ID
* @return 项目实体
*/
private void checkProjectExist(Long projectId) {
private CbProjectRecord checkProjectExist(Long projectId) {
//校验项目是否存在
if (!projectRecordMapper.exists(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getId, projectId)
.eq(CbProjectRecord::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST))) {
throw new ServiceException("该项目不存在");
}
CbProjectRecord projectRecord = projectRecordMapper.selectById(projectId);
Assert.notNull(projectRecord, "该项目不存在");
return projectRecord;
}
}
......@@ -2,14 +2,21 @@ 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.StringUtils;
import com.dsk.component.DataAnalysisComponent;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.bo.ImportCbProjectDataBo;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectRecordService;
......@@ -17,6 +24,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -31,6 +39,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
private CbProjectRecordMapper baseMapper;
@Resource
private CbProjectFileMapper projectFileMapper;
@Resource
private DataAnalysisComponent dataAnalysisComponent;
/**
* 新增项目
......@@ -42,6 +52,17 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
@Transactional(rollbackFor = Exception.class)
public CbProjectRecord addProject(AddCbProjectBo addCbProjectBo) {
CbProjectRecord projectRecord = BeanUtil.toBean(addCbProjectBo, CbProjectRecord.class);
//生成唯一关联ID
boolean idFlag = true;
long relatedId = -1;
while (idFlag) {
relatedId = IdUtil.getSnowflakeNextId();
idFlag = baseMapper.exists(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, relatedId));
}
projectRecord.setRelatedId(relatedId);
//项目文件状态:准备中
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING);
//删除状态:否
......@@ -55,32 +76,38 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
/**
* 根据项目文件导入数据
*
* @param importDataBo 导入对象
* @param projectId 项目ID
*/
@Override
public void importData(ImportCbProjectDataBo importDataBo) {
Long projectId = importDataBo.getProjectId();
Integer cbStage = importDataBo.getCbStage();
@Transactional(rollbackFor = Exception.class)
public void importData(Long projectId) throws Exception {
//校验项目是否存在
this.checkProjectExist(projectId);
CbProjectRecord projectRecord = this.checkProjectExist(projectId);
//校验各个成本类型是否至少有1个文件
//直接费成本
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_DIRECT_EXPENSE, CbProjectConstants.CB_TYPE_DIRECT_EXPENSE_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_DIRECT_EXPENSE, CbProjectConstants.CB_TYPE_DIRECT_EXPENSE_NAME);
//工料汇总
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY, CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY, CbProjectConstants.CB_TYPE_QUANTITY_SUMMARY_NAME);
//措施项目
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_MEASURE_PROJECT, CbProjectConstants.CB_TYPE_MEASURE_PROJECT_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_MEASURE_PROJECT, CbProjectConstants.CB_TYPE_MEASURE_PROJECT_NAME);
//其他项目
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_OTHER_PROJECT, CbProjectConstants.CB_TYPE_OTHER_PROJECT_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_OTHER_PROJECT, CbProjectConstants.CB_TYPE_OTHER_PROJECT_NAME);
//现场经费
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_SCENE_EXPENSE, CbProjectConstants.CB_TYPE_SCENE_EXPENSE_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_SCENE_EXPENSE, CbProjectConstants.CB_TYPE_SCENE_EXPENSE_NAME);
//成本汇总
this.checkCbTypeExistFile(importDataBo, CbProjectConstants.CB_TYPE_SUMMARY, CbProjectConstants.CB_TYPE_SUMMARY_NAME);
this.checkCbTypeExistFile(projectId, CbProjectConstants.CB_TYPE_SUMMARY, CbProjectConstants.CB_TYPE_SUMMARY_NAME);
//修改项目文件状态:解析中
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PARSING);
//TODO:调各个成本类型的解析文件方法
//直接费成本
//工料汇总
CbProjectBaseBo projectBaseBo = new CbProjectBaseBo();
projectBaseBo.setProjectId(projectId);
projectBaseBo.setCbStage(projectRecord.getCbStage());
dataAnalysisComponent.quantitySummaryDataAnalysis(projectBaseBo);
//措施项目
//其他项目
//现场经费
......@@ -91,22 +118,45 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
/**
* 校验各个成本类型是否至少有1个文件
*
* @param importDataBo 导入对象
* @param cbType 成本类型字典(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
* @param cbTypeName 成本类型名称
* @param projectId 项目ID
* @param cbType 成本类型字典(0:直接费成本、1:工料汇总、2:措施项目、3:其他项目、4:现场经费、5:成本汇总)
* @param cbTypeName 成本类型名称
*/
private void checkCbTypeExistFile(ImportCbProjectDataBo importDataBo, Integer cbType, String cbTypeName) {
private void checkCbTypeExistFile(Long projectId, Integer cbType, String cbTypeName) {
boolean isExist = projectFileMapper.exists(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, importDataBo.getProjectId())
.eq(CbProjectFile::getCbStage, importDataBo.getCbStage())
.eq(CbProjectFile::getProjectId, projectId)
.eq(CbProjectFile::getCbType, cbType)
//项目文件状态:准备中
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
//删除状态:否
.eq(CbProjectFile::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST));
//项目文件状态:解析中
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING));
Assert.isTrue(isExist, cbTypeName + "至少需要上传1个文件");
}
/**
* 获取项目台账列表
*
* @param searchBo 查询条件
* @param pageQuery 分页对象
* @return 分页数据
*/
@Override
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
QueryWrapper<CbProjectRecord> wrapper = Wrappers.query();
wrapper
.like(StringUtils.isNotBlank(searchBo.getProjectName()), "project_name", searchBo.getProjectName())
.like(StringUtils.isNotBlank(searchBo.getIpmProjectNo()), "ipm_project_no", searchBo.getIpmProjectNo());
//TODO:成本阶段、文件解析状态筛选
Integer cbStage = searchBo.getCbStage();
Integer projectFileStatus = searchBo.getProjectFileStatus();
Page<ProjectRecordSearchVo> page = baseMapper.selectPageProjectRecordList(pageQuery.build(), wrapper);
for (ProjectRecordSearchVo searchVo : page.getRecords()) {
Long projectId = searchVo.getId();
//page.
}
return TableDataInfo.build(page);
}
/**
* 修改项目信息
*
......@@ -114,28 +164,84 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
* @return 修改结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer editProjectInfo(EditProjectInfoBo editBo) {
//校验项目是否存在
this.checkProjectExist(editBo.getProjectId());
CbProjectRecord projectRecord = baseMapper.selectById(editBo.getProjectId());
projectRecord.setProjectName(editBo.getProjectName());
projectRecord.setIpmProjectNo(editBo.getIpmProjectNo());
projectRecord.setIsGetProjectDetail(editBo.getIsGetProjectDetail());
projectRecord.setProjectFileName(editBo.getProjectFileName());
return baseMapper.updateById(projectRecord);
CbProjectRecord projectRecord = this.checkProjectExist(editBo.getProjectId());
for (CbProjectRecord record : baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, projectRecord.getRelatedId()))) {
record.setProjectName(editBo.getProjectName());
record.setIpmProjectNo(editBo.getIpmProjectNo());
record.setIsGetProjectDetail(editBo.getIsGetProjectDetail());
record.setProjectFileName(editBo.getProjectFileName());
Assert.isTrue(baseMapper.updateById(record) > 0, "修改失败,请联系系统管理员");
}
return 1;
}
/**
* 校验项目是否存在
* 获取新阶段项目可选成本阶段
*
* @param projectId 项目ID
* @param relatedId 关联ID
* @return 可选成本阶段
*/
private void checkProjectExist(Long projectId) {
CbProjectRecord projectRecord = baseMapper.selectOne(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getId, projectId)
.eq(CbProjectRecord::getDelFlag, CbProjectConstants.DELETE_FLAG_EXIST));
Assert.notNull(projectRecord, "该项目不存在");
@Override
public List<Integer> getProjectAvailableCbStage(Long relatedId) {
//通过关联ID校验项目是否存在
List<CbProjectRecord> projectRecordList = this.checkRelatedIdExist(relatedId);
ArrayList<Integer> cbStageList = new ArrayList<>();
cbStageList.add(CbProjectConstants.CB_STAGE_BEFORE_BID);
cbStageList.add(CbProjectConstants.CB_STAGE_AFTER_BID);
cbStageList.add(CbProjectConstants.CB_STAGE_TO_SOLID);
projectRecordList.forEach(projectRecord -> {
cbStageList.remove(projectRecord.getCbStage());
});
return cbStageList;
}
/**
* 新增新阶段项目
*
* @param newProjectBo 新增对象
* @return 新增结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo) {
//修改基础信息
this.editProjectInfo(BeanUtil.toBean(newProjectBo, EditProjectInfoBo.class));
//通过关联ID校验项目是否存在
List<CbProjectRecord> projectRecordList = this.checkRelatedIdExist(newProjectBo.getRelatedId());
//校验待新增的阶段是否已存在
projectRecordList.forEach(record -> {
Assert.isFalse(record.getCbStage().equals(newProjectBo.getCbStage()), "当前项目在该阶段已存在记录,请检查草稿箱或项目台账列表");
});
//新增该项目的新阶段
CbProjectRecord projectRecord = BeanUtil.toBean(newProjectBo, CbProjectRecord.class);
//项目文件状态:准备中
projectRecord.setProjectFileStatus(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING);
//删除状态:否
projectRecord.setDelFlag(CbProjectConstants.DELETE_FLAG_EXIST);
if (baseMapper.insert(projectRecord) > 0) {
return projectRecord;
}
return null;
}
/**
* 通过关联ID校验项目是否存在
*
* @return 该关联ID下的所有项目记录
*/
private List<CbProjectRecord> checkRelatedIdExist(Long relatedId) {
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>().eq(CbProjectRecord::getRelatedId, relatedId));
Assert.isFalse(projectRecordList.isEmpty(), "关联ID无效");
return projectRecordList;
}
/**
......@@ -146,6 +252,38 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
@Override
public List<CbProjectRecord> getDraftDialogList() {
return baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getProjectFileStatus,CbProjectConstants.PROJECT_FILE_STATUS_PREPARING));
.eq(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING));
}
/**
* 删除草稿
*
* @param projectId 项目ID
* @return 删除结果
*/
@Override
public Integer deleteDraft(Long projectId) {
//校验项目是否存在
CbProjectRecord projectRecord = this.checkProjectExist(projectId);
//删除该项目下已上传的文件
List<CbProjectFile> idList = projectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectId));
if (!idList.isEmpty()) {
projectFileMapper.deleteBatchIds(idList);
}
//删除项目记录
return baseMapper.deleteById(projectRecord);
}
/**
* 校验项目是否存在
*
* @param projectId 项目ID
* @return 项目实体
*/
private CbProjectRecord checkProjectExist(Long projectId) {
CbProjectRecord projectRecord = baseMapper.selectById(projectId);
Assert.notNull(projectRecord, "该项目不存在");
return projectRecord;
}
}
<?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.CbProjectRecordMapper">
<!--获取项目台账列表-->
<select id="selectPageProjectRecordList" resultType="com.dsk.cscec.domain.vo.ProjectRecordSearchVo">
select cpr.id,
cpr.project_name,
cpr.ipm_project_no,
cpr.project_file_name
from cb_project_record cpr
${ew.getCustomSqlSegment};
</select>
</mapper>
\ No newline at end of file
......@@ -107,5 +107,31 @@
order by csu.sort
</select>
<select id="getGainLossAnalysisById" resultType="com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo">
select csu.id, csu.cb_name, csu.tax_exclusive_total, csu.cb_taxes_total, csu.tax_inclusive_total, csa.tax_inclusive_expense, csa.tax_exclusive_expense,
sum(cde.tender_control_sum_price) tenderSumPrice, sum(cde.exclude_tax_cb_sum_price) taxExcludeTenderSumPrice, sum(cde.include_tax_cb_sum_price) taxIncludeTenderSumPrice,
sum(csa1.tax_inclusive_expense) sumTaxInclusiveExpense, sum(csa1.tax_exclusive_expense) sumTaxExclusiveExpense
from cb_summary csu
left join cb_summary_actual csa on (csu.id = csa.cb_summary_id and csa.expense_date = #{expenseDate} AND csa.del_flag = 0)
left join cb_summary_actual csa1 on (csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND 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)
where csu.id = #{id} and csu.del_flag = 0
group by csu.id
order by csu.sort
</select>
<select id="getGainLossAnalysisByParentId" resultType="com.dsk.cscec.domain.vo.CbGainLossAnalysisListVo">
select csu.id, csu.cb_name, csu.tax_exclusive_total, csu.cb_taxes_total, csu.tax_inclusive_total, csa.tax_inclusive_expense, csa.tax_exclusive_expense,
sum(cde.tender_control_sum_price) tenderSumPrice, sum(cde.exclude_tax_cb_sum_price) taxExcludeTenderSumPrice, sum(cde.include_tax_cb_sum_price) taxIncludeTenderSumPrice,
sum(csa1.tax_inclusive_expense) sumTaxInclusiveExpense, sum(csa1.tax_exclusive_expense) sumTaxExclusiveExpense
from cb_summary csu
left join cb_summary_actual csa on (csu.id = csa.cb_summary_id and csa.expense_date = #{expenseDate} AND csa.del_flag = 0)
left join cb_summary_actual csa1 on (csu.id = csa1.cb_summary_id and csa1.expense_date &lt;= #{expenseDate} AND 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)
where csu.parent_id = #{parentId} and csu.del_flag = 0
group by csu.id
order by csu.sort
</select>
</mapper>
......@@ -7,3 +7,26 @@ export function checkProjectCodeExist (data) {
method: 'get',
})
}
//新增项目
export function addProject (data) {
return request({
url: '/cbProjectRecord/addProject',
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',
})
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="12" height="12" viewBox="0 0 12 12"><g><g><path d="M2,6C2,3.79085,3.79085,2,6,2C8.209150000000001,2,10,3.79085,10,6C10,8.209150000000001,8.209150000000001,10,6,10C3.79085,10,2,8.209150000000001,2,6C2,6,2,6,2,6ZM6,1C3.23857,1,1,3.23857,1,6C1,8.76143,3.23857,11,6,11C8.76143,11,11,8.76143,11,6C11,3.23857,8.76143,1,6,1C6,1,6,1,6,1ZM5.15,4.99465C5.15,4.99465,5.15,4.8793500000000005,5.15,4.8793500000000005C5.1506,4.742179999999999,5.19968,4.59,5.30912,4.4756C5.41022,4.369949999999999,5.60728,4.25,5.99713,4.25C6.36322,4.25,6.61783,4.424799999999999,6.74765,4.6232500000000005C6.8863,4.8351500000000005,6.85897,5.01298,6.79318,5.10183C6.7111,5.21263,6.6092,5.31495,6.48607,5.4258C6.4486,5.45953,6.40242,5.49972,6.3529,5.5428C6.3529,5.5428,6.3529,5.54283,6.3529,5.54283C6.26435,5.61985,6.16515,5.70617,6.08605,5.78145C5.80517,6.0487,5.5001,6.4217,5.5001,7C5.5001,7,5.50173,7.2532,5.50173,7.2532C5.50173,7.2532,6.5017,7.2468,6.5017,7.2468C6.5017,7.2468,6.5001,6.99862,6.5001,6.99862C6.50047,6.82762,6.57058,6.70078,6.77537,6.5059C6.84422,6.4404,6.9061,6.38685,6.9769,6.3256C6.9769,6.3256,6.97692,6.32557,6.97692,6.32557C7.0293,6.28027,7.08655,6.23075,7.15513,6.16902C7.2977,6.04065,7.45638,5.88653,7.59675,5.69702C7.9758,5.1853,7.88715,4.5384,7.58448,4.07575C7.27297,3.59963,6.7062,3.25,5.99713,3.25C5.3835,3.25,4.90777,3.44858,4.58658,3.78428C4.27393,4.1110500000000005,4.1511499999999995,4.5227699999999995,4.15,4.87683C4.15,4.87683,4.15,4.99465,4.15,4.99465C4.15,4.99465,5.15,4.99465,5.15,4.99465C5.15,4.99465,5.15,4.99465,5.15,4.99465ZM5.5017,7.75C5.5017,7.75,5.5017,8.75195,5.5017,8.75195C5.5017,8.75195,6.5017,8.75195,6.5017,8.75195C6.5017,8.75195,6.5017,7.75,6.5017,7.75C6.5017,7.75,5.5017,7.75,5.5017,7.75C5.5017,7.75,5.5017,7.75,5.5017,7.75Z" fill-rule="evenodd" fill="#FFAB44" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<template>
<div class="project-cost-ledger-container">
<div class="project-cost-ledger-inner">
<div class="project-cost-ledger-inner" v-if="!isupload">
<div class="title_wrap">
<div class="enterprise_title">
项目成本台账
......@@ -20,6 +20,11 @@
<el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="项目状态">
<el-select v-model="formdata.customerClass" multiple placeholder="请选择" :collapse-tags="true" clearable>
<el-option v-for="(item,index) in ztStagelist" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
</el-select>
</el-form-item>
</el-row>
<el-divider></el-divider>
<el-form-item label=" ">
......@@ -35,13 +40,93 @@
<div class="item-jf-titel">暂无数据,点击按钮导入项目成本数据</div>
<el-button type="primary" class="jf-btn" size="small" @click="addPro">新增项目</el-button>
</div>
<skeleton v-if="isSkeleton"></skeleton>
<div style='padding: 16px' v-if="!isSkeleton&&total>0">
<div class="total-title">
<div class="totals">{{total}}</div>
<div class="btns">
<div class="btn btn_primary h32" @click="addPro">导入项目</div>
<div class="btn btn_default h32" @click="getcgx">草稿箱 ({{cgxtotal}})</div>
</div>
</div>
<div class="table-item-jf table-item">
<el-table :data="tableData" :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" border highlight-current-row
:header-row-class-name="setHeaderRow" :cell-class-name="setCellClass" :row-class-name="setRowClass" :header-cell-class-name="setCellClass"
ref="theOwnerListTable" :row-key="'customerKey'">
<el-table-column type="index" label="序号" width="60" :resizable="false">
<template slot-scope="scope">
<span>{{(formdata.pageNum - 1) *formdata.pageSize + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="工程名称" width="416" :resizable="false">
<template slot-scope="scope">
<div style="display:flex;align-items:center">
<el-tooltip placement="top" v-if="scope.row.customerText.length>20">
<div slot="content">{{scope.row.customerText}}</div>
<div class="renling">
<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>
<span v-else v-html="scope.row.customerName"></span>
</div>
</el-tooltip>
<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"
class="wordprimary" v-html="scope.row.customerName"></router-link>
<span v-else v-html="scope.row.customerName"></span>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="项目状态" prop="customerCode" width="90" :resizable="false">
</el-table-column>
<el-table-column label="IPM项目编码" min-width="136">
<template slot-scope="scope">
{{scope.row.recommendOrg||"--"}}
</template>
</el-table-column>
<el-table-column label="文件名称" min-width="286" :resizable="false">
<template slot-scope="scope">
{{scope.row.registerRegion||"--"}}
</template>
</el-table-column>
<el-table-column label="成本阶段" prop="customerCode" width="90" :resizable="false">
</el-table-column>
<el-table-column label="上传人" prop="customerCode" width="90" :resizable="false">
</el-table-column>
<el-table-column label="上传时间" min-width="180" :resizable="false">
<template slot-scope="scope">
{{scope.row.approveDate2||"--"}}
</template>
</el-table-column>
<el-table-column label="操作" min-width="256" :resizable="false" fixed="right">
<template slot-scope="scope">
<span class="wordprimary tabs" @click="goAccess(scope.row)">修改项目信息</span>
<span class="wordprimary tabs" @click="goAssessment(scope.row)">查看导入进度</span>
<span class="worddel tabs" @click="goDisposal(scope.row)">删除</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="pagination clearfix" v-show="total>formdata.pageSize">
<el-pagination background :page-size="formdata.pageSize" :current-page.sync="formdata.pageNum" @current-change="handleCurrentChange" layout="prev, pager, next"
:total="total">
</el-pagination>
</div>
</div>
<el-dialog
class="pro-news"
:visible.sync="dialogVisible"
width="480px">
<div class="poptitle">
<span>新建商机</span>
<span>{{protitle}}</span>
</div>
<el-form class="popform" label-width="97px" :model="queryParam" :rules="rules" ref="ruleForm">
<el-form-item label="项目名称" class="row">
......@@ -63,68 +148,81 @@
</el-form >
<div class="popbot">
<div class="btn btn_cancel h32" @click="dialogVisible = false">取消</div>
<div class="btn btn_primary h32" :class="{'btn_disabled':!queryParam.cbStage}" :disabled="!queryParam.cbStage">下一步,导入数据</div>
<div class="btn btn_primary h32" @click="insertPro" :class="{'btn_disabled':!queryParam.cbStage}" :disabled="!queryParam.cbStage">下一步,导入数据</div>
</div>
<!--<el-form class="popform" :model="queryParam" ref="ruleForm" label-width="137px" :rules="rules" >-->
<!--<el-form-item label="联系人姓名:" class="row" prop="name">-->
<!--<el-input type="text" v-model="queryParam.name" :οnkeyup="queryParam.name=queryParam.name.replace(/^\s+|\s+$/g,'')" placeholder="请输入"></el-input>-->
<!--</el-form-item>-->
<!--<el-form-item label="联系人性别:" class="row">-->
<!--<el-radio-group v-model="queryParam.sex">-->
<!--<el-radio label=1>男</el-radio>-->
<!--<el-radio label=0>女</el-radio>-->
<!--</el-radio-group>-->
<!--</el-form-item>-->
<!--<el-form-item label="联系方式:" class="row">-->
<!--<el-input type="text" maxlength="11" @input="inputphone" v-model="queryParam.contactInformation" placeholder="请输入"></el-input>-->
<!--</el-form-item>-->
<!--&lt;!&ndash;<el-form-item label="关联企业:" class="row" v-if="thistype == 'project'">&ndash;&gt;-->
<!--<el-form-item label="关联企业:" class="row">-->
<!--<el-input type="text" v-model="queryParam.companyName" placeholder="请输入"></el-input>-->
<!--</el-form-item>-->
<!--<el-form-item label="联系人角色:" class="row">-->
<!--<el-input type="text" v-model="queryParam.role" placeholder="请输入"></el-input>-->
<!--</el-form-item>-->
<!--<el-form-item label="联系人职位:" class="row">-->
<!--<el-input type="text" v-model="queryParam.position" placeholder="请输入"></el-input>-->
<!--</el-form-item>-->
<!--&lt;!&ndash;<el-form-item label="内部维护人:" class="row">&ndash;&gt;-->
<!--&lt;!&ndash;<el-input type="text" v-model="queryParam.accendant" placeholder="请输入"></el-input>&ndash;&gt;-->
<!--&lt;!&ndash;</el-form-item>&ndash;&gt;-->
<!--<el-form-item label="备注:" class="row">-->
<!--<el-input-->
<!--type="textarea"-->
<!--maxlength="200"-->
<!--:rows="2"-->
<!--show-word-limit-->
<!--placeholder="请输入"-->
<!--v-model="queryParam.remark">-->
<!--</el-input>-->
<!--</el-form-item>-->
<!--<div class="popbot">-->
<!--<div class="btn btn_cancel h32" @click="cancel">返回</div>-->
<!--<div class="btn btn_primary h32" @click="save">保存</div>-->
<!--</div>-->
<!--</el-form>-->
</el-dialog>
</div>
<proupload v-if="isupload" :uploadData=uploadData></proupload>
<el-dialog title="草稿箱" :visible.sync="cgxVisible" width="960px" custom-class='dialog-supplier'>
<el-divider></el-divider>
<div style="padding: 24px 20px;">
<skeleton v-if="cgxSkeleton"></skeleton>
<div class="table-item-jf table-item" v-if="!cgxSkeleton">
<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"
border highlight-current-row>
<!--<el-table-column type="index" label="序号" width="60" :resizable="false">-->
<!--<template slot-scope="scope">-->
<!--<span>{{scope.$index + 1}}</span>-->
<!--</template>-->
<!--</el-table-column>-->
<el-table-column label="项目名称" width="451px" >
<template slot-scope="scope">
<span>{{scope.row.projectName||'--'}}</span>
</template>
</el-table-column>
<el-table-column label="成本阶段" width="105px">
<template slot-scope="scope">
<div v-for="item in cbStagelist">
<span v-if="scope.row.cbStage == item.dictValue">{{item.dictLabel}}</span>
</div>
</template>
</el-table-column>
<el-table-column label="更新时间" width="205px" :resizable="false">
<template slot-scope="scope">
<span>{{scope.row.updateTime||'--'}}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<span class="wordprimary" @click="jxbj(scope.row)">继续编辑</span>
<span class="worddel">删除</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination clearfix" v-show="total>formdata.pageSize">
<el-pagination background :page-size="formdata.pageSize" :current-page.sync="formdata.pageNum"
@current-change="handleCurrentChange" layout="prev, pager, next"
:total="cgxtotal">
</el-pagination>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import '@/assets/styles/public.scss'
import { checkProjectCodeExist } from '@/api/projectCostLedger/index'
import { checkProjectCodeExist,addProject,getDraftDialogList } from '@/api/projectCostLedger/index'
import { getDicts } from '@/api/system/dict/data'
import proupload from '@/views/projectCostLedger/upload/index'
import skeleton from '@/views/project/projectList/component/skeleton'
export default {
name: "projectCostLedger",
components:{proupload,skeleton},
data() {
return {
formdata:{},
isSkeleton:false,
total:0,
total:10,
protitle:'',
dialogVisible:false,
cbStagelist:[],
ztStagelist:[],
//新建项目参数
queryParam:{
projectName:'',//项目名称
......@@ -136,15 +234,28 @@
rules:{
cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },],
},
isupload:false,
tableData:[],
cgxVisible:false,
cgxSkeleton:false,
cgxtotal:0,
cgxlist:[],
uploadData:{},//新增项目返回的数据
};
},
//可访问data属性
created() {
// this.isupload = true
//成本阶段
getDicts('pro_cbstage').then(res=>{
this.cbStagelist = res.data
})
//项目文件状态
getDicts('pro_ztstage').then(res=>{
this.ztStagelist = res.data
})
//获取草稿箱
this.getCGXlist()
},
//计算集
computed: {
......@@ -161,6 +272,7 @@
projectFileName: '',// 文件名称
cbStage: ''//成本阶段
}
this.protitle = '新增项目'
},
getSearch(){
this.formdata.pageNum = 1
......@@ -194,7 +306,51 @@
}
// this.customerAll()
},
//添加项目
insertPro(){
addProject(JSON.stringify(this.queryParam)).then(res=>{
if(res.code == 200){
this.uploadData = res.data
this.isupload = true
}
})
},
//继续编辑
jxbj(data){
console.log(this.cgxlist)
console.log(data)
this.uploadData = data
this.isupload = true
this.cgxVisible = false
},
handleCurrentChange(val){
this.formdata.pageNum = val
this.customerAll()
},
setHeaderRow() {
return "owner-table-list-header";
},
setCellClass({ row, column, rowIndex, columnIndex }) {
if (columnIndex == 1) {
return "enterprise-name-column";
}
},
setRowClass({ row, rowIndex }) {
return "enterprise-name-row";
},
getcgx(){
this.getCGXlist()
this.cgxVisible = true
},
getCGXlist(){
this.cgxSkeleton = true
getDraftDialogList().then(res=>{
this.cgxtotal = res.data.length
this.cgxlist = res.data
this.cgxSkeleton = false
})
}
},
}
</script>
......@@ -204,10 +360,10 @@
height: 100%;
box-sizing: border-box;
padding: 16px 24px;
overflow: auto;
.project-cost-ledger-inner {
width: 100%;
height: 100%;
/*height: 100%;*/
}
.content-project {
......@@ -250,6 +406,13 @@
background: #0081ff;
margin: auto;
}
.btn{
width: auto;
padding: 0 12px;
}
.btn + .btn{
margin-left: 16px;
}
}
::v-deep .pro-news {
......@@ -377,6 +540,43 @@
}
}
}
}
.total-title{
height: 32px;
line-height: 32px;
.totals{
padding-left: 6px;
position: relative;
font-size: 12px;
color: #3D3D3D;
display: inline-block;
&::before{
content: ' ';
position: absolute;
width: 2px;
height: 2px;
background: rgba(35,35,35,0.4);
border-radius: 50%;
left: 0;
top: 12px;
}
}
margin-bottom: 16px;
.btns{
float: right;
display: inline-block;
width: 30%;
text-align: right;
}
}
}
::v-deep .dialog-supplier{
.el-dialog__body{
padding: 0;
}
}
.worddel{
color: #FA5351;
padding-left: 12px;
}
</style>
<template>
<div class="project-cost-ledger-inner">
<div class="pro-upload">
<div class="title_wrap i">
<div class="title-small"><span>项目成本台账 <i class="el-icon-arrow-right"></i> </span>导入项目</div>
<div class="enterprise_title">
项目信息
</div>
</div>
<div class="content-project">
<el-form :model="formdata" label-width="82px" :rules="rules" label-position="right" :inline="true">
<el-row>
<el-form-item label="项目名称">
<el-input v-model="formdata.customerName" disabled placeholder="请输入工程名称" clearable></el-input>
</el-form-item>
<el-form-item label="IPM项目编码" label-width="100px">
<el-input v-model="formdata.ipmProjectNo" disabled placeholder="请输入IPM项目编码" clearable></el-input>
</el-form-item>
<el-form-item label="文件名称" label-width="100px">
<el-input v-model="formdata.projectFileName" disabled placeholder="请输入文件名称" clearable></el-input>
</el-form-item>
<el-form-item label="成本阶段" prop="cbStage">
<el-select v-model="formdata.cbStage" disabled multiple placeholder="请选择" :collapse-tags="true"
clearable>
<el-option v-for="(item,index) in cbStagelist" :label="item.dictLabel" :value="item.dictValue"
:key="index"></el-option>
</el-select>
</el-form-item>
</el-row>
</el-form>
</div>
<div class="title_wrap i">
<div class="enterprise_title">
导入文件 <div class="tips">操作指引 <img src="../../../assets/images/icon_tips_question.svg"/></div>
</div>
</div>
<div class="upload-project">
<el-form :model="uploaddata" label-width="200px" :rules="uprules" label-position="right" :inline="true">
<el-row>
<el-form-item label="直接费成本" prop="zjfcb">
<div class="filelist">
<div class="fileli">
<div>
<img src="../../../assets/images/icon_wrapper.png">
<div class="name">宝安中学(集团)初中部改扩建工程施工总承包(二次公告)-加固修缮工程.xls</div>
<div class="prostatus i1">解析成功</div>
<div class="cz">
<div>重新上传</div>
<div>删除</div>
</div>
</div>
<div class="wrong">
失败原因:解析失败的原因展示
</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 class="upload">
<el-upload
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>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="工料汇总" prop="glhz">
<div class="upload">
<el-upload
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>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="措施项目" prop="csxm">
<div class="upload">
<el-upload
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>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="其他项目" prop="qtxm">
<div class="upload">
<el-upload
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>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="现场经费" prop="xcjf">
<div class="upload">
<el-upload
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>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="成本汇总" prop="cbhz">
<div class="upload">
<el-upload
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>
</el-form-item>
</el-row>
</el-form>
</div>
<el-divider></el-divider>
<div class="pro-btns">
<el-button type="primary" size="small" >导入数据</el-button>
<el-button size="small">返回</el-button>
</div>
</div>
</div>
</template>
<script>
import { getDicts } from '@/api/system/dict/data'
import { getProjectFileUploadDetail } from '@/api/projectCostLedger/index'
export default {
name: 'upload',
props:{uploadData:null},
data(){
return{
formdata:{
cbStage:null,
},
cbStagelist:[],
rules:{
cbStage:[{ required: true, message: '请选择成本阶段!', trigger: 'blur' },],
},
uploaddata:{},
uprules:{
zjfcb:[{ required: true, trigger: 'blur' },],
glhz:[{ required: true, trigger: 'blur' },],
csxm:[{ required: true, trigger: 'blur' },],
qtxm:[{ required: true, trigger: 'blur' },],
xcjf:[{ required: true, trigger: 'blur' },],
cbhz:[{ required: true, trigger: 'blur' },],
},
fileList:[],
directExpense:[],
quantitySummary:[],
measureProject:[],
otherProject:[],
sceneExpense:[],
cbSummary:[],
}
},
created() {
//成本阶段
getDicts('pro_cbstage').then(res => {
this.cbStagelist = res.data
})
getProjectFileUploadDetail(this.uploadData.id).then(res=>{
if(res.code == 200){
if(res.data){
this.directExpense=res.data.directExpense
this.quantitySummary=res.data.quantitySummary
this.measureProject=res.data.measureProject
this.otherProject=res.data.otherProject
this.sceneExpense=res.data.sceneExpense
this.cbSummary=res.data.cbSummary
}else{
this.directExpense=[]
this.quantitySummary=[]
this.measureProject=[]
this.otherProject=[]
this.sceneExpense=[]
this.cbSummary=[]
}
}
})
this.formdata = this.uploadData
console.log(this.uploadData)
},
methods:{
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
}
}
}
</script>
<style scoped lang="scss">
.title-small{
font-size: 12px;
line-height: 24px;
margin-bottom: 16px;
>span{
font-size: 14px;
opacity: 0.4;
>i{
font-size: 12px;
margin-right: 4px;
}
}
}
.title_wrap.i{
border: 0;
padding: 16px;
.tips{
display: inline-block;
font-size: 14px;
color: #FFAB44;
line-height: 22px;
font-weight: 400;
padding-left: 8px;
cursor: pointer;
>img{
float: right;
margin-top: 5px;
margin-left: 2px;
}
}
}
::v-deep .pro-upload{
background: #fff;
.el-form-item{
margin-bottom: 16px;
}
.el-form-item__label {
font-weight: 400;
opacity: 0.8;
padding: 0;
font-size: 14px;
color: #232323;
padding-right: 16px;
}
}
::v-deep .upload-project{
padding: 0 16px;
.el-form-item{
width: 751px;
.el-form-item__label{
display: block;
text-align: left;
}
}
.filelist{
.fileli{
min-height: 36px;
margin-top: 8px;
width: 751px;
background: #F7F8FA;
border-radius: 2px;
padding: 7px 12px 7px 40px;
img{
width: 16px;
float: left;
margin-left: -26px;
margin-top: 3px;
}
.name{
float: left;
height: 22px;
font-size: 14px;
font-weight: 400;
color: #232323;
line-height: 22px;
max-width: 515px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.prostatus{
float: left;
margin-left: 12px;
height: 22px;
border-radius: 2px;
color: #fff;
padding: 0 8px;
line-height: 22px;
font-size: 12px;
&.i1{
background: #0CBC6D;
}
&.i2{
background: #FFAB44;
}
&.i3{
background: #FF3C3C;
}
}
.cz{
float: right;
height: 22px;
line-height: 22px;
>div{
cursor: pointer;
margin-left: 12px;
color: #0081FF;
display: inline-block;
&:last-child{
color: #FF3C3C;
}
}
}
}
.wrong{
clear: both;
margin-left: -28px;
font-size: 12px;
color: #FF3C3C;
line-height: 21px;
padding-top: 4px;
}
}
.upload{
margin-top: 8px;
.el-upload{
width: 100%;
}
.uploadpro{
width: 750px;
height: 36px;
line-height: 36px;
background: #FFFFFF;
border-radius: 2px;
border: 1px solid #DCDFE6;
padding: 0;
display: block;
font-size: 14px;
color: #232323;
img{
margin-right: 12px;
width: 14px;
margin-top: -4px;
}
}
}
}
.pro-btns{
padding: 16px 0;
text-align: center;
.el-button--primary{
background: #0081ff;
border-color: #0081ff;
}
.el-button{
padding: 0 16px;
height: 34px;
line-height: 34px;
border-radius: 2px;
}
.el-button + .el-button{
margin-left: 12px;
}
}
</style>
......@@ -128,6 +128,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
public SysOssVo upload(MultipartFile file) throws UnsupportedEncodingException {
String originalfileName = file.getOriginalFilename();
//文件名解码防止上传中文名文件导致的文件名乱码
assert originalfileName != null;
originalfileName = URLDecoder.decode(originalfileName,"UTF-8");
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
OssClient storage = OssFactory.instance();
......
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