diff --git a/apps/cm/coder.py b/apps/cm/coder.py index b267ab75..cbb86f95 100644 --- a/apps/cm/coder.py +++ b/apps/cm/coder.py @@ -42,14 +42,23 @@ class CoderClient: raise CoderError(f"打码器返回失败: {resp!r}") raise CoderError(f"打码器响应不识别: {resp!r}") + @staticmethod + def _encode_payload(value: str, label: str) -> bytes: + if any(c in value for c in ("\x02", "\x03", "\x0a")): + raise CoderError(f"{label}含控制字符(STX/ETX/LF), 会破坏帧结构") + try: + return value.encode("latin-1") + except UnicodeEncodeError as e: + raise CoderError(f"{label}含喷码机不支持的字符: {e}") + def update_field(self, field_name: str, content: str) -> bool: """更新用户区: 02 55 0A 03""" - frame = STX + b"\x55" + field_name.encode("ascii") + LF + content.encode("ascii") + ETX + frame = STX + b"\x55" + self._encode_payload(field_name, "用户区名") + LF + self._encode_payload(content, "喷印内容") + ETX return self._check_ack(self._send(frame)) def select_message(self, message_name: str) -> bool: """选择信息: 02 4D 03""" - frame = STX + b"\x4d" + message_name.encode("ascii") + ETX + frame = STX + b"\x4d" + self._encode_payload(message_name, "信息名") + ETX return self._check_ack(self._send(frame)) def get_status(self) -> bytes: diff --git a/apps/cm/migrations/0008_labeltemplate_coder_field.py b/apps/cm/migrations/0008_labeltemplate_coder_field.py new file mode 100644 index 00000000..df87507c --- /dev/null +++ b/apps/cm/migrations/0008_labeltemplate_coder_field.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cm', '0007_labeltemplate_coder'), + ] + + operations = [ + migrations.AddField( + model_name='labeltemplate', + name='coder_field', + field=models.CharField(default='1', max_length=32, verbose_name='打码器用户区名'), + ), + ] diff --git a/apps/cm/models.py b/apps/cm/models.py index 9fe98f11..315eb27c 100644 --- a/apps/cm/models.py +++ b/apps/cm/models.py @@ -24,6 +24,7 @@ class LabelTemplate(BaseModel): process_json = models.JSONField("工序", default=list, blank=True) coder_ip = models.GenericIPAddressField("打码器IP", null=True, blank=True) coder_port = models.PositiveIntegerField("打码器端口", default=3100) + coder_field = models.CharField("打码器用户区名", max_length=32, default="1") @classmethod def gen_commands(cls, label_template, label_template_name, tdata): diff --git a/apps/cm/views.py b/apps/cm/views.py index cf472190..b8e562d8 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -130,7 +130,7 @@ class LabelTemplateViewSet(CustomModelViewSet): ip = vdata.get("coder_ip") or lt.coder_ip port = vdata.get("coder_port") or lt.coder_port - field = vdata.get("coder_field") or "1" + field = vdata.get("coder_field") or lt.coder_field or "1" if not ip: raise ParseError("模板未配置打码器IP, 也未在请求中提供 coder_ip")