kts-component-invoice-operate 3.2.227 → 3.2.228-fuling

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +0 -4
  2. package/dist/Invoice/Invoice-digtal/_test/pay/index.d.ts +4 -0
  3. package/dist/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.d.ts +0 -1
  4. package/dist/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.d.ts +0 -2
  5. package/dist/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.d.ts +0 -2
  6. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/IColumnsReplenish/index.d.ts +6 -0
  7. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/IGood/index.d.ts +12 -0
  8. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/ImportGoods/index.d.ts +21 -0
  9. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/index.d.ts +31 -0
  10. package/dist/Invoice/InvoiceController/InvoiceControllerState/index.d.ts +2 -0
  11. package/dist/Invoice/InvoiceController/fns/addPay.d.ts +6 -0
  12. package/dist/Invoice/InvoiceController/fns/delPay.d.ts +6 -0
  13. package/dist/Invoice/InvoiceController/fns/saveEditPay.d.ts +6 -0
  14. package/dist/Invoice/InvoiceController/fns/setEditPay.d.ts +6 -0
  15. package/dist/Invoice/InvoiceController/fns/setPay.d.ts +6 -0
  16. package/dist/Invoice/InvoiceController/index.d.ts +6 -0
  17. package/dist/Invoice/index.d.ts +2 -0
  18. package/dist/Invoice/ui/default/GoodsList/index.d.ts +0 -1
  19. package/dist/Invoice/ui/default/GoodsList/ui/AddRowButton/index.d.ts +1 -1
  20. package/dist/Invoice/ui/digtal/GoodsList/index.d.ts +0 -1
  21. package/dist/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.d.ts +1 -4
  22. package/dist/Invoice/ui/digtal/PayList/hook/useColumns/index.d.ts +3 -0
  23. package/dist/Invoice/ui/digtal/PayList/hook/useColumns/ui/TitleText/index.d.ts +8 -0
  24. package/dist/Invoice/ui/digtal/PayList/hook/useOnRow/index.d.ts +8 -0
  25. package/dist/Invoice/ui/digtal/PayList/hook/useRowSelection/index.d.ts +8 -0
  26. package/dist/Invoice/ui/digtal/PayList/hook/useWindowClick/index.d.ts +5 -0
  27. package/dist/Invoice/ui/digtal/PayList/index.d.ts +18 -0
  28. package/dist/Invoice/ui/digtal/PayList/ui/AddRowButton/index.d.ts +3 -0
  29. package/dist/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useDelRowButton/index.d.ts +6 -0
  30. package/dist/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useEmptyRefill/index.d.ts +6 -0
  31. package/dist/Invoice/ui/digtal/PayList/ui/TableRow/index.d.ts +3 -0
  32. package/dist/Invoice/ui/digtal/PayList/ui/TableVirtual/index.d.ts +4 -0
  33. package/dist/index.esm.js +8097 -6065
  34. package/dist/index.js +8096 -6064
  35. package/package.json +1 -1
  36. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +41 -9
  37. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +23 -17
  38. package/src/Invoice/Invoice-digtal/_test/pay/index.tsx +14637 -0
  39. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +7 -69
  40. package/src/Invoice/Invoice-digtal/index.md +16 -8
  41. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +11 -0
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +0 -2
  43. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +0 -3
  44. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +0 -3
  45. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IColumnsReplenish/index.ts +10 -0
  46. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IGood/index.ts +35 -0
  47. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/ImportGoods/index.ts +81 -0
  48. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/index.ts +40 -0
  49. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +3 -0
  50. package/src/Invoice/InvoiceController/fns/addPay.ts +11 -0
  51. package/src/Invoice/InvoiceController/fns/delPay.ts +38 -0
  52. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +2 -2
  53. package/src/Invoice/InvoiceController/fns/saveEditPay.ts +23 -0
  54. package/src/Invoice/InvoiceController/fns/setEditPay.ts +16 -0
  55. package/src/Invoice/InvoiceController/fns/setPay.ts +11 -0
  56. package/src/Invoice/InvoiceController/index.ts +21 -0
  57. package/src/Invoice/_test/deduction/index.tsx +6 -28
  58. package/src/Invoice/index.md +4 -4
  59. package/src/Invoice/index.tsx +3 -0
  60. package/src/Invoice/tools/useToGenerateId/index.ts +2 -0
  61. package/src/Invoice/ui/default/GoodsList/index.tsx +1 -3
  62. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +1 -8
  63. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +1 -4
  64. package/src/Invoice/ui/digtal/Architecture/index.tsx +1 -1
  65. package/src/Invoice/ui/digtal/FreightList/index.tsx +1 -1
  66. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +23 -37
  67. package/src/Invoice/ui/digtal/GoodsList/index.tsx +1 -3
  68. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +10 -20
  69. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +6 -11
  70. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +2 -5
  71. package/src/Invoice/ui/digtal/PayList/hook/useColumns/dist/index.js +616 -0
  72. package/src/Invoice/ui/digtal/PayList/hook/useColumns/index.tsx +168 -0
  73. package/src/Invoice/ui/digtal/PayList/hook/useColumns/ui/TitleText/index.tsx +20 -0
  74. package/src/Invoice/ui/digtal/PayList/hook/useOnRow/index.tsx +37 -0
  75. package/src/Invoice/ui/digtal/PayList/hook/useRowSelection/index.tsx +120 -0
  76. package/src/Invoice/ui/digtal/PayList/hook/useWindowClick/index.tsx +19 -0
  77. package/src/Invoice/ui/digtal/PayList/index.less +73 -0
  78. package/src/Invoice/ui/digtal/PayList/index.tsx +132 -0
  79. package/src/Invoice/ui/digtal/PayList/ui/AddRowButton/index.tsx +75 -0
  80. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -0
  81. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -0
  82. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.less +29 -0
  83. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.tsx +21 -0
  84. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.less +39 -0
  85. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.tsx +109 -0
  86. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +0 -7
  87. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +104 -363
  88. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +1 -1
  89. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +528 -207
  90. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +4 -22
@@ -0,0 +1,168 @@
1
+
2
+ import React from 'react';
3
+ import { Form } from 'kts-components-antd-x3';
4
+ import { Select, Input, Spin, InputProps, Cascader } from 'kts-xui';
5
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
6
+ import { IGood2,IGood3 } from '../../../../../InvoiceController';
7
+ import Invoice from '../../../../..';
8
+ import TitleText from './ui/TitleText';
9
+
10
+ export default (form: WrappedFormUtils) => {
11
+ const { getFieldDecorator } = form;
12
+
13
+ const controller = Invoice.useInvoiceController();
14
+
15
+ const rootElement = controller.useMemo(s => s.rootElement, []);
16
+
17
+ /** 组件模式 */
18
+ const model = controller.useMemo(e => e.model, []);
19
+
20
+ /** 正在编辑的货物 */
21
+ const editGood = controller.useMemo((e) => e.payListState.editGood, []);
22
+
23
+ /** 禁用字段 */
24
+ const disableds = controller.useMemo((e) => e.stakeholder.disableds || [], []);
25
+
26
+ /** 运输工具种类列表 */
27
+ const vehicleTypeList = controller.useMemo((e) => e.payListState.vehicleTypeList, []);
28
+
29
+ const area = controller.useMemo((e) => e.payListState.area, []);
30
+ const addressFieldNames = controller.useMemo((e) => e.payListState.addressFieldNames, []);
31
+ const getVehicle = React.useCallback((value?: string) => {
32
+ if (vehicleTypeList && vehicleTypeList.length > 0) {
33
+ return vehicleTypeList.find(e => e.value === value)?.label || '';
34
+ }
35
+ }, [vehicleTypeList])
36
+ const splitArea = React.useCallback((value?: string) => {
37
+ if (value) {
38
+ const _array = value.split(',');
39
+ return _array;
40
+ } else {
41
+ return [];
42
+ }
43
+ }, []);
44
+ const [required,setRequired]=React.useState(false);
45
+
46
+ const onInputChange=React.useCallback((e:any)=>{
47
+ const value=e.target.value;
48
+ if(value){
49
+ setRequired(true);
50
+ }else{
51
+ setRequired(false);
52
+ }
53
+ },[]);
54
+ /** 表头 */
55
+ const columns = React.useMemo(() => {
56
+ return [
57
+ {
58
+ title: '序号',
59
+ key: 'sortNumber',
60
+ dataIndex: 'sortNumber',
61
+ width: 50,
62
+ render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
63
+ },
64
+ {
65
+ title: <TitleText >支付渠道</TitleText>,
66
+ key: 'channel',
67
+ render: (_: string, record: IGood3) => {
68
+ if (editGood?.$index === record.$index && !disableds.includes('channel') && !(model === 'prefab')) {
69
+ return (
70
+ <Form.Item>
71
+ {getFieldDecorator('channel', {
72
+ initialValue: editGood.channel,
73
+ rules: [
74
+ { required: required, message: '请输入' },
75
+ ],
76
+ })(
77
+ <Select
78
+ className="kts-invoice-operate-goods-list-table-tax-rate"
79
+ allowClear={true}
80
+ // showArrow={false}
81
+ style={{ width: '100%' }}
82
+ getPopupContainer={() => rootElement || document.body}
83
+ onChange={async (value) => {
84
+ await controller.wait()
85
+ controller.setEditPay({ type: value });
86
+ }}
87
+ >
88
+ {(record.vehicleList || vehicleTypeList).map((e, i) => {
89
+ return (
90
+ <Select.Option key={i} value={e.value}>
91
+ {e.label}
92
+ </Select.Option>
93
+ );
94
+ })}
95
+ </Select>,
96
+ )}
97
+ </Form.Item>
98
+ );
99
+ } else {
100
+ return <span style={{ padding: '0 10px' }}>{getVehicle(record.channel)}</span>;
101
+ }
102
+ },
103
+ },
104
+ {
105
+ title: <TitleText >交易单号</TitleText>,
106
+ key: 'number',
107
+ width: 119,
108
+ render: (_: string, record: IGood3) => {
109
+ if (editGood?.$index === record.$index && !disableds.includes('number') && model !== 'prefab') {
110
+ return (
111
+ <Form.Item>
112
+ {getFieldDecorator('number', {
113
+ initialValue: editGood.number,
114
+ rules: [
115
+ { required: required, message: '请输入' },
116
+ ],
117
+ })(
118
+ <MyInput
119
+ maxLength={200}
120
+ onChange={async (e) => {
121
+ // onInputChange(e);
122
+ await controller.wait()
123
+ await controller.setEditPay({ number: form.getFieldsValue().number });
124
+ }}
125
+ />,
126
+ )}
127
+ </Form.Item>
128
+ );
129
+ } else {
130
+ return <span style={{ padding: '0 10px' }}>{record.number}</span>;
131
+ }
132
+ },
133
+ },
134
+ ]
135
+
136
+ // 只读
137
+ .filter(e => {
138
+ if (model === 'readOnly') {
139
+ return e.key !== 'operating';
140
+ } else {
141
+ return true;
142
+ }
143
+ })
144
+ .map((e) => {
145
+ return {
146
+ ...e,
147
+ ellipsis: true,
148
+ };
149
+ }) as any[];
150
+ }, [editGood, controller, model, getVehicle,required]);
151
+
152
+ return columns;
153
+ };
154
+
155
+
156
+ class MyInput extends React.Component<InputProps & { loading?: boolean }> {
157
+ render() {
158
+ if (this.props.loading) {
159
+ return (
160
+ <Spin size="small">
161
+ <Input {...this.props} autoComplete="off" />
162
+ </Spin>
163
+ )
164
+ } else {
165
+ return <Input {...this.props} autoComplete="off" />
166
+ }
167
+ }
168
+ }
@@ -0,0 +1,20 @@
1
+
2
+ import React from 'react';
3
+ import { Typography } from 'kts-components-antd-x3';
4
+ import { ValidationRule } from 'kts-components-antd-x3/lib/form';
5
+
6
+ const { Text } = Typography;
7
+
8
+ export default (props: { children?: React.ReactNode, required?: boolean, rules?: ValidationRule[] }) => {
9
+
10
+ const { rules, children } = props;
11
+
12
+ const required = React.useMemo(() => rules?.some(e => !!e.required) || props.required, [rules, props.required]);
13
+
14
+ return (
15
+ <>
16
+ {required ? <Text type="danger">*</Text> : <></>}
17
+ {children}
18
+ </>
19
+ )
20
+ };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 表格行事件
3
+ */
4
+
5
+ import React from 'react';
6
+ import Invoice from '../../../../..';
7
+ import IGood from '../../../../../InvoiceController/InvoiceControllerState/PayListState/IGood';
8
+
9
+ export default () => {
10
+ /** 控制器 */
11
+ const controller = Invoice.useInvoiceController();
12
+
13
+ const model = controller.useMemo(s => s.model, []);
14
+
15
+ const onClick = React.useCallback(
16
+ async (record: IGood) => {
17
+ // if (model === 'prefab') return;
18
+ if (model === 'readOnly') return;
19
+
20
+ const editGood = controller.state.payListState.editGood;
21
+
22
+ if (editGood) {
23
+ if (editGood.$index === record.$index) return;
24
+ await controller.saveEditPay();
25
+ await controller.wait();
26
+ await controller.pipeline(async s => { s.payListState.editGood || (await controller.setEditPay(record)) })();
27
+ } else {
28
+ await controller.setEditPay(record);
29
+ }
30
+ },
31
+ [controller, model],
32
+ );
33
+
34
+ return {
35
+ onClick,
36
+ };
37
+ };
@@ -0,0 +1,120 @@
1
+
2
+ import React from 'react';
3
+ import { Checkbox } from 'kts-components-antd-x3';
4
+ import Invoice from '../../../../..';
5
+
6
+ export default () => {
7
+
8
+ /** 控制器 */
9
+ const controller = Invoice.useInvoiceController();
10
+
11
+ /** 列表选中的货物索引列表 */
12
+ const selectedRowKeys = controller.useMemo(s => s.payListState.selectedGoodIndex, []);
13
+
14
+ /** 货物列表 */
15
+ const goodsList = controller.useMemo(s => s.payListState.goodsList, []);
16
+
17
+ /** 组件模式 */
18
+ const model = controller.useMemo(s => s.model, []);
19
+
20
+ /** 搜索条件 */
21
+ // const searchValue = controller.useMemo(s => s.goodsListState.searchValue, []);
22
+
23
+ /** 是否显示选择框 */
24
+ const isShow = React.useMemo(() => {
25
+ if (model === 'readOnly' || model === 'prefab') return false
26
+ return true;
27
+ }, [model])
28
+
29
+ /** 是否全选 */
30
+ // const isAll = controller.useMemo(s => s.goodsListState.goodsList.length > 0 && s.goodsListState.selectedGoodIndex.length === s.goodsListState.goodsList.length, [])
31
+ const isAll = controller.useMemo(s => {
32
+ if (s.payListState.selectedGoodIndex.length <= 0) return false;
33
+ const seeGoodsIndex = s.payListState.goodsList.map(e => e.$index);
34
+ const selectedGoodIndex = s.payListState.selectedGoodIndex.filter(e => seeGoodsIndex.some(t => e === t));
35
+ return selectedGoodIndex.length === seeGoodsIndex.length
36
+ }, [])
37
+
38
+ const indeterminate = controller.useMemo(s => {
39
+ const seeGoodsIndex = s.payListState.goodsList.map(e => e.$index);
40
+ const selectedGoodIndex = s.payListState.selectedGoodIndex.filter(e => seeGoodsIndex.some(t => e === t));
41
+ if (selectedGoodIndex.length === 0) return false;
42
+ return selectedGoodIndex.length < seeGoodsIndex.length
43
+ }, [])
44
+ /** 点击了全选 */
45
+ const onClickSelectAll = React.useCallback(async () => {
46
+ if (isAll) {
47
+ await controller.pipeline(async s => {
48
+ const seeGoodsIndex = s.payListState.goodsList.map(e => e.$index)
49
+
50
+ s.payListState.selectedGoodIndex = s.payListState.selectedGoodIndex.filter(e => !seeGoodsIndex.some(t => e === t));
51
+ })()
52
+ } else {
53
+ await controller.pipeline(async s => {
54
+ const seeGoodsIndex = s.payListState.goodsList.map(e => e.$index)
55
+
56
+ s.payListState.selectedGoodIndex = [...s.payListState.selectedGoodIndex, ...seeGoodsIndex];
57
+ s.payListState.selectedGoodIndex = Array.from(new Set(s.payListState.selectedGoodIndex));
58
+ })()
59
+ }
60
+ // await sortOut(true);
61
+ }, [controller, isAll])
62
+
63
+ const onSelect = React.useCallback(async (record, selected) => {
64
+ if (selected) {
65
+ await controller.pipeline(async s => {
66
+ s.payListState.selectedGoodIndex = [...s.payListState.selectedGoodIndex, record.$index];
67
+ s.payListState = { ...s.payListState };
68
+ })()
69
+ } else {
70
+ await controller.pipeline(async s => {
71
+ s.payListState.selectedGoodIndex = s.payListState.selectedGoodIndex.filter(e => e !== record.$index);
72
+ s.payListState = { ...s.payListState };
73
+ })()
74
+ }
75
+ // await sortOut(selected);
76
+ }, [controller])
77
+
78
+ const columnTitle = React.useMemo(() => {
79
+ return (
80
+ <Checkbox
81
+ onChange={onClickSelectAll}
82
+ indeterminate={indeterminate}
83
+ checked={isAll}
84
+ ></Checkbox>
85
+ )
86
+ }, [goodsList, selectedRowKeys, onClickSelectAll, isAll, indeterminate])
87
+
88
+ /** 选择了商品后 调整 折扣行 和 被折扣行 */
89
+ const sortOut = React.useCallback(async (selected: boolean) => {
90
+ await controller.wait();
91
+ await controller.pipeline(async s => {
92
+ s.payListState.selectedGoodIndex.forEach($index => {
93
+ const goods = s.payListState.goodsMap.get($index);
94
+ if (!goods) return;
95
+
96
+ // 数组位置
97
+ let t = s.payListState.goodsList.indexOf(goods);
98
+ // goods.lineAttribute === LineAttributeType.折扣行 ? t : t++;
99
+ const i = s.goodsListState.goodsList[t].$index;
100
+ if (selected) {
101
+ if (s.payListState.selectedGoodIndex.indexOf(i) < 0) s.payListState.selectedGoodIndex = [...s.payListState.selectedGoodIndex, i];
102
+ } else {
103
+ if (s.payListState.selectedGoodIndex.indexOf(i) < 0) s.payListState.selectedGoodIndex = s.payListState.selectedGoodIndex.filter(e => e !== $index);
104
+ }
105
+ })
106
+ })()
107
+ }, [controller])
108
+
109
+ // React.useEffect(() => {
110
+ // sortOut(true);
111
+ // }, [sortOut, goodsList])
112
+
113
+ if (isShow === false) return undefined;
114
+ return {
115
+ columnWidth: 45,
116
+ columnTitle,
117
+ onSelect,
118
+ selectedRowKeys,
119
+ }
120
+ }
@@ -0,0 +1,19 @@
1
+
2
+
3
+ import React from "react";
4
+ import { InvoiceController } from "../../../../../..";
5
+
6
+ /**
7
+ * 点击组件外部 保存正在编辑的支付
8
+ */
9
+ export default function useWindowClick(controller: InvoiceController) {
10
+
11
+ React.useEffect(() => {
12
+ const click = () => { setTimeout(controller.saveEditPay) };
13
+
14
+ window.addEventListener('click', click);
15
+ return () => {
16
+ window.removeEventListener('click', click);
17
+ };
18
+ }, [controller]);
19
+ }
@@ -0,0 +1,73 @@
1
+ .kts-invoice-operate-freight{
2
+ // padding : 20px;
3
+ border-bottom: 2px solid #9F613E;
4
+ border-left: 2px solid #9F613E;
5
+ border-right: 2px solid #9F613E;
6
+
7
+ .real-estate-info-digtal-label {
8
+ padding: 20px 20px 0;
9
+ color: #9F613E;
10
+ font-weight: bold;
11
+ }
12
+
13
+ .ktsAnt3x-row.ktsAnt3x-form-item {
14
+ margin-bottom: 0;
15
+ }
16
+ }
17
+
18
+ .kts-invoice-operate-goods-list-digtal {
19
+
20
+ .goods-list-digtal-discount-tag {
21
+ display: inline-block;
22
+ height: 20px;
23
+ line-height: 20px;
24
+ border: 1px solid;
25
+ padding: 0 5px;
26
+ border-radius: 4px;
27
+ }
28
+
29
+ .kts-invoice-operate-goods-list-table-tax-rate {
30
+ .ktsAnt3x-select-selection-selected-value {
31
+ float: right;
32
+ }
33
+ }
34
+
35
+ .kts-invoice-operate-freight-list-able {
36
+ display: flex;
37
+ padding: 10px;
38
+ border-bottom: 2px solid #9F613E;
39
+ gap: 10px;
40
+ align-items: center;
41
+ }
42
+
43
+ .ktsAntX-table {
44
+
45
+ .ktsAntX-table-row.kts-invoice-operate-goods-be-discount .ktsAntX-table-cell {
46
+ color: #f00;
47
+ }
48
+
49
+ // .ktsAntX-table-row.kts-invoice-operate-goods-discount .ktsAntX-table-cell {
50
+ // background: #f5f5f5;
51
+ // }
52
+ }
53
+ }
54
+
55
+ .kts-invoice-operate-goods-list-table-digtal {
56
+
57
+ .ktsAnt3x-form-item-control.has-error {
58
+ border: 1px solid #f00;
59
+ }
60
+
61
+ .kts-invoice-operate-goods-list-table.kts-invoice-operate-prefab {
62
+ .ktsAnt3x-table-row {
63
+ color: rgba(0, 0, 0, 0.25);
64
+ background: #f5f5f5;
65
+ }
66
+ }
67
+
68
+ .kts-invoice-operate-goods-list-table-search-protrude {
69
+ background: #ff0;
70
+ color: #000;
71
+ font-weight: bold;
72
+ }
73
+ }
@@ -0,0 +1,132 @@
1
+
2
+ import React from 'react';
3
+ import classnames from 'classnames';
4
+ import { decorator } from 'grey-react-box';
5
+ import { Form } from 'kts-components-antd-x3';
6
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
7
+ import { FormComponentProps } from 'kts-components-antd-x3/lib/form';
8
+ import Invoice from '../../..';
9
+
10
+ import TableVirtual from './ui/TableVirtual';
11
+ import AddRowButton from './ui/AddRowButton';
12
+ import TableRow from './ui/TableRow';
13
+
14
+ import useColumns from './hook/useColumns';
15
+ import useOnRow from './hook/useOnRow';
16
+ import useWindowClick from './hook/useWindowClick';
17
+ import useRowSelection from './hook/useRowSelection';
18
+
19
+ import useDelRowButton from './ui/BulkMenu/hooks/useDelRowButton';
20
+
21
+ import './index.less';
22
+
23
+ export interface IGoodsListProps {
24
+
25
+ /** 产品最大数 */
26
+ goodMax?: number;
27
+
28
+ addressOptions?: any[];
29
+ /**
30
+ * 支付方式枚举
31
+ */
32
+ vehicleTypeList:any[];
33
+ /**
34
+ * 地址数据字段名
35
+ */
36
+ fieldNames?: any;
37
+
38
+ }
39
+
40
+ export default class PayList extends React.Component<IGoodsListProps> {
41
+ render() {
42
+ return <Main {...this.props} />
43
+ }
44
+ }
45
+
46
+ const Main = decorator<IGoodsListProps, FormComponentProps & IGoodsListProps>(Form.create())((props) => {
47
+ const { form } = props;
48
+ /** 控制器 */
49
+ const controller = Invoice.useInvoiceController();
50
+
51
+ const goodsList = controller.useMemo(s => s.payListState.goodsList, []);
52
+
53
+ /** 货物列表 */
54
+ const dataSource = controller.useMemo(s => s.payListState.goodsList, [])
55
+
56
+ /** 表格行事件 */
57
+ const onRow = useOnRow();
58
+
59
+ /** 批量删除 */
60
+ const delRowButton = useDelRowButton();
61
+
62
+
63
+ useWindowClick(controller); // 点击组件外部 保存正在编辑的货物
64
+
65
+ /** 注册 from 对象 */
66
+ React.useEffect(() => {
67
+ controller.pipeline<WrappedFormUtils>(async (s, form) => { s.payListState = { ...s.payListState, form } })(props.form);
68
+ }, [controller, props.form]);
69
+ React.useEffect(() => {
70
+ controller.run(async (s) => {
71
+ s.payListState.addressFieldNames = props.fieldNames
72
+ });
73
+ }, [props.fieldNames])
74
+ React.useEffect(() => {
75
+ controller.run(async (s) => {
76
+ s.payListState.vehicleTypeList = props.vehicleTypeList
77
+ });
78
+ }, [props.vehicleTypeList])
79
+ // React.useEffect(() => {
80
+ // controller.run(async (s) => {
81
+ // s.payListState.area = props.addressOptions
82
+ // });
83
+ // }, [props.addressOptions])
84
+ // 跟新 货物
85
+ React.useEffect(() => {
86
+ controller.run(async (s) => {
87
+ s.payListState.goodsMap = new Map();
88
+ goodsList.forEach((e) => { s.payListState.goodsMap.set(e.$index, e); });
89
+ });
90
+ }, [controller, goodsList]);
91
+
92
+ /** props 产品最大数 更新 */
93
+ React.useEffect(() => {
94
+ controller.pipeline(async s => { s.payListState.goodMax = props.goodMax })()
95
+ }, [controller, props.goodMax])
96
+ // 注册 form
97
+ // controller.useForm('freightInfo', form);
98
+ return (
99
+ <div className="kts-invoice-operate-freight">
100
+ <div className='real-estate-info-digtal-label' >支付信息</div>
101
+ <div className="kts-invoice-operate-goods-list-digtal" onClick={(e) => { e.stopPropagation() }} >
102
+ <div className="kts-invoice-operate-freight-list-able">
103
+ {/* 添加行 */}
104
+ <AddRowButton />
105
+
106
+ {/* 批量删除 */}
107
+ {delRowButton.button}
108
+
109
+ <div style={{ flex: 1 }} />
110
+
111
+ </div>
112
+ <div className={classnames('kts-invoice-operate-goods-list-table-digtal')}>
113
+ <TableVirtual
114
+ size="small"
115
+ rowKey="$index"
116
+ pagination={false}
117
+ scroll={{ y: 280 }}
118
+ components={{ body: { row: TableRow } }}
119
+ dataSource={dataSource}
120
+ columns={useColumns(props.form)}
121
+ rowSelection={useRowSelection()}
122
+ onRow={record => ({
123
+ onClick: () => {
124
+ onRow.onClick(record);
125
+ },
126
+ })}
127
+ />
128
+ </div>
129
+ </div>
130
+ </div>
131
+ );
132
+ });
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+ import Invoice from '../../../../..';
3
+ import { Button, message } from 'kts-xui';
4
+ import InvoiceController, { LineAttributeType } from '../../../../../InvoiceController';
5
+
6
+ export default () => {
7
+ const controller = Invoice.useInvoiceController();
8
+
9
+ const model = controller.useMemo(s => s.model, []);
10
+
11
+ const rootElement = controller.useMemo(s => s.rootElement, []);
12
+
13
+ /** 产品数据量 */
14
+ const goodsNum = controller.useMemo(s => s.payListState.goodsList.length, []);
15
+
16
+ /** 搜索条件 */
17
+ const isAddRow = controller.useMemo(s => s.payListState.isAddRow, []);
18
+
19
+ /** 产品最大数 */
20
+ const goodMax = controller.useMemo(s => s.payListState.goodMax, []);
21
+
22
+ /** 按钮是否禁用 */
23
+ const disabled = React.useMemo(() => {
24
+ return typeof goodMax === 'number' ? goodsNum >= goodMax : false
25
+ }, [goodMax, goodsNum])
26
+
27
+ const onClick = React.useCallback(async () => {
28
+ await addGood(controller);
29
+ await rollBottom(controller, rootElement);
30
+ }, [controller, rootElement]);
31
+
32
+ if (isAddRow === false) return <></>;
33
+ if (model === 'prefab') return <></>;
34
+ if (model === 'readOnly') return <></>;
35
+
36
+ return (
37
+ <Button size='small' type='primary' onClick={onClick} disabled={disabled}>
38
+ 增行
39
+ </Button>
40
+ );
41
+ };
42
+
43
+ /** 添加一个空货物 */
44
+ async function addGood(controller: InvoiceController) {
45
+ await controller.saveEditPay();
46
+ await controller.wait();
47
+ await controller.run(async (s) => {
48
+ if (s.payListState.editGood) {
49
+ // message.error({
50
+ // content: '你正在编辑一个货物运输行',
51
+ // key: '你正在编辑一个货物运输行',
52
+ // });
53
+ // return;
54
+ await controller.state.payListState.form?.validateFields(async (err: any, values: any) => {
55
+ if (err) {
56
+ const firstError: any = Object.values(err)[0];
57
+ message.error({
58
+ content: firstError.errors[0].message,
59
+ key: '你正在编辑一个货物',
60
+ });
61
+ return;
62
+ }
63
+ });
64
+ }
65
+ s.payListState.editGood = await controller.addPay({});
66
+ });
67
+ }
68
+
69
+ /** 货物列表,滚动到底部 */
70
+ async function rollBottom(controller: InvoiceController, rootElement: HTMLDivElement | null | undefined) {
71
+ await controller.wait();
72
+ const cont = rootElement?.querySelector('.ktsAntX-table-body');
73
+ if (!cont) return;
74
+ cont.scrollTop = cont.scrollHeight;
75
+ }
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import Invoice from '../../../../../../..';
3
+ import { Button, Menu } from 'kts-xui';
4
+
5
+ export default () => {
6
+
7
+ const controller = Invoice.useInvoiceController();
8
+
9
+ const model = controller.useMemo(s => s.model, []);
10
+
11
+ const isRemRow = controller.useMemo(s => s.payListState.isRemRow, []);
12
+
13
+ /** 是否禁用 */
14
+ const disabled = controller.useMemo((s) => {
15
+ if (s.payListState.selectedGoodIndex.length <= 0) return true;
16
+ return false;
17
+ }, []);
18
+
19
+ /** 点击了删除 */
20
+ const onClick = React.useCallback(async () => {
21
+ const selectedGoodIndex = controller.state.payListState.selectedGoodIndex.slice();
22
+ for (let i = 0; i < selectedGoodIndex.length; i++) {
23
+ await controller.delPay(selectedGoodIndex[i]);
24
+ }
25
+ await controller.run(async s => { s.payListState.selectedGoodIndex = [] });
26
+ }, [])
27
+
28
+ const menuItem = React.useMemo(() => {
29
+
30
+ if (model === 'prefab') return <></>;
31
+ if (model === 'readOnly') return <></>;
32
+
33
+ return (
34
+ <Menu.Item key="1" onClick={onClick} disabled={disabled}> 删除行 </Menu.Item>
35
+ )
36
+ }, [model, onClick, disabled])
37
+
38
+ const button = React.useMemo(() => {
39
+
40
+ if (isRemRow === false) return <></>;
41
+ if (model === 'prefab') return <></>;
42
+ if (model === 'readOnly') return <></>;
43
+
44
+ return (
45
+ <Button size='small' onClick={onClick} disabled={disabled} >删除</Button>
46
+ )
47
+ }, [model, onClick, disabled, isRemRow])
48
+
49
+ return { button, menuItem };
50
+ };