Blame view

src/pages/pms/purchase/PurchaseRecord/comonents/AddPurchaseModal.tsx 15.4 KB
7402e159   jiangwei   配件采购
1
  import React, { useEffect, useState } from 'react';
ccd54dcf   jiangwei   配件采购申请
2
  import { Modal, Select, Button, Table, Form, message, Tabs, Input } from 'antd';
7402e159   jiangwei   配件采购
3
4
  import ChoosePartModal from './ChoosePartModal';
  import usePagination from '@/hooks/usePagination';
7402e159   jiangwei   配件采购
5
6
  import { getStoragePage } from '@/pages/pms/storage/StorageManage/api';
  import { getPageListApi, Item as item } from "@/pages/pms/partPlan/PlanSupplier/api";
ccd54dcf   jiangwei   配件采购申请
7
  import {getPurchasePool, Item as poolitem} from '@/pages/pms/purchase/PurchasePool/api';
36b37433   jiangwei   接口联调
8
  import PartModal from '@/pages/pms/purchase/PurchasePool/comonents/PartModal';
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
9
  import {purchaseApply, getrelationlist, EditItem} from '../api';
e466f419   jiangwei   配件外采调整
10
  import {getList, ListVO, Params} from '@/pages/pms/partPlan/PlanPool/api';
824c0e90   jiangwei   配件采购接口联调
11
  import _ from 'lodash';
e466f419   jiangwei   配件外采调整
12
  import useInitial from '@/hooks/useInitail';
67c1c3e7   jiangwei   配件外采计划池筛选条件
13
14
15
  import PmsSelect from '@/pages/pms/comonents/PmsSelect';
  import { getPartTypeApi } from '@/pages/pms/part/Repertory/api';
  import {planPoolTypeData} from '@/pages/pms/entity';
7402e159   jiangwei   配件采购
16
17
18
19
20
21
22
23
  
  const Option = Select.Option;
  const {Item} = Form;
  const {Column} = Table;
  const {TabPane} = Tabs;
  interface Props {
    onCancel: () => any,
    visible: boolean,
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
24
    itemData?:EditItem,
7402e159   jiangwei   配件采购
25
    setItemData?:Function
ccd54dcf   jiangwei   配件采购申请
26
27
28
29
  }
  interface Relation{
    value: number,
    name: string
7402e159   jiangwei   配件采购
30
31
  }
  
ccd54dcf   jiangwei   配件采购申请
32
  export default function PartStorageModal({ onCancel, visible, itemData, setItemData }: Props) {
070e843e   jiangwei   获取供应商结算方式
33
    const { list: storages } = usePagination<PartStorageSpace.PageVO>(getStoragePage, { pageSize: 1000 });
e466f419   jiangwei   配件外采调整
34
35
36
37
38
    const { list: suppliers } = usePagination<item>(getPageListApi, { supplierType: 40, pageSize: 500 });
    const [delay, setDelay] = useState(true);
    const {data: planeData, setParams, setData: setPlaneData} = useInitial<ListVO[], Params>(getList, [], {}, delay);
    const {data: casData, setParams: casSetParams, setData: casSetData} = useInitial<poolitem[], Params>(getPurchasePool, [], {}, delay);
    const [planePart, setPlanePart] = useState<ListVO[]>([]);
67c1c3e7   jiangwei   配件外采计划池筛选条件
39
40
    const { data: partTypeData } = useInitial(getPartTypeApi, [], {});
  
7402e159   jiangwei   配件采购
41
42
43
44
    const [choosePartVisable, setChoosePartVisable] = useState(false);
    const [selectedParts, setSelectedParts] = useState<any[]>([]);
    const [form] = Form.useForm();
    const [btnloading, setBtnloading] = useState(false);
36b37433   jiangwei   接口联调
45
46
47
    const [storageid, setStorageid] = useState<number>();
    const [partParams, setPartParams] = useState<{stId?:number, spId?: number}>();
    const [casPart, setCasPart] = useState<poolitem[]>();
ccd54dcf   jiangwei   配件采购申请
48
    const [listRelation, setListRelation] = useState<Relation[]>();
36b37433   jiangwei   接口联调
49
50
    const [partvisible, setPartvisible] = useState(false);
    const [item, setItem] = useState();
31f79ffa   jiangwei   配件外采支付类型完善
51
    const [settlementMethod, setSettlementMethod] = useState<number>();
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
52
53
    
    // 编辑时数据回显
7402e159   jiangwei   配件采购
54
    useEffect(() => {
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
55
56
57
58
59
      if (itemData?.storageId) {
        form.setFieldsValue({
          storageId: itemData.storageId, 
          supplierId: itemData.supplierId,
          settlementMethod: itemData.payType,
c8e9f248   jiangwei   配件外采申请增加是否推送外勤
60
61
          proportion: itemData.proportion,
          isOutSide: itemData.isOutSide ? "1" : "0"
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
62
        });
070e843e   jiangwei   获取供应商结算方式
63
        getrelationlist({tradeCompanyId: itemData.supplierId, compCategory: 1, dealerId: storages.find(i => i.id == itemData.storageId)?.dealerId}).then(res => {
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
64
65
          if (res.success) {
            setListRelation(res.data && res.data[0].settleMethodList);
31f79ffa   jiangwei   配件外采支付类型完善
66
            form.setFieldsValue({accountCheckPeriod: res.data && res.data[0].accountCheckPeriod});
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
67
            }
e466f419   jiangwei   配件外采调整
68
        }).catch(e => message.error(e.message));
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
69
        setPartParams({stId: itemData.storageId, spId: itemData.supplierId});
e466f419   jiangwei   配件外采调整
70
        setStorageid(itemData.storageId);
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
71
72
        setSelectedParts(itemData.parts || []);
        setCasPart(itemData.poolParts);
e466f419   jiangwei   配件外采调整
73
        setPlanePart(itemData.planParts || []);
7402e159   jiangwei   配件采购
74
75
76
77
        return;
      }
      if (!visible) {
        form.resetFields();
e466f419   jiangwei   配件外采调整
78
79
80
        setStorageid(undefined);
        setPlaneData([]);
        casSetData([]);
7402e159   jiangwei   配件采购
81
        setSelectedParts([]);
36b37433   jiangwei   接口联调
82
        setCasPart([]);
e466f419   jiangwei   配件外采调整
83
        setPlanePart([]);
824c0e90   jiangwei   配件采购接口联调
84
        setListRelation([]);
7402e159   jiangwei   配件采购
85
      }
e466f419   jiangwei   配件外采调整
86
    }, [visible]);
7402e159   jiangwei   配件采购
87
  
e466f419   jiangwei   配件外采调整
88
89
90
91
    //查询计划池配件和工单缺件配件
    useEffect(() => {
      if (storageid) {
        setDelay(false);
80920026   jiangwei   配件池参数fix
92
        setParams({}, true);
e466f419   jiangwei   配件外采调整
93
        casSetParams({storageId: storageid}, true);
d56d0456   jiangwei   根据1.11需求修改
94
      }
e466f419   jiangwei   配件外采调整
95
    }, [storageid]);
7402e159   jiangwei   配件采购
96
  
ccd54dcf   jiangwei   配件采购申请
97
    // 提交申请
7402e159   jiangwei   配件采购
98
    function handSave() {
7402e159   jiangwei   配件采购
99
100
101
      form.validateFields().then(fields => {
        const supplier = suppliers.find(it => it.supplierId == fields.supplierId) || {};
        const storage = storages.find(it => it.id == fields.storageId) || {};
36b37433   jiangwei   接口联调
102
103
104
105
106
        const params = {
          storageId: storage.id, 
          storageName: storage.storageName,
          supplierId: supplier.supplierId,
          supplierName: supplier.supplierName,
ccd54dcf   jiangwei   配件采购申请
107
108
          proportion: fields.proportion,
          payType: fields.settlementMethod,
31f79ffa   jiangwei   配件外采支付类型完善
109
          accountCheckPeriod: settlementMethod == 2 ? fields.accountCheckPeriod : undefined,
e466f419   jiangwei   配件外采调整
110
111
112
          parts: [...selectedParts.map(i => ({partId: i.partId, partCnt: i.partCnt, price: i.price, type: 1})),
            ...planePart.map(i => ({poolId: i.poolId, partId: i.partId, partCnt: i.cnt, price: i.price, type: 2})),
            ...(casPart?.map(i => (i.details?.map(it => ({partId: it.partId, partCnt: it.partCnt, poolId: it.poolId, expectInTime: it.expectInTime, price: it.price, type: 3})))).flat() || [])
c8e9f248   jiangwei   配件外采申请增加是否推送外勤
113
114
          ],
          isOutSide: !!fields.isOutSide
36b37433   jiangwei   接口联调
115
        };
c8e9f248   jiangwei   配件外采申请增加是否推送外勤
116
        setBtnloading(true);
36b37433   jiangwei   接口联调
117
118
119
120
121
        purchaseApply(params).then(res => {
          message.success("提交成功");
          setBtnloading(false);
          setItemData && setItemData();
          onCancel && onCancel();
95407d80   jiangwei   测试中的问题修复
122
          setPartParams({});
36b37433   jiangwei   接口联调
123
124
125
126
        }).catch(e => {
          message.error(e.message);
          setBtnloading(false);
        });
7402e159   jiangwei   配件采购
127
128
      });
    }
67b0c63c   jiangwei   配件计划增加可调出配件查看和外采申请优化
129
    
7402e159   jiangwei   配件采购
130
131
132
133
    return (
      <Modal
        width={1000}
        visible={visible}
95407d80   jiangwei   测试中的问题修复
134
        onCancel={() => { onCancel(); setPartParams({}); }}
8c2dce88   jiangwei   配件调拨、配件采购调整和弹出框优化
135
        maskClosable={false}
d473f326   jiangwei   配件外采自测调整
136
        title="新增配件外采申请"
7402e159   jiangwei   配件采购
137
        footer={[
95407d80   jiangwei   测试中的问题修复
138
          <Button key="cancel" onClick={() => { onCancel(); setPartParams({}); }} loading={btnloading}>取消</Button>,
7402e159   jiangwei   配件采购
139
140
141
142
143
144
          <Button
            key="submit"
            onClick={handSave}
            type="primary"
            htmlType="submit"
            loading={btnloading}
e466f419   jiangwei   配件外采调整
145
            disabled={!selectedParts.length && !casPart?.length && !planePart.length}
7402e159   jiangwei   配件采购
146
147
148
149
150
151
152
          >
            提交申请
          </Button>
        ]}
      >
        <Form
          form={form}
ccd54dcf   jiangwei   配件采购申请
153
          labelCol={{span: 4}}
7402e159   jiangwei   配件采购
154
155
          wrapperCol={{span: 19}}
        >
ccd54dcf   jiangwei   配件采购申请
156
          <Item label="库房" name="storageId" required rules={[{ required: true, message: '请选择库房' }]}>
7402e159   jiangwei   配件采购
157
158
159
            <Select
              style={{ width: 250 }}
              placeholder="请选择库房"
36b37433   jiangwei   接口联调
160
              value={storageid}
e466f419   jiangwei   配件外采调整
161
162
163
164
165
166
              onChange={v => { 
                setStorageid(v);
                form.setFieldsValue({supplierId: '', settlementMethod: undefined, proportion: undefined});
                setListRelation([]);
                setSettlementMethod(undefined);
              }}
b4b59dc8   jiangwei   配件系统选择器增加搜索功能
167
168
              showSearch
              optionFilterProp="children"
7402e159   jiangwei   配件采购
169
170
171
172
173
174
175
176
177
178
            >
              {storages.map((item) => (
                <Option value={item.id} key={item.id}>{item.storageName}</Option>
            ))}
            </Select>
          </Item>
          <Item label="供应商" name="supplierId" required rules={[{ required: true, message: '请选择供应商' }]}>
            <Select
              style={{ width: 250 }}
              placeholder="请选择供应商"
b4b59dc8   jiangwei   配件系统选择器增加搜索功能
179
180
              showSearch
              optionFilterProp="children"
fa8b522f   jiangwei   外采fix
181
182
183
              options={suppliers.filter((item, index, self) => {
                return self.findIndex(el => el.supplierId == item.supplierId) === index;
              }).map((item) => ({ value: item.supplierId, label: item.supplierName }))} 
36b37433   jiangwei   接口联调
184
185
              onChange={v => {
                setPartParams({stId: storageid, spId: v});
67b0c63c   jiangwei   配件计划增加可调出配件查看和外采申请优化
186
187
188
                setListRelation([]);
                form.setFieldsValue({settlementMethod: undefined, proportion: undefined});
                setSettlementMethod(undefined);
070e843e   jiangwei   获取供应商结算方式
189
                getrelationlist({tradeCompanyId: v, compCategory: 1, dealerId: storages.find(i => i.id == storageid)?.dealerId}).then(res => {
fa8b522f   jiangwei   外采fix
190
191
192
                  if (res.data?.length) {
                    form.setFieldsValue({ proportion: res.data[0].billAmountRatio, accountCheckPeriod: res.data && res.data[0].accountCheckPeriod});
                    setListRelation(res.data && res.data[0].settleMethodList);
ccd54dcf   jiangwei   配件采购申请
193
                  }
e466f419   jiangwei   配件外采调整
194
                }).catch(e => message.error(e.message));
36b37433   jiangwei   接口联调
195
              }}
fa8b522f   jiangwei   外采fix
196
            />
7402e159   jiangwei   配件采购
197
198
199
200
201
          </Item>
          <Item label="结算方式" name="settlementMethod" required rules={[{ required: true, message: '请选择结算方式' }]}>
            <Select
              style={{ width: 250 }}
              placeholder="请选择结算方式"
31f79ffa   jiangwei   配件外采支付类型完善
202
              value={settlementMethod}
b4b59dc8   jiangwei   配件系统选择器增加搜索功能
203
204
              showSearch
              optionFilterProp="children"
31f79ffa   jiangwei   配件外采支付类型完善
205
              onChange={setSettlementMethod}
e466f419   jiangwei   配件外采调整
206
207
              onFocus={() => { 
                if (!form.getFieldValue("supplierId")) {
fa8b522f   jiangwei   外采fix
208
                  message.error("请先选择供应商");
e466f419   jiangwei   配件外采调整
209
210
211
                  return;
                }
                if (!listRelation?.length) { 
fa8b522f   jiangwei   外采fix
212
                  message.error(`请财务先配置${suppliers.find(i => i.supplierId == form.getFieldValue('supplierId'))?.supplierName}的结算方式`); 
e466f419   jiangwei   配件外采调整
213
214
                }
              }}
7402e159   jiangwei   配件采购
215
            >
00502ebb   jiangwei   测试问题修改2.0
216
              {listRelation?.map(i => <Option value={i.value} key={i.value}>{i.name}</Option>)}
7402e159   jiangwei   配件采购
217
218
            </Select>
          </Item>
31f79ffa   jiangwei   配件外采支付类型完善
219
220
221
222
223
224
225
226
227
228
          {!!settlementMethod && settlementMethod == 2 && (
          <Item label="对账周期" name="accountCheckPeriod">
            <Input
              style={{ width: 250 }}
              addonAfter="日"
              addonBefore="下月"
              disabled
            />
          </Item>
          )}
ccd54dcf   jiangwei   配件采购申请
229
230
231
          <Item label="发票金额要求比例" name="proportion">
            <Input style={{ width: 250 }} disabled addonAfter="%" />
          </Item>
c8e9f248   jiangwei   配件外采申请增加是否推送外勤
232
233
234
235
236
237
238
239
240
          <Item label="是否推送外勤资格" name="isOutSide">
            <Select
              style={{ width: 250 }}
              defaultValue="0"
            >
              <Option value="1" key="1">是</Option>
              <Option value="0" key="0">否</Option>
            </Select>
          </Item>
7402e159   jiangwei   配件采购
241
        </Form>
e466f419   jiangwei   配件外采调整
242
243
244
        <Tabs animated>
          <TabPane tab="配件" key="1">
            <div style={{ display: 'flex', justifyContent: 'flex-end', alignItems: 'center', marginBottom: 10}}>
824c0e90   jiangwei   配件采购接口联调
245
              <Button type="primary" onClick={() => setChoosePartVisable(true)} disabled={!partParams?.spId || !partParams.stId}>选择配件</Button>
7402e159   jiangwei   配件采购
246
247
248
249
250
            </div>
            <Table
              style={{width: '100%'}}
              dataSource={selectedParts}
              pagination={false}
e466f419   jiangwei   配件外采调整
251
              scroll={{y: 300}}
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
252
              rowKey={r => `${r.partCode}`}
7402e159   jiangwei   配件采购
253
254
255
256
            >
              <Column title="配件名称" dataIndex="partName" />
              <Column title="配件编码" dataIndex="partCode" />
              <Column title="采购数量" dataIndex="partCnt" />
36b37433   jiangwei   接口联调
257
              <Column title="单价" dataIndex="price" />
faf0d065   jiangwei   界面优化和bug
258
              <Column title="总价" render={r => _.ceil((r.partCnt * r.price), 2)} />
7402e159   jiangwei   配件采购
259
260
              <Column
                title="操作"
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
261
                render={(_item: any) => (
7402e159   jiangwei   配件采购
262
263
264
265
266
267
268
                  <a onClick={() => setSelectedParts(selectedParts.filter(i => i.partCode != _item.partCode))}>
                    删除
                  </a>
            )}
              />
            </Table>
          </TabPane>
e466f419   jiangwei   配件外采调整
269
270
271
272
          <TabPane tab="计划待外采配件" key="3">
            <div style={{display: 'flex', marginBottom: 10}}>
              <Input.Search
                allowClear
9ca4d316   jiangwei   搜索优化
273
                enterButton
e466f419   jiangwei   配件外采调整
274
                placeholder="请输入配件名称/编码"
9ca4d316   jiangwei   搜索优化
275
276
                onSearch={e => setParams({keywords: e}, true)}
                style={{ width: 220 }}
67c1c3e7   jiangwei   配件外采计划池筛选条件
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
              />
              <PmsSelect
                allowClear
                style={{ width: 180, marginRight: 10, marginLeft: 10}}
                onChange={v => {
                  setParams({poolType: v}, true);
                }}
                placeholder="请选择来源类型"
                options={planPoolTypeData.map(i => ({value: i.value, label: i.label}))}
              />
              <PmsSelect
                allowClear
                style={{ width: 180}}
                onChange={v => setParams({partType: v}, true)}
                placeholder="请选择配件类型"
                options={partTypeData.map(i => ({value: i.value, label: i.label}))}
e466f419   jiangwei   配件外采调整
293
              />
dd4fc46d   jiangwei   配件外采外采池数据库房筛选
294
295
296
297
298
299
300
              <PmsSelect
                allowClear
                style={{ width: 180, marginLeft: 10}}
                onChange={v => setParams({storageId: v}, true)}
                placeholder="请选择库房"
                options={storages.map(i => ({value: i.id, label: i.storageName}))}
              />
e466f419   jiangwei   配件外采调整
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
            </div>
            <Table
              style={{width: '100%'}}
              dataSource={planeData}
              pagination={false}
              scroll={{y: 300}}
              rowKey="poolId"
              rowSelection={{
              type: "checkbox",
              onChange: (selectedRowKeys: any, selectedRows) => {
                setPlanePart(selectedRows);
              },
              selectedRowKeys: [...(planePart?.map(i => i.poolId) || [])]
            }}
            >
              <Column title="配件名称" dataIndex="partName" />
              <Column title="配件编码" dataIndex="partCode" />
823e7083   jiangwei   配件标准搜索问题优化
318
              <Column title="数据来源" dataIndex="typeName" />
c8dc9e64   jiangwei   配件类型
319
              <Column title="配件类型" dataIndex="partTypeName" />
e466f419   jiangwei   配件外采调整
320
321
              <Column title="采购单价(元)" dataIndex="price" />
              <Column title="采购数量" dataIndex="cnt" />
dd4fc46d   jiangwei   配件外采外采池数据库房筛选
322
              <Column title="库房" dataIndex="storageName" />
e466f419   jiangwei   配件外采调整
323
324
325
              <Column title="总价(元)" render={r => _.ceil((r.cnt * r.price), 2)} />
            </Table>
          </TabPane>
7402e159   jiangwei   配件采购
326
          <TabPane tab="工单缺件配件" key="2">
e466f419   jiangwei   配件外采调整
327
            <div style={{display: 'flex', marginBottom: 10}}>
d56d0456   jiangwei   根据1.11需求修改
328
329
              <Input.Search
                allowClear
9ca4d316   jiangwei   搜索优化
330
                enterButton
d56d0456   jiangwei   根据1.11需求修改
331
                placeholder="请输入VIN/工单号"
9ca4d316   jiangwei   搜索优化
332
333
                onSearch={e => casSetParams({keywords: e}, true)}
                style={{ width: 220 }}
d56d0456   jiangwei   根据1.11需求修改
334
335
              />
            </div>
7402e159   jiangwei   配件采购
336
337
            <Table
              style={{width: '100%'}}
e466f419   jiangwei   配件外采调整
338
              dataSource={casData}
7402e159   jiangwei   配件采购
339
              pagination={false}
e466f419   jiangwei   配件外采调整
340
              scroll={{y: 300}}
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
341
              rowKey="name"
7402e159   jiangwei   配件采购
342
343
344
              rowSelection={{
              type: "checkbox",
              onChange: (selectedRowKeys: any, selectedRows) => {
36b37433   jiangwei   接口联调
345
                setCasPart(selectedRows);
7402e159   jiangwei   配件采购
346
              },
f5ff31c2   jiangwei   配件采购-->重新编辑申请联调
347
              selectedRowKeys: [...(casPart?.map(i => i.name) || [])]
7402e159   jiangwei   配件采购
348
349
350
351
            }}
            > 
              <Column title="工单号" dataIndex="name" />
              <Column title="VIN" dataIndex="id" />
d56d0456   jiangwei   根据1.11需求修改
352
              <Column title="车牌号" dataIndex="plateNo" />
36b37433   jiangwei   接口联调
353
              <Column title="缺件外采品种" render={(r) => <a onClick={() => { setPartvisible(true); setItem(r.details); }}>{r.kind}</a>} />
7402e159   jiangwei   配件采购
354
355
            </Table>
          </TabPane>
7402e159   jiangwei   配件采购
356
        </Tabs>
824c0e90   jiangwei   配件采购接口联调
357
        <div style={{display: 'flex', justifyContent: 'flex-end', marginTop: 20, marginBottom: 20}}>
e466f419   jiangwei   配件外采调整
358
359
360
361
362
363
          <span>合计金额:{
          ((selectedParts.reduce((sum, i) => (sum + _.ceil(Number(i.partCnt * i.price), 2)), 0)) +
          casPart?.map(i => i.details).flat().reduce((sum, item) => (sum + (item?.amount || 0)), 0) + 
          planePart.reduce((sum, it) => (sum + _.ceil(Number((it.price || 0) * (it.cnt || 0)), 2)), 0)).toFixed(2)
          }
  
824c0e90   jiangwei   配件采购接口联调
364
365
          </span>
        </div>
7402e159   jiangwei   配件采购
366
        <ChoosePartModal
36b37433   jiangwei   接口联调
367
          partParams={partParams}
7402e159   jiangwei   配件采购
368
369
370
371
372
373
374
375
376
377
378
          visible={choosePartVisable}
          onCancel={() => setChoosePartVisable(false)}
          onOk={(part) => { 
            const findPart = selectedParts.find(it => it.partId == part.partId);
            if (JSON.stringify(findPart) != undefined) {
              setSelectedParts([...selectedParts.filter(it => it.partId != part.partId), {...part}]);
            } else {
              setSelectedParts([...selectedParts, part]);
            }
          }}
        />
36b37433   jiangwei   接口联调
379
        <PartModal visible={partvisible} item={item} onCancel={() => setPartvisible(false)} />
7402e159   jiangwei   配件采购
380
381
382
      </Modal>
    );
  }