This commit is contained in:
ylj20011123 2025-11-14 18:56:57 +08:00
parent 8244fac686
commit 1cd8c40653
10 changed files with 519 additions and 48 deletions

View File

@ -521,6 +521,12 @@ export default [
name: 'NewCouponReview',
component: './CardInformation/NewCouponReview/index'
},
// 卡券核销记录
{
path: 'CouponRedemption',
name: 'CouponRedemption',
component: './CardInformation/CouponRedemption/index'
},
]
},

BIN
dist.zip

Binary file not shown.

View File

@ -1,6 +1,6 @@
{
"name": "ant-design-pro",
"version": "4.5.72",
"version": "4.5.74",
"private": true,
"description": "An out-of-box UI solution for enterprise applications",
"scripts": {

View File

@ -2,7 +2,7 @@ import { connect } from "umi";
import type { ConnectState } from "@/models/connect";
import { Col, Divider, FormInstance, message, Modal, Row } from "antd";
import { useRef, useState } from "react";
import ProForm, { ProFormDatePicker, ProFormSelect, ProFormText, ProFormTextArea, ProFormUploadButton } from "@ant-design/pro-form";
import ProForm, { ProFormDatePicker, ProFormDigit, ProFormSelect, ProFormText, ProFormTextArea, ProFormUploadButton } from "@ant-design/pro-form";
import { handeGetCOUPONDetail, handeGetWECHATAPPSIGNList } from "@/pages/travelMember/service";
import session from "@/utils/session";
import { handleDeleteCOUPON, handleGetCOOPSHOP_RULEList, handleSynchroCOUPONService } from "../../service";
@ -49,6 +49,8 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
const [modalLoading, setModalLoading] = useState<boolean>(false)
// 当前选择的卡券类型
const [COUPON_TYPE, setCOUPON_TYPE] = useState<any>()
// 当前选择得使用期限
const [VALID_TYPE, setVALID_TYPE] = useState<any>()
// 预览上传后的图片
const handlePreview = async () => {
@ -155,6 +157,7 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
setShowDetail(false)
setFileList([])
setCOUPON_TYPE(null)
setVALID_TYPE(null)
}}
confirmLoading={modalLoading}
width={1400}
@ -181,6 +184,7 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
setShowDetail(false)
setFileList([])
setCOUPON_TYPE(null)
setVALID_TYPE(null)
}}
handleOK={() => {
ModalFormRef?.current?.validateFields().then(async (res) => {
@ -202,13 +206,14 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
const data = await handeGetCOUPONDetail(req)
setCouponDetail(data)
setCOUPON_TYPE(currentRow?.COUPON_TYPE)
setVALID_TYPE(currentRow?.VALID_TYPE)
return data
} else {
setCOUPON_TYPE(1000)
setVALID_TYPE(1000)
return {}
}
}}
>
<Divider orientation="left"></Divider>
@ -458,8 +463,17 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
}
]}
readonly={readonly}
fieldProps={{
onChange: (e) => {
console.log('eeee', e);
setVALID_TYPE(e)
}
}}
initialValue={1000}
/>
</Col>
{
VALID_TYPE === 1000 ?
<Col span={8}>
<Row gutter={16}>
<Col span={12}>
@ -490,7 +504,19 @@ const CardInfo = ({ showDetail, currentRow, currentUser, parentRef, setShowDetai
</Col>
</Row>
</Col> : VALID_TYPE === 2000 ?
<Col span={8}>
<Col span={24}>
<ProFormDigit
label={"有效天数"}
name={"VALID_DAYS"}
readonly={readonly}
/>
</Col>
</Col>
: ''
}
<Col span={8}>
<ProFormSelect
label={"允许叠加"}

View File

@ -11,6 +11,8 @@ import { handeGetCouponStockList } from "@/pages/travelMember/service";
import moment from 'moment'
import { highlightText } from "@/utils/highlightText";
import CardInfo from "../CardInformationManager/components/CardInfo";
import session from "@/utils/session";
import { values } from "lodash";
const CardVoucherCollection: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -39,6 +41,8 @@ const CardVoucherCollection: React.FC<{ currentUser: CurrentUser }> = (props) =>
// 当前行数据
const [currentRow, setCurrentRow] = useState<any>()
const COUPONTYPEObj = session.get('COUPONTYPEObj')
const columns: any = [
{
title: '查询内容',
@ -55,14 +59,15 @@ const CardVoucherCollection: React.FC<{ currentUser: CurrentUser }> = (props) =>
align: 'center',
ellipsis: true,
valueType: 'select',
valueEnum: {
"1000": "满减券",
"2000": "折扣券",
"3000": "抵扣券",
"4000": "兑换券",
"5000": "代金券",
"9000": "实物券"
}
valueEnum: COUPONTYPEObj,
// valueEnum: {
// "1000": "满减券",
// "2000": "折扣券",
// "3000": "抵扣券",
// "4000": "兑换券",
// "5000": "代金券",
// "9000": "实物券"
// }
},
{
title: '查询时间',

View File

@ -0,0 +1,168 @@
import { connect } from "umi";
import type { CurrentUser } from "umi";
import type { ConnectState } from "@/models/connect";
import React, { useRef, useState } from "react";
import type { FormInstance } from "antd";
import type { ActionType } from "@ant-design/pro-table";
import ProTable from "@ant-design/pro-table";
import PageTitleBox from "@/components/PageTitleBox";
import { handleGetCOUPONRECORDList } from "../service";
import moment from 'moment'
import session from "@/utils/session";
const CouponRedemption: React.FC<{ currentUser: CurrentUser }> = (props) => {
const { currentUser } = props
const actionRef = useRef<ActionType>();
const formRef = useRef<FormInstance>();
const COUPONTYPEObj = session.get('COUPONTYPEObj')
const columns: any = [
{
title: '统计时间',
dataIndex: 'search_date',
valueType: 'dateRange',
hideInTable: true,
hideInDescriptions: true,
hideInSearch: false,
initialValue: [moment().add(-7, 'day'), moment()],
search: {
transform: (value) => {
return {
CREATE_DATE_Start: value[0],
CREATE_DATE_End: value[1],
};
},
},
},
{
title: "卡券名称",
dataIndex: "COUPON_NAME",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "卡券编码",
dataIndex: "COUPON_CODE",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "卡券类型",
dataIndex: "COUPON_TYPE",
valueType: 'select',
valueEnum: COUPONTYPEObj,
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "核销人员名称",
dataIndex: "UPDATEMEMBER_NAME",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "优惠金额",
dataIndex: "COUPON_PRICE",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
valueType: 'digit'
},
{
title: "会员名称",
dataIndex: "MEMBERSHIP_NAME",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "联系电话",
dataIndex: "MEMBERSHIP_MOBILEPHONE",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "核销时间",
dataIndex: "CREATE_DATE",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
render: (_, record) => {
return record?.CREATE_DATE ? moment(record?.CREATE_DATE).format('YYYY-MM-DD HH:mm:ss') : ""
}
}
]
return (
<div>
<div style={{ backgroundColor: '#fff', display: 'flex' }}>
<div style={{
width: '100%',
paddingTop: 0,
paddingBottom: 0,
paddingRight: 0
}}>
<ProTable
actionRef={actionRef}
formRef={formRef}
columns={columns}
bordered
expandable={{
expandRowByClick: true
}}
scroll={{ x: "100%", y: "calc(100vh - 410px)" }}
headerTitle={<PageTitleBox props={props} />} // 列表表头
search={{ span: 6 }}
request={async (params) => {
console.log('paramsparams', params);
const req: any = {
searchParameter: {
CREATE_DATE_Start: params?.CREATE_DATE_Start,
CREATE_DATE_End: params?.CREATE_DATE_End,
},
sortStr: "CREATE_DATE desc",
PageIndex: 1,
PageSize: 999999,
// PageIndex: params?.current,
// PageSize: params?.pageSize,
}
const data = await handleGetCOUPONRECORDList(req)
console.log('datadata212', data);
if (data.List && data.List.length > 0) {
return { data: data.List, success: true, total: data.TotalCount }
}
return { data: [], success: true }
}}
toolbar={{
actions: [
]
}}
/>
</div>
</div>
</div>
)
}
export default connect(({ user }: ConnectState) => ({
currentUser: user.currentUser
}))(CouponRedemption);

View File

@ -102,3 +102,19 @@ export async function handleDeleteCOUPON(params: any) {
}
return data
}
// 获取优惠券操作记录表列表
export async function handleGetCOUPONRECORDList(params: any) {
const data = await requestEncryption(`/Coupon/GetCOUPONRECORDList`, {
method: 'POST',
data: {
...params,
requestEncryption: true
}
})
if (data.Result_Code !== 100) {
return []
}
return data.Result_Data
}

View File

@ -0,0 +1,147 @@
import { connect } from "umi";
import type { ConnectState } from "@/models/connect";
import ProTable, { ActionType } from "@ant-design/pro-table";
import { useEffect, useImperativeHandle, useRef, useState } from "react";
import { FormInstance } from "antd";
import { handleGetCOUPONList } from "@/pages/CardInformation/service";
type DetailProps = {
parentRow: any // 父级传入的行数据
onRef: any// 当前组件的父级里面的实例
selectRow: any // 选择的行数据
}
const RelevanceCoupon = ({ parentRow, onRef, selectRow }: DetailProps) => {
const actionRef = useRef<ActionType>();
const formRef = useRef<FormInstance>();
// 选择的卡券id
const [selectShopRowKey, setSelectShopRowKey] = useState<any>([])
// 表格数据 可以传给父级 当作卡券的 选择列表
const [couponList, setCouponList] = useState<any>()
const columns: any = [
{
title: "卡券名称",
dataIndex: "COUPON_NAME",
align: 'left',
hideInSearch: true,
ellipsis: true,
},
{
title: "使用说明",
dataIndex: "COUPON_INSTRUCTIONS",
width: 250,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "适用门店",
dataIndex: "COOPSHOP_DESC",
width: 250,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
// {
// title: "发放数量",
// dataIndex: "COUPON_QUOTA",
// width: 120,
// align: 'center',
// hideInSearch: true,
// ellipsis: true,
// render: (_, record) => {
// return record?.COUPON_QUOTA === -1 ? '不限量' : record?.COUPON_QUOTA
// }
// },
{
title: "活动开始时间",
dataIndex: "START_TIME",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
},
{
title: "活动结束时间",
dataIndex: "END_TIME",
width: 150,
align: 'center',
hideInSearch: true,
ellipsis: true,
}
]
useImperativeHandle(onRef, () => ({
couponList,
selectShopRowKey
}));
useEffect(() => {
if (selectRow && selectRow.length > 0) {
setSelectShopRowKey(selectRow.map(String))
}
}, [])
return (
<div>
<ProTable
scroll={{ x: "100%", y: '450px' }}
rowKey={(record) => {
return `${record?.COUPON_ID}`
}}
formRef={formRef}
bordered
headerTitle={'卡券列表'} // 列表表头
actionRef={actionRef}
search={{ span: 6, labelWidth: 'auto' }}
// 请求数据
request={async (params, sorter) => {
const req: any = {
SearchParameter: {
OWNERUNIT_ID: 911,
COUPON_TYPES: 9000,
COUPON_ISVALID: 1
},
keyWord: {
key: "COUPON_NAME",
value: params?.searchValue || ""
},
PageIndex: 1,
PageSize: 999999
}
const data = await handleGetCOUPONList(req)
if (data && data.length > 0) {
let list: any = []
data.forEach((item: any) => {
list.push({ label: item.COUPON_NAME, value: item.COUPON_ID })
})
setCouponList(list)
return { data, success: true }
}
setCouponList([])
return { data: [], success: true }
}}
columns={columns}
toolbar={{
actions: [
],
}}
rowSelection={{
type: 'checkbox',
selectedRowKeys: selectShopRowKey,
onChange: (rowKeys, rowDetail) => {
console.log('rowKeysrowKeysrowKeys', rowKeys);
console.log('rowDetailrowDetailrowDetail', rowDetail);
setSelectShopRowKey(rowKeys)
},
}}
/>
</div>
)
}
export default connect(({ user, }: ConnectState) => ({
currentUser: user.currentUser,
}))(RelevanceCoupon);

View File

@ -31,6 +31,8 @@ import { handleSetlogSave } from '@/utils/format';
import { highlightText } from '@/utils/highlightText';
import { handlecsyncWeChatGetMallGoodsInfo, handlecsyncWeChatGetMallGoodsInfoAll } from '@/pages/operatingMerchants/service';
import { isEqual } from 'lodash';
import RelevanceCoupon from './component/RelevanceCoupon';
import { handleGetCOUPONList } from '@/pages/CardInformation/service';
const beforeUpload = (file: any) => {
@ -48,6 +50,7 @@ const beforeUpload = (file: any) => {
const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (props) => {
const { currentUser } = props
const { confirm } = Modal;
const associatedCouponsModalRef = useRef<any>()
const actionRef = useRef<ActionType>();
const ruleActionRef = useRef<ActionType>();
// 税率的表单
@ -112,6 +115,12 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
const [rateLoading, setRateLoading] = useState<boolean>(false)
// 点开的商品详情信息
const [currentRowDetail, setCurrentRowDetail] = useState<any>()
// 关联卡券的 悬浮框 显示
const [associatedCouponsModal, setAssociatedCouponsModal] = useState<boolean>(false)
// 关联卡券的选择列表
const [relevanceCouponList, setRelevanceCouponList] = useState<any>([])
// 当前选择的卡券行
const [selectRelevanceId, setSelectRelevanceId] = useState<any>([])
// 预览上传后的图片
const handlePreview = async (type: number) => {
@ -524,6 +533,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
...currentRow,
...res,
UserDefinedTypeIds: res.USERDEFINEDTYPE_ID ? res.USERDEFINEDTYPE_ID.toString() : "",
CouponIds: res.relevanceCoupon ? res.relevanceCoupon.toString() : "",
BRAND_ID: res.BRAND_ID.split('-')[1],
BRAND_NAME: res.BRAND_ID.split('-')[0],
MERCHANTS_ID: res.MERCHANTS_ID.split('-')[1],
@ -547,6 +557,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
...res,
UserDefinedTypeIds: res.USERDEFINEDTYPE_ID ? res.USERDEFINEDTYPE_ID.toString() : "",
BRAND_ID: res.BRAND_ID.split('-')[1],
CouponIds: res.relevanceCoupon ? res.relevanceCoupon.toString() : "",
BRAND_NAME: res.BRAND_ID.split('-')[0],
MERCHANTS_ID: res.MERCHANTS_ID.split('-')[1],
MERCHANTS_NAME: res.MERCHANTS_ID.split('-')[0],
@ -588,6 +599,8 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
setMainImgList([])
setHeaderImgList([])
setDetailImgList([])
setRelevanceCouponList([])
setSelectRelevanceId([])
let USERDEFINEDTYPEList: any = session.get('USERDEFINEDTYPEList')
@ -953,10 +966,17 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
setMainImgList([])
setHeaderImgList([])
setDetailImgList([])
setRelevanceCouponList([])
setSelectRelevanceId([])
// setBRAND_NAMEList([])
}}
footer={<div style={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<Button type={"primary"} style={{ marginRight: '8px' }} onClick={async () => {
const data = await formRef.current?.getFieldValue('relevanceCoupon')
setSelectRelevanceId(data && data.length > 0 && data[0] ? data : [])
setAssociatedCouponsModal(true)
}}></Button>
{
currentRow ?
<div>
@ -974,7 +994,6 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
</Button>
</Popconfirm>
</div>
: ""
}
@ -1052,6 +1071,8 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
setHeaderImgList([])
setDetailImgList([])
setCurrentRowDetail(undefined)
setRelevanceCouponList([])
setSelectRelevanceId([])
}}> </Button>
<Button type={"primary"} loading={confirmLoading} onClick={() => {
formRef?.current?.validateFields().then(() => {
@ -1139,6 +1160,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
BRAND_ID: `${data?.BRAND_NAME}-${data?.BRAND_ID}`,
MERCHANTS_ID: `${data?.MERCHANTS_NAME}-${data?.MERCHANTS_ID}`,
UPPER_DATE: data.UPPER_DATE && data.OFF_DATE ? [data.UPPER_DATE, data.OFF_DATE] : [],
relevanceCoupon: data.CouponIds.split(',').map(Number)
// mainImgList: mainImgList,
// headerImgList: headerImgList,
// detailImgList: detailImgList,
@ -1587,6 +1609,37 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
disabled
/>
</Col>
<Col span={24}>
<ProFormSelect
label={'关联卡券'}
name={'relevanceCoupon'}
disabled
// options={relevanceCouponList}
request={async () => {
const req: any = {
SearchParameter: {
OWNERUNIT_ID: 911,
COUPON_TYPES: 9000,
COUPON_ISVALID: 1
},
PageIndex: 1,
PageSize: 999999
}
const data = await handleGetCOUPONList(req)
if (data && data.length > 0) {
let list: any = []
data.forEach((item: any) => {
list.push({ label: item.COUPON_NAME, value: item.COUPON_ID })
})
return list
}
return []
}}
fieldProps={{
mode: 'multiple'
}}
/>
</Col>
<Divider orientation="left"></Divider>
<Col span={24}>
<ProFormUploadButton
@ -1952,8 +2005,6 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
</Modal>
{/* 税率悬浮框 */}
<Modal
title={"设置税率"}
@ -2009,6 +2060,58 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
</ProForm>
</Modal>
{/* 关联卡券的悬浮框 */}
<Modal
title={
<div
className='associatedCouponsModal'
style={{
width: '100%',
cursor: 'move',
}}
onMouseOver={() => {
if (disabled) {
setDraggleDisabled(false)
}
}}
onMouseOut={() => {
setDraggleDisabled(true)
}}
onFocus={() => { }}
onBlur={() => { }}
>
</div>
}
destroyOnClose
width={1200}
open={associatedCouponsModal}
onCancel={() => {
setAssociatedCouponsModal(false)
}}
onOk={async () => { // 提交框内的数据
let res: any = associatedCouponsModalRef.current
console.log('resdada', res);
// setRelevanceCouponList(res.couponList)
formRef.current?.setFieldsValue({ relevanceCoupon: res.selectShopRowKey.map(Number) })
setAssociatedCouponsModal(false)
}}
modalRender={(modal) => {
return <Draggable
disabled={disabled}
bounds={bounds}
onStart={(event, uiData) => onDraggaleStart(event, uiData)}
handle='.associatedCouponsModal'
>
<div ref={draggleRef}>{modal}</div>
</Draggable>
}}
>
<RelevanceCoupon onRef={associatedCouponsModalRef} parentRow={currentRow} selectRow={selectRelevanceId} />
</Modal>
</div>
</div>
);

View File

@ -1,4 +1,4 @@
// 由 scripts/writeVersion.js 自动生成
export const VERSION = "4.5.72";
export const GIT_HASH = "9a7cf2f";
export const BUILD_TIME = "2025-11-12T10:24:34.154Z";
export const VERSION = "4.5.74";
export const GIT_HASH = "8244fac";
export const BUILD_TIME = "2025-11-14T01:20:30.467Z";