拍卖行:更新分红公式
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 { 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";
|
||||
@@ -61,7 +61,7 @@ export class AuctionHandler {
|
||||
res.releaseCallback();
|
||||
return resResult(STATUS.LOT_OFFER_SERIAL);
|
||||
}
|
||||
let newPrice = parseInt((curPrice * OFFER_RATIO).toFixed(0));
|
||||
let newPrice = Math.floor(curPrice * OFFER_RATIO);
|
||||
let maxFlag = max;
|
||||
if (newPrice >= maxPrice) {
|
||||
newPrice = maxPrice;
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { DIVIDENDWEEKENDRATE, DIVIDENDMAXRATIO, DIVIDENDPOSITIONMAXRATIO } from './../consts/constModules/auctionConst';
|
||||
import { DividendModel } from './../db/Dividend';
|
||||
import { LOT_CODE_LEN, AUCTION_STAGE, AUCTION_TIME, DIVIDEND_CODE_LEN, DIVIDEND_STATUS, LOT_STATUS } from './../consts';
|
||||
import { DividendRec, ItemReward } from "../domain/dbGeneral";
|
||||
import { genCode } from '../pubUtils/util';
|
||||
import { LotModel, LotParam } from '../db/Lot';
|
||||
import { getNextTime, getTodayZeroDate } from '../pubUtils/timeUtil';
|
||||
import { getGoodById } from '../pubUtils/data';
|
||||
import { gameData, getGoodById } from '../pubUtils/data';
|
||||
import { DividendParam, DividendType } from '../db/Dividend';
|
||||
import { RolePosition } from '../domain/battleField/guild';
|
||||
|
||||
// ! 获取底价,假数据
|
||||
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) {
|
||||
return roleNum > 10 ? totalPrice / roleNum : totalPrice / 10;
|
||||
function posDividend(totalPrice: number, roleRatio: number, totalRatio: number) {
|
||||
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) {
|
||||
return totalPrice / roleNum * position;
|
||||
}
|
||||
|
||||
function weekendDividend(totalPrice: number, roleNum: number, date: Date) {
|
||||
function weekendDividend(posNum: number, date: Date) {
|
||||
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) {
|
||||
@@ -121,18 +132,16 @@ export async function calculateDividend(dividend: DividendType) {
|
||||
// 更新 totalPrice
|
||||
}
|
||||
const participantsData = await participants(guildCode, sourceType, sourceCode);
|
||||
const totalRatio = totalDividendRatio(participantsData);
|
||||
const dividends: DividendRec[] = participantsData.map(data => {
|
||||
const { roleId, position } = data;
|
||||
const roleNum = participantsData.length;
|
||||
const baseNum = baseDividend(calcuTotalPrice, roleNum);
|
||||
const posNum = posDividend(calcuTotalPrice, roleNum, position);
|
||||
const weekendNum = weekendDividend(calcuTotalPrice, roleNum, begin);
|
||||
const { roleId } = data;
|
||||
const posNum = posDividend(calcuTotalPrice, dividendRate(data), totalRatio);
|
||||
const weekendNum = weekendDividend(posNum, begin);
|
||||
return {
|
||||
roleId,
|
||||
baseNum, // 基础分红
|
||||
posNum, // 职位分红
|
||||
weekendNum, // 额外分红,周末
|
||||
total: baseNum + posNum + weekendNum, // 总分红
|
||||
total: posNum + weekendNum, // 总分红
|
||||
status: 0, // 0:未领取,1:已领取
|
||||
};
|
||||
});
|
||||
|
||||
@@ -205,7 +205,6 @@ describe('拍卖行测试', function() {
|
||||
checkSuccessResponse(res);
|
||||
expect(res.data.dividend).to.be.an('object');
|
||||
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.weekendNum).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 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;
|
||||
}
|
||||
}
|
||||
|
||||
export interface RolePosition {
|
||||
roleId: string;
|
||||
position: number; // 职位
|
||||
}
|
||||
@@ -266,8 +266,6 @@ export class DividendRec {
|
||||
@prop({ required: true, default: '' })
|
||||
roleId: string;
|
||||
@prop({ required: true, default: 0 })
|
||||
baseNum: number; // 基础分红
|
||||
@prop({ required: true, default: 0 })
|
||||
posNum: number; // 职位分红
|
||||
@prop({ required: true, default: 0 })
|
||||
weekendNum: number; // 额外分红,周末
|
||||
|
||||
Reference in New Issue
Block a user