rabin 6 months ago
parent
commit
cfcdc14317

+ 2 - 1
src/place/api/Address.php

@@ -39,7 +39,8 @@ class Address extends Main
     public function getInfo()
     {
         $id = Dever::input('id', 'is_numeric', '收货地址');
-        return Dever::load('address', 'place')->getInfo($id);
+        $uid = Place::$uid;
+        return Dever::load('address', 'place')->getInfo($id, $uid);
     }
 
     # 删除地址

+ 6 - 0
src/place/api/Resource.php

@@ -94,4 +94,10 @@ class Resource extends Main
         return Place::result($data);
     }
 
+    # 修改订单地址
+    public function upOrderAddress()
+    {
+        $this->service->upOrderAddress();
+        return 'ok';
+    }
 }

+ 4 - 1
src/place/api/Test.php

@@ -9,7 +9,10 @@ class Test extends Main
     # 将订单设置为成功
     public function order()
     {
-        Dever::load('order', 'place')->success(Dever::input('p'), Dever::input('order_num'), Dever::input('type'), 1);
+        $app = Dever::input('app', 'is_string', '资源类型', 'goods');
+        $status = Dever::input('status', 'is_numeric', '订单状态', '1');
+        $order_num = Dever::input('order_num', 'is_string', '订单号');
+        Dever::load('order', $app)->success($order_num, $status);
         return 'ok';
     }
 }

+ 2 - 2
src/place/lib/Address.php

@@ -20,10 +20,10 @@ class Address
     }
 
     # 获取某个收货地址
-    public function getInfo($id)
+    public function getInfo($id, $uid)
     {
         $where['id'] = $id;
-        $where['uid'] = Place::$uid;
+        $where['uid'] = $uid;
         $info = Dever::db('address', 'place')->find($where);
         if ($info && Dever::project('area')) {
             $info = $this->handleInfo($info);

+ 43 - 7
src/place/lib/Resource.php

@@ -48,7 +48,9 @@ class Resource
         $result = array();
         foreach ($info as $k => $v) {
             $v = $this->handleInfo($v);
-            $result[] = $v;
+            if ($v) {
+                $result[] = $v;
+            }
         }
         return $result;
     }
@@ -73,6 +75,9 @@ class Resource
     public function pay_commit(){}
     public function pay($info)
     {
+        if (isset($info['stock']) && $info['num'] > $info['stock']) {
+            Dever::error('库存不足');
+        }
         $order = array();
         $order['uid'] = Place::$uid;
         $order['name'] = $info['name'];
@@ -109,6 +114,12 @@ class Resource
                     $detail['name'] = $v['name'];
                     $detail['pic'] = $v['pic'];
                     Dever::db('order_detail', $this->app)->insert($detail);
+                    if (isset($v['stock'])) {
+                        $state = Dever::load('stock', 'goods')->sell($detail['info_id'], $detail['sku_id'], $detail['num']);
+                        if (!$state) {
+                            Dever::error('库存不足');
+                        }
+                    }
                     if (isset($v['cart_id']) && $v['cart_id']) {
                         Dever::db('cart', $this->app)->delete(array('id' => $v['cart_id'], 'uid' => Place::$uid));
                     }
@@ -151,14 +162,32 @@ class Resource
         return $order;
     }
 
-    private function getOrderInfo($order, $view = false)
+    # 获取订单详情
+    public function upOrderAddress()
     {
-        $info = Dever::db('info', $this->app)->find($order['info_id'], array('col' => 'id,name,pic,info'));
-        $info['pic'] = explode(',', $info['pic']);
-        $order['pic'] = $info['pic'][0] ?? '';
+        $where['uid'] = Place::$uid;
+        $where['id'] = Dever::input('id', 'is_numeric', '订单');
+        $order = Dever::db('order', $this->app)->find($where);
+        if ($order && $order['status'] <= 2) {
+            $province = Dever::input('province', 'is_numeric', '省份');
+            $city = Dever::input('city', 'is_numeric', '城市');
+            $county = Dever::input('county', 'is_numeric', '区县');
+            $address = Dever::input('address', 'is_string', '地址');
+            $name = Dever::input('name', 'is_string', '联系人');
+            $phone = Dever::input('phone', 'is_string', '联系方式');
+            Dever::load('address', $this->app)->up($order['id'], $order['uid'], $order['address_id'], $name, $phone, $province . ',' . $city . ',' . $county, $address);
+        } else {
+            Dever::error('无法修改订单收货地址');
+        }
+        return $order;
+    }
 
-        $order = Dever::load('order', $this->app)->getInfo($order, $view);
+    private function getOrderInfo($order, $view = false)
+    {
         if ($order) {
+            $info = Dever::db('info', $this->app)->find($order['info_id'], array('col' => 'id,name,pic,info'));
+            $info['pic'] = explode(',', $info['pic']);
+            $order['pic'] = $info['pic'][0] ?? '';
             $order['status_name'] = Dever::db('order', $this->app)->value('status', $order['status']);
             $order['cdate_str'] = date('Y-m-d H:i:s', $order['cdate']);
             if (isset($order['pdate']) && $order['pdate']) {
@@ -167,11 +196,15 @@ class Resource
             if (isset($order['ddate']) && $order['ddate']) {
                 $order['ddate_str'] = date('Y-m-d H:i:s', $order['ddate']);
             }
+            if (isset($order['qdate']) && $order['qdate']) {
+                $order['qdate_str'] = date('Y-m-d H:i:s', $order['qdate']);
+            }
             if (isset($order['fdate']) && $order['fdate']) {
                 $order['fdate_str'] = date('Y-m-d H:i:s', $order['fdate']);
             }
-            return $order;
+            $order = Dever::load('order', $this->app)->getInfo($order, $view);
         }
+        return $order;
     }
 
     # 同步资源,关联资源
@@ -296,6 +329,9 @@ class Resource
     private function handleInfo($info)
     {
         $info = Dever::load('info', $this->app)->getInfo($info);
+        if (!$info) {
+            return $info;
+        }
         $info['pic'] = explode(',', $info['pic']);
         $info['cdate_str'] = date('Y-m-d H:i:s', $info['cdate']);
         if (Place::$uid && Place::$user['client_id'] > 0) {

+ 5 - 0
src/place/lib/Supplier.php

@@ -0,0 +1,5 @@
+<?php namespace Place\Lib;
+use Dever;
+class Supplier
+{
+}

+ 0 - 27
src/place/table/order_log.php

@@ -1,27 +0,0 @@
-<?php
-return array
-(
-    'name' => '订单日志表',
-    'partition' => 'Dever::call("manage/common.system")',
-    'store' => 'log',
-    'struct' => array
-    (
-        'order_id'       => array
-        (
-            'type'      => 'int(11)',
-            'name'      => '订单ID',
-        ),
-
-        'cash'      => array
-        (
-            'type'      => 'decimal(11,2)',
-            'name'      => '明细金额',
-        ),
-
-        'num'      => array
-        (
-            'type'      => 'decimal(11,2)',
-            'name'      => '明细数量',
-        ),
-    ),
-);

+ 38 - 0
src/place/table/seller.php

@@ -0,0 +1,38 @@
+<?php
+return array
+(
+    'name' => '销售渠道',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '渠道名称',
+            'type'      => 'varchar(50)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '微信小店',
+                2 => '小红书',
+                3 => '抖店',
+                4 => '拼多多',
+                5 => '淘宝',
+                6 => '美团',
+            ),
+        ),
+
+        'sort' => array
+        (
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ),
+    ),
+);

+ 46 - 0
src/place/table/supplier.php

@@ -0,0 +1,46 @@
+<?php
+return array
+(
+    'name' => '供应商',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '供应商名称',
+            'type'      => 'varchar(50)',
+        ),
+
+        'mobile' => array
+        (
+            'name'      => '联系电话',
+            'type'      => 'varchar(50)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '源小货',
+                2 => '1688',
+            ),
+        ),
+
+        'type_id'       => array
+        (
+            'type'      => 'varchar(50)',
+            'name'      => '供应商ID',
+        ),
+
+        'sort' => array
+        (
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ),
+    ),
+);

+ 5 - 0
src/resource/content/manage/info.php

@@ -5,6 +5,11 @@ $config = array
     (
         'field'      => array
         (
+            'id' => array
+            (
+                'name' => '编号',
+                'show' => '"C" . Dever\Helper\Str::uid("{id}")'
+            ),
             'sort' => array
             (
                 'type' => 'input',

+ 25 - 0
src/resource/goods/api/Manage.php

@@ -0,0 +1,25 @@
+<?php namespace Goods\Api;
+use Dever;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    public function getInfo()
+    {
+        return Dever::load('common', 'manage')->cascader(2, function($level, $parent) {
+            if ($level == 1) {
+                $data = Dever::db('info', 'goods')->select([]);
+            } elseif ($level == 2) {
+                $data = Dever::db('sku', 'goods')->select(array('info_id' => $parent));
+                if ($data) {
+                    foreach ($data as &$v) {
+                        $v['name'] = Dever::load('sku', 'api')->getName($v['key'], 'goods');
+                        if (!$v['name']) {
+                            $v['name'] = '无规格';
+                        }
+                    }
+                }
+            }
+            return $data;
+        });
+    }
+}

+ 33 - 0
src/resource/goods/lib/Address.php

@@ -0,0 +1,33 @@
+<?php namespace Goods\Lib;
+use Dever;
+use Place;
+class Address
+{
+    public function update($db, $data)
+    {
+        $order = Dever::db('order', 'goods')->find($data['id']);
+        if ($order) {
+            $this->up($order['id'], $order['uid'], $order['address_id'], $data['address_name'], $data['address_phone'], $data['address_area'], $data['address_address']);
+        }
+        return 'end';
+    }
+
+    public function up($order_id, $uid, $address_id, $name, $phone, $area, $address)
+    {
+        $update['uid'] = $uid;
+        $update['name'] = $name;
+        $update['phone'] = $phone;
+        $update['type'] = 3;
+        $update['area'] = $area;
+        list($update['province_id'], $update['city_id'], $update['county_id']) = explode(',', $update['area']);
+        $update['address'] = $address;
+        $address = Dever::db('address', 'place')->find($address_id);
+        if ($address && $address['type'] == 3) {
+            # 更新
+            Dever::db('address', 'place')->update($address['id'], $update);
+        } else {
+            $id = Dever::db('address', 'place')->insert($update);
+            Dever::db('order', 'goods')->update($order_id, array('address_id' => $id));
+        }
+    }
+}

+ 19 - 3
src/resource/goods/lib/Cart.php

@@ -28,6 +28,11 @@ class Cart
                 $v['pic'] = $info['pic'];
                 $v['price'] = $info['price'];
                 $v['cdate_str'] = date('Y-m-d H:i:s', $v['cdate']);
+                $v['is_stock'] = 2;
+                if (isset($info['stock'])) {
+                    $v['is_stock'] = 1;
+                    $v['stock'] = $info['stock'];
+                }
             }
         }
         return $data;
@@ -39,13 +44,17 @@ class Cart
         $data['uid'] = Place::$uid;
         $data['info_id'] = $info_id;
         $data['sku_id'] = $sku_id;
+
+        $stock = Dever::load('stock', 'goods')->yue($data['info_id'], $data['sku_id']);
+        if ($stock !== false && $num > $stock) {
+            Dever::error('库存不足');
+        }
         $info = Dever::db('cart', 'goods')->find($data);
         if ($info) {
-            $total = $info['num'] + $num;
-            if ($total <= 0) {
+            if ($num <= 0) {
                 Dever::db('cart', 'goods')->delete($info['id']);
             } else {
-                $data['num'] = array('+', $num);
+                $data['num'] = $num;
                 Dever::db('cart', 'goods')->update($info['id'], $data);
             }
         } else {
@@ -114,6 +123,12 @@ class Cart
                     $v['sku_id'] = $sku_id;
                     $v['num'] = $num;
                     $v['cash'] = $v['price']['value'];
+                    if (isset($info['stock'])) {
+                        if (!isset($result['stock'])) {
+                            $result['stock'] = 0;
+                        }
+                        $result['stock'] += $info['stock'];
+                    }
                     $result['num'] += $v['price']['num'];
                     $result['value'] += $v['cash'];
                     $result['original'] += $v['price']['original'];
@@ -134,6 +149,7 @@ class Cart
                     }
                 }
             }
+
             $result['original'] = Dever::number($result['original']);
             $result['value'] = Dever::number($result['value']);
             $result['text'] = Dever::load('price', 'place')->getText($result['value'], 3);

+ 30 - 0
src/resource/goods/lib/Express.php

@@ -0,0 +1,30 @@
+<?php namespace Goods\Lib;
+use Dever;
+use Place;
+class Express
+{
+    public function update($db, $data)
+    {
+        $order = Dever::db('order', 'goods')->find($data['order_id']);
+        if ($order && $order['status'] <= 3) {
+            $this->up($data['id'], $order['id'], $data['express_id'], $data['number']);
+        }
+        return 'end';
+    }
+
+    public function up($id, $order_id, $express_id, $number)
+    {
+        $update['order_id'] = $order_id;
+        $update['express_id'] = $express_id;
+        $update['number'] = $number;
+        if ($id) {
+            $express = Dever::db('order_express', 'goods')->find($id);
+            if ($express) {
+                Dever::db('order_express', 'goods')->update($express['id'], $update);
+            }
+        } else {
+            Dever::db('order_express', 'goods')->insert($update);
+            Dever::db('order', 'goods')->update($order_id, array('status' => 3, 'ddate' => time()));
+        }
+    }
+}

+ 20 - 1
src/resource/goods/lib/Info.php

@@ -19,12 +19,21 @@ class Info
             $where['id'] = $sku_id;
         }
         $sku = Dever::load('sku', 'api')->getPrice($where, $info['spec_type'], 'goods');
+        if (!$sku) {
+            return false;
+        }
         $info['price'] = $sku['price'];
         $info['sku_name'] = $sku['name'];
         $info['sku_id'] = $sku['id'];
         $info['sku_key'] = $sku['key'];
         if (Dever::input('show_sku')) {
-            $result['sku'] = Dever::load('sku', 'api')->getList(array('info_id' => $info['id']), Dever::input('sku_id'), 'goods');
+            $result['sku'] = Dever::load('sku', 'api')->getList(array('info_id' => $info['id']), $sku_id, 'goods');
+        }
+        $info['is_stock'] = 2;
+        $stock = Dever::load('stock', 'goods')->yue($info['id'], $info['sku_id']);
+        if ($stock !== false) {
+            $info['is_stock'] = 1;
+            $info['stock'] = $stock;
         }
         return $info;
     }
@@ -38,6 +47,11 @@ class Info
         $result = $info[$type];
         $result['id'] = $info['id'];
         $result['name'] = $info['name'];
+        $result['is_stock'] = 2;
+        if (isset($info['stock'])) {
+            $result['is_stock'] = 1;
+            $result['stock'] = $info['stock'];
+        }
         if ($result['status'] == 3) {
             $result['text'] = '专享商品,升级会员可购买';
         } else {
@@ -48,6 +62,11 @@ class Info
                 if (!$detail['pic']) {
                     $detail['pic'] = $info['pic'][0];
                 }
+                $detail['is_stock'] = 2;
+                if (isset($info['stock'])) {
+                    $detail['is_stock'] = 1;
+                    $detail['stock'] = $info['stock'];
+                }
                 $detail['cash'] = $result['value'];
                 $detail['sku_id'] = $detail['id'];
                 $detail['sku_name'] = $detail['name'];

+ 41 - 0
src/resource/goods/lib/Log.php

@@ -0,0 +1,41 @@
+<?php namespace Goods\Lib;
+use Dever;
+use Place;
+class Log
+{
+    public function up($type, $type_id, $order_id, $desc)
+    {
+        $update['type'] = $type;
+        $update['type_id'] = $type_id;
+        $update['order_id'] = $order_id;
+        $update['desc'] = $desc;
+        Dever::db('order_log', 'goods')->insert($update);
+    }
+
+    # 获取日志信息
+    public function getList($order_id)
+    {
+        $log = Dever::db('order_log', 'goods')->select(array('order_id' => $order_id));
+        if ($log) {
+            foreach ($log as &$v) {
+                $v = $this->getInfo($v);
+            }
+        }
+        return $log;
+    }
+
+    # 获取日志信息
+    public function getInfo($info)
+    {
+        if ($type == 1) {
+            $user = Dever::db('member', 'place')->find($info['type_id']);
+        } elseif ($type == 2) {
+            $user = Dever::db('user', 'sector')->find($info['type_id']);
+        } elseif ($type == 3) {
+            $user = Dever::db('supplier', 'place')->find($info['type_id']);
+        }
+        $info['name'] = $user['name'];
+        $info['mobile'] = $user['mobile'];
+        return $info;
+    }
+}

+ 225 - 9
src/resource/goods/lib/Order.php

@@ -14,7 +14,7 @@ class Order
                 # 已过期,自动取消
                 $info['time'] = -1;
                 $this->cancel($info);
-                $info['status'] = 10;
+                $info['status'] = 9;
             } else {
                 $info['time'] = $m - $info['time'];
             }
@@ -31,7 +31,7 @@ class Order
     # 获取订单里每个商品
     public function getDetail($id)
     {
-        $result = Dever::db('order_detail', 'goods')->select(array('type' => 3, 'order_id' => $id), array('col' => 'id,name,pic,sku_name,sku_id,cash,num'));
+        $result = Dever::db('order_detail', 'goods')->select(array('order_id' => $id), array('col' => 'id,name,pic,sku_name,sku_id,cash,num'));
         if ($result) {
             foreach ($result as &$v) {
                 $v['cash'] = Dever::load('price', 'place')->getText($v['cash'], 3);
@@ -44,7 +44,7 @@ class Order
     public function getView(&$info)
     {
         # 收货地址
-        $info['address'] = Dever::load('address', 'place')->getInfo($info['address_id']);
+        $info['address'] = Dever::load('address', 'place')->getInfo($info['address_id'], $info['uid']);
         # 运费
         $info['yun'] = Dever::load('price', 'place')->getText(0, 3);
         $info['status_list'] = array
@@ -52,27 +52,32 @@ class Order
             1 => array
             (
                 'selected' => false,
-                'name' => '已拍下',
+                'name' => '待付款',
+                'time' => $info['cdate_str'],
             ),
             2 => array
             (
                 'selected' => false,
-                'name' => '待付款',
+                'name' => '待发货',
+                'time' => $info['pdate_str'] ?? '',
             ),
             3 => array
             (
                 'selected' => false,
-                'name' => '待发货',
+                'name' => '待签收',
+                'time' => $info['ddate_str'] ?? '',
             ),
             4 => array
             (
                 'selected' => false,
                 'name' => '待收货',
+                'time' => $info['qdate_str'] ?? '',
             ),
             5 => array
             (
                 'selected' => false,
                 'name' => '已完成',
+                'time' => $info['fdate_str'] ?? '',
             ),
         );
         foreach ($info['status_list'] as $k => &$v) {
@@ -85,9 +90,9 @@ class Order
         } elseif ($info['status'] == 2) {
             $info['status_msg'] = '支付成功,待发货';
         } elseif ($info['status'] == 3) {
-            $info['status_msg'] = '已发货,等待配送';
+            $info['status_msg'] = '配送中,等待签收';
         } elseif ($info['status'] == 4) {
-            $info['status_msg'] = '配送中,等待收货';
+            $info['status_msg'] = '已签收,等待确认';
         } elseif ($info['status'] == 5 || $info['status'] == 6) {
             $info['status_msg'] = '订单已完成';
         } elseif ($info['status'] > 6) {
@@ -99,9 +104,10 @@ class Order
     public function cancel($order, $status = 9)
     {
         if ($order['status'] == 1) {
-            $state = Dever::db('order', 'goods')->update($order['data_id'], array('status' => $status, 'fdate' => time()));
+            $state = Dever::db('order', 'goods')->update($order['id'], array('status' => $status, 'fdate' => time()));
             if ($state) {
                 # 恢复库存
+                $this->resell($order['id']);
             }
             return 'ok';
         }
@@ -119,7 +125,217 @@ class Order
         $state = Dever::db('order', 'goods')->update($order['id'], $update);
         if ($state && $update['status'] == 7) {
             # 恢复库存
+            $this->resell($order['id']);
         }
         return $state;
     }
+
+    # 恢复库存
+    public function resell($id)
+    {
+        $result = Dever::db('order_detail', 'goods')->select(array('order_id' => $id));
+        if ($result) {
+            foreach ($result as $v) {
+                $state = Dever::load('stock', 'goods')->sell($v['info_id'], $v['sku_id'], $v['num']*-1);
+            }
+        }  
+    }
+
+    # 后台详情页
+    public function showManageView($page)
+    {
+        # 这里获取基本信息
+        $db = Dever::db('order', 'goods');
+        $address = Dever::load('address', 'place')->getInfo($page->info['address_id'], $page->info['uid']);
+        $user = Dever::db('member', 'place')->find($page->info['uid']);
+        $desc = '';
+        $status = $db->value('status', $page->info);
+        if ($page->info['info']) {
+            $desc = '备注:' . $page->info['info'];
+        }
+        $timeline = array();
+        $page->info['cdate_str'] = date('Y-m-d H:i:s', $page->info['cdate']);
+        if (isset($page->info['pdate']) && $page->info['pdate']) {
+            $page->info['pdate_str'] = date('Y-m-d H:i:s', $page->info['pdate']);
+        }
+        if (isset($page->info['ddate']) && $page->info['ddate']) {
+            $page->info['ddate_str'] = date('Y-m-d H:i:s', $page->info['ddate']);
+        }
+        if (isset($page->info['qdate']) && $page->info['qdate']) {
+            $page->info['qdate_str'] = date('Y-m-d H:i:s', $page->info['qdate']);
+        }
+        if (isset($page->info['fdate']) && $page->info['fdate']) {
+            $page->info['fdate_str'] = date('Y-m-d H:i:s', $page->info['fdate']);
+        }
+        $this->getView($page->info);
+
+        foreach ($page->info['status_list'] as $k => $v) {
+            $v['name'] = '['.$v['name'].']';
+            if ($k == 1) {
+                $v['name'] .= ' 下单人:' . $user['name'] . '('.$user['mobile'].')' . ' 付款:' . $page->info['cash'] . '元 '. $desc;
+            } elseif ($k == 2) {
+                $v['name'] .= ' 收货地址:' . $address['name'] . ',' . $address['phone'] . ',' . $address['area_string'] . ',' . $address['address'];
+            } elseif ($k == 3) {
+                $express = Dever::db('order_express', 'goods')->find(array('order_id' => $page->info['id']));
+                if ($express) {
+                    $express_info = Dever::db('express', 'sector')->find($express['express_id']);
+                    $v['name'] .= ' 已发货:' . $express_info['name'] . ',' . $express['number'];
+                }
+                
+            }
+            if ($k == 5 && $page->info['status'] > 6) {
+                $v['name'] .= ' 订单'.$status.'';
+            }
+            if ($v['selected']) {
+                $v['hollow'] = true;
+                $v['color'] = '#0bbd87';
+                $v['type'] = 'primary';
+                $v['size'] = 'large';
+            }
+            $timeline[] = $v;
+        }
+        $content = array
+        (
+            array
+            (
+                'name' => '订单进度',
+                'type' => 'timeline',
+                'content' => $timeline,
+            ),
+        );
+
+        $button = array();
+
+        if ($page->info['status'] == 2) {
+            $button[] = array
+            (
+                'name' => '修改收货信息',
+                'type' => 'fastedit',
+                'path' => 'sector_place_order/goods_order_address',
+                'row' => array
+                (
+                    'id' => $page->info['id'],
+                ),
+            );
+            $button[] = array
+            (
+                'name' => '发货',
+                # fastedit、fastadd、oper、api、link、route
+                'type' => 'fastadd',
+                'path' => 'sector_place_order/goods_order_express',
+                'row' => array
+                (
+                    'id' => $page->info['id'],
+                ),
+                'param' => array
+                (
+                    'order_id' => $page->info['id'],
+                ),
+            );
+        } elseif ($page->info['status'] == 3 && isset($express)) {
+            $button[] = array
+            (
+                'name' => '修改快递单号',
+                # fastedit、fastadd、oper、api、link、route
+                'type' => 'fastedit',
+                'path' => 'sector_place_order/goods_order_express',
+                'row' => array
+                (
+                    'id' => $express['id'],
+                ),
+                'param' => array
+                (
+                    'order_id' => $page->info['id'],
+                ),
+            );
+        }
+
+        
+
+        $info[] = array
+        (
+            # 类型,desc描述 table表格,表格有head和body即可
+            'type' => 'desc',
+            'name' => $page->info['order_num'],
+            # 每行展示数量
+            'column' => 1,
+            # 是否有边框
+            'border' => true,
+            # 排列方向:horizontal横向 vertical纵向
+            'direction' => 'horizontal',
+            # 右侧按钮
+            'button' => $button,
+            # 具体内容
+            'content' => $content,
+        );
+
+        $detail = Dever::db('order_detail', 'goods')->select(array('order_id' => $page->info['id']));
+        foreach ($detail as &$v) {
+            
+        }
+
+        $detail_button = array();
+        if ($page->info['status'] >= 2 && $page->info['status'] <= 6) {
+            $detail_button[] = array
+            (
+                'name' => '退款',
+                'type' => 'fastedit',
+                'load' => 'platform/role',
+            );
+        }
+        $tab = array
+        (
+            'active' => 'tab2',
+            'content' => array
+            (
+                'tab2' => array
+                (
+                    'name' => '商品清单',
+                    'type' => 'table',
+                    'border' => true,
+                    'height' => '200',
+                    'head' => array
+                    (
+                        array
+                        (
+                            'key' => 'name',
+                            'name' => '名称',
+                            'fixed' => 'fixed',
+                        ),
+                        array
+                        (
+                            'key' => 'sku_name',
+                            'name' => '规格',
+                            'fixed' => 'fixed',
+                        ),
+                        array
+                        (
+                            'key' => 'cash',
+                            'name' => '金额',
+                            'fixed' => 'fixed',
+                        ),
+                        array
+                        (
+                            'key' => 'num',
+                            'name' => '数量',
+                            'fixed' => 'fixed',
+                        ),
+                    ),
+                    'button' => $detail_button,
+                    'body' => $detail,
+                ),
+
+                'table1' => array
+                (
+                    # 这里跟desc一样
+                    'name' => '操作记录',
+                    'type' => 'text',
+                    'content' => '内容',
+                    'style' => 'primary',
+                ),
+            )
+        );
+        
+        return array('info' => $info, 'tab' => $tab);
+    }
 }

+ 77 - 1
src/resource/goods/lib/Stock.php

@@ -3,5 +3,81 @@ use Dever;
 use Place;
 class Stock
 {
-    
+    public function update($db, $data)
+    {
+        $info = explode(',', $data['info']);
+        $where = array();
+        $where['info_id'] = $data['info_id'] = $info[0];
+        if (isset($info[1])) {
+            $where['sku_id'] = $data['sku_id'] = $info[1];
+        }
+        if (!is_numeric($data['num'])) {
+            Dever::error('数量必须为数字');
+        }
+        if ($data['num'] <= 0) {
+            Dever::error('数量必须大于0');
+        }
+        $info = Dever::db('stock', 'goods')->find($where);
+        if ($info) {
+            $stock_id = $info['id'];
+            $yue = $info['total'] - $info['sell'] - $info['out'];
+            if ($data['type'] == 1) {
+                $data['yue'] = $yue + $data['num'];
+                $state = Dever::db('stock', 'goods')->update($info['id'], array('total' => array('+', $data['num'])));
+            } elseif ($data['type'] == 2) {
+                if ($num > $yue) {
+                    Dever::error('库存不足,出库失败');
+                } else {
+                    $data['yue'] = $yue - $data['num'];
+                    $state = Dever::db('stock', 'goods')->update($info['id'], array('out' => array('+', $data['num'])));
+                }
+            }
+        } else {
+            if ($data['type'] == 2) {
+                Dever::error('库存不足,出库失败');
+            } else {
+                $data['yue'] = $data['total'] = $data['num'];
+            }
+            $stock_id = $state = Dever::db('stock', 'goods')->insert($data);
+        }
+        
+        if ($state) {
+            $data['stock_id'] = $stock_id;
+            $state = Dever::db('stock_log', 'goods')->insert($data);
+        }
+        return 'end';
+    }
+
+    # 获取当前库存
+    public function yue($info_id, $sku_id)
+    {
+        $where['info_id'] = $info_id;
+        if ($sku_id) {
+            $where['sku_id'] = $sku_id;
+        }
+        $info = Dever::db('stock', 'goods')->find($where);
+        if ($info) {
+            return Dever::number($info['total'] - $info['sell'] - $info['out'], 2);
+        }
+        return false;
+    }
+
+    # 售出
+    public function sell($info_id, $sku_id, $num)
+    {
+        $where = array();
+        $where['info_id'] = $info_id;
+        $where['sku_id'] = $sku_id;
+        $info = Dever::db('stock', 'goods')->find($where);
+        if ($info) {
+            return Dever::db('stock', 'goods')->update(' id = ' . $info['id'] . ' and `total`-`sell`-`out` >=' . $num, array('sell' => array('+', $num)));
+        }
+        return false;
+    }
+
+    # 退款
+    public function refund($info_id, $sku_id, $num)
+    {
+
+    }
 }

+ 44 - 1
src/resource/goods/manage/core.php

@@ -19,12 +19,55 @@ return array
             'sort'      => '1',
         ),
 
+        'stock' => array
+        (
+            'parent'    => 'goods_manage',
+            'name'      => '商品库存',
+            'icon'      => 'stock-line',
+            'sort'      => '2',
+        ),
+
+        'stock_log' => array
+        (
+            'parent'    => 'goods_manage',
+            'name'      => '库存日志',
+            'icon'      => 'stock-line',
+            'sort'      => '100',
+            'show'      => 3
+        ),
+
         'cate' => array
         (
             'parent'    => 'goods_manage',
             'name'      => '商品分类',
             'icon'      => 'shopping-basket-line',
-            'sort'      => '2',
+            'sort'      => '3',
+        ),
+
+        'goods_order' => array
+        (
+            'parent'    => 'sector_place_order',
+            'name'      => '商品订单',
+            'icon'      => 'product-hunt-line',
+            'sort'      => '1',
+        ),
+
+        'goods_order_address' => array
+        (
+            'parent'    => 'sector_place_order',
+            'name'      => '订单地址',
+            'icon'      => 'product-hunt-line',
+            'sort'      => '10',
+            'show'      => 3,
+        ),
+
+        'goods_order_express' => array
+        (
+            'parent'    => 'sector_place_order',
+            'name'      => '订单发货',
+            'icon'      => 'product-hunt-line',
+            'sort'      => '10',
+            'show'      => 3,
         ),
     ),
 );

+ 59 - 0
src/resource/goods/manage/goods_order.php

@@ -0,0 +1,59 @@
+<?php
+$config = array
+(
+    'source' => 'goods/order',
+    'list' => array
+    (
+        //'expand' => 'goods/order.showOrderExpand',
+        'field'      => array
+        (
+            'order_num',
+            'name',
+            'uid' => array
+            (
+                'show' => 'Dever::call("place/member-find", array({uid}))["name"]',
+            ),
+            'cash',
+            'num',
+            'status',
+            'cdate',
+        ),
+        'button' => array
+        (
+            //'新增' => array('add'),
+        ),
+        'data_button' => array
+        (
+            //'编辑' => 'edit',
+            '详情' => array('view', array
+            (
+                'path' => 'sector_place_order/goods_order',
+                'param' => array
+                (
+                    'type' => 'view',
+                    'id' => 'id',
+                    'set' => array('menu' => 'sector_place_order/goods_order', 'parent' => 'sector_place_order/goods_order'),
+                ),
+            )),
+        ),
+        'search'    => array
+        (
+            'order_num',
+            'name' => 'like',
+            'cdate' => array
+            (
+                'name' => '创建时间',
+                'type' => 'date',
+                'date_type' => 'datetimerange',
+                'value_format' => 'YYYY-MM-DD HH:mm:ss',
+                'start_placeholder' => '开始日期',
+                'end_placeholder' => '结束日期',
+                'range_separator' => '至',
+            ),
+            'status',
+        ),
+    ),
+    # 详情页配置
+    'view' => 'goods/order.showManageView',
+);
+return $config;

+ 46 - 0
src/resource/goods/manage/goods_order_address.php

@@ -0,0 +1,46 @@
+<?php
+$id = Dever::input('id');
+$info = Dever::db('order', 'goods')->find($id);
+$address = Dever::db('address', 'place')->find($info['address_id']);
+$config = array
+(
+    'source' => 'goods/order',
+    'update' => array
+    (
+        'start' => 'goods/address.update',
+        'field'    => array
+        (
+            'address_id' => array
+            (
+                'value' => $address['id'],
+                'type' => 'hidden',
+            ),
+            'address_name' => array
+            (
+                'name' => '联系人',
+                'value' => $address['name'],
+            ),
+            'address_phone' => array
+            (
+                'name' => '联系电话',
+                'value' => $address['phone'],
+            ),
+            'address_area' => array
+            (
+                'name' => '城市地区',
+                'type' => 'cascader',
+                'remote'    => Dever::url('area/data.get&total=3'),
+                'value'     => $address['area'],
+            ),
+            'address_address' => array
+            (
+                'name' => '详细地址',
+                'type' => 'textarea',
+                'autosize' => array('minRows' => 2),
+                'value' => $address['address'],
+            ),
+        ),
+    ),
+);
+
+return $config;

+ 31 - 0
src/resource/goods/manage/goods_order_express.php

@@ -0,0 +1,31 @@
+<?php
+$id = Dever::input('id');
+$config = array
+(
+    'source' => 'goods/order_express',
+    'update' => array
+    (
+        'start' => 'goods/express.update',
+        'field'    => array
+        (
+            'order_id' => array
+            (
+                'value' => $id,
+                'type' => 'hidden',
+            ),
+            'express_id' => array
+            (
+                'rules' => true,
+                'type' => 'select',
+            ),
+            'number' => array
+            (
+                'rules' => true,
+                'type' => 'textarea',
+                'autosize' => array('minRows' => 2),
+            ),
+        ),
+    ),
+);
+
+return $config;

+ 5 - 0
src/resource/goods/manage/info.php

@@ -5,6 +5,11 @@ $config = array
     (
         'field'      => array
         (
+            'ids' => array
+            (
+                'name' => '编号',
+                'show' => '"G" . Dever\Helper\Str::uid("{id}")'
+            ),
             'sort' => array
             (
                 'type' => 'input',

+ 93 - 0
src/resource/goods/manage/stock.php

@@ -0,0 +1,93 @@
+<?php
+$config = array
+(
+    'list' => array
+    (
+        'field'      => array
+        (
+            'info_id' => array
+            (
+                'name' => '商品名称',
+                'show' => 'Dever::call("goods/info-find", array({info_id}))["name"]',
+            ),
+            'sku_id' => array
+            (
+                'name' => '商品规格',
+                'show' => 'Dever::load("sku", "api")->getName(Dever::call("goods/sku-find", array({sku_id}))["key"], "goods")',
+            ),
+            'total',
+            'sell',
+            'out',
+            'yue' => array
+            (
+                'name' => '当前库存',
+                'show' => 'Dever::call("goods/stock.yue", array({info_id}, {sku_id}))',
+            ),
+        ),
+        'button' => array
+        (
+            '新增' => array('fastadd'),
+        ),
+        'data_button' => array
+        (
+            //'编辑' => 'fastedit',
+            '日志' => array('route', array
+            (
+                'path' => 'goods_manage/stock_log',
+                'param' => array
+                (
+                    'set' => array('stock_id' => 'id', 'menu' => 'goods_manage/stock', 'parent' => 'goods_manage/stock'),
+                ),
+            )),
+        ),
+        'search'    => array
+        (
+            'info' => array
+            (
+                'type' => 'cascader',
+                'clearable' => true,
+                'remote'    => 'goods/manage.getInfo',
+            ),
+        ),
+    ),
+    'update' => array
+    (
+        'start' => 'goods/stock.update',
+        'field'    => array
+        (
+            'info' => array
+            (
+                'rules' => true,
+                'type' => 'cascader',
+                'remote'    => 'goods/manage.getInfo',
+                'clearable' => true,
+            ),
+            'type' => array
+            (
+                'rules' => true,
+                'name' => '类型',
+                'type' => 'radio',
+                'default' => 1,
+                'option' => array
+                (
+                    1 => '入库',
+                    2 => '出库',
+                ),
+            ),
+            'num' => array
+            (
+                'name' => '数量',
+                'rules' => true,
+            ),
+            'desc' => array
+            (
+                'name' => '备注',
+                'rules' => true,
+                'type' => 'textarea',
+            ),
+            
+        ),
+    ),
+);
+
+return $config;

+ 42 - 0
src/resource/goods/manage/stock_log.php

@@ -0,0 +1,42 @@
+<?php
+$stock_id = Dever::input('set')['stock_id'] ?? 0;
+$config = array
+(
+    'list' => array
+    (
+        'where' => array('stock_id' => $stock_id),
+        'field'      => array
+        (
+            'info_id' => array
+            (
+                'name' => '商品名称',
+                'show' => 'Dever::call("goods/info-find", array({info_id}))["name"]',
+            ),
+            'sku_id' => array
+            (
+                'name' => '商品规格',
+                'show' => 'Dever::load("sku", "api")->getName(Dever::call("goods/sku-find", array({sku_id}))["key"], "goods")',
+            ),
+            'type',
+            'desc',
+            'num',
+            'yue',
+        ),
+
+        'button' => array
+        (
+            
+        ),
+        'data_button' => array
+        (
+            
+        ),
+
+        'search'    => array
+        (
+            'type',
+        ),
+    ),
+);
+
+return $config;

+ 12 - 0
src/resource/goods/table/order.php

@@ -47,6 +47,12 @@ return array
             'name'      => '订单数量',
         ),
 
+        'info'      => array
+        (
+            'type'      => 'varchar(80)',
+            'name'      => '订单备注',
+        ),
+
         'status'        => array
         (
             'type'      => 'tinyint(1)',
@@ -78,6 +84,12 @@ return array
             'name'      => '发货时间',
         ),
 
+        'qdate'       => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '签收时间',
+        ),
+
         'fdate'       => array
         (
             'type'      => 'int(11)',

+ 27 - 0
src/resource/goods/table/order_express.php

@@ -0,0 +1,27 @@
+<?php
+return array
+(
+    'name' => '商品订单物流配送表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => array
+    (
+        'order_id'       => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '订单ID',
+        ),
+
+        'express_id'       => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '快递公司',
+            'value'     => 'sector/express',
+        ),
+
+        'number'      => array
+        (
+            'type'      => 'varchar(500)',
+            'name'      => '快递单号',
+        ),
+    ),
+);

+ 39 - 0
src/resource/goods/table/order_log.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '商品订单日志表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => array
+    (
+        'order_id'       => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '订单ID',
+        ),
+
+        'type' => array
+        (
+            'name'      => '操作人类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '买家',
+                2 => '卖家',
+                3 => '渠道',
+            ),
+        ),
+
+        'type_id'       => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '操作人',
+        ),
+
+        'desc'      => array
+        (
+            'type'      => 'varchar(100)',
+            'name'      => '操作明细',
+        ),
+    ),
+);

+ 17 - 25
src/resource/goods/table/stock.php

@@ -5,6 +5,12 @@ return array
     'partition' => 'Dever::call("manage/common.system")',
     'struct' => array
     (
+        'info' => array
+        (
+            'name'      => '商品',
+            'type'      => 'varchar(100)',
+        ),
+
         'info_id' => array
         (
             'name'      => '商品ID',
@@ -17,40 +23,26 @@ return array
             'name'      => '价格ID',
         ),
 
-        'order_id'       => array
-        (
-            'type'      => 'int(11)',
-            'name'      => '订单ID',
-        ),
-
-        'name'      => array
-        (
-            'type'      => 'varchar(80)',
-            'name'      => '名称',
-        ),
-
-        'pic' => array
-        (
-            'name'      => '图片',
-            'type'      => 'varchar(150)',
-        ),
-
-        'sku_name'      => array
+        'total'      => array
         (
-            'type'      => 'varchar(200)',
-            'name'      => '价格的规格名称',
+            'type'      => 'decimal(11,2)',
+            'name'      => '总库存',
         ),
 
-        'cash'      => array
+        'sell'      => array
         (
             'type'      => 'decimal(11,2)',
-            'name'      => '明细金额',
+            'name'      => '售出数',
         ),
 
-        'num'      => array
+        'out'      => array
         (
             'type'      => 'decimal(11,2)',
-            'name'      => '明细数量',
+            'name'      => '出库数',
         ),
     ),
+    'index' => array
+    (
+        'search' => 'info_id,sku_id',
+    ),
 );

+ 56 - 0
src/resource/goods/table/stock_log.php

@@ -0,0 +1,56 @@
+<?php
+return array
+(
+    'name' => '商品库存记录表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => array
+    (
+        'stock_id' => array
+        (
+            'name'      => '商品库存id',
+            'type'      => 'int(11)',
+        ),
+
+        'info_id' => array
+        (
+            'name'      => '商品ID',
+            'type'      => 'int(11)',
+        ),
+
+        'sku_id'        => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '价格ID',
+        ),
+
+        'type'        => array
+        (
+            'type'      => 'tinyint(1)',
+            'name'      => '类型',
+            'default'   => '1',
+            'value'         => array
+            (
+                1 => '入库',
+                2 => '出库',
+            ),
+        ),
+
+        'desc'      => array
+        (
+            'type'      => 'varchar(50)',
+            'name'      => '描述',
+        ),
+
+        'num'      => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '数量',
+        ),
+
+        'yue'      => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '库存余额',
+        ),
+    ),
+);

+ 8 - 0
src/sector/manage/core.php

@@ -19,6 +19,14 @@ return array
             'sort'      => '6',
         ),
 
+        'express' => array
+        (
+            'parent'    => 'platform',
+            'name'      => '快递管理',
+            'icon'      => 'exchange-funds-fill',
+            'sort'      => '7',
+        ),
+
         'sector_manage' => array
         (
             'parent'    => 'sector',

+ 41 - 0
src/sector/manage/express.php

@@ -0,0 +1,41 @@
+<?php
+return array
+(
+    'list' => array
+    (
+        'field'      => array
+        (
+            'id',
+            'name',
+            'code',
+            'type',
+            'sort' => 'input',
+            'cdate',
+        ),
+        'button' => array
+        (
+            '新增' => 'fastadd',
+        ),
+        'data_button' => array
+        (
+            '编辑' => 'fastedit',
+        ),
+        'search' => array
+        (
+            'name',
+            'code',
+            'type',
+        ),
+    ),
+    'update' => array
+    (
+        'field'    => array
+        (
+            'name',
+            'type' => 'radio',
+            'code',
+            'wx_code',
+            'sort',
+        ),
+    ),
+);

+ 64 - 0
src/sector/table/express.php

@@ -0,0 +1,64 @@
+<?php
+return array
+(
+    'name' => '快递物流',
+    'order' => 'sort asc,id asc',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '快递名称',
+            'type'      => 'varchar(50)',
+        ),
+        'code' => array
+        (
+            'name'      => '快递代码',
+            'type'      => 'varchar(50)',
+        ),
+        'wx_code' => array
+        (
+            'name'      => '微信快递代码',
+            'type'      => 'varchar(50)',
+        ),
+        'type' => array
+        (
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '快递',
+                2 => '物流',
+            ),
+        ),
+        'sort' => array
+        (
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ),
+    ),
+
+    'default' => array
+    (
+        'field' => 'name,code,type,cdate',
+        'value' => array
+        (
+            '"顺丰", "SFEXPRESS", 1,' . DEVER_TIME,
+            '"安鲜达", "EXFRESH", 1,' . DEVER_TIME,
+            '"丰网速运", "FWSY", 1,' . DEVER_TIME,
+            '"EMS", "EMS", 1,' . DEVER_TIME,
+            '"申通", "STO", 1,' . DEVER_TIME,
+            '"圆通", "YTO", 1,' . DEVER_TIME,
+            '"中通", "ZTO", 1,' . DEVER_TIME,
+            '"韵达快递", "YUNDA", 1,' . DEVER_TIME,
+            '"极兔速递", "JITU", 1,' . DEVER_TIME,
+            '"京东", "JD", 1,' . DEVER_TIME,
+            '"八达通", "BDT", 1,' . DEVER_TIME,
+            '"邮政包裹", "CHINAPOST", 1,' . DEVER_TIME,
+            '"顺心捷达", "SXJD", 1,' . DEVER_TIME,
+            '"丹鸟快递", "DANNIAO", 1,' . DEVER_TIME,
+            '"百世快递", "HTKY", 1,' . DEVER_TIME,
+        ),
+    ),
+);