feat: use mongoose-sequence to increment order number
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const { Schema, model } = require('mongoose')
|
||||
const { orderStatus } = require('./const')
|
||||
const { OrderNumberModel } = require('./order.number')
|
||||
|
||||
const schema = new Schema({
|
||||
phone: {
|
||||
@@ -28,9 +29,6 @@ const schema = new Schema({
|
||||
required: true
|
||||
},
|
||||
orderNumber: {
|
||||
type: String,
|
||||
required: true,
|
||||
unique: true
|
||||
},
|
||||
status: {
|
||||
type: String,
|
||||
@@ -52,6 +50,18 @@ const schema = new Schema({
|
||||
},
|
||||
})
|
||||
|
||||
schema.pre('save', async function (next) {
|
||||
if (this.isNew) {
|
||||
const counter = await OrderNumberModel.findOneAndUpdate(
|
||||
{ _id: 'orderNumber' },
|
||||
{ $inc: { sequenceValue: 1 } },
|
||||
{ new: true, upsert: true }
|
||||
)
|
||||
this.orderNumber = counter.sequenceValue.toString()
|
||||
}
|
||||
next()
|
||||
})
|
||||
|
||||
schema.set('toJSON', {
|
||||
virtuals: true,
|
||||
versionKey: false,
|
||||
|
||||
14
server/routers/dry-wash/model/order.number.js
Normal file
14
server/routers/dry-wash/model/order.number.js
Normal file
@@ -0,0 +1,14 @@
|
||||
const { Schema, model } = require('mongoose')
|
||||
|
||||
const schema = new Schema({
|
||||
_id: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
sequenceValue: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
})
|
||||
|
||||
exports.OrderNumberModel = model('dry-wash-order-number', schema)
|
||||
@@ -74,21 +74,6 @@ const VALIDATION_MESSAGES = {
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the next order number incrementing the last order number
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
const generateOrderNumber = async () => {
|
||||
const lastOrder = await OrderModel.findOne().sort({ created: -1 })
|
||||
if (lastOrder) {
|
||||
const lastOrderNumber = parseInt(lastOrder.orderNumber ?? '0')
|
||||
const nextOrderNumber = lastOrderNumber + 1
|
||||
return String(nextOrderNumber)
|
||||
}
|
||||
|
||||
return '1' // number of the very first order
|
||||
}
|
||||
|
||||
router.post('/create', async (req, res, next) => {
|
||||
const bodyErrors = []
|
||||
|
||||
@@ -144,9 +129,7 @@ router.post('/create', async (req, res, next) => {
|
||||
startWashTime: washing.begin,
|
||||
endWashTime: washing.end,
|
||||
location: washing.location,
|
||||
orderNumber: await generateOrderNumber(),
|
||||
status: orderStatus.PROGRESS,
|
||||
master: '',
|
||||
notes: '',
|
||||
created: new Date().toISOString(),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user