Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsk-operate-sys-cscec
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fulixin
dsk-operate-sys-cscec
Commits
b227fca8
Commit
b227fca8
authored
Mar 01, 2024
by
施翔轲
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
直接费相关
parent
9188fa11
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
569 additions
and
24 deletions
+569
-24
CbProjectConstants.java
.../main/java/com/dsk/cscec/constant/CbProjectConstants.java
+28
-1
CbDirectExpenseController.java
...a/com/dsk/cscec/controller/CbDirectExpenseController.java
+43
-3
CbDirectExpense.java
...i/src/main/java/com/dsk/cscec/domain/CbDirectExpense.java
+34
-18
AddCbDirectExpenseBo.java
...in/java/com/dsk/cscec/domain/bo/AddCbDirectExpenseBo.java
+44
-0
CbDirectExpenseDataDetailVo.java
.../com/dsk/cscec/domain/vo/CbDirectExpenseDataDetailVo.java
+23
-0
CbDirectExpenseMenuVo.java
...n/java/com/dsk/cscec/domain/vo/CbDirectExpenseMenuVo.java
+35
-0
CbDirectExpenseMapper.java
...main/java/com/dsk/cscec/mapper/CbDirectExpenseMapper.java
+12
-0
CbDirectExpenseService.java
...in/java/com/dsk/cscec/service/CbDirectExpenseService.java
+34
-0
CbDirectExpenseServiceImpl.java
...om/dsk/cscec/service/impl/CbDirectExpenseServiceImpl.java
+303
-0
CbProjectRecordServiceImpl.java
...om/dsk/cscec/service/impl/CbProjectRecordServiceImpl.java
+5
-2
CbDirectExpenseMapper.xml
...src/main/resources/mapper/cscec/CbDirectExpenseMapper.xml
+8
-0
No files found.
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/constant/CbProjectConstants.java
View file @
b227fca8
...
@@ -88,5 +88,32 @@ public interface CbProjectConstants {
...
@@ -88,5 +88,32 @@ public interface CbProjectConstants {
*/
*/
int
CB_TYPE_SUMMARY
=
5
;
int
CB_TYPE_SUMMARY
=
5
;
String
CB_TYPE_SUMMARY_NAME
=
"成本汇总"
;
String
CB_TYPE_SUMMARY_NAME
=
"成本汇总"
;
/**
* 直接费清单/费用项分类标识:清
*/
String
DIRECT_EXPENSE_CATEGORY_TAG_QING
=
"清"
;
/**
* 直接费清单/费用项分类标识:专
*/
String
DIRECT_EXPENSE_CATEGORY_TAG_ZHUAN
=
"专"
;
/**
* 直接费清单/费用项分类标识:劳
*/
String
DIRECT_EXPENSE_CATEGORY_TAG_LAO
=
"劳"
;
/**
* 直接费清单/费用项分类标识:材
*/
String
DIRECT_EXPENSE_CATEGORY_TAG_CAI
=
"材"
;
/**
* 直接费编码:专
*/
String
DIRECT_EXPENSE_CODE_ZHUAN
=
"ZY"
;
/**
* 直接费编码:劳
*/
String
DIRECT_EXPENSE_CODE_LAO
=
"LW"
;
/**
* 直接费编码:材
*/
String
DIRECT_EXPENSE_CODE_CAI
=
"FG"
;
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/controller/CbDirectExpenseController.java
View file @
b227fca8
package
com
.
dsk
.
cscec
.
controller
;
package
com
.
dsk
.
cscec
.
controller
;
import
com.dsk.common.core.controller.BaseController
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.cscec.domain.bo.AddCbDirectExpenseBo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo
;
import
com.dsk.cscec.service.CbDirectExpenseService
;
import
com.dsk.cscec.service.CbDirectExpenseService
;
import
org.springframework.
web.bind.annotation.RequestMapping
;
import
org.springframework.
validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.
RestController
;
import
org.springframework.web.bind.annotation.
*
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
/**
/**
* 直接费成本表(CbDirectExpense)表控制层
* 直接费成本表(CbDirectExpense)表控制层
...
@@ -14,12 +21,45 @@ import javax.annotation.Resource;
...
@@ -14,12 +21,45 @@ import javax.annotation.Resource;
*/
*/
@RestController
@RestController
@RequestMapping
(
"cbDirectExpense"
)
@RequestMapping
(
"cbDirectExpense"
)
public
class
CbDirectExpenseController
{
public
class
CbDirectExpenseController
extends
BaseController
{
/**
/**
* 服务对象
* 服务对象
*/
*/
@Resource
@Resource
private
CbDirectExpenseService
baseService
;
private
CbDirectExpenseService
baseService
;
/**
* 获取直接费菜单
*/
@GetMapping
(
"/getMenuList/{projectId}"
)
public
R
<
CbDirectExpenseMenuVo
>
getMenuList
(
@NotNull
(
message
=
"项目ID不能为空"
)
@PathVariable
Long
projectId
)
{
return
R
.
ok
(
baseService
.
getMenuList
(
projectId
));
}
/**
* 直接费数据解析
*/
@GetMapping
(
"/parseDirectExpenseData/{projectId}"
)
public
R
<
Void
>
parseDirectExpenseData
(
@PathVariable
Long
projectId
)
throws
Exception
{
baseService
.
parseDirectExpenseData
(
projectId
,
1
);
return
R
.
ok
();
}
/**
* 获取直接费数据详情
*/
@GetMapping
(
"/getDataDetail/{menuId}"
)
public
R
<
List
<
CbDirectExpenseDataDetailVo
>>
getDataDetail
(
@NotNull
(
message
=
"菜单ID不能为空"
)
@PathVariable
Long
menuId
)
{
return
R
.
ok
(
baseService
.
getDataDetail
(
menuId
));
}
/**
* 新增直接费费用项
*/
@PostMapping
(
"/addExpense"
)
public
R
<
Void
>
addExpense
(
@Validated
@RequestBody
AddCbDirectExpenseBo
addBo
)
{
return
toAjax
(
baseService
.
addExpense
(
addBo
));
}
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/domain/CbDirectExpense.java
View file @
b227fca8
...
@@ -2,6 +2,7 @@ package com.dsk.cscec.domain;
...
@@ -2,6 +2,7 @@ package com.dsk.cscec.domain;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableLogic
;
import
com.baomidou.mybatisplus.annotation.TableLogic
;
import
com.dsk.common.annotation.Excel
;
import
com.dsk.common.core.domain.BaseEntity
;
import
com.dsk.common.core.domain.BaseEntity
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.EqualsAndHashCode
;
...
@@ -24,112 +25,127 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
...
@@ -24,112 +25,127 @@ public class CbDirectExpense extends BaseEntity implements Serializable {
@TableId
(
value
=
"id"
)
@TableId
(
value
=
"id"
)
private
Long
id
;
private
Long
id
;
/**
/**
* 项目ID
* 排序
*/
private
Long
projectId
;
/**
* 成本阶段(0:标前成本、1:标后成本、2:转固成本)
*/
*/
private
Integer
cbStage
;
private
Integer
sort
;
/**
/**
* 父级ID
* 父级ID
*/
*/
private
Long
parentId
;
private
Long
parentId
;
/**
/**
*
项目文件ID
*
层级
*/
*/
private
Long
projectFileId
;
private
Integer
level
;
/**
/**
*
序号
*
项目ID
*/
*/
private
String
number
;
private
Long
projectId
;
/**
/**
*
排序
*
项目文件ID
*/
*/
private
Integer
sort
;
private
Long
projectFileId
;
/**
/**
* 编码
* 编码
*/
*/
@Excel
(
name
=
"编码"
)
private
String
code
;
private
String
code
;
/**
/**
* 名称
* 名称
*/
*/
@Excel
(
name
=
"名称"
)
private
String
expenseName
;
private
String
expenseName
;
/**
/**
* 清单/费用项分类标识
* 清单/费用项分类标识
*/
*/
@Excel
(
name
=
"清单/费用项分类标识"
)
private
String
expenseCategoryTag
;
private
String
expenseCategoryTag
;
/**
/**
* 项目特征
* 项目特征
*/
*/
@Excel
(
name
=
"项目特征"
)
private
String
projectFeature
;
private
String
projectFeature
;
/**
/**
* 单位
* 单位
*/
*/
@Excel
(
name
=
"单位"
)
private
String
unit
;
private
String
unit
;
/**
/**
* 工程量表达式
* 工程量表达式
*/
*/
@Excel
(
name
=
"工程量表达式"
)
private
String
engineeringVolumeExpression
;
private
String
engineeringVolumeExpression
;
/**
/**
* 工程量
* 工程量
*/
*/
@Excel
(
name
=
"工程量"
)
private
String
engineeringVolume
;
private
String
engineeringVolume
;
/**
/**
* 成本科目
* 成本科目
*/
*/
@Excel
(
name
=
"成本科目"
)
private
String
cbSubject
;
private
String
cbSubject
;
/**
/**
* 招标控制价单价
* 招标控制价单价
*/
*/
@Excel
(
name
=
"招标控制价单价"
)
private
String
tenderControlUnitPrice
;
private
String
tenderControlUnitPrice
;
/**
/**
* 招标控制价合价
* 招标控制价合价
*/
*/
@Excel
(
name
=
"招标控制价合价"
)
private
String
tenderControlSumPrice
;
private
String
tenderControlSumPrice
;
/**
/**
* 不含税成本单价
* 不含税成本单价
*/
*/
@Excel
(
name
=
"不含税成本单价"
)
private
String
excludeTaxCbUnitPrice
;
private
String
excludeTaxCbUnitPrice
;
/**
/**
* 不含税成本合价
* 不含税成本合价
*/
*/
@Excel
(
name
=
"不含税成本合价"
)
private
String
excludeTaxCbSumPrice
;
private
String
excludeTaxCbSumPrice
;
/**
/**
* 成本税金合计
* 成本税金合计
*/
*/
@Excel
(
name
=
"成本税金合计"
)
private
String
cbTaxSum
;
private
String
cbTaxSum
;
/**
/**
* 含税成本单价
* 含税成本单价
*/
*/
@Excel
(
name
=
"含税成本单价"
)
private
String
includeTaxCbUnitPrice
;
private
String
includeTaxCbUnitPrice
;
/**
/**
* 含税成本合价
* 含税成本合价
*/
*/
@Excel
(
name
=
"含税成本合价"
)
private
String
includeTaxCbSumPrice
;
private
String
includeTaxCbSumPrice
;
/**
/**
* 合价偏差
* 合价偏差
*/
*/
@Excel
(
name
=
"合价偏差"
)
private
String
sumPriceDeviation
;
private
String
sumPriceDeviation
;
/**
/**
* 盈亏率
* 盈亏率
*/
*/
@Excel
(
name
=
"盈亏率"
)
private
String
profitLossRatio
;
private
String
profitLossRatio
;
/**
/**
* 标准成本费用
* 标准成本费用
*/
*/
@Excel
(
name
=
"标准成本费用"
)
private
String
standardCbItem
;
private
String
standardCbItem
;
/**
/**
* 数据源(0:导入、1:手动新增)
* 备注
*/
@Excel
(
name
=
"备注"
)
private
String
remark
;
/**
* 是否为导入数据
*/
*/
private
Integer
dataOrigin
;
private
Boolean
isImport
;
/**
/**
* 删除状态(0:否、2:是)
* 删除状态(0:否、2:是)
*/
*/
@TableLogic
(
value
=
"0"
,
delval
=
"2"
)
@TableLogic
(
value
=
"0"
,
delval
=
"2"
)
private
Integer
delFlag
;
private
Integer
delFlag
;
/**
* 备注
*/
private
String
failRemark
;
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/domain/bo/AddCbDirectExpenseBo.java
0 → 100644
View file @
b227fca8
package
com
.
dsk
.
cscec
.
domain
.
bo
;
import
lombok.Data
;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotNull
;
/**
* @author sxk
* @date 2024.03.01
* @time 17:59
*/
@Data
public
class
AddCbDirectExpenseBo
{
/**
* 清ID
*/
@NotNull
(
message
=
"清ID不能为空"
)
private
Long
qingId
;
/**
* 编码
*/
@NotBlank
(
message
=
"编码不能为空"
)
private
String
code
;
/**
* 项目名称
*/
@NotBlank
(
message
=
"项目名称不能为空"
)
private
String
expenseName
;
/**
* 单位
*/
@NotBlank
(
message
=
"单位不能为空"
)
private
String
unit
;
/**
* 单价
*/
@NotBlank
(
message
=
"单价不能为空"
)
private
String
tenderControlUnitPrice
;
/**
* 特征描述
*/
private
String
projectFeature
;
}
\ No newline at end of file
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/domain/vo/CbDirectExpenseDataDetailVo.java
0 → 100644
View file @
b227fca8
package
com
.
dsk
.
cscec
.
domain
.
vo
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author sxk
* @date 2024.03.01
* @time 17:03
*/
@EqualsAndHashCode
(
callSuper
=
true
)
@Data
public
class
CbDirectExpenseDataDetailVo
extends
CbDirectExpense
{
/**
* 子集
*/
private
List
<
CbDirectExpenseDataDetailVo
>
childrenList
=
new
ArrayList
<>();
;
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/domain/vo/CbDirectExpenseMenuVo.java
0 → 100644
View file @
b227fca8
package
com
.
dsk
.
cscec
.
domain
.
vo
;
import
lombok.Data
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author sxk
* @date 2024.03.01
* @time 09:34
*/
@Data
public
class
CbDirectExpenseMenuVo
{
/**
* 菜单ID
*/
private
Long
menuId
;
/**
* 父级ID
*/
private
Long
parentId
;
/**
* 菜单名称
*/
private
String
menuName
;
/**
* 菜单层级
*/
private
Integer
menuLevel
;
/**
* 子菜单
*/
private
List
<
CbDirectExpenseMenuVo
>
childrenList
=
new
ArrayList
<>();
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/mapper/CbDirectExpenseMapper.java
View file @
b227fca8
...
@@ -2,6 +2,10 @@ package com.dsk.cscec.mapper;
...
@@ -2,6 +2,10 @@ package com.dsk.cscec.mapper;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
/**
* 直接费成本表(CbDirectExpense)表数据库访问层
* 直接费成本表(CbDirectExpense)表数据库访问层
...
@@ -10,6 +14,14 @@ import com.dsk.cscec.domain.CbDirectExpense;
...
@@ -10,6 +14,14 @@ import com.dsk.cscec.domain.CbDirectExpense;
* @since 2024-02-05 14:43:31
* @since 2024-02-05 14:43:31
*/
*/
public
interface
CbDirectExpenseMapper
extends
BaseMapper
<
CbDirectExpense
>
{
public
interface
CbDirectExpenseMapper
extends
BaseMapper
<
CbDirectExpense
>
{
/**
* 查询清单/费用项分类标识为数字的数字
*
* @param projectId 项目ID
* @param regx 正则表达式1-10
* @param deleteFlagExist 删除标识
*/
List
<
CbDirectExpenseMenuVo
>
selectMenuData
(
@Param
(
"projectId"
)
Long
projectId
,
@Param
(
"regx"
)
String
regx
,
@Param
(
"deleteFlagExist"
)
Integer
deleteFlagExist
);
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/service/CbDirectExpenseService.java
View file @
b227fca8
...
@@ -2,6 +2,11 @@ package com.dsk.cscec.service;
...
@@ -2,6 +2,11 @@ package com.dsk.cscec.service;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.bo.AddCbDirectExpenseBo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo
;
import
java.util.List
;
/**
/**
* 直接费成本表(CbDirectExpense)表服务接口
* 直接费成本表(CbDirectExpense)表服务接口
...
@@ -10,6 +15,35 @@ import com.dsk.cscec.domain.CbDirectExpense;
...
@@ -10,6 +15,35 @@ import com.dsk.cscec.domain.CbDirectExpense;
* @since 2024-02-05 14:43:34
* @since 2024-02-05 14:43:34
*/
*/
public
interface
CbDirectExpenseService
extends
IService
<
CbDirectExpense
>
{
public
interface
CbDirectExpenseService
extends
IService
<
CbDirectExpense
>
{
/**
* 获取直接费菜单
*
* @param projectId 项目ID
* @return 直接费菜单
*/
CbDirectExpenseMenuVo
getMenuList
(
Long
projectId
);
/**
* 直接费数据解析
*
* @param projectId 项目ID
* @param cbStage 成本阶段
*/
void
parseDirectExpenseData
(
Long
projectId
,
Integer
cbStage
)
throws
Exception
;
/**
* 获取直接费数据详情
*
* @param menuId 菜单ID
* @return 数据详情
*/
List
<
CbDirectExpenseDataDetailVo
>
getDataDetail
(
Long
menuId
);
/**
* 新增直接费费用项
*
* @param addBo 费用项
* @return 新增结果
*/
Integer
addExpense
(
AddCbDirectExpenseBo
addBo
);
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/service/impl/CbDirectExpenseServiceImpl.java
View file @
b227fca8
package
com
.
dsk
.
cscec
.
service
.
impl
;
package
com
.
dsk
.
cscec
.
service
.
impl
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.lang.Assert
;
import
cn.hutool.core.util.IdUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dsk.common.excel.ExcelUtils
;
import
com.dsk.common.exception.ServiceException
;
import
com.dsk.common.utils.StringUtils
;
import
com.dsk.cscec.constant.CbProjectConstants
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.CbDirectExpense
;
import
com.dsk.cscec.domain.CbProjectFile
;
import
com.dsk.cscec.domain.CbProjectRecord
;
import
com.dsk.cscec.domain.bo.AddCbDirectExpenseBo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseDataDetailVo
;
import
com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo
;
import
com.dsk.cscec.mapper.CbDirectExpenseMapper
;
import
com.dsk.cscec.mapper.CbDirectExpenseMapper
;
import
com.dsk.cscec.mapper.CbProjectFileMapper
;
import
com.dsk.cscec.mapper.CbProjectRecordMapper
;
import
com.dsk.cscec.service.CbDirectExpenseService
;
import
com.dsk.cscec.service.CbDirectExpenseService
;
import
com.dsk.system.service.ISysOssService
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.support.TransactionTemplate
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
java.io.InputStream
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
/**
/**
* 直接费成本表(CbDirectExpense)表服务实现类
* 直接费成本表(CbDirectExpense)表服务实现类
...
@@ -18,5 +43,283 @@ import javax.annotation.Resource;
...
@@ -18,5 +43,283 @@ import javax.annotation.Resource;
public
class
CbDirectExpenseServiceImpl
extends
ServiceImpl
<
CbDirectExpenseMapper
,
CbDirectExpense
>
implements
CbDirectExpenseService
{
public
class
CbDirectExpenseServiceImpl
extends
ServiceImpl
<
CbDirectExpenseMapper
,
CbDirectExpense
>
implements
CbDirectExpenseService
{
@Resource
@Resource
private
CbDirectExpenseMapper
baseMapper
;
private
CbDirectExpenseMapper
baseMapper
;
@Resource
private
CbProjectFileMapper
projectFileMapper
;
@Resource
private
ISysOssService
ossService
;
@Resource
private
TransactionTemplate
transactionTemplate
;
@Resource
private
CbProjectRecordMapper
projectRecordMapper
;
private
final
String
regx
=
"^([1-9]|10)$"
;
/**
* 获取直接费菜单
*
* @param projectId 项目ID
* @return 直接费菜单
*/
@Override
public
CbDirectExpenseMenuVo
getMenuList
(
Long
projectId
)
{
//校验项目是否存在
this
.
checkProjectExist
(
projectId
);
//查询清单/费用项分类标识为数字的数字
List
<
CbDirectExpenseMenuVo
>
menuVoList
=
baseMapper
.
selectMenuData
(
projectId
,
regx
,
CbProjectConstants
.
DELETE_FLAG_EXIST
);
Assert
.
isFalse
(
menuVoList
.
isEmpty
(),
"当前项目不存在直接费菜单"
);
CbDirectExpenseMenuVo
root
=
menuVoList
.
get
(
0
);
//生成菜单树形
this
.
generateMenuTree
(
root
,
menuVoList
);
return
root
;
}
//生成菜单树形
private
void
generateMenuTree
(
CbDirectExpenseMenuVo
root
,
List
<
CbDirectExpenseMenuVo
>
menuVoList
)
{
menuVoList
.
forEach
(
menu
->
{
if
(
Objects
.
equals
(
root
.
getMenuId
(),
menu
.
getParentId
()))
{
root
.
getChildrenList
().
add
(
menu
);
generateMenuTree
(
menu
,
menuVoList
);
}
});
}
/**
* 直接费数据解析
*
* @param projectId 项目ID
* @param cbStage 成本阶段
*/
@Override
public
void
parseDirectExpenseData
(
Long
projectId
,
Integer
cbStage
)
throws
Exception
{
//查找该项目下所有相关文件
List
<
CbProjectFile
>
projectFileList
=
projectFileMapper
.
selectAnalysisList
(
projectId
,
CbProjectConstants
.
CB_TYPE_DIRECT_EXPENSE
,
cbStage
);
if
(
ObjectUtils
.
isEmpty
(
projectFileList
))
{
return
;
}
//处理待解析文件
a:
for
(
CbProjectFile
projectFile
:
projectFileList
)
{
//文件下载
InputStream
inputStream
=
ossService
.
downFileIO
(
projectFile
.
getFileOssId
());
if
(
ObjectUtil
.
isNull
(
inputStream
))
{
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_FAIL
);
log
.
error
(
"FileId:"
+
projectFile
.
getId
()
+
",文件数据不存在"
);
projectFile
.
setFailRemark
(
"文件数据不存在"
);
projectFileMapper
.
updateById
(
projectFile
);
continue
;
}
//解析数据
List
<
CbDirectExpense
>
importList
=
new
ExcelUtils
<>(
CbDirectExpense
.
class
).
importExcelAllSheet
(
inputStream
,
0
);
if
(
importList
.
isEmpty
())
{
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_FAIL
);
log
.
error
(
"FileId:"
+
projectFile
.
getId
()
+
",表格中不存在待导入数据"
);
projectFile
.
setFailRemark
(
"表格中不存在待导入数据!"
);
projectFileMapper
.
updateById
(
projectFile
);
continue
;
}
//导入顺序标识
AtomicReference
<
Integer
>
sort
=
new
AtomicReference
<>(
1
);
//清单/费用项分类数字层级标识
AtomicReference
<
Integer
>
numLevel
=
new
AtomicReference
<>(-
1
);
//清单/费用项分类"清"层级标识
AtomicReference
<
Integer
>
qingLevel
=
new
AtomicReference
<>(-
1
);
//筛选有效数据
List
<
CbDirectExpense
>
directExpenseList
=
importList
.
stream
().
parallel
()
.
filter
(
item
->
StringUtils
.
isNotBlank
(
item
.
getExpenseName
())
&&
StringUtils
.
isNotBlank
(
item
.
getExpenseCategoryTag
()))
.
collect
(
Collectors
.
toList
());
if
(
directExpenseList
.
size
()
!=
importList
.
size
())
{
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_FAIL
);
log
.
error
(
"FileId:"
+
projectFile
.
getId
()
+
",表格中\"名称\"列或\"清单/费用项分类标识\"列存在空数据"
);
projectFile
.
setFailRemark
(
"表格中\"名称\"列或\"清单/费用项分类标识\"列存在空数据"
);
projectFileMapper
.
updateById
(
projectFile
);
continue
;
}
//遍历数据集合,设置属性值
for
(
int
i
=
0
;
i
<
directExpenseList
.
size
();
i
++)
{
CbDirectExpense
item
=
directExpenseList
.
get
(
i
);
//设置导入顺序
item
.
setSort
(
sort
.
get
());
//根据清单/费用项分类标识设置层级
String
expenseCategoryTag
=
item
.
getExpenseCategoryTag
();
expenseCategoryTag
=
expenseCategoryTag
.
trim
();
if
(
expenseCategoryTag
.
matches
(
regx
))
{
//如果是数字,则层级为对应数字
int
level
=
Integer
.
parseInt
(
expenseCategoryTag
);
//数字层级只能为1-10级
if
(
level
<
1
||
level
>
10
)
{
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_FAIL
);
log
.
error
(
"FileId:"
+
projectFile
.
getId
()
+
",表格中\"清单/费用项分类标识\"列的数字只能为1-10"
);
projectFile
.
setFailRemark
(
"表格中\"清单/费用项分类标识\"列的数字只能为1-10"
);
projectFileMapper
.
updateById
(
projectFile
);
continue
a
;
}
numLevel
.
set
(
level
);
item
.
setLevel
(
numLevel
.
get
());
}
else
if
(
CbProjectConstants
.
DIRECT_EXPENSE_CATEGORY_TAG_QING
.
equals
(
expenseCategoryTag
))
{
//如果是清,则为倒数第二级,且清可以在任意数字层级下
qingLevel
.
set
(
numLevel
.
get
()
+
1
);
item
.
setLevel
(
qingLevel
.
get
());
}
else
{
//如果是专、劳、材,则为最底级,且均为清的子集
item
.
setLevel
(
qingLevel
.
get
()
+
1
);
}
//根据清单/费用项分类标识设置主键
item
.
setId
(
IdUtil
.
getSnowflakeNextId
());
//防止雪花时间戳相同,小睡一下
Thread
.
sleep
(
1
);
//设置父级ID
if
(
i
==
0
)
{
//如果是第一条数据,父级ID设置为0
item
.
setParentId
(
0L
);
}
else
{
//找到当前Level的最近一条上一级Level,对应的ID就是parentId
for
(
int
j
=
i
-
1
;
j
>=
0
;
j
--)
{
//当前对象
CbDirectExpense
currentLevelEntity
=
directExpenseList
.
get
(
i
);
//上一级对象
CbDirectExpense
preLevelEntity
=
directExpenseList
.
get
(
j
);
if
((
currentLevelEntity
.
getLevel
()
-
1
)
==
preLevelEntity
.
getLevel
())
{
currentLevelEntity
.
setParentId
(
preLevelEntity
.
getId
());
break
;
}
}
}
item
.
setProjectId
(
projectId
);
item
.
setProjectFileId
(
projectFile
.
getId
());
item
.
setIsImport
(
true
);
sort
.
getAndSet
(
sort
.
get
()
+
1
);
}
transactionTemplate
.
execute
(
status
->
{
try
{
CbDirectExpenseServiceImpl
impl
=
new
CbDirectExpenseServiceImpl
();
//分批次插入
if
(
directExpenseList
.
size
()
>
1000
)
{
int
index
=
0
;
int
total
=
directExpenseList
.
size
();
while
(
index
<
total
)
{
List
<
CbDirectExpense
>
divideList
=
directExpenseList
.
subList
(
index
,
Math
.
min
(
index
+=
1000
,
total
));
Assert
.
isTrue
(
impl
.
saveBatch
(
divideList
),
"数据插入失败"
);
}
}
else
{
Assert
.
isTrue
(
impl
.
saveBatch
(
directExpenseList
),
"数据插入失败"
);
}
//更新文件状态
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_SUCCESS
);
Assert
.
isTrue
(
projectFileMapper
.
updateById
(
projectFile
)
>
0
,
"解析成功后文件状态更新失败"
);
}
catch
(
Exception
e
)
{
status
.
setRollbackOnly
();
projectFile
.
setFileParseStatus
(
CbProjectConstants
.
PROJECT_FILE_STATUS_PARSE_FAIL
);
e
.
printStackTrace
();
projectFile
.
setFailRemark
(
e
.
getMessage
());
projectFileMapper
.
updateById
(
projectFile
);
}
return
Boolean
.
TRUE
;
});
}
}
/**
* 获取直接费数据详情
*
* @param menuId 菜单ID
* @return 数据详情
*/
@Override
public
List
<
CbDirectExpenseDataDetailVo
>
getDataDetail
(
Long
menuId
)
{
//查询该菜单下的清
List
<
CbDirectExpenseDataDetailVo
>
qingList
=
BeanUtil
.
copyToList
(
baseMapper
.
selectList
(
new
LambdaQueryWrapper
<
CbDirectExpense
>()
.
eq
(
CbDirectExpense:
:
getParentId
,
menuId
)
.
eq
(
CbDirectExpense:
:
getExpenseCategoryTag
,
CbProjectConstants
.
DIRECT_EXPENSE_CATEGORY_TAG_QING
)),
CbDirectExpenseDataDetailVo
.
class
);
Assert
.
isFalse
(
qingList
.
isEmpty
(),
"该菜单下无数据"
);
//生成数据树形
qingList
.
forEach
(
qing
->
{
qing
.
getChildrenList
().
addAll
(
BeanUtil
.
copyToList
(
baseMapper
.
selectList
(
new
LambdaQueryWrapper
<
CbDirectExpense
>()
.
eq
(
CbDirectExpense:
:
getParentId
,
qing
.
getId
())),
CbDirectExpenseDataDetailVo
.
class
));
});
return
qingList
;
}
/**
* 新增直接费费用项
*
* @param addBo 费用项
* @return 新增结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Integer
addExpense
(
AddCbDirectExpenseBo
addBo
)
{
//校验清是否存在
CbDirectExpense
qing
=
this
.
checkQingExist
(
addBo
.
getQingId
());
CbDirectExpense
directExpense
=
BeanUtil
.
toBean
(
addBo
,
CbDirectExpense
.
class
);
//排序设为清下面最后一条
directExpense
.
setSort
(
baseMapper
.
selectOne
(
new
LambdaQueryWrapper
<
CbDirectExpense
>()
.
eq
(
CbDirectExpense:
:
getParentId
,
qing
.
getId
())
.
orderByDesc
(
CbDirectExpense:
:
getSort
)
.
last
(
"LIMIT 1"
)).
getSort
()
+
1
);
directExpense
.
setParentId
(
qing
.
getId
());
directExpense
.
setLevel
(
qing
.
getLevel
()
+
1
);
directExpense
.
setProjectId
(
qing
.
getProjectId
());
directExpense
.
setProjectFileId
(-
1L
);
directExpense
.
setIsImport
(
false
);
//TODO:单价对应哪个字段需要等产品确认
//取编码前两位字母,ZY代表专,LW代表劳,FG代表材
String
code
=
directExpense
.
getCode
().
substring
(
0
,
2
);
switch
(
code
)
{
case
CbProjectConstants
.
DIRECT_EXPENSE_CODE_ZHUAN
:
directExpense
.
setExpenseCategoryTag
(
CbProjectConstants
.
DIRECT_EXPENSE_CATEGORY_TAG_ZHUAN
);
break
;
case
CbProjectConstants
.
DIRECT_EXPENSE_CODE_LAO
:
directExpense
.
setExpenseCategoryTag
(
CbProjectConstants
.
DIRECT_EXPENSE_CATEGORY_TAG_LAO
);
break
;
case
CbProjectConstants
.
DIRECT_EXPENSE_CODE_CAI
:
directExpense
.
setExpenseCategoryTag
(
CbProjectConstants
.
DIRECT_EXPENSE_CATEGORY_TAG_CAI
);
break
;
default
:
throw
new
ServiceException
(
"编码错误"
);
}
return
baseMapper
.
insert
(
directExpense
);
}
/**
* 校验项目是否存在
*
* @param projectId 项目ID
* @return 项目实体
*/
private
CbProjectRecord
checkProjectExist
(
Long
projectId
)
{
CbProjectRecord
projectRecord
=
projectRecordMapper
.
selectById
(
projectId
);
Assert
.
notNull
(
projectRecord
,
"该项目不存在"
);
return
projectRecord
;
}
/**
* 校验清是否存在
*
* @param qingId 清ID
* @return 数据实体
*/
private
CbDirectExpense
checkQingExist
(
Long
qingId
)
{
CbDirectExpense
qing
=
baseMapper
.
selectById
(
qingId
);
Assert
.
notNull
(
qing
,
"清ID无效"
);
return
qing
;
}
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/cscec/service/impl/CbProjectRecordServiceImpl.java
View file @
b227fca8
...
@@ -56,6 +56,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
...
@@ -56,6 +56,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
private
CbProjectOtherService
projectOtherService
;
private
CbProjectOtherService
projectOtherService
;
@Resource
@Resource
private
ICbCostMeasureService
costMeasureService
;
private
ICbCostMeasureService
costMeasureService
;
@Resource
private
CbDirectExpenseService
directExpenseService
;
/**
/**
* 新增项目
* 新增项目
...
@@ -124,10 +126,11 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
...
@@ -124,10 +126,11 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
projectFile
.
setFailRemark
(
null
);
projectFile
.
setFailRemark
(
null
);
}).
collect
(
Collectors
.
toList
()));
}).
collect
(
Collectors
.
toList
()));
//
TODO:
调各个成本类型的解析文件方法
//调各个成本类型的解析文件方法
Integer
cbStage
=
projectRecord
.
getCbStage
();
Integer
cbStage
=
projectRecord
.
getCbStage
();
String
username
=
Objects
.
requireNonNull
(
LoginHelper
.
getLoginUser
()).
getUsername
();
String
username
=
Objects
.
requireNonNull
(
LoginHelper
.
getLoginUser
()).
getUsername
();
//直接费成本
//直接费成本
directExpenseService
.
parseDirectExpenseData
(
projectId
,
cbStage
);
//工料汇总
//工料汇总
CbProjectBaseBo
projectBaseBo
=
new
CbProjectBaseBo
();
CbProjectBaseBo
projectBaseBo
=
new
CbProjectBaseBo
();
projectBaseBo
.
setProjectId
(
projectId
);
projectBaseBo
.
setProjectId
(
projectId
);
...
@@ -178,7 +181,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
...
@@ -178,7 +181,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
//判断是否有历史阶段
//判断是否有历史阶段
searchVo
.
setHasChildren
(
baseMapper
.
selectCount
(
new
LambdaQueryWrapper
<
CbProjectRecord
>()
searchVo
.
setHasChildren
(
baseMapper
.
selectCount
(
new
LambdaQueryWrapper
<
CbProjectRecord
>()
.
eq
(
CbProjectRecord:
:
getRelatedId
,
searchVo
.
getRelatedId
())
.
eq
(
CbProjectRecord:
:
getRelatedId
,
searchVo
.
getRelatedId
())
.
ne
(
CbProjectRecord:
:
getProjectFileStatus
,
CbProjectConstants
.
PROJECT_FILE_STATUS_PREPARING
))
>
1
.
ne
(
CbProjectRecord:
:
getProjectFileStatus
,
CbProjectConstants
.
PROJECT_FILE_STATUS_PREPARING
))
>
1
);
);
//关键字标红
//关键字标红
...
...
dsk-module/dsk-biz-api/src/main/resources/mapper/cscec/CbDirectExpenseMapper.xml
View file @
b227fca8
...
@@ -2,5 +2,13 @@
...
@@ -2,5 +2,13 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.dsk.cscec.mapper.CbDirectExpenseMapper"
>
<mapper
namespace=
"com.dsk.cscec.mapper.CbDirectExpenseMapper"
>
<select
id=
"selectMenuData"
resultType=
"com.dsk.cscec.domain.vo.CbDirectExpenseMenuVo"
>
select cde.id menuId, cde.parent_id, cde.expense_name menuName, cde.level menuLevel
from cb_direct_expense cde
where cde.project_id = #{projectId}
and cde.expense_category_tag regexp #{regx}
and cde.del_flag = #{deleteFlagExist}
order by cde.sort
</select>
</mapper>
</mapper>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment