Browse Source

Merge pull request #3 from linlinjava/master

更新Fork
Menethil 7 years ago
parent
commit
e97e32fc1e

+ 24 - 6
litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java

@@ -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 - 0
litemall-admin/src/api/order.js

@@ -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',

+ 107 - 37
litemall-admin/src/views/mall/order.vue

@@ -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>
-
-      <el-table-column align="center" width="100px" label="订单ID" prop="id" sortable>
+      <el-table-column align="center" min-width="100" label="订单编号" prop="orderSn">
       </el-table-column>
 
-      <el-table-column align="center" min-width="100px" label="用户ID" prop="userId">
+      <el-table-column align="center" 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" label="支付金额" prop="actualPrice">
       </el-table-column>
 
-      <el-table-column align="center" min-width="100px" label="实际费用" prop="actualPrice">
+      <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
       })

+ 22 - 0
litemall-db/src/main/java/org/linlinjava/litemall/db/domain/UserVo.java

@@ -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;
+    }
+}

+ 5 - 2
litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java

@@ -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();
 

+ 11 - 0
litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserService.java

@@ -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);

+ 2 - 0
litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java

@@ -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 {