647 lines
13 KiB
Plaintext
647 lines
13 KiB
Plaintext
---
|
|
title: "مدلها"
|
|
author: "تیم توسعه"
|
|
date: "2025-08-17"
|
|
format: html
|
|
lang: fa
|
|
---
|
|
|
|
# فیلدهای موجود در دیتابیس
|
|
|
|
مدل *درخواست* کاربر که شامل رویههای واردات، صادرات، ترانزیت، تدارکات، تجهیزات، سوخترسانی، آبرسانی، عودت تجهیزات (ورود و خروج) میشود.
|
|
|
|
```js
|
|
const mongoose = require('mongoose');
|
|
|
|
const REQUEST_STATUSES = {
|
|
OPEN: 0, // باز
|
|
IN_PROGRESS: 1, // در حال بررسی
|
|
CLOSE: 2, // بسته شده
|
|
END: 3, // پایان عملیات
|
|
};
|
|
|
|
const REQUEST_PERMISSIONS_STATUSES = {
|
|
NOT_HAS: 0, // ندارد
|
|
HAS: 1, // دارد
|
|
CANCEL: 2, // لغو شده
|
|
IN_PROGRESS: 3, // در حال بررسی
|
|
};
|
|
|
|
// ['صادرات', 'واردات', 'ترانزیت', 'آب رسانی', 'سوخت رسانی', 'تجهیزات', 'تدارکات'],
|
|
const OPERATION_TYPES = {
|
|
EXPORT: 0,
|
|
IMPORT: 1,
|
|
TRANSIT: 2,
|
|
WATER: 3,
|
|
FUEL: 4,
|
|
EQUIPMENT: 5,
|
|
PROVISION: 6,
|
|
};
|
|
|
|
// یک تردد، چند تردد، شهری
|
|
const TRAFFIC_TYPES = {
|
|
ONE_DIRECTION: 0,
|
|
MULTIPLE_DIRECTION: 1,
|
|
CITY: 2,
|
|
ENTRANCE_PERMISSION: 3,
|
|
EXIT_PERMISSION: 4,
|
|
};
|
|
|
|
// کانتینری، نفتی، عمومی
|
|
const TERMINAL_OPTIONS = {
|
|
CONTAINER: 0,
|
|
OIL: 1,
|
|
GENERAL: 2,
|
|
SERVICE: 3,
|
|
};
|
|
|
|
// تخلیه، بارگیری، تشریفات گمرکی
|
|
const ENTRANCE_TRAFFIC_TYPES = {
|
|
LOAD: 0,
|
|
UNLOAD: 1,
|
|
CUSTOM: 2,
|
|
SERVICE: 3,
|
|
};
|
|
|
|
const requestSchema = new mongoose.Schema(
|
|
{
|
|
کسی که درخواست ثبت میکنه - واردات صادرات و ...
|
|
requestBy: {
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'User',
|
|
},
|
|
|
|
به نمایندگی از ... درخواستها ثبت میشه. نماینده در واقع
|
|
requestFor: [
|
|
{
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'User',
|
|
},
|
|
],
|
|
|
|
// نوع عملیات درخواست مثل واردات صادرات و ...
|
|
operationType: {
|
|
type: Number,
|
|
required: [true, 'نوع عملیات الزامی می باشد.'],
|
|
enum: Object.values(OPERATION_TYPES),
|
|
},
|
|
|
|
// فیلدی حمل یکسره و عملیاتی در آن ذخیره میشود
|
|
options: {
|
|
type: String,
|
|
},
|
|
|
|
// فیلدی که جهت در آن ذخیره میشود. جهت تخلیه، بارگیری و تشریفات گمرکی و ...
|
|
entranceTrafficType: {
|
|
type: Number,
|
|
enum: Object.values(ENTRANCE_TRAFFIC_TYPES),
|
|
},
|
|
|
|
// حساسیت کالا در این فیلد ذخیره میشود
|
|
danger: [
|
|
{
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'dangerType',
|
|
required: false,
|
|
},
|
|
],
|
|
|
|
// تاییده نهایی نوع تردد که توسط ادمین وارد میشود
|
|
traffic: {
|
|
// تردد تایید شده توسط مجوز دهنده
|
|
type: Number,
|
|
enum: Object.values(TRAFFIC_TYPES),
|
|
},
|
|
|
|
// اظهار نوع تردد که توسط کاربر ثبت میشود و نهایی نیست
|
|
trafficType: {
|
|
// اظهار تردد
|
|
type: Number,
|
|
enum: Object.values(TRAFFIC_TYPES),
|
|
},
|
|
|
|
// پایانهای که کالا برای آن ثبت میشود
|
|
terminalOption: {
|
|
type: Number,
|
|
enum: Object.values(TERMINAL_OPTIONS),
|
|
},
|
|
|
|
// آدرس فایل حواله سوخت و ...
|
|
filename: {
|
|
type: String,
|
|
},
|
|
|
|
// نام محصول یا کالایی که کاربر وارد میکند
|
|
name: {
|
|
// نام بار
|
|
type: String,
|
|
trim: true,
|
|
},
|
|
|
|
// شماره سفر
|
|
voyageNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// کد قبض انبار اگر کالا عمومی و یا کانتینری باشد
|
|
receiptNumber: [
|
|
{
|
|
type: String,
|
|
trim: true,
|
|
},
|
|
],
|
|
|
|
// تناژ کالا
|
|
tonaj: {
|
|
type: String,
|
|
},
|
|
|
|
// عددی که برای تناژ استفاده میشود
|
|
tonajNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// واحد تناژ کالا
|
|
tonajType: {
|
|
type: String,
|
|
},
|
|
|
|
// تعداد محصول یا بار
|
|
packageNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// شماره پلاکهای ثبت شده برای درخواست کاربر
|
|
plates: [
|
|
{
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'plates',
|
|
required: false,
|
|
},
|
|
],
|
|
|
|
// بدون استفاده
|
|
truckNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// اسم شناور
|
|
vesselName: String,
|
|
|
|
// اسم کشتی رانی صاحب شناور
|
|
shipping: {
|
|
type: String,
|
|
},
|
|
|
|
// منطقه عملیاتی
|
|
storeRoom: {
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'storeRoom',
|
|
required: false,
|
|
},
|
|
// نوع منطقه عملیاتی - که استفاده نمیشود
|
|
storeRoomType: {
|
|
type: String,
|
|
},
|
|
|
|
// دستگاه نظارت درخواست
|
|
supervisionDepartment: {
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'supervisionDepartment',
|
|
required: false,
|
|
},
|
|
|
|
// کاربری که برای درخواست مشاور است
|
|
consultingUser: {
|
|
type: String,
|
|
},
|
|
consultingUsername: {
|
|
type: String,
|
|
},
|
|
consultingStatus: {
|
|
type: String,
|
|
},
|
|
supervisionStatus: {
|
|
type: String,
|
|
},
|
|
propertyBossStatus: {
|
|
type: String,
|
|
},
|
|
HSEStatus: {
|
|
type: String,
|
|
},
|
|
portBossStatus: {
|
|
type: String,
|
|
},
|
|
customsStatus: {
|
|
type: String,
|
|
},
|
|
selectedStores: {
|
|
type: Array,
|
|
},
|
|
|
|
// مقصد کالا
|
|
destination: {
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
trim: true,
|
|
ref: 'city',
|
|
},
|
|
|
|
// مجوز یگان حفاظت
|
|
permissionGuard: {
|
|
// مجوز یگان حفاظت
|
|
type: Number,
|
|
enum: Object.values(REQUEST_PERMISSIONS_STATUSES),
|
|
default: REQUEST_PERMISSIONS_STATUSES.IN_PROGRESS,
|
|
},
|
|
|
|
// مجوز پایانه اسکله برای حرکت کردن ناوگان حمل از پایانه کامیونی
|
|
permissionPier: {
|
|
// مجوز اسکله
|
|
type: Number,
|
|
enum: Object.values(REQUEST_PERMISSIONS_STATUSES),
|
|
default: REQUEST_PERMISSIONS_STATUSES.IN_PROGRESS,
|
|
},
|
|
|
|
// اظهارات کوتاژ کاربر
|
|
userCottages: [
|
|
//اظهار کوتاژ
|
|
{
|
|
type: String,
|
|
trim: true,
|
|
},
|
|
],
|
|
date: {
|
|
type: Date,
|
|
},
|
|
dateString: {
|
|
type: String,
|
|
},
|
|
|
|
// کامنت اسکله - بروز میشود
|
|
pierComment: {
|
|
type: String,
|
|
},
|
|
|
|
// پایانه حمل
|
|
terminalTruckName: {
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'terminals',
|
|
required: false,
|
|
},
|
|
|
|
// شماره حواله سوخت
|
|
gasolineRequestNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// شماره سفارش
|
|
orderNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// دروازهای که درخواست برای
|
|
gateName: {
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'gate',
|
|
required: [true, 'نام دروازه الزامی می باشد.'],
|
|
},
|
|
|
|
// کد رهگیری تولید شده
|
|
requestNumber: {
|
|
type: String,
|
|
},
|
|
supervisionUser: {
|
|
type: String,
|
|
},
|
|
supervisionUsername: {
|
|
type: String,
|
|
},
|
|
propertyBossUser: {
|
|
type: String,
|
|
},
|
|
propertyBossUsername: {
|
|
type: String,
|
|
},
|
|
HSEUser: {
|
|
type: String,
|
|
},
|
|
HSEUsername: {
|
|
type: String,
|
|
},
|
|
portBossUser: {
|
|
type: String,
|
|
},
|
|
portBossUsername: {
|
|
type: String,
|
|
},
|
|
terminalUser: {
|
|
type: String,
|
|
},
|
|
terminalUsername: {
|
|
type: String,
|
|
},
|
|
permissionPierDate: {
|
|
type: Date,
|
|
},
|
|
permissionPierDateString: {
|
|
type: String,
|
|
},
|
|
|
|
// وضعیت درخواست کاربر
|
|
status: {
|
|
type: Number,
|
|
enum: Object.values(REQUEST_STATUSES),
|
|
default: REQUEST_STATUSES.IN_PROGRESS,
|
|
},
|
|
|
|
// اظهارات کوتاژ کاربر تایید شده است یا نه
|
|
cottageVerified: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
verfiedAt: {
|
|
type: Date,
|
|
required: false,
|
|
},
|
|
cottages: [
|
|
// کوتاژهای تایید شده توسط سرویس استعلام گمرک
|
|
{
|
|
type: mongoose.Types.ObjectId,
|
|
ref: 'cottage',
|
|
required: false,
|
|
},
|
|
],
|
|
|
|
// فیلدی برای کانتینر خالی
|
|
emptyContainer: {
|
|
type: Boolean,
|
|
},
|
|
|
|
// اگر کالا خطرناک باشد
|
|
unNumber: {
|
|
type: String,
|
|
},
|
|
|
|
// اگر کالا خطرناک باشد
|
|
casNumber: {
|
|
type: String,
|
|
},
|
|
process: {
|
|
// شروع فرآیند
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
ref: 'process',
|
|
},
|
|
commodityList: [
|
|
// لیست اقلام
|
|
{
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
ref: 'equipements',
|
|
required: false,
|
|
},
|
|
],
|
|
},
|
|
{ timestamps: true }
|
|
);
|
|
|
|
const Request = mongoose.model('request', requestSchema);
|
|
|
|
module.exports = {
|
|
Request,
|
|
REQUEST_STATUSES,
|
|
REQUEST_PERMISSIONS_STATUSES,
|
|
TERMINAL_OPTIONS,
|
|
TRAFFIC_TYPES,
|
|
OPERATION_TYPES,
|
|
};
|
|
|
|
```
|
|
|
|
|
|
---
|
|
مدل مربوط به شماره پلاک درخواستها که کاربر اطلاعات راننده را وارد میکند.
|
|
|
|
```js
|
|
const mongoose = require('mongoose');
|
|
const { TRAFFIC_TYPES } = require('./request.model');
|
|
|
|
// وضعیت فعلی پلاک که در چه مرحلهای است
|
|
const PLATE_STATES = {
|
|
OUT_PORT: 0,
|
|
IN_PORT: 1,
|
|
CLOSED: 2,
|
|
};
|
|
|
|
// پلاک مجوز حرکت دارد یا ندارد
|
|
const PLATE_PERMISSIONS = {
|
|
NOT_HAS: 0,
|
|
HAS: 1,
|
|
PENDING: 2,
|
|
};
|
|
|
|
// یگان حفاظت مجوز ورود و خروج پلاک را بصورت اتوماتیک توسط دوربین پلاکخوان ثبت کرده یا بصورت دستی
|
|
const GUARD_REGISTRATION_TYPES = {
|
|
AUTO: 0,
|
|
MANUAL: 1,
|
|
};
|
|
|
|
// مدل پلاک
|
|
const platesSchema = new mongoose.Schema(
|
|
{
|
|
// شماره پلاک
|
|
plate: {
|
|
type: String,
|
|
trim: true,
|
|
},
|
|
//مجوز ورود به بندر که هم یگان حفاظت برای چند ترددی و شهری صادر می کند و هم پایانه کامیونی
|
|
permission: {
|
|
type: Number,
|
|
enum: Object.values(PLATE_PERMISSIONS),
|
|
},
|
|
|
|
// مجوز یگان حفاظت
|
|
permissionGuard: {
|
|
type: Number,
|
|
},
|
|
permissionGuardDate: {
|
|
type: Date,
|
|
},
|
|
status: {
|
|
type: Number,
|
|
},
|
|
|
|
// نوع ترددی که توسط ادمین ثبت شده است
|
|
traffic: {
|
|
type: Number,
|
|
enum: Object.values(TRAFFIC_TYPES),
|
|
},
|
|
|
|
// زمان ورود ناوگان حمل به درون بندر
|
|
entranceTime: [
|
|
{
|
|
type: Date,
|
|
},
|
|
],
|
|
entranceTimeString: [
|
|
{
|
|
type: String,
|
|
},
|
|
],
|
|
|
|
// زمان خروج ناوگان حمل از بندر
|
|
exitTime: [
|
|
{
|
|
type: Date,
|
|
},
|
|
],
|
|
exitTimeString: [
|
|
{
|
|
type: String,
|
|
},
|
|
],
|
|
|
|
// مجوز پایانه راهداری
|
|
delfardTerminalTime: {
|
|
type: Date,
|
|
},
|
|
delfardTerminalTimeString: {
|
|
type: String,
|
|
},
|
|
|
|
// زمان مجوز گرفتن از پایانه کامیونی
|
|
truckTerminalTime: {
|
|
type: Date,
|
|
},
|
|
truckTerminalTimeString: {
|
|
type: String,
|
|
},
|
|
|
|
// تخلف
|
|
violationType: {
|
|
type: String,
|
|
},
|
|
violationComment: {
|
|
type: String,
|
|
},
|
|
|
|
// حساسیت کالایی که حمل میکند
|
|
dangers: [
|
|
{
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
ref: 'dangerType',
|
|
},
|
|
],
|
|
date: {
|
|
type: Date,
|
|
},
|
|
dateString: {
|
|
type: String,
|
|
},
|
|
|
|
// اگر درخواست از نوع کانتینری باشد شمارههای کانتینر هم باید وارد شود
|
|
containerNumbers: [
|
|
{
|
|
type: String,
|
|
},
|
|
],
|
|
|
|
closeDate: {
|
|
type: Date,
|
|
},
|
|
|
|
// اسم راننده
|
|
driverName: {
|
|
type: String,
|
|
},
|
|
|
|
// شماره پاسپورت برای خارجیها و کد ملی برای داخلیها
|
|
driverPersonalCode: {
|
|
type: String,
|
|
},
|
|
|
|
// شماره موبایل راننده
|
|
driverMobile: {
|
|
type: String,
|
|
},
|
|
|
|
// ملیت راننده
|
|
driverNationality: {
|
|
type: String,
|
|
},
|
|
|
|
// نوع ناوگان حمل
|
|
truckType: {
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
ref: 'trucks',
|
|
},
|
|
|
|
// کدی که اگر نوع ناوگان از نوع چادری یا یخچالی باشد
|
|
TYnumber: {
|
|
type: String,
|
|
},
|
|
|
|
// درخواست کنسل شده است یا نه
|
|
isCancel: {
|
|
type: Boolean,
|
|
},
|
|
bijakType: {
|
|
type: String,
|
|
},
|
|
bijakNumber: {
|
|
type: Number,
|
|
},
|
|
bijakTruckScaleNumber: {
|
|
type: String,
|
|
},
|
|
bijakUser: {
|
|
type: String,
|
|
},
|
|
bijakGCOMS: {
|
|
type: Array,
|
|
},
|
|
|
|
// درخواست برای بستن
|
|
requestForClose: {
|
|
type: Boolean,
|
|
},
|
|
requestForCloseFullName: {
|
|
type: String,
|
|
},
|
|
|
|
// نوع پلاک که ایرانی خارجی و منطقه آزاد باشد
|
|
plateOption: {
|
|
type: String,
|
|
},
|
|
plateState: {
|
|
type: Number,
|
|
enum: Object.values(PLATE_STATES),
|
|
default: PLATE_STATES.OUT_PORT,
|
|
},
|
|
|
|
// نوع ورود پلاک به بندر
|
|
entranceGuardRegistrationType: {
|
|
type: Number,
|
|
enum: Object.values(GUARD_REGISTRATION_TYPES),
|
|
},
|
|
|
|
// نوع خروج پلاک از بندر
|
|
exitGuardRegistrationType: {
|
|
type: Number,
|
|
enum: Object.values(GUARD_REGISTRATION_TYPES),
|
|
},
|
|
// transportation
|
|
|
|
// شرکت حمل اگر درخواست شهری ثبت شود
|
|
transportationCompany: {
|
|
type: mongoose.SchemaTypes.ObjectId,
|
|
ref: 'terminals',
|
|
required: false,
|
|
},
|
|
},
|
|
{ timestamps: true }
|
|
);
|
|
|
|
const Plate = mongoose.model('plates', platesSchema);
|
|
|
|
module.exports = { Plate, PLATE_STATES, PLATE_PERMISSIONS };
|
|
``` |