Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_42566577
o2oa
提交
eedf6068
o2oa
项目概览
weixin_42566577
/
o2oa
与 Fork 源项目一致
Fork自
浙江兰德纵横网络技术股份有限公司 / o2oa
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
o2oa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
eedf6068
编写于
8月 03, 2020
作者:
L
luojing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加指定人员分析打卡数据
上级
76654cb6
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
344 addition
and
1 deletion
+344
-1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
...nce/assemble/control/factory/AttendanceDetailFactory.java
+124
-0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionAnalyseAttendanceDetailsForce.java
...attendancedetail/ActionAnalyseAttendanceDetailsForce.java
+149
-0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/AttendanceDetailAction.java
...ontrol/jaxrs/attendancedetail/AttendanceDetailAction.java
+24
-0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/sender/SenderForAnalyseData.java
...semble/control/processor/sender/SenderForAnalyseData.java
+21
-1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailService.java
...nce/assemble/control/service/AttendanceDetailService.java
+10
-0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailServiceAdv.java
.../assemble/control/service/AttendanceDetailServiceAdv.java
+16
-0
未找到文件。
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
浏览文件 @
eedf6068
...
...
@@ -169,6 +169,70 @@ public class AttendanceDetailFactory extends AbstractFactory {
return
em
.
createQuery
(
cq
.
where
(
p
)).
setMaxResults
(
20000
).
getResultList
();
}
/**
* 分析时间范围内的所有打卡记录
* 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
* 2、只分析未归档的,已经归档的将不再分析了
* 3、如果forceFlag为true则分析(未分析的,已分析的,错误的)
* @param startDateString
* @param endDateString
* @param personName
* @param forceFlag
* @return
* @throws Exception
*/
//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
public
List
<
String
>
getAllAnalysenessDetailsForce
(
String
startDateString
,
String
endDateString
,
String
personName
,
Boolean
forceFlag
)
throws
Exception
{
DateOperation
dateOperation
=
new
DateOperation
();
EntityManager
em
=
this
.
entityManagerContainer
().
get
(
AttendanceDetail
.
class
);
CriteriaBuilder
cb
=
em
.
getCriteriaBuilder
();
CriteriaQuery
<
String
>
cq
=
cb
.
createQuery
(
String
.
class
);
Root
<
AttendanceDetail
>
root
=
cq
.
from
(
AttendanceDetail
.
class
);
//一般始终为true, id is not null
Predicate
p
=
root
.
get
(
AttendanceDetail_
.
id
).
isNotNull
();
p
=
cb
.
and
(
p
,
root
.
get
(
AttendanceDetail_
.
archiveTime
).
isNull
());
//要未归档的,才再次进行分析
if
(
StringUtils
.
isNotEmpty
(
personName
)
)
{
p
=
cb
.
and
(
p
,
cb
.
equal
(
root
.
get
(
AttendanceDetail_
.
empName
),
personName
));
//匹配员工姓名
}
Date
startDate
=
null
;
Date
endDate
=
null
;
try
{
startDate
=
dateOperation
.
getDateFromString
(
startDateString
);
}
catch
(
Exception
e
){
startDate
=
null
;
}
try
{
endDate
=
dateOperation
.
getDateFromString
(
endDateString
);
}
catch
(
Exception
e
){
endDate
=
null
;
}
//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
if
(
startDate
!=
null
&&
endDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
startDate
,
endDate
));
}
else
{
if
(
startDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
startDate
,
new
Date
()));
}
if
(
endDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
new
Date
(),
endDate
));
}
if
(
startDate
==
null
&&
endDate
==
null
){
//startDateString和endDateString都为空,只分析所有未分析过的
List
<
Integer
>
statusArray
=
new
ArrayList
<
Integer
>();
statusArray
.
add
(
0
);
//未分析的
if
(
forceFlag
){
statusArray
.
add
(
1
);
//已分析的
}
statusArray
.
add
(
-
1
);
//有错误的
p
=
cb
.
and
(
p
,
root
.
get
(
AttendanceDetail_
.
recordStatus
).
in
(
statusArray
));
}
}
cq
.
select
(
root
.
get
(
AttendanceDetail_
.
id
)
);
return
em
.
createQuery
(
cq
.
where
(
p
)).
setMaxResults
(
20000
).
getResultList
();
}
/**
* 分析时间范围内的所有打卡记录
* 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
...
...
@@ -224,6 +288,66 @@ public class AttendanceDetailFactory extends AbstractFactory {
return
em
.
createQuery
(
cq
.
where
(
p
)).
setMaxResults
(
20000
).
getResultList
();
}
/**
* 分析时间范围内的所有打卡记录(可选择已分析/未分析)
* 1、如果未传入时间,或者时间有错, 那么分析所有未分析过的打卡记录
* 2、只分析未归档的,已经归档的将不再分析了
* 3、如果forceFlag为true则分析(未分析的,已分析的,错误的)
* @param startDateString
* @param endDateString
* @param forceFlag
* @return
* @throws Exception
*/
//@MethodDescribe("按指定的开始时间,结束时间列示员工姓名列表")
public
List
<
String
>
getAllAnalysenessPersonNamesForce
(
String
startDateString
,
String
endDateString
,
Boolean
forceFlag
)
throws
Exception
{
DateOperation
dateOperation
=
new
DateOperation
();
EntityManager
em
=
this
.
entityManagerContainer
().
get
(
AttendanceDetail
.
class
);
CriteriaBuilder
cb
=
em
.
getCriteriaBuilder
();
CriteriaQuery
<
String
>
cq
=
cb
.
createQuery
(
String
.
class
);
Root
<
AttendanceDetail
>
root
=
cq
.
from
(
AttendanceDetail
.
class
);
//一般始终为true, id is not null
Predicate
p
=
root
.
get
(
AttendanceDetail_
.
id
).
isNotNull
();
p
=
cb
.
and
(
p
,
root
.
get
(
AttendanceDetail_
.
archiveTime
).
isNull
());
//要未归档的,才再次进行分析
Date
startDate
=
null
;
Date
endDate
=
null
;
try
{
startDate
=
dateOperation
.
getDateFromString
(
startDateString
);
}
catch
(
Exception
e
){
startDate
=
null
;
}
try
{
endDate
=
dateOperation
.
getDateFromString
(
endDateString
);
}
catch
(
Exception
e
){
endDate
=
null
;
}
//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
if
(
startDate
!=
null
&&
endDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
startDate
,
endDate
));
}
else
{
if
(
startDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
startDate
,
new
Date
()));
}
if
(
endDate
!=
null
){
p
=
cb
.
and
(
p
,
cb
.
between
(
root
.
get
(
AttendanceDetail_
.
recordDate
),
new
Date
(),
endDate
));
}
if
(
startDate
==
null
&&
endDate
==
null
){
//startDateString和endDateString都为空,只分析所有未分析过的
List
<
Integer
>
statusArray
=
new
ArrayList
<
Integer
>();
statusArray
.
add
(
0
);
//未分析的
if
(
forceFlag
){
statusArray
.
add
(
1
);
//已分析的
}
statusArray
.
add
(
-
1
);
//有错误的
p
=
cb
.
and
(
p
,
root
.
get
(
AttendanceDetail_
.
recordStatus
).
in
(
statusArray
));
}
}
cq
.
distinct
(
true
).
select
(
root
.
get
(
AttendanceDetail_
.
empName
)
);
return
em
.
createQuery
(
cq
.
where
(
p
)).
setMaxResults
(
20000
).
getResultList
();
}
//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
public
List
<
String
>
getUserAnalysenessDetails
(
String
empName
,
String
startDateString
,
String
endDateString
)
throws
Exception
{
DateOperation
dateOperation
=
new
DateOperation
();
...
...
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionAnalyseAttendanceDetailsForce.java
0 → 100644
浏览文件 @
eedf6068
package
com.x.attendance.assemble.control.jaxrs.attendancedetail
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletRequest
;
import
com.google.gson.JsonElement
;
import
com.x.attendance.assemble.control.ExceptionWrapInConvert
;
import
com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionReciveSingleAttendance.Wi
;
import
com.x.attendance.assemble.control.processor.monitor.StatusSystemImportOpt
;
import
com.x.attendance.assemble.control.processor.sender.SenderForAnalyseData
;
import
com.x.attendance.entity.AttendanceStatisticalCycle
;
import
com.x.attendance.entity.AttendanceWorkDayConfig
;
import
com.x.base.core.project.annotation.FieldDescribe
;
import
com.x.base.core.project.http.ActionResult
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.jaxrs.WoId
;
import
com.x.base.core.project.logger.Logger
;
import
com.x.base.core.project.logger.LoggerFactory
;
import
com.x.base.core.project.tools.ListTools
;
public
class
ActionAnalyseAttendanceDetailsForce
extends
BaseAction
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionAnalyseAttendanceDetails
.
class
);
protected
ActionResult
<
Wo
>
execute
(
HttpServletRequest
request
,
EffectivePerson
effectivePerson
,
JsonElement
jsonElement
)
throws
Exception
{
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
//List<String> personNames = null;
List
<
AttendanceWorkDayConfig
>
attendanceWorkDayConfigList
=
null
;
Map
<
String
,
Map
<
String
,
List
<
AttendanceStatisticalCycle
>>>
topUnitAttendanceStatisticalCycleMap
=
null
;
StatusSystemImportOpt
statusSystemImportOpt
=
StatusSystemImportOpt
.
getInstance
();
Boolean
check
=
true
;
Wi
wrapIn
=
null
;
try
{
wrapIn
=
this
.
convertToWrapIn
(
jsonElement
,
Wi
.
class
);
}
catch
(
Exception
e
)
{
check
=
false
;
Exception
exception
=
new
ExceptionWrapInConvert
(
e
,
jsonElement
);
result
.
error
(
exception
);
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
}
if
(
statusSystemImportOpt
.
getProcessing
()
)
{
check
=
false
;
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
"考勤数据处理器正在处理数据中,请稍候再试......"
);
result
.
error
(
exception
);
}
List
<
String
>
personNames
=
null
;
String
startDate
=
wrapIn
.
getStartDate
();
String
endDate
=
wrapIn
.
getEndDate
();
Boolean
forceFlag
=
wrapIn
.
getForceFlag
();
personNames
=
wrapIn
.
getPersonNames
();
if
(
check
)
{
try
{
if
(
ListTools
.
isEmpty
(
personNames
)){
//personNames = attendanceDetailServiceAdv.getAllAnalysenessPersonNames( startDate, endDate );
personNames
=
attendanceDetailServiceAdv
.
getAllAnalysenessPersonNamesForce
(
startDate
,
endDate
,
forceFlag
);
if
(
personNames
==
null
||
personNames
.
isEmpty
()
)
{
check
=
false
;
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
"暂时未查询到需要分析的打卡数据."
+
"开始日期:"
+
startDate
+
", 结束日期:"
+
endDate
);
result
.
error
(
exception
);
}
}
}
catch
(
Exception
e
)
{
check
=
false
;
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
e
,
"系统根据开始时间和结束时间查询需要分析的员工姓名列表时发生异常."
+
"开始日期:"
+
startDate
+
", 结束日期:"
+
endDate
);
result
.
error
(
exception
);
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
}
}
if
(
check
)
{
try
{
attendanceWorkDayConfigList
=
attendanceWorkDayConfigServiceAdv
.
listAll
();
}
catch
(
Exception
e
)
{
check
=
false
;
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
e
,
"系统在根据ID列表查询工作节假日配置信息列表时发生异常!"
);
result
.
error
(
exception
);
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
}
}
if
(
check
)
{
try
{
// 查询所有的周期配置,组织成Map
topUnitAttendanceStatisticalCycleMap
=
attendanceStatisticCycleServiceAdv
.
getCycleMapFormAllCycles
(
effectivePerson
.
getDebugger
()
);
}
catch
(
Exception
e
)
{
check
=
false
;
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
e
,
"系统在查询并且组织所有的统计周期时发生异常."
);
result
.
error
(
exception
);
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
}
}
if
(
check
)
{
new
SenderForAnalyseData
().
executeForce
(
personNames
,
startDate
,
endDate
,
forceFlag
,
attendanceWorkDayConfigList
,
topUnitAttendanceStatisticalCycleMap
,
effectivePerson
.
getDebugger
()
);
}
return
result
;
}
public
static
class
Wi
{
@FieldDescribe
(
"开始日期."
)
private
String
startDate
=
null
;
@FieldDescribe
(
"结束日期."
)
private
String
endDate
=
null
;
@FieldDescribe
(
"用户distinguishedName."
)
private
List
<
String
>
personNames
;
@FieldDescribe
(
"是否分析已分析过的打卡记录."
)
private
Boolean
forceFlag
;
public
String
getStartDate
()
{
return
startDate
;
}
public
void
setStartDate
(
String
startDate
)
{
this
.
startDate
=
startDate
;
}
public
String
getEndDate
()
{
return
endDate
;
}
public
void
setEndDate
(
String
endDate
)
{
this
.
endDate
=
endDate
;
}
public
List
<
String
>
getPersonNames
()
{
return
personNames
;
}
public
void
setPersonNames
(
List
<
String
>
personNames
)
{
this
.
personNames
=
personNames
;
}
public
Boolean
getForceFlag
()
{
return
forceFlag
;
}
public
void
setForceFlag
(
Boolean
forceFlag
)
{
this
.
forceFlag
=
forceFlag
;
}
}
public
static
class
Wo
extends
WoId
{
public
Wo
(
String
id
)
{
setId
(
id
);
}
}
}
\ No newline at end of file
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/AttendanceDetailAction.java
浏览文件 @
eedf6068
...
...
@@ -251,6 +251,30 @@ public class AttendanceDetailAction extends StandardJaxrsAction {
}
asyncResponse
.
resume
(
ResponseFactory
.
getEntityTagActionResultResponse
(
request
,
result
));
}
@JaxrsMethodDescribe
(
value
=
"分析打卡数据(指定人员)"
,
action
=
ActionAnalyseAttendanceDetailsForce
.
class
)
@POST
@Path
(
"analyse"
)
@Produces
(
HttpMediaType
.
APPLICATION_JSON_UTF_8
)
@Consumes
(
MediaType
.
APPLICATION_JSON
)
public
void
analyseAttendanceDetailsForce
(
@Suspended
final
AsyncResponse
asyncResponse
,
@Context
HttpServletRequest
request
,
JsonElement
jsonElement
)
{
ActionResult
<
ActionAnalyseAttendanceDetailsForce
.
Wo
>
result
=
new
ActionResult
<>();
EffectivePerson
effectivePerson
=
this
.
effectivePerson
(
request
);
Boolean
check
=
true
;
if
(
check
)
{
try
{
result
=
new
ActionAnalyseAttendanceDetailsForce
().
execute
(
request
,
effectivePerson
,
jsonElement
);
}
catch
(
Exception
e
)
{
result
=
new
ActionResult
<>();
Exception
exception
=
new
ExceptionAttendanceDetailProcess
(
e
,
"根据时间区间分析所有员工打卡信息时发生异常!"
);
result
.
error
(
exception
);
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
}
}
asyncResponse
.
resume
(
ResponseFactory
.
getEntityTagActionResultResponse
(
request
,
result
));
}
@JaxrsMethodDescribe
(
value
=
"分析打卡数据"
,
action
=
ActionAnalyseAttendanceDetail
.
class
)
@GET
...
...
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/sender/SenderForAnalyseData.java
浏览文件 @
eedf6068
...
...
@@ -44,4 +44,24 @@ public class SenderForAnalyseData {
}
}
}
public
void
executeForce
(
List
<
String
>
personNames
,
String
startDate
,
String
endDate
,
Boolean
forceFlag
,
List
<
AttendanceWorkDayConfig
>
attendanceWorkDayConfigList
,
Map
<
String
,
Map
<
String
,
List
<
AttendanceStatisticalCycle
>>>
topUnitAttendanceStatisticalCycleMap
,
Boolean
debugger
)
{
StatusSystemImportOpt
statusSystemImportOpt
=
StatusSystemImportOpt
.
getInstance
();
List
<
String
>
ids
=
null
;
for
(
String
personName
:
personNames
)
{
try
{
ids
=
attendanceDetailServiceAdv
.
getAllAnalysenessDetailsForce
(
startDate
,
endDate
,
personName
,
forceFlag
);
if
(
ids
!=
null
&&
!
ids
.
isEmpty
()
)
{
statusSystemImportOpt
.
setProcessing
(
true
);
statusSystemImportOpt
.
setProcessing_analysis
(
true
);
statusSystemImportOpt
.
increaseProcess_analysis_total
(
ids
.
size
()
);
DataProcessThreadFactory
.
getInstance
().
submit
(
new
EntityAnalyseData
(
"analyse"
,
personName
,
ids
,
attendanceWorkDayConfigList
,
topUnitAttendanceStatisticalCycleMap
),
debugger
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
);
}
}
}
}
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailService.java
浏览文件 @
eedf6068
...
...
@@ -138,6 +138,11 @@ public class AttendanceDetailService {
Business
business
=
new
Business
(
emc
);
return
business
.
getAttendanceDetailFactory
().
getAllAnalysenessDetails
(
startDate
,
endDate
,
personName
);
}
public
List
<
String
>
getAllAnalysenessDetailsForce
(
EntityManagerContainer
emc
,
String
startDate
,
String
endDate
,
String
personName
,
Boolean
forceFlag
)
throws
Exception
{
Business
business
=
new
Business
(
emc
);
return
business
.
getAttendanceDetailFactory
().
getAllAnalysenessDetailsForce
(
startDate
,
endDate
,
personName
,
forceFlag
);
}
/**
*
...
...
@@ -340,6 +345,11 @@ public class AttendanceDetailService {
Business
business
=
new
Business
(
emc
);
return
business
.
getAttendanceDetailFactory
().
getAllAnalysenessPersonNames
(
startDate
,
endDate
);
}
public
List
<
String
>
getAllAnalysenessPersonNamesForce
(
EntityManagerContainer
emc
,
String
startDate
,
String
endDate
,
Boolean
forceFlag
)
throws
Exception
{
Business
business
=
new
Business
(
emc
);
return
business
.
getAttendanceDetailFactory
().
getAllAnalysenessPersonNamesForce
(
startDate
,
endDate
,
forceFlag
);
}
public
AttendanceDetail
listDetailWithEmployee
(
EntityManagerContainer
emc
,
String
employeeName
,
String
recordDateString
)
throws
Exception
{
Business
business
=
new
Business
(
emc
);
...
...
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailServiceAdv.java
浏览文件 @
eedf6068
...
...
@@ -146,6 +146,14 @@ public class AttendanceDetailServiceAdv {
}
}
public
List
<
String
>
getAllAnalysenessDetailsForce
(
String
startDate
,
String
endDate
,
String
personName
,
Boolean
forceFlag
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
return
attendanceDetailService
.
getAllAnalysenessDetailsForce
(
emc
,
startDate
,
endDate
,
personName
,
forceFlag
);
}
catch
(
Exception
e
)
{
throw
e
;
}
}
public
List
<
String
>
getAllAnalysenessPersonNames
(
String
startDate
,
String
endDate
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
return
attendanceDetailService
.
getAllAnalysenessPersonNames
(
emc
,
startDate
,
endDate
);
...
...
@@ -153,6 +161,14 @@ public class AttendanceDetailServiceAdv {
throw
e
;
}
}
public
List
<
String
>
getAllAnalysenessPersonNamesForce
(
String
startDate
,
String
endDate
,
Boolean
forceFlag
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
return
attendanceDetailService
.
getAllAnalysenessPersonNamesForce
(
emc
,
startDate
,
endDate
,
forceFlag
);
}
catch
(
Exception
e
)
{
throw
e
;
}
}
public
void
archive
(
String
id
)
throws
Exception
{
DateOperation
dateOperation
=
new
DateOperation
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录