拍卖行:更新分红公式
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { AUCTION_BID_STATUS, DIVIDEND_STATUS } from './../../../consts/constModules/auctionConst';
|
import { AUCTION_BID_STATUS } from './../../../consts/constModules/auctionConst';
|
||||||
import { DividendModel } from './../../../db/Dividend';
|
import { DividendModel } from './../../../db/Dividend';
|
||||||
import { Application, BackendSession, ChannelService } from "pinus";
|
import { Application, BackendSession, ChannelService } from "pinus";
|
||||||
import { AUCTION_STAGE, DEBUG_MAGIC_WORD, STATUS, OFFER_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, DATA_NAME, LOT_STATUS } from "../../../consts";
|
import { AUCTION_STAGE, DEBUG_MAGIC_WORD, STATUS, OFFER_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, DATA_NAME, LOT_STATUS } from "../../../consts";
|
||||||
@@ -61,7 +61,7 @@ export class AuctionHandler {
|
|||||||
res.releaseCallback();
|
res.releaseCallback();
|
||||||
return resResult(STATUS.LOT_OFFER_SERIAL);
|
return resResult(STATUS.LOT_OFFER_SERIAL);
|
||||||
}
|
}
|
||||||
let newPrice = parseInt((curPrice * OFFER_RATIO).toFixed(0));
|
let newPrice = Math.floor(curPrice * OFFER_RATIO);
|
||||||
let maxFlag = max;
|
let maxFlag = max;
|
||||||
if (newPrice >= maxPrice) {
|
if (newPrice >= maxPrice) {
|
||||||
newPrice = maxPrice;
|
newPrice = maxPrice;
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
import { DIVIDENDWEEKENDRATE, DIVIDENDMAXRATIO, DIVIDENDPOSITIONMAXRATIO } from './../consts/constModules/auctionConst';
|
||||||
import { DividendModel } from './../db/Dividend';
|
import { DividendModel } from './../db/Dividend';
|
||||||
import { LOT_CODE_LEN, AUCTION_STAGE, AUCTION_TIME, DIVIDEND_CODE_LEN, DIVIDEND_STATUS, LOT_STATUS } from './../consts';
|
import { LOT_CODE_LEN, AUCTION_STAGE, AUCTION_TIME, DIVIDEND_CODE_LEN, DIVIDEND_STATUS, LOT_STATUS } from './../consts';
|
||||||
import { DividendRec, ItemReward } from "../domain/dbGeneral";
|
import { DividendRec, ItemReward } from "../domain/dbGeneral";
|
||||||
import { genCode } from '../pubUtils/util';
|
import { genCode } from '../pubUtils/util';
|
||||||
import { LotModel, LotParam } from '../db/Lot';
|
import { LotModel, LotParam } from '../db/Lot';
|
||||||
import { getNextTime, getTodayZeroDate } from '../pubUtils/timeUtil';
|
import { getNextTime, getTodayZeroDate } from '../pubUtils/timeUtil';
|
||||||
import { getGoodById } from '../pubUtils/data';
|
import { gameData, getGoodById } from '../pubUtils/data';
|
||||||
import { DividendParam, DividendType } from '../db/Dividend';
|
import { DividendParam, DividendType } from '../db/Dividend';
|
||||||
|
import { RolePosition } from '../domain/battleField/guild';
|
||||||
|
|
||||||
// ! 获取底价,假数据
|
// ! 获取底价,假数据
|
||||||
function getBasePrice(gid: number, count: number) {
|
function getBasePrice(gid: number, count: number) {
|
||||||
@@ -98,17 +100,26 @@ export async function participants(guildCode: string, sourceType: number, source
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
function baseDividend(totalPrice: number, roleNum: number) {
|
function posDividend(totalPrice: number, roleRatio: number, totalRatio: number) {
|
||||||
return roleNum > 10 ? totalPrice / roleNum : totalPrice / 10;
|
const dividend = Math.floor(totalPrice * roleRatio / totalRatio);
|
||||||
|
const maxDividend = Math.floor(totalPrice * DIVIDENDMAXRATIO);
|
||||||
|
return dividend <= maxDividend ? dividend : Math.floor(maxDividend * roleRatio / DIVIDENDPOSITIONMAXRATIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
function posDividend(totalPrice: number, roleNum: number, position: number) {
|
function weekendDividend(posNum: number, date: Date) {
|
||||||
return totalPrice / roleNum * position;
|
|
||||||
}
|
|
||||||
|
|
||||||
function weekendDividend(totalPrice: number, roleNum: number, date: Date) {
|
|
||||||
const day = date.getDay();
|
const day = date.getDay();
|
||||||
return (day === 0 || day === 6) ? totalPrice / roleNum : 0;
|
return (day === 0 || day === 6) ? Math.floor(posNum * DIVIDENDWEEKENDRATE) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dividendRate(data: RolePosition) {
|
||||||
|
return gameData.guildPosition.get(data.position).sellRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalDividendRatio(participantsData: RolePosition[]) {
|
||||||
|
const result = participantsData.reduce((sum, data) => {
|
||||||
|
return sum + dividendRate(data);
|
||||||
|
}, 0);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function calculateDividend(dividend: DividendType) {
|
export async function calculateDividend(dividend: DividendType) {
|
||||||
@@ -121,18 +132,16 @@ export async function calculateDividend(dividend: DividendType) {
|
|||||||
// 更新 totalPrice
|
// 更新 totalPrice
|
||||||
}
|
}
|
||||||
const participantsData = await participants(guildCode, sourceType, sourceCode);
|
const participantsData = await participants(guildCode, sourceType, sourceCode);
|
||||||
|
const totalRatio = totalDividendRatio(participantsData);
|
||||||
const dividends: DividendRec[] = participantsData.map(data => {
|
const dividends: DividendRec[] = participantsData.map(data => {
|
||||||
const { roleId, position } = data;
|
const { roleId } = data;
|
||||||
const roleNum = participantsData.length;
|
const posNum = posDividend(calcuTotalPrice, dividendRate(data), totalRatio);
|
||||||
const baseNum = baseDividend(calcuTotalPrice, roleNum);
|
const weekendNum = weekendDividend(posNum, begin);
|
||||||
const posNum = posDividend(calcuTotalPrice, roleNum, position);
|
|
||||||
const weekendNum = weekendDividend(calcuTotalPrice, roleNum, begin);
|
|
||||||
return {
|
return {
|
||||||
roleId,
|
roleId,
|
||||||
baseNum, // 基础分红
|
|
||||||
posNum, // 职位分红
|
posNum, // 职位分红
|
||||||
weekendNum, // 额外分红,周末
|
weekendNum, // 额外分红,周末
|
||||||
total: baseNum + posNum + weekendNum, // 总分红
|
total: posNum + weekendNum, // 总分红
|
||||||
status: 0, // 0:未领取,1:已领取
|
status: 0, // 0:未领取,1:已领取
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -205,7 +205,6 @@ describe('拍卖行测试', function() {
|
|||||||
checkSuccessResponse(res);
|
checkSuccessResponse(res);
|
||||||
expect(res.data.dividend).to.be.an('object');
|
expect(res.data.dividend).to.be.an('object');
|
||||||
expect(res.data.dividend.roleId).to.be.a('string');
|
expect(res.data.dividend.roleId).to.be.a('string');
|
||||||
expect(res.data.dividend.baseNum).to.be.a('number');
|
|
||||||
expect(res.data.dividend.posNum).to.be.a('number');
|
expect(res.data.dividend.posNum).to.be.a('number');
|
||||||
expect(res.data.dividend.weekendNum).to.be.a('number');
|
expect(res.data.dividend.weekendNum).to.be.a('number');
|
||||||
expect(res.data.dividend.total).to.be.a('number');
|
expect(res.data.dividend.total).to.be.a('number');
|
||||||
|
|||||||
@@ -54,3 +54,6 @@ export const AUCTION_BID_STATUS = {
|
|||||||
|
|
||||||
export const OFFER_RATIO = 1.1;
|
export const OFFER_RATIO = 1.1;
|
||||||
export const BID_REC_COUNT = 100;
|
export const BID_REC_COUNT = 100;
|
||||||
|
export const DIVIDENDWEEKENDRATE = 0.2;
|
||||||
|
export const DIVIDENDMAXRATIO = 0.1;
|
||||||
|
export const DIVIDENDPOSITIONMAXRATIO = 3;
|
||||||
|
|||||||
@@ -119,3 +119,8 @@ export class GuildListInfo extends GuildMainInfo {
|
|||||||
this.hasApply = hasApply;
|
this.hasApply = hasApply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface RolePosition {
|
||||||
|
roleId: string;
|
||||||
|
position: number; // 职位
|
||||||
|
}
|
||||||
@@ -266,8 +266,6 @@ export class DividendRec {
|
|||||||
@prop({ required: true, default: '' })
|
@prop({ required: true, default: '' })
|
||||||
roleId: string;
|
roleId: string;
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
baseNum: number; // 基础分红
|
|
||||||
@prop({ required: true, default: 0 })
|
|
||||||
posNum: number; // 职位分红
|
posNum: number; // 职位分红
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
weekendNum: number; // 额外分红,周末
|
weekendNum: number; // 额外分红,周末
|
||||||
|
|||||||
Reference in New Issue
Block a user