Commit 68a45a60 authored by chenyuefang's avatar chenyuefang

Merge remote-tracking branch 'origin/V20231129-中建一局二公司' into V20231129-中建一局二公司

parents 05b3a497 5d34affa
...@@ -49,7 +49,8 @@ spring: ...@@ -49,7 +49,8 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai # url: jdbc:mysql://111.204.34.146:63308/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://172.17.0.12:3306/cscec_bms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
username: dev username: dev
password: DskSzh!456 password: DskSzh!456
# 从库数据源 # 从库数据源
...@@ -101,9 +102,10 @@ spring: ...@@ -101,9 +102,10 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring: spring:
redis: redis:
host: 111.204.34.146 # host: 111.204.34.146
host: 172.17.0.12
# 端口,默认为6379 # 端口,默认为6379
port: 63379 port: 6379
# 数据库索引 # 数据库索引
database: 13 database: 13
# 密码 # 密码
......
...@@ -40,6 +40,10 @@ public interface CbProjectConstants { ...@@ -40,6 +40,10 @@ public interface CbProjectConstants {
* 删除状态:未删除 * 删除状态:未删除
*/ */
Integer DELETE_FLAG_EXIST = 0; Integer DELETE_FLAG_EXIST = 0;
/**
* 删除状态:待删除
*/
Integer DELETE_FLAG_WAIT_DELETE = 1;
/** /**
* 删除状态:已删除 * 删除状态:已删除
*/ */
......
...@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingException; ...@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* 项目成本文件表(CbProjectFile)表控制层 * 项目成本文件表(CbProjectFile)表控制层
...@@ -49,6 +50,12 @@ public class CbProjectFileController extends BaseController { ...@@ -49,6 +50,12 @@ public class CbProjectFileController extends BaseController {
public R<Map<String, String>> uploadCbProjectFile(@Validated @ModelAttribute AddProjectFileUploadBo fileUploadBo) throws UnsupportedEncodingException { public R<Map<String, String>> uploadCbProjectFile(@Validated @ModelAttribute AddProjectFileUploadBo fileUploadBo) throws UnsupportedEncodingException {
MultipartFile file = fileUploadBo.getFile(); MultipartFile file = fileUploadBo.getFile();
Assert.notNull(file, "上传文件不能为空"); Assert.notNull(file, "上传文件不能为空");
//校验格式
String fileFormat = Objects.requireNonNull(fileUploadBo.getFile().getOriginalFilename()).substring(fileUploadBo.getFile().getOriginalFilename().lastIndexOf("."));
Assert.isTrue(".xlsx".equals(fileFormat) || ".xls".equals(fileFormat), "文件格式不正确");
//校验同一成本类型下是否存在相同文件
baseService.checkProjectFileExist(fileUploadBo);
SysOssVo oss = iSysOssService.upload(file); SysOssVo oss = iSysOssService.upload(file);
//添加项目上传文件记录 //添加项目上传文件记录
CbProjectFile cbProjectFile; CbProjectFile cbProjectFile;
...@@ -72,7 +79,7 @@ public class CbProjectFileController extends BaseController { ...@@ -72,7 +79,7 @@ public class CbProjectFileController extends BaseController {
*/ */
@DeleteMapping("/deleteCbProjectFile/{fileId}") @DeleteMapping("/deleteCbProjectFile/{fileId}")
public R<Void> deleteCbProjectFile(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) { public R<Void> deleteCbProjectFile(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) {
return toAjax(baseService.deleteProjectFile(fileId)); return toAjax(baseService.deleteProjectFile(new Long[]{fileId}));
} }
/** /**
......
...@@ -6,11 +6,8 @@ import com.dsk.common.core.domain.PageQuery; ...@@ -6,11 +6,8 @@ import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord; import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo; import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo; import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import com.dsk.cscec.service.CbProjectRecordService; import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.cscec.service.IDProjectService; import com.dsk.cscec.service.IDProjectService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -19,6 +16,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -19,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
...@@ -69,10 +67,18 @@ public class CbProjectRecordController extends BaseController { ...@@ -69,10 +67,18 @@ public class CbProjectRecordController extends BaseController {
* 获取项目台账列表 * 获取项目台账列表
*/ */
@GetMapping("/getProjectList") @GetMapping("/getProjectList")
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) { public TableDataInfo<CbProjectRecordSearchVo> getProjectList(@RequestBody CbProjectSearchBo searchBo, PageQuery pageQuery) {
return baseService.getProjectList(searchBo, pageQuery); return baseService.getProjectList(searchBo, pageQuery);
} }
/**
* 获取项目历史阶段信息(懒加载)
*/
@GetMapping("/getProjectHistoryInfo")
public R<List<CbProjectRecord>> getProjectHistoryInfo(@RequestBody CbProjectHistorySearchBo searchBo) {
return R.ok(baseService.getProjectHistoryInfo(searchBo));
}
/** /**
* 修改项目信息 * 修改项目信息
*/ */
...@@ -97,16 +103,29 @@ public class CbProjectRecordController extends BaseController { ...@@ -97,16 +103,29 @@ public class CbProjectRecordController extends BaseController {
return R.ok(baseService.addNewStageProject(newProjectBo)); return R.ok(baseService.addNewStageProject(newProjectBo));
} }
/**
* 查询当前项目可删除成本阶段
* 即查询当前项目非草稿的成本阶段
*/
@GetMapping("/getProjectCbStageNotDraft/{relatedId}")
public R<List<Integer>> getProjectCbStageNotDraft(@PathVariable Long relatedId) {
return R.ok(baseService.getProjectCbStageNotDraft(relatedId));
}
/**
* 批量删除项目
*/
@DeleteMapping("/batchDeleteProject/{projectIds}")
public R<Void> batchDeleteProject(@NotNull(message = "项目ID不能为空") @PathVariable Long[] projectIds) {
return toAjax(baseService.batchDeleteProject(Arrays.asList(projectIds)));
}
/** /**
* 获取草稿弹窗列表 * 获取草稿弹窗列表
*/ */
@GetMapping("/getDraftDialogList") @GetMapping("/getDraftDialogList")
public R<List<CbProjectRecord>> getDraftDialogList() { public TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery) {
List<CbProjectRecord> draftList = baseService.getDraftDialogList(); return baseService.getDraftDialogList(pageQuery);
if (draftList.isEmpty()) {
return R.ok("暂无草稿记录");
}
return R.ok(draftList);
} }
/** /**
......
package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.cscec.service.CbSceneExpenseChildrenService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表控制层
*
* @author sxk
* @since 2024-02-22 09:58:57
*/
@RestController
@RequestMapping("cbSceneExpenseChildren")
public class CbSceneExpenseChildrenController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbSceneExpenseChildrenService baseService;
}
package com.dsk.cscec.controller;
import com.dsk.common.core.controller.BaseController;
import com.dsk.cscec.service.CbSceneExpenseMonthService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表控制层
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@RestController
@RequestMapping("cbSceneExpenseMonth")
public class CbSceneExpenseMonthController extends BaseController {
/**
* 服务对象
*/
@Resource
private CbSceneExpenseMonthService baseService;
}
package com.dsk.cscec.domain; package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import 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;
...@@ -34,6 +35,10 @@ public class CbDirectExpense extends BaseEntity implements Serializable { ...@@ -34,6 +35,10 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
* 父级ID * 父级ID
*/ */
private Long parentId; private Long parentId;
/**
* 项目文件ID
*/
private Long projectFileId;
/** /**
* 序号 * 序号
*/ */
...@@ -121,6 +126,7 @@ public class CbDirectExpense extends BaseEntity implements Serializable { ...@@ -121,6 +126,7 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
/** /**
* 删除状态(0:否、2:是) * 删除状态(0:否、2:是)
*/ */
@TableLogic(value = "0", delval = "2")
private Integer delFlag; private Integer delFlag;
/** /**
* 备注 * 备注
......
...@@ -48,7 +48,7 @@ public class CbProjectFile extends BaseEntity implements Serializable { ...@@ -48,7 +48,7 @@ public class CbProjectFile extends BaseEntity implements Serializable {
*/ */
private String fileOssUrl; private String fileOssUrl;
/** /**
* 项目文件状态(0:待解析、1:解析中、2:解析成功、3:解析失败) * 项目文件状态(0:准备中、1:解析中、2:解析成功、3:解析失败)
*/ */
private Integer fileParseStatus; private Integer fileParseStatus;
/** /**
......
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)实体类
*
* @author sxk
* @since 2024-02-22 09:59:00
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbSceneExpenseChildren extends BaseEntity implements Serializable {
private static final long serialVersionUID = 895279707061984760L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 父级ID
*/
private Long parentId;
/**
* 序号
*/
private String number;
/**
* 排序
*/
private Integer sort;
/**
* 数据类型(0:工资统筹、1:现场管理费、2:其他费用)
*/
private Integer dataType;
/**
* 名称
*/
private String expenseName;
/**
* 单位
*/
private String unit;
/**
* 成本数量-工资统筹表
*/
private Integer cbCount;
/**
* 使用时间-其他费用表
*/
private Integer useTime;
/**
* 工程量-现场管理费表
*/
private String engineeringVolume;
/**
* 公司单价/不含税单价
*/
private String unitPrice;
/**
* 目标成本合价(不含税)/不含税合价
*/
private String excludeTaxSumPrice;
/**
* 目标成本合价(含税)/含税合价
*/
private String includeTaxSumPrice;
/**
* 成本科目
*/
private String cbSubject;
/**
* 税金类型
*/
private String taxType;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
/**
* 备注
*/
private String remark;
}
package com.dsk.cscec.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.dsk.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)实体类
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbSceneExpenseMonth extends BaseEntity implements Serializable {
private static final long serialVersionUID = -73353509267146384L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 现场经费ID
*/
private Long sceneExpenseId;
/**
* 本月费用
*/
private Double currentMonthExpense;
/**
* 费用日期
*/
private String expenseDate;
/**
* 删除状态(0:否、2:是)
*/
@TableLogic(value = "0", delval = "2")
private Integer delFlag;
}
package com.dsk.cscec.domain.vo; package com.dsk.cscec.domain.bo;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @author sxk * @author sxk
* @date 2024.02.18 * @date 2024.02.18
* @time 15:08 * @time 15:04
*/ */
@Data @Data
public class ProjectRecordSearchVo { public class CbProjectHistorySearchBo {
/** /**
* 项目ID * 项目ID
*/ */
private Long id; private Long projectId;
/** /**
* 项目名称 * 项目名称
*/ */
...@@ -24,11 +22,11 @@ public class ProjectRecordSearchVo { ...@@ -24,11 +22,11 @@ public class ProjectRecordSearchVo {
*/ */
private String ipmProjectNo; private String ipmProjectNo;
/** /**
* 文件名称 * 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/ */
private String projectFileName; private Integer cbStage;
/** /**
* 项目数据 * 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/ */
private List<ProjectRecordDataVo> dataVoList; private Integer projectFileStatus;
} }
...@@ -10,7 +10,7 @@ import java.util.Date; ...@@ -10,7 +10,7 @@ import java.util.Date;
* @time 15:18 * @time 15:18
*/ */
@Data @Data
public class ProjectRecordDataVo { public class CbProjectRecordDataVo {
/** /**
* 项目文件状态(1:解析中、2:解析成功、3:解析失败) * 项目文件状态(1:解析中、2:解析成功、3:解析失败)
*/ */
......
package com.dsk.cscec.domain.vo;
import com.dsk.cscec.domain.CbProjectRecord;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* @author sxk
* @date 2024.02.18
* @time 15:08
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CbProjectRecordSearchVo extends CbProjectRecord {
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否有子集
*/
private Boolean hasChildren;
}
...@@ -2,9 +2,13 @@ package com.dsk.cscec.mapper; ...@@ -2,9 +2,13 @@ package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.cscec.domain.CbProjectRecord; import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo; import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import org.apache.ibatis.annotations.Param;
/** /**
* 项目台账表(CbProjectRecord)表数据库访问层 * 项目台账表(CbProjectRecord)表数据库访问层
...@@ -16,7 +20,15 @@ public interface CbProjectRecordMapper extends BaseMapper<CbProjectRecord> { ...@@ -16,7 +20,15 @@ public interface CbProjectRecordMapper extends BaseMapper<CbProjectRecord> {
/** /**
* 获取项目台账列表 * 获取项目台账列表
*/ */
Page<ProjectRecordSearchVo> selectPageProjectRecordList(Page<ProjectRecordSearchVo> build, QueryWrapper<CbProjectRecord> wrapper); Page<CbProjectRecordSearchVo> selectPageProjectRecordList(IPage<CbProjectSearchBo> build,
@Param("searchBo") CbProjectSearchBo searchBo,
@Param("deleteFlagExist") Integer deleteFlagExist,
@Param("projectFileStatusPreparing") Integer projectFileStatusPreparing);
/**
* 获取草稿弹窗列表
*/
Page<CbProjectRecord> selectPageDraftDialogList(@Param("page") Page<CbProjectRecord> page, @Param(Constants.WRAPPER) QueryWrapper<CbProjectRecord> wrapper);
} }
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表数据库访问层
*
* @author sxk
* @since 2024-02-22 09:58:57
*/
public interface CbSceneExpenseChildrenMapper extends BaseMapper<CbSceneExpenseChildren> {
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表数据库访问层
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
public interface CbSceneExpenseMonthMapper extends BaseMapper<CbSceneExpenseMonth> {
}
...@@ -13,6 +13,13 @@ import com.dsk.system.domain.vo.SysOssVo; ...@@ -13,6 +13,13 @@ import com.dsk.system.domain.vo.SysOssVo;
* @since 2024-02-05 14:01:06 * @since 2024-02-05 14:01:06
*/ */
public interface CbProjectFileService extends IService<CbProjectFile> { public interface CbProjectFileService extends IService<CbProjectFile> {
/**
* 校验同一成本类型下是否存在相同文件
*
* @param fileUploadBo 上传信息
*/
Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo);
/** /**
* 添加项目上传文件记录 * 添加项目上传文件记录
* *
...@@ -23,12 +30,12 @@ public interface CbProjectFileService extends IService<CbProjectFile> { ...@@ -23,12 +30,12 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss); CbProjectFile addProjectFile(AddProjectFileUploadBo fileUploadBo, SysOssVo oss);
/** /**
* 逻辑删除项目上传文件记录 * 批量逻辑删除项目上传文件记录
* *
* @param fileId 文件ID * @param fileIds 文件ID
* @return 删除结果 * @return 删除结果
*/ */
Integer deleteProjectFile(Long fileId); Integer deleteProjectFile(Long[] fileIds);
/** /**
* 获取项目文件上传详情 * 获取项目文件上传详情
...@@ -37,5 +44,4 @@ public interface CbProjectFileService extends IService<CbProjectFile> { ...@@ -37,5 +44,4 @@ public interface CbProjectFileService extends IService<CbProjectFile> {
* @return 文件列表 * @return 文件列表
*/ */
QueryProjectFileUploadDetailVo getProjectFileUploadDetail(Long projectId); QueryProjectFileUploadDetailVo getProjectFileUploadDetail(Long projectId);
} }
...@@ -4,11 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,11 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord; import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.AddCbProjectBo; import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.bo.AddNewCbProjectBo; import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.domain.bo.CbProjectSearchBo;
import com.dsk.cscec.domain.bo.EditProjectInfoBo;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo;
import java.util.List; import java.util.List;
...@@ -41,7 +38,15 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> { ...@@ -41,7 +38,15 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
* @param pageQuery 分页对象 * @param pageQuery 分页对象
* @return 分页数据 * @return 分页数据
*/ */
TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery); TableDataInfo<CbProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery);
/**
* 获取项目历史阶段信息(懒加载)
*
* @param searchBo 查询条件
* @return 历史阶段信息
*/
List<CbProjectRecord> getProjectHistoryInfo(CbProjectHistorySearchBo searchBo);
/** /**
* 修改项目信息 * 修改项目信息
...@@ -67,12 +72,29 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> { ...@@ -67,12 +72,29 @@ public interface CbProjectRecordService extends IService<CbProjectRecord> {
*/ */
CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo); CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo);
/**
* 查询当前项目非草稿的成本阶段
*
* @param relatedId 关联ID
* @return 已有数据的成本阶段
*/
List<Integer> getProjectCbStageNotDraft(Long relatedId);
/**
* 批量删除项目
*
* @param projectIds 项目ID
* @return 删除结果
*/
Integer batchDeleteProject(List<Long> projectIds);
/** /**
* 获取草稿弹窗列表 * 获取草稿弹窗列表
* *
* @return 草稿弹窗列表 * @param pageQuery 分页对象
* @return 分页数据
*/ */
List<CbProjectRecord> getDraftDialogList(); TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery);
/** /**
* 删除草稿 * 删除草稿
......
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表服务接口
*
* @author sxk
* @since 2024-02-22 09:59:01
*/
public interface CbSceneExpenseChildrenService extends IService<CbSceneExpenseChildren> {
}
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表服务接口
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
public interface CbSceneExpenseMonthService extends IService<CbSceneExpenseMonth> {
}
...@@ -2,7 +2,9 @@ package com.dsk.cscec.service.impl; ...@@ -2,7 +2,9 @@ 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.cscec.constant.CbProjectConstants; import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile; import com.dsk.cscec.domain.CbProjectFile;
...@@ -17,6 +19,7 @@ import org.springframework.stereotype.Service; ...@@ -17,6 +19,7 @@ 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;
...@@ -32,13 +35,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -32,13 +35,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
private CbProjectFileMapper baseMapper; private CbProjectFileMapper baseMapper;
@Resource @Resource
private CbProjectRecordMapper projectRecordMapper; private CbProjectRecordMapper projectRecordMapper;
@Resource
private CbProjectFileMapper projectFileMapper;
/**
* 校验同一成本类型下是否存在相同文件
*
* @param fileUploadBo 上传信息
*/
@Override
public Boolean checkProjectFileExist(AddProjectFileUploadBo fileUploadBo) {
String filename = fileUploadBo.getFile().getOriginalFilename();
assert filename != null;
projectFileMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, fileUploadBo.getProjectId())
.eq(CbProjectFile::getCbType, fileUploadBo.getCbType())).forEach(projectFile -> {
//仅对比文件名,不考虑文件格式
Assert.isFalse(projectFile.getFileName().substring(0, projectFile.getFileName().lastIndexOf(".")).equals(filename.substring(0, filename.lastIndexOf(".")))
, "当前成本类型下存在同名文件,请重新上传");
});
return true;
}
/** /**
* 添加项目上传文件记录 * 添加项目上传文件记录
* *
* @param fileUploadBo 上传信息 * @param fileUploadBo 上传信息
* @param oss oss信息 * @param oss oss信息
* @return * @return 文件记录
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -58,16 +82,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -58,16 +82,34 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
} }
/** /**
* 逻辑删除项目上传文件记录 * 批量逻辑删除项目上传文件记录
* *
* @param fileId 文件ID * @param fileIds 文件ID
* @return 删除结果 * @return 删除结果
*/ */
@Override @Override
public Integer deleteProjectFile(Long fileId) { @Transactional(rollbackFor = Exception.class)
CbProjectFile projectFile = baseMapper.selectById(fileId); public Integer deleteProjectFile(Long[] fileIds) {
Assert.notNull(projectFile, "该文件不存在"); int flag = 0;
return baseMapper.deleteById(projectFile); //查询待删除文件
List<CbProjectFile> fileList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectFile>()
.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),
"文件正在解析中,不允许删除");
//准备中、的文件设为已删除,否则设为待删除
//设为待删除是为了方便各个成本类型删除数据
if (fileParseStatus.equals(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)) {
flag = baseMapper.deleteById(file);
} else {
flag = baseMapper.update(null, new UpdateWrapper<CbProjectFile>()
.set("del_flag", CbProjectConstants.DELETE_FLAG_WAIT_DELETE)
.eq("id", file.getId()));
}
}
return flag;
} }
/** /**
...@@ -91,7 +133,7 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C ...@@ -91,7 +133,7 @@ public class CbProjectFileServiceImpl extends ServiceImpl<CbProjectFileMapper, C
QueryProjectFileUploadDetailVo draftDetailVo = new QueryProjectFileUploadDetailVo(); QueryProjectFileUploadDetailVo draftDetailVo = new QueryProjectFileUploadDetailVo();
draftDetailVo.setProjectId(projectId); draftDetailVo.setProjectId(projectId);
if (projectFileList.isEmpty()) { if (projectFileList.isEmpty()) {
return draftDetailVo; return null;
} }
//按照成本类型分类填充 //按照成本类型分类填充
......
...@@ -3,6 +3,7 @@ package com.dsk.cscec.service.impl; ...@@ -3,6 +3,7 @@ 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.IdUtil; import cn.hutool.core.util.IdUtil;
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.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
...@@ -16,7 +17,7 @@ import com.dsk.cscec.constant.CbProjectConstants; ...@@ -16,7 +17,7 @@ import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile; import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectRecord; import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.*; import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.ProjectRecordSearchVo; 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.CbProjectRecordService; import com.dsk.cscec.service.CbProjectRecordService;
...@@ -139,24 +140,68 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -139,24 +140,68 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
* @return 分页数据 * @return 分页数据
*/ */
@Override @Override
public TableDataInfo<ProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) { public TableDataInfo<CbProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery) {
QueryWrapper<CbProjectRecord> wrapper = Wrappers.query(); Page<CbProjectRecordSearchVo> page = baseMapper.selectPageProjectRecordList(pageQuery.build(), searchBo, CbProjectConstants.DELETE_FLAG_EXIST, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING);
wrapper
.like(StringUtils.isNotBlank(searchBo.getProjectName()), "project_name", searchBo.getProjectName()) for (CbProjectRecordSearchVo searchVo : page.getRecords()) {
.like(StringUtils.isNotBlank(searchBo.getIpmProjectNo()), "ipm_project_no", searchBo.getIpmProjectNo()); //判断是否有历史阶段
searchVo.setHasChildren(baseMapper.selectCount(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, searchVo.getRelatedId())) > 1);
//TODO:成本阶段、文件解析状态筛选 //关键字标红
Integer cbStage = searchBo.getCbStage(); if (StringUtils.isNotBlank(searchBo.getProjectName())) {
Integer projectFileStatus = searchBo.getProjectFileStatus(); searchVo.setProjectName(StringUtils.markInRed(searchVo.getProjectName(), searchBo.getProjectName()));
}
Page<ProjectRecordSearchVo> page = baseMapper.selectPageProjectRecordList(pageQuery.build(), wrapper); //补充更新时间、更新人
for (ProjectRecordSearchVo searchVo : page.getRecords()) { CbProjectFile projectFile = projectFileMapper.selectOne(new LambdaQueryWrapper<CbProjectFile>()
Long projectId = searchVo.getId(); .eq(CbProjectFile::getProjectId, searchVo.getId())
//page. .orderByDesc(CbProjectFile::getUpdateTime)
.last("LIMIT 1"));
searchVo.setUpdateBy(projectFile.getUpdateBy());
searchVo.setUpdateTime(projectFile.getUpdateTime());
} }
return TableDataInfo.build(page); return TableDataInfo.build(page);
} }
/**
* 获取项目历史阶段信息(懒加载)
*
* @param searchBo 查询条件
* @return 历史阶段信息
*/
@Override
public List<CbProjectRecord> getProjectHistoryInfo(CbProjectHistorySearchBo searchBo) {
//校验项目是否存在
CbProjectRecord projectRecord = this.checkProjectExist(searchBo.getProjectId());
//查询所有历史阶段项目(不含准备中的项目)
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, projectRecord.getRelatedId())
.ne(CbProjectRecord::getId, projectRecord.getId())
.ne(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
.like(StringUtils.isNotBlank(searchBo.getProjectName()), CbProjectRecord::getProjectName, searchBo.getProjectName())
.eq(StringUtils.isNotBlank(searchBo.getIpmProjectNo()), CbProjectRecord::getIpmProjectNo, searchBo.getIpmProjectNo())
.eq(ObjectUtil.isNotNull(searchBo.getCbStage()), CbProjectRecord::getCbStage, searchBo.getCbStage())
.eq(ObjectUtil.isNotNull(searchBo.getProjectFileStatus()), CbProjectRecord::getProjectFileStatus, searchBo.getProjectFileStatus()));
projectRecordList.forEach(record -> {
//关键字标红
if (StringUtils.isNotBlank(searchBo.getProjectName())) {
record.setProjectName(StringUtils.markInRed(record.getProjectFileName(), searchBo.getProjectName()));
}
//补充更新时间、更新人
CbProjectFile projectFile = projectFileMapper.selectOne(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, record.getId())
.orderByDesc(CbProjectFile::getUpdateTime)
.last("LIMIT 1"));
record.setUpdateBy(projectFile.getUpdateBy());
record.setUpdateTime(projectFile.getUpdateTime());
});
return projectRecordList;
}
/** /**
* 修改项目信息 * 修改项目信息
* *
...@@ -233,13 +278,70 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -233,13 +278,70 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
return null; return null;
} }
/**
* 查询当前项目非草稿的成本阶段
*
* @param relatedId 关联ID
* @return 已有数据的成本阶段
*/
@Override
public List<Integer> getProjectCbStageNotDraft(Long relatedId) {
//通过关联ID校验项目是否存在
List<CbProjectRecord> projectRecordList = this.checkRelatedIdExist(relatedId);
ArrayList<Integer> cbStageList = new ArrayList<>();
projectRecordList.forEach(projectRecord -> {
//文件状态为解析成功or解析失败即为有数据
if (!projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
&& !projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING)
&& projectFileMapper.exists(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectRecord.getId())
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PARSE_SUCCESS)
.or()
.eq(CbProjectFile::getFileParseStatus, CbProjectConstants.PROJECT_FILE_STATUS_PARSE_FAIL))) {
cbStageList.add(projectRecord.getCbStage());
}
});
return cbStageList;
}
/**
* 批量删除项目
*
* @param projectIds 项目ID
* @return 删除结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer batchDeleteProject(List<Long> projectIds) {
int flag = 0;
for (Long projectId : projectIds) {
//校验项目是否存在
CbProjectRecord projectRecord = this.checkProjectExist(projectId);
//不允许删除正在解析中的项目
Assert.isFalse(projectRecord.getProjectFileStatus().equals(CbProjectConstants.PROJECT_FILE_STATUS_PARSING)
, "存在解析中的项目,删除失败");
//TODO:各个成本类型数据和对应每月成本数据暂不做删除,项目台账列表查不出来自然也无法查看数据
//删除项目文件记录
flag = projectFileMapper.delete(new LambdaQueryWrapper<CbProjectFile>()
.eq(CbProjectFile::getProjectId, projectId));
//删除项目记录
Assert.isTrue(flag > 0, "操作异常,请联系管理员");
flag = baseMapper.deleteById(projectId);
}
return flag;
}
/** /**
* 通过关联ID校验项目是否存在 * 通过关联ID校验项目是否存在
* *
* @return 该关联ID下的所有项目记录 * @return 该关联ID下的所有项目记录
*/ */
private List<CbProjectRecord> checkRelatedIdExist(Long relatedId) { private List<CbProjectRecord> checkRelatedIdExist(Long relatedId) {
List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>().eq(CbProjectRecord::getRelatedId, relatedId)); List<CbProjectRecord> projectRecordList = baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>()
.eq(CbProjectRecord::getRelatedId, relatedId));
Assert.isFalse(projectRecordList.isEmpty(), "关联ID无效"); Assert.isFalse(projectRecordList.isEmpty(), "关联ID无效");
return projectRecordList; return projectRecordList;
} }
...@@ -247,12 +349,17 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe ...@@ -247,12 +349,17 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
/** /**
* 获取草稿弹窗列表 * 获取草稿弹窗列表
* *
* @return 草稿弹窗列表 * @param pageQuery 分页对象
* @return 分页数据
*/ */
@Override @Override
public List<CbProjectRecord> getDraftDialogList() { public TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery) {
return baseMapper.selectList(new LambdaQueryWrapper<CbProjectRecord>() QueryWrapper<CbProjectRecord> wrapper = Wrappers.query();
.eq(CbProjectRecord::getProjectFileStatus, CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)); wrapper
.eq("project_file_status", CbProjectConstants.PROJECT_FILE_STATUS_PREPARING)
.eq("del_flag", CbProjectConstants.DELETE_FLAG_EXIST)
.orderByDesc("update_time");
return TableDataInfo.build(baseMapper.selectPageDraftDialogList(pageQuery.build(), wrapper));
} }
/** /**
......
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbSceneExpenseChildren;
import com.dsk.cscec.mapper.CbSceneExpenseChildrenMapper;
import com.dsk.cscec.service.CbSceneExpenseChildrenService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 现场经费-工资统筹、其他费用、现场管理费表(CbSceneExpenseChildren)表服务实现类
*
* @author sxk
* @since 2024-02-22 09:59:01
*/
@Service("cbSceneExpenseChildrenService")
public class CbSceneExpenseChildrenServiceImpl extends ServiceImpl<CbSceneExpenseChildrenMapper, CbSceneExpenseChildren> implements CbSceneExpenseChildrenService {
@Resource
private CbSceneExpenseChildrenMapper baseMapper;
}
package com.dsk.cscec.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.cscec.domain.CbSceneExpenseMonth;
import com.dsk.cscec.mapper.CbSceneExpenseMonthMapper;
import com.dsk.cscec.service.CbSceneExpenseMonthService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 现场经费-每月费用表(CbSceneExpenseMonth)表服务实现类
*
* @author sxk
* @since 2024-02-22 09:59:28
*/
@Service("cbSceneExpenseMonthService")
public class CbSceneExpenseMonthServiceImpl extends ServiceImpl<CbSceneExpenseMonthMapper, CbSceneExpenseMonth> implements CbSceneExpenseMonthService {
@Resource
private CbSceneExpenseMonthMapper baseMapper;
}
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.cscec.mapper.CbProjectFileMapper"> <mapper namespace="com.dsk.cscec.mapper.CbProjectFileMapper">
</mapper>
</mapper> \ No newline at end of file
...@@ -2,11 +2,48 @@ ...@@ -2,11 +2,48 @@
<!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.CbProjectRecordMapper"> <mapper namespace="com.dsk.cscec.mapper.CbProjectRecordMapper">
<!--获取项目台账列表--> <!--获取项目台账列表-->
<select id="selectPageProjectRecordList" resultType="com.dsk.cscec.domain.vo.ProjectRecordSearchVo"> <select id="selectPageProjectRecordList" resultType="com.dsk.cscec.domain.vo.CbProjectRecordSearchVo">
select
cpr.id,
cpr.related_id,
cpr.project_name,
cpr.cb_stage,
cpr.project_file_status,
cpr.ipm_project_no,
cpr.is_get_project_detail,
cpr.project_file_name,
cpr.create_time
from cb_project_record cpr
left join cb_project_record cprr
on cpr.related_id = cprr.related_id
and cpr.cb_stage &lt; cprr.cb_stage
where
cprr.cb_stage is null
and
cpr.del_flag=#{deleteFlagExist}
<if test="searchBo.projectName != null and searchBo.projectName != ''">
and cpr.project_name like concat('%',#{searchBo.projectName},'%')
</if>
<if test="searchBo.ipmProjectNo != null and searchBo.ipmProjectNo != ''">
and cpr.ipm_project_no = #{searchBo.ipmProjectNo}
</if>
<if test="searchBo.cbStage != null">
and cpr.cb_stage = #{searchBo.cbStage}
</if>
<if test="searchBo.projectFileStatus != null">
and project_file_status = #{searchBo.projectFileStatus}
</if>
and
cpr.project_file_status != #{projectFileStatusPreparing}
order by cpr.create_time desc
</select>
<!--获取草稿弹窗列表-->
<select id="selectPageDraftDialogList" resultType="com.dsk.cscec.domain.CbProjectRecord">
select cpr.id, select cpr.id,
cpr.project_name, cpr.project_name,
cpr.ipm_project_no, cpr.cb_stage,
cpr.project_file_name cpr.update_time
from cb_project_record cpr from cb_project_record cpr
${ew.getCustomSqlSegment}; ${ew.getCustomSqlSegment};
</select> </select>
......
<?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.CbSceneExpenseChildrenMapper">
</mapper>
<?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.CbSceneExpenseMonthMapper">
</mapper>
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