Bladeren bron

修复冲突

xjj 2 jaren geleden
bovenliggende
commit
fc8e3262e2

+ 5 - 5
.umirc.ts

@@ -127,11 +127,11 @@ export default defineConfig({
       component: './Flow/OaAuditDetail',
       hideInMenu: true
     },
-    // {
-    //   name: '供应商管理',
-    //   path: '/manufacturer',
-    //   component: './ManufacturerMng/Firm',
-    // },
+    {
+      name: '供应商管理',
+      path: '/manufacturer',
+      component: './ManufacturerMng/Firm',
+    },
   ],
   npmClient: 'yarn',
 });

+ 3 - 1
src/pages/Home/index.js

@@ -62,7 +62,9 @@ function HomePage(props) {
       id: 6,
       name: '供应商管理',
       active: true,
-      click: () => {},
+      click: () => {
+        navigate('/manufacturer');
+      },
       Icon: require('@/assets/UnityMenu/Manufacturer.png'),
     },
     {

+ 15 - 0
src/pages/ManufacturerMng/Firm.js

@@ -0,0 +1,15 @@
+import React from 'react';
+import ManufacturerList from './ManufacturerList';
+import { PageContainer, ProCard } from '@ant-design/pro-components';
+function Firm(props) {
+  // const {
+  //   match: {
+  //     params: { projectId },
+  //   },
+  // } = props;
+  return <PageContainer
+    title='供应商管理'>
+    <ManufacturerList></ManufacturerList>
+  </PageContainer>
+}
+export default Firm;

+ 264 - 0
src/pages/ManufacturerMng/ManufacturerList.js

@@ -0,0 +1,264 @@
+import React, { Fragment, useState, useEffect, useRef, useMemo } from 'react';
+import { Table, Icon, message, Spin, Button, Form, DatePicker, Modal, Divider, Select, Input } from 'antd';
+import { useRequest, useModel } from '@umijs/max';
+import FirmModal from './ManufacturerModal';
+import dayjs from 'dayjs';
+const { RangePicker } = DatePicker;
+import { stringify } from 'qs';
+const pageSize = 10;
+import {
+  queryMfrList,
+  queryCreaterList,
+  editMfr,
+  deleteMfr,
+  saveMfr
+} from '@/services/manufacturer'
+function ManufacturerList(props) {
+  const {
+    projectId = 1,
+    data,
+  } = props;
+  const { user } = useModel('userInfo');
+  const [visible, setVisible] = useState(false);
+  const [curItem, setCurItem] = useState(null);
+  const [formDisabled, setFormDisabled] = useState(false);
+  const [formData, setFormData] = useState({ start_time: "", end_time: "", project_id: projectId * 1, is_super: user?.IsSuper || false, page: 1, page_Size: pageSize });
+  const queryMfrListRequest = useRequest(queryMfrList, {
+    manual: true,
+    onSuccess: data => {
+      console.log(data);
+      setFormData({ ...formData, pageSize: pageSize, total: data.count || 0 })
+    }
+  });
+  const queryCreaterListRequest = useRequest(queryCreaterList, {});
+  const saveMfrRequest = useRequest(saveMfr, {
+    manual: true,
+    onSuccess: () => {
+      message.success('新增成功');
+      queryList({ ...formData, page: 1 })
+    }
+  });
+  const editMfrRequest = useRequest(editMfr, {
+    manual: true,
+    onSuccess: () => {
+      message.success('编辑成功');
+      queryList({ ...formData, page: 1 })
+    }
+  });
+  const deleteMfrRequest = useRequest(deleteMfr, {
+    manual: true,
+    onSuccess: () => {
+      message.success('删除成功');
+      queryList({ ...formData, page: 1 })
+    }
+  });
+  const loading = useMemo(() => {
+    var loading = queryMfrListRequest.loading || saveMfrRequest.loading || queryCreaterListRequest.loading || editMfrRequest.loading;
+    return loading
+  }, [queryMfrListRequest.loading, saveMfrRequest.loading, queryCreaterListRequest.loading, editMfrRequest.loading]);
+  const columns = [
+    {
+      title: '供应商名称',
+      dataIndex: 'name',
+    },
+    {
+      title: '税号',
+      dataIndex: 'tax_code',
+    },
+    {
+      title: '地址',
+      dataIndex: 'address'
+      // render: (record) => {
+      //   return moment(record.lab_time).format('YYYY-MM-DD')
+      // }
+
+    },
+    {
+      title: '联系人',
+      dataIndex: 'contact',
+    },
+    {
+      title: '联系方式',
+      dataIndex: 'phone_number'
+      // render: (record) => {
+      //   return moment(record.create_time).format('YYYY-MM-DD')
+      // }
+    },
+    {
+      title: '开户银行',
+      dataIndex: 'bank_account',
+    },
+    {
+      title: '银行账号',
+      dataIndex: 'bank_account',
+    },
+    {
+      title: '创建人',
+      dataIndex: 'created_by',
+    },
+    {
+      title: '创建时间',
+      render: (record) => {
+        return dayjs(record.created_on).format('YYYY-MM-DD')
+      }
+    },
+    {
+      title: '操作',
+      render: (text, record) => (
+        <Fragment>
+          <>
+            <a style={{ color: "#4096ff" }} onClick={() => {
+              setCurItem(record);
+              setFormDisabled(false);
+              setVisible(true);
+            }}>编辑</a>
+          </>
+          <>
+            <Divider type="vertical" />
+            <a style={{ color: "#4096ff" }} onClick={() => {
+              handleDeleteItem(record);
+            }}> 删除</a>
+          </>
+          <>
+            <Divider type="vertical" />
+            <a style={{ color: "#4096ff" }} onClick={() => {
+              setCurItem(record);
+              setVisible(true);
+              setFormDisabled(true);
+            }}>详情</a>
+          </>
+        </Fragment>
+      ),
+    },
+  ];
+  const onCancel = () => {
+    setVisible(false)
+  }
+  const handleDeleteItem = record => {
+    console.log(record);
+    Modal.confirm({
+      title: '提醒',
+      content: `确认该条记录吗?`,
+      okText: '确认',
+      cancelText: '取消',
+      onOk: () => {
+        deleteMfrRequest.run({ project_id: 1, id: record.id, deleted_by: user?.CName })
+      },
+    });
+  }
+  const handleExportChange = async () => {
+    const data = {
+      project_id: 1,
+      is_super: user?.IsSuper || false,
+      created_by: formData.created_by || ''
+    };
+    window.downloadFile(`/api/supplier/v1/supplier/export?${stringify(data)}`, '供应商列表.xlsx', false);
+  };
+  const handleSearch = () => {
+    console.log(formData);
+    let value = {
+      project_id: projectId * 1,
+      start_time: formData.start_time,
+      end_time: formData.end_time,
+      page_size: pageSize,
+      page: 1,
+      is_super: user?.IsSuper || false,
+      created_by: formData.created_by || ''
+    }
+    queryList(value);
+  }
+  const queryList = fieldsValue => {
+    console.log(fieldsValue);
+    setFormData(fieldsValue);
+    queryMfrListRequest.run({ ...fieldsValue })
+  }
+  const onDateChange = data => {
+    let start_time = '';
+    let end_time = '';
+    if (data.length > 0) {
+      start_time = dayjs(data[0]).format('YYYY-MM-DD');
+      end_time = dayjs(data[1]).format('YYYY-MM-DD');
+    }
+    setFormData({ ...formData, start_time: start_time, end_time: end_time })
+  }
+  const onOk = fieldsValue => {
+    console.log(fieldsValue);
+    setVisible(false);
+    debugger
+    if (curItem != null)
+      editMfrRequest.run({ ...fieldsValue, project_id: 1, updated_by: user?.CName, id: curItem.id })
+    else
+      saveMfrRequest.run({ ...fieldsValue, project_id: 1, created_by: user?.CName })
+  }
+  const onChange = name => {
+    setFormData({ ...formData, created_by: name })
+  }
+  const onInputChange = e => {
+    setFormData({ ...formData, name: e.target.value })
+  }
+  useEffect(() => {
+    queryList({ ...formData })
+  }, []);
+  return (
+    <>
+      <Form>
+        <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+          <div style={{ margin: '0 24px' }}>
+            <Form.Item label="日期:">
+              <RangePicker onChange={onDateChange} />
+            </Form.Item>
+          </div>
+          <div style={{ margin: '0 24px' }}>
+            <Form.Item label="创建人:">
+              <Select
+                onChange={onChange}
+                options={queryCreaterListRequest?.data?.list || []}
+                style={{ width: 180 }}
+                allowClear
+              />
+            </Form.Item>
+          </div>
+          <div style={{ margin: '0 24px' }}>
+            <Form.Item style={{ margin: '0px 24 0 24px' }} label="供应商名称:">
+              <Input placeholder="请输入供应商名称" onChange={e => { onInputChange(e) }} />
+            </Form.Item>
+          </div>
+          <div style={{ display: 'flex' }}>
+            <Form.Item>
+              <Button style={{ marginLeft: 24 }} type="primary" onClick={() => { handleSearch() }}>
+                查询
+              </Button>
+            </Form.Item>
+            <Button style={{ marginLeft: 10 }} loading={loading} type="primary" onClick={() => {
+              setCurItem(null);
+              setVisible(true)
+            }}>
+              新增
+            </Button>
+            <Button style={{ marginLeft: 10 }} loading={loading} onClick={() => handleExportChange()} type="primary">
+              导出
+            </Button>
+          </div>
+        </div>
+      </Form>
+      <Table
+        rowKey='id'
+        loading={loading}
+        columns={columns}
+        dataSource={queryMfrListRequest?.data?.list}
+        pagination={{ current: formData.page, total: formData.total, pageSize: formData.pageSize }}
+        onChange={onChange}
+      />
+      <FirmModal
+        projectId={projectId}
+        visible={visible}
+        onCancel={onCancel}
+        onOk={onOk}
+        item={curItem}
+        disabled={formDisabled}
+      ></FirmModal>
+    </>
+  )
+}
+
+export default ManufacturerList;

+ 236 - 0
src/pages/ManufacturerMng/ManufacturerModal.js

@@ -0,0 +1,236 @@
+import React, { Fragment, useState, useEffect, useRef, useMemo } from 'react';
+import { Table, Icon, message, Spin, Button, Form, DatePicker, Row, Col, Modal, Input, Upload } from 'antd';
+import dayjs from 'dayjs';
+import { getToken, GetTokenFromUrl } from '@/utils/utils';
+const { RangePicker } = DatePicker;
+const { TextArea } = Input;
+function FirmModal(props) {
+  const {
+    onCancel,
+    onOk,
+    visible,
+    item = null,
+    disabled = true,
+    form
+  } = props;
+  const [formRef] = Form.useForm();
+  const handleOnOk = async () => {
+    formRef
+      .validateFields()
+      .then((values) => {
+        console.log(values);
+        onOk?.({ ...values });
+      })
+      .catch((info) => {
+        console.log('Validate Failed:', info);
+      });
+
+    // ((err, fieldsValue) => {
+    //   if (err)
+    //     return;
+    //   const values = {
+    //     ...fieldsValue,
+    //   };
+    //   onOk?.(values);
+    // });
+  }
+  const handleOnCancel = () => {
+    formRef.resetFields();
+    onCancel?.()
+  }
+  const token = getToken() || GetTokenFromUrl();
+  const uploadProps = {
+    name: 'files',
+    // action: `/api/v1/device-color/upload/${ID}`,
+    headers: {
+      'JWT-TOKEN': token,
+    },
+    showUploadList: false,
+    onChange: info => {
+      if (info.file.status !== 'uploading') {
+        console.log(info.file, info.fileList);
+      }
+      if (info.file.status === 'done') {
+        message.success(`${info.file.name} 文件上传成功`);
+      } else if (info.file.status === 'error') {
+        message.error(`${info.file.name} 文件上传失败`);
+      }
+    },
+  };
+  useEffect(() => {
+    formRef.resetFields();
+  }, [item]);
+  return <Modal
+    maskClosable={false}
+    open={visible}
+    destroyOnClose
+    onCancel={handleOnCancel}
+    onOk={handleOnOk}
+    forceRender
+    width='60%'
+    title={item == null ? '新增' : disabled ? '详情' : '编辑'}
+    footer={disabled ? null : undefined}
+  >
+    <div style={{ padding: 30 }}>
+      <Form
+        form={formRef}
+        // layout="inline"
+        labelCol={{ span: 4 }}
+        wrapperCol={{ span: 20 }}
+        initialValues={{
+          name: item?.name || '',
+          tax_code: item?.tax_code || '',
+          contact: item?.contact || '',
+          phone_number: item?.phone_number || '',
+          bank_account: item?.bank_account || '',
+          bank_number: item?.bank_number || '',
+          address: item?.address || ''
+        }}
+      >
+        <Row gutter={[48, 24]}>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="供应商名称:" name='name' rules={
+              [
+                {
+                  required: true,
+                  message: '请输入供应商名称',
+                }]}>
+              <Input disabled={disabled} placeholder="请输入供应商名称" />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="税号:" name="tax_code" rules={[
+              {
+                required: true,
+                message: '请输入税号',
+              },
+            ]}>
+              <Input disabled={disabled} placeholder="请输入税号" />
+            </Form.Item>
+          </Col>
+        </Row>
+        <Row gutter={[48, 24]}>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="联系人:" name="contact" rules={
+              [
+                {
+                  required: true,
+                  message: '请输入联系人',
+                },
+              ]
+            }>
+              <Input disabled={disabled} placeholder="请输入联系人" />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="联系电话:" name="phone_number" rules={[
+              {
+                required: true,
+                message: '请输入联系电话',
+              },
+            ]}>
+              <Input disabled={disabled} placeholder="请输入联系电话" />
+            </Form.Item>
+          </Col>
+        </Row>
+        <Row gutter={[48, 24]}>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="开户银行:" name='bank_account' rules={[
+              {
+                required: true,
+                message: '请输入开户银行',
+              },
+            ]}>
+              <Input disabled={disabled} placeholder="请输入开户银行" />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item style={{ width: '100%' }} label="银行账号:" name='bank_number' rules={[
+              {
+                required: true,
+                message: '请输入银行账号',
+              },
+            ]}>
+              <Input disabled={disabled} placeholder="请输入银行账号" />
+            </Form.Item>
+          </Col>
+        </Row>
+        <Row>
+          <Col span={24}>
+            <Form.Item labelCol={{ span: 2 }}
+              wrapperCol={{ span: 22 }} style={{ width: '100%' }} label="地址:" name='address' rules={[
+                {
+                  required: true,
+                  message: '请输入地址',
+                },
+              ]}>
+              <Input disabled={disabled} placeholder="请输入地址" />
+            </Form.Item>
+          </Col>
+        </Row>
+        {/* <Row gutter={[48, 24]}>
+          <Col span={12}>
+            <div style={{ display: 'flex', alignItems: 'center' }}>
+              <div style={{
+                fontSize: 14,
+                fontWeight: 400,
+                color: '#000',
+                lineHeight: '46px',
+                letterSpacing: 2,
+                whiteSpace: 'nowrap',
+                paddingLeft: 35,
+                width: 150
+              }}>
+                资质上传:
+              </div>
+              {
+                !disabled ? <div>
+                  <Upload {...uploadProps}>
+                    <Button type="primary">上传文件</Button>
+                  </Upload>
+                </div> : <div style={{ display: 'flex', alignItems: 'center', width: '100%' }}>
+                  <div style={{ flexGrow: 1 }}>
+
+                  </div>
+                  <a style={{ color: "#7BFFFB" }}>下载</a>
+                </div>
+              }
+            </div>
+          </Col>
+        </Row>
+        <Row gutter={[48, 24]}>
+          <Col span={12}>
+            <div style={{ display: 'flex', alignItems: 'center' }}>
+              <div style={{
+                fontSize: 14,
+                fontWeight: 400,
+                color: '#000',
+                lineHeight: '46px',
+                letterSpacing: 2,
+                whiteSpace: 'nowrap',
+                paddingLeft: 35,
+                width: 150
+              }}>
+                营业执照上传:
+              </div>
+              {
+                !disabled ? <div>
+                  <Upload {...uploadProps}>
+                    <Button type="primary">上传文件</Button>
+                  </Upload>
+                </div> : <div style={{ display: 'flex', alignItems: 'center', width: '100%' }}>
+                  <div style={{ flexGrow: 1 }}>
+
+                  </div>
+                  <a style={{ color: "#7BFFFB" }}>下载</a>
+                </div>
+              }
+            </div>
+          </Col>
+        </Row> */}
+      </Form>
+    </div>
+  </Modal>
+}
+
+export default FirmModal;

+ 42 - 0
src/services/manufacturer.js

@@ -0,0 +1,42 @@
+import { request } from 'umi';
+
+export function queryMfrList(data) {
+  return request('/api/supplier/v1/supplier/list', {
+    method: 'POST',
+    data,
+  });
+};
+
+export async function queryCreaterList() {
+  let res = await request('/api/supplier/v1/supplier-name/list', {
+    method: 'POST',
+  });
+  var obj = {};
+  res.data.list = res.data.list.reduce(function (item, next) {
+    obj[next.created_by] ? '' : obj[next.created_by] = true && item.push(next);
+    return item;
+  }, []);
+  console.log(res)
+  res.data.list = res?.data?.list.map(item => {
+    return { value: item.created_by, label: item.created_by }
+  })
+  return res;
+};
+export function editMfr(data) {
+  return request('/api/supplier/v1/supplier/edit', {
+    method: 'POST',
+    data,
+  });
+};
+export function deleteMfr(data) {
+  return request('/api/supplier/v1/supplier/del', {
+    method: 'POST',
+    data,
+  });
+};
+export function saveMfr(data) {
+  return request('/api/supplier/v1/supplier/save', {
+    method: 'POST',
+    data,
+  });
+};

+ 1 - 0
src/utils/utils.js

@@ -37,6 +37,7 @@ export const downloadFile = (url, fileName, encode = true) => {
   body.removeChild(downloadLink);
   // }
 };
+window.downloadFile = downloadFile;
 
 export function IsImageFile(fileName) {
   return (