|
@@ -177,25 +177,36 @@ const tableConfigs = [
|
|
|
]
|
|
|
},
|
|
|
|
|
|
- // 交付物表:Product
|
|
|
+ // 空间设计产品表:Product
|
|
|
{
|
|
|
className: 'Product',
|
|
|
fields: [
|
|
|
{ name: 'project', type: 'Pointer', required: true, targetClass: 'Project' },
|
|
|
{ name: 'company', type: 'Pointer', required: true, targetClass: 'Company' },
|
|
|
- { name: 'stage', type: 'String', required: true },
|
|
|
+ { name: 'profile', type: 'Pointer', required: true, targetClass: 'Profile' },
|
|
|
+ { name: 'productName', type: 'String', required: true },
|
|
|
+ { name: 'productType', type: 'String', required: true },
|
|
|
+ { name: 'stage', type: 'String', required: true, defaultValue: 'not_started' },
|
|
|
{ name: 'processType', type: 'String', required: false },
|
|
|
- { name: 'space', type: 'String', required: false },
|
|
|
- { name: 'fileUrl', type: 'String', required: true },
|
|
|
+ { name: 'status', type: 'String', required: true, defaultValue: 'not_started' },
|
|
|
+ { name: 'fileUrl', type: 'String', required: false },
|
|
|
{ name: 'reviewStatus', type: 'String', required: true, defaultValue: 'pending' },
|
|
|
+ { name: 'space', type: 'Object', required: false, defaultValue: {} },
|
|
|
{ name: 'quotation', type: 'Object', required: false, defaultValue: {} },
|
|
|
+ { name: 'requirements', type: 'Object', required: false, defaultValue: {} },
|
|
|
+ { name: 'reviews', type: 'Array', required: false, defaultValue: [] },
|
|
|
+ { name: 'estimatedBudget', type: 'Number', required: false },
|
|
|
+ { name: 'estimatedDuration', type: 'Number', required: false },
|
|
|
+ { name: 'order', type: 'Number', required: false, defaultValue: 0 },
|
|
|
{ name: 'data', type: 'Object', required: false, defaultValue: {} },
|
|
|
{ name: 'isDeleted', type: 'Boolean', required: false, defaultValue: false }
|
|
|
],
|
|
|
indexes: [
|
|
|
- { name: 'project_stage_isDeleted', fields: { project: 1, stage: 1, isDeleted: 1 } },
|
|
|
- { name: 'project_space', fields: { project: 1, space: 1 } },
|
|
|
- { name: 'reviewStatus_project', fields: { reviewStatus: 1, project: 1 } }
|
|
|
+ { name: 'project_company_isDeleted', fields: { project: 1, company: 1, isDeleted: 1 } },
|
|
|
+ { name: 'profile_company', fields: { profile: 1, company: 1 } },
|
|
|
+ { name: 'productType_order', fields: { productType: 1, order: 1 } },
|
|
|
+ { name: 'stage_status', fields: { stage: 1, status: 1 } },
|
|
|
+ { name: 'reviewStatus', fields: { reviewStatus: 1 } }
|
|
|
]
|
|
|
},
|
|
|
|
|
@@ -204,59 +215,62 @@ const tableConfigs = [
|
|
|
className: 'ProjectFile',
|
|
|
fields: [
|
|
|
{ name: 'project', type: 'Pointer', required: true, targetClass: 'Project' },
|
|
|
+ { name: 'product', type: 'Pointer', required: false, targetClass: 'Product' },
|
|
|
+ { name: 'attach', type: 'Pointer', required: true, targetClass: 'Attachment' },
|
|
|
{ name: 'uploadedBy', type: 'Pointer', required: true, targetClass: 'Profile' },
|
|
|
- { name: 'fileType', type: 'String', required: true },
|
|
|
- { name: 'fileUrl', type: 'String', required: true },
|
|
|
- { name: 'fileName', type: 'String', required: true },
|
|
|
- { name: 'fileSize', type: 'Number', required: false, defaultValue: 0 },
|
|
|
{ name: 'stage', type: 'String', required: false },
|
|
|
+ { name: 'category', type: 'String', required: false, defaultValue: 'other' },
|
|
|
{ name: 'data', type: 'Object', required: false, defaultValue: {} },
|
|
|
+ { name: 'analysis', type: 'Object', required: false, defaultValue: {} },
|
|
|
{ name: 'isDeleted', type: 'Boolean', required: false, defaultValue: false }
|
|
|
],
|
|
|
indexes: [
|
|
|
- { name: 'project_fileType_isDeleted', fields: { project: 1, fileType: 1, isDeleted: 1 } },
|
|
|
- { name: 'uploadedBy_project', fields: { uploadedBy: 1, project: 1 } }
|
|
|
+ { name: 'project_product_stage_isDeleted', fields: { project: 1, product: 1, stage: 1, isDeleted: 1 } },
|
|
|
+ { name: 'attach', fields: { attach: 1 } },
|
|
|
+ { name: 'uploadedBy_project', fields: { uploadedBy: 1, project: 1 } },
|
|
|
+ { name: 'category_index', fields: { category: 1 } }
|
|
|
]
|
|
|
},
|
|
|
|
|
|
- // 结算记录表:ProjectSettlement
|
|
|
+ // 项目付款表:ProjectPayment ⭐
|
|
|
{
|
|
|
- className: 'ProjectSettlement',
|
|
|
+ className: 'ProjectPayment',
|
|
|
fields: [
|
|
|
{ name: 'project', type: 'Pointer', required: true, targetClass: 'Project' },
|
|
|
{ name: 'company', type: 'Pointer', required: true, targetClass: 'Company' },
|
|
|
+ { name: 'type', type: 'String', required: true },
|
|
|
{ name: 'stage', type: 'String', required: true },
|
|
|
+ { name: 'method', type: 'String', required: true },
|
|
|
{ name: 'amount', type: 'Number', required: true },
|
|
|
+ { name: 'currency', type: 'String', required: true, defaultValue: 'CNY' },
|
|
|
{ name: 'percentage', type: 'Number', required: false, defaultValue: 0 },
|
|
|
- { name: 'status', type: 'String', required: true, defaultValue: '待结算' },
|
|
|
- { name: 'dueDate', type: 'Date', required: false },
|
|
|
- { name: 'settledAt', type: 'Date', required: false },
|
|
|
- { name: 'data', type: 'Object', required: false, defaultValue: {} },
|
|
|
- { name: 'isDeleted', type: 'Boolean', required: false, defaultValue: false }
|
|
|
- ],
|
|
|
- indexes: [
|
|
|
- { name: 'project_stage', fields: { project: 1, stage: 1 }, unique: true },
|
|
|
- { name: 'status_company', fields: { status: 1, company: 1 } },
|
|
|
- { name: 'dueDate_index', fields: { dueDate: 1 } }
|
|
|
- ]
|
|
|
- },
|
|
|
-
|
|
|
- // 付款凭证表:ProjectVoucher
|
|
|
- {
|
|
|
- className: 'ProjectVoucher',
|
|
|
- fields: [
|
|
|
- { name: 'settlement', type: 'Pointer', required: true, targetClass: 'ProjectSettlement' },
|
|
|
- { name: 'project', type: 'Pointer', required: true, targetClass: 'Project' },
|
|
|
- { name: 'amount', type: 'Number', required: true },
|
|
|
- { name: 'voucherUrl', type: 'String', required: true },
|
|
|
- { name: 'recognizedInfo', type: 'Object', required: false, defaultValue: {} },
|
|
|
+ { name: 'paymentDate', type: 'Date', required: false },
|
|
|
+ { name: 'dueDate', type: 'Date', required: true },
|
|
|
+ { name: 'recordedDate', type: 'Date', required: false },
|
|
|
+ { name: 'status', type: 'String', required: true, defaultValue: 'pending' },
|
|
|
+ { name: 'voucherFile', type: 'Pointer', required: false, targetClass: 'ProjectFile' },
|
|
|
+ { name: 'voucherUrl', type: 'String', required: false },
|
|
|
+ { name: 'transactionId', type: 'String', required: false },
|
|
|
+ { name: 'paymentReference', type: 'String', required: false },
|
|
|
+ { name: 'paidBy', type: 'Pointer', required: true, targetClass: 'ContactInfo' },
|
|
|
+ { name: 'recordedBy', type: 'Pointer', required: true, targetClass: 'Profile' },
|
|
|
{ name: 'verifiedBy', type: 'Pointer', required: false, targetClass: 'Profile' },
|
|
|
+ { name: 'description', type: 'String', required: false },
|
|
|
+ { name: 'notes', type: 'String', required: false },
|
|
|
+ { name: 'relatedStage', type: 'String', required: false },
|
|
|
+ { name: 'product', type: 'Pointer', required: false, targetClass: 'Product' },
|
|
|
+ { name: 'autoReminderSent', type: 'Boolean', required: false, defaultValue: false },
|
|
|
+ { name: 'reminderCount', type: 'Number', required: false, defaultValue: 0 },
|
|
|
{ name: 'data', type: 'Object', required: false, defaultValue: {} },
|
|
|
{ name: 'isDeleted', type: 'Boolean', required: false, defaultValue: false }
|
|
|
],
|
|
|
indexes: [
|
|
|
- { name: 'settlement_project', fields: { settlement: 1, project: 1 } },
|
|
|
- { name: 'project_isDeleted', fields: { project: 1, isDeleted: 1 } }
|
|
|
+ { name: 'project_company_isDeleted', fields: { project: 1, company: 1, isDeleted: 1 } },
|
|
|
+ { name: 'status_stage', fields: { status: 1, stage: 1 } },
|
|
|
+ { name: 'type_status', fields: { type: 1, status: 1 } },
|
|
|
+ { name: 'product_productType', fields: { product: 1, productType: 1 } },
|
|
|
+ { name: 'dueDate_index', fields: { dueDate: 1 } },
|
|
|
+ { name: 'recordedDate_desc', fields: { recordedDate: -1 } }
|
|
|
]
|
|
|
},
|
|
|
|