95 lines
2.8 KiB
JavaScript
95 lines
2.8 KiB
JavaScript
// 小数精度
|
||
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
|
||
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
|
||
}
|
||
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
|
||
}
|
||
}
|
||
}
|