89 lines
2.5 KiB
JavaScript
89 lines
2.5 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
|
|||
|
|
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
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|