diff --git a/public/locales/zh/products.json b/public/locales/zh/products.json index 7bfe0e1..b611f82 100644 --- a/public/locales/zh/products.json +++ b/public/locales/zh/products.json @@ -1,5 +1,6 @@ { "ProductType": "项目类型", + "ProductName": "产品名称", "ContractRemarks": "合同备注", "versionHistory": "查看历史", "versionPublished": "已发布的", @@ -84,7 +85,8 @@ "withQuote": "是否复制报价", "requiredVendor": "请选择目标供应商", "requiredTypes": "请选择产品类型", - "requiredDept": "请选择所属小组" + "requiredDept": "请选择所属小组", + "copyTo": "复制到" }, "Validation": { "adultPrice": "请输入成人价", diff --git a/src/components/ProductsSelector.jsx b/src/components/ProductsSelector.jsx new file mode 100644 index 0000000..a3d79cf --- /dev/null +++ b/src/components/ProductsSelector.jsx @@ -0,0 +1,56 @@ +import { useEffect, useState } from 'react'; +import { Select, Spin } from 'antd'; +import { fetchJSON } from '@/utils/request'; +import { HT_HOST } from '@/config'; +import { useTranslation } from 'react-i18next'; +import { groupBy } from '@/utils/commons'; + +// 产品列表 +export const fetchAgencyProductsList = async (params) => { + const map = { title: 'label', id: 'value' }; + const { errcode, result } = await fetchJSON(`${HT_HOST}/Service_BaseInfoWeb/travel_agency_products`, params); + const byTypes = errcode !== 0 ? {} : (groupBy(result.products, (row) => row.info.product_type_name)); + // console.log(byTypes) + return Object.keys(byTypes).map((type_name) => ({ lable: type_name, title: type_name, key: type_name, options: byTypes[type_name].map(row => ({...row, label: `${row.info.code} : ${row.info.title}`, value: row.info.id})) })); +}; + +const ProductsSelector = ({ params, ...props }) => { + const { t } = useTranslation(); + const [fetching, setFetching] = useState(false); + const [options, setOptions] = useState([]); + + const fetchAction = async () => { + setOptions([]); + setFetching(true); + const data = await fetchAgencyProductsList(params); + // console.log(data) + setOptions(data); + setFetching(false); + return data; + }; + useEffect(() => { + fetchAction(); + + return () => {}; + }, []); + + return ( + <> + : null} + optionFilterProp='label' + options={options}> + + > + ); +}; +export default ProductsSelector; diff --git a/src/views/products/Detail/CopyProducts.jsx b/src/views/products/Detail/CopyProducts.jsx index 40fbca5..feccf17 100644 --- a/src/views/products/Detail/CopyProducts.jsx +++ b/src/views/products/Detail/CopyProducts.jsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { App, Form, Modal, DatePicker, Divider, Switch } from 'antd'; +import { App, Form, Modal, DatePicker, Divider, Switch, Space, Flex } from 'antd'; import { isEmpty, objectMapper } from '@/utils/commons'; import { useTranslation } from 'react-i18next'; @@ -13,43 +13,102 @@ import { copyAgencyDataAction } from '@/stores/Products/Index'; import useAuthStore from '@/stores/Auth'; import RequireAuth from '@/components/RequireAuth'; import { PERM_PRODUCTS_MANAGEMENT } from '@/config'; +import ProductsSelector from '@/components/ProductsSelector'; dayjs.extend(arraySupport); export const CopyProductsForm = ({ action, initialValues, onFormInstanceReady, source, ...props }) => { const { t } = useTranslation(); const [form] = Form.useForm(); + const { + sourceAgency: { travel_agency_id }, + sourceYear: use_year, + } = source; const isPermitted = useAuthStore((state) => state.isPermitted); + const [typeDisabled, setTypeDisabled] = useState(false); useEffect(() => { onFormInstanceReady(form); }, []); const onValuesChange = (changeValues, allValues) => {}; + return ( -