Commit 714b6e64 by liushuangwu

Merge remote-tracking branch 'origin/master'

2 parents 44dd2de1 b7d1d463
...@@ -191,6 +191,23 @@ ...@@ -191,6 +191,23 @@
<!-- <version>RELEASE</version>--> <!-- <version>RELEASE</version>-->
<!-- <scope>compile</scope>--> <!-- <scope>compile</scope>-->
<!-- </dependency>--> <!-- </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> </dependencies>
<build> <build>
......
package com.pipihelper.project.controller; package com.pipihelper.project.controller;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.pipihelper.project.core.Result; import com.pipihelper.project.core.Result;
import com.pipihelper.project.core.ResultGenerator; import com.pipihelper.project.core.ResultGenerator;
import com.pipihelper.project.rostering.model.DateRuleModel; 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.RosteringModel;
import com.pipihelper.project.rostering.model.ShiftRuleModel; import com.pipihelper.project.rostering.model.ShiftRuleModel;
import com.pipihelper.project.rostering.model.StaffRuleModel; import com.pipihelper.project.rostering.model.StaffRuleModel;
import com.pipihelper.project.rostering.service.RosteringService; import com.pipihelper.project.rostering.service.RosteringService;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; 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; import java.util.List;
/** /**
...@@ -28,6 +37,30 @@ public class RosteringController { ...@@ -28,6 +37,30 @@ public class RosteringController {
@Autowired @Autowired
private RosteringService rosteringService; 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") @PostMapping(value = "gen")
public Result genRostering(@RequestParam("month") int month, public Result genRostering(@RequestParam("month") int month,
@RequestParam("shiftRuleModel") String shiftRuleModelStr, @RequestParam("shiftRuleModel") String shiftRuleModelStr,
...@@ -40,4 +73,6 @@ public class RosteringController { ...@@ -40,4 +73,6 @@ public class RosteringController {
return ResultGenerator.genSuccessResult(rosteringService.gen(month, shiftRuleModels, staffRuleModels, dateRuleModels)); return ResultGenerator.genSuccessResult(rosteringService.gen(month, shiftRuleModels, staffRuleModels, dateRuleModels));
} }
} }
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);
}
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;
}
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));
}
}
package com.pipihelper.project.rostering.service; 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.DateRuleModel;
import com.pipihelper.project.rostering.model.RosteringExportModel;
import com.pipihelper.project.rostering.model.StaffRuleModel; import com.pipihelper.project.rostering.model.StaffRuleModel;
import com.pipihelper.project.rostering.model.RosteringModel; import com.pipihelper.project.rostering.model.RosteringModel;
import com.pipihelper.project.rostering.model.ShiftRuleModel; import com.pipihelper.project.rostering.model.ShiftRuleModel;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.List; import java.util.List;
...@@ -14,6 +17,12 @@ import java.util.List; ...@@ -14,6 +17,12 @@ import java.util.List;
**/ **/
public interface RosteringService { public interface RosteringService {
Workbook export(List<RosteringExportModel> rosteringModels);
List<RosteringStaff> findAllStaff();
/** /**
* 生成班次 * 生成班次
* *
......
package com.pipihelper.project.rostering.service.impl; 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.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists; 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.DateRuleModel;
import com.pipihelper.project.rostering.model.RosteringExportModel;
import com.pipihelper.project.rostering.model.RosteringModel; import com.pipihelper.project.rostering.model.RosteringModel;
import com.pipihelper.project.rostering.model.ShiftRuleModel; import com.pipihelper.project.rostering.model.ShiftRuleModel;
import com.pipihelper.project.rostering.model.StaffRuleModel; import com.pipihelper.project.rostering.model.StaffRuleModel;
import com.pipihelper.project.rostering.service.RosteringService; import com.pipihelper.project.rostering.service.RosteringService;
import org.apache.commons.lang3.StringUtils; 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 org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -32,6 +40,87 @@ import java.util.stream.Collectors; ...@@ -32,6 +40,87 @@ import java.util.stream.Collectors;
@Service @Service
public class RosteringServiceImpl implements RosteringService { 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 @Override
public List<RosteringModel> gen(int month, public List<RosteringModel> gen(int month,
List<ShiftRuleModel> shiftRuleModels, List<ShiftRuleModel> shiftRuleModels,
...@@ -136,7 +225,7 @@ public class RosteringServiceImpl implements RosteringService { ...@@ -136,7 +225,7 @@ public class RosteringServiceImpl implements RosteringService {
private ShiftRuleModel getByShiftRule(List<ShiftRuleModel> shiftRuleModels, List<ShiftRuleModel> currentShifts, StaffRuleModel staffRuleModel) { private ShiftRuleModel getByShiftRule(List<ShiftRuleModel> shiftRuleModels, List<ShiftRuleModel> currentShifts, StaffRuleModel staffRuleModel) {
//随机获取,当前排班为null 则代表是第一次排班 //随机获取,当前排班为null 则代表是第一次排班
if (CollectionUtil.isEmpty(currentShifts)) { 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 { ...@@ -173,11 +262,13 @@ public class RosteringServiceImpl implements RosteringService {
result = getRandom(shiftRuleModels); result = getRandom(shiftRuleModels);
} }
//是否有休息并且 //两个休息间的班次保证一致
if (BooleanUtil.isFalse(result.isRest()) && BooleanUtil.isFalse(lastShift.isRest())) { if (BooleanUtil.isFalse(result.isRest()) && BooleanUtil.isFalse(lastShift.isRest())) {
result = shiftRuleModels.stream() result = shiftRuleModels
.stream()
.filter(e -> ObjectUtil.equal(e.getName(), lastShift.getName())) .filter(e -> ObjectUtil.equal(e.getName(), lastShift.getName()))
.findFirst().orElse(null); .findFirst()
.orElse(null);
} }
return result; return result;
} }
...@@ -191,7 +282,7 @@ public class RosteringServiceImpl implements RosteringService { ...@@ -191,7 +282,7 @@ public class RosteringServiceImpl implements RosteringService {
if (currentShiftTimes < maxContinuity) { if (currentShiftTimes < maxContinuity) {
return lastShift; 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); return shiftRuleModels.stream().filter(e -> maxContinuityFollows.contains(e.getName())).findFirst().orElse(null);
} }
......
...@@ -28,7 +28,7 @@ public class GraphicsGenerationUtil { ...@@ -28,7 +28,7 @@ public class GraphicsGenerationUtil {
totalcol = data.get(0).size(); totalcol = data.get(0).size();
} }
// 图片宽度 // 图片宽度
int imageWidth = 1024; int imageWidth = 750;
// 行高 // 行高
int rowheight = 40; int rowheight = 40;
// 图片高度 // 图片高度
......
<?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>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
{ {
"tag": "div", "tag": "div",
"text": { "text": {
"content": "1. 按摩时间15:00-17:30;\n2. 按摩时长每人15分钟,3人一组,按照图片顺序从上至下依次进行;\n3. 按完请在自己的卡片上点击完成,系统会自动@下一位成员;4. 放弃请直接点击放弃,名额将会发送到大群秒杀,先到先得;\n5. 有事暂时来不了,可以推迟到最后;\n6. 轮到你的时候超过1分钟未确认,将自动调换至末尾,@下一位成员;", "content": "1. 按摩时间15:00-17:30;\n2. 按摩时长每人15分钟,3人一组,按照图片顺序从上至下依次进行;\n3. 按完记得在自己的卡片上点击完成哦,系统会自动通知下一位成员;4. 点击放弃,名额将会发送到大群秒杀,先到先得;\n5. 有事暂时来不了,可以推迟到队伍最后;\n",
"tag": "lark_md" "tag": "lark_md"
} }
}, },
......
...@@ -27,15 +27,15 @@ ...@@ -27,15 +27,15 @@
// private static final String JAVA_PATH = "/src/main/java"; //java文件路径 // private static final String JAVA_PATH = "/src/main/java"; //java文件路径
// private static final String RESOURCES_PATH = "/src/main/resources";//资源文件路径 // 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 = packageConvertPath(SERVICE_PACKAGE);//生成的Service存放路径
//// private static final String PACKAGE_PATH_SERVICE_IMPL = packageConvertPath(SERVICE_IMPL_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_CONTROLLER = packageConvertPath(CONTROLLER_PACKAGE);//生成的Controller存放路径
// //
// private static final String AUTHOR = "CodeGenerator";//@author // private static final String AUTHOR = "CodeGenerator";//@author
// private static final String DATE = new SimpleDateFormat("yyyy/MM/dd").format(new Date());//@date // private static final String DATE = new SimpleDateFormat("yyyy/MM/dd").format(new Date());//@date
// //
// public static void main(String[] args) { // public static void main(String[] args) {
// genCode("t_feishu_customer_feedback"); // genCode("t_rostering_staff");
// //genCodeByCustomModelName("输入表名","输入自定义Model名称"); // //genCodeByCustomModelName("输入表名","输入自定义Model名称");
// } // }
// //
...@@ -79,12 +79,12 @@ ...@@ -79,12 +79,12 @@
// //
// PluginConfiguration pluginConfiguration = new PluginConfiguration(); // PluginConfiguration pluginConfiguration = new PluginConfiguration();
// pluginConfiguration.setConfigurationType("tk.mybatis.mapper.generator.MapperPlugin"); // pluginConfiguration.setConfigurationType("tk.mybatis.mapper.generator.MapperPlugin");
// pluginConfiguration.addProperty("mappers", MAPPER_INTERFACE_REFERENCE); //// pluginConfiguration.addProperty("mappers", MAPPER_INTERFACE_REFERENCE);
// context.addPluginConfiguration(pluginConfiguration); // context.addPluginConfiguration(pluginConfiguration);
// //
// JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration(); // JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
// javaModelGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH); // javaModelGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH);
// javaModelGeneratorConfiguration.setTargetPackage(MODEL_PACKAGE); //// javaModelGeneratorConfiguration.setTargetPackage(MODEL_PACKAGE);
// context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration); // context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
// //
// SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration(); // SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
// //
// JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration(); // JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
// javaClientGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH); // javaClientGeneratorConfiguration.setTargetProject(PROJECT_PATH + JAVA_PATH);
// javaClientGeneratorConfiguration.setTargetPackage(MAPPER_PACKAGE); //// javaClientGeneratorConfiguration.setTargetPackage(MAPPER_PACKAGE);
// javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER"); // javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
// context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration); // context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);
// //
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
// String modelNameUpperCamel = StringUtils.isEmpty(modelName) ? tableNameConvertUpperCamel(tableName) : modelName; // String modelNameUpperCamel = StringUtils.isEmpty(modelName) ? tableNameConvertUpperCamel(tableName) : modelName;
// data.put("modelNameUpperCamel", modelNameUpperCamel); // data.put("modelNameUpperCamel", modelNameUpperCamel);
// data.put("modelNameLowerCamel", tableNameConvertLowerCamel(tableName)); // 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"); // File file = new File(PROJECT_PATH + JAVA_PATH + PACKAGE_PATH_SERVICE + modelNameUpperCamel + "Service.java");
// if (!file.getParentFile().exists()) { // if (!file.getParentFile().exists()) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!