Compare commits

..

3 Commits

5 changed files with 99 additions and 37 deletions

View File

@@ -52,7 +52,10 @@
"Bash(identify:*)",
"WebFetch(domain:github.com)",
"Bash(file:*)",
"Bash(xargs:*)"
"Bash(xargs:*)",
"Bash(unzip:*)",
"WebFetch(domain:gainscha.github.io)",
"WebFetch(domain:m.gainscha.com)"
],
"deny": [],
"ask": []

11
.gitignore vendored
View File

@@ -192,3 +192,14 @@ fabric.properties
# End of https://www.toptal.com/developers/gitignore/api/androidstudio,gradle,java,kotlin
.vfox/
# Auto Claude data directory
.auto-claude/
# Auto Claude generated files
.auto-claude-security.json
.auto-claude-status
.claude_settings.json
.worktrees/
.security-key
logs/security/

View File

@@ -1,7 +1,6 @@
package com.lukouguoji.module_base.util
import android.Manifest
import android.graphics.Typeface
import com.gainscha.sdk2.ConnectType
import com.gainscha.sdk2.ConnectionListener
import com.gainscha.sdk2.Printer
@@ -334,9 +333,9 @@ object PrinterUtils {
merged = CellData("集装器编号:", "ULD NO.:", bean.uld)
))
// 第4行件数 | 重量
// 第4行件数 | 重量件数value暂不打印
rows.add(GridRow(
left = CellData("件数:", "PIECES:", bean.pieces.ifEmpty { "0" }),
left = CellData("件数:", "PIECES:", ""),
right = CellData("重量:", "GROSS WEIGHT:", bean.totalWeight.toInt().toString())
))
@@ -360,7 +359,8 @@ object PrinterUtils {
addSize(100, 100)
addGap(3)
addCls()
addTextByBitmap(150, 80, 0, 110, "合肥新桥国际机场", Typeface.DEFAULT)
// 使用 addText 替代 addTextByBitmap避免 fimage 依赖问题
addText(150, 80, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
// 表格横线
for (i in 0 until 5) {
addBar(gridStartX, gridStartY + (i * gridItemHeight), gridWidth, 2)
@@ -403,7 +403,8 @@ object PrinterUtils {
addSize(100, 100)
addGap(3)
addCls()
addTextByBitmap(80, 80, 0, 130, "合肥新桥国际机场", Typeface.DEFAULT)
// 使用 addText 替代 addTextByBitmap避免 fimage 依赖问题
addText(80, 80, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
// 表格横线
for (i in 0 until 9) {
addBar(gridStartX, gridStartY + (i * gridItemHeight), gridWidth, 2)
@@ -449,17 +450,18 @@ object PrinterUtils {
*/
private fun printMergedGrid(rows: ArrayList<GridRow>) {
val gridStartX = 30
val gridStartY = 250
val gridStartY = 200
val columnWidth = 570
val rowHeight = 240
val rowHeight = 180 // 减小行高,适应较小字体
val gridWidth = columnWidth * 2
val gridHeight = rowHeight * rows.size
val bytes = Tspl().apply {
addSize(100, 100)
addGap(3)
addCls()
addTextByBitmap(80, 80, 0, 130, "合肥新桥国际机场", Typeface.DEFAULT)
// 标题居中8个字 * 72像素/字 = 576像素宽居中X = 30 + (1140-576)/2 = 312
val titleX = gridStartX + (gridWidth - 576) / 2
addText(titleX, 60, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
// 绘制表格横线
for (i in 0..rows.size) {
@@ -479,9 +481,7 @@ object PrinterUtils {
}
// 右边线(总是绘制)
if (rowIndex == rows.size - 1) {
addBar(gridStartX + gridWidth, yTop, 2, rowHeight)
}
addBar(gridStartX + gridWidth, yTop, 2, rowHeight)
}
// 填充单元格内容
@@ -492,17 +492,18 @@ object PrinterUtils {
// 合并单元格
renderCell(
cell = row.merged,
x = gridStartX + 30,
x = gridStartX + 20,
y = yBase,
cellWidth = gridWidth,
cellHeight = rowHeight
cellHeight = rowHeight,
isMerged = true
)
} else {
// 左列单元格
row.left?.let { cell ->
renderCell(
cell = cell,
x = gridStartX + 30,
x = gridStartX + 20,
y = yBase,
cellWidth = columnWidth,
cellHeight = rowHeight
@@ -512,7 +513,7 @@ object PrinterUtils {
row.right?.let { cell ->
renderCell(
cell = cell,
x = gridStartX + columnWidth + 30,
x = gridStartX + columnWidth + 20,
y = yBase,
cellWidth = columnWidth,
cellHeight = rowHeight
@@ -532,37 +533,43 @@ object PrinterUtils {
* @param cell 单元格数据
* @param x 起始X坐标
* @param y 起始Y坐标
* @param cellWidth 单元格宽度(用于计算右侧对齐)
* @param cellHeight 单元格高度(用于计算垂直居中)
* @param cellWidth 单元格宽度
* @param cellHeight 单元格高度
* @param isMerged 是否为合并单元格
*/
private fun Tspl.renderCell(
cell: CellData,
x: Int,
y: Int,
cellWidth: Int,
cellHeight: Int
cellHeight: Int,
isMerged: Boolean = false
) {
// 左上角:中文标签和英文标签
val titleY = y + 30 // 中文标签Y位置
val subtitleY = y + 80 // 英文标签Y位置中文下方
// 字体大小配置
val titleSize = 2 // 中文标签字体倍数
val subtitleSize = 1 // 英文标签字体倍数
val valueSize = 2 // 值字体倍数
// 中文标签(大字,左上
addText(x, titleY, Tspl.FONT_TSS24, 0, 3, 3, cell.title)
// Y坐标配置基于24点阵字体size=2约48像素高size=1约24像素高
val titleY = y + 15 // 中文标签Y位置
val subtitleY = titleY + 70 // 英文标签Y位置中文下方间距加大
val valueY = y + (cellHeight / 2) - 24 // 值垂直居中
// 文标签(小字,左上)
addText(x, subtitleY, Tspl.FONT_TSS24, 0, 2, 2, cell.subtitle)
// 文标签
addText(x, titleY, Tspl.FONT_TSS24, 0, titleSize, titleSize, cell.title)
// 右侧:值(大字,垂直居中)
// 计算垂直居中的Y坐标y + (cellHeight / 2) - (文字高度 / 2)
// 假设size=3的文字高度约为80像素
val valueY = y + (cellHeight / 2) - 40 // 垂直居中
// 英文标签
addText(x, subtitleY, Tspl.FONT_TSS24, 0, subtitleSize, subtitleSize, cell.subtitle)
// 计算右侧X坐标中文标签宽度 + 间距
// 假设"目的站:"宽度约为180像素"DESTINATION:"宽度约为240像素
val valueX = x + 280 // 右侧偏移量
// 计算value的X坐标根据英文标签长度动态调整
// 合并单元格(如集装器编号)使用更大的间距
val extraGap = if (isMerged) 80 else 50
val minOffset = if (isMerged) 280 else 220
val labelWidth = cell.subtitle.length * 12 + extraGap
val valueX = x + maxOf(labelWidth, minOffset)
// 值(大字,垂直居中,右侧
addText(valueX, valueY, Tspl.FONT_TSS24, 0, 3, 3, cell.value)
// 值(垂直居中)
addText(valueX, valueY, Tspl.FONT_TSS24, 0, valueSize, valueSize, cell.value)
}
fun printTest() {

View File

@@ -1,6 +1,7 @@
package com.lukouguoji.gjc.holder
import android.view.View
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.activity.GjcBoxWeighingDetailsActivity
import com.lukouguoji.gjc.databinding.ItemGjcBoxWeighingBinding
import com.lukouguoji.module_base.base.BaseViewHolder
@@ -16,9 +17,24 @@ class GjcBoxWeighingViewHolder(view: View) :
val bean = getItemBean(item)!!
binding.bean = bean
// 更新图标状态
updateIcon(bean)
// 图标点击切换选中状态
binding.ivIcon.setOnClickListener {
bean.checked.set(!bean.checked.get())
updateIcon(bean)
}
// 整行点击跳转到详情页
binding.ll.setOnClickListener {
GjcBoxWeighingDetailsActivity.start(it.context, bean.useId)
}
}
private fun updateIcon(bean: GjcUldUseBean) {
binding.ivIcon.setImageResource(
if (bean.checked.get()) R.drawable.img_plane_s else R.drawable.img_plane
)
}
}

View File

@@ -6,12 +6,17 @@ import androidx.lifecycle.MutableLiveData
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.holder.GjcBoxWeighingViewHolder
import com.lukouguoji.module_base.base.BasePageViewModel
import com.lukouguoji.module_base.bean.GjcUldUseBean
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.http.net.NetApply
import com.lukouguoji.module_base.ktx.commonAdapter
import com.lukouguoji.module_base.ktx.launchCollect
import com.lukouguoji.module_base.ktx.launchLoadingCollect
import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.ktx.toRequestBody
import com.lukouguoji.module_base.model.BluetoothDialogModel
import com.lukouguoji.module_base.model.ScanModel
import com.lukouguoji.module_base.util.PrinterUtils
import dev.utils.common.DateUtils
import com.lukouguoji.module_base.ktx.formatDate
@@ -73,7 +78,27 @@ class GjcBoxWeighingViewModel : BasePageViewModel() {
* 挂签打印按钮点击
*/
fun printClick() {
// TODO: 实现挂签打印功能
// 获取列表中选中的记录
val list = pageModel.rv?.commonAdapter()?.items as? List<GjcUldUseBean> ?: return
val selectedItems = list.filter { it.isSelected }
// 校验未选择
if (selectedItems.isEmpty()) {
showToast("请选择要打印的数据")
return
}
// 校验多选
if (selectedItems.size > 1) {
showToast("只能选择一条记录进行打印")
return
}
// 执行打印
val bean = selectedItems.first()
BluetoothDialogModel().showCallBack {
PrinterUtils.printGjcBoxWeighing(bean)
}
}
/**