ttk-app-core
Version:
@ttk/recat enterprise develop framework
229 lines (211 loc) • 7.65 kB
JavaScript
import React, { useState, useCallback, useEffect } from 'react'
import { Spin, Card, Layout, Row, Col, Form, Input, Checkbox, AntdSelect as Select, Button, DataGrid, Pagination } from '@ttk/component'
import { Modal } from "antd"
import { Link } from "@ttk/router"
import { toFixed, toFixedForce } from "@/utils/number"
import { slFloat, jeFloat, djFloat } from "@/apps/app-demo/invoice-manage/constant"
import { useData, useActions, useCommit } from '@ttk/app-loader'
export default function Component(props) {
const commit = useCommit()
const actions = useActions(props)
const validateState = useData([props, 'validateState']).toJS()
const { showBalanceModal: showModal, editId, editIndex, defaultRate, rateList, editInfo } = useData([props, 'tempState']).toJS()
let { fymxList, hsbz, hsslbs, kce, tmpSalePrice } = useData([props, 'formObj']).toJS()
const [ loading, setLoading ] = useState(false)
// 更新表单方法
const updateForm = useCallback((e) => {
async function asyncFun(arges) {
await actions.updateBalanceForm(e)
}
asyncFun(e)
}, [])
/**
* 差额征税 金额计算
*
* 先算税额,若(含税销售额-扣除额)>0,税额=(含税销售额-扣除额)*(税率或征收率)/(1+税率或征收率),若(含税销售额-扣除额)<=0,则税额=0,再算金额=含税销售额-税额,如果数量不为空,则不含税单价=金额/数量,若数量为空,则不含税单价也为空。
* */
const onOk = useCallback(() => {
async function asyncFunc() {
setLoading(true)
let result = await actions.updateBalanceForm()
if (!result) {
return
}
tmpSalePrice = Number(tmpSalePrice)
kce = Number(kce)
if (editId) {
edit(rateList, editInfo, tmpSalePrice, kce)
} else {
add(rateList, editInfo, tmpSalePrice, kce)
}
actions.updateForm({kce: toFixed(kce, 2)})
setLoading(false)
}
asyncFunc()
}, [editId, rateList, editInfo, defaultRate, tmpSalePrice, kce])
async function add (rateList, editInfo, tmpSalePrice, kce) {
// 商品税率列表处理,税率列表由后台通过税率规则给出
let tmpRateList = [ ...rateList ]
let se = "" // 税额
let je = ""
let sl = editInfo.zzssl || defaultRate // 税率默认为税率列表的第一项
tmpRateList = tmpRateList.filter((item) => {
return item.taxRate != 0.015
})
if (editInfo.taxPerferentialRateList) {
// 如果是税收优惠政策的商品,则税率下拉使用商品信息带过来的税率列表taxPerferentialRate字段
// 若商品的税率不在默认的税率范围内,则默认填入第一个税率(除0%外的税率),税率下拉依然为默认税率
tmpRateList = editInfo.taxPerferentialRateList.map((rate) => {
let item = {
taxRate: rate.value,
taxRateLabel: rate.desc
}
return item
})
}
// 税率列表排序
tmpRateList.sort((a, b) =>{
return a.taxRate - b.taxRate
})
let hasGoodsRate = tmpRateList.find((item) =>{
return item.taxRate == editInfo.zzssl
})
if (!hasGoodsRate) {
// 商品税率不包含在内,则选择下拉列表的第一项不为0的税率
// 差额征税,不能选择0.015
if (editInfo.zzssl != 0.015) {
let notZero = tmpRateList.find((item) =>{
return item.taxRate > 0
})
if (notZero) {
sl = notZero.taxRate
} else {
tmpRateList.push({ taxRate: editInfo.zzssl, taxRateLabel: toFixed(editInfo.zzssl * 100, 1) + "%" }) // 将商品税率添加至税率列表
// 税率列表排序
tmpRateList.sort((a, b) =>{
return a.taxRate - b.taxRate
})
}
} else {
sl = defaultRate // 若商品税率为0.015时,切换到默认税率
}
}
sl = Number(sl)
if (tmpSalePrice > kce) {
se = (tmpSalePrice - kce) * sl / (1 + sl)
} else {
se = 0
}
je = tmpSalePrice - se
// 不含税单价 数量
let dj, tmpDj, spsl
dj = tmpDj = editInfo.xmdj && sl && editInfo.xmdj / ( 1 + sl)
if (editInfo.xmdj && sl) {
dj = tmpDj = editInfo.xmdj / ( 1 + sl)
spsl = je / dj
}
// 取小数位并四舍五入
je = toFixedForce(je, jeFloat)
se = toFixedForce(se, jeFloat)
dj = toFixed(dj, djFloat)
tmpDj = toFixed(tmpDj, djFloat)
spsl = toFixed(spsl, djFloat)
let row = {
...editInfo,
spId: editInfo.id, // 商品id
spbm: editInfo.ssflbm, // 商品编码
zxbm: editInfo.bm, // 商品自行编码,沿用商品编码
yhzcbs: editInfo.yhzcbs, // 税收优惠标识
lslbs: editInfo.lslbs,
zzstsgl: editInfo.yhzclx,
hsbz: hsbz ? 1 : 0,
fphxz: 0,
spmc: (editInfo.spbmjc ? "*" + editInfo.spbmjc + "*" :"") + editInfo.spmc,
je,
tmpJe: je,
se,
sl: sl + '',
dj,
tmpDj,
spsl,
tmpRateList,
}
fymxList = [row]
// commit([props, 'formObj'], { type: "update", data: { fymxList }})
await actions.updateKjmxlist(fymxList)
actions.updateGoodsForm(null, 0) // 这里一定要调用updateGoodsForm,以便更新合计
onCancel()
}
async function edit (rateList, editInfo, tmpSalePrice, kce) {
let { je, se, spsl, sl, dj } = editInfo
sl = Number(sl)
if (tmpSalePrice > kce) {
se = (tmpSalePrice - kce) * sl / (1 + sl)
} else {
se = 0
}
je = tmpSalePrice - se
if (spsl && spsl != 0) {
dj = je / spsl
} else if (dj && dj != 0) {
spsl = je / dj
}
// 取小数位并四舍五入
je = toFixedForce(je, jeFloat)
se = toFixedForce(se, jeFloat)
dj = dj && toFixed(dj, djFloat)
spsl = spsl && toFixed(spsl, slFloat)
let row = {
...editInfo,
je,
tmpJe: je,
se,
dj,
spsl,
}
fymxList = [row]
commit([props, 'formObj'], { type: "update", data: { fymxList }})
actions.updateGoodsForm(null, 0) // 这里一定要调用updateGoodsForm,以便更新合计
onCancel()
}
// 取消
const onCancel = useCallback(() => {
commit([props, 'tempState'], { type: 'setBalanceModal', data: false })
commit([props, 'tempState'], { type: "setEditInfo", data: {} })
commit([props, 'tempState'], { type: "setEditId", data: null })
commit([props, 'tempState'], { type: "setEditIndex", data: null })
commit([props, 'goodsSearchForm'], { type: "init" })
}, [])
return (
<Modal
className="balance-modal"
width={380}
height={400}
title="差额设置"
visible={showModal}
maskClosable={false}
okText="确定"
cancelText="取消"
confirmLoading={loading}
onOk={onOk}
onCancel={onCancel}
>
<Row>
<Form>
<Form.Item label="含税销售额"
required={true}
validateStatus={validateState.tmpSalePrice.state}
help={validateState.tmpSalePrice.message}>
<Input value={tmpSalePrice} placeholder="请输入含税销售额" onChange={e => updateForm({ tmpSalePrice: e.target.value })}/>
</Form.Item>
<Form.Item label="扣除额"
required={true}
validateStatus={validateState.kce.state}
help={validateState.kce.message}>
<Input value={kce} placeholder="请输入扣除额" onChange={e => updateForm({ kce: e.target.value })}/>
</Form.Item>
</Form>
</Row>
</Modal>
)
}