feat:android机器硬件管理接口

This commit is contained in:
dzc committed 2025-01-06 16:13:03 +08:00
1 parent f922ddf09b
commit d1db95452e
46 files changed
+1440 -316

No files matched your search

@@ -0,0 +1,26 @@
package com.bsd.pjcloud.hard.api.constant;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import javax.xml.stream.events.StartDocument;
import java.util.Arrays;
/**
* 打印状态
*/
@AllArgsConstructor
@Getter
public enum HardPrintStatusEnum {
GENERATE("1", "已生成"),
PRINT("2", "已打印"),
;
private final String type;
private final String description;
public static HardPrintStatusEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -0,0 +1,26 @@
package com.bsd.pjcloud.hard.api.constant.order;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
@AllArgsConstructor
@Getter
public enum HardOrderStatusEnum {
CREATE("1", "创建订单(未支付)"),
OFFLINE_CREATE("2", "离线创建订单(未支付)"),
PAY("5", "已经支付"),
OFFLINE_PAY("6", "没有网络本地支付"),
REFUND("10", "退款"),
CANCEL("20", "已核销"),
;
private final String type;
private final String description;
public static HardOrderStatusEnum valueOfByType(Integer type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -12,15 +12,15 @@ import java.util.Arrays;
@AllArgsConstructor
@Getter
public enum HardOrderTypeEnum {
BELOW(1, "线下购买"),
RESERVE(2, "线上订餐"),
FOREIGN_TICKET(3, "外来人员"),
STRIDE_DEPT(4, "跨单位"),
BELOW("1", "线下购买"),
RESERVE("2", "线上订餐"),
FOREIGN_TICKET("3", "外来人员"),
STRIDE_DEPT("4", "跨单位"),
;
private final Integer type;
private final String type;
private final String description;
public static HardOrderTypeEnum valueOfByType(Integer type) {
public static HardOrderTypeEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
@@ -13,19 +13,19 @@ import java.util.Arrays;
@AllArgsConstructor
@Getter
public enum HardPayTypeEnum {
WALLET_DEFAULT(1, "普通钱包支付"),
WALLET_QR_CODE(2, "钱包二维码支付"),
WALLET_CARD(3, "钱包饭卡支付"),
FACE(4, "人脸识别支付"),
STRIDE_DEPT_QR_CODE(5, "跨单位二维码支付"),
FOREIGN_TICKET_QR_CODE(6, "外来人员二维码支付"),
RESERVE_QR_CODE(7, "线上订餐二维码支付"),
CASH(8, "现金支付"),
WALLET_DEFAULT("1", "普通钱包支付"),
WALLET_QR_CODE("2", "钱包二维码支付"),
WALLET_CARD("3", "钱包饭卡支付"),
FACE("4", "人脸识别支付"),
STRIDE_DEPT_QR_CODE("5", "跨单位二维码支付"),
FOREIGN_TICKET_QR_CODE("6", "外来人员二维码支付"),
RESERVE_QR_CODE("7", "线上订餐二维码支付"),
CASH("8", "现金支付"),
;
private final Integer type;
private final String type;
private final String description;
public static HardPayTypeEnum valueOfByType(Integer type) {
public static HardPayTypeEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
@@ -0,0 +1,41 @@
package com.bsd.pjcloud.hard.api.dto.async;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class OfflineCar {
@Schema(description = "sqlite自增ID")
private Long id;
@Schema(description = "购物车的id字段")
private Long orderId;
@Schema(description = "商品id")
private Long productServiceUniqueCode;
@Schema(description = "商品名")
private String productName;
@Schema(description = "商品图片")
private String productPic;
// 商品价格(分)
@Schema(description = "商品价格(分)")
private Long productPrice;
// TODO 食堂特有
@Schema(description = "数量")
private Integer productNumber;
// TODO 超市特有
@Schema(description = "重量")
private BigDecimal productWidget;
@Schema(description = "单商品总价(分)")
private Long totalPrice;
}
@@ -0,0 +1,80 @@
package com.bsd.pjcloud.hard.api.dto.async;
import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class OfflineOrder {
@Schema(description = "sqlite自增ID")
private Long id;
@Schema(description = "android唯一code")
private String uniqueCode;
@Schema(description = "服务端唯一标识")
private String serviceUniqueCode;
@Schema(description = "平台类型")
private HardTypeEnum sysType;
@Schema(description = "用户唯一标识")
private Long userCode;
@Schema(description = "用户名")
private String username;
// 订单用餐类型:早、中、晚
private String hourType;
@Schema(description = "购物车的总金额")
private Integer price;
@Schema(description = "购物车的额外金额")
private Integer extraPrice;
@Schema(description = "结算总金额")
private Integer payPrice;
@Schema(description = "钱包id")
private Long walletId;
@Schema(description = "订单类型渠道id")
private Long orderSourceTypeId;
@Schema(description = "订单类型")
private HardOrderTypeEnum type;
@Schema(description = "订单状态")
private HardOrderStatusEnum status;
@Schema(description = "支付方式")
private HardPayTypeEnum payType;
@Schema(description = "商品描述")
private String productDesc;
// TODO 食堂特有
@Schema(description = "商品总数量")
private Integer count;
// TODO 超市特有
@Schema(description = "重量")
private Double weight;
@Schema(description = "支付时间")
private String payTime;
@Schema(description = "创建时间")
private Date createTime;
@Schema(description = "购物车列表")
private List<OfflineCar> carList;
}
@@ -0,0 +1,24 @@
package com.bsd.pjcloud.hard.api.dto.async;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class SyncOfflineReqVo {
@Schema(description = "硬件id")
@NotNull(message = "硬件id不能为空")
private Long hardwareId;
@Schema(description = "商户id")
@NotNull(message = "商户id不能为空")
private Long merchantId;
@Schema(description = "订单列表")
@NotEmpty(message = "订单列表不能为空")
private List<OfflineOrder> list;
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.hard.api.dto.hard;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class HandCancelCodeDto {
@Schema(description = "生成的订单id")
@NotNull(message = "生成的订单id不能为空")
private Long orderId;
@Schema(description = "设备id")
@NotNull(message = "设备id不能为空")
private Long hardwareId;
@Schema(description = "安卓订单code")
@NotNull(message = "安卓订单code不能为空")
private String androidOrderCode;
@Schema(description = "用户id")
private Long userId;
}
@@ -62,8 +62,6 @@ public class HardCreateOrderDto {
@Schema(description = "商品的简短描述")
private String productDesc;
private String clientIP;
private Long deptId;
@Schema(description = "离线支付是否成功")
@@ -1,8 +1,8 @@
package com.bsd.pjcloud.hard.api.dto.order;
import com.bsd.pjcloud.hard.api.entity.order.HardwareOrderEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import lombok.Data;
@Data
public class HardOrderDto extends HardwareOrderEntity {
public class HardOrderDto extends HardOrderEntity {
}
@@ -3,8 +3,7 @@ package com.bsd.pjcloud.hard.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.*;
import com.bsd.pjcloud.common.core.util.TenantTable;
import java.time.LocalDateTime;
@@ -14,6 +13,9 @@ import java.time.LocalDateTime;
* @author dzc
* @date 2025-01-05 14:17:32
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@TenantTable
@TableName("hard_invoice")
@@ -60,7 +60,7 @@ public class HardCarEntity extends Model<HardCarEntity> {
* 商品价格
*/
@Schema(description="商品价格")
private Long productPrice;
private Integer productPrice;
/**
* 数量
@@ -3,8 +3,7 @@ package com.bsd.pjcloud.hard.api.entity.order;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.*;
import com.bsd.pjcloud.common.core.util.TenantTable;
import java.time.LocalDateTime;
@@ -14,12 +13,15 @@ import java.time.LocalDateTime;
* @author dzc
* @date 2025-01-05 16:46:25
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@TenantTable
@TableName("hardware_order")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "订单表")
public class HardwareOrderEntity extends Model<HardwareOrderEntity> {
public class HardOrderEntity extends Model<HardOrderEntity> {
/**
@@ -0,0 +1,229 @@
package com.bsd.pjcloud.hard.api.utils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class Drawing2D {
/**
* start ****************** config ****************** start
*/
private Graphics2D graphics;
private BufferedImage canvas;
/**
* 固定尺寸
* static int mm58 = 384;
* static const mm80_Old = 500;
* static const mm80 = 570;
*/
private final int canvasWidth = 340;
private final int canvasHeight = 200;
private int currentWidth = canvasWidth;
private int currentHeight = canvasHeight;
private final int horizontalPadding = 20;
private final String fontFamily = "宋体";
/**
* end ****************** config ****************** end
*/
private int currentY = 0;
private int getCurrentY() {
computedHeight();
int size = graphics.getFont().getSize();
FontMetrics metrics = graphics.getFontMetrics(graphics.getFont());
int lineHeight = metrics.getHeight();
int offset = (lineHeight - size) / 2;
return currentY + offset;
}
private int[] getPaddingX() {
return new int[]{horizontalPadding, canvasWidth - horizontalPadding};
}
public Drawing2D() {
canvas = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB);
graphics = canvas.createGraphics();
// 设置背景颜色为白色
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, canvasWidth, canvasHeight);
}
// 虚线
public Drawing2D drawingDottedLine() {
return drawingDottedLine(5);
}
public Drawing2D drawingDottedLine(int padding) {
if (padding != 0) currentY += padding;
float[] dashPattern = {10f, 5f};
Stroke dashedStroke = new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0f, dashPattern, 0f);
graphics.setStroke(dashedStroke);
graphics.setColor(Color.BLACK);
currentY += 5;
int y = getCurrentY();
graphics.drawLine(0, y, canvasWidth, y);
if (padding != 0) currentY += padding;
return this;
}
public Drawing2D drawingText(String str) {
textPadding();
computedLineHeight();
graphics.drawString(str, 0, getCurrentY());
textPadding();
return this;
}
public Drawing2D drawingCenterText(String str) {
textPadding();
computedLineHeight();
Point point = centerPosition(str);
graphics.drawString(str, point.x, getCurrentY());
textPadding();
return this;
}
public Drawing2D drawingRowText(String leftStr, String rightStr) {
textPadding();
computedLineHeight();
FontMetrics metrics = graphics.getFontMetrics(graphics.getFont());
int leftTextWidth = metrics.stringWidth(leftStr);
int rightTextWidth = metrics.stringWidth(rightStr);
int y = getCurrentY();
graphics.drawString(leftStr, 0, y);
graphics.drawString(rightStr, canvasWidth - rightTextWidth, y);
textPadding();
return this;
}
public Drawing2D drawingRowText(String str1, String str2, String str3) {
textPadding();
computedLineHeight();
int y = getCurrentY();
int width = canvasWidth / 3;
FontMetrics metrics = graphics.getFontMetrics(graphics.getFont());
int str1Width = metrics.stringWidth(str1);
int str2Width = metrics.stringWidth(str2);
int str3Width = metrics.stringWidth(str3);
int str1x = 0;
int str2x = width + (width - str2Width) / 2;
int str3x = width * 2 + (width - str3Width);
graphics.drawString(str1, str1x, y);
graphics.drawString(str2, str2x, y);
graphics.drawString(str3, str3x, y);
textPadding();
return this;
}
public Drawing2D setTitleTextStyle() {
graphics.setColor(Color.BLACK);
graphics.setFont(new Font(fontFamily, Font.BOLD, 24));
return this;
}
public Drawing2D setDefaultStyle() {
graphics.setColor(Color.BLACK);
graphics.setFont(new Font(fontFamily, Font.PLAIN, 20));
return this;
}
public InputStream getInputStream() throws IOException {
drawingWhiteSide();
graphics.dispose();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ImageIO.write(canvas, "png", bytes);
bytes.flush();
byte[] imageBytes = bytes.toByteArray();
bytes.close();
return new ByteArrayInputStream(imageBytes);
}
public byte[] getBytes() throws IOException {
drawingWhiteSide();
graphics.dispose();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ImageIO.write(canvas, "png", bytes);
bytes.flush();
byte[] imageBytes = bytes.toByteArray();
bytes.close();
return imageBytes;
}
// 计算居中的x,y
private Point centerPosition(String str) {
FontMetrics metrics = graphics.getFontMetrics(graphics.getFont());
int textWidth = metrics.stringWidth(str);
int textHeight = metrics.getHeight();
// 中心X坐标
int x = (canvasWidth - textWidth) / 2;
// 中心Y坐标
int y = (currentHeight - textHeight) / 2 + metrics.getAscent();
return new Point(x, y);
}
private void drawingWhiteSide() {
int borderSize = 15;
BufferedImage borderedCanvas = new BufferedImage(currentWidth + borderSize * 2, currentHeight + borderSize * 2, BufferedImage.TYPE_INT_RGB);
Graphics2D g2dBordered = borderedCanvas.createGraphics();
g2dBordered.setColor(Color.WHITE);
g2dBordered.fillRect(0, 0, borderedCanvas.getWidth(), borderedCanvas.getHeight());
g2dBordered.drawImage(canvas, borderSize, borderSize, null);
graphics = g2dBordered;
canvas = borderedCanvas;
}
private void computedHeight() {
Font font = graphics.getFont();
FontMetrics metrics = graphics.getFontMetrics(font);
int height = currentY + metrics.getAscent();
if (height <= currentHeight) return;
graphics.dispose();
currentHeight = height + metrics.getAscent();
BufferedImage newCanvas = new BufferedImage(currentWidth, currentHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D newGraphics = newCanvas.createGraphics();
newGraphics.setColor(Color.WHITE);
newGraphics.fillRect(0, 0, newCanvas.getWidth(), newCanvas.getHeight());
newGraphics.drawImage(canvas, 0, 0, null);
canvas = newCanvas;
newGraphics.setColor(graphics.getColor());
newGraphics.setFont(graphics.getFont());
graphics = newGraphics;
}
private void textPadding() {
currentY += 10;
}
private void computedLineHeight() {
int size = graphics.getFont().getSize();
FontMetrics metrics = graphics.getFontMetrics(graphics.getFont());
int lineHeight = metrics.getHeight();
int offset = (lineHeight - size) / 2;
currentY += size + offset;
}
}
@@ -7,8 +7,10 @@ import lombok.Data;
@Data
public class HardInvoiceVo extends HardInvoiceEntity implements BaseDeptInterface, BaseMchInterface {
private String deptName;
private Long merchantId;
private String merchantName;
}
@@ -1,8 +1,8 @@
package com.bsd.pjcloud.hard.api.vo.order;
import com.bsd.pjcloud.hard.api.entity.order.HardwareOrderEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import lombok.Data;
@Data
public class HardOrderVo extends HardwareOrderEntity {
public class HardOrderVo extends HardOrderEntity {
}