src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java
@@ -6,10 +6,8 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.dto.DeliverGoodsDto; import cc.mrbird.febs.mall.dto.MallOrderInfoDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsCategory; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.dto.MallOrderRefundDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.service.IAdminMallGoodsService; import cc.mrbird.febs.mall.service.IAdminMallOrderService; import lombok.RequiredArgsConstructor; @@ -53,6 +51,18 @@ return adminMallOrderService.deliverGoods(deliverGoodsDto); } /** * 订单退款列表 * @param mallOrderRefundDto * @param request * @return */ @GetMapping("refundList") public FebsResponse getRefundList(MallOrderRefundDto mallOrderRefundDto, QueryRequest request) { Map<String, Object> data = getDataTable(adminMallOrderService.getRefundListInPage(mallOrderRefundDto, request)); return new FebsResponse().success().data(data); } src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java
@@ -64,4 +64,14 @@ return FebsUtil.view("modules/order/orderDetail"); } /** * 订单退款 * @return */ @GetMapping("refundList") @RequiresPermissions("refundList:view") public String refundList() { return FebsUtil.view("modules/order/refundList"); } } src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java
@@ -21,6 +21,8 @@ private String thumb; private String thumbs; private String goodsDetails; private Integer isSale; src/main/java/cc/mrbird/febs/mall/dto/MallOrderRefundDto.java
New file @@ -0,0 +1,17 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "MallOrderRefundDto", description = "参数接收类") public class MallOrderRefundDto { private String name; private String phone; private String orderNo; //状态;1-已申请2-同意退款3-驳回退款4-已提交物流信息5-已退款 private Integer status; } src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsImagesMapper.java
@@ -1,5 +1,6 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.MallGoodsImages; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -9,7 +10,7 @@ * @author wzy * @date 2021-09-17 **/ public interface MallGoodsImagesMapper extends BaseMapper<MallGoodsMapper> { public interface MallGoodsImagesMapper extends BaseMapper<MallGoodsImages> { List<String> selectGoodsImagesByGoodsId(@Param("goodsId") Long goodsId); } src/main/java/cc/mrbird/febs/mall/mapper/MallOrderRefundMapper.java
@@ -1,10 +1,16 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.dto.MallOrderRefundDto; import cc.mrbird.febs.mall.entity.MallOrderRefund; import cc.mrbird.febs.mall.vo.AdminMallOrderRefundVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; public interface MallOrderRefundMapper extends BaseMapper<MallOrderRefund> { MallOrderRefund selectOrderRefundByOrderId(@Param("orderId") Long orderId); IPage<AdminMallOrderRefundVo> selectRefundListInPage(Page<AdminMallOrderRefundVo> page, @Param("record") MallOrderRefundDto mallOrderRefundDto); } src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java
@@ -4,9 +4,10 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.dto.DeliverGoodsDto; import cc.mrbird.febs.mall.dto.MallOrderInfoDto; import cc.mrbird.febs.mall.dto.MallOrderRefundDto; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo; import cc.mrbird.febs.mall.vo.AdminMallOrderRefundVo; import cc.mrbird.febs.mall.vo.AdminMallOrderVo; import cc.mrbird.febs.mall.vo.AdminOrderDetailVo; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -22,4 +23,5 @@ AdminOrderDetailVo getMallOrderDetailById(long id); IPage<AdminMallOrderRefundVo> getRefundListInPage(MallOrderRefundDto mallOrderRefundDto, QueryRequest request); } src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java
@@ -5,14 +5,8 @@ import cc.mrbird.febs.mall.dto.AddMallGoodsDto; import cc.mrbird.febs.mall.dto.AddMallGoodsSkuDto; import cc.mrbird.febs.mall.dto.UpMallGoodsDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsCategory; import cc.mrbird.febs.mall.entity.MallGoodsSku; import cc.mrbird.febs.mall.entity.MallGoodsStyle; import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper; import cc.mrbird.febs.mall.mapper.MallGoodsMapper; import cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper; import cc.mrbird.febs.mall.mapper.MallGoodsStyleMapper; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IAdminMallGoodsService; import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo; import cc.mrbird.febs.mall.vo.AdminMailGoodsSkuDetailVo; @@ -39,6 +33,7 @@ private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallGoodsStyleMapper mallGoodsStyleMapper; private final MallGoodsImagesMapper mallGoodsImagesMapper; @Override public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) { @@ -84,6 +79,23 @@ mallGoods.setIsSale(MallGoods.ISSALE_STATUS_DISABLED); mallGoodsMapper.insert(mallGoods); String thumbs = addMallGoodsDto.getThumbs(); if(StrUtil.isNotEmpty(thumbs)){ List<String> imgs = StrUtil.splitTrim(thumbs, ","); if(CollUtil.isNotEmpty(imgs)){ int i = 1; for(String img : imgs){ MallGoodsImages mallGoodsImages = new MallGoodsImages(); mallGoodsImages.setGoodsId(mallGoods.getId()); mallGoodsImages.setImageUrl(img); mallGoodsImages.setSeq(i); mallGoodsImagesMapper.insert(mallGoodsImages); i++; } } } List<AddMallGoodsSkuDto> addMallGoodsSkuDtos = addMallGoodsDto.getAddMallGoodsSkuDtos(); if(CollUtil.isNotEmpty(addMallGoodsSkuDtos)){ for(AddMallGoodsSkuDto addMallGoodsSkuDto : addMallGoodsSkuDtos){ src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
@@ -4,14 +4,18 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.dto.DeliverGoodsDto; import cc.mrbird.febs.mall.dto.MallOrderInfoDto; import cc.mrbird.febs.mall.dto.MallOrderRefundDto; import cc.mrbird.febs.mall.entity.MallExpressInfo; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.entity.MallOrderRefund; import cc.mrbird.febs.mall.mapper.MallExpressInfoMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; import cc.mrbird.febs.mall.mapper.MallOrderRefundMapper; import cc.mrbird.febs.mall.service.IAdminMallOrderService; import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo; import cc.mrbird.febs.mall.vo.AdminMallOrderRefundVo; import cc.mrbird.febs.mall.vo.AdminMallOrderVo; import cc.mrbird.febs.mall.vo.AdminOrderDetailVo; import cn.hutool.core.collection.CollUtil; @@ -36,6 +40,8 @@ private final MallExpressInfoMapper mallExpressInfoMapper; private final MallOrderItemMapper mallOrderItemMapper; private final MallOrderRefundMapper mallOrderRefundMapper; @Override public IPage<AdminMallOrderInfoVo> getOrderListInPage(MallOrderInfoDto mallOrderInfo, QueryRequest request) { @@ -100,5 +106,12 @@ return adminOrderDetailVo; } @Override public IPage<AdminMallOrderRefundVo> getRefundListInPage(MallOrderRefundDto mallOrderRefundDto, QueryRequest request) { Page<AdminMallOrderRefundVo> page = new Page<>(request.getPageNum(), request.getPageSize()); IPage<AdminMallOrderRefundVo> adminMallOrderRefundVos = mallOrderRefundMapper.selectRefundListInPage(page, mallOrderRefundDto); return adminMallOrderRefundVos; } } src/main/java/cc/mrbird/febs/mall/vo/AdminMallOrderRefundVo.java
New file @@ -0,0 +1,34 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "AdminMallOrderRefundVo", description = "信息返回类") public class AdminMallOrderRefundVo { private Long id; private String name; private String phone; private Long orderId; private String orderNo; private String reason; private String desp; private String remark; /** * 1-已申请 2-同意退款 3-驳回退款 4-已提交物流信息 5-已退款 6-已取消 */ private Integer status; private String expressNo; private String expressCom; } src/main/resources/mapper/modules/MallOrderRefundMapper.xml
@@ -5,4 +5,28 @@ <select id="selectOrderRefundByOrderId" resultType="cc.mrbird.febs.mall.entity.MallOrderRefund"> select * from mall_order_refund where order_id=#{orderId} </select> <select id="selectRefundListInPage" resultType="cc.mrbird.febs.mall.vo.AdminMallOrderRefundVo"> select *,b.name,b.phone,c.order_no from mall_order_refund a left join mall_member b on b.id = a.member_id left join mall_order_info c on c.id = a.order_id <where> <if test="record != null"> <if test="record.name != null and record.name != ''"> and b.name like CONCAT('%', CONCAT(#{record.name}, '%')) </if> <if test="record.orderNo != null and record.orderNo != ''"> and c.order_no like CONCAT('%', CONCAT(#{record.orderNo}, '%')) </if> <if test="record.phone != null and record.phone != ''"> and b.phone like CONCAT('%', CONCAT(#{record.phone}, '%')) </if> <if test="record.status != null and record.status != ''"> and a.status = #{record.status} </if> </if> </where> order by a.created_time desc </select> </mapper> src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
@@ -71,7 +71,6 @@ </div> </div> <div id="attrWrap"></div> <div class="layui-form-item"> <label class="layui-form-label">缩略图:</label> <div class="layui-input-block"> @@ -89,6 +88,25 @@ <input type="text" id="thumb" name="thumb" autocomplete="off" class="layui-input" readonly> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">轮播图:</label> <div class="layui-input-block"> <div class="layui-upload"> <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="thumbsBanner">上传</button> <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> <div class="layui-upload-list" id="thumbsBanners"></div> </blockquote> </div> </div> </div> <div class="layui-form-item febs-hide"> <label class="layui-form-label">缩略图链接:</label> <div class="layui-input-block"> <input type="text" id="thumbs" name="thumbs" autocomplete="off" class="layui-input" readonly> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">商品详情:</label> <div class="layui-input-block"> @@ -168,22 +186,44 @@ }); //多图片上传 upload.render({ elem: '#thumbsBanner' ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 ,multiple: true ,before: function(obj){ //预读本地文件示例,不支持ie8 obj.preview(function(index, file, result){ $('#thumbsBanners').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">') }); } ,done: function(res){ var thumbs = $("#thumbs").val(); if(thumbs == ''){ $("#thumbs").val(res.data.src); }else{ $("#thumbs").val(thumbs + ',' + res.data.src); } // alert($("#thumb").val()); } }); //多图片上传 upload.render({ elem: '#test2' ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 ,multiple: true ,before: function(obj){ //预读本地文件示例,不支持ie8 obj.preview(function(index, file, result){ $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img">') $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">') }); } ,done: function(res){ var thumbs = $("#thumb").val(); if(thumbs == ''){ // var thumbs = $("#thumb").val(); // if(thumbs == ''){ $("#thumb").val(res.data.src); }else{ $("#thumb").val(thumbs + ',' + res.data.src); } // }else{ // $("#thumb").val(thumbs + ',' + res.data.src); // } // alert($("#thumb").val()); } }); src/main/resources/templates/febs/views/modules/order/refundList.html
New file @@ -0,0 +1,183 @@ <div class="layui-fluid layui-anim febs-anim" id="febs-order-refund" lay-title="退款列表"> <div class="layui-row febs-container"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-body febs-table-full"> <form class="layui-form layui-table-form" lay-filter="user-table-form"> <div class="layui-form-item"> <div class="layui-col-md10"> <div class="layui-inline"> <div class="layui-input-inline"> <input type="text" placeholder="用户名" name="name" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> <div class="layui-input-inline"> <input type="text" placeholder="电话号码" name="phone" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> <div class="layui-input-inline"> <input type="text" placeholder="订单编号" name="orderNo" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">订单状态</label> <div class="layui-input-inline"> <select name="status"> <option value="">请选择</option> <option value="1">已申请</option> <option value="2">同意退款</option> <option value="3">驳回退款</option> <option value="4">已提交物流信息</option> <option value="5">已退款</option> </select> </div> </div> </div> <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> <i class="layui-icon"></i> </div> <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> <i class="layui-icon"></i> </div> </div> </div> </form> <table lay-filter="orderRefundTable" lay-data="{id: 'orderRefundTable'}"></table> </div> </div> </div> </div> </div> <!-- 表格操作栏 start --> <script type="text/html" id="user-option"> <span shiro:lacksPermission="user:view,user:update,user:delete"> <span class="layui-badge-dot febs-bg-orange"></span> 无权限 </span> <a lay-event="edit" shiro:hasPermission="user:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> </script> <!-- 表格操作栏 end --> <script data-th-inline="none" type="text/javascript"> // 引入组件并初始化 layui.use([ 'jquery', 'form', 'table', 'febs'], function () { var $ = layui.jquery, febs = layui.febs, form = layui.form, table = layui.table, $view = $('#febs-order-refund'), $query = $view.find('#query'), $reset = $view.find('#reset'), $searchForm = $view.find('form'), $add = $view.find('#add'), sortObject = {field: 'phone', type: null}, tableIns; form.render(); // 表格初始化 initTable(); // 初始化表格操作栏各个按钮功能 table.on('tool(orderRefundTable)', function (obj) { var data = obj.data, layEvent = obj.event; if (layEvent === 'deliverGoods') { febs.modal.open('发货', 'modules/order/deliverGoods/' + data.id, { btn: ['确认', '取消'], yes: function (index, layero) { $('#deliver-update').find('#submit').trigger('click'); }, btn2: function () { layer.closeAll(); } }); } if (layEvent === 'seeOrder') { febs.modal.open( '订单详情', 'modules/order/orderDetail/' + data.id, { maxmin: true, }); } }); // 查询按钮 $query.on('click', function () { var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); tableIns.reload({where: params, page: {curr: 1}}); }); // 刷新按钮 $reset.on('click', function () { $searchForm[0].reset(); sortObject.type = 'null'; tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); }); $add.on('click', function () { febs.view.tab.change("/modules/goods/goodsAddNew/"); }); function initTable() { tableIns = febs.table.init({ elem: $view.find('table'), id: 'orderRefundTable', url: ctx + 'admin/order/refundList', cols: [[ {field: 'name', title: '用户名', minWidth: 150,align:'left'}, {field: 'phone', title: '电话', minWidth: 150,align:'left'}, {field: 'orderNo', title: '订单编号', minWidth: 150,align:'left'}, {field: 'reason', title: '退款原因', minWidth: 150,align:'left'}, {field: 'status', title: '状态', templet: function (d) { if (d.status === 1) { return '<span style="color:red;">已申请</span>' } else if (d.status === 2) { return '<span>同意退款</span>' }else if (d.status === 3) { return '<span>驳回退款</span>' }else if (d.status === 4) { return '<span>已提交物流信息</span>' }else if (d.status === 5) { return '<span>已退款</span>' }else{ return '' } }, minWidth: 80,align:'center'}, // {field: 'accountStatus', title: '账号状态', // templet: function (d) { // if (d.accountStatus === 1) { // return '<span style="color:green;">正常</span>' // } else if (d.accountStatus === 2) { // return '<span style="color:red;">禁用</span>' // }else{ // return '' // } // }, minWidth: 80,align:'center'}, // {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'}, // {title: '操作', // templet: function (d) { // if (d.status === 1) { // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>' // }else{ // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' // } // },minWidth: 300,align:'center'} ]] }); } // 获取查询参数 function getQueryParams() { return { name: $searchForm.find('input[name="name"]').val().trim(), phone: $searchForm.find('input[name="phone"]').val().trim(), orderNo: $searchForm.find('input[name="orderNo"]').val().trim(), status: $searchForm.find("select[name='status']").val(), }; } }) </script>