✨ ERP:增加金额计算的四舍五入
This commit is contained in:
parent
1c98deaf27
commit
3308a494c7
@ -190,6 +190,56 @@ export const copyValueToTarget = (target: any, source: any) => {
|
|||||||
Object.assign(target, newObj)
|
Object.assign(target, newObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取链接的参数值
|
||||||
|
* @param key 参数键名
|
||||||
|
* @param urlStr 链接地址,默认为当前浏览器的地址
|
||||||
|
*/
|
||||||
|
export const getUrlValue = (key: string, urlStr: string = location.href): string => {
|
||||||
|
if (!urlStr || !key) return ''
|
||||||
|
const url = new URL(decodeURIComponent(urlStr))
|
||||||
|
return url.searchParams.get(key) ?? ''
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取链接的参数值(值类型)
|
||||||
|
* @param key 参数键名
|
||||||
|
* @param urlStr 链接地址,默认为当前浏览器的地址
|
||||||
|
*/
|
||||||
|
export const getUrlNumberValue = (key: string, urlStr: string = location.href): number => {
|
||||||
|
return toNumber(getUrlValue(key, urlStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建排序字段
|
||||||
|
* @param prop 字段名称
|
||||||
|
* @param order 顺序
|
||||||
|
*/
|
||||||
|
export const buildSortingField = ({ prop, order }) => {
|
||||||
|
return { field: prop, order: order === 'ascending' ? 'asc' : 'desc' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== NumberUtils 数字方法 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数组求和
|
||||||
|
*
|
||||||
|
* @param values 数字数组
|
||||||
|
* @return 求和结果,默认为 0
|
||||||
|
*/
|
||||||
|
export const getSumValue = (values: number[]): number => {
|
||||||
|
return values.reduce((prev, curr) => {
|
||||||
|
const value = Number(curr)
|
||||||
|
if (!Number.isNaN(value)) {
|
||||||
|
return prev + curr
|
||||||
|
} else {
|
||||||
|
return prev
|
||||||
|
}
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 通用金额方法 ==========
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将一个整数转换为分数保留两位小数
|
* 将一个整数转换为分数保留两位小数
|
||||||
* @param num
|
* @param num
|
||||||
@ -206,6 +256,7 @@ export const formatToFraction = (num: number | string | undefined): string => {
|
|||||||
*
|
*
|
||||||
* @param num 整数
|
* @param num 整数
|
||||||
*/
|
*/
|
||||||
|
// TODO @芋艿:看看怎么融合掉
|
||||||
export const floatToFixed2 = (num: number | string | undefined): string => {
|
export const floatToFixed2 = (num: number | string | undefined): string => {
|
||||||
let str = '0.00'
|
let str = '0.00'
|
||||||
if (typeof num === 'undefined') {
|
if (typeof num === 'undefined') {
|
||||||
@ -232,6 +283,7 @@ export const floatToFixed2 = (num: number | string | undefined): string => {
|
|||||||
* 将一个分数转换为整数
|
* 将一个分数转换为整数
|
||||||
* @param num
|
* @param num
|
||||||
*/
|
*/
|
||||||
|
// TODO @芋艿:看看怎么融合掉
|
||||||
export const convertToInteger = (num: number | string | undefined): number => {
|
export const convertToInteger = (num: number | string | undefined): number => {
|
||||||
if (typeof num === 'undefined') return 0
|
if (typeof num === 'undefined') return 0
|
||||||
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num
|
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num
|
||||||
@ -266,31 +318,89 @@ export const calculateRelativeRate = (value?: number, reference?: number) => {
|
|||||||
return ((100 * ((value || 0) - reference)) / reference).toFixed(0)
|
return ((100 * ((value || 0) - reference)) / reference).toFixed(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========== ERP 专属方法 ==========
|
||||||
|
|
||||||
|
const ERP_COUNT_DIGIT = 3
|
||||||
|
const ERP_PRICE_DIGIT = 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取链接的参数值
|
* 【ERP】格式化 Input 数字
|
||||||
* @param key 参数键名
|
*
|
||||||
* @param urlStr 链接地址,默认为当前浏览器的地址
|
* 例如说:库存数量
|
||||||
|
*
|
||||||
|
* @param num 数量
|
||||||
|
* @return 格式化后的数量
|
||||||
*/
|
*/
|
||||||
export const getUrlValue = (key: string, urlStr: string = location.href): string => {
|
export const erpNumberFormatter = (num: number | string | undefined, digit: number) => {
|
||||||
if (!urlStr || !key) return ''
|
if (num === null) {
|
||||||
const url = new URL(decodeURIComponent(urlStr))
|
return ''
|
||||||
return url.searchParams.get(key) ?? ''
|
}
|
||||||
|
if (typeof num === 'string') {
|
||||||
|
num = parseFloat(num)
|
||||||
|
}
|
||||||
|
// 如果非 number,则直接返回空串
|
||||||
|
if (isNaN(num)) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
return num.toFixed(digit)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取链接的参数值(值类型)
|
* 【ERP】格式化数量,保留三位小数
|
||||||
* @param key 参数键名
|
*
|
||||||
* @param urlStr 链接地址,默认为当前浏览器的地址
|
* 例如说:库存数量
|
||||||
|
*
|
||||||
|
* @param num 数量
|
||||||
|
* @return 格式化后的数量
|
||||||
*/
|
*/
|
||||||
export const getUrlNumberValue = (key: string, urlStr: string = location.href): number => {
|
export const erpCountInputFormatter = (num: number | string | undefined) => {
|
||||||
return toNumber(getUrlValue(key, urlStr))
|
return erpNumberFormatter(num, ERP_COUNT_DIGIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// noinspection JSCommentMatchesSignature
|
||||||
|
/**
|
||||||
|
* 【ERP】格式化数量,保留三位小数
|
||||||
|
*
|
||||||
|
* @param cellValue 数量
|
||||||
|
* @return 格式化后的数量
|
||||||
|
*/
|
||||||
|
export const erpCountTableColumnFormatter = (_, __, cellValue: any, ___) => {
|
||||||
|
return erpNumberFormatter(cellValue, ERP_COUNT_DIGIT)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建排序字段
|
* 【ERP】格式化金额,保留二位小数
|
||||||
* @param prop 字段名称
|
*
|
||||||
* @param order 顺序
|
* 例如说:库存数量
|
||||||
|
*
|
||||||
|
* @param num 数量
|
||||||
|
* @return 格式化后的数量
|
||||||
*/
|
*/
|
||||||
export const buildSortingField = ({ prop, order }) => {
|
export const erpPriceInputFormatter = (num: number | string | undefined) => {
|
||||||
return { field: prop, order: order === 'ascending' ? 'asc' : 'desc' }
|
return erpNumberFormatter(num, ERP_PRICE_DIGIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// noinspection JSCommentMatchesSignature
|
||||||
|
/**
|
||||||
|
* 【ERP】格式化金额,保留二位小数
|
||||||
|
*
|
||||||
|
* @param cellValue 数量
|
||||||
|
* @return 格式化后的数量
|
||||||
|
*/
|
||||||
|
export const erpPriceTableColumnFormatter = (_, __, cellValue: any, ___) => {
|
||||||
|
return erpNumberFormatter(cellValue, ERP_PRICE_DIGIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【ERP】价格计算,四舍五入保留两位小数
|
||||||
|
*
|
||||||
|
* @param price 价格
|
||||||
|
* @param count 数量
|
||||||
|
* @return 总价格。如果有任一为空,则返回 undefined
|
||||||
|
*/
|
||||||
|
export const erpPriceMultiply = (price: number, count: number) => {
|
||||||
|
if (price == null || count == null) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return parseFloat((price * count).toFixed(ERP_PRICE_DIGIT))
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
:inline-message="true"
|
:inline-message="true"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
>
|
>
|
||||||
<el-table :data="formData" show-summary class="-mt-10px">
|
<el-table :data="formData" show-summary :summary-method="getSummaries" class="-mt-10px">
|
||||||
<el-table-column label="序号" type="index" align="center" width="60" />
|
<el-table-column label="序号" type="index" align="center" width="60" />
|
||||||
<el-table-column label="仓库名称" min-width="125">
|
<el-table-column label="仓库名称" min-width="125">
|
||||||
<template #default="{ row, $index }">
|
<template #default="{ row, $index }">
|
||||||
@ -55,7 +55,7 @@
|
|||||||
<el-table-column label="库存" min-width="100">
|
<el-table-column label="库存" min-width="100">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-form-item class="mb-0px!">
|
<el-form-item class="mb-0px!">
|
||||||
<el-input disabled v-model="row.stockCount" />
|
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -73,13 +73,14 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="数量" prop="count" fixed="right" min-width="120">
|
<el-table-column label="数量" prop="count" fixed="right" min-width="140">
|
||||||
<template #default="{ row, $index }">
|
<template #default="{ row, $index }">
|
||||||
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
|
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="row.count"
|
v-model="row.count"
|
||||||
controls-position="right"
|
controls-position="right"
|
||||||
:min="1"
|
:min="0.001"
|
||||||
|
:precision="3"
|
||||||
class="!w-100%"
|
class="!w-100%"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -92,7 +93,13 @@
|
|||||||
:rules="formRules.productPrice"
|
:rules="formRules.productPrice"
|
||||||
class="mb-0px!"
|
class="mb-0px!"
|
||||||
>
|
>
|
||||||
<el-input-number v-model="row.productPrice" controls-position="right" :min="1" />
|
<el-input-number
|
||||||
|
v-model="row.productPrice"
|
||||||
|
controls-position="right"
|
||||||
|
:min="0.01"
|
||||||
|
:precision="2"
|
||||||
|
class="!w-100%"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -103,7 +110,7 @@
|
|||||||
:rules="formRules.totalPrice"
|
:rules="formRules.totalPrice"
|
||||||
class="mb-0px!"
|
class="mb-0px!"
|
||||||
>
|
>
|
||||||
<el-input disabled v-model="row.totalPrice" />
|
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -129,6 +136,13 @@
|
|||||||
import { ProductApi, ProductVO } from '@/api/erp/product/product'
|
import { ProductApi, ProductVO } from '@/api/erp/product/product'
|
||||||
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
|
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
|
||||||
import { StockApi } from '@/api/erp/stock/stock'
|
import { StockApi } from '@/api/erp/stock/stock'
|
||||||
|
import {
|
||||||
|
erpCountInputFormatter,
|
||||||
|
erpPriceInputFormatter,
|
||||||
|
erpPriceMultiply,
|
||||||
|
getSumValue
|
||||||
|
} from '@/utils'
|
||||||
|
import { fenToYuanFormat } from '@/utils/formatter'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
items: undefined
|
items: undefined
|
||||||
@ -166,17 +180,33 @@ watch(
|
|||||||
}
|
}
|
||||||
// 循环处理
|
// 循环处理
|
||||||
val.forEach((item) => {
|
val.forEach((item) => {
|
||||||
// TODO 芋艿:后面处理下相乘问题;包括后端的;
|
item.totalPrice = erpPriceMultiply(item.productPrice, item.count)
|
||||||
if (item.productPrice && item.count) {
|
|
||||||
item.totalPrice = item.productPrice * item.count
|
|
||||||
} else {
|
|
||||||
item.totalPrice = undefined
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/** 合计 */
|
||||||
|
const getSummaries = (param: SummaryMethodProps) => {
|
||||||
|
const { columns, data } = param
|
||||||
|
const sums: string[] = []
|
||||||
|
columns.forEach((column, index) => {
|
||||||
|
if (index === 0) {
|
||||||
|
sums[index] = '合计'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (['count', 'totalPrice'].includes(column.property)) {
|
||||||
|
const sum = getSumValue(data.map((item) => Number(item[column.property])))
|
||||||
|
sums[index] =
|
||||||
|
column.property === 'count' ? erpCountInputFormatter(sum) : erpPriceInputFormatter(sum)
|
||||||
|
} else {
|
||||||
|
sums[index] = ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return sums
|
||||||
|
}
|
||||||
|
|
||||||
/** 新增按钮操作 */
|
/** 新增按钮操作 */
|
||||||
const handleAdd = () => {
|
const handleAdd = () => {
|
||||||
const row = {
|
const row = {
|
||||||
|
@ -157,12 +157,22 @@
|
|||||||
label="入库时间"
|
label="入库时间"
|
||||||
align="center"
|
align="center"
|
||||||
prop="inTime"
|
prop="inTime"
|
||||||
:formatter="dateFormatter"
|
:formatter="dateFormatter2"
|
||||||
width="180px"
|
width="120px"
|
||||||
/>
|
/>
|
||||||
<el-table-column label="创建人" align="center" prop="creatorName" />
|
<el-table-column label="创建人" align="center" prop="creatorName" />
|
||||||
<el-table-column label="数量" align="center" prop="totalCount" />
|
<el-table-column
|
||||||
<el-table-column label="金额" align="center" prop="totalPrice" />
|
label="数量"
|
||||||
|
align="center"
|
||||||
|
prop="totalCount"
|
||||||
|
:formatter="erpCountTableColumnFormatter"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
label="金额"
|
||||||
|
align="center"
|
||||||
|
prop="totalPrice"
|
||||||
|
:formatter="erpPriceTableColumnFormatter"
|
||||||
|
/>
|
||||||
<el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
|
<el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
|
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
|
||||||
@ -229,7 +239,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import { StockInApi, StockInVO } from '@/api/erp/stock/in'
|
import { StockInApi, StockInVO } from '@/api/erp/stock/in'
|
||||||
import StockInForm from './StockInForm.vue'
|
import StockInForm from './StockInForm.vue'
|
||||||
@ -239,6 +249,7 @@ import { SupplierApi, SupplierVO } from '@/api/erp/purchase/supplier'
|
|||||||
import { UserVO } from '@/api/system/user'
|
import { UserVO } from '@/api/system/user'
|
||||||
import * as UserApi from '@/api/system/user'
|
import * as UserApi from '@/api/system/user'
|
||||||
import * as BusinessApi from '@/api/crm/business'
|
import * as BusinessApi from '@/api/crm/business'
|
||||||
|
import { erpCountTableColumnFormatter, erpPriceTableColumnFormatter } from '@/utils'
|
||||||
|
|
||||||
/** ERP 其它入库单 列表 */
|
/** ERP 其它入库单 列表 */
|
||||||
defineOptions({ name: 'ErpStockIn' })
|
defineOptions({ name: 'ErpStockIn' })
|
||||||
|
Loading…
Reference in New Issue
Block a user