Browse Source

feat: 优惠券管理手动派发页面; antd.dark.min.css部分修改, 处理穿梭框样式

tags/PMS_Frontend_v1.0.6-develop
chenglb 1 year ago
parent
commit
67a96ef120
  1. 29716
      public/static/css/antd.dark.min.css
  2. 25
      src/assets/css/base.scss
  3. 8
      src/components/FormSliderPicker/index.jsx
  4. 2
      src/pages/InRoadMgm/PersonMgm/PersonInfo/loadable.jsx
  5. 283
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/Add.jsx
  6. 192
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/index.scss
  7. 290
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/loadable.jsx
  8. 8
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/index.scss
  9. 8
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/loadable.jsx
  10. 160
      src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/index.scss
  11. 284
      src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/loadable.jsx
  12. 163
      src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/loadable_bk.jsx

29716
public/static/css/antd.dark.min.css
File diff suppressed because it is too large
View File

25
src/assets/css/base.scss

@ -640,4 +640,27 @@ color:var(--color-text) !important;
.ant-spin-text{
font-size: 15px;
}
}
}
// .ant-transfer-list{
// border-color: #666d7d !important;
// background: #50586c;
// border-radius: 4px;
// .ant-transfer-list-content{
// &::-webkit-scrollbar{
// display: none;
// }
// }
// }
// .ant-transfer-list-header{
// background: #666d7d !important;
// border: 1px solid #666D7D !important;
// }
// .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover, .ant-transfer-list-content-item-checked{
// background-color: #666d7d !important;
// }
// .ant-empty-img-simple-path{
// fill: #666d7d !important ;
// }
// .ant-checkbox{
// background-color: #454c5e;
// }

8
src/components/FormSliderPicker/index.jsx

@ -23,7 +23,8 @@ function FormSliderPicker(props) {
limit = 90,
defaultSliderTimeValue,
silderLimit = 3,
dropdownData
dropdownData ,
showQuickMenu = true
} = props
const str = {
@ -145,7 +146,10 @@ function FormSliderPicker(props) {
<SliderDate {...options} onChange={changeSliderDate} />}
{isShowSlider && !isShowTime ?
<SliderTime defaultValue={defaultSliderTimeValue} isShowAdd={isShowAdd} silderLimit={silderLimit} onChange={changeSliderMenu} /> : ''}
<QuickMenu onChange={changeQuickMenu} dropdownData={dropdownData} />
{
showQuickMenu ? <QuickMenu onChange={changeQuickMenu} dropdownData={dropdownData} /> : null
}
</div>
</div>
)

2
src/pages/InRoadMgm/PersonMgm/PersonInfo/loadable.jsx

@ -719,7 +719,7 @@ function PersonInfo() {
<p>此操作将改变在职状态, 是否继续?</p>
</Modal>
<Modal title="提示" open={isResetModalOpen} onOk={handleResetOk} onCancel={()=>{setIsResetModalOpen(false)}}>
<p>此操作将重置密码为qwe123, 是否继续?</p>
<p>此操作将重置密码为admin@123, 是否继续?</p>
</Modal>
</div>
</>

283
src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/Add.jsx

@ -0,0 +1,283 @@
import React, { useEffect, useState } from "react";
import {
Descriptions,
Modal,
Form,
Input,
DatePicker,
Select,
Row,
Checkbox,
Col,
Button,
Space,
message,
} from "antd";
import ajax from "@/services";
import { PlusOutlined , DeleteOutlined ,MinusCircleOutlined } from '@ant-design/icons';
function Add(props) {
const [form] = Form.useForm();
const {
visible,
setShowEdit=()=>{},
record = {}
} = props;
const [couponList, setCouponList] = useState([{ key: createKey() }]);
function createKey() {
return Math.random().toString(36).substr(2, 5);
}
function createCoupon(itemKey) {
let _couponList = couponList.concat({ key: createKey() });
setCouponList(_couponList);
}
function delCoupon(itemKey) {
let _couponList = couponList.filter((item) => {
return item.key !== itemKey;
});
setCouponList(_couponList);
}
function onChange({ rule_id, num, total, itemKey }) {
let _couponList = couponList.map((item) => {
if (item.key === itemKey) {
item.num = num;
item.total = total;
item.rule_id = rule_id;
}
return item;
});
setCouponList(_couponList);
console.log(_couponList);
}
function submit() {
form
.validateFields()
.then((values) => {
console.log(values, 'submit values')
let params = {
...values,
// activity_time: values.activity_time.map((item) => {
// return item.format("YYYY-MM-DD");
// }),
rule: couponList.map((item) => {
return {
rule_id: item.rule_id,
num: item.num
};
}),
};
// ajax.handleActivityInsert(params).then((res) => {
// if (res.status === 20000) {
// message.success("");
// close();
// form.resetFields();
// }
// });
})
.catch((err) => {
console.log(err);
});
}
return (
// <Modal
// title=""
// open={visible}
// onCancel={close}
// width={1200}
// destroyOnClose
// onOk={submit}
// >
<Form form={form} initialValues={{coupon: [{key:createKey()}]}} >
<Form.Item
label="活动名称"
name="activity_name"
rules={[{ required: true }]}
>
<Input style={{ width: "20%" }} />
</Form.Item>
{/* <Form.Item label="" required>
{couponList.map((item, index) => {
return (
<CouponComponent
key={index}
index={index}
itemKey={item.key}
create={createCoupon}
delFunc={delCoupon}
onChange={onChange}
/>
);
})}
</Form.Item> */}
<Form.List name="coupon" label="关联优惠券">
{(fields, { add, remove }) => (
<>
{fields.map(({ key, name, ...restField } , index) => (
<Space
key={key}
style={{
display: 'flex',
// alignItems:"center"
}}
align="baseline"
>
{/* {
index != 0 ? <span style={{visibility:'hidden'}}>*&ensp;关联优惠券:</span> : null
} */}
<Form.Item
{...restField}
name={[name, 'rule_id']}
// noStyle = {index == 0 ? false :true}
label="关联优惠券"
rules={[{required: true,message: '请选择优惠券名称'}]}
>
<Select options={[{label: "优惠券1",value: "1",}]} style={{width: '200px'}}/>
</Form.Item>
<Form.Item
{...restField}
name={[name, 'num']}
rules={[ {required: true,message: '请输入张数', } ]}
>
<Input addonAfter="张" />
</Form.Item>
{/* <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>
添加
</Button> */}
<PlusOutlined onClick={() => add()} />
{
index != 0 ? <MinusCircleOutlined onClick={() => remove(name)} /> : null
}
</Space>
))}
</>
)}
</Form.List>
<Form.Item
label="发放群组"
name="sending_type"
rules={[{ required: true }]}
>
{/* <Input style={{ width: "20%" }} /> */}
<Select
style={{ width: "20%" }}
options={[{label: '按用户标签', value: '1'},{label: "按手机", value: "2"}]}
></Select>
</Form.Item>
<Form.Item noStyle shouldUpdate={(prevValues, curValues) => prevValues.sending_type == '1'}>
{({getFieldValue}) => {
return (
<>
{
getFieldValue('sending_type') == '1' ?
<Form.Item name="tag" rules={[{ required: true ,message: "请选择用户标签" }]} >
<Select
style={{ width: "20%" , marginLeft: "80px"}}
options={[{label: '已认证用户标签', value: '1'}]}
></Select>
</Form.Item>
: null
}
</>
);
}}
</Form.Item>
<Form.Item noStyle shouldUpdate={(prevValues, curValues) => prevValues.sending_type == '2'}>
{({getFieldValue}) => {
// console.log(formData,'formData')
return (
<>
{
getFieldValue('sending_type') == '2' ?
<Form.Item name="phones" >
<Input style={{ width: "20%" }} style={{display: "none"}} />
<div className="batch-upload">批量上传</div>
</Form.Item>
: null
}
</>
);
}}
</Form.Item>
<Form.Item
label="推送通知"
name="push_type"
rules={[{ required: true ,message: '请选择推送通知方式' }]} >
<Checkbox.Group
options={[{label: '车主端', value: '1'},{label: "短信推送", value: "2"}]}
/>
</Form.Item>
<Form.Item >
<Button type="primary" htmlType="submit" onClick={submit}>提交</Button>
<Button htmlType="button" onClick={()=>{setShowEdit(false)}}>取消</Button>
</Form.Item>
</Form>
// </Modal>
);
}
//
function CouponComponent(props) {
const { index, create, delFunc, itemKey, onChange } = props;
return (
// <Form // , , form list
// onValuesChange={(_, { rule_id, num, total }) => {
// onChange({ rule_id, num, total, itemKey });
// }}
// >
<Row gutter={[16]}>
<Col span={4}>
<Form.Item name="rule_id">
<Select
options={[
{
label: "优惠券1",
value: "1",
},
]}
/>
</Form.Item>
</Col>
{/* <Col span={3}>
<Form.Item name="num">
<Input addonAfter="张/次" />
</Form.Item>
</Col> */}
<Col span={3}>
<Form.Item name="num">
<Input addonAfter="张" />
</Form.Item>
</Col>
<Col span={3}>
<Form.Item>
{index === 0 ? (
<Button type="primary" onClick={() => create(itemKey)}>
添加
</Button>
) : (
<Button onClick={() => delFunc(itemKey)}>删除</Button>
)}
</Form.Item>
</Col>
</Row>
// </Form>
);
}
export default Add;

192
src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/index.scss

@ -3,3 +3,195 @@ $color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text);
$color-primary : var(--color-primary);
.coupon-distribute{
display: flex;
padding: 15px;
width: 100%;
height: 100%;
.coupon-distribute-search{
.search{
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: #eeeff1;
}
label{
margin:0 10px;
}
.yisa-search{
margin-top: 10px;
}
.ant-select:not(.ant-select-customize-input) .ant-select-selector{
background-color: #50586c !important;
}
.ant-select-arrow .anticon{
background-color: #50586c !important;
}
.ant-input:placeholder-shown{
background-color: #50586c !important;
}
.timePicker{
width: 350px;
margin-top: 22px;
.btnBox{
display:flex ;
.yisa-btn{
margin-left: 40px;
margin-top: 20px;
}
.root_gfkk{
margin-left: 20px;
.export-content{
width: 78px;
height: 33px;
display: flex;
align-items: center;
justify-content: center;
background: #3b97ff;
border-radius: 3px;
cursor: pointer;
color: #fff;
margin-right: 10px;
}
}
}
}
}
.coupon-distribute-result{
width: 100%;
height: 834px;
background: #505a6f;
border-radius: 20px;
margin-left: 17px;
.result{
padding: 25px;
.font{
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: left;
color: #eeeff1;
margin-bottom: 10px;
display: inline-block;
em{
color: #3aa8fe;
margin: 0 5px;
}
}
.yisa-table .ant-table-thead .ant-table-cell{
background-color: #616b83 !important;
color: #ffffff !important;
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: center;
border-right: none !important;
border-top-color: #888f9d !important;
border-color: #888f9d !important;
}
.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table, .ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{
border-top: none !important;
border-left: none !important;
}
.ant-table-tbody .ant-table-row .ant-table-cell{
background-color: #3e4557 !important;
color: #ffffff !important;
text-align: center;
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
border-right: none !important;
border-left: none !important;
border-bottom-color: #626b7e !important;
}
}
}
.edit-container{
height: 100%;
padding-top: 12px;
width: 100%;
overflow: hidden;
padding-bottom: 40px;
background-color: #505a6f;
border-top-left-radius: 40px;
padding-left: 40px;
.back-row{
margin-bottom: 20px;
span{
cursor: pointer;
color: #59b7ff;
}
}
}
.add-component{
.batch-upload{
width: 88px;
height: 34px;
line-height: 34px;
text-align: center;
border-radius: 4px;
background: linear-gradient(180deg,#3aa9ff, #59b7ff);
margin-left: 80px;
}
.ant-btn-primary{
margin-left: 40px;
margin-right: 40px;
}
.ant-form-horizontal .ant-form-item-label label{
width: 105px;
}
}
.detail-container{
height: 100%;
.detail-row{
margin-bottom: 8px;
}
.detail-title{
display: inline-block;
width: 120px;
height: 32px;
line-height: 32px;
text-align: center;
background: rgba(150,161,192,0.24);
color: #fff;
font-size: 14px;
font-weight: 400;
}
.detail-value{
display: inline-block;
width: 320px;
height: 32px;
line-height: 32px;
text-align: center;
background: #3e4557;
color: #fff;
font-size: 14px;
font-weight: 400;
}
}
}
.custom-edit-wrapper{ // 测试公共样式 如果可以 就放到公共文件里面去
.ant-select-selector{
background: #454C5E !important;
}
.ant-input{
background-color: #454C5E ;
}
.ant-select-arrow{
background-color: #454C5E !important ;
}
.ant-checkbox-inner{
background-color: #454C5E ;
}
.ant-checkbox-checked .ant-checkbox-inner{
background-color: #3aa9ff;
}
}

290
src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/loadable.jsx

@ -1,41 +1,257 @@
import React, { useState, useRef, useEffect } from "react";
// import { message, Pagination, Table, Space, Modal, } from "antd";
// import { dictionary, utils } from "@/config/common";
// import moment from 'moment'
// import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
// import ajax from "@/services"
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
// import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
//
// "distributeActivityId": "1814526898382030336",
// "activityName": "7",
// "publishAmount": 1,
// "publishGroup": 1,
// "tags": "19863728685",
// "couponPushMode": "0,1",
// "creatorId": "1778431623577298073",
// "creatorName": "",
// "createdTime": "2023-07-21 11:24:23",
// "updatedTime": "2023-07-21 11:24:23",
// "D": 0,
// "couponRuleActivities": [
// {
// "couponRuleActivityId": "1814526897934783600",
// "activityId": "1814526898382030336",
// "couponRuleId": "1814526830922149594",
// "publishAmount": 1,
// "receiveAmount": 1,
// "usedAmount": 0,
// "onceReceive": 1,
// "createdTime": "2023-07-21 11:24:22",
// "updatedTime": "2023-07-21 11:24:22",
// "couponName": "7"
// }
// ],
function CouponDistribute() {
return <div>CouponDistribute</div>
import { FormSliderPicker, ExportBtn, ResultFlowResult ,FormInput } from "@/components"
import { Select, Input, Button, Table, message, Pagination} from 'antd'
import {
pageSizeOptions
} from '@/config/character.config.js'
import moment from "moment";
import "./index.scss";
import { SearchOutlined, PlusOutlined } from '@ant-design/icons';
import Add from "./Add"
import ajax from '@/services/OperationCenter/OperationSales/index'
function CouponDistribute(props) {
// const configData = props.sysConfig["lib-deploy"] || {};
const [ajaxLoading, setAjaxLoading] = useState(false)
const [resultData, setResultData] = useState({
list: [],
total: 0,
// export_url: '',
// process_url: ""
})
const parameter = {
pn: 1,
size: Number(pageSizeOptions[0]), //
activity_name: "",
}
const [formData, setFormData] = useState(parameter)
const [lastFormData, setLastFormData] = useState(formData)
const lastFormDataRef = useRef(formData)
const [couponNameOptions, setCouponNameOptions] = useState([])
const [showEdit ,setShowEdit] = useState(false)
const [handleStatus ,setHandleStatus] = useState('1') // 1 2
const [checkData, setCheckData] = useState({})
const columns = [
{
title: '序号',
dataIndex: 'id',
key: 'id',
width: 150,
},
{
title: '活动名称',
dataIndex: 'activity_name',
key: 'activity_name',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '关联优惠券',
dataIndex: 'association_coupon',
key: 'association_coupon',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '发放类型',
dataIndex: 'sending_type',
key: 'sending_type',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '优惠券发行量',
dataIndex: 'issue_num',
key: 'issue_num',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '发放人',
dataIndex: 'send',
key: 'send',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '发放时间',
dataIndex: 'send_time',
key: 'send_time',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '操作',
key: 'action',
render: (_, record)=>{
return (
<span onClick={()=>{setShowEdit(true) ; setHandleStatus('2') ; setCheckData(record)}}>查看</span>
)
}
}
];
const getData = (data)=>{
setAjaxLoading(true)
ajax.getDistributionList(data ? data : formData).then((res)=>{
setAjaxLoading(false)
if(res.status == 20000){
setResultData(res.data)
}else{
setResultData({
list: [],
total: 0,
})
message.error(res.message)
}
})
}
//
const changePn = (pn, length) => {
if (lastFormData.page_size === length) {
setLastFormData(Object.assign({}, lastFormData, { pn: pn }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn })
getData(Object.assign({}, lastFormData, { pn: pn }))
}
}
//
const changeLength = (pn, length) => {
setFormData(Object.assign({}, formData, { pn: 1, size: length }))
setLastFormData(Object.assign({}, lastFormData, { pn: 1, size: length }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: 1, size: length })
getData(Object.assign({}, lastFormData, { pn: 1, size: length }))
}
//
const getSearchData = (data = formData) => {
getData(data)
}
//
const getResetData = () => {
setFormData({
...parameter
})
getData({ ...parameter })
}
//
const getCouponOptions = ()=>{
ajax.getCouponOptions().then(res => {
if (res.status == 20000) {
setCouponNameOptions(res.data)
} else {
message.error(res.message)
}
}).catch(err => {
console.log(err)
}).finally(()=>{
})
}
useEffect(() => {
getData()
getCouponOptions()
}, [])
return <>
<div className="coupon-distribute">
{
!showEdit ?
<>
<div className="coupon-distribute-search">
<label className="search">查询条件</label>
<FormInput
yisaLabel="活动名称"
placeholder="输入活动名称"
value={formData.activity_name}
showClose={true}
onChange={e => { setFormData({ activity_name: e.target.value }) } }
/>
<div className="timePicker yisa-search">
<div className="btnBox">
<Button type="primary" className="yisa-btn" icon={<SearchOutlined />} onClick={() => { getSearchData() }}>
查询
</Button>
<Button type="primary" className="yisa-btn" icon={<PlusOutlined />} onClick={() => { setShowEdit(true) ; setHandleStatus('1') }}>
添加
</Button>
</div>
</div>
</div>
<div className="coupon-distribute-result">
<div className="result">
<span className="font">共检索到<em>{resultData.total}</em>条结果</span>
<ResultFlowResult ajaxLoad={ajaxLoading} resultData={resultData.list ? resultData.list : []}>
<Table
bordered
className='yisa-table'
dataSource={resultData.list}
columns={columns}
pagination={false}
loading={ajaxLoading}
rowKey = {(record)=>record.id}
/>
<Pagination
className="pagination-common"
showSizeChanger
showQuickJumper
showTotal={() => `${resultData.total}`}
total={resultData.total}
current={lastFormData.pn}
pageSize={lastFormData.size}
pageSizeOptions={pageSizeOptions}
onChange={changePn}
onShowSizeChange={changeLength}
/>
</ResultFlowResult>
</div>
</div>
</>
:
<div className="edit-container custom-edit-wrapper">
<div className="back-row">
<span onClick={()=>{setShowEdit(false)}}>&lt;&ensp;返回</span> &emsp; { handleStatus == '1' ? "添加活动" : "活动详情"}
</div>
{
handleStatus == '1' ? <div className="add-component"><Add setShowEdit={setShowEdit}/></div>
:
<div className="detail-container">
<div className="detail-row">
<span className="detail-title">活动名称:&emsp;</span><span className="detail-value">{checkData.activity_name}</span>
</div>
<div className="detail-row">
<span className="detail-title">关联优惠券:&emsp;</span>
{
checkData.coupon.map((item, index)=>{
return <span key={index} className="detail-value">{item.name}/{item.num}&emsp;</span>
})
}
</div>
<div className="detail-row">
<span className="detail-title">发放群组:&emsp;</span><span className="detail-value">{checkData.sending_type == '1' ? "按用户标签" : "按手机号"}</span>
</div>
<div className="detail-row">
<span className="detail-title">推送通知:&emsp;</span><span className="detail-value">{checkData.activity_name}</span>
</div>
</div>
}
</div>
}
</div>
</>
}
export default CouponDistribute;

8
src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/index.scss

@ -81,11 +81,19 @@ $color-primary : var(--color-primary);
}
}
.coupon-info{
padding-left: 10px;
padding-top: 10px;
box-sizing: border-box;
.edit-container{
padding-top: 12px;
width: 100%;
overflow-y: auto;
padding-bottom: 40px;
border-top-left-radius: 8px;
background-color: #505a6f;
overflow: hidden;
}
.cc-form-name {
// flex: none;

8
src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/loadable.jsx

@ -21,7 +21,8 @@ function CouponRules() {
defaultValue:{}
})
const [noParams, setNoParams] = useState(true)
const [showEdit, setShowEdit] = useState(false)
// const [showEdit, setShowEdit] = useState(false)
const [showEdit, setShowEdit] = useState(true)
const [formData, setFormData] = useSetState({
name: defaultParams ? defaultParams.name : '',
@ -631,7 +632,8 @@ function CouponRules() {
yisaLabel="使用范围"
disabled={justCheck}
yisaData={[{label: '全部', value: 0},{label: '按车场', value: 1},{label: '按商户', value: 2}]}
defaultValue={ currentCouponInfo.use_scope || null }
// defaultValue={ currentCouponInfo.use_scope || null }
defaultValue={ 1 }
placeholder=""
hasUnlimited={ false }
showClose={true}
@ -698,7 +700,7 @@ function CouponRules() {
<p>确认将该优惠券下架</p>
</Modal>
<Modal title="提示" open={isResetModalOpen} onOk={()=>{}} onCancel={()=>{setIsResetModalOpen(false)}}>
<p>此操作将重置密码为qwe123, 是否继续?</p>
<p>此操作将重置密码为admin@123, 是否继续?</p>
</Modal>
</div>
</>

160
src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/index.scss

@ -3,79 +3,113 @@ $color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text);
$color-primary : var(--color-primary);
.inroad-search-container {
width: 100%;
height: 100%;
display: flex;
p{
margin-bottom: 0;
}
.components-title{
width: 100%;
.write-off-stat{
display: flex;
padding: 15px;
width: 100%;
.write-off-stat-search{
.search{
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: var(--color-text);
margin-bottom: 20px;
color: #eeeff1;
}
.tabs{
display: flex;
div{
flex: 1;
padding-bottom:10px;
text-align: center;
cursor: pointer;
border-bottom: 3px solid rgba($color: #00CCFF, $alpha: 0);
}
.active{
border-bottom: 3px solid rgba($color: #00CCFF, $alpha: 0.9);
}
label{
margin:0 10px;
}
.total-row-wrapper{
justify-content: flex-start;
align-items: center;
.export-content{
width: 68px;
height: 34px;
display: flex;
align-items: center;
justify-content: center;
background: #3b97ff;
border-radius: 4px;
cursor: pointer;
color: #fff;
margin-right: 10px;
}
.yisa-search{
margin-top: 10px;
}
.cc-result-flow .table-wrap{
height: calc(100% - 32px - 15px);
&:hover {
&::-webkit-scrollbar{
width: 8px;
height: 8px;
}
}
.ant-select:not(.ant-select-customize-input) .ant-select-selector{
background-color: #50586c !important;
}
.download{
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: center;
color: #00ccff;
.ant-select-arrow .anticon{
background-color: #50586c !important;
}
.ant-table-tbody > tr > td {
word-wrap: break-word;
word-break: break-all;
.ant-input:placeholder-shown{
background-color: #50586c !important;
}
.searchWrap{
&>div{
margin-bottom: 16px;
.timePicker{
width: 350px;
margin-top: 22px;
.btnBox{
display:flex ;
.yisa-btn{
margin-left: 40px;
margin-top: 20px;
}
.root_gfkk{
margin-left: 20px;
.export-content{
width: 78px;
height: 33px;
display: flex;
align-items: center;
justify-content: center;
background: #3b97ff;
border-radius: 3px;
cursor: pointer;
color: #fff;
margin-right: 10px;
}
}
}
}
.bottomBox{
display: flex;
justify-content: space-between;
}
.write-off-stat-result{
width: 100%;
height: 834px;
background: #505a6f;
border-radius: 20px;
margin-left: 17px;
.result{
padding: 25px;
.font{
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: left;
color: #eeeff1;
margin-bottom: 10px;
display: inline-block;
em{
color: #3aa8fe;
margin: 0 5px;
}
}
.yisa-table .ant-table-thead .ant-table-cell{
background-color: #616b83 !important;
color: #ffffff !important;
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: center;
border-right: none !important;
border-top-color: #888f9d !important;
border-color: #888f9d !important;
}
.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table, .ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{
border-top: none !important;
border-left: none !important;
}
.ant-table-tbody .ant-table-row .ant-table-cell{
background-color: #3e4557 !important;
color: #ffffff !important;
text-align: center;
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
border-right: none !important;
border-left: none !important;
border-bottom-color: #626b7e !important;
}
}
}
}
}

284
src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/loadable.jsx

@ -1,41 +1,48 @@
import React, { useState, useRef, useEffect } from "react";
import { message, Pagination, Table, Space, Modal, } from "antd";
import { dictionary, utils } from "@/config/common";
// import moment from 'moment'
import { useSetState, useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
// import ajax from "@/services"
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
// import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
import ajax from '@/services/OperationCenter/OperationSales/index'
import { FormInput, FormSelect, ResultFlow } from "@/components"
import { FormSliderPicker, ExportBtn, ResultFlowResult } from "@/components"
import { Select, Input, Button, Table, message, Pagination } from 'antd'
import {
pageSizeOptions
} from '@/config/character.config.js'
import moment from "moment";
import "./index.scss";
import { SearchOutlined, DeleteOutlined } from '@ant-design/icons';
// import ajax from '@/services'
import ajax from '@/services/OperationCenter/OperationSales/index'
let array = []
function WriteOffStat() {
const [resultData, setResultData] = useState([])
const [loading, setLoading] = useState(false)
const [defaultParams, setDefaultParams] = useSessionStorageState('writeOffStat_formData',{
defaultValue:{}
})
const [pageData, setPageData] = useSetState({ //
pn: defaultParams?.pn || 1,
page_size:defaultParams?.page_size || 20,
})
const [formData, setFormData] = useSetState({
name: defaultParams ? defaultParams.name : '',
status: defaultParams ? defaultParams.status : '',
coupon_type: defaultParams ? defaultParams.coupon_type : '',
function WriteOffStat(props) {
// const configData = props.sysConfig["lib-deploy"] || {};
const [ajaxLoading, setAjaxLoading] = useState(false)
const [resultData, setResultData] = useState({
list: [],
total: 0,
// export_url: '',
// process_url: ""
})
const getCountList = ()=>{
ajax.getCountList().then((res)=>{
if(res.status == 20000){
setResultData(res.data)
}else{
const parameter = {
start_time: moment().format('YYYY-MM-DD HH:mm:ss'),
end_time: moment().format("YYYY-MM-DD 23:59:59"),
pn: 1,
size: Number(pageSizeOptions[0]), //
name: "",
type: ""
}
const [formData, setFormData] = useState(parameter)
const [lastFormData, setLastFormData] = useState(formData)
const lastFormDataRef = useRef(formData)
}
const [couponNameOptions, setCouponNameOptions] = useState([])
//
const onHandleDateChange = (v) => {
setFormData({
...formData,
start_time: v.startDateTime,
end_time: v.endDateTime
})
}
const columns = [
{
title: '序号',
@ -85,79 +92,162 @@ function WriteOffStat() {
}
];
const onShowSizeChange = (current, pageSize) => {
let pn
if (pageData.page_size == pageSize) {
pn = current
} else {
pn = 1
const getData = (data)=>{
setAjaxLoading(true)
ajax.getCountList(data ? data : formData).then((res)=>{
setAjaxLoading(false)
if(res.status == 20000){
setResultData(res.data)
}else{
setResultData({
list: [],
total: 0,
})
message.error(res.message)
}
})
}
//
const changePn = (pn, length) => {
if (lastFormData.page_size === length) {
setLastFormData(Object.assign({}, lastFormData, { pn: pn }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn })
getData(Object.assign({}, lastFormData, { pn: pn }))
}
}
//
const changeLength = (pn, length) => {
setFormData(Object.assign({}, formData, { pn: 1, size: length }))
setLastFormData(Object.assign({}, lastFormData, { pn: 1, size: length }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: 1, size: length })
getData(Object.assign({}, lastFormData, { pn: 1, size: length }))
}
//
const getSearchData = (data = formData) => {
getData(data)
}
//
const getResetData = () => {
setFormData({
...parameter
})
getData({ ...parameter })
}
//
const exportData=()=>{
let data={
...formData
}
setPageData({
pn: pn,
page_size: pageSize,
ajax.handleOffExport(data).then(res => {
window.open(res.data.url)
})
}
useEffect(()=>{
getCountList()
},[])
return (
<>
<div className="inroad-search-container off-detail">
<div className="left-search">
<div className="title">查询条件</div>
<FormInput
yisaLabel="优惠券名称"
placeholder="输入优惠券名称"
value="aaa"
showClose={true}
onChange={e => { } }
const getCouponOptions = ()=>{
ajax.getCouponOptions().then((res)=>{
if(res.status == 20000){
setCouponNameOptions(res.data)
}else{
}
})
}
useEffect(() => {
getCouponOptions()
getData()
}, [])
return <>
<div className="write-off-stat">
<div className="write-off-stat-search">
<label className="search">查询条件</label>
<div className="yisa-search">
{/* <label>优惠券名称</label> */}
<label>名称</label>
<Select
style={{ width: 270, marginLeft: 30 }}
allowClear
placeholder="请选择"
value={formData.name}
options={couponNameOptions}
onChange={(e)=>{setFormData({...formData, name: e})}}
/>
</div>
<div className="yisa-search">
{/* <label>优惠券类型</label> */}
<label>类型</label>
<Select
style={{ width: 270, marginLeft: 30 }}
allowClear
placeholder="请选择"
value={formData.type}
options={sysConfig.coupon}
onChange={(e)=>{setFormData({...formData, type: e})}}
/>
</div>
<div className="right-list">
<ResultFlow
hasLoad={true}
loading={loading}
resultData={resultData.list}
message={"暂无数据"}
>
<div className="total-row-wrapper">
{/* <ExportBtn {...exportParams} ><div className="export-content">导出</div></ExportBtn> */}
<span className="number-wrapper">
<span className="letter">共查询到</span>
<span className="total-number"> {resultData.total} </span>
<span className="letter">条结果</span>
</span>
</div>
<div className="table-wrap">
<Table
rowKey='id'
columns={columns}
className="yisa-table"
dataSource={resultData.list}
loading={loading}
pagination={false}
></Table>
</div>
<div>
<Pagination
className="pagination-common"
showSizeChanger={true}
showQuickJumper={true}
// showTotal={() => ` ${total_records} `}
total={resultData.total}
current={pageData.pn}
pageSize={pageData.page_size}
pageSizeOptions={dictionary?.pageSizeOptions}
onChange={onShowSizeChange}
onShowSizeChange={onShowSizeChange}
/>
</div>
</ResultFlow>
<div className="timePicker yisa-search">
<FormSliderPicker
yisaLabel='时间范围'
defaultStartDateTime={moment(formData.start_time)}
defaultEndDateTime={moment(formData.end_time)}
yisaOnChange={onHandleDateChange}
showQuickMenu = {false}
// dropdownData={[
// { text: "", value: 1 },
// { text: "30", value: -29 },
// { text: "90", value: -89 },
// { text: "180", value: -179 },
// ]}
/>
<div className="btnBox">
<Button type="primary" className="yisa-btn" icon={<SearchOutlined />} onClick={() => { getSearchData() }}>
搜索
</Button>
<Button type="primary" className="yisa-btn" icon={<DeleteOutlined />} onClick={() => { getResetData() }}>
清空
</Button>
<Button type="primary" className="yisa-btn" onClick={() => { exportData() }}>
导出
</Button>
</div>
</div>
</div>
<div className="write-off-stat-result">
<div className="result">
<span className="font">共检索到<em>{resultData.total}</em>条结果</span>
<ResultFlowResult ajaxLoad={ajaxLoading} resultData={resultData.list ? resultData.list : []}>
<Table
bordered
className='yisa-table'
dataSource={resultData.list}
columns={columns}
pagination={false}
loading={ajaxLoading}
/>
<Pagination
className="pagination-common"
showSizeChanger
showQuickJumper
showTotal={() => `${resultData.total}`}
total={resultData.total}
current={lastFormData.pn}
pageSize={lastFormData.size}
pageSizeOptions={pageSizeOptions}
onChange={changePn}
onShowSizeChange={changeLength}
/>
</ResultFlowResult>
</div>
</div>
</>
)
}
</div>
</>
}
export default WriteOffStat;

163
src/pages/OperationCenter/OperationSales/CouponMgm/WriteOffStat/loadable_bk.jsx

@ -0,0 +1,163 @@
import React, { useState, useRef, useEffect } from "react";
import { message, Pagination, Table, Space, Modal, } from "antd";
import { dictionary, utils } from "@/config/common";
// import moment from 'moment'
import { useSetState, useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
// import ajax from "@/services"
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
// import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
import ajax from '@/services/OperationCenter/OperationSales/index'
import { FormInput, FormSelect, ResultFlow } from "@/components"
import "./index.scss";
function WriteOffStat() {
const [resultData, setResultData] = useState([])
const [loading, setLoading] = useState(false)
const [defaultParams, setDefaultParams] = useSessionStorageState('writeOffStat_formData',{
defaultValue:{}
})
const [pageData, setPageData] = useSetState({ //
pn: defaultParams?.pn || 1,
page_size:defaultParams?.page_size || 20,
})
const [formData, setFormData] = useSetState({
name: defaultParams ? defaultParams.name : '',
status: defaultParams ? defaultParams.status : '',
coupon_type: defaultParams ? defaultParams.coupon_type : '',
})
const getCountList = ()=>{
ajax.getCountList().then((res)=>{
if(res.status == 20000){
setResultData(res.data)
}else{
}
})
}
const columns = [
{
title: '序号',
dataIndex: 'id',
key: 'id',
width: 150,
},
{
title: '优惠券名称',
dataIndex: 'name',
key: 'name',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '优惠券类型',
dataIndex: 'type',
key: 'type',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '领取量',
dataIndex: 'get_num',
key: 'get_num',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '使用量',
dataIndex: 'use_num',
key: 'use_num',
// width: 150,
ellipsis: true,
align: 'center'
},
{
title: '核销总额',
dataIndex: 'total',
key: 'total',
// width: 150,
ellipsis: true,
align: 'center'
}
];
const onShowSizeChange = (current, pageSize) => {
let pn
if (pageData.page_size == pageSize) {
pn = current
} else {
pn = 1
}
setPageData({
pn: pn,
page_size: pageSize,
})
}
useEffect(()=>{
getCountList()
},[])
return (
<>
<div className="inroad-search-container off-detail">
<div className="left-search">
<div className="title">查询条件</div>
<FormInput
yisaLabel="优惠券名称"
placeholder="输入优惠券名称"
value="aaa"
showClose={true}
onChange={e => { } }
/>
</div>
<div className="right-list">
<ResultFlow
hasLoad={true}
loading={loading}
resultData={resultData.list}
message={"暂无数据"}
>
<div className="total-row-wrapper">
{/* <ExportBtn {...exportParams} ><div className="export-content">导出</div></ExportBtn> */}
<span className="number-wrapper">
<span className="letter">共查询到</span>
<span className="total-number"> {resultData.total} </span>
<span className="letter">条结果</span>
</span>
</div>
<div className="table-wrap">
<Table
rowKey='id'
columns={columns}
className="yisa-table"
dataSource={resultData.list}
loading={loading}
pagination={false}
></Table>
</div>
<div>
<Pagination
className="pagination-common"
showSizeChanger={true}
showQuickJumper={true}
// showTotal={() => ` ${total_records} `}
total={resultData.total}
current={pageData.pn}
pageSize={pageData.page_size}
pageSizeOptions={dictionary?.pageSizeOptions}
onChange={onShowSizeChange}
onShowSizeChange={onShowSizeChange}
/>
</div>
</ResultFlow>
</div>
</div>
</>
)
}
export default WriteOffStat;
Loading…
Cancel
Save