
21 changed files with 714 additions and 52 deletions
@ -0,0 +1,6 @@ |
|||
1.优惠券的批量领取 |
|||
2.购买商品时如果有符合使用的优惠券,自动选取优惠券 |
|||
3.增加订单归集统计页面,对于商品待发货、已发货、已完成订单统计列表。 |
|||
(1)全部提货点的商品订单统计。 |
|||
(2)各个提货点的商品订单统计。 |
|||
(3)各个提货点对应到人的订单统计。 |
@ -0,0 +1,40 @@ |
|||
管理后台,"商品管理"-"商品分类"页面。 |
|||
(已修改)列表中"导航栏"、"是否显示"、"是否首页显示"这些设置的作用是什么?如果没有用就先隐藏掉("是否显示"这个应该是控制是否在APP端显示该类别及其下级类别或该类别的商品)。 |
|||
(已修改)"设置"这一列中"转移商品"的作用?如果没有用先隐藏这个按钮。 |
|||
新增二级分类,如果有同名的分类名称,数据会出错,需要加限定条件或修改增加保存的逻辑,不能出错。后台增加了类别,手机端是否可以实时看到新增或修改的分类。(经测试没发现增加类别出错的情况,增加同名的也可以正常显示。目前增加了限制,不允许有相同的类别名称) |
|||
管理后台编辑商品后,在手机端查看该商品信息出错。(经测试未出现该问题,对之前出现该问题的数据进行分析,应该是最早录入的商品信息有附加的属性,现在的编辑页面简化了,造成属性值丢失出现的问题。目前新增商品不会再出现该问题) |
|||
(已修改)手机端优惠券金额显示不正确,应该是2位小数。 |
|||
|
|||
(已修改)使用优惠券支付时,付款金额显示不正确。 |
|||
|
|||
|
|||
(已修改)优惠券限领数量无效。限领2张,只能领取1张。 |
|||
(已修改)管理后台,新增优惠券。优惠券类型的选择和适用平台的选择都去掉,并且默认类型为"全场赠券",默认适用平台为"全平台"。 |
|||
(已修改)手机端注册问题较多,注册成功提示"该用户已经存在",已有手机号再次注册也可以成功。注册成功提示密码不正确无法登录等各种情况都有。这一部分需要详细、全面的认真进行一次测试,保证流程以及提示信息正确。 |
|||
(已修改)管理后台,"订单管理"-"发货列表"页面的作用不明确,先屏蔽掉。 |
|||
(已修改)管理后台,"运营管理"-"广告列表"页面,搜索功能无效,去掉列表中"广告位置"、"点击次数"、"生成订单"这些列。添加广告不选广告位置(默认设置为Android首页轮播) |
|||
(已修改)社区管理-社区列表页面,查询功能无效。取货点页面查询功能无效,取货点页面屏蔽"导出"、"导入"按钮。取货点页面列表的表名不正确。 |
|||
(已修改)APP端,已经过期的优惠券应该归到已失效里边。 |
|||
手机端领取优惠券是否可以一键全部领取(该需求待讨论) |
|||
待支付的订单取消后优惠券不回退。用户使用优惠券下单,未支付或支付失败的情况,该订单还有效,处于待支付状态,APP端可以继续完成支付操作。在待支付状态用户可以主动取消订单,或者超过支付等待时间(20分钟)订单自动失效,订单失效需要将未使用的优惠券回退。 |
|||
系统增加退单流程。会员下单24小时内可退货,退货退款原路返回(退回支付宝或微信,需要调用支付宝或微信的退款接口)。24小时后,自动设置为已发货状态(待收货),不可以退货退款。在管理后台订单列表页面,"待发货"这一栏中,点击"订单发货"按钮,订单状态变为"待收货"状态,也不可以退货退款。 |
|||
收货(提货)的流程和操作。在管理后台订单列表页面的"待收货"列表,增加"已收货"按钮,将订单状态改为交易完成。在APP端用户可以点击"收货"按钮,同样完成收货操作。后台记录收货时间以及是客户操作还是后台人员操作。 |
|||
在订单列表,可以通过下单日期时间段、取货点、分类(订单状态)、用户信息等进行过滤查询,查询结果需要能够导出到Excel。导出字段包括:下单日期,手机号,用户名,商品名称,价格,数量,自提点,订单状态等。 |
|||
增加订单归集统计页面,对于商品待发货、已发货、已完成订单统计列表。 |
|||
(1)全部提货点的商品订单统计。 |
|||
(2)各个提货点的商品订单统计。 |
|||
(3)各个提货点对应到人的订单统计。 |
|||
后台管理,发货界面加一个批量发货(该需求待讨论) |
|||
完整的购买、下单、收货流程 |
|||
用户在APP端浏览商品,选择下单,生成订单(订单状态为待付款)。下单前惠农会员可以先领优惠券。 |
|||
会员通过微信或支付宝付款成功(订单状态为待发货)。会员取消付款或订单超过20分钟未付款,订单设置为已关闭状态,优惠券退回。待发货24小时之内如果订单状态没改变(还没发货),用户可以取消订单,停止发货,款项原路退回,优惠券失效,订单为已关闭状态。 |
|||
工作人员在后台待发货列表点击"发货",或者待发货状态超过24小时,订单状态改为"待收货",不可以再退货。后台发送消息通知:7日内到取货点取货。 |
|||
订单在待收货状态,用户可以到取货点取货,工作人员根据手机号查询对应订单及货物交付给用户,用户可以在APP端点击"取货"完成取货操作或者工作人员在待收货列表点击"已取货"按钮状对应订单设置为已经取货状态,交易完成。在待收货列表,可以针对未取货的订单用户发送消息通知或电话联系。 |
|||
消息通知,增加消息通知设置页面,设定日期时间、通知标题、通知内容。后台程序在设定的日期时间将通知内容发送给全部用户。现在的消息通知功能为系统发送信息到用户手机APP信息界面,用户在信息界面查看消息通知内容。 |
|||
|
|||
2023-03-18 |
|||
有两个确定的需求需要更新一下,其他的还要跟业务再讨论 |
|||
1.优惠券的批量领取 |
|||
2.购买商品时如果有符合使用的优惠券,自动选取优惠券 |
|||
|
|||
|
@ -0,0 +1,78 @@ |
|||
package com.zscat.mallplus.ums.controller; |
|||
|
|||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|||
import com.baomidou.mybatisplus.core.metadata.IPage; |
|||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|||
import com.zscat.mallplus.annotation.SysLog; |
|||
import com.zscat.mallplus.ums.entity.SysMessageTask; |
|||
import com.zscat.mallplus.ums.entity.UmsMember; |
|||
import com.zscat.mallplus.ums.service.IUmsMemberService; |
|||
import com.zscat.mallplus.ums.service.SysMessageTaskService; |
|||
import com.zscat.mallplus.util.StringUtils; |
|||
import com.zscat.mallplus.utils.CommonResult; |
|||
import com.zscat.mallplus.utils.ValidatorUtils; |
|||
import io.swagger.annotations.ApiOperation; |
|||
import io.swagger.annotations.ApiParam; |
|||
import org.slf4j.ILoggerFactory; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.security.access.prepost.PreAuthorize; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
@RestController("com.zscat.mallplus.ums.controller.SysMessageTaskRest") |
|||
@RequestMapping("/ums/sysMessageTask") |
|||
public class SysMessageTaskRest { |
|||
|
|||
private static final Logger L = LoggerFactory.getLogger(SysMessageTaskRest.class); |
|||
@Resource |
|||
private SysMessageTaskService sysMessageTaskService; |
|||
|
|||
@GetMapping(value = "/list") |
|||
public Object listByPage( |
|||
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, |
|||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize |
|||
) { |
|||
try { |
|||
QueryWrapper<SysMessageTask> qw = new QueryWrapper<>(); |
|||
qw.orderByDesc("sendtime"); |
|||
IPage<SysMessageTask> page = sysMessageTaskService.page(new Page<SysMessageTask>(pageNum, pageSize), qw); |
|||
return new CommonResult().success(page); |
|||
} catch (Exception e) { |
|||
L.error("根据条件查询所有会员表列表:%s", e.getMessage(), e); |
|||
} |
|||
return new CommonResult().failed(); |
|||
} |
|||
|
|||
@PostMapping(value = "/create") |
|||
public Object saveTask(@RequestBody SysMessageTask entity) { |
|||
try { |
|||
entity.setId(null); |
|||
if (sysMessageTaskService.save(entity)) { |
|||
return new CommonResult().success(); |
|||
} |
|||
} catch (Exception e) { |
|||
L.error("保存定时消息表:%s", e.getMessage(), e); |
|||
return new CommonResult().failed(); |
|||
} |
|||
return new CommonResult().failed(); |
|||
} |
|||
|
|||
@GetMapping(value = "/delete/{id}") |
|||
public Object deleteUmsMember(@PathVariable Integer id) { |
|||
try { |
|||
System.out.println("KKKKKKKKK: "+id); |
|||
if (ValidatorUtils.empty(id)) { |
|||
return new CommonResult().paramFailed("定时消息表id"); |
|||
} |
|||
if (sysMessageTaskService.removeById(id)) { |
|||
return new CommonResult().success(); |
|||
} |
|||
} catch (Exception e) { |
|||
L.error("删除定时消息表:%s", e.getMessage(), e); |
|||
return new CommonResult().failed(); |
|||
} |
|||
return new CommonResult().failed(); |
|||
} |
|||
} |
@ -0,0 +1,10 @@ |
|||
package com.zscat.mallplus.ums.service; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|||
import com.zscat.mallplus.ums.entity.SysMessageTask; |
|||
import com.zscat.mallplus.ums.mapper.SysMessageTaskMapper; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
@Service |
|||
public class SysMessageTaskService extends ServiceImpl<SysMessageTaskMapper, SysMessageTask> { |
|||
} |
@ -0,0 +1,90 @@ |
|||
package com.zscat.mallplus.ums.entity; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.IdType; |
|||
import com.baomidou.mybatisplus.annotation.TableField; |
|||
import com.baomidou.mybatisplus.annotation.TableId; |
|||
import com.baomidou.mybatisplus.annotation.TableName; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
|
|||
@TableName("sys_message_task") |
|||
public class SysMessageTask implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
@TableId(value = "id", type = IdType.AUTO) |
|||
private Integer id; |
|||
@TableField("user_id") |
|||
private Integer userId = 1; |
|||
/** |
|||
* 消息编码 |
|||
*/ |
|||
private String code = "系统消息"; |
|||
/** |
|||
* 参数 |
|||
*/ |
|||
private String params; |
|||
/** |
|||
* 内容 |
|||
*/ |
|||
private String content; |
|||
private Date sendtime; |
|||
private int status = 0; |
|||
|
|||
public Integer getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(Integer id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public Integer getUserId() { |
|||
return userId; |
|||
} |
|||
|
|||
public void setUserId(Integer userId) { |
|||
this.userId = userId; |
|||
} |
|||
|
|||
public String getCode() { |
|||
return code; |
|||
} |
|||
|
|||
public void setCode(String code) { |
|||
this.code = code; |
|||
} |
|||
|
|||
public String getParams() { |
|||
return params; |
|||
} |
|||
|
|||
public void setParams(String params) { |
|||
this.params = params; |
|||
} |
|||
|
|||
public String getContent() { |
|||
return content; |
|||
} |
|||
|
|||
public void setContent(String content) { |
|||
this.content = content; |
|||
} |
|||
|
|||
public Date getSendtime() { |
|||
return sendtime; |
|||
} |
|||
|
|||
public void setSendtime(Date sendtime) { |
|||
this.sendtime = sendtime; |
|||
} |
|||
|
|||
public int getStatus() { |
|||
return status; |
|||
} |
|||
|
|||
public void setStatus(int status) { |
|||
this.status = status; |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
package com.zscat.mallplus.ums.mapper; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import com.zscat.mallplus.ums.entity.SysMessageTask; |
|||
|
|||
public interface SysMessageTaskMapper extends BaseMapper<SysMessageTask> { |
|||
} |
@ -0,0 +1,83 @@ |
|||
import request from '@/utils/request' |
|||
export function fetchList(params) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/list', |
|||
method: 'get', |
|||
params: params |
|||
}) |
|||
} |
|||
export function createMessageTask(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/create', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
export function deleteMessageTask(id) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/delete/' + id, |
|||
method: 'get', |
|||
}) |
|||
} |
|||
|
|||
|
|||
export function updateShowStatus(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/update/showStatus', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
export function updateFactoryStatus(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/update/factoryStatus', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
export function getMember(id) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/' + id, |
|||
method: 'get', |
|||
}) |
|||
} |
|||
|
|||
export function updateMember(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/update', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
export function updateMemberOrderInfo() { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/updateMemberOrderInfo', |
|||
method: 'post' |
|||
}) |
|||
} |
|||
|
|||
export function fetchBlanceList(id) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/fetchBlanceList/' + id, |
|||
method: 'get', |
|||
}) |
|||
} |
|||
|
|||
export function handleEditBlance(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/handleEditBlance', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
export function handleEditIntegration(data) { |
|||
return request({ |
|||
url: '/ums/sysMessageTask/handleEditIntegration', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
@ -0,0 +1,210 @@ |
|||
<template> |
|||
<div class="app-container" style="margin-right: 10px;"> |
|||
<div class="listconadd"> |
|||
<el-card class="operate-container" shadow="never"> |
|||
<i class="el-icon-tickets"></i> |
|||
<span>定时消息列表</span> |
|||
<el-button type="primary" class="btn-add" @click="sendMessageToOne()" size="mini">新增定时消息</el-button> |
|||
</el-card> |
|||
<div class="table-container"> |
|||
<el-table ref="brandTable" :data="list" style="width: 100%" v-loading="listLoading" border> |
|||
<!-- <el-table-column label="编号" width="80" align="center" prop="id" /> --> |
|||
<el-table-column label="标题" width="180" prop="params" align="center" /> |
|||
<el-table-column label="内容" prop="content" /> |
|||
<el-table-column label="发送时间" width="180" align="center"> |
|||
<template slot-scope="scope"> |
|||
{{ scope.row.sendtime | formatTime }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="发送状态" width="100" align="center"> |
|||
<template slot-scope="scope"> |
|||
{{ scope.row.status | formatStatus }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="操作" width="250" align="center"> |
|||
<template slot-scope="scope"> |
|||
<el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</div> |
|||
<div class="batch-operate-container"></div> |
|||
<div class="pagination-container"> |
|||
<el-pagination |
|||
background |
|||
@size-change="handleSizeChange" |
|||
@current-change="handleCurrentChange" |
|||
layout="total, sizes,prev, pager, next,jumper" |
|||
:page-size="listQuery.pageSize" |
|||
:page-sizes="[5, 10, 15]" |
|||
:current-page.sync="listQuery.pageNum" |
|||
:total="total" |
|||
></el-pagination> |
|||
</div> |
|||
</div> |
|||
<el-dialog title="新增定时消息" :visible.sync="dialogVisibleMessOne" width="40%"> |
|||
<el-form :model="msgOne" :rules="msgOneRules" ref="msgOneFrom" label-width="150px"> |
|||
<el-form-item label="设定发送时间:" prop="sendtime"><el-date-picker v-model="msgOne.sendtime" type="datetime" placeholder="选择日期时间"></el-date-picker></el-form-item> |
|||
<el-form-item label="标题:" prop="params"><el-input v-model="msgOne.params"></el-input></el-form-item> |
|||
<el-form-item label="信息内容:" prop="content"><el-input type="textarea" :rows="3" v-model="msgOne.content"></el-input></el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button @click="sendMessageToOneReset">取 消</el-button> |
|||
<el-button type="primary" @click="sendMessageToOneSubmit">确 定</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import { formatDate } from '@/utils/date' |
|||
import { fetchList, createMessageTask, deleteMessageTask } from '@/api/ums/sysMessageTask' |
|||
|
|||
export default { |
|||
name: 'sysMessageTaskList', |
|||
data() { |
|||
return { |
|||
dialogVisibleMessOne: false, |
|||
msgOne: { |
|||
userId: 1, |
|||
code: '', |
|||
params: '', |
|||
content: '', |
|||
sendtime: '', |
|||
status: 0 |
|||
}, |
|||
msgOneRules: { |
|||
sendtime: [ |
|||
{ |
|||
required: true, |
|||
message: '请选择日期时间', |
|||
trigger: 'blur' |
|||
} |
|||
], |
|||
params: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入信息标题', |
|||
trigger: 'blur' |
|||
} |
|||
], |
|||
content: [ |
|||
{ |
|||
required: true, |
|||
message: '信息内容不能为空', |
|||
trigger: 'blur' |
|||
} |
|||
] |
|||
}, |
|||
listQuery: { |
|||
keyword: null, |
|||
pageNum: 1, |
|||
pageSize: 10 |
|||
}, |
|||
list: null, |
|||
total: null, |
|||
listLoading: true |
|||
} |
|||
}, |
|||
created() { |
|||
this.getList() |
|||
}, |
|||
filters: { |
|||
formatTime(time) { |
|||
if (time == null || time === '') { |
|||
return 'N/A' |
|||
} |
|||
let date = new Date(time) |
|||
return formatDate(date, 'yyyy-MM-dd hh:mm:ss') |
|||
}, |
|||
formatStatus(value) { |
|||
if (value === 0) { |
|||
return '未发送' |
|||
} |
|||
return '已发送' |
|||
} |
|||
}, |
|||
methods: { |
|||
sendMessageToOne() { |
|||
this.msgOne.userId = 1 |
|||
this.msgOne.code = '系统消息' |
|||
this.msgOne.params = '' |
|||
this.msgOne.content = '' |
|||
this.msgOne.sendtime = '' |
|||
this.msgOne.status = 0 |
|||
this.dialogVisibleMessOne = true |
|||
}, |
|||
sendMessageToOneSubmit() { |
|||
let _this = this |
|||
this.$refs['msgOneFrom'].validate(valid => { |
|||
if (valid) { |
|||
createMessageTask(_this.msgOne).then(response => { |
|||
this.$message({ |
|||
message: '信息设置成功', |
|||
type: 'success', |
|||
duration: 1000 |
|||
}) |
|||
_this.getList() |
|||
_this.sendMessageToOneReset() |
|||
}) |
|||
} else { |
|||
_this.$message({ |
|||
message: '请输入正确的数据', |
|||
type: 'error', |
|||
duration: 1000 |
|||
}) |
|||
return false |
|||
} |
|||
}) |
|||
}, |
|||
sendMessageToOneReset() { |
|||
this.$refs['msgOneFrom'].resetFields() |
|||
this.msgOne.userId = 1 |
|||
this.msgOne.code = '系统消息' |
|||
this.msgOne.params = '' |
|||
this.msgOne.content = '' |
|||
this.msgOne.sendtime = '' |
|||
this.msgOne.status = 0 |
|||
this.dialogVisibleMessOne = false |
|||
}, |
|||
getList() { |
|||
this.listLoading = true |
|||
if (this.listQuery.keyword == '') this.listQuery.keyword = null |
|||
|
|||
fetchList(this.listQuery).then(response => { |
|||
this.listLoading = false |
|||
this.list = response.data.records |
|||
this.total = response.data.total |
|||
this.totalPage = response.data.pages |
|||
this.pageSize = response.data.size |
|||
}) |
|||
}, |
|||
handleDelete(row) { |
|||
this.$confirm('是否要删除该记录', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}).then(() => { |
|||
deleteMessageTask(row.id).then(response => { |
|||
this.$message({ |
|||
message: '删除成功', |
|||
type: 'success', |
|||
duration: 1000 |
|||
}) |
|||
this.getList() |
|||
}) |
|||
}) |
|||
}, |
|||
handleSizeChange(val) { |
|||
this.listQuery.pageNum = 1 |
|||
this.listQuery.pageSize = val |
|||
this.getList() |
|||
}, |
|||
handleCurrentChange(val) { |
|||
this.listQuery.pageNum = val |
|||
this.getList() |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style rel="stylesheet/scss" lang="scss" scoped></style> |
Loading…
Reference in new issue