UNPKG

ttk-app-core

Version:

@ttk/recat enterprise develop framework

300 lines (281 loc) 9.62 kB
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, Table } from "antd" import { Link } from "@ttk/router" import { toFixed } from "@/utils/number" import { transformSlv } from "@/utils" 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 goodsSearchForm = useData([props, 'goodsSearchForm']).toJS() const goodsTableData = useData([props, 'goodsTableData']).toJS() const { showGoodsModal: showModal, editId, editIndex, defaultRate, rateList } = useData([props, 'tempState']).toJS() const { pageIndex, pageSize, recordCount } = useData([props, 'goodsPagination']).toJS() let { fymxList, hsbz, hsslbs } = useData([props, 'formObj']).toJS() // 内部管理loading状态 const [loading, setLoading] = useState(false) async function fetchData(keyword) { setLoading(true) await actions.goodsTableData({hsslbs, keyword}) setLoading(false) } // 初始化 useEffect(() => { fetchData() }, []) // 更新表单方法 const updateForm = useCallback((e) => { async function asyncFun(arges) { await actions.updateGoodsSearchForm(e) } asyncFun(e) }, []) const onChose = useCallback((row) => { if (hsslbs == 2) { // 差额征税,须填写含税销售额和扣除额 commit([props, "formObj"], { type: "update", data: {kce: "", tmpSalePrice: ""}}) commit([props, "formObj"], { type: "update", data: {kce: "", tmpSalePrice: ""}}) commit([props, "tempState"], { type: "setEditInfo", data: row}) commit([props, "tempState"], { type: "setBalanceModal", data: true}) commit([props, "tempState"], { type: "setGoodsModal", data: false}) commit([props, "goodsTableData"], { type: "update", data: []}) return } // 商品单价都是含税的 // 商品税率列表处理,税率列表由后台通过税率规则给出 let tmpRateList = [ ...rateList ] let sl = row.zzssl || defaultRate // 税率默认为税率列表的第一项 if (row.taxPerferentialRateList) { // 如果是税收优惠政策的商品,则税率下拉使用商品信息带过来的税率列表taxPerferentialRate字段 // 若商品的税率不在默认的税率范围内,则默认填入第一个税率(除0%外的税率),税率下拉依然为默认税率 tmpRateList = row.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 == row.zzssl }) if (!hasGoodsRate) { // 商品税率不包含在内,则选择下拉列表的第一项不为0的税率 if (hsslbs == 0) { // 普通征税 let notZero = tmpRateList.find((item) =>{ return item.taxRate > 0 }) if (notZero) { sl = notZero.taxRate } else { tmpRateList.push({ taxRate: row.zzssl, taxRateLabel: toFixed(row.zzssl * 100, 1) + "%" }) // 将商品税率添加至税率列表 // 税率列表排序 tmpRateList.sort((a, b) =>{ return a.taxRate - b.taxRate }) } } else if (hsslbs == 1) { // 减按征税, 只能选择0.015 sl = "0.015" } } sl = Number(sl) let dj, tmpDj, tmpHsdj tmpHsdj = row.xmdj tmpDj = row.xmdj && sl > -1 && row.xmdj / ( 1 + sl) if (hsbz) { // 含税单价 dj = tmpHsdj } else { // 不含税单价 dj = tmpDj } row = { ...row, spId: row.id, // 商品id hsbz: hsbz ? 1 : 0, spmc: (row.spbmjc ? "*" + row.spbmjc + "*" : "") + row.spmc, spbm: row.ssflbm, // 税收分类编码 dj: toFixed(dj, djFloat), tmpDj: toFixed(tmpDj, djFloat), tmpHsdj: toFixed(tmpHsdj, djFloat), // 含税单价 se: "", je: "", fphxz: 0, // 发票行性质, 0 正常行、1 折扣行、2 被折扣行 zkType: "1", // 折扣方式, 1按比例,2按金额 sl: sl + '', zxbm: row.bm, // 商品自行编码,沿用商品编码 yhzcbs: row.yhzcbs, // 税收优惠标识 lslbs: row.lslbs , zzstsgl: row.yhzclx, tmpRateList, } if (editIndex != null) { fymxList.splice(editIndex, 1, row) } else { fymxList.push(row) } // commit([props, 'formObj'], { type: "update", data: { fymxList }}) actions.updateKjmxlist(fymxList) commit([props, 'tempState'], { type: "setGoodsModal", data: false }) commit([props, "goodsTableData"], { type: "update", data: []}) commit([props, 'tempState'], { type: "setEditIndex", data: null }) commit([props, 'goodsSearchForm'], { type: "init" }) }, [hsslbs, fymxList, defaultRate, editIndex, hsbz]) const onPageSizeChange = useCallback((current, pageSize) => { return async function () { await actions.updateGoodsSearchForm({ pageSize }) fetchData(goodsSearchForm.spmc) }() }, [goodsSearchForm]) const onPageChange = useCallback((page, pageSize) => { return async function () { await actions.updateGoodsSearchForm({ pageIndex: page }) fetchData(goodsSearchForm.spmc) }() }, [goodsSearchForm]) const onSearch = useCallback(() => { return async function () { await actions.updateGoodsSearchForm({ pageIndex: 1 }) fetchData(goodsSearchForm.spmc) }() }, [goodsSearchForm]) // 清除方法 const onCancel = useCallback(() => { commit([props, 'tempState'], { type: 'setGoodsModal', data: false }) commit([props, "goodsTableData"], { type: "update", data: []}) commit([props, 'tempState'], { type: "setEditId", data: "" }) commit([props, 'tempState'], { type: "setEditIndex", data: null }) commit([props, 'goodsSearchForm'], { type: "init" }) }, []) const tableThead = [{ dataIndex: 'bm', key: 'bm', title: '商品编号', width: 120, ellipsis: true, align: "center", }, { dataIndex: 'spmc', key: 'spmc', title: '商品名称', ellipsis: true, align: "center", }, { dataIndex: 'ssflbm', key: 'ssflbm', title: '税收分类编码', width: 100, ellipsis: true, align: "center", }, { dataIndex: 'zzssl', key: 'zzssl', title: '税率', width: 60, ellipsis: true, align: "center", render: (text, row, rowIndex) => { const {zzssl,yhzclx} = row; return transformSlv({zzssl, yhzclx}) } }, { dataIndex: 'yhzclx', key: 'yhzclx', title: '税收优惠政策', width: 120, ellipsis: true, align: "center", render: (text) => { return text || '-' } }, { dataIndex: 'lslbsDesc', key: 'lslbsDesc', title: '免税类型', width: 100, ellipsis: true, align: "center", render: (text) => { return text || '-' } }, { dataIndex: 'ggxh', key: 'ggxh', title: '规格型号', width: 80, ellipsis: true, align: "center", render: (text) => { return text || '-' } }, { dataIndex: 'xmdj', key: 'xmdj', title: '单价', width: 100, ellipsis: true, align: "center", render: (text) => { return text || '-' } }, { dataIndex: 'operation', key: 'operation', className: "operationcell", title: '操作', width: 80, render: (text, row, rowIndex) => { return ( <span onClick={() => onChose(row)}>选择</span> ) } }] return ( <Modal className="ttk-card-form" width={1000} height={600} title="选择商品信息" visible={showModal} footer={false} maskClosable={false} onCancel={onCancel} > <Spin> <Card bordered={true} style={{marginBottom:10}}> <Row> <Form layout="inline"> <Form.Item> <Input className="mk-input" allowClear value={goodsSearchForm.spmc} placeholder="请输入商品编码/商品名称进行查询" onChange={e => updateForm({ spmc: e.target.value })} style={{ width: 300 }}/> <Button type="primary" onClick={onSearch} style={{ marginLeft: "10px" }}>查询</Button> </Form.Item> </Form> </Row> <Row> <Table loading={loading} bordered className="mk-table" dataSource={goodsTableData} columns={tableThead} pagination={false} rowKey="id"/> </Row> </Card> <Row style={{ margin: "10px 0", padding: "0 10px" }}> <Pagination pageSize={pageSize} total={recordCount} current={pageIndex} showSizeChanger={true} pageSizeOptions={['10', '20', '50', '100', '200', '300', '400']} onChange={onPageChange} onShowSizeChange={onPageSizeChange} /> </Row> </Spin> <span>没有找到所需的商品信息? </span><Link to="/app-root/layout/goods-maintain">去新增</Link> </Modal> ) }