Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation
This project
Loading...
Sign in
zhangshaowu
/
pipi-helper
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit fbdfc69b
authored
Oct 16, 2022
by
zhangshaowu
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
排班信息
1 parent
f871b337
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
295 additions
and
14 deletions
pom.xml
src/main/java/com/pipihelper/project/controller/RosteringController.java
src/main/java/com/pipihelper/project/feishu/dao/RosteringStaffDao.java
src/main/java/com/pipihelper/project/feishu/entity/RosteringStaff.java
src/main/java/com/pipihelper/project/rostering/model/RosteringExportModel.java
src/main/java/com/pipihelper/project/rostering/service/RosteringService.java
src/main/java/com/pipihelper/project/rostering/service/impl/RosteringServiceImpl.java
src/main/resources/mybatis/RosteringStaffMapper.xml
src/test/java/CodeGenerator.java
pom.xml
View file @
fbdfc69
...
...
@@ -191,6 +191,23 @@
<!-- <version>RELEASE</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>
cn.afterturn
</groupId>
<artifactId>
easypoi-base
</artifactId>
<version>
3.2.0
</version>
</dependency>
<dependency>
<groupId>
cn.afterturn
</groupId>
<artifactId>
easypoi-web
</artifactId>
<version>
3.2.0
</version>
</dependency>
<dependency>
<groupId>
cn.afterturn
</groupId>
<artifactId>
easypoi-annotation
</artifactId>
<version>
3.2.0
</version>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/pipihelper/project/controller/RosteringController.java
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
controller
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.pipihelper.project.core.Result
;
import
com.pipihelper.project.core.ResultGenerator
;
import
com.pipihelper.project.rostering.model.DateRuleModel
;
import
com.pipihelper.project.rostering.model.RosteringExportModel
;
import
com.pipihelper.project.rostering.model.RosteringModel
;
import
com.pipihelper.project.rostering.model.ShiftRuleModel
;
import
com.pipihelper.project.rostering.model.StaffRuleModel
;
import
com.pipihelper.project.rostering.service.RosteringService
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.net.URLEncoder
;
import
java.util.Date
;
import
java.util.List
;
/**
...
...
@@ -28,6 +37,30 @@ public class RosteringController {
@Autowired
private
RosteringService
rosteringService
;
@PostMapping
(
value
=
"list-staff"
)
public
Result
listStaff
()
{
return
ResultGenerator
.
genSuccessResult
(
rosteringService
.
findAllStaff
());
}
@GetMapping
(
value
=
"export"
)
public
void
listStaff
(
String
datas
,
String
date
,
HttpServletResponse
response
)
{
List
<
RosteringExportModel
>
rosteringModels
=
JSONObject
.
parseArray
(
datas
,
RosteringExportModel
.
class
);
Workbook
workbook
=
rosteringService
.
export
(
rosteringModels
);
try
{
String
fileName
=
DateUtil
.
format
(
DateUtil
.
parse
(
date
),
"yyyy-MM"
)
+
"rostering.xls"
;
response
.
setCharacterEncoding
(
"UTF-8"
);
response
.
setHeader
(
"content-Type"
,
"application/vnd.ms-excel"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
URLEncoder
.
encode
(
fileName
,
"UTF-8"
));
workbook
.
write
(
response
.
getOutputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
.
getMessage
());
}
}
@PostMapping
(
value
=
"gen"
)
public
Result
genRostering
(
@RequestParam
(
"month"
)
int
month
,
@RequestParam
(
"shiftRuleModel"
)
String
shiftRuleModelStr
,
...
...
@@ -40,4 +73,6 @@ public class RosteringController {
return
ResultGenerator
.
genSuccessResult
(
rosteringService
.
gen
(
month
,
shiftRuleModels
,
staffRuleModels
,
dateRuleModels
));
}
}
src/main/java/com/pipihelper/project/feishu/dao/RosteringStaffDao.java
0 → 100644
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
feishu
.
dao
;
import
com.pipihelper.project.feishu.entity.RosteringStaff
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
java.util.List
;
import
java.util.Set
;
@Mapper
public
interface
RosteringStaffDao
{
List
<
RosteringStaff
>
findAll
();
List
<
RosteringStaff
>
findByNames
(
@RequestParam
(
"names"
)
Set
<
String
>
names
);
}
src/main/java/com/pipihelper/project/feishu/entity/RosteringStaff.java
0 → 100644
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
feishu
.
entity
;
import
lombok.Data
;
import
java.util.Date
;
/**
* @author MYPC
*/
@Data
public
class
RosteringStaff
{
private
Integer
id
;
private
Date
createTime
;
private
Date
updateTime
;
private
String
department
;
private
String
dingId
;
private
String
jobNo
;
private
String
name
;
}
src/main/java/com/pipihelper/project/rostering/model/RosteringExportModel.java
0 → 100644
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
rostering
.
model
;
import
cn.afterturn.easypoi.excel.annotation.Excel
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.Data
;
import
java.util.Date
;
/**
* @description:
* @author: zsw
* @create: 2022-10-14 16:52
**/
@Data
public
class
RosteringExportModel
{
private
String
department
;
private
String
dingId
;
private
String
jobNo
;
/**
* 名字
*/
private
String
name
;
/**
* 班次
*/
private
String
shift
;
/**
* 时间
*/
private
Date
date
;
/**
* 周
*/
private
String
week
;
public
static
void
main
(
String
[]
args
)
{
RosteringExportModel
model
=
new
RosteringExportModel
();
model
.
setDate
(
DateUtil
.
parse
(
"2022-10-16 00:00:00"
));
model
.
setName
(
"文潇"
);
model
.
setWeek
(
"周一"
);
model
.
setShift
(
"早班"
);
System
.
out
.
println
(
JSONObject
.
toJSONString
(
model
));
}
}
src/main/java/com/pipihelper/project/rostering/service/RosteringService.java
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
rostering
.
service
;
import
com.pipihelper.project.feishu.entity.RosteringStaff
;
import
com.pipihelper.project.rostering.model.DateRuleModel
;
import
com.pipihelper.project.rostering.model.RosteringExportModel
;
import
com.pipihelper.project.rostering.model.StaffRuleModel
;
import
com.pipihelper.project.rostering.model.RosteringModel
;
import
com.pipihelper.project.rostering.model.ShiftRuleModel
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
java.util.List
;
...
...
@@ -14,6 +17,12 @@ import java.util.List;
**/
public
interface
RosteringService
{
Workbook
export
(
List
<
RosteringExportModel
>
rosteringModels
);
List
<
RosteringStaff
>
findAllStaff
();
/**
* 生成班次
*
...
...
src/main/java/com/pipihelper/project/rostering/service/impl/RosteringServiceImpl.java
View file @
fbdfc69
package
com
.
pipihelper
.
project
.
rostering
.
service
.
impl
;
import
cn.afterturn.easypoi.excel.ExcelExportUtil
;
import
cn.afterturn.easypoi.excel.entity.ExportParams
;
import
cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.BooleanUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.RandomUtil
;
import
com.google.common.collect.Lists
;
import
com.pipihelper.project.feishu.dao.RosteringStaffDao
;
import
com.pipihelper.project.feishu.entity.RosteringStaff
;
import
com.pipihelper.project.rostering.model.DateRuleModel
;
import
com.pipihelper.project.rostering.model.RosteringExportModel
;
import
com.pipihelper.project.rostering.model.RosteringModel
;
import
com.pipihelper.project.rostering.model.ShiftRuleModel
;
import
com.pipihelper.project.rostering.model.StaffRuleModel
;
import
com.pipihelper.project.rostering.service.RosteringService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
...
...
@@ -32,6 +40,87 @@ import java.util.stream.Collectors;
@Service
public
class
RosteringServiceImpl
implements
RosteringService
{
@Autowired
private
RosteringStaffDao
rosteringStaffDao
;
@Override
public
Workbook
export
(
List
<
RosteringExportModel
>
rosteringModels
)
{
Set
<
String
>
names
=
rosteringModels
.
stream
().
map
(
RosteringExportModel:
:
getName
).
collect
(
Collectors
.
toSet
());
Map
<
String
,
RosteringStaff
>
rosteringStaffMap
=
Optional
.
ofNullable
(
rosteringStaffDao
.
findByNames
(
names
))
.
orElse
(
Lists
.
newArrayList
())
.
stream
()
.
collect
(
Collectors
.
toMap
(
RosteringStaff:
:
getName
,
Function
.
identity
()));
Map
<
String
,
List
<
RosteringExportModel
>>
dataMap
=
rosteringModels
.
stream
().
collect
(
Collectors
.
groupingBy
(
RosteringExportModel:
:
getName
));
List
<
ExcelExportEntity
>
colList
=
new
ArrayList
<>();
ExcelExportEntity
departmentCol
=
new
ExcelExportEntity
();
departmentCol
.
setName
(
"部门"
);
departmentCol
.
setKey
(
"department"
);
departmentCol
.
setOrderNum
(
1
);
colList
.
add
(
departmentCol
);
ExcelExportEntity
dingIdCol
=
new
ExcelExportEntity
();
dingIdCol
.
setName
(
"用户ID"
);
dingIdCol
.
setKey
(
"dingId"
);
dingIdCol
.
setOrderNum
(
2
);
colList
.
add
(
dingIdCol
);
ExcelExportEntity
jobNoCol
=
new
ExcelExportEntity
();
jobNoCol
.
setName
(
"工号"
);
jobNoCol
.
setKey
(
"jobNo"
);
jobNoCol
.
setOrderNum
(
3
);
colList
.
add
(
jobNoCol
);
ExcelExportEntity
nameCol
=
new
ExcelExportEntity
();
nameCol
.
setName
(
"姓名"
);
nameCol
.
setKey
(
"name"
);
nameCol
.
setOrderNum
(
4
);
colList
.
add
(
nameCol
);
List
<
String
>
dates
=
rosteringModels
.
stream
().
map
(
e
->
{
String
dateStr
=
DateUtil
.
format
(
e
.
getDate
(),
"yyyy/MM/dd"
);
return
dateStr
+
e
.
getWeek
();
}).
collect
(
Collectors
.
toList
());
for
(
int
i
=
0
;
i
<
dates
.
size
();
i
++)
{
int
orderNum
=
i
+
5
;
String
name
=
dates
.
get
(
i
);
ExcelExportEntity
excelExportEntity
=
new
ExcelExportEntity
();
excelExportEntity
.
setName
(
name
);
excelExportEntity
.
setKey
(
name
);
excelExportEntity
.
setOrderNum
(
orderNum
);
colList
.
add
(
excelExportEntity
);
}
List
<
Map
>
datas
=
new
ArrayList
<>();
dataMap
.
forEach
((
k
,
v
)
->
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"name"
,
k
);
RosteringStaff
rosteringStaff
=
rosteringStaffMap
.
get
(
k
);
map
.
put
(
"department"
,
rosteringStaff
.
getDepartment
());
map
.
put
(
"dingId"
,
rosteringStaff
.
getDingId
());
map
.
put
(
"jobNo"
,
rosteringStaff
.
getJobNo
());
v
.
forEach
(
e
->
{
String
dateStr
=
DateUtil
.
format
(
e
.
getDate
(),
"yyyy/MM/dd"
);
String
date
=
dateStr
+
e
.
getWeek
();
map
.
put
(
date
,
e
.
getShift
());
datas
.
add
(
map
);
});
});
return
ExcelExportUtil
.
exportExcel
(
new
ExportParams
(),
colList
,
datas
);
}
@Override
public
List
<
RosteringStaff
>
findAllStaff
()
{
return
rosteringStaffDao
.
findAll
();
}
@Override
public
List
<
RosteringModel
>
gen
(
int
month
,
List
<
ShiftRuleModel
>
shiftRuleModels
,
...
...
@@ -136,7 +225,7 @@ public class RosteringServiceImpl implements RosteringService {
private
ShiftRuleModel
getByShiftRule
(
List
<
ShiftRuleModel
>
shiftRuleModels
,
List
<
ShiftRuleModel
>
currentShifts
,
StaffRuleModel
staffRuleModel
)
{
//随机获取,当前排班为null 则代表是第一次排班
if
(
CollectionUtil
.
isEmpty
(
currentShifts
))
{
return
getRandom
(
shiftRuleModels
.
stream
().
filter
(
e
->
BooleanUtil
.
isFalse
(
e
.
isRest
())).
collect
(
Collectors
.
toList
())
);
return
getRandom
(
shiftRuleModels
);
}
//获取最后一次分配的班次
...
...
@@ -173,11 +262,13 @@ public class RosteringServiceImpl implements RosteringService {
result
=
getRandom
(
shiftRuleModels
);
}
//
是否有休息并且
//
两个休息间的班次保证一致
if
(
BooleanUtil
.
isFalse
(
result
.
isRest
())
&&
BooleanUtil
.
isFalse
(
lastShift
.
isRest
()))
{
result
=
shiftRuleModels
.
stream
()
result
=
shiftRuleModels
.
stream
()
.
filter
(
e
->
ObjectUtil
.
equal
(
e
.
getName
(),
lastShift
.
getName
()))
.
findFirst
().
orElse
(
null
);
.
findFirst
()
.
orElse
(
null
);
}
return
result
;
}
...
...
@@ -191,7 +282,7 @@ public class RosteringServiceImpl implements RosteringService {
if
(
currentShiftTimes
<
maxContinuity
)
{
return
lastShift
;
}
List
<
String
>
maxContinuityFollows
=
lastShift
.
getMaxContinuityFollow
(
);
List
<
String
>
maxContinuityFollows
=
Optional
.
ofNullable
(
lastShift
.
getMaxContinuityFollow
()).
orElse
(
Lists
.
newArrayList
()
);
return
shiftRuleModels
.
stream
().
filter
(
e
->
maxContinuityFollows
.
contains
(
e
.
getName
())).
findFirst
().
orElse
(
null
);
}
...
...
src/main/resources/mybatis/RosteringStaffMapper.xml
0 → 100644
View file @
fbdfc69
<?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.pipihelper.project.feishu.dao.RosteringStaffDao"
>
<resultMap
id=
"ResultMap"
type=
"com.pipihelper.project.feishu.entity.RosteringStaff"
>
<id
column=
"id"
property=
"id"
/>
<result
column=
"create_time"
property=
"createTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
<result
column=
"department"
property=
"department"
/>
<result
column=
"ding_id"
property=
"dingId"
/>
<result
column=
"job_no"
property=
"jobNo"
/>
<result
column=
"name"
property=
"name"
/>
</resultMap>
<!-- <resultMap id="BuffConfigResultBOMap" type="com.pipihelper.project.feishu.entity.Deployee"
extends="EmployeeResultMap">
</resultMap>-->
<sql
id=
"Base_Column_List"
>
id,create_time,update_time,department,ding_id,job_no,name
</sql>
<select
id=
"findAll"
resultMap=
"ResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from t_rostering_staff
</select>
<select
id=
"findByNames"
resultMap=
"ResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from t_rostering_staff
where name in
<foreach
collection=
"names"
open=
"("
separator=
","
close=
")"
item=
"name"
>
#{name}
</foreach>
</select>
</mapper>
src/test/java/CodeGenerator.java
View file @
fbdfc69
...
...
@@ -27,15 +27,15 @@
// private static final String JAVA_PATH = "/src/main/java"; //java文件路径
// private static final String RESOURCES_PATH = "/src/main/resources";//资源文件路径
//
//
//
private static final String PACKAGE_PATH_SERVICE = packageConvertPath(SERVICE_PACKAGE);//生成的Service存放路径
//
//
private static final String PACKAGE_PATH_SERVICE_IMPL = packageConvertPath(SERVICE_IMPL_PACKAGE);//生成的Service实现存放路径
//
//
private static final String PACKAGE_PATH_CONTROLLER = packageConvertPath(CONTROLLER_PACKAGE);//生成的Controller存放路径
// private static final String PACKAGE_PATH_SERVICE = packageConvertPath(SERVICE_PACKAGE);//生成的Service存放路径
// private static final String PACKAGE_PATH_SERVICE_IMPL = packageConvertPath(SERVICE_IMPL_PACKAGE);//生成的Service实现存放路径
// private static final String PACKAGE_PATH_CONTROLLER = packageConvertPath(CONTROLLER_PACKAGE);//生成的Controller存放路径
//
// private static final String AUTHOR = "CodeGenerator";//@author
// private static final String DATE = new SimpleDateFormat("yyyy/MM/dd").format(new Date());//@date
//
// public static void main(String[] args) {
// genCode("t_
feishu_customer_feedback
");
// genCode("t_
rostering_staff
");
// //genCodeByCustomModelName("输入表名","输入自定义Model名称");
// }
//
...
...
@@ -79,12 +79,12 @@
//
// PluginConfiguration pluginConfiguration = new PluginConfiguration();
// pluginConfiguration.setConfigurationType("tk.mybatis.mapper.generator.MapperPlugin");
// pluginConfiguration.addProperty("mappers", MAPPER_INTERFACE_REFERENCE);
//
//
pluginConfiguration.addProperty("mappers", MAPPER_INTERFACE_REFERENCE);
// context.addPluginConfiguration(pluginConfiguration);
//
// JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
// javaModelGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH);
// javaModelGeneratorConfiguration.setTargetPackage(MODEL_PACKAGE);
//
//
javaModelGeneratorConfiguration.setTargetPackage(MODEL_PACKAGE);
// context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
//
// SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
...
...
@@ -94,7 +94,7 @@
//
// JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
// javaClientGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH);
// javaClientGeneratorConfiguration.setTargetPackage(MAPPER_PACKAGE);
//
//
javaClientGeneratorConfiguration.setTargetPackage(MAPPER_PACKAGE);
// javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
// context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);
//
...
...
@@ -139,7 +139,7 @@
// String modelNameUpperCamel = StringUtils.isEmpty(modelName) ? tableNameConvertUpperCamel(tableName) : modelName;
// data.put("modelNameUpperCamel", modelNameUpperCamel);
// data.put("modelNameLowerCamel", tableNameConvertLowerCamel(tableName));
// data.put("basePackage", BASE_PACKAGE);
//
//
data.put("basePackage", BASE_PACKAGE);
//
// File file = new File(PROJECT_PATH + JAVA_PATH + PACKAGE_PATH_SERVICE + modelNameUpperCamel + "Service.java");
// if (!file.getParentFile().exists()) {
...
...
Write
Preview
Markdown
is supported
Attach a file
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 post a comment