130 lines
4.2 KiB
JavaScript
130 lines
4.2 KiB
JavaScript
|
|
const { getTenantAccessToken } = require('./lib/auth');
|
|||
|
|
|
|||
|
|
const APP_TOKEN = 'LvlAbvfzMaxUP8sGOEWcLrX7nHb';
|
|||
|
|
const TABLE_ID = 'tblLy7koY2VGXGmR'; // From inspect_meta.js
|
|||
|
|
|
|||
|
|
async function setup() {
|
|||
|
|
const token = await getTenantAccessToken();
|
|||
|
|
console.log(`Setting up Iter 11 (App: ${APP_TOKEN}, Table: ${TABLE_ID})`);
|
|||
|
|
|
|||
|
|
// 1. Create Fields
|
|||
|
|
// Field: 需求 (Text - Type 1)
|
|||
|
|
await createField(token, '需求', 1);
|
|||
|
|
|
|||
|
|
// Field: 需求详述 (Text - Type 1)
|
|||
|
|
await createField(token, '需求详述', 1);
|
|||
|
|
|
|||
|
|
// Field: 优先级 (Single Select - Type 3)
|
|||
|
|
const options = [
|
|||
|
|
{ name: '上帝级重要', color: 0 }, // Red
|
|||
|
|
{ name: '很重要', color: 1 }, // Orange
|
|||
|
|
{ name: '重要', color: 2 }, // Yellow
|
|||
|
|
{ name: '欠重要', color: 3 }, // Green
|
|||
|
|
{ name: '待定', color: 4 } // Blue
|
|||
|
|
];
|
|||
|
|
await createField(token, '优先级', 3, { options: options });
|
|||
|
|
|
|||
|
|
// 2. Insert Records
|
|||
|
|
const records = [
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '获取行为和生活职业的结合',
|
|||
|
|
'需求详述': 'a. 当前获取行为不受生活职业的限制\nb. 炼药、烹饪行为因为和获取高度相关,还未完成开发\nc. 无法获取的道具走总控给其他NPC制作功能没做',
|
|||
|
|
'优先级': '上帝级重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': 'NPC信息面板',
|
|||
|
|
'需求详述': '',
|
|||
|
|
'优先级': '很重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '心情系统',
|
|||
|
|
'需求详述': 'a. 完成了单独心情值的开发,心情值的变化和行为的结合没有处理',
|
|||
|
|
'优先级': '很重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '房间系统',
|
|||
|
|
'需求详述': 'a. 完成了item舒适度的计算,房间对NPC的影响和关系没有处理',
|
|||
|
|
'优先级': '重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '营地管理页面',
|
|||
|
|
'需求详述': 'a. 角色列表页\nb. 物品需求页',
|
|||
|
|
'优先级': '重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '路径COST计算规则',
|
|||
|
|
'需求详述': '',
|
|||
|
|
'优先级': '欠重要'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
fields: {
|
|||
|
|
'需求': '营地功能旗帜的交互',
|
|||
|
|
'需求详述': '',
|
|||
|
|
'优先级': '欠重要'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
console.log(`Inserting ${records.length} records...`);
|
|||
|
|
const batchUrl = `https://open.feishu.cn/open-apis/bitable/v1/apps/${APP_TOKEN}/tables/${TABLE_ID}/records/batch_create`;
|
|||
|
|
|
|||
|
|
const res = await fetch(batchUrl, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${token}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({ records: records })
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const data = await res.json();
|
|||
|
|
if (data.code !== 0) {
|
|||
|
|
console.error('Failed to create records:', JSON.stringify(data, null, 2));
|
|||
|
|
} else {
|
|||
|
|
console.log('Success! Created records.');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function createField(token, name, type, property) {
|
|||
|
|
console.log(`Creating field: ${name}`);
|
|||
|
|
const url = `https://open.feishu.cn/open-apis/bitable/v1/apps/${APP_TOKEN}/tables/${TABLE_ID}/fields`;
|
|||
|
|
|
|||
|
|
const payload = {
|
|||
|
|
field_name: name,
|
|||
|
|
type: type
|
|||
|
|
};
|
|||
|
|
if (property) payload.property = property;
|
|||
|
|
|
|||
|
|
const res = await fetch(url, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${token}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify(payload)
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const data = await res.json();
|
|||
|
|
if (data.code === 0) {
|
|||
|
|
console.log(` -> Created field ID: ${data.data.field.field_id}`);
|
|||
|
|
return data.data.field.field_id;
|
|||
|
|
} else {
|
|||
|
|
console.warn(` -> Failed to create field (might exist): ${data.msg}`);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
setup().catch(console.error);
|