Files
inventory_check_lark/inventory_check_lark/models.py
2025-06-13 19:57:34 +08:00

215 lines
7.5 KiB
Python

# -*- coding: utf-8 -*-
"""
:author: luffmims
:url: http://yum2.cc
:copyright: © 2025 luffmims <luffmims@hotmaill.com>
:license: MIT, see LICENSE for more details.
"""
# from datetime import datetime
from inventory_check_lark import application, db
import json
import time
import lark_oapi as lark
from lark_oapi.api.auth.v3 import *
from lark_oapi.api.bitable.v1 import *
class Inventory(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
tag = db.Column(db.Text)
amount = db.Column(db.Integer)
checked = db.Column(db.Boolean, default=False)
recordid = db.Column(db.Text)
tableid = db.Column(db.Text)
# lasttime = db.Column(db.DateTime, default=datetime.now())
# client = lark.Client.builder() \
# .app_id(application.config['LARK_APP_ID']) \
# .app_secret(application.config['LARK_APP_SECRECT']) \
# .log_level(lark.LogLevel.DEBUG) \
# .build()
client = lark.Client.builder() \
.app_id(application.config['LARK_APP_ID']) \
.app_secret(application.config['LARK_APP_SECRECT']) \
.build()
TIMER = time.time()
def get_access_token():
# 构造请求对象
request: InternalAppAccessTokenRequest = InternalAppAccessTokenRequest.builder() \
.request_body(InternalAppAccessTokenRequestBody.builder()
.app_id(application.config['LARK_APP_ID'])
.app_secret(application.config['LARK_APP_SECRECT'])
.build()) \
.build()
# 发起请求
response: InternalAppAccessTokenResponse = client.auth.v3.app_access_token.internal(request)
# 处理失败返回
# if not response.success():
# lark.logger.error(
# f"client.auth.v3.app_access_token.internal failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}, resp: \n{json.dumps(json.loads(response.raw.content), indent=4, ensure_ascii=False)}")
# return
if not response.success():
return False
return True
# # 处理业务结果
# res = eval(response.raw.content)
# return {"access_token": res["tenant_access_token"], "expire": res["expire"], "code": res["code"]}
def get_table_record(id, page_token=None):
global TIMER
if time.time() - TIMER > 7000:
get_access_token()
TIMER = time.time()
# 构造请求对象
if page_token:
request: SearchAppTableRecordRequest = SearchAppTableRecordRequest.builder() \
.app_token(application.config['LARK_TB_TOKEN']) \
.table_id(id['table_id']) \
.page_token(page_token) \
.page_size(50) \
.request_body(SearchAppTableRecordRequestBody.builder()
.view_id(id['view_id'])
.field_names(["规格", "外库数量", "排序", "已盘"])
.sort([Sort.builder()
.field_name("排序")
.desc(False)
.build()
])
.automatic_fields(True)
.build()) \
.build()
else:
request: SearchAppTableRecordRequest = SearchAppTableRecordRequest.builder() \
.app_token(application.config['LARK_TB_TOKEN']) \
.table_id(id['table_id']) \
.page_size(50) \
.request_body(SearchAppTableRecordRequestBody.builder()
.view_id(id['view_id'])
.field_names(["规格", "外库数量", "排序", "已盘"])
.sort([Sort.builder()
.field_name("排序")
.desc(True)
.build()
])
.automatic_fields(True)
.build()) \
.build()
# 发起请求
response: SearchAppTableRecordResponse = client.bitable.v1.app_table_record.search(request)
# 处理失败返回
if not response.success():
lark.logger.error(
f"client.bitable.v1.app_table_record.search failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}, resp: \n{json.dumps(json.loads(response.raw.content), indent=4, ensure_ascii=False)}")
return
rep = json.loads(response.raw.content)
res = []
page_token = None
if rep['data']['has_more']:
page_token = rep['data']['page_token']
else:
page_token = None
for i in rep['data']['items']:
if '已盘' in i['fields']:
cd = i['fields']['已盘']
else:
cd = False
res.append({
"sort": int(i['fields']['排序']),
"tag": i['fields']['规格'][0]['text'],
"amount": int(i['fields']['外库数量']) if '外库数量' in i['fields'] else 0,
"checked": cd,
"recordid": i['record_id'],
})
return res, page_token
def update_record(id, recordid, amount):
global TIMER
if time.time() - TIMER > 200:
get_access_token()
TIMER = time.time()
# 构造请求对象
request: UpdateAppTableRecordRequest = UpdateAppTableRecordRequest.builder() \
.app_token(application.config['LARK_TB_TOKEN']) \
.table_id(id) \
.record_id(recordid) \
.request_body(AppTableRecord.builder()
.fields({"已盘":True,"外库数量":amount})
.build()) \
.build()
# 发起请求
response: UpdateAppTableRecordResponse = client.bitable.v1.app_table_record.update(request)
# 处理失败返回
# if not response.success():
# lark.logger.error(
# f"client.bitable.v1.app_table_record.update failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}, resp: \n{json.dumps(json.loads(response.raw.content), indent=4, ensure_ascii=False)}")
# return
if not response.success():
return False
# 处理业务结果
# lark.logger.info(lark.JSON.marshal(response.raw.content, indent=4))
return True
def init_db():
get_access_token()
with application.app_context():
db.drop_all()
db.create_all()
youxin, page_token= get_table_record(application.config['YOUXIN_ID'])
for i in youxin:
inv = Inventory()
inv.tag = i['tag']
inv.amount = i['amount']
inv.checked = i['checked']
inv.recordid = i['recordid']
inv.tableid = application.config['YOUXIN_ID']['table_id']
db.session.add(inv)
while page_token:
youxin, page_token = get_table_record(application.config['YOUXIN_ID'], page_token)
if not youxin:
break
for i in youxin:
inv = Inventory()
inv.tag = i['tag']
inv.amount = i['amount']
inv.checked = i['checked']
inv.recordid = i['recordid']
inv.tableid = application.config['YOUXIN_ID']['table_id']
db.session.add(inv)
waimo, page_token= get_table_record(application.config['WAIMO_ID'])
for i in waimo:
inv = Inventory()
inv.tag = i['tag']
inv.amount = i['amount']
inv.checked = i['checked']
inv.recordid = i['recordid']
inv.tableid = application.config['WAIMO_ID']['table_id']
db.session.add(inv)
while page_token:
waimo, page_token = get_table_record(application.config['WAIMO_ID'], page_token)
if not waimo:
break
for i in waimo:
inv = Inventory()
inv.tag = i['tag']
inv.amount = i['amount']
inv.checked = i['checked']
inv.recordid = i['recordid']
inv.tableid = application.config['WAIMO_ID']['table_id']
db.session.add(inv)
db.session.commit()
return True