Browse Source

fix; 优惠券管理问题单处理

tags/PMS_Frontend_v1.0.6-develop
chenglb 1 year ago
parent
commit
9070cf755d
  1. 3
      src/components/form/FormCheckBox/index.scss
  2. 3
      src/components/form/FormRadio/index.scss
  3. 13
      src/config/utils.js
  4. 38
      src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/Add.jsx
  5. 15
      src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/Detail.jsx
  6. 51
      src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/TemplateConfig.jsx
  7. 2
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/Add.jsx
  8. 2
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponDistribute/loadable.jsx
  9. 3
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/index.scss
  10. 45
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/loadable.jsx

3
src/components/form/FormCheckBox/index.scss

@ -19,4 +19,7 @@
width: auto;
}
}
.required{
color: red;
}
}

3
src/components/form/FormRadio/index.scss

@ -18,4 +18,7 @@
width: auto;
}
}
.required{
color: red;
}
}

13
src/config/utils.js

@ -383,15 +383,24 @@ const utils = {
let date = new Date(), dateBefore = new Date(date.getTime() - limit * 86400* 1000)
let str = date.getFullYear()+"-" + ('0' + (date.getMonth() + 1)).slice(-2) +"-"+ ("0"+ date.getDate()).slice(-2),
strBefore = dateBefore.getFullYear() +"-"+ ('0' + (dateBefore.getMonth() + 1)).slice(-2) +"-"+ ("0"+ dateBefore.getDate()).slice(-2);
if(limit > 0){
return strBefore + ',' + str
}
return str + ',' + strBefore
},
createTimeStr: (minusOrAdd)=>{
let num = Number.isInteger(minusOrAdd) ? minusOrAdd : 0;
let date = new Date(new Date().getTime() - num * 86400* 1000)
let str = date.getFullYear()+"-" + ('0' + (date.getMonth() + 1)).slice(-2) +"-"+ ("0"+ date.getDate()).slice(-2) + ' ' +
('0' + (date.getHours() + 1)).slice(-2) + ':' + ('0' + (date.getMinutes() + 1)).slice(-2) + ":" + ('0' + (date.getSeconds() + 1)).slice(-2)
('0' + date.getHours()).slice(-2) + ':' + ('0' +date.getMinutes() ).slice(-2) + ":" + ('0' + date.getSeconds()).slice(-2)
return str
}
},
createDateStr: (minusOrAdd)=>{
let num = Number.isInteger(minusOrAdd) ? minusOrAdd : 0;
let date = new Date(new Date().getTime() - num * 86400* 1000)
let str = date.getFullYear()+"-" + ('0' + (date.getMonth() + 1)).slice(-2) +"-"+ ("0"+ date.getDate()).slice(-2)
return str
},
}
export default utils

38
src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/Add.jsx

@ -28,7 +28,7 @@ function Add(props) {
}else{
setCouponList([{key:createKey() }])
}
},[record.coupon_list])
},[record])
useEffect(()=>{
let temp = {...record}
@ -43,10 +43,10 @@ function Add(props) {
if(record.start_time && record.end_time){
temp.activity_time = [moment(record.start_time ), moment(record.end_time )]
}else{
temp.activity_time = [moment(utils.createTimeStr() ), moment(utils.createTimeStr() )]
let temps = utils.createTimeStr(), tempe = utils.createTimeStr();
temp.activity_time = [moment(temps ), moment(tempe )]
}
form.setFieldsValue(temp)
// },[record.start_time, record.end_time])
},[record])
function createKey() {
@ -83,16 +83,23 @@ function Add(props) {
.validateFields()
.then((values) => {
//
let flag = true, temparr = [];
let emptyflag = true, compareFlag = true, temparr = [];
couponList.map(item=>{
if(!item.num || !item.total || !item.rule_id){
flag = false
emptyflag = false
}
if(item.num > item.total){
compareFlag = false
}
if(!temparr.includes(item.rule_id)){
temparr.push(item.rule_id)
}
})
if(!flag){
if(!compareFlag){
message.error('每一种优惠券, 每次领取张数不能大于该优惠券总数')
return
}
if(!emptyflag){
message.error('优惠券数据设置不完整')
return
}
@ -104,9 +111,18 @@ function Add(props) {
message.error('最多可关联10种优惠券类型')
return
}
if(values.everybody > values.everybody_total){
message.error('每人每次可领取数不能大于每人可领取总数')
return
}
let temp_time_range = values.activity_time.map((item) => {
return item.format("YYYY-MM-DD HH:mm:ss");
})
if(new Date().getTime() > new Date(temp_time_range[0]).getTime() || new Date().toJSON().split('T')[0] == new Date(temp_time_range[0]).toJSON().split('T')[0]){
message.error('活动时间只能选择当天以后的时间段')
return
}
// delete values.activity_time;
let params = {
...values,
@ -174,9 +190,13 @@ function Add(props) {
// value={[
// moment(record.start_time ? record.start_time : utils.createTimeStr()),
// moment(record.end_time ? record.end_time : utils.createTimeStr())]}
defaultValue={[
defaultPickerValue ={[
moment(record.start_time ? record.start_time : utils.createTimeStr()),
moment(record.end_time ? record.end_time : utils.createTimeStr())]}
// defaultValue={[
// moment(record.start_time ? record.start_time : utils.createTimeStr()),
// moment(record.end_time ? record.end_time : utils.createTimeStr())]}
/>
</Form.Item>
<Form.Item label="关联优惠券" required>
@ -199,10 +219,10 @@ function Add(props) {
</Form.Item> */}
<Form.Item label="活动期间每人每日可领取" rules={[{ required: true }]} name="everybody">
<InputNumber controls={false} addonAfter="次" style={{ width: "10%" }} />
<InputNumber min={1} max={9999} precision={0} controls={false} addonAfter="次" style={{ width: "10%" }} />
</Form.Item>
<Form.Item label="活动期间每人总共可领取" rules={[{ required: true }]} name="everybody_total">
<InputNumber controls={false} addonAfter="次" style={{ width: "10%" }} />
<InputNumber min={1} max={9999} precision={0} controls={false} addonAfter="次" style={{ width: "10%" }} />
</Form.Item>
</Form>
</Modal>

15
src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/Detail.jsx

@ -4,20 +4,15 @@ import ajax from "@/services";
function index(props) {
const { visible, close, record = {} } = props;
const [coupon, setCoupon] = useState("");
function getDetail(id) {
ajax.handleActivityView({ id }).then((res) => {
if (res.status === 20000) {
const { list } = res.data;
let _coupon = list.map((item) => {
useEffect(() => {
if(record.coupon_list?.length){
let _coupon = record.coupon_list.map((item) => {
return `${item.name}-${item.num}`;
});
setCoupon(_coupon.join(","));
}
});
}
useEffect(() => {
// getDetail(record.id);
}, []);
}, [record]);
return (
<Modal open={visible} onCancel={close} width={1200} footer={<Button onClick={close}>返回</Button>} destroyOnClose>
<Descriptions title="活动详情">

51
src/pages/OperationCenter/OperationSales/CouponMgm/ActivitySpecificTopic/TemplateConfig.jsx

@ -15,7 +15,7 @@ function TemplateConfig(props) {
// background : "#ffffff",
// text_color: "red",
description: record.description,
is_share: record.is_share || '1',
is_share: record.is_share,
title: record.title,
copywriting: record.copywriting,
pic: record.pic
@ -70,18 +70,27 @@ function TemplateConfig(props) {
// message.error('')
// return
// }
if(formData.description == ''){
if(!formData.description){
message.error('请输入活动说明')
return
}else if(formData.description.length > 200){
message.error('活动说明字数不能超过200字')
return
}
if(formData.is_share == '1'){ //
if(formData.title == ''){
message.error('请输入分享标题')
return
}else if(formData.title.trim().length > 30){
message.error('分享标题字数不能超过30字')
return
}
if(formData.copywriting == ''){
message.error('请输入分享文案')
return
}else if(formData.copywriting.trim().length > 50){
message.error('分享文案字数不能超过50字')
return
}
if(formData.pic == ''){ // todo
message.error('请上传分享图片')
@ -117,36 +126,6 @@ function TemplateConfig(props) {
<div className="template-content-wrapper">
<div className="left-wrapper">
<div className="big-title">模板配置</div>
{/* <div className="form-row">
<div className="title">活动头图</div>
<div>
<Upload
name="avatar"
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
// action="http://10.10.128.65:3001/mock/11/v1/controlalarm/upload_image"
action={`${baseApi}/v1/controlalarm/upload_image`}
// beforeUpload={beforeUpload}
onChange={handleChange}
>
{formData.activity_avatar ? (
<img src={formData.activity_avatar} alt="avatar" style={{ width: '100%', }} />
) : (
uploadButton
)}
</Upload>
</div>
</div>
<div className="form-row">
<div className="title">背景颜色</div>
<div><input type="color" value={formData.background} style={{width: '50px'}} onChange={(e)=>{setFormData({...formData, background: e.target.value})}} /></div>
</div>
<div className="form-row">
<div className="title">文字颜色</div>
<div><input type="color" value={formData.text_color} style={{width: '50px'}} onChange={(e)=>{setFormData({...formData, text_color: e.target.value})}} /></div>
</div> */}
<div className="form-row">
<div className="title">活动说明</div>
<div style={{width: "300px"}}>
@ -183,7 +162,13 @@ function TemplateConfig(props) {
showUploadList={false}
// action="http://10.10.128.65:3001/mock/11/v1/controlalarm/upload_image"
action={`${baseApi}/api/com/common/file_upload`}
// beforeUpload={beforeUpload}
beforeUpload={(file)=>{
const isPNG = file.type === 'image/png' || file.type === 'image/jpg' || file.type === 'image/jpeg';
if (!isPNG) {
message.error(`仅支持上传图片`);
}
return isPNG || Upload.LIST_IGNORE;
}}
onChange={handleShareChange}
>
{formData.pic ? (

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

@ -126,7 +126,7 @@ function Add(props) {
}
let params = {
...values,
push_type: values.push_type.join(','),
push_type: values.push_type.length == 2 ? '3' : values.push_type.join(','),
// activity_time: values.activity_time.map((item) => {
// return item.format("YYYY-MM-DD");
// }),

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

@ -253,7 +253,7 @@ function CouponDistribute(props) {
<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>
<span className="detail-title">推送通知:&emsp;</span><span className="detail-value">{checkData.push_type_zhname}</span>
</div>
</div>
}

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

@ -94,6 +94,9 @@ $color-primary : var(--color-primary);
border-top-left-radius: 8px;
background-color: #505a6f;
overflow: auto;
.ant-picker-range{
width: 340px !important;
}
}
.custom-time-setting{
margin-bottom: 10px;

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

@ -26,9 +26,9 @@ function CouponRules() {
const [showEdit, setShowEdit] = useState(false)
const [formData, setFormData] = useSetState({
name: defaultParams ? defaultParams.name : '',
status: defaultParams ? defaultParams.status : '0',
coupon_type: defaultParams ? defaultParams.coupon_type : '0',
name: defaultParams.name ? defaultParams.name : '',
status: defaultParams.status ? defaultParams.status : '0',
coupon_type: defaultParams.coupon_type != undefined ? defaultParams.coupon_type : 0,
})
const [operatorOptions, setOperatorOptions] = useState([]) //
const [departOptions, setDepartOptions] = useState([])
@ -257,7 +257,7 @@ function CouponRules() {
const addCoupon = ()=>{
setShowEdit(true)
setCurrentCouponInfo({type: 1})
setCurrentCouponInfo({type: 1, mode: 1, partner: '青岛'})
}
const onTransferChange = (nextTargetKeys, direction, moveKeys) => {
@ -383,7 +383,7 @@ function CouponRules() {
}
}else if(currentCouponInfo.type == 2){ //
if(!currentCouponInfo.value){
message.error('优惠券面值不能为空')
message.error('优惠券面值不能为空或者0')
return false
}
if(!currentCouponInfo.value_condition){
@ -400,10 +400,17 @@ function CouponRules() {
message.error('欠费时长不能为空')
return false
}
if(currentCouponInfo.effective_date == 1 && currentCouponInfo.effctive_value?.length == 1){
if(currentCouponInfo.effective_date == 1){
if(currentCouponInfo.effctive_value?.length == 1){
message.error('固定日期不能为空')
return false
}
if(new Date().getTime() - new Date(currentCouponInfo.effctive_value.split(',')[0]).getTime() > 24*3600*1000){
message.error('固定日期只能选择当前时间以后的时间段')
return false
}
}
if(currentCouponInfo.use_scope == 1 && currentCouponInfo.use_content == ''){
message.error('路段不能为空')
@ -444,7 +451,7 @@ function CouponRules() {
useEffect(()=>{
if(currentCouponInfo.effective_date == 1 ){
if(!currentCouponInfo.effctive_value){
setCurrentCouponInfo({...currentCouponInfo, effctive_value: utils.createTimeRange(180) })
setCurrentCouponInfo({...currentCouponInfo, effctive_value: utils.createTimeRange(-180) })
}
}
if(currentCouponInfo.effective_date == 2 ){
@ -513,7 +520,7 @@ function CouponRules() {
<FormSelect
yisaLabel="优惠券类型"
yisaData={sysConfig.coupon}
defaultValue={ formData.coupon_type || null }
defaultValue={ formData.coupon_type }
placeholder=""
hasUnlimited={ false }
showClose={true}
@ -712,6 +719,8 @@ function CouponRules() {
yisaLabel="优惠券名称"
isRequired={true}
placeholder=""
showCount={true}
maxLength={20}
disabled={justCheck}
value={currentCouponInfo.name}
showClose={true}
@ -719,16 +728,24 @@ function CouponRules() {
/>
<FormRadio
yisaLabel="模式"
required={true}
isRequired={true}
disabled={justCheck}
value={currentCouponInfo.mode}
options={[{value: 1, label: '自有券'},{value: 2, label: '合作券'}]}
onChange={e=>{setCurrentCouponInfo({...currentCouponInfo, mode: e.target.value});}}
onChange={e=>{
if(e.target.value == 1){
setCurrentCouponInfo({...currentCouponInfo, mode: 1, partner: '青岛'});
} else{
setCurrentCouponInfo({...currentCouponInfo, mode: 2, partner: ''});
}
}}
/>
<FormInput
yisaLabel="合作方"
isRequired={true}
placeholder=""
showCount={true}
maxLength={20}
value={currentCouponInfo.partner}
disabled={justCheck | currentCouponInfo.mode == 1 }
showClose={true}
@ -848,12 +865,12 @@ function CouponRules() {
yisaLabel=" "
disabled={justCheck}
isRequired={true}
format="YYYY-MM-DD"
limit={180}
format="YYYY-MM-DD HH:mm:ss"
limit={720}
labelPosition="left"
showTime={false}
// showTime={true}
onChange={(e)=>{setCurrentCouponInfo({...currentCouponInfo, effctive_value: e.join(',')})}}
value={currentCouponInfo.effctive_value ? currentCouponInfo.effctive_value : utils.createTimeRange(180)}
value={currentCouponInfo.effctive_value ? currentCouponInfo.effctive_value : utils.createTimeRange(-180)}
/> :
currentCouponInfo.effective_date == 2?
<div className="custom-time-setting">

Loading…
Cancel
Save