Commit 76d1cea0 authored by 陈万宝's avatar 陈万宝

Merge branch 'master' into feature/20230109_business_abutment

parents 08f0322d 50576feb
const isProduction = process.env.NODE_ENV === 'production';
const isPre = process.env.PRE_ENV === 'pre';
const environment = 'sc1';
const environment = 'xyqb';
const envAPi = {
api: `https://security-${environment}.liangkebang.net`, //'https://security-xyqb.liangkebang.net',
kdspOpApi: `https://sc-merchant-api-${environment}.liangkebang.net`,
......
......@@ -34,11 +34,9 @@ export default props => {
const geocoder = new window.AMap.Geocoder({
city,
});
geocoder.getLocation(addrInfo.address, (status, result) => {
if (status === 'complete' && result.geocodes.length) {
const { lng, lat } = result.geocodes[0].location;
console.log(result.geocodes[0].location);
setLnglat([lng, lat]);
setLnglatText(`${lng},${lat}`);
} else {
......@@ -73,7 +71,7 @@ export default props => {
created: getPoint,
click: onGetPoint,
}}
zoom={15}
zoom={14}
>
<Marker position={lnglat}></Marker>
</Map>
......
......@@ -255,7 +255,10 @@ const AfterSale = props => {
const tabChange = tabIndex => {
setCurrentTab(tabIndex);
const { type, dealStatus } = TAB_MAPPING_DATA[tabIndex];
form.resetFields();
// 清空页码
actionRef.current.reloadAndRest();
form.setFieldsValue({
...tableParams,
dealStatus,
......@@ -332,20 +335,20 @@ const AfterSale = props => {
scroll: { x: '100%', y: tableScrollY },
rowKey: r => r.serviceNo,
request: async params => {
console.log(params);
const [start, end] = params.afterTime || afterTime;
const { current: page, pageSize: size } = params;
const { current: pageNo, pageSize } = params;
const startDate = start ? moment(start).format('YYYY-MM-DD') : '';
const endDate = end ? moment(end).format('YYYY-MM-DD') : '';
const requestParams = {
page,
size,
pageNo,
pageSize,
...params,
startDate,
endDate,
};
delete requestParams.afterTime;
delete requestParams.current;
delete requestParams.pageSize;
const countRes = await getAfterPendingNum({
startDate,
endDate,
......
import React, { useState, useEffect } from 'react';
import { Modal, Table, message } from 'antd';
import { columns } from './staticdata';
import { apiDraftList, apiDraftDetail, apiDeleteDraft } from '../service';
const DraftModal = props => {
const [pageInfo, setPageInfo] = useState({
current: 1,
pageSize: 4,
});
const [total, setTotal] = useState(0);
const [dataSource, setdataSource] = useState([]);
const onClose = () => props.onCancel();
const onEdit = async record => {
const res = await apiDraftDetail(record.id);
if (res && res.data) {
const data = JSON.parse(res.data.content);
data.id = record.id;
props.onToDetail(data);
onClose();
}
};
const getDraftList = async params => {
const res = await apiDraftList(params);
if (res && res.data && res.data.records) {
setdataSource(res.data.records);
setTotal(res.data.total);
}
};
const onRefresh = () => {
getDraftList({
pageSize: pageInfo.pageSize,
pageNo: pageInfo.current,
});
};
const onDel = record => {
Modal.confirm({
title: '确认提示',
content: '操作后不可更改,确认是否删除?',
onOk: async () => {
console.log('record :>> ', record);
await apiDeleteDraft(record.id);
message.success('删除成功!');
onRefresh();
},
});
};
const onChange = (current, pageSize) => {
const json = {
current,
pageSize,
};
setPageInfo(json);
json.pageNo = current;
getDraftList(json);
};
const pagination = {
...pageInfo,
total,
showTotal: t => `共 ${t} 项数据`,
onChange,
pageSizeOptions: [4, 20, 50, 100],
showSizeChanger: !0,
onShowSizeChange: onChange,
};
useEffect(() => {
if (props.visible) {
onRefresh();
}
}, [props.visible]);
const res = {
onDel,
onEdit,
};
return (
<Modal
visible={props.visible}
title="草稿箱"
onCancel={onClose}
maskClosable={false}
width="1000px"
footer={[]}
>
<Table
columns={columns(res)}
pagination={pagination}
rowKey={record => record.id}
dataSource={dataSource}
/>
</Modal>
);
};
export default DraftModal;
import React from 'react';
import { Button } from 'antd';
import styles from '../style.less';
const productType = {
1: '普通商品',
2: '虚拟商品',
3: '电子卡卷',
4: '服务商品',
};
export const columns = ({ onDel, onEdit }) => [
{
title: '草稿ID',
dataIndex: 'id',
width: 85,
align: 'center',
},
{
title: '商品名称',
dataIndex: 'productName',
align: 'center',
render(text) {
return <div className={styles.draftName}>{text}</div>;
},
},
{
title: '所属类目',
dataIndex: 'leimu',
width: 240,
align: 'center',
render(text, record) {
if (record.firstCategoryName) {
return `${record.firstCategoryName}>${record.secondCategoryName}>${record.thirdCategoryName}`;
}
return '-';
},
},
{
title: '商品类型',
dataIndex: 'productType',
width: 100,
align: 'center',
render(text) {
return productType[text];
},
},
{
title: '创建时间',
dataIndex: 'createdAt',
width: 120,
align: 'center',
},
{
title: '操作',
dataIndex: 'action',
width: 130,
align: 'center',
render: (text, record) => (
<>
<Button key="edit" type="link" size="small" onClick={() => onEdit(record)}>
修改
</Button>
<Button key="viewP" type="link" size="small" onClick={() => onDel(record)}>
删除
</Button>
</>
),
},
];
......@@ -25,6 +25,7 @@ import SearchForm from './SearchForm';
import TempleatModal from './TempleatModal';
import ServiceGoods from '../ServiceGoods';
import InfoAudit from './infoAudit';
import DraftModal from './DraftModal';
import { GOOD_MANAGE } from '@/../config/permission.config';
......@@ -56,6 +57,8 @@ class goodsManage extends Component {
serviceData: {},
visibleAuditModal: false,
auditRow: {}, // 查看审核信息使用
isVisibleDraft: false, // 显示隐藏草稿箱
isEditDraft: false, // 是否编辑草稿
};
currentLog = null;
......@@ -306,6 +309,7 @@ class goodsManage extends Component {
serviceData: SourceData,
serviceVisble: true,
createloading: false,
isEditDraft: false,
});
} else {
this.setState({
......@@ -317,9 +321,20 @@ class goodsManage extends Component {
}
};
// 编辑草稿
editDraft = data => {
this.setState({
serviceData: data,
serviceVisble: true,
isEditDraft: true,
});
};
// 显示新增商品弹窗
serviceVisbleClose = (flag, refresh) => {
this.setState({
serviceVisble: flag,
isEditDraft: false,
serviceData: {},
});
if (refresh) {
......@@ -327,6 +342,14 @@ class goodsManage extends Component {
}
};
// 打开草稿箱
openDraftModal = e => {
console.log('e :>> ', e);
this.setState({
isVisibleDraft: !!e,
});
};
onEdit = () => {
this.setState({ visibleAuditModal: false, auditRow: {} });
this.serviceVisbleChange(this.state.auditRow);
......@@ -348,17 +371,26 @@ class goodsManage extends Component {
this.canEditable = permissions[GOOD_MANAGE.EDITABLE];
return (
<PageHeaderWrapper>
{canAddNormal || canAddService ? (
<Button
type="primary"
className={styles.button}
onClick={() => this.serviceVisbleClose(true)}
>
新增商品
</Button>
) : (
''
)}
{canAddNormal || canAddService
? [
<Button
type="primary"
key="btnNew"
className={styles.button}
onClick={() => this.serviceVisbleClose(true)}
>
新增商品
</Button>,
<Button
type="link"
key="btnDraft"
className={styles.button}
onClick={this.openDraftModal}
>
草稿箱
</Button>,
]
: ''}
<Spin spinning={this.state.createloading}>
<Card>
<SearchForm
......@@ -456,6 +488,7 @@ class goodsManage extends Component {
virtualCategoryList={this.state.virtualTreeData}
specListData={this.state.specListData}
permissions={permissions}
isDraft={this.state.isEditDraft}
/>
)}
</Spin>
......@@ -470,6 +503,13 @@ class goodsManage extends Component {
onEdit={this.onEdit}
/>
)}
{this.state.isVisibleDraft && (
<DraftModal
visible={this.state.isVisibleDraft}
onCancel={this.openDraftModal}
onToDetail={this.editDraft}
/>
)}
</PageHeaderWrapper>
);
}
......
......@@ -269,3 +269,23 @@ export const apiQueryLastAuditRecord = skuId =>
request.get(`/api/kdsp/sku/last/audit/record?skuId=${skuId}`, {
prefix: goodsApi,
});
// 商品草稿详情
export const apiDraftDetail = draftId =>
request.get(`/api/merchants/drafts/detail?id=${draftId}`, {
prefix: goodsApi,
});
// 删除商品草稿
export const apiDeleteDraft = draftId =>
request.get(`/api/merchants/drafts/delete?id=${draftId}`, {
prefix: goodsApi,
});
// 商品草稿列表
export async function apiDraftList(data) {
return request.post('/api/merchants/drafts/list', {
prefix: goodsApi,
data,
});
}
......@@ -315,6 +315,8 @@ const filterServiceItem = (type, serviceItem) => {
resetTime(serviceItem.purchaseStartTime),
resetTime(serviceItem.purchaseEndTime),
], // 购买开始时间
validityPeriodType: serviceItem.validityPeriodType,
validityPeriodDays: serviceItem.validityPeriodDays,
shopIds: serviceItem.shopIds || [], // 适用门店列表
unavailableDate: serviceItem.unavailableDate, // 不可用日期
useTimeDescription: serviceItem.useTimeDescription, // 使用时间
......
......@@ -126,3 +126,7 @@
.attrboxMore {
max-height: max-content;
}
.draftName {
text-align: left;
word-break: break-all;
}
......@@ -179,3 +179,10 @@
.btnMore {
text-align: center;
}
.draftBox {
margin-bottom: 5px;
}
.conEdit {
color: #0e75fd;
cursor: pointer;
}
import React from 'react';
import React, { memo } from 'react';
import { Select, Form, InputNumber, Input, Button, Popover } from 'antd';
import commonStyle from '../common.less';
......@@ -15,11 +15,11 @@ export const WrapperContainer = props => (
* @param props
*/
export const Title = props => (
export const Title = memo(props => (
<div className={commonStyle.title}>
<h3>{props.title}</h3>
</div>
);
));
export const SelectTemplate = props => {
const {
......@@ -87,7 +87,13 @@ export const CreateFormInput = props => {
{...options}
style={{ width: '100%' }}
placeholder={`请输入${title}`}
onBlur={e => onBlurEvent(e.target.value, dataIndex, rowIndex)}
onBlur={e => {
const inputTarget = e.target;
const timer = setTimeout(() => {
clearTimeout(timer);
onBlurEvent(inputTarget.value, dataIndex, rowIndex);
}, 10);
}}
/>
);
}
......@@ -140,6 +146,7 @@ export const CreateFormInput = props => {
const inputTarget = e.target;
const timer = setTimeout(() => {
clearTimeout(timer);
console.log('inputTarget.value :>> ', inputTarget.value);
onBlurEvent(inputTarget.value, dataIndex, rowIndex);
}, 10);
}}
......
import { Input, Modal, Button, Form, Table, InputNumber } from 'antd';
import { Input, Modal, Button, Form, Table } from 'antd';
import React, {
useContext,
createContext,
......@@ -9,7 +9,7 @@ import React, {
} from 'react';
import { ServiceContext } from '../context';
import { CreateFormInput } from './CommonTemplate';
import UUID from '../../../utils/uuid';
import { debounce } from '@/utils/utils';
const UpdateSkuName = ({ skuVisble, value, confirmEvent, cancelEvent }) => {
const [skuForm] = Form.useForm();
......@@ -62,39 +62,33 @@ const EditFormTable = forwardRef((props, ref) => {
setDataSource([...initData]);
}, [initData]);
// const handleSave = row => {
// form.setFieldsValue({
// tableList: [...row],
// });
// const dataList = [...dataSource];
// dataList[rowIndex][dataIndex] = value;
// setDataSource([...dataList]);
// };
const handleSave = (value, dataIndex, rowIndex) => {
// form.setFieldsValue({
// [`tableList[${rowIndex}][${dataIndex}]`]: value,
// });
const dataList = [...dataSource];
dataList[rowIndex][dataIndex] = value;
setDataSource([...dataList]);
};
const getValues = () =>
[...dataSource].map(item => {
const { rowSpanCount, option, ...childItem } = item;
return childItem;
});
const onCheck = async () => {
try {
await form.validateFields();
const newTableList = [...dataSource].map(item => {
const { rowSpanCount, option, ...childItem } = item;
return childItem;
});
console.log('===============>newTableList', newTableList);
return newTableList;
return getValues();
} catch (errorInfo) {
console.log(errorInfo);
return null;
}
};
const getFormValues = debounce(() => {
props.onValuesChange();
}, 400);
const handleSave = (value, dataIndex, rowIndex) => {
const dataList = [...dataSource];
dataList[rowIndex][dataIndex] = value;
setDataSource([...dataList]);
getFormValues();
};
const rowOnClickEvent = row => {
setSkuVisble(true);
setSkuNameItem({
......@@ -131,6 +125,7 @@ const EditFormTable = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
onCheck,
form,
getValues,
}));
// 根据这里做判断渲染表格
const columns = defaultColumns
......@@ -182,7 +177,7 @@ const EditFormTable = forwardRef((props, ref) => {
return (
<>
<Form form={form} scrollToFirstError component={false}>
<Form form={form} scrollToFirstError component={false} onValuesChange={getFormValues}>
<EditableContext.Provider value={form}>
<Table
scroll={{ y: 320, x: 1000 }}
......@@ -190,6 +185,7 @@ const EditFormTable = forwardRef((props, ref) => {
pagination={false}
size="small"
bordered
rowKey={(record, i) => i}
dataSource={dataSource}
columns={columns}
/>
......
......@@ -6,6 +6,7 @@ import { UpOutlined, DownOutlined } from '@ant-design/icons';
import styles from '../common.less';
import { apiGetAttribute } from '../service';
import CustomSelect from '@/components/CustomSelect';
import { debounce } from '@/utils/utils';
const FormAttr = forwardRef((props, ref) => {
const [form] = Form.useForm();
......@@ -37,7 +38,10 @@ const FormAttr = forwardRef((props, ref) => {
skuAttr.forEach(item => {
if (item[key].length) {
let values = +item.optionType.code === 1 ? '' : [];
let values = [];
if ((item.optionType && +item.optionType.code === 1) || typeof item[key] === 'string') {
values = '';
}
obj[item.productAttributeId] = [];
item[key].forEach(attr => {
const { attributeValueId, attributeValueName } = attr;
......@@ -52,7 +56,11 @@ const FormAttr = forwardRef((props, ref) => {
obj[item.productAttributeId].push(json);
}
// eslint-disable-next-line no-unused-expressions
+item.optionType.code === 1 ? (values = v) : values.push(v);
if ((item.optionType && +item.optionType.code === 1) || typeof item[key] === 'string') {
values = v;
} else {
values.push(v);
}
}
});
obj.initValue[item.productAttributeId] = values;
......@@ -63,6 +71,8 @@ const FormAttr = forwardRef((props, ref) => {
// 获取属性
const getAttribute = async categoryId => {
console.log('categoryId :>> ', categoryId);
console.log('props.initData :>> ', props.initData);
const res = await apiGetAttribute(categoryId);
if (res && res.data && res.data.length) {
let initValue = {
......@@ -128,6 +138,26 @@ const FormAttr = forwardRef((props, ref) => {
}
};
const getFormValues = debounce(() => {
const values = form.getFieldsValue();
const arr = Object.keys(values).map(item => {
const obj = {
productAttributeId: item,
};
if (typeof values[item] === 'string') {
obj.productAttributeApplyValueList = JSON.parse(values[item]);
} else {
obj.productAttributeApplyValueList = values[item].map(v => JSON.parse(v));
}
return obj;
});
props.onValuesChange({
productAttributeApplyList: {
productAttributeApplyList: arr,
},
});
}, 400);
const onCheck = async () => {
try {
const values = await form.validateFields();
......@@ -181,7 +211,7 @@ const FormAttr = forwardRef((props, ref) => {
<>
<div className={styles.attrbox + (isMore ? styles.attrboxMore : '')}>
{categoryAttrs.length > 0 && (
<Form form={form} initialValues={initAttrData}>
<Form form={form} initialValues={initAttrData} onValuesChange={getFormValues}>
<Row>
{categoryAttrs.map(k => (
<Col span={12} key={k.id}>
......
......@@ -2,6 +2,7 @@ import React, { useState, useContext, useEffect, forwardRef, useImperativeHandle
import { Cascader, Form, Input, Select, Popover, Button, Checkbox } from 'antd';
import { formItemLayout } from '../config';
import { ServiceContext } from '../context';
import { debounce } from '@/utils/utils';
const CreateSelectOption = optionList =>
optionList.map(brandItem => (
......@@ -53,6 +54,11 @@ const FormInformationBasic = forwardRef((props, ref) => {
}
};
const getFormValues = debounce(() => {
const values = form.getFieldsValue();
props.onValuesChange({ infoMation: values });
}, 400);
useImperativeHandle(ref, () => ({
onCheck,
reset: form.resetFields,
......@@ -64,10 +70,8 @@ const FormInformationBasic = forwardRef((props, ref) => {
}, [brandList]);
useEffect(() => {
if (customer.isEdit) {
if (!editData) return;
form.setFieldsValue(editData);
}
if (!editData) return;
form.setFieldsValue(editData);
}, [customer.isEdit, editData]);
return (
......@@ -82,6 +86,7 @@ const FormInformationBasic = forwardRef((props, ref) => {
description: '',
}}
scrollToFirstError
onValuesChange={getFormValues}
>
<Form.Item
name="categoryId"
......
import React, { useState, forwardRef, useEffect, useImperativeHandle } from 'react';
import { Form, Button, Row, Col, Input, Select, Modal, notification } from 'antd';
import { Form, Button, Row, Col, Input, Select, Modal, notification, Popover } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import styles from '../common.less';
import { isIntegerNotZero, isCheckPriceOneDecimal } from '@/utils/validator';
import UUID from '@/utils/uuid';
import { debounce } from '@/utils/utils';
import localStorage from '@/utils/localStorage';
import { localAutoSaveKey } from '../utils';
const { Option } = Select;
......@@ -12,19 +15,29 @@ const getCaiJson = gname => ({
gName: gname,
quantity: '',
dishName: '',
subtitle: '',
unit: '',
price: '',
skuId: '',
});
const FormCai = forwardRef((props, ref) => {
const { gitem, groupName, groupkey, packageIndex } = props;
const { gitem, groupName, groupkey, packageIndex, form, groupIndex } = props;
const lists = form.getFieldValue('lists');
const subTitles = lists[packageIndex].children[groupIndex].dishes.map(item => item.subtitle);
const [subTitle, setSubTitle] = useState(subTitles);
const onDel = (callback, name, key) => {
// callback(name);
props.onDelCai(packageIndex, groupkey, key);
};
const onChange = (e, i) => {
const { value } = e.target;
const arr = [...subTitle];
arr[i] = value;
setSubTitle(arr);
};
const onAdd = (callback, key) => {
if (props.onAddCai(packageIndex, groupkey)) {
callback(getCaiJson(groupName));
......@@ -37,7 +50,7 @@ const FormCai = forwardRef((props, ref) => {
<>
{items.map(({ key, name }, caiIndex) => (
<Row gutter={24} key={`cai_${key}`} className={styles.caiRow}>
<Col span={5}>
<Col span={3}>
<Form.Item name={[name, 'gName']}>
<Input readOnly hidden />
<span>{groupName}</span>
......@@ -77,7 +90,7 @@ const FormCai = forwardRef((props, ref) => {
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Col span={3}>
<Form.Item
name={[name, 'price']}
rules={[
......@@ -88,7 +101,18 @@ const FormCai = forwardRef((props, ref) => {
<Input maxLength={10} />
</Form.Item>
</Col>
<Col span={3}>
<Col span={4}>
<Popover content={() => subTitle[caiIndex]} trigger="hover">
<Form.Item
name={[name, 'subtitle']}
onChange={e => onChange(e, caiIndex)}
// rules={[{ required: true, message: '请输入副标题' }]}
>
<Input maxLength={100} placeholder="最多100个字" />
</Form.Item>
</Popover>
</Col>
<Col span={2}>
<Button type="link" onClick={() => onDel(remove, name, key)}>
删除
</Button>
......@@ -115,15 +139,16 @@ const FormGroup = forwardRef((props, ref) => {
<Form.List name={item}>
{(items, { add, remove }) => (
<>
{items.map(({ key, name }) => (
{items.map(({ key, name }, index) => (
<div className={styles.groupMargin} key={`group_${key}`}>
<Row gutter={24} className={styles.groupHeader}>
<Col span={5}>组名</Col>
<Col span={3}>组名</Col>
<Col span={3}>数量</Col>
<Col span={4}>菜名</Col>
<Col span={4}>标题</Col>
<Col span={2}>单位</Col>
<Col span={4}>价格</Col>
<Col span={3}>操作</Col>
<Col span={3}>价格</Col>
<Col span={4}>副标题</Col>
<Col span={2}>操作</Col>
<Col span={3}>
<div>
<Form.Item name={[name, 'groupName']}>
......@@ -135,6 +160,8 @@ const FormGroup = forwardRef((props, ref) => {
<FormCai
gitem={[name, 'dishes']}
packageIndex={packageIndex}
groupIndex={index}
form={form}
groupkey={key}
onAddCai={onAddCai}
onDelCai={onDelCai}
......@@ -158,11 +185,9 @@ const FormPackage = forwardRef((props, ref) => {
const { validateFields, getFieldsValue } = form;
const onCheck = async () => {
console.log('form :>> ', form);
try {
const values = await validateFields();
const arr = [];
console.log('package values :>> ', values);
if (values && values.lists) {
values.lists.forEach(item => {
arr.push({
......@@ -176,6 +201,13 @@ const FormPackage = forwardRef((props, ref) => {
}
};
const getValues = () => form.getFieldsValue();
const getFormValues = debounce(() => {
// const values = form.getFieldsValue();{ setMealContent: values }
props.onValuesChange();
}, 400);
// 创建分组
const onCreateGroup = () => {
const str = groupName && groupName.trim();
......@@ -230,6 +262,7 @@ const FormPackage = forwardRef((props, ref) => {
}
setList(arr);
form.setFieldsValue(arrList);
getFormValues();
};
useEffect(() => {
......@@ -266,11 +299,12 @@ const FormPackage = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
onCheck,
getValues,
}));
return (
<div className={styles.formPackageBox}>
<Form style={{ marginBottom: 10 }} form={form}>
<Form style={{ marginBottom: 10 }} form={form} onValuesChange={getFormValues}>
<Form.List name="lists">
{(fields, { add, remove }) => (
<>
......
......@@ -7,7 +7,11 @@ import React, {
useRef,
useEffect,
useContext,
useMemo,
useCallback,
memo,
} from 'react';
// import { unstable_batchedUpdates } from 'react-dom';
import { formItemLayout, StaticColumns } from '../config';
import EditFormTable from './EditFormTable';
import FormPackage from './FormPackage';
......@@ -19,6 +23,7 @@ import {
fliterSkuListSortData,
filterSkuNotIdList,
} from '../utils';
import { debounce } from '@/utils/utils';
import { ServiceContext } from '../context';
import { SelectTemplate, Title } from './CommonTemplate';
......@@ -172,7 +177,7 @@ const SpecificationTemplate = (props, _) => {
);
};
const CreateBatchFormItems = ({ specInitValue, batchChange, editRef, defaultColumns }) => {
const CreateBatchFormItems = ({ specInitValue, batchChange, defaultColumns }) => {
const customer = useContext(ServiceContext);
const formItems = defaultColumns
.filter(item => item.batchRole && item?.batchRole.includes(customer.productType))
......@@ -195,7 +200,7 @@ const CreateBatchFormItems = ({ specInitValue, batchChange, editRef, defaultColu
noSty
formName="bacthFirst"
placeholder={specInitValue.firstSpec}
dataList={specInitValue.firstSpecValue}
dataList={specInitValue.firstSpecValue || []}
fieldNames={{ label: 'firstSpecValue', value: 'firstSpecValue' }}
/>
<SelectTemplate
......@@ -203,7 +208,7 @@ const CreateBatchFormItems = ({ specInitValue, batchChange, editRef, defaultColu
width={150}
formName="bacthSecon"
placeholder={specInitValue.secondSpec}
dataList={specInitValue.secondSpecValue}
dataList={specInitValue.secondSpecValue || []}
fieldNames={{ label: 'secondSpecValue', value: 'secondSpecValue' }}
/>
{formItems.concat(
......@@ -296,7 +301,7 @@ const FormPriceOrStock = forwardRef((props, ref) => {
const CreateColumnsEvent = specData => {
const columsData = [];
if (specData.firstSpec && specData.firstSpecValue.length) {
if (specData.firstSpec && specData.firstSpecValue && specData.firstSpecValue.length) {
columsData.push({
title: specData.firstSpec,
dataIndex: 'firstSpecValue',
......@@ -304,7 +309,7 @@ const FormPriceOrStock = forwardRef((props, ref) => {
});
}
if (specData.secondSpec && specData.secondSpecValue.length) {
if (specData.secondSpec && specData.secondSpecValue && specData.secondSpecValue.length) {
columsData.push({
title: specData.secondSpec,
dataIndex: 'secondSpecValue',
......@@ -363,14 +368,13 @@ const FormPriceOrStock = forwardRef((props, ref) => {
const values = form.getFieldsValue();
const { batchItem, bacthFirst, bacthSecon } = values;
const resetObject = batchTableSourceData({ batchItem, tableData, bacthSecon, bacthFirst });
props.onValuesChange({ skuList: resetObject });
setTableData(resetObject);
};
const onSpecificationEvent = async () => {
try {
const values = await form.validateFields();
console.log('values :>> ', values);
console.log('cleanArray(values.secondSpecValue) :>> ', cleanArray(values.secondSpecValue));
const cleanValues = {
firstSpec: values.firstSpec,
firstSpecId: values.firstSpecId,
......@@ -388,6 +392,24 @@ const FormPriceOrStock = forwardRef((props, ref) => {
return null;
};
const getFormValues = debounce(async () => {
const cleanValues = await onSpecificationEvent();
props.onValuesChange({ infoSpecData: cleanValues });
}, 400);
const packageValueChange = () => {
const efvalues = editRef.current.getValues();
if (customer.isCard) {
const packageV = packageRef.current.getValues();
efvalues.forEach((item, i) => {
item.serviceItem = {
setMealContent: packageV.lists[i].children,
};
});
}
props.onValuesChange({ skuList: efvalues });
};
const firstOnChangeEvent = async () => {
const cleanValues = await onSpecificationEvent();
if (cleanValues) {
......@@ -406,6 +428,7 @@ const FormPriceOrStock = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
onCheck,
onFinish,
reset: () => {
form.resetFields();
setDefaultColumns([]);
......@@ -416,20 +439,28 @@ const FormPriceOrStock = forwardRef((props, ref) => {
}));
useEffect(() => {
if (customer.isEdit) {
if (!editData) return;
if (customer.isEdit || customer.isUseCache) {
if (!editData) {
onFinish();
return;
}
form.setFieldsValue(editData); // 设置规格数据
firstOnChangeEvent(); // 触发成底部动态表格数据
setSpecInitValue(editData); // 缓存规格数据
CreateColumnsEvent(editData);
setMergeTable(Boolean(editData.secondSpecValue.length));
setTableData(fliterSkuListSortData(skuList));
setMergeTable(Boolean(editData.secondSpecValue && editData.secondSpecValue.length));
setTableData(fliterSkuListSortData(skuList) || []);
}
}, [customer.isEdit, editData]);
}, [customer.isEdit, customer.isUseCache, editData]);
return (
<>
<Form form={form} autoComplete="off" initialValues={initSpecReced()}>
<Form
form={form}
autoComplete="off"
initialValues={initSpecReced()}
onValuesChange={getFormValues}
>
<SpecificationTemplate
form={form}
label="一级规格"
......@@ -469,11 +500,17 @@ const FormPriceOrStock = forwardRef((props, ref) => {
setTableData={setTableData}
defaultColumns={defaultColumns}
initData={tableData}
onValuesChange={packageValueChange}
/>
{customer.isCard && (
<>
<Title title="套餐内容" key="tctitle" />
<FormPackage ref={packageRef} initData={tableData} key="tc" />
<FormPackage
ref={packageRef}
initData={tableData}
key="tc"
onValuesChange={packageValueChange}
/>
</>
)}
</>
......
import { Form, Input, Select, Checkbox, DatePicker } from 'antd';
import React, { useEffect, forwardRef, useImperativeHandle, useContext } from 'react';
import { Form, Input, Select, Checkbox, DatePicker, Radio, InputNumber } from 'antd';
import React, { useEffect, forwardRef, useImperativeHandle, useContext, useState } from 'react';
import moment from 'moment';
import { WeeksList, formItemLayout } from '../config';
import { ServiceContext } from '../context';
import { formatTime } from '../../../utils/utils';
import { debounce, formatTime } from '@/utils/utils';
const { Option } = Select;
const { RangePicker } = DatePicker;
......@@ -23,6 +23,7 @@ const FormRuleSetting = forwardRef((props, ref) => {
const { editData, supplierIdList } = props;
const [form] = Form.useForm();
const customer = useContext(ServiceContext);
const [dateType, setDateType] = useState(1);
// 判断是否有禁用的店铺 禁用店铺不显示
const getIsInShops = arr => {
......@@ -34,34 +35,51 @@ const FormRuleSetting = forwardRef((props, ref) => {
};
useEffect(() => {
if (customer.isEdit) {
if (customer.isEdit || customer.isUseCache) {
if (!editData) return;
const goodInfo = Object.assign({}, editData);
if (goodInfo.shopIds) {
const shopIds = getIsInShops(editData.shopIds);
goodInfo.shopIds = shopIds;
}
console.log('goodInfo :>> ', goodInfo);
if (goodInfo.validityPeriodType) {
console.log('+goodInfo.validityPeriodType :>> ', +goodInfo.validityPeriodType);
setDateType(+goodInfo.validityPeriodType);
}
form.setFieldsValue(goodInfo);
}
}, [customer.isEdit, editData]);
}, [customer.isEdit, customer.isUseCache, editData]);
const onCheck = async () => {
try {
const { useTime, purchaseTime, ...values } = await form.validateFields();
return {
useStartTime: formatTime(useTime[0]),
useEndTime: formatTime(useTime[1]),
const params = {
purchaseStartTime: formatTime(purchaseTime[0]),
purchaseEndTime: formatTime(purchaseTime[1]),
temp: 'serviceItem',
...values,
};
if (useTime && useTime.length === 2) {
params.useStartTime = formatTime(useTime[0]);
params.useEndTime = formatTime(useTime[1]);
}
return params;
} catch (errorInfo) {
return null;
}
};
const onChangeDateType = e => {
const v = +e.target.value;
setDateType(v);
};
const getFormValues = debounce(() => {
const values = form.getFieldsValue();
props.onValuesChange({ serviceItem: values });
}, 400);
const nowDateTime = moment(moment().format('YYYY-MM-DD 00:00:00'));
const nowDateTimeEnd = moment(moment().format('YYYY-MM-DD 23:59:59'));
......@@ -76,7 +94,8 @@ const FormRuleSetting = forwardRef((props, ref) => {
form={form}
name="register"
initialValues={{
useTime: [], // 使用开始时间
// useTime: [], // 使用开始时间
validityPeriodType: 1, // 有效期类型
// useEndTime: '', // 使用结束时间
purchaseTime: [], // 购买开始时间
// purchaseEndTime: '2022-07-27 06', // 购买结束时间
......@@ -89,6 +108,7 @@ const FormRuleSetting = forwardRef((props, ref) => {
tips: '', // 温馨提示
}}
scrollToFirstError
onValuesChange={getFormValues}
>
<Form.Item name="purchaseTime" label="购买时间" {...rangeConfig}>
<RangePicker
......@@ -96,12 +116,34 @@ const FormRuleSetting = forwardRef((props, ref) => {
defaultPickerValue={[nowDateTime, nowDateTimeEnd]}
/>
</Form.Item>
<Form.Item name="useTime" label="有效期" {...rangeConfig}>
<RangePicker
format="YYYY-MM-DD HH:mm:ss"
defaultPickerValue={[nowDateTime, nowDateTimeEnd]}
/>
<Form.Item
name="validityPeriodType"
label="有效期类型"
rules={[{ required: true, message: '请选择有效期类型!' }]}
>
<Radio.Group onChange={onChangeDateType}>
<Radio value={1}>固定日期</Radio>
<Radio value={2} disabled>
指定范围
</Radio>
</Radio.Group>
</Form.Item>
{dateType === 1 ? (
<Form.Item name="useTime" label="有效期" {...rangeConfig}>
<RangePicker
format="YYYY-MM-DD HH:mm:ss"
defaultPickerValue={[nowDateTime, nowDateTimeEnd]}
/>
</Form.Item>
) : (
<Form.Item
name="validityPeriodDays"
label="有效期天数"
rules={[{ required: true, message: '请输入有效期天数!' }]}
>
<InputNumber min={1} max={36000} />
</Form.Item>
)}
<Form.Item
name="shopIds"
label="适用门店"
......
......@@ -6,6 +6,7 @@ import { ServiceContext } from '../context';
import { TaskList, formItemLayout } from '../config';
import UploadImage from './UploadImage';
import commonStyle from '../common.less';
import { debounce } from '@/utils/utils';
const FormRuleVPictures = forwardRef((props, ref) => {
const { editData, specKeyItem } = props;
......@@ -21,12 +22,12 @@ const FormRuleVPictures = forwardRef((props, ref) => {
const [{ imgConfig }] = typeConfig.filter(item => item.type === customer.productType);
useEffect(() => {
if (customer.isEdit) {
if (customer.isEdit || customer.isUseCache) {
if (editData) {
setImageList(editData.imageList);
setCardImageList(editData.cardImageList);
setCommonImageList(editData.commonImageList); // 编辑状态下设置公共图
setDetailImageList(editData.detailImageList); // 编辑状态下设置详情图
setImageList(editData.imageList || {});
setCardImageList(editData.cardImageList || []);
setCommonImageList(editData.commonImageList || []); // 编辑状态下设置公共图
setDetailImageList(editData.detailImageList || []); // 编辑状态下设置详情图
const editParams = {
commonImageList: editData.commonImageList,
detailImageList: editData.detailImageList,
......@@ -42,7 +43,7 @@ const FormRuleVPictures = forwardRef((props, ref) => {
});
}
}
}, [customer.isEdit, editData]);
}, [customer.isEdit, customer.isUseCache, editData]);
useEffect(() => {
if (customer.isCard) return;
......@@ -67,6 +68,12 @@ const FormRuleVPictures = forwardRef((props, ref) => {
}
};
const getFormValues = debounce(() => {
const values = form.getFieldsValue();
props.onValuesChange({ infoImageData: values });
// props.onValuesChange(values);
}, 400);
useImperativeHandle(ref, () => ({
onCheck,
setFieldsValue: obj => {
......@@ -139,6 +146,7 @@ const FormRuleVPictures = forwardRef((props, ref) => {
imageList: {},
detailImageList: [],
}}
onValuesChange={getFormValues}
>
<Form.Item
name="commonImageList"
......
......@@ -3,6 +3,7 @@ import { Form, Input, Select, Checkbox, Radio, Space, InputNumber } from 'antd';
import { Title } from './CommonTemplate';
import { formItemLayout } from '../config';
import { ServiceContext } from '../context';
import { debounce } from '@/utils/utils';
const createInitValues = () => ({
settlementMethod: 1,
......@@ -35,13 +36,18 @@ const FormSettlementOthers = forwardRef((props, ref) => {
}
};
const getFormValues = debounce(() => {
const values = form.getFieldsValue();
props.onValuesChange({ settlementItem: values });
}, 400);
useEffect(() => {
if (customer.isEdit) {
if (customer.isEdit || customer.isUseCache) {
if (!editData) return;
form.setFieldsValue(editData);
setInitValue({ ...editData });
}
}, [customer.isEdit, editData]);
}, [customer.isEdit, customer.isUseCache, editData]);
useImperativeHandle(ref, () => ({
onCheck,
......@@ -120,6 +126,7 @@ const FormSettlementOthers = forwardRef((props, ref) => {
name="register"
initialValues={initValue}
scrollToFirstError
onValuesChange={getFormValues}
>
<Form.Item
name="appointment"
......
This diff is collapsed.
......@@ -103,3 +103,17 @@ export const apiGetAttribute = categoryId =>
request.get(`/api/kdsp/category/template/ref/attribute/detail?categoryId=${categoryId}`, {
prefix: goodsApi,
});
// 新建草稿
export const apiCreateDraft = data =>
request.post('/api/merchants/drafts/add', {
prefix: goodsApi,
data,
});
// 编辑草稿
export const apiEditDraft = data =>
request.post('/api/merchants/drafts/edit', {
prefix: goodsApi,
data,
});
import { message } from 'antd';
import { sortBy } from 'lodash';
import UUID from '../../utils/uuid';
import localStorage from '@/utils/localStorage';
import { debounce, getObjectType, isClass } from '@/utils/utils';
export const clearCurrent = currentList => currentList.filter(item => item.current);
......@@ -106,7 +109,6 @@ const filterItems = (type, props) => {
};
export const filterSendData = (type, params) => {
console.log('===============>生成数据', params);
const { infoMation, infoImageData, attributeApplyList } = params;
const items = filterItems(type, params);
const commonImageList = type === 4 ? [] : infoImageData.commonImageList;
......@@ -248,7 +250,28 @@ export const createProductData = (props, isEdit, skuList) => {
const newSecondList = secndInIdList.concat(secndNoIdList || []);
list = createSkuListData(newFirstList, newSecondList, firstSpecId, secondSpecId, skuList);
} else {
list = createSkuListData(fisrtNoIdList, secndNoIdList, firstSpecId, secondSpecId);
list = createSkuListData(fisrtNoIdList, secndNoIdList, firstSpecId, secondSpecId, skuList);
}
return list;
};
export const localAutoSaveKey = 'good-info-auto-save';
export const onAutoSaveValue = (e, isClear) => {
const keys = Object.keys(e);
if (
e &&
isClass(e) === 'Object' &&
keys.length === 1 &&
isClass(e[keys[0]]) === 'Object' &&
Object.keys(e[keys[0]]) < 1
) {
return;
}
if (isClear) {
localStorage.set(localAutoSaveKey, Object.assign({}, e));
} else {
const info = localStorage.get(localAutoSaveKey) || {};
localStorage.set(localAutoSaveKey, Object.assign({ type: 1 }, info, e));
}
};
......@@ -76,6 +76,22 @@ const StoreModal = props => {
});
};
const getAreas = arr => {
let areas = areaAddr;
let addr = '';
arr.forEach(c => {
let index = 0;
areas.forEach((item, i) => {
if (item.value === c) {
addr += item.label;
index = i;
}
});
areas = areas[index].children;
});
return addr;
};
// 显示地图
const openMap = v => {
const values = getFieldsValue();
......@@ -96,9 +112,10 @@ const StoreModal = props => {
}
});
}
const labels = getAreas(values.addr);
setMapInfo({
provice,
address: values.address,
address: labels + values.address,
});
setVisibleMap(v);
};
......@@ -218,6 +235,7 @@ const StoreModal = props => {
title="门店信息"
visible={visible}
width="800px"
destroyOnClose
maskClosable={false}
onOk={() => onSubmit()}
onCancel={() => handleCancel()}
......
......@@ -30,7 +30,7 @@ export async function searchList(params) {
// 停启用门店
export async function apiEnableStore({ id, state }) {
const data = await request.get(`/api/merchants/shops/state/edit/${id}/${state}`, {
const data = await request.get(`/api/merchants/shops/states/edit/${id}/${state}`, {
prefix: kdspApi,
});
return data.businessCode;
......
......@@ -4,7 +4,7 @@ import { Form } from '@ant-design/compatible';
import '@ant-design/compatible/assets/index.css';
import { Modal, Select, Input, Card, notification } from 'antd';
import style from '../index.less';
import { updateExpress } from '../service';
import { apiDeliveriesAdd } from '../service';
const FormItem = Form.Item;
const { Option } = Select;
......@@ -53,7 +53,7 @@ const LogisticsForm = props => {
notification.error({ message: '该订单下的所有商品必须设置物流信息!' });
return;
}
await updateExpress(resultData);
await apiDeliveriesAdd(resultData);
onSubmit();
};
......
......@@ -40,13 +40,6 @@ export async function queryExpress() {
}
}
export async function updateExpress(params) {
return request.post('/api/merchants/orders/deliveries/add', {
prefix: config.kdspApi,
data: params,
});
}
export async function getGoods(orderId) {
const { data } = await request.get(`/api/merchants/orders/skus/list?orderId=${orderId}`, {
prefix: config.kdspApi,
......
......@@ -42,14 +42,6 @@ export async function queryToSend(params) {
}
}
// 发货/更新物流
export async function updateExpress(params) {
return request.post('/api/merchants/orders/deliveries/add', {
prefix: config.kdspApi,
data: params,
});
}
// 快递公司
export async function queryExpress() {
try {
......
......@@ -125,3 +125,5 @@ export const getClientInfo = () => {
height: document.body.clientHeight,
};
};
export const getObjectType = v => Object.prototype.toString.call(v).replace(/\[object |]/g, '');
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment