LED屏显示调整
parent
df917bbe01
commit
3dbbca0291
|
|
@ -21,6 +21,14 @@ public interface DevTowerProjectConfigMapper
|
||||||
*/
|
*/
|
||||||
public DevTowerProjectConfig selectDevTowerProjectConfigById(Long id);
|
public DevTowerProjectConfig selectDevTowerProjectConfigById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据设备ID查询塔基检测配置
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return 塔基检测配置
|
||||||
|
*/
|
||||||
|
public DevTowerProjectConfig selectDevTowerProjectConfigByDeviceId(Long deviceId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询塔基检测配置列表
|
* 查询塔基检测配置列表
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
where dtpc.id = #{id} and dtpc.is_del=0
|
where dtpc.id = #{id} and dtpc.is_del=0
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectDevTowerProjectConfigByDeviceId" parameterType="Long" resultMap="DevTowerProjectConfigResult">
|
||||||
|
<include refid="selectDevTowerProjectConfigVo"/>
|
||||||
|
where dtpc.id = #{deviceId} and dtpc.is_del=0
|
||||||
|
</select>
|
||||||
|
|
||||||
<insert id="insertDevTowerProjectConfig" parameterType="DevTowerProjectConfig" useGeneratedKeys="true" keyProperty="id">
|
<insert id="insertDevTowerProjectConfig" parameterType="DevTowerProjectConfig" useGeneratedKeys="true" keyProperty="id">
|
||||||
insert into dev_tower_project_config
|
insert into dev_tower_project_config
|
||||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<if test="latitude != null "> and pma.latitude = #{latitude}</if>
|
<if test="latitude != null "> and pma.latitude = #{latitude}</if>
|
||||||
<if test="attDate != null "> and pma.att_date = #{attDate}</if>
|
<if test="attDate != null "> and pma.att_date = #{attDate}</if>
|
||||||
<if test="attImg != null and attImg != ''"> and pma.att_img = #{attImg}</if>
|
<if test="attImg != null and attImg != ''"> and pma.att_img = #{attImg}</if>
|
||||||
<if test="isDel != null "> and pma.is_del = #{isDel}</if>
|
<if test="isDel != null "> and pma.work_area_id = #{isDel}</if>
|
||||||
<if test="state != null "> and pma.state = #{state}</if>
|
<if test="state != null "> and pma.state = #{state}</if>
|
||||||
<if test="workAreaId != null "> and wa.work_area_id = #{workAreaId}</if>
|
<if test="workAreaId != null "> and pma.is_del = #{workAreaId}</if>
|
||||||
<if test="userName!=null and userName!=''"> and psu.user_name like concat('%', #{userName}, '%')</if>
|
<if test="userName!=null and userName!=''"> and psu.user_name like concat('%', #{userName}, '%')</if>
|
||||||
<if test="userPhone!=null and userPhone!=''"> and psu.user_phone like concat('%', #{userPhone}, '%')</if>
|
<if test="userPhone!=null and userPhone!=''"> and psu.user_phone like concat('%', #{userPhone}, '%')</if>
|
||||||
<if test="startDate!=null"> and date(pma.att_date) >= date(#{startDate})</if>
|
<if test="startDate!=null"> and date(pma.att_date) >= date(#{startDate})</if>
|
||||||
|
|
@ -88,7 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
) psu ON pma.user_id = psu.user_id
|
) psu ON pma.user_id = psu.user_id
|
||||||
left join sys_dict_data dic1 on psu.`craft_type`=dic1.`dict_value` and dic1.`dict_type`='pro_craft_type'
|
left join sys_dict_data dic1 on psu.`craft_type`=dic1.`dict_value` and dic1.`dict_type`='pro_craft_type'
|
||||||
left join sys_dict_data dic2 on psu.`craft_post`=dic2.`dict_value` and dic2.`dict_type`='pro_craft_post'
|
left join sys_dict_data dic2 on psu.`craft_post`=dic2.`dict_value` and dic2.`dict_type`='pro_craft_post'
|
||||||
WHERE pma.is_del = 0 AND pma.in_out = 'in' AND pma.work_area_id = #{workAreaId} and pma.project_id = #{projectId}
|
WHERE pma.work_area_id = 0 AND pma.in_out = 'in' AND pma.is_del = #{workAreaId} and pma.project_id = #{projectId}
|
||||||
AND DATE(pma.att_date) = CURDATE()
|
AND DATE(pma.att_date) = CURDATE()
|
||||||
) ranked_data
|
) ranked_data
|
||||||
WHERE rn = 1
|
WHERE rn = 1
|
||||||
|
|
|
||||||
|
|
@ -105,10 +105,13 @@ public class LedDrawService {
|
||||||
programFile.addArea(area);
|
programFile.addArea(area);
|
||||||
// 添加图片页
|
// 添加图片页
|
||||||
if (imagePaths != null && imagePaths.length > 0) {
|
if (imagePaths != null && imagePaths.length > 0) {
|
||||||
|
logger.info("图片数量2={},sn={},x:0,y:17,w:{},h:{}",imagePaths.length,ledScreen.getDeviceSn(),ledScreen.getWidth().intValue(),
|
||||||
|
ledScreen.getHeight().intValue()-32);
|
||||||
area = new TextCaptionBxArea(0, 17, ledScreen.getWidth().intValue(),
|
area = new TextCaptionBxArea(0, 17, ledScreen.getWidth().intValue(),
|
||||||
ledScreen.getHeight().intValue()-16, profile);
|
ledScreen.getHeight().intValue()-32, profile);
|
||||||
for (String imagePath : imagePaths) {
|
for (String imagePath : imagePaths) {
|
||||||
ImageFileBxPage imagePage = new ImageFileBxPage(imagePath);
|
ImageFileBxPage imagePage = new ImageFileBxPage(imagePath);
|
||||||
|
logger.info("图片路径:{}", imagePath);
|
||||||
area.addPage(imagePage);
|
area.addPage(imagePage);
|
||||||
}
|
}
|
||||||
programFile.addArea(area);
|
programFile.addArea(area);
|
||||||
|
|
@ -118,7 +121,7 @@ public class LedDrawService {
|
||||||
onbon.bx06.area.DateTimeBxArea timeBxArea = new onbon.bx06.area.DateTimeBxArea(0, ledScreen.getHeight().intValue()-16, ledScreen.getWidth().intValue(), 16, profile);
|
onbon.bx06.area.DateTimeBxArea timeBxArea = new onbon.bx06.area.DateTimeBxArea(0, ledScreen.getHeight().intValue()-16, ledScreen.getWidth().intValue(), 16, profile);
|
||||||
timeBxArea.setMultiline(false);
|
timeBxArea.setMultiline(false);
|
||||||
timeBxArea.setDateStyle(DateStyle.YYYY_MM_DD_3);
|
timeBxArea.setDateStyle(DateStyle.YYYY_MM_DD_3);
|
||||||
timeBxArea.setTimeStyle(TimeStyle.HH12_MM_SS_1);
|
timeBxArea.setTimeStyle(TimeStyle.HH_MM_SS_1);
|
||||||
timeBxArea.setWeekStyle(WeekStyle.CHINESE);
|
timeBxArea.setWeekStyle(WeekStyle.CHINESE);
|
||||||
|
|
||||||
programFile.addArea(timeBxArea);
|
programFile.addArea(timeBxArea);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@ import com.yanzhu.manage.mapper.ProMobileAttendanceDataMapper;
|
||||||
import com.yanzhu.system.domain.SysLedscreen;
|
import com.yanzhu.system.domain.SysLedscreen;
|
||||||
import com.yanzhu.system.domain.SysWorkArea;
|
import com.yanzhu.system.domain.SysWorkArea;
|
||||||
import com.yanzhu.system.mapper.SysLedscreenMapper;
|
import com.yanzhu.system.mapper.SysLedscreenMapper;
|
||||||
import com.yanzhu.system.mapper.SysWorkAreaMapper;
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
|
@ -18,11 +19,14 @@ import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class LedScreenServiceImpl implements ILedScreenService {
|
public class LedScreenServiceImpl implements ILedScreenService {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(LedScreenServiceImpl.class);
|
||||||
@Autowired
|
@Autowired
|
||||||
private SysLedscreenMapper sysLedscreenMapper;
|
private SysLedscreenMapper sysLedscreenMapper;
|
||||||
|
|
||||||
|
|
@ -154,7 +158,11 @@ public class LedScreenServiceImpl implements ILedScreenService {
|
||||||
where.setWorkAreaId(ledScreen.getWorkareaId());
|
where.setWorkAreaId(ledScreen.getWorkareaId());
|
||||||
where.setProjectId(ledScreen.getProjectId());
|
where.setProjectId(ledScreen.getProjectId());
|
||||||
// 可以添加更多筛选条件,如最近考勤时间等
|
// 可以添加更多筛选条件,如最近考勤时间等
|
||||||
return proMobileAttendanceDataMapper.selectProMobileAttendanceDataListByWorkArea(where);
|
List<ProMobileAttendanceData> list=proMobileAttendanceDataMapper.selectProMobileAttendanceDataListByWorkArea(where);
|
||||||
|
//打印日志
|
||||||
|
log.info("根据工区ID获取考勤数据: {}条, 工区ID: {}, 项目ID: {}", list.size(), ledScreen.getWorkareaId(), ledScreen.getProjectId());
|
||||||
|
//根据屏的DeviceNo为目录创建图片路径
|
||||||
|
return list;
|
||||||
// return Arrays.stream("1,2,3,4,5,6,7,8,9,10".split(",")).map(id -> {
|
// return Arrays.stream("1,2,3,4,5,6,7,8,9,10".split(",")).map(id -> {
|
||||||
// ProMobileAttendanceData d=new ProMobileAttendanceData();
|
// ProMobileAttendanceData d=new ProMobileAttendanceData();
|
||||||
// d.setId(Long.parseLong(id));
|
// d.setId(Long.parseLong(id));
|
||||||
|
|
|
||||||
|
|
@ -26,108 +26,117 @@ public class Uni2LedDrawer extends BaseDrawer{
|
||||||
|
|
||||||
|
|
||||||
int screenHeight=ledScreen.getHeight().intValue();
|
int screenHeight=ledScreen.getHeight().intValue();
|
||||||
int dataLine = Math.max(3, (screenHeight-32)/16-1); // 确保dataLine至少为1
|
int dataLine = Math.max(3, (screenHeight-32)/18-1); // 确保dataLine至少为1
|
||||||
List<String> imagePaths = new ArrayList<>();
|
List<String> imagePaths = new ArrayList<>();
|
||||||
//根据dataLine来对list进行分页,调用绘制方法
|
//根据dataLine来对list进行分页,调用绘制方法
|
||||||
if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0
|
if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0
|
||||||
for (int i = 0; i < attendanceDataList.size(); i += dataLine) {
|
for (int i = 0; i < attendanceDataList.size(); i += dataLine) {
|
||||||
List<ProMobileAttendanceData> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size()));
|
List<ProMobileAttendanceData> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size()));
|
||||||
String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp";
|
String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp";
|
||||||
drawImage(ledScreen, subList, imagePath);
|
drawImage(ledScreen, subList, imagePath, dataLine);
|
||||||
imagePaths.add(imagePath);
|
imagePaths.add(imagePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
imagePaths.clear();
|
|
||||||
return imagePaths.toArray(new String[0]);
|
return imagePaths.toArray(new String[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void drawImage(SysLedscreen ledScreen, List<ProMobileAttendanceData> subList, String imagePath) {
|
private static void drawImage(SysLedscreen ledScreen, List<ProMobileAttendanceData> subList, String imagePath, int maxRows) {
|
||||||
int screenWidth=ledScreen.getWidth().intValue();
|
int screenWidth=ledScreen.getWidth().intValue();
|
||||||
int lineHeight = 16;
|
int screenHeight=ledScreen.getHeight().intValue();
|
||||||
|
int lineHeight = 18;
|
||||||
int headerHeight = lineHeight;
|
int headerHeight = lineHeight;
|
||||||
int rowHeight = lineHeight;
|
int rowHeight = lineHeight;
|
||||||
|
|
||||||
int margin = 3;
|
int margin = 2;
|
||||||
int drawWidth = screenWidth - 2 * margin;
|
int drawWidth = screenWidth - 2 * margin;
|
||||||
int totalHeight = headerHeight + subList.size() * rowHeight;
|
int imageHeight = screenHeight - 32;
|
||||||
|
int totalHeight = imageHeight - 2 * margin;
|
||||||
|
|
||||||
int imageWidth = screenWidth;
|
int imageWidth = screenWidth;
|
||||||
int imageHeight = totalHeight + 2 * margin;
|
|
||||||
|
|
||||||
// 创建4位16色的BMP图片
|
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY);
|
||||||
BufferedImage image = create4BitBmpImage(imageWidth, imageHeight);
|
|
||||||
Graphics2D g2d = image.createGraphics();
|
Graphics2D g2d = image.createGraphics();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 设置背景色为黑色
|
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
|
||||||
|
|
||||||
g2d.setColor(Color.BLACK);
|
g2d.setColor(Color.BLACK);
|
||||||
g2d.fillRect(0, 0, imageWidth, imageHeight);
|
g2d.fillRect(0, 0, imageWidth, imageHeight);
|
||||||
|
|
||||||
// 设置字体
|
Font font = new Font("宋体", Font.BOLD, 14);
|
||||||
Font font = new Font("宋体", Font.PLAIN, 12);
|
|
||||||
g2d.setFont(font);
|
g2d.setFont(font);
|
||||||
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||||
|
|
||||||
// 设置文字颜色为白色
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
|
|
||||||
// 表头:姓名 班组 进入时间
|
|
||||||
String[] headers = {"姓名", "班组", "进入时间"};
|
String[] headers = {"姓名", "班组", "进入时间"};
|
||||||
int[] columnWidths = {drawWidth / 3, drawWidth / 3, drawWidth / 3};
|
int[] columnWidths = {drawWidth / 3, drawWidth / 3, drawWidth / 3};
|
||||||
|
|
||||||
// 绘制表头
|
|
||||||
int x = margin;
|
int x = margin;
|
||||||
for (int i = 0; i < headers.length; i++) {
|
for (int i = 0; i < headers.length; i++) {
|
||||||
g2d.drawString(headers[i], x + 2, margin + headerHeight - 4);
|
g2d.drawString(headers[i], x + 2, margin + headerHeight - 2);
|
||||||
x += columnWidths[i];
|
x += columnWidths[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制表头下划线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawLine(margin, margin + headerHeight, margin + drawWidth, margin + headerHeight);
|
g2d.drawLine(margin, margin + headerHeight, margin + drawWidth, margin + headerHeight);
|
||||||
|
|
||||||
// 绘制数据行
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
for (int i = 0; i < subList.size(); i++) {
|
for (int i = 0; i < maxRows; i++) {
|
||||||
ProMobileAttendanceData data = subList.get(i);
|
|
||||||
int rowY = margin + headerHeight + i * rowHeight;
|
int rowY = margin + headerHeight + i * rowHeight;
|
||||||
|
int lineY = rowY + rowHeight;
|
||||||
|
|
||||||
// 获取数据
|
if (lineY > margin + totalHeight) {
|
||||||
String userName = data.getUserName() != null ? data.getUserName() : "";
|
lineY = margin + totalHeight;
|
||||||
String subDeptGroupName = data.getSubDeptGroupName() != null ? data.getSubDeptGroupName() : "";
|
|
||||||
|
|
||||||
// 格式化考勤时间
|
|
||||||
String attTime = "";
|
|
||||||
if (data.getAttDate() != null) {
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
|
||||||
attTime = sdf.format(data.getAttDate());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制数据行
|
if (i < subList.size()) {
|
||||||
x = margin;
|
ProMobileAttendanceData data = subList.get(i);
|
||||||
g2d.drawString(userName, x + 2, rowY + rowHeight - 4);
|
|
||||||
x += columnWidths[0];
|
String userName = data.getUserName() != null ? data.getUserName() : "";
|
||||||
g2d.drawString(subDeptGroupName, x + 2, rowY + rowHeight - 4);
|
String subDeptGroupName = data.getSubDeptGroupName() != null ? data.getSubDeptGroupName() : "";
|
||||||
x += columnWidths[1];
|
|
||||||
g2d.drawString(attTime, x + 2, rowY + rowHeight - 4);
|
String attTime = "";
|
||||||
|
if (data.getAttDate() != null) {
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
||||||
|
attTime = sdf.format(data.getAttDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
x = margin;
|
||||||
|
g2d.drawString(userName, x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[0];
|
||||||
|
g2d.drawString(subDeptGroupName, x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[1];
|
||||||
|
g2d.drawString(attTime, x + 2, rowY + rowHeight - 4);
|
||||||
|
} else {
|
||||||
|
x = margin;
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[0];
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[1];
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
}
|
||||||
|
|
||||||
// 绘制行下划线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawLine(margin, rowY + rowHeight, margin + drawWidth, rowY + rowHeight);
|
g2d.drawLine(margin, lineY, margin + drawWidth, lineY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制垂直分割线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
int x1 = margin + columnWidths[0];
|
int x1 = margin + columnWidths[0];
|
||||||
int x2 = margin + columnWidths[0] + columnWidths[1];
|
int x2 = margin + columnWidths[0] + columnWidths[1];
|
||||||
g2d.drawLine(x1, margin, x1, margin + totalHeight);
|
g2d.drawLine(x1, margin, x1, margin + totalHeight);
|
||||||
g2d.drawLine(x2, margin, x2, margin + totalHeight);
|
g2d.drawLine(x2, margin, x2, margin + totalHeight);
|
||||||
|
|
||||||
// 绘制表格外边框
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawRect(margin, margin, drawWidth, totalHeight);
|
g2d.drawRect(margin, margin, drawWidth, totalHeight);
|
||||||
|
|
||||||
// 保存图片为BMP格式
|
|
||||||
File outputFile = new File(imagePath);
|
File outputFile = new File(imagePath);
|
||||||
ImageIO.write(image, "bmp", outputFile);
|
ImageIO.write(image, "bmp", outputFile);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,108 +27,117 @@ public class UniLedDrawer extends BaseDrawer{
|
||||||
|
|
||||||
|
|
||||||
int screenHeight=ledScreen.getHeight().intValue();
|
int screenHeight=ledScreen.getHeight().intValue();
|
||||||
int dataLine = Math.max(3, (screenHeight-32)/16-1); // 确保dataLine至少为1
|
int dataLine = Math.max(3, (screenHeight-32)/18-1); // 确保dataLine至少为1
|
||||||
List<String> imagePaths = new ArrayList<>();
|
List<String> imagePaths = new ArrayList<>();
|
||||||
//根据dataLine来对list进行分页,调用绘制方法
|
//根据dataLine来对list进行分页,调用绘制方法
|
||||||
if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0
|
if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0
|
||||||
for (int i = 0; i < attendanceDataList.size(); i += dataLine) {
|
for (int i = 0; i < attendanceDataList.size(); i += dataLine) {
|
||||||
List<ProMobileAttendanceData> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size()));
|
List<ProMobileAttendanceData> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size()));
|
||||||
String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp";
|
String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp";
|
||||||
drawImage(ledScreen, subList, imagePath);
|
drawImage(ledScreen, subList, imagePath, dataLine);
|
||||||
imagePaths.add(imagePath);
|
imagePaths.add(imagePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
imagePaths.clear();
|
|
||||||
return imagePaths.toArray(new String[0]);
|
return imagePaths.toArray(new String[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void drawImage(SysLedscreen ledScreen, List<ProMobileAttendanceData> subList, String imagePath) {
|
private static void drawImage(SysLedscreen ledScreen, List<ProMobileAttendanceData> subList, String imagePath, int maxRows) {
|
||||||
int screenWidth=ledScreen.getWidth().intValue();
|
int screenWidth=ledScreen.getWidth().intValue();
|
||||||
int lineHeight = 16;
|
int screenHeight=ledScreen.getHeight().intValue();
|
||||||
|
int lineHeight = 18;
|
||||||
int headerHeight = lineHeight;
|
int headerHeight = lineHeight;
|
||||||
int rowHeight = lineHeight;
|
int rowHeight = lineHeight;
|
||||||
|
|
||||||
int margin = 3;
|
int margin = 2;
|
||||||
int drawWidth = screenWidth - 2 * margin;
|
int drawWidth = screenWidth - 2 * margin;
|
||||||
int totalHeight = headerHeight + subList.size() * rowHeight;
|
int imageHeight = screenHeight - 32;
|
||||||
|
int totalHeight = imageHeight - 2 * margin;
|
||||||
|
|
||||||
int imageWidth = screenWidth;
|
int imageWidth = screenWidth;
|
||||||
int imageHeight = totalHeight + 2 * margin;
|
|
||||||
|
|
||||||
// 创建4位16色的BMP图片
|
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY);
|
||||||
BufferedImage image = create4BitBmpImage(imageWidth, imageHeight);
|
|
||||||
Graphics2D g2d = image.createGraphics();
|
Graphics2D g2d = image.createGraphics();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 设置背景色为黑色
|
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
|
||||||
|
|
||||||
g2d.setColor(Color.BLACK);
|
g2d.setColor(Color.BLACK);
|
||||||
g2d.fillRect(0, 0, imageWidth, imageHeight);
|
g2d.fillRect(0, 0, imageWidth, imageHeight);
|
||||||
|
|
||||||
// 设置字体
|
Font font = new Font("宋体", Font.BOLD, 14);
|
||||||
Font font = new Font("宋体", Font.PLAIN, 12);
|
|
||||||
g2d.setFont(font);
|
g2d.setFont(font);
|
||||||
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||||
|
|
||||||
// 设置文字颜色为白色
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
|
|
||||||
// 表头:姓名 班组 进入时间
|
|
||||||
String[] headers = {"姓名", "班组", "进入时间"};
|
String[] headers = {"姓名", "班组", "进入时间"};
|
||||||
int[] columnWidths = {drawWidth / 3, drawWidth / 3, drawWidth / 3};
|
int[] columnWidths = {drawWidth / 3, drawWidth / 3, drawWidth / 3};
|
||||||
|
|
||||||
// 绘制表头
|
|
||||||
int x = margin;
|
int x = margin;
|
||||||
for (int i = 0; i < headers.length; i++) {
|
for (int i = 0; i < headers.length; i++) {
|
||||||
g2d.drawString(headers[i], x + 2, margin + headerHeight - 4);
|
g2d.drawString(headers[i], x + 2, margin + headerHeight - 2);
|
||||||
x += columnWidths[i];
|
x += columnWidths[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制表头下划线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawLine(margin, margin + headerHeight, margin + drawWidth, margin + headerHeight);
|
g2d.drawLine(margin, margin + headerHeight, margin + drawWidth, margin + headerHeight);
|
||||||
|
|
||||||
// 绘制数据行
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
for (int i = 0; i < subList.size(); i++) {
|
for (int i = 0; i < maxRows; i++) {
|
||||||
ProMobileAttendanceData data = subList.get(i);
|
|
||||||
int rowY = margin + headerHeight + i * rowHeight;
|
int rowY = margin + headerHeight + i * rowHeight;
|
||||||
|
int lineY = rowY + rowHeight;
|
||||||
|
|
||||||
// 获取数据
|
if (lineY > margin + totalHeight) {
|
||||||
String userName = data.getUserName() != null ? data.getUserName() : "";
|
lineY = margin + totalHeight;
|
||||||
String subDeptGroupName = data.getSubDeptGroupName() != null ? data.getSubDeptGroupName() : "";
|
|
||||||
|
|
||||||
// 格式化考勤时间
|
|
||||||
String attTime = "";
|
|
||||||
if (data.getAttDate() != null) {
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
|
||||||
attTime = sdf.format(data.getAttDate());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制数据行
|
if (i < subList.size()) {
|
||||||
x = margin;
|
ProMobileAttendanceData data = subList.get(i);
|
||||||
g2d.drawString(userName, x + 2, rowY + rowHeight - 4);
|
|
||||||
x += columnWidths[0];
|
String userName = data.getUserName() != null ? data.getUserName() : "";
|
||||||
g2d.drawString(subDeptGroupName, x + 2, rowY + rowHeight - 4);
|
String subDeptGroupName = data.getSubDeptGroupName() != null ? data.getSubDeptGroupName() : "";
|
||||||
x += columnWidths[1];
|
|
||||||
g2d.drawString(attTime, x + 2, rowY + rowHeight - 4);
|
String attTime = "";
|
||||||
|
if (data.getAttDate() != null) {
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
||||||
|
attTime = sdf.format(data.getAttDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
x = margin;
|
||||||
|
g2d.drawString(userName, x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[0];
|
||||||
|
g2d.drawString(subDeptGroupName, x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[1];
|
||||||
|
g2d.drawString(attTime, x + 2, rowY + rowHeight - 4);
|
||||||
|
} else {
|
||||||
|
x = margin;
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[0];
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
x += columnWidths[1];
|
||||||
|
g2d.drawString("", x + 2, rowY + rowHeight - 4);
|
||||||
|
}
|
||||||
|
|
||||||
// 绘制行下划线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawLine(margin, rowY + rowHeight, margin + drawWidth, rowY + rowHeight);
|
g2d.drawLine(margin, lineY, margin + drawWidth, lineY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制垂直分割线
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
int x1 = margin + columnWidths[0];
|
int x1 = margin + columnWidths[0];
|
||||||
int x2 = margin + columnWidths[0] + columnWidths[1];
|
int x2 = margin + columnWidths[0] + columnWidths[1];
|
||||||
g2d.drawLine(x1, margin, x1, margin + totalHeight);
|
g2d.drawLine(x1, margin, x1, margin + totalHeight);
|
||||||
g2d.drawLine(x2, margin, x2, margin + totalHeight);
|
g2d.drawLine(x2, margin, x2, margin + totalHeight);
|
||||||
|
|
||||||
// 绘制表格外边框
|
|
||||||
g2d.setColor(Color.WHITE);
|
g2d.setColor(Color.WHITE);
|
||||||
g2d.drawRect(margin, margin, drawWidth, totalHeight);
|
g2d.drawRect(margin, margin, drawWidth, totalHeight);
|
||||||
|
|
||||||
// 保存图片为BMP格式
|
|
||||||
File outputFile = new File(imagePath);
|
File outputFile = new File(imagePath);
|
||||||
ImageIO.write(image, "bmp", outputFile);
|
ImageIO.write(image, "bmp", outputFile);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -404,11 +404,11 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/tyLinux/run/push")
|
@PostMapping("/tyLinux/run/push")
|
||||||
public AjaxResult tyLinuxPushRunData(@RequestBody @Valid TyTowerLinuxRunReqVO req) {
|
public AjaxResult tyLinuxPushRunData(@RequestBody @Valid TyTowerLinuxRunReqVO req) {
|
||||||
log.info("desApi.towerCrane.tyLinux.run.push...{}",req.getEid());
|
log.info("desApi.towerCrane.tyLinux.run.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
String deviceKey = req.getEid().toString();
|
String deviceKey = config.getDeviceSn();
|
||||||
DevTowerDataLimit devTowerDataLimit = staticLimitMap.get(deviceKey);
|
DevTowerDataLimit devTowerDataLimit = staticLimitMap.get(deviceKey);
|
||||||
if(devTowerDataLimit==null){
|
if(devTowerDataLimit==null){
|
||||||
DevTowerDataLimit devTowerDataLimitQuery = new DevTowerDataLimit();
|
DevTowerDataLimit devTowerDataLimitQuery = new DevTowerDataLimit();
|
||||||
|
|
@ -456,11 +456,11 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/v2_ty/run/push")
|
@PostMapping("/v2_ty/run/push")
|
||||||
public AjaxResult tyPushRunData(@RequestBody @Valid TyTowerRunReqVO req) {
|
public AjaxResult tyPushRunData(@RequestBody @Valid TyTowerRunReqVO req) {
|
||||||
log.info("desApi.towerCrane.v2_ty.run.push...{}",req.getEid());
|
log.info("desApi.towerCrane.v2_ty.run.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
String deviceKey = req.getEid().toString();
|
String deviceKey = config.getDeviceSn();
|
||||||
DevTowerDataLimit devTowerDataLimit = staticLimitMap.get(deviceKey);
|
DevTowerDataLimit devTowerDataLimit = staticLimitMap.get(deviceKey);
|
||||||
if(devTowerDataLimit==null){
|
if(devTowerDataLimit==null){
|
||||||
DevTowerDataLimit devTowerDataLimitQuery = new DevTowerDataLimit();
|
DevTowerDataLimit devTowerDataLimitQuery = new DevTowerDataLimit();
|
||||||
|
|
@ -508,7 +508,7 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/tyLinux/round/push")
|
@PostMapping("/tyLinux/round/push")
|
||||||
public AjaxResult tyLinuxPushRoundData(@RequestBody @Valid TyTowerLinuxRoundReqVO req) {
|
public AjaxResult tyLinuxPushRoundData(@RequestBody @Valid TyTowerLinuxRoundReqVO req) {
|
||||||
log.info("desApi.towerCrane.tyLinux.round.push...{}",req.getEid());
|
log.info("desApi.towerCrane.tyLinux.round.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
|
|
@ -548,7 +548,7 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/v2_ty/round/push")
|
@PostMapping("/v2_ty/round/push")
|
||||||
public AjaxResult tyPushRoundData(@RequestBody @Valid TyTowerRoundReqVO req) {
|
public AjaxResult tyPushRoundData(@RequestBody @Valid TyTowerRoundReqVO req) {
|
||||||
log.info("desApi.towerCrane.v2_ty.round.push...{}",req.getEid());
|
log.info("desApi.towerCrane.v2_ty.round.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
|
|
@ -588,7 +588,7 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/tyLinux/warning/push")
|
@PostMapping("/tyLinux/warning/push")
|
||||||
public AjaxResult tyLinuxPushWarningData(@RequestBody @Valid TyTowerLinuxWarningReqVO req) {
|
public AjaxResult tyLinuxPushWarningData(@RequestBody @Valid TyTowerLinuxWarningReqVO req) {
|
||||||
log.info("desApi.towerCrane.tyLinux.warning.push...{}",req.getEid());
|
log.info("desApi.towerCrane.tyLinux.warning.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
|
|
@ -629,7 +629,7 @@ public class TowerCraneApiController {
|
||||||
@PostMapping("/v2_ty/warning/push")
|
@PostMapping("/v2_ty/warning/push")
|
||||||
public AjaxResult tyPushWarningData(@RequestBody @Valid TyTowerWarningReqVO req) {
|
public AjaxResult tyPushWarningData(@RequestBody @Valid TyTowerWarningReqVO req) {
|
||||||
log.info("desApi.towerCrane.v2_ty.warning.push...{}",req.getEid());
|
log.info("desApi.towerCrane.v2_ty.warning.push...{}",req.getEid());
|
||||||
DevTowerProjectConfig config = redisService.getCacheObject(YANZHU_DEVICE_TOWER + req.getEid());
|
DevTowerProjectConfig config = devTowerProjectConfigService.selectDevTowerProjectConfigByDeviceId(req.getEid().longValue());
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
throw new ServiceException(HttpStatusEnum.ERROR.getInfo(), HttpStatusEnum.ERROR.getCode());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,14 @@ public interface IDevTowerProjectConfigService
|
||||||
*/
|
*/
|
||||||
public DevTowerProjectConfig selectDevTowerProjectConfigById(Long id);
|
public DevTowerProjectConfig selectDevTowerProjectConfigById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据设备ID查询塔基检测配置
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return 塔基检测配置
|
||||||
|
*/
|
||||||
|
public DevTowerProjectConfig selectDevTowerProjectConfigByDeviceId(Long deviceId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询塔基检测配置列表
|
* 查询塔基检测配置列表
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,21 @@ public class DevTowerProjectConfigServiceImpl implements IDevTowerProjectConfigS
|
||||||
return devTowerProjectConfigMapper.selectDevTowerProjectConfigById(id);
|
return devTowerProjectConfigMapper.selectDevTowerProjectConfigById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据设备ID查询塔基检测配置
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return 塔基检测配置
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DevTowerProjectConfig selectDevTowerProjectConfigByDeviceId(Long deviceId)
|
||||||
|
{
|
||||||
|
DevTowerProjectConfig config = new DevTowerProjectConfig();
|
||||||
|
config.setId(deviceId);
|
||||||
|
List<DevTowerProjectConfig> configList = devTowerProjectConfigMapper.selectDevTowerProjectConfigList(config);
|
||||||
|
return CollectionUtils.isNotEmpty(configList) ? configList.get(0) : null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询塔基检测配置列表
|
* 查询塔基检测配置列表
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue