Bladeren bron

Merge remote-tracking branch 'origin/anheng' into anheng

panqiuyao 3 uur geleden
bovenliggende
commit
a6131e110c
3 gewijzigde bestanden met toevoegingen van 79 en 0 verwijderingen
  1. 35 0
      python/service/online_request/module_online_data.py
  2. 3 0
      python/settings.py
  3. 41 0
      python/sockets/message_handler.py

+ 35 - 0
python/service/online_request/module_online_data.py

@@ -11,6 +11,41 @@ from logger import logger
 
 
 # logger = logging.getLogger(__name__)
+class CategoryLink:
+    """分类关联线上请求类"""
+
+    def __init__(self, token):
+        self.s = requests.session()
+        self.token = token
+        self.post_headers = {
+            "Authorization": token,
+        }
+
+    def get_category_name(self, upc):
+        """
+        通过upc条码获取线上分类关联的分类名称
+        接口: GET /api/ai_image/camera_machine/category_links?upc=xxx
+        :param upc: 商品条码
+        :return: 成功返回data下的categoryName;code不为0或请求异常返回None
+        """
+        url = "{domain}/api/ai_image/camera_machine/category_links?upc={upc}".format(
+            domain=settings.DOMAIN, upc=upc
+        )
+        try:
+            response = self.s.get(url=url, headers=self.post_headers, timeout=15)
+            response_data = response.json()
+            print("get_category_name<====>", upc, response_data)
+            code = response_data.get("code", -1)
+            # code不为0视为失败,返回None
+            if code != 0:
+                logger.info(f"获取分类关联失败: code={code}, message={response_data.get('message', '')}")
+                return None
+            category_name = response_data.get("data", {}).get("categoryName", None)
+            return category_name
+        except Exception as e:
+            logger.error(f"获取分类关联请求异常: upc={upc}, error={str(e)}")
+            return None
+
 
 class JsonEncoder(json.JSONEncoder):
     """Convert numpy classes to JSON serializable objects."""

+ 3 - 0
python/settings.py

@@ -221,6 +221,9 @@ HLM_HOST = config.get("log", "hlm_host")
 PROJECT = config.get("app", "project")
 # 电子秤配置名称
 SCALE_NAME = config.get("electronic_scale", "scale_name")
+
+#
+APPENV = config.get("app", "env")
 # ----------------------------------
 mcu_config_dict = config.items("mcu_config")
 _mcu_config_dict = {}

+ 41 - 0
python/sockets/message_handler.py

@@ -14,6 +14,7 @@ from service.base import check_move_goods_art_no_folder
 from service.deal_image import DealImage
 import settings
 from middleware import UnicornException
+from service.online_request.module_online_data import CategoryLink
 from concurrent.futures import ThreadPoolExecutor
 from functools import partial
 from logger import logger
@@ -24,6 +25,40 @@ from mcu.one_data_set_control import OneDataSet
 executor = ThreadPoolExecutor(max_workers=4)
 
 
+def get_tab_id_by_category(session, goods_art_no, default_tab_id):
+    """
+    通过货号请求线上分类,匹配sys_configs中key=category_links的配置来替换tab_id
+    :param session: 数据库会话
+    :param goods_art_no: 货号
+    :param default_tab_id: 默认tab_id(action_configs中的原值)
+    :return: 匹配到的tab_id;分类为空或未匹配到时返回default_tab_id
+    """
+    try:
+        # 请求线上接口,通过货号匹配分类名称
+        category_link = CategoryLink("Bearer " + (settings.USER_TOKEN or ""))
+        category_name = category_link.get_category_name(goods_art_no)
+        # 分类名称为空,继续使用上一行的tab_id
+        if not category_name:
+            return default_tab_id
+        # 读取sys_configs中category_links配置,格式:[{"category_name":"","tab_name":"","tab_id":123}]
+        sys_configs = CRUD(SysConfigs)
+        item = sys_configs.read(session, conditions={"key": "category_links"})
+        if item == None:
+            return default_tab_id
+        links = json.loads(item.value)
+        for link in links:
+            # 分类名称匹配成功,用配置中的tab_id覆盖上一行变量
+            if link.get("category_name") == category_name:
+                print("分类关联匹配成功:", category_name, "->", link.get("tab_id"))
+                return link.get("tab_id")
+        # 未匹配到分类,继续使用上一行的tab_id
+        return default_tab_id
+    except Exception as e:
+        # 异常不影响拍摄流程,回退到默认tab_id
+        logger.error(f"匹配分类关联异常: goods_art_no={goods_art_no}, error={str(e)}")
+        return default_tab_id
+
+
 async def handlerCutOut(
         manager=None, run_main=None, config_data={}, websocket=None, msg_type=""
 ):
@@ -280,6 +315,7 @@ async def handlerSend(
             msg_type = "run_mcu"
             action_info = data.get("action", "执行左脚程序")
             goods_art_no = data.get("goods_art_no", None)
+            company_id = data.get("company_id", None)
             weight = data.get("weight", None)
             goods_art_no = goods_art_no.strip()
             if goods_art_no == None or goods_art_no == "":
@@ -306,6 +342,11 @@ async def handlerSend(
             if "右" in action_info:
                 action_flag = "right"
             tab_id = action_configs_json.get(action_flag)
+            # 指定企业开启分类关联匹配:dev环境-安恒(34398);prod环境-45064
+            # 通过货号匹配线上分类关联(category_links),匹配成功则覆盖tab_id,否则沿用默认tab_id
+            category_company_map = {"dev": 34398, "prod": 45064}
+            if company_id == category_company_map.get(settings.APPENV):
+                tab_id = get_tab_id_by_category(session, goods_art_no, tab_id)
             photoRecord = CRUD(PhotoRecord)
             goods_art_record = photoRecord.read(
                 session, conditions={"goods_art_no": goods_art_no, "delete_time": None}