feat: send_to_coder 统一走 CQI+JDI 队列, 单/批共用 tdata_list

- 入参只接 tdata_list (列表, 至少一条), 单条就是长度=1
- 每次先 CQI 清队列, 再按顺序 JDI 入 N 条
- 一次光电触发消费一条, 与"一行=一个产品"的业务语义对齐
- 不再保留单条 tdata, 开发期清理掉

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-05-18 15:57:21 +08:00
parent 2b3aaf8879
commit 99e2909514
2 changed files with 24 additions and 18 deletions

View File

@ -18,7 +18,7 @@ class Tid2Serializer(serializers.Serializer):
class CoderSendSerializer(serializers.Serializer):
tdata = serializers.JSONField(label='模板数据', required=False, default=dict)
tdata_list = serializers.ListField(child=serializers.JSONField(), label='模板数据列表', allow_empty=False)
coder_ip = serializers.IPAddressField(label='喷码IP')
coder_port = serializers.IntegerField(label='喷码端口', required=False, allow_null=True)
coder_field = serializers.CharField(label='默认用户区名', required=False, allow_null=True)

View File

@ -118,11 +118,13 @@ class LabelTemplateViewSet(CustomModelViewSet):
@action(methods=["post"], detail=True, serializer_class=CoderSendSerializer, perms_map={"post": "*"})
def send_to_coder(self, request, pk=None, *args, **kwargs):
"""
下发指令到伟迪捷 1880 喷码机
下发指令到伟迪捷 1880 喷码机 (统一走 CQI + JDI 队列模式)
按模板 commands tdata 格式化后, 解析为 <字段>=<内容> , 合并成单帧 JDA 下发
body tdata_list (列表, 至少一条), 每条对应一个产品
每次调用先 CQI 清空队列, 再按顺序 JDI 入队 N ;
喷码机每个外部触发(光电)消费一条, 喷一个产品
每条 tdata 走模板 commands, 解析为 <字段>=<内容> 合并成一帧 JDI;
commands 中不含 '=' 的元素, 会绑定到默认 coder_field
IP/端口/字段全部由请求 body 提供
"""
sr = CoderSendSerializer(data=request.data)
sr.is_valid(raise_exception=True)
@ -133,10 +135,11 @@ class LabelTemplateViewSet(CustomModelViewSet):
port = vdata.get("coder_port") or 3100
field = vdata.get("coder_field") or "1"
commands = LabelTemplate.gen_commands(lt.id, None, vdata.get("tdata") or {})
batched = []
for tdata in vdata["tdata_list"]:
commands = LabelTemplate.gen_commands(lt.id, None, tdata)
if not commands:
raise ParseError("模板未生成任何指令")
fields = {}
for item in commands:
text = str(item)
@ -145,7 +148,10 @@ class LabelTemplateViewSet(CustomModelViewSet):
fields[k.strip()] = v
else:
fields[field] = text
batched.append(fields)
client = CoderClient(ip=ip, port=port)
client.update_fields(fields)
return Response({"sent": fields, "ip": ip, "port": port})
client.clear_queue()
for fields in batched:
client.push_queue(fields)
return Response({"queued": len(batched), "fields": batched, "ip": ip, "port": port})