cos-web/src/views/resource-apply/mixins/price.js

95 lines
2.8 KiB
JavaScript
Raw Normal View History

2024-05-18 08:53:17 +00:00
// 小数精度
import { getPrice } from 'components/sku-table/utils'
const decimalPrecision = 2
export default {
data() {
return {
discountType: 'Tenant'
}
},
computed: {
unit() {
const {
emption: {
duration: { mode }
},
unit
} = this.addData
// 存在unit时自定义单位
if (unit) {
const [{ amount }] = this.elements
return mode === 'Hour' ? unit : `${amount}${unit}`
}
return mode === 'Hour' ? '小时' : '月'
},
discount() {
return this.$store.state.app.userData.discount
},
discountPrice() {
return (this.price * this.discount).toFixed(decimalPrecision)
},
price() {
let priceTotal = 0
const {
emption: {
count,
duration: { amount = 1 }
},
service
} = this.addData
this.elements.forEach((item) => {
const price = this.getSkuPrice(item)
priceTotal += price
})
return (priceTotal * amount * count).toFixed(decimalPrecision)
}
},
methods: {
// 获取每个规格的具体信息
getSkuPrice(item) {
const { service, serviceItem } = this.addData
const { skuId, skuList = [], insAmount = 1, otherAmount = 0, elements, serviceCode, basic } = item
if (elements) {
// 该元素下有多个类型
let priceTotal = 0
elements.forEach((cell) => {
const price = this.getSkuPrice(cell)
priceTotal += price
})
return priceTotal
}
let sku = skuList.find((item) => skuId === item.id)
if (!sku && skuList.length) {
const basicPrice = JSON.parse(skuList[0].basicPrice)
sku = {
...basicPrice[0],
billPolicy: 'spec',
billable: true
}
}
// 没有sku并且不是运维和编排服务直接返回0
if (!sku && !service.includes('fabric') && !service.includes('operations')) return 0
const {
emption: {
duration: { mode }
}
} = this.addData
// 代码容错处理
if (!sku && !serviceItem) return 0
2024-05-28 07:53:11 +00:00
if (['cloudtower.standard.volume', 'cnware.standard.volume'].includes(serviceCode) && item.name === '系统盘') {
// cloudtower/cnware 系统盘根据基础定价来计算
const basicPrice = JSON.parse(skuList[0]?.basicPrice || '[]')
if (insAmount === 1) return 0
return basicPrice[0].monthPrice * insAmount
}
2024-05-18 08:53:17 +00:00
const price = getPrice(sku || serviceItem, mode)
// 集群部署多个实例
const { nodes = 1 } = this.addData
// 实例数量/计数单位向上取整
const count = Math.ceil(insAmount + otherAmount / 1)
const finallPrice = Number((price * count * nodes).toFixed(decimalPrecision))
return finallPrice
}
}
}