215 lines
7.5 KiB
Python
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
|
|
|