@@ -4,12 +4,11 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.linlinjava.litemall.admin.annotation.LoginAdmin;
|
||||
import org.linlinjava.litemall.core.util.JacksonUtil;
|
||||
import org.linlinjava.litemall.db.domain.LitemallOrder;
|
||||
import org.linlinjava.litemall.db.domain.LitemallOrderGoods;
|
||||
import org.linlinjava.litemall.db.domain.LitemallProduct;
|
||||
import org.linlinjava.litemall.db.domain.*;
|
||||
import org.linlinjava.litemall.db.service.LitemallOrderGoodsService;
|
||||
import org.linlinjava.litemall.db.service.LitemallOrderService;
|
||||
import org.linlinjava.litemall.db.service.LitemallProductService;
|
||||
import org.linlinjava.litemall.db.service.LitemallUserService;
|
||||
import org.linlinjava.litemall.db.util.OrderHandleOption;
|
||||
import org.linlinjava.litemall.db.util.OrderUtil;
|
||||
import org.linlinjava.litemall.core.util.ResponseUtil;
|
||||
@@ -41,18 +40,20 @@ public class AdminOrderController {
|
||||
private LitemallOrderService orderService;
|
||||
@Autowired
|
||||
private LitemallProductService productService;
|
||||
@Autowired
|
||||
private LitemallUserService userService;
|
||||
|
||||
@GetMapping("/list")
|
||||
public Object list(@LoginAdmin Integer adminId,
|
||||
Integer userId, String orderSn,
|
||||
Integer userId, String orderSn, @RequestParam(required = false, value = "orderStatusArray[]")List<Short> orderStatusArray,
|
||||
@RequestParam(value = "page", defaultValue = "1") Integer page,
|
||||
@RequestParam(value = "limit", defaultValue = "10") Integer limit,
|
||||
String sort, String order){
|
||||
if(adminId == null){
|
||||
return ResponseUtil.unlogin();
|
||||
}
|
||||
List<LitemallOrder> orderList = orderService.querySelective(userId, orderSn, page, limit, sort, order);
|
||||
int total = orderService.countSelective(userId, orderSn, page, limit, sort, order);
|
||||
List<LitemallOrder> orderList = orderService.querySelective(userId, orderSn,orderStatusArray, page, limit, sort, order);
|
||||
int total = orderService.countSelective(userId, orderSn, orderStatusArray, page, limit, sort, order);
|
||||
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
data.put("total", total);
|
||||
@@ -61,6 +62,23 @@ public class AdminOrderController {
|
||||
return ResponseUtil.ok(data);
|
||||
}
|
||||
|
||||
@GetMapping("/detail")
|
||||
public Object detail(@LoginAdmin Integer adminId, Integer id) {
|
||||
if(adminId == null){
|
||||
return ResponseUtil.unlogin();
|
||||
}
|
||||
|
||||
LitemallOrder order = orderService.findById(id);
|
||||
List<LitemallOrderGoods> orderGoods = orderGoodsService.queryByOid(id);
|
||||
UserVo user = userService.findUserVoById(order.getUserId());
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
data.put("order", order);
|
||||
data.put("orderGoods", orderGoods);
|
||||
data.put("user", user);
|
||||
|
||||
return ResponseUtil.ok(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单退款确认
|
||||
* 1. 检测当前订单是否能够退款确认
|
||||
|
||||
@@ -8,6 +8,14 @@ export function listOrder(query) {
|
||||
})
|
||||
}
|
||||
|
||||
export function detailOrder(id) {
|
||||
return request({
|
||||
url: '/order/detail',
|
||||
method: 'get',
|
||||
params: { id }
|
||||
})
|
||||
}
|
||||
|
||||
export function shipOrder(data) {
|
||||
return request({
|
||||
url: '/order/ship',
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
</el-input>
|
||||
<el-input clearable class="filter-item" style="width: 200px;" placeholder="请输入订单编号" v-model="listQuery.orderSn">
|
||||
</el-input>
|
||||
<el-select multiple style="width: 200px" class="filter-item" placeholder="请选择订单状态" v-model="listQuery.orderStatusArray">
|
||||
<el-option v-for="(key, value) in statusMap" :key="key" :label="key" :value="value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">查找</el-button>
|
||||
<el-button class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload" :loading="downloadLoading">导出</el-button>
|
||||
</div>
|
||||
@@ -14,34 +18,36 @@
|
||||
<!-- 查询结果 -->
|
||||
<el-table size="small" :data="list" v-loading="listLoading" element-loading-text="正在查询中。。。" border fit highlight-current-row>
|
||||
|
||||
<el-table-column type="expand">
|
||||
<template slot-scope="props">
|
||||
</template>
|
||||
<el-table-column align="center" min-width="100" label="订单编号" prop="orderSn">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" width="100px" label="订单ID" prop="id" sortable>
|
||||
<el-table-column align="center" label="用户ID" prop="userId">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" min-width="100px" label="用户ID" prop="userId">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" min-width="200px" label="订单编号" prop="orderSn">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" min-width="100px" label="订单状态" prop="orderStatus">
|
||||
<el-table-column align="center" label="订单状态" prop="orderStatus">
|
||||
<template slot-scope="scope">
|
||||
<el-tag>{{scope.row.orderStatus | orderStatusFilter}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" min-width="100px" label="订单费用" prop="orderPrice">
|
||||
<el-table-column align="center" label="订单金额" prop="orderPrice">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" min-width="100px" label="实际费用" prop="actualPrice">
|
||||
<el-table-column align="center" label="支付金额" prop="actualPrice">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" label="支付时间" prop="payTime">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" label="物流单号" prop="shipSn">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" label="物流渠道" prop="shipChannel">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" label="操作" width="200" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button type="primary" size="mini" @click="handleDetail(scope.row)">详情</el-button>
|
||||
<el-button type="primary" size="mini" @click="handleShip(scope.row)" v-if="scope.row.orderStatus==201">发货</el-button>
|
||||
<el-button type="primary" size="mini" @click="handleRefund(scope.row)" v-if="scope.row.orderStatus==202">退款</el-button>
|
||||
</template>
|
||||
@@ -55,6 +61,65 @@
|
||||
</el-pagination>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 订单详情对话框 -->
|
||||
<el-dialog title="订单详情" width="800" :visible.sync="orderDialogVisible">
|
||||
|
||||
<el-form :data="orderDetail" label-position="left">
|
||||
<el-form-item label="订单编号">
|
||||
<span>{{ orderDetail.order.orderSn }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="订单状态">
|
||||
<template slot-scope="scope">
|
||||
<el-tag>{{orderDetail.order.orderStatus | orderStatusFilter}}</el-tag>
|
||||
</template>
|
||||
</el-form-item>
|
||||
<el-form-item label="订单用户">
|
||||
<span>{{ orderDetail.user.nickname }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="收货信息">
|
||||
<span>(收货人){{ orderDetail.order.consignee }}</span>
|
||||
<span>(手机号){{ orderDetail.order.mobile }}</span>
|
||||
<span>(地址){{ orderDetail.order.address }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="商品信息">
|
||||
<el-table size="small" :data="orderDetail.orderGoods" border fit highlight-current-row>
|
||||
<el-table-column align="center" label="商品名称" prop="goodsName" />
|
||||
<el-table-column align="center" label="商品编号" prop="goodsSn" />
|
||||
<el-table-column align="center" label="货品规格" prop="specifications" />
|
||||
<el-table-column align="center" label="货品价格" prop="price" />
|
||||
<el-table-column align="center" label="货品数量" prop="number" />
|
||||
<el-table-column align="center" label="货品图片" prop="picUrl">
|
||||
<template slot-scope="scope">
|
||||
<img :src="scope.row.picUrl" width="40"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
<el-form-item label="费用信息">
|
||||
<span>
|
||||
(实际费用){{ orderDetail.order.actualPrice }}元 =
|
||||
(商品总价){{ orderDetail.order.goodsPrice }}元 +
|
||||
(快递费用){{ orderDetail.order.freightPrice }}元 -
|
||||
(优惠减免){{ orderDetail.order.couponPrice }}元 -
|
||||
(积分减免){{ orderDetail.order.integralPrice }}元
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付信息">
|
||||
<span>(支付渠道)微信支付</span>
|
||||
<span>(支付时间){{ orderDetail.order.payTime }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="快递信息">
|
||||
<span>(快递公司){{ orderDetail.order.shipChannel }}</span>
|
||||
<span>(快递单号){{ orderDetail.order.shipSn }}</span>
|
||||
<span>(发货时间){{ orderDetail.order.shipTime }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="收货信息">
|
||||
<span>(确认收货时间){{ orderDetail.order.confirmTime }}</span>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 发货对话框 -->
|
||||
<el-dialog title="发货" :visible.sync="shipDialogVisible">
|
||||
<el-form ref="shipForm" :model="shipForm" status-icon label-position="left" label-width="100px" style='width: 400px; margin-left:50px;'>
|
||||
@@ -88,21 +153,23 @@
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.demo-table-expand {
|
||||
font-size: 0;
|
||||
}
|
||||
.demo-table-expand label {
|
||||
width: 200px;
|
||||
color: #99a9bf;
|
||||
}
|
||||
.demo-table-expand .el-form-item {
|
||||
margin-right: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import { listOrder, shipOrder, refundOrder } from '@/api/order'
|
||||
import { listOrder, shipOrder, refundOrder, detailOrder } from '@/api/order'
|
||||
|
||||
const statusMap = {
|
||||
101: '未付款',
|
||||
102: '用户取消',
|
||||
103: '系统取消',
|
||||
201: '已付款',
|
||||
202: '申请退款',
|
||||
203: '已退款',
|
||||
301: '已发货',
|
||||
401: '用户收货',
|
||||
402: '系统收货'
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'Order',
|
||||
@@ -116,9 +183,17 @@ export default {
|
||||
limit: 20,
|
||||
id: undefined,
|
||||
name: undefined,
|
||||
orderStatusArray: [],
|
||||
sort: 'add_time',
|
||||
order: 'desc'
|
||||
},
|
||||
statusMap,
|
||||
orderDialogVisible: false,
|
||||
orderDetail: {
|
||||
order: {},
|
||||
user: {},
|
||||
orderGoods: []
|
||||
},
|
||||
shipForm: {
|
||||
orderId: undefined,
|
||||
shipChannel: undefined,
|
||||
@@ -135,17 +210,6 @@ export default {
|
||||
},
|
||||
filters: {
|
||||
orderStatusFilter(status) {
|
||||
const statusMap = {
|
||||
'101': '未付款',
|
||||
'102': '已取消',
|
||||
'103': '已取消',
|
||||
'201': '已付款',
|
||||
'202': '申请退款',
|
||||
'203': '已退款',
|
||||
'301': '已发货',
|
||||
'401': '确认收货',
|
||||
'402': '确认收货'
|
||||
}
|
||||
return statusMap[status]
|
||||
}
|
||||
},
|
||||
@@ -177,6 +241,12 @@ export default {
|
||||
this.listQuery.page = val
|
||||
this.getList()
|
||||
},
|
||||
handleDetail(row) {
|
||||
detailOrder(row.id).then(response => {
|
||||
this.orderDetail = response.data.data
|
||||
})
|
||||
this.orderDialogVisible = true
|
||||
},
|
||||
handleShip(row) {
|
||||
this.shipForm.orderId = row.id
|
||||
this.shipForm.shipChannel = row.shipChannel
|
||||
@@ -232,7 +302,7 @@ export default {
|
||||
this.downloadLoading = true
|
||||
import('@/vendor/Export2Excel').then(excel => {
|
||||
const tHeader = ['订单ID', '订单编号', '用户ID', '订单状态', '是否删除', '收货人', '收货联系电话', '收货地址']
|
||||
const filterVal = ['id', 'orderSn', 'userId', 'orderStatis', 'isDelete', 'consignee', 'mobile', 'address']
|
||||
const filterVal = ['id', 'orderSn', 'userId', 'orderStatus', 'isDelete', 'consignee', 'mobile', 'address']
|
||||
excel.export_json_to_excel2(tHeader, this.list, filterVal, '订单信息')
|
||||
this.downloadLoading = false
|
||||
})
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package org.linlinjava.litemall.db.domain;
|
||||
|
||||
public class UserVo {
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public void setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
}
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
public void setAvatar(String avatar) {
|
||||
this.avatar = avatar;
|
||||
}
|
||||
}
|
||||
@@ -100,7 +100,7 @@ public class LitemallOrderService {
|
||||
return orderMapper.updateByPrimaryKeySelective(order);
|
||||
}
|
||||
|
||||
public List<LitemallOrder> querySelective(Integer userId, String orderSn, Integer page, Integer size, String sort, String order) {
|
||||
public List<LitemallOrder> querySelective(Integer userId, String orderSn, List<Short> orderStatusArray, Integer page, Integer size, String sort, String order) {
|
||||
LitemallOrderExample example = new LitemallOrderExample();
|
||||
LitemallOrderExample.Criteria criteria = example.createCriteria();
|
||||
|
||||
@@ -110,6 +110,9 @@ public class LitemallOrderService {
|
||||
if(!StringUtils.isEmpty(orderSn)){
|
||||
criteria.andOrderSnEqualTo(orderSn);
|
||||
}
|
||||
if(orderStatusArray != null && orderStatusArray.size() != 0){
|
||||
criteria.andOrderStatusIn(orderStatusArray);
|
||||
}
|
||||
criteria.andDeletedEqualTo(false);
|
||||
|
||||
if (!StringUtils.isEmpty(sort) && !StringUtils.isEmpty(order)) {
|
||||
@@ -120,7 +123,7 @@ public class LitemallOrderService {
|
||||
return orderMapper.selectByExample(example);
|
||||
}
|
||||
|
||||
public int countSelective(Integer userId, String orderSn, Integer page, Integer size, String sort, String order) {
|
||||
public int countSelective(Integer userId, String orderSn, List<Short> orderStatusArray, Integer page, Integer size, String sort, String order) {
|
||||
LitemallOrderExample example = new LitemallOrderExample();
|
||||
LitemallOrderExample.Criteria criteria = example.createCriteria();
|
||||
|
||||
|
||||
@@ -4,10 +4,13 @@ import com.github.pagehelper.PageHelper;
|
||||
import org.linlinjava.litemall.db.dao.LitemallUserMapper;
|
||||
import org.linlinjava.litemall.db.domain.LitemallUser;
|
||||
import org.linlinjava.litemall.db.domain.LitemallUserExample;
|
||||
import org.linlinjava.litemall.db.domain.UserVo;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class LitemallUserService {
|
||||
@@ -18,6 +21,14 @@ public class LitemallUserService {
|
||||
return userMapper.selectByPrimaryKey(userId);
|
||||
}
|
||||
|
||||
public UserVo findUserVoById(Integer userId) {
|
||||
LitemallUser user = findById(userId);
|
||||
UserVo userVo = new UserVo();
|
||||
userVo.setNickname(user.getNickname());
|
||||
userVo.setAvatar(user.getAvatar());
|
||||
return userVo;
|
||||
}
|
||||
|
||||
public LitemallUser queryByOid(String openId) {
|
||||
LitemallUserExample example = new LitemallUserExample();
|
||||
example.or().andWeixinOpenidEqualTo(openId).andDeletedEqualTo(false);
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.linlinjava.litemall.wx.annotation.LoginUser;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -154,6 +155,7 @@ public class WxAddressController {
|
||||
|
||||
if (address.getId() == null || address.getId().equals(0)) {
|
||||
address.setId(null);
|
||||
address.setAddTime(LocalDateTime.now());
|
||||
address.setUserId(userId);
|
||||
addressService.add(address);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user