宝石合成并穿戴

This commit is contained in:
mamengke01
2020-12-24 11:38:29 +08:00
parent 6a11bfb170
commit c3a1d68aae
3 changed files with 46 additions and 27 deletions
+28 -16
View File
@@ -1,6 +1,7 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions, mongoose } from '@typegoose/typegoose';
import Transaction from "mongoose-transactions/src/main";
const _ = require('underscore');
@index({ roleId: 1, id: 1 })
@index({ seqId: 1 })
@@ -50,24 +51,35 @@ export default class Item extends BaseModel {
return items;
}
public static async decreaseItems(roleId: string, items: Array<{id: number, count: number, ratio?: number}>, lean = true) {
let updateItems = new Array<{id: number, count: number}>(), hasError: boolean = false, result = new Array();
for (let { id, count, ratio } of items) {
const rec: ItemType = await ItemModel.findOneAndUpdate({roleId, id, count: {$gte: count} },{ $inc: { count: -1 * count }}, {new: true}).lean(lean);
if(rec) {
result.push({id: rec.id, count: rec.count});
updateItems.push({id, count});
} else {
hasError = true; break;
}
public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number }>, lean = true) {
let updateItems = new Array<{ id: number, count: number, ratio?: number }>(), hasError: boolean = false, result = new Array();
for (let { id, count, ratio } of items) {
let rec: ItemType;
if (!ratio) {
rec = await ItemModel.findOneAndUpdate({ roleId, id, count: { $gte: count } }, { $inc: { count: -1 * count } }, { new: true }).lean(lean);
} else {
rec = await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: ratio * count } }, { new: true }).lean(lean);
}
if (!!rec) {
let index = _.findIndex(result,{id})
if (!!result[index]) {
result[index] = { id: rec.id, count: rec.count }
} else {
result.push({ id: rec.id, count: rec.count });
}
updateItems.push({ id, count, ratio });
} else {
hasError = true; break;
}
}
if(hasError) { // 数量不足
for(let {id, count} of updateItems) {
await ItemModel.findOneAndUpdate({roleId, id },{ $inc: { count }}, {new: true}).lean(lean);
}
return {hasError: true}
if (hasError) { // 数量不足
for (let { id, count, ratio } of updateItems) {
if (!ratio) ratio = -1;
await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: -ratio * count } }, { new: true }).lean(lean);
}
return { hasError: true }
} else {
return {hasError: false, result}
return { hasError: false, result }
}
}
// public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number}>, lean = true) {