rabin 4 months ago
parent
commit
7b80324def
63 changed files with 3199 additions and 0 deletions
  1. 9 0
      boot.php
  2. 13 0
      config/env/localhost.php
  3. 94 0
      config/setting.php
  4. 3 0
      package.json
  5. 4 0
      package/image/index.php
  6. 1 0
      package/readme
  7. 4 0
      package/upload/index.php
  8. 5 0
      src/bao/connect/index.php
  9. 127 0
      src/bao/connect/lib/Func/Api.php
  10. 387 0
      src/bao/connect/lib/Func/Base.php
  11. 88 0
      src/bao/connect/table/api.php
  12. 39 0
      src/bao/connect/table/api_notify.php
  13. 44 0
      src/bao/connect/table/api_notify_code.php
  14. 39 0
      src/bao/connect/table/api_request_body.php
  15. 39 0
      src/bao/connect/table/api_request_header.php
  16. 33 0
      src/bao/connect/table/api_response.php
  17. 25 0
      src/bao/connect/table/convert.php
  18. 193 0
      src/bao/connect/table/info.php
  19. 12 0
      src/bao/connect/table/manage/api.php
  20. 126 0
      src/bao/connect/table/manage/connect_api.php
  21. 137 0
      src/bao/connect/table/manage/connect_info.php
  22. 12 0
      src/bao/connect/table/manage/convert.php
  23. 23 0
      src/bao/connect/table/manage/core.php
  24. 13 0
      src/bao/connect/table/manage/request_body.php
  25. 2 0
      src/bao/connect/table/manage/request_header.php
  26. 12 0
      src/bao/connect/table/manage/response_code.php
  27. 39 0
      src/bao/connect/table/request_body.php
  28. 39 0
      src/bao/connect/table/request_header.php
  29. 31 0
      src/bao/connect/table/response_code.php
  30. 43 0
      src/dai/channel/api/Manage.php
  31. 5 0
      src/dai/channel/index.php
  32. 11 0
      src/dai/channel/lib/Manage.php
  33. 43 0
      src/dai/channel/table/goods.php
  34. 51 0
      src/dai/channel/table/info.php
  35. 28 0
      src/dai/channel/table/manage/core.php
  36. 41 0
      src/dai/channel/table/manage/goods.php
  37. 49 0
      src/dai/channel/table/manage/info.php
  38. 10 0
      src/dai/seller/api/Channel.php
  39. 129 0
      src/dai/seller/api/Order.php
  40. 5 0
      src/dai/seller/index.php
  41. 27 0
      src/dai/seller/lib/Manage.php
  42. 113 0
      src/dai/seller/lib/Order.php
  43. 39 0
      src/dai/seller/table/channel.php
  44. 37 0
      src/dai/seller/table/goods.php
  45. 74 0
      src/dai/seller/table/info.php
  46. 37 0
      src/dai/seller/table/manage/channel.php
  47. 43 0
      src/dai/seller/table/manage/core.php
  48. 37 0
      src/dai/seller/table/manage/goods.php
  49. 80 0
      src/dai/seller/table/manage/info.php
  50. 75 0
      src/dai/seller/table/manage/order_list.php
  51. 157 0
      src/dai/seller/table/order.php
  52. 53 0
      src/yuan/goods/api/Manage.php
  53. 5 0
      src/yuan/goods/index.php
  54. 57 0
      src/yuan/goods/lib/Manage.php
  55. 6 0
      src/yuan/goods/lib/Spec.php
  56. 34 0
      src/yuan/goods/table/cate.php
  57. 44 0
      src/yuan/goods/table/info.php
  58. 38 0
      src/yuan/goods/table/info_sku.php
  59. 32 0
      src/yuan/goods/table/info_spec.php
  60. 47 0
      src/yuan/goods/table/info_spec_value.php
  61. 35 0
      src/yuan/goods/table/manage/core.php
  62. 95 0
      src/yuan/goods/table/manage/info.php
  63. 26 0
      src/yuan/goods/table/manage/info_sku.php

+ 9 - 0
boot.php

@@ -0,0 +1,9 @@
+<?php
+define('DEVER_ENTRY', 'index.php');
+define('DEVER_PROJECT', 'demo');
+define('DEVER_PROJECT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+if (defined('DEVER_PACKAGE')) {
+	include('dever2/package/'.DEVER_PACKAGE.'/index.php');
+} else {
+	include('dever2/boot.php');
+}

+ 13 - 0
config/env/localhost.php

@@ -0,0 +1,13 @@
+<?php
+return array
+(
+    'db' => array
+    (
+        'type' => 'Pdo',
+        'host' => 'web-mysql',
+        'port' => '3306',
+        'name' => DEVER_PROJECT,
+        'user' => 'root',
+        'pwd' => '123456',
+    ),
+);

+ 94 - 0
config/setting.php

@@ -0,0 +1,94 @@
+<?php
+return array
+(
+    # 项目通信token
+    'token' => DEVER_PROJECT,
+    # 语言包 暂时无用
+    'lang' => 'zh-cn',
+    'lang_pack' => array('zh-cn' => '简体中文', 'en' => '英文'),
+
+    # 路由解析设置
+    'route' => false,
+    /*
+    'route' => array
+    (
+        'test' => 'home',
+        'v(.*?)_(.*?)' => 'src/home.test?type=$1&id=$2',
+    ),*/
+
+    # 日志设置
+    'log' => array('type' => 'file', 'host' => 'host', 'port' => 'port'),
+
+    # 调试的shell名
+    'shell' => 'debug',
+
+    # 定义session
+    //'session' => array('host' => '', 'port' => '', 'path' => '', 'cookie' => ''),
+
+    # 定义数据库
+    'database' => array
+    (
+        # sql优化,暂时无用
+        'opt' => true,
+        //'default' => array($env['db'], $env['db1'], 'type' => 'Pdo'),//读写分离
+        'default' => $env['db'],
+        'db1' => $env['db'],
+
+        # 分区设置 
+        'partition' => array
+        (
+            # 当前数据库是否支持自动建库,不支持改成false,则database不会自动建库,而是类似table按照表拆分
+            'create' => true,
+            # 类型:database 按照库拆分(分库) table 按照表拆分(分表) field 按照字段拆分(分区) where 按照条件拆分(分条件) Dever::session('database', 1)可以设置值
+            'database' => 'date("Y")',
+            'table' => 'date("Ym")',
+            # 字段类型分几种:range范围、list列表、hash哈希、key分区
+            'field' => array
+            (
+                'type' => 'range',
+                'field' => 'cdate', 
+                'value' => 'date("Y-m-d 23:60:60")'//date("Y-m-d 23:60:60", strtotime("-1 day"))'
+            ),
+            /*
+            'field' => array
+            (
+                'type' => 'list',
+                'field' => 'type', 
+                'value' => array('1', '2', '3'),//3个值3个分区,然后也可以用Dever::call("manage/admin.test")来返回数组
+            ),
+            'field' => array
+            (
+                'type' => 'hash',
+                'field' => 'id', 
+                'value' => '5'//5个分区
+            ),
+            'field' => array
+            (
+                'type' => 'key',
+                'field' => 'id', 
+                'value' => '5'
+            ),*/
+            # where类型,一般在表中设置array('id' => 1),
+            //'where' => 'Dever::call("manage/admin.test")'
+        ),
+    ),
+
+    # 定义模板
+    'template' => array
+    (
+        'name' => 'pc',//模板配置,如果有手机版,直接配置:'pc,mobile'
+        'replace' => array
+        (
+            '../' => '{$host}',
+        ),
+    ),
+    # 定义redis
+    //'redis' => array('host' => 'server-redis', 'port' => '6379', 'password' => 'dm_redis_123', 'expire' => 3600),
+    
+    # 根据api增加缓存
+    /*
+    'cache' => array
+    (
+        'set/home.test' => 3000,
+    ),*/
+);

+ 3 - 0
package.json

@@ -0,0 +1,3 @@
+{
+	"rely": "manage,upload,image"
+}

+ 4 - 0
package/image/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'image');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 1 - 0
package/readme

@@ -0,0 +1 @@
+dever create

+ 4 - 0
package/upload/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'upload');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 5 - 0
src/bao/connect/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'connect');
+define('DEVER_APP_LANG', '通信管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../../boot.php');

+ 127 - 0
src/bao/connect/lib/Func/Api.php

@@ -0,0 +1,127 @@
+<?php namespace Connect\Lib\Func;
+use Dever;
+class Api extends Base
+{
+    protected $type = 'api';
+
+    # 执行某个业务接口
+    public function run($type, $channel, $param = array())
+    {
+        $state = $this->setting($type, $channel, $param);
+        if (!$state) {
+            return $state;
+        }
+        return $this->curl();
+    }
+
+    # 回调
+    public function notify_commit(){}
+    public function notify()
+    {
+        $input = Dever::input();
+        $log['type'] = 'notify';
+        $log['data'] = $input;
+        Dever::log($log, 'channel');
+
+        $this->init();
+
+        $code = Dever::db('channel/connect_api_notify_code')->select(array('api_id' => $this->info['id']));
+
+        $notify = Dever::db('channel/connect_api_notify')->select(array('api_id' => $this->info['id']));
+
+        $result = 'error';
+        $status = 0;
+        if ($code) {
+            foreach ($code as $k => $v) {
+                if (isset($input[$v['key']]) && $input[$v['key']] == $v['value']) {
+                    $status = $v['type'];
+                }
+            }
+        }
+
+        if ($status == 1) {
+            $result = $this->info['notify_notify_success'];
+        }
+
+        if ($notify) {
+            foreach ($notify as $k => $v) {
+                if (isset($input[$v['key']])) {
+                    $input[$v['key']] = $this->value($input, $v['key'], $v['key'], $v['type'] * 100);
+                }
+            }
+        }
+
+        $input['status'] = $status;
+
+        # 业务处理
+        $this->service($input);
+
+        return $result;
+    }
+
+    # 获取token
+    public function token($channel, $connect, $api, $type = 'token')
+    {
+        $db = Dever::db('channel/connect_' . $type);
+        $data['connect_id'] = $connect['id'];
+        $data['api_id'] = $api['id'];
+        $info = $db->find($data);
+        if ($info && time() - $info['mdate'] >= $info['expires']) {
+            
+        } elseif ($info) {
+            return $info['value'];
+        }
+        $this->channel = $channel;
+        $this->connect = $connect;
+        $this->info = $api;
+        $result = $this->init()->curl();
+        if (isset($result[$type])) {
+            $data['value'] = $result[$type];
+            $data['expires'] = '7200';
+            if (isset($result['expires'])) {
+                $data['expires'] = $result['expires'];
+            }
+            if ($info) {
+                $data['where_id'] = $info['id'];
+                $db->update($data);
+            } else {
+                $db->insert($data);
+            }
+            return $result[$type];
+        }
+        return '';
+    }
+
+    # 构建请求头
+    protected function requestHeader(&$header)
+    {
+    	$this->request($header, 'api_request_header', array('api_id' => $this->info['id']));
+    }
+
+    # 构建请求体
+    protected function requestBody(&$body)
+    {
+    	$this->request($body, 'api_request_body', array('api_id' => $this->info['id']));
+    }
+
+    # 数据响应格式处理
+    protected function responseHandle(&$data)
+    {
+        $api_response = Dever::db('api_response', 'connect')->select(array('api_id' => $this->info['id']));
+        if ($api_response) {
+            foreach ($api_response as $k => $v) {
+                if (isset($data[$v['key']])) {
+                    $data[$v['key']] = $this->value($data, $v['key'], $v['key'], $v['type'] * 100);
+                }
+            }
+        }
+        # 业务处理
+        $data = $this->service($data);
+    }
+
+    protected function createNotify()
+    {
+        $encode = Dever::encode($this->connect['id'] . '|' . $this->info['id']);
+        return Dever::url('api.notify?s=' . $encode, 'connect');
+    }
+}

+ 387 - 0
src/bao/connect/lib/Func/Base.php

@@ -0,0 +1,387 @@
+<?php namespace Connect\Lib\Func;
+use Dever;
+class Base
+{
+    protected $connect;
+    protected $info;
+    protected $domain;
+    protected $param = array();
+    protected $signname = 'signature';
+
+    # 设置基本信息
+    protected function setting($type, $channel, $param = array())
+    {
+        $this->connect = Dever::db('info', 'connect')->find($channel['connect_id']);
+        if (!$this->connect) {
+            return false;
+        }
+        $this->connect['host'] = $channel['host'];
+        $this->connect['appkey'] = $channel['appkey'];
+        $this->connect['appsecret'] = $channel['appsecret'];
+        $this->info = Dever::db('api', 'connect')->find(array('type' => $type, 'connect_id' => $this->connect['id']));
+        if (!$this->info) {
+            return false;
+        }
+        $this->param = $param;
+        return $this;
+    }
+
+    # 发起请求
+    protected function curl($url = false)
+    {
+        if (!$url) {
+            $url = $this->url();
+        }
+        $header = $body = array();
+        $method = 'get';
+        $json = false;
+        if ($this->info['method'] == -1) {
+            $this->info['method'] = $this->connect['method'];
+            $this->info['post_method'] = $this->connect['post_method'];
+        }
+        if ($this->info['post_method'] == 2) {
+            $method = 'file';
+        } elseif ($this->info['method'] == 2) {
+            $method = 'post';
+        }
+        if ($this->info['post_method'] == 3) {
+            $json = true;
+        }
+
+        # 标准请求头
+        $this->request($header, 'request_header', array('connect_id' => $this->connect['id']));
+        # 标准请求体
+        $this->request($body, 'request_body', array('connect_id' => $this->connect['id']));
+
+        if (method_exists($this, 'requestHeader')) {
+            $this->requestHeader($header);
+        }
+        if (method_exists($this, 'requestBody')) {
+            $this->requestBody($body);
+        }
+        $this->sign($body);
+
+        $log['type'] = 'request';
+        $log['url'] = $url;
+        $log['body'] = $body;
+        $log['method'] = $method;
+        $log['json'] = $json;
+        $log['header'] = $header;
+        Dever::log($log, 'api');
+
+        print_r($body);die;
+
+        $response = Dever::curl($url, $body, $method, $json, $header);
+        $response = $this->response($response);
+        $response['request'] = $log;
+
+        return $response;
+    }
+
+    # 处理url
+    protected function url()
+    {
+        if (strstr($this->info['uri'], 'http')) {
+            $this->connect['host'] = '';
+        }
+        return $this->domain = $this->connect['host'] . $this->info['uri'];
+    }
+
+    # 获取请求参数
+    protected function request(&$data, $table, $where)
+    {
+        $body = Dever::db($table, 'connect')->select($where);
+        if ($body) {
+            foreach ($body as $k => $v) {
+                $value = $this->value($data, $v['key'], $v['default'], $v['type']);
+                if ($value || Dever::zero($value)) {
+                    $data[$v['key']] = $value;
+                }
+            }
+        }
+    }
+
+    # 数据响应格式处理
+    protected function response($response)
+    {
+        $log['type'] = 'response';
+        $log['data'] = $response;
+        Dever::log($log, 'api');
+
+        if ($this->connect['response_type'] == 1) {
+            $response = $this->filter($response);
+        	return array
+	        (
+	            'status' => 1,
+	            'msg' => 'ok',
+	            'response' => false,
+	            'request' => array(),
+	            'data' => $response,
+	        );
+        }
+        if ($this->connect['response_type'] == 2) {
+            $response = Dever::json_decode($response);
+        } elseif ($this->connect['response_type'] == 3) {
+            $response = (array) simplexml_load_string($response);
+        } else {
+        	if (strstr($response, ',')) {
+        		$response = explode(',', $response);
+        	} elseif (strstr($response, ' ')) {
+        		$response = explode(' ', $response);
+        	} elseif (strstr($response, '|')) {
+        		$response = explode('|', $response);
+        	} else {
+        		$response = explode("\n", $response);
+        	}
+
+        }
+        $msg = '';
+        $status = 2;
+        if ($code = Dever::isset($response, $this->connect['response_code'])) {
+            $code = Dever::db('response_code', 'connect')->find(array('connect_id' => $this->connect['id'], 'value' => $code));
+            if ($code && $code['type'] == 1) {
+                $status = 1;
+            }
+        }
+        $msg = $response[$this->connect['response_msg']] ?? : 'no';
+        $data = '';
+        if (strstr($this->connect['response_data'], ',')) {
+            $temp = explode(',', $this->connect['response_data']);
+            foreach ($temp as $k => $v) {
+                if (isset($response[$v])) {
+                    $data = $response[$v];
+                    break;
+                }
+            }
+        } elseif (strstr($this->connect['response_data'], '.')) {
+            $temp = explode('.', $this->connect['response_data']);
+            $data = isset($response[$temp[0]][$temp[1]]) ? $response[$temp[0]][$temp[1]] : (isset($response[$temp[0]]) ? $response[$temp[0]] : false);
+        } else {
+            $data = $response[$this->connect['response_data']] ?? false;
+        }
+        if ($data) {
+            if (method_exists($this, 'responseHandle')) {
+                $this->responseHandle($data);
+            }
+        }
+        return array
+        (
+            'status' => $status,
+            'msg' => $msg,
+            'response' => $response,
+            'request' => array(),
+            'data' => $data,
+        );
+    }
+
+    protected function sign(&$body)
+    {
+        $config = Dever::db('sign', 'connect')->find(array('connect_id' => $this->connect['id']));
+        if (!$config || ($config && $config['method'] == 1)) {
+            return;
+        }
+        $sign = array();
+        if ($config['col']) {
+            $col = explode('+', $config['col']);
+            foreach ($col as $k => $v) {
+                $sign[$v] = $this->value($body, $v, $v, 1);
+            }
+        }
+        if ($this->info && isset($this->info['sign_col']) && $this->info['sign_col']) {
+            $col = explode('+', $this->info['sign_col']);
+            foreach ($col as $k => $v) {
+                $sign[$v] = $this->value($body, $v, $v, 1);
+            }
+        }
+
+        if ($config['sort'] == 2) {
+            ksort($sign);
+        }
+
+        $string = '';
+        foreach ($sign as $k => $v) {
+            if ($config['empty'] == 2 && !Dever::zero($v) && !$v) {
+                continue;
+            }
+            if ($config['encode'] == 2 && strstr($v, 'http')) {
+                $v = urlencode($v);
+            }
+            if ($config['type'] == 1) {
+                $string .= $v;
+            } else {
+                $string .= $k . '=' . $v . '&';
+            }
+        }
+
+        $sign = rtrim($string, '&');
+
+        # 如果是ssl 这里需要处理一下,后续处理吧
+
+        if ($config['method'] == 2) {
+            $sign = md5($sign);
+        } elseif ($config['method'] == 3) {
+            $sign = hash("sha256", $sign);
+        } elseif ($config['method'] == 4) {
+            $sign = sha1($sign);
+        }
+
+        if ($config['after'] == 2) {
+            $sign = strtoupper($sign);
+        } elseif ($config['after'] == 2) {
+            $sign = strtolower($sign);
+        }
+
+        $body[$this->signname] = $sign;
+    }
+
+    protected function value(&$data, $key, $value, $type = 1)
+    {
+        $key = trim($key);
+        $value = trim($value);
+
+        if ($this->param && isset($this->param[$value])) {
+            $value = $this->param[$value];
+        } elseif ($data && isset($data[$value])) {
+            $value = $data[$value];
+        } elseif (isset($this->connect[$value]) && $this->connect[$value]) {
+            $value = $this->connect[$value];
+        } elseif (isset($this->channel[$value]) && $this->channel[$value]) {
+            $value = $this->channel[$value];
+        } elseif ($value == 'signature') {
+            $this->signname = $key;
+        } elseif ($value == 'notify') {
+            $value = $this->createNotify();
+        } elseif ($value == 'api_request') {
+            $value = $data;
+        } elseif ($value == 'timestamp') {
+            $value = Dever::timestamp();
+        } elseif ($value == 'nonce') {
+            $value = Dever::nonce();
+        } elseif ($value == 'token') {
+            $value = $this->token(1, 'token');
+        } elseif ($value == 'ticket') {
+            $value = $this->token(2, 'ticket');
+        } elseif (strstr($value, 'Dever::')) {
+            $value = '$value = '.$value.';';
+            eval($value);
+        } else {
+        	$set = Dever::db('channel/info_set')->find(array('info_id' => $this->channel['id'], 'key' => $value));
+        	if ($set) {
+        		$value = $set['value'];
+        	}
+        }
+
+        if (!Dever::zero($value) && !$value) {
+            return Dever::input($key);
+        }
+
+        if ($type == 1 || $type == 100) {
+            $value = (string) $value;
+        } elseif ($type == 2 || $type == 200) {
+            $value = (float) $value;
+        } elseif ($type == 3 && is_array($value)) {
+            $value = Dever::json_encode($value);
+        } elseif ($type == 4) {
+            $value = $this->encrypt($value);
+        } elseif ($type == 300 && is_array($value)) {
+            $value = Dever::json_decode($value);
+        } elseif ($type == 400) {
+            $value = $this->decrypt($value);
+        }
+
+        return $value;
+    }
+
+    protected function service($data)
+    {
+    	# 转换处理
+        $convert = Dever::db('convert', 'connect')->select(array('connect_id' => $this->connect['id']));
+
+        $param = array();
+        if ($convert) {
+            if (isset($data[0])) {
+                foreach ($data as $k1 => $v1) {
+                    foreach ($convert as $k => $v) {
+                        if (isset($data[$k1][$v['before']])) {
+                            $param[$k1][$v['after']] = $data[$k1][$v['before']];
+                        }
+                    }
+                }
+            } else {
+                foreach ($convert as $k => $v) {
+                    if (isset($data[$v['before']])) {
+                        $param[$v['after']] = $data[$v['before']];
+                    }
+                }
+            }
+        } else {
+            $param = $data;
+        }
+
+        Dever::load('channel/lib/service')->act($this->channel['id'], $this->info['service_id'], $this->type, $this->info['id'], $param);
+        return $param;
+    }
+
+    protected function token($id = 1, $type = 'token')
+    {
+        $api = Dever::db('api', 'connect')->find(array('connect_id' => $this->connect['id'], 'service_id' => $id));
+        if ($api) {
+            return Dever::load('channel/lib/api')->token($this->channel, $this->connect, $api, $type);
+        } else {
+            return 'error';
+        }
+    }
+
+    protected function encrypt($value)
+    {
+        $config = Dever::db('ssl', 'connect')->find(array('connect_id' => $this->connect['id']));
+        if ($config && $config['method'] && $config['key']) {
+            $value = openssl_encrypt($value, $config['method'], $config['key'], $config['option'], $config['iv']);
+            if ($config['after'] == 2) {
+                $value = base64_encode($value);
+            }
+        }
+        
+        return $value;
+    }
+
+    protected function decrypt($value)
+    {
+        if ($config['method'] && $config['key']) {
+            if (is_array($value)) {
+                $value = Dever::json_encode($value);
+            }
+            $value = openssl_decrypt($value, $config['method'], $config['key'], $config['option'], $config['iv']);
+            if ($config['after'] == 2) {
+                $value = base64_decode($value);
+            }
+        }
+        
+        return $value;
+    }
+
+    protected function public_encrypt()
+    {
+        $publicKey = "-----BEGIN PUBLIC KEY-----\n" .
+            chunk_split($this->nowpayPublickey, 64, "\n") .
+            "-----END PUBLIC KEY-----\n";
+        $output = '';
+        openssl_public_encrypt($this->encryptKey, $output, $publicKey);
+        return base64_encode($output);
+    }
+    
+    protected function protected_decrypt($str)
+    {
+        $priKey = "-----BEGIN RSA protected KEY-----\n" .
+            chunk_split($this->protectedKey, 64, "\n") .
+            "-----END RSA protected KEY-----\n";
+        $output = '';
+        openssl_protected_decrypt(base64_decode($str), $output, $priKey);
+        return $output;
+    }
+
+    protected function filter($data)
+    {
+        return preg_replace("/<!--[^\!\[]*?(?<!\/\/)-->/","",$data);
+    }
+}

+ 88 - 0
src/bao/connect/table/api.php

@@ -0,0 +1,88 @@
+<?php
+return array
+(
+    'name' => '接口配置',
+    'struct' => array
+    (
+        'connect_id' => array
+        (
+            'name'      => '通信规则id',
+            'type'      => 'int(11)',
+        ),
+
+        'name' => array
+        (
+            'name'      => '接口名称',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '接口类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '提交订单',
+                2 => '查询订单',
+                3 => '查询余额',
+            ),
+        ),
+
+        'uri' => array
+        (
+            'name'      => '接口地址',
+            'type'      => 'varchar(1000)',
+        ),
+
+        'sign_col' => array
+        (
+            'name'      => '签名加密参数',
+            'type'      => 'varchar(1000)',
+        ),
+
+        'method' => array
+        (
+            'name'      => '请求方式',
+            'type'      => 'tinyint(1)',
+            'default'   => '-1',
+            'value'     => array
+            (
+                -1 => '使用渠道标准请求方式',
+                1 => 'get',
+                2 => 'post',
+            ),
+        ),
+
+        'post_method' => array
+        (
+            'name'      => '请求头设置',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '普通表单:application/x-www-form-urlencoded',
+                2 => '文件表单:multipart/form-data',
+                3 => 'JSON:application/json',
+            ),
+        ),
+
+        'notify_type' => array
+        (
+            'name'      => '是否有回调',
+            'type'      => 'tinyint(1)',
+            'default'   => '2',
+            'value'     => array
+            (
+                1 => '有回调',
+                2 => '无回调',
+            ),
+        ),
+
+        'notify_success' => array
+        (
+            'name'      => '回调成功响应',
+            'type'      => 'varchar(500)',
+        ),
+    ),
+);

+ 39 - 0
src/bao/connect/table/api_notify.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '回调参数配置',
+    'struct' => array
+    (
+        'api_id' => array
+        (
+            'name'      => '接口id',
+            'type'      => 'int(11)',
+        ),
+
+        'name' => array
+        (
+            'name'      => '接口名称',
+            'type'      => 'varchar(150)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 44 - 0
src/bao/connect/table/api_notify_code.php

@@ -0,0 +1,44 @@
+<?php
+return array
+(
+    'name' => '回调参数配置',
+    'struct' => array
+    (
+        'api_id' => array
+        (
+            'name'      => '接口id',
+            'type'      => 'int(11)',
+        ),
+
+        'name' => array
+        (
+            'name'      => '接口名称',
+            'type'      => 'varchar(150)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '状态码标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'value' => array
+        (
+            'name'      => '状态码值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '状态码类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '成功',
+                2 => '失败',
+                3 => '其他',
+            ),
+        ),
+    ),
+);

+ 39 - 0
src/bao/connect/table/api_request_body.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '请求参数配置',
+    'struct' => array
+    (
+        'api_id' => array
+        (
+            'name'      => '接口id',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'default' => array
+        (
+            'name'      => '默认值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 39 - 0
src/bao/connect/table/api_request_header.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '请求参数配置',
+    'struct' => array
+    (
+        'api_id' => array
+        (
+            'name'      => '接口id',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'default' => array
+        (
+            'name'      => '默认值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 33 - 0
src/bao/connect/table/api_response.php

@@ -0,0 +1,33 @@
+<?php
+return array
+(
+    'name' => '响应参数配置',
+    'struct' => array
+    (
+        'api_id' => array
+        (
+            'name'      => '接口id',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 25 - 0
src/bao/connect/table/convert.php

@@ -0,0 +1,25 @@
+<?php
+return array
+(
+    'name' => '转换配置',
+    'struct' => array
+    (
+        'connect_id' => array
+        (
+            'name'      => '通信规则id',
+            'type'      => 'int(11)',
+        ),
+
+        'before' => array
+        (
+            'name'      => '转换前字段',
+            'type'      => 'varchar(150)',
+        ),
+
+        'after' => array
+        (
+            'name'      => '转换后字段',
+            'type'      => 'varchar(150)',
+        ),
+    ),
+);

+ 193 - 0
src/bao/connect/table/info.php

@@ -0,0 +1,193 @@
+<?php
+return array
+(
+    'name' => '通信规则表',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '规则名称',
+            'type'      => 'varchar(32)',
+        ),
+
+        'method' => array
+        (
+            'name'      => '请求方式',
+            'type'      => 'tinyint(1)',
+            'default'   => '2',
+            'value'     => array
+            (
+                1 => 'get',
+                2 => 'post',
+            ),
+        ),
+
+        'post_method' => array
+        (
+            'name'      => '请求头设置',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '普通表单:application/x-www-form-urlencoded',
+                2 => '文件表单:multipart/form-data',
+                3 => 'JSON:application/json',
+            ),
+        ),
+
+        'response_type' => array
+        (
+            'name'      => '响应数据类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '2',
+            'value'     => array
+            (
+                //1 => '无标准响应',
+                2 => 'JSON',
+                3 => 'XML',
+            ),
+        ),
+
+        'response_data' => array
+        (
+            'name'      => '数据字段',
+            'type'      => 'varchar(100)',
+        ),
+
+        'response_msg' => array
+        (
+            'name'      => '信息字段',
+            'type'      => 'varchar(100)',
+        ),
+
+        'response_code' => array
+        (
+            'name'      => '状态码字段',
+            'type'      => 'varchar(100)',
+        ),
+
+        'sign_method' => array
+        (
+            'name'      => '签名加密方式',
+            'type'      => 'tinyint(1)',
+            'default'   => '2',
+            'value'     => array
+            (
+                //1 => '不加密',
+                2 => 'md5',
+                3 => 'sha256',
+                4 => 'sha1',
+            ),
+        ),
+
+        'sign_col' => array
+        (
+            'name'      => '签名加密参数',
+            'type'      => 'varchar(1000)',
+        ),
+
+        'sign_type' => array
+        (
+            'name'      => '签名加密形式',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => 'value+value形式',
+                2 => 'key=value&key=value形式',
+            ),
+        ),
+
+        'sign_sort' => array
+        (
+            'name'      => '签名加密排序',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '按照请求加密参数顺序排序',
+                2 => '按照首字母正序排序',
+            ),
+        ),
+
+        'sign_encode' => array
+        (
+            'name'      => '签名加密转码',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '不处理',
+                2 => 'urlencode编码',
+            ),
+        ),
+
+        'sign_empty' => array
+        (
+            'name'      => '签名加密空值',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '参与加密',
+                2 => '不参与加密',
+            ),
+        ),
+
+        'sign_after' => array
+        (
+            'name'      => '加密后处理',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '不处理',
+                2 => '转大写',
+                3 => '转小写',
+            ),
+        ),
+
+        'ssl_method' => array
+        (
+            'name'      => '对称加密方式',
+            'type'      => 'varchar(50)',
+        ),
+
+        'ssl_key' => array
+        (
+            'name'      => '对称加密秘钥',
+            'type'      => 'varchar(50)',
+        ),
+
+        'ssl_option' => array
+        (
+            'name'      => '数据格式',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '默认填充',
+                2 => '用0填充',
+                3 => '不填充',
+            ),
+        ),
+
+        'ssl_iv' => array
+        (
+            'name'      => '初始化向量',
+            'type'      => 'varchar(50)',
+        ),
+
+        'ssl_after' => array
+        (
+            'name'      => '加密后处理',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '不处理',
+                2 => '转base64',
+            ),
+        ),
+    ),
+);

+ 12 - 0
src/bao/connect/table/manage/api.php

@@ -0,0 +1,12 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'type',
+            'uri',
+        ),
+    ),
+);

+ 126 - 0
src/bao/connect/table/manage/connect_api.php

@@ -0,0 +1,126 @@
+<?php
+$connect_id = Dever::input('search')['connect_id'] ?? 0;
+return array
+(
+    'source' => 'connect/api',
+    'list' => array
+    (
+        'where' => array('connect_id' => $connect_id),
+        'field'      => array
+        (
+            'id',
+            //'name',
+            'type',
+            'uri',
+        ),
+        'data_button' => array
+        (
+            '编辑' => 'edit',
+        ),
+        'button' => array
+        (
+            //'新增' => 'add',
+        ),
+        'search' => array
+        (
+            //'name',
+            'connect_id' => 'hidden',
+            'type',
+        ),
+    ),
+    'update' => array
+    (
+        'tab' => array
+        (
+            '基本设置' => 'type,uri,sign_col',
+            '请求参数' => 'method,post_method,connect/api_request_body,connect/api_request_header',
+            '响应参数' => 'connect/api_response',
+            '回调设置' => 'notify_type,notify_success,connect/api_notify_code,connect/api_notify',
+        ),
+        'field'    => array
+        (
+            'name',
+            'type' => array
+            (
+                'type' => 'radio',
+                //'control' => true,
+            ),
+            'uri',
+            'sign_col' => array
+            (
+                'desc' => '',
+            ),
+
+            'method' => array
+            (
+                'type' => 'radio',
+                'control' => true,
+            ),
+            'post_method' => array
+            (
+                'type' => 'radio',
+                'show' => false,
+            ),
+            'connect/api_request_body' => array
+            (
+                'name' => '业务请求体',
+                'where'  => array('api_id' => 'id'),
+                'desc' => '[变量:timestamp毫秒时间戳,nonce随机值,appkey渠道的appkey,appsecret渠道的appsecret,signature签名后的信息,api_request当前字段之前的业务参数, notify请求回调地址,token获取access_token(需要设置字段转换:token和expires),ticket获取ticket(需要设置字段转换:ticket和expires),支持Dever自带的所有方法,如Dever::uuid(),就是获取唯一值,传入参数字符串请使用双引号]',
+            ),
+            'connect/api_request_header' => array
+            (
+                'name' => '业务请求头',
+                'where'  => array('api_id' => 'id'),
+            ),
+
+            'connect/api_response' => array
+            (
+                'name' => '业务响应参数',
+                'desc' => '选填,也可以只填写重要响应参数',
+                'where'  => array('api_id' => 'id'),
+            ),
+
+            'notify_type' => array
+            (
+                'type' => 'radio',
+                'control' => true,
+            ),
+            'notify_success' => array
+            (
+                'desc' => '填写回调成功后,返回给渠道的信息',
+            ),
+            'connect/api_notify_code' => array
+            (
+                'name' => '回调状态码',
+                'where'  => array('api_id' => 'id'),
+            ),
+
+            'connect/api_notify' => array
+            (
+                'name' => '回调参数',
+                'desc' => '仅设置需要的参数即可',
+                'where'  => array('api_id' => 'id'),
+            ),
+        ),
+
+        'control' => array
+        (
+            'post_method' => array
+            (
+                'method' => 2,
+            ),
+            'notify_success' => array
+            (
+                'notify_type' => 1,
+            ),
+            'connect/api_notify_code' => array
+            (
+                'notify_type' => 1,
+            ),
+            'connect/api_notify' => array
+            (
+                'notify_type' => 1,
+            ),
+        ),
+    ),
+);

+ 137 - 0
src/bao/connect/table/manage/connect_info.php

@@ -0,0 +1,137 @@
+<?php
+return array
+(
+    'source' => 'connect/info',
+    'list' => array
+    (
+        'field'      => array
+        (
+            'id',
+            'name',
+            'method',
+        ),
+        'data_button' => array
+        (
+            '编辑' => 'edit',
+            '接口' => array('route', array
+                (
+                    'path' => 'supplier/connect_api',
+                    'param' => array
+                    (
+                        'set' => array('connect_id' => 'id', 'menu' => 'supplier/connect_info', 'parent' => 'supplier/connect_api'),
+                    ),
+                ), 'ChatLineSquare'),
+        ),
+        'button' => array
+        (
+            '新增' => 'add',
+        ),
+        'search' => array
+        (
+            'name',
+        ),
+    ),
+    'update' => array
+    (
+        'tab' => array
+        (
+            '基本设置' => 'name,method,post_method',
+            '标准请求' => 'connect/request_body,connect/request_header',
+            '响应设置' => 'response_type,response_data,response_msg,response_code,connect/response_code',
+            '字段转换' => 'connect/convert',
+            '签名设置' => 'sign_method,sign_col,sign_type,sign_sort,sign_encode,sign_empty,sign_after',
+            '对称加密[暂时不支持]' => 'ssl_method,ssl_key,ssl_option,ssl_iv,ssl_after',
+            '接口设置' => 'connect/api',
+        ),
+        'field'    => array
+        (
+            'name',
+            'method' => array
+            (
+                'type' => 'radio',
+                'control' => true,
+            ),
+            'post_method' => array
+            (
+                'type' => 'radio',
+            ),
+
+            'connect/request_body' => array
+            (
+                'name' => '请求体设置',
+                'desc' => '标准请求body,没有标准请求体可以不填写',
+                'where'  => array('connect_id' => 'id'),
+            ),
+            'connect/request_header' => array
+            (
+                'name' => '请求头设置',
+                'desc' => '标准请求header,没有标准请求头可以不填写',
+                'where'  => array('connect_id' => 'id'),
+            ),
+
+            'connect/convert' => array
+            (
+                'name' => '字段转换',
+                'desc' => '设置字段转换后,响应的数据名称将根据这些字段进行转换',
+                'where'  => array('connect_id' => 'id'),
+            ),
+
+            'response_type' => array
+            (
+                'type' => 'radio',
+                //'control' => true,
+            ),
+            'response_data',
+            'response_msg',
+            'response_code',
+            'connect/response_code' => array
+            (
+                'name' => '响应状态码',
+                'desc' => '设置标准的响应状态码,也可以只设置成功值,其他值均为失败',
+                'where'  => array('connect_id' => 'id'),
+            ),
+
+            'sign_method' => 'radio',
+            'sign_col' => array
+            (
+                'desc' => '按顺序做加密,用+号隔开,为空则所有字段均参与加密',
+            ),
+            'sign_type' => 'radio',
+            'sign_sort' => 'radio',
+            'sign_encode' => array
+            (
+                'type' => 'radio',
+                'desc' => '如果签名中包含有特殊字符,是否进行转码',
+            ),
+            'sign_empty' => array
+            (
+                'type' => 'radio',
+                //'desc' => '如果签名中有空值,是否参与加密',
+            ),
+            'sign_after' => 'radio',
+
+            'ssl_method' => array
+            (
+                'desc' => '如AES、DES等,直接填写加密方式的值',
+            ),
+            'ssl_key',
+            'ssl_option' => 'radio',
+            'ssl_iv',
+            'ssl_after' => 'radio',
+
+            'connect/api' => array
+            (
+                'name' => '接口列表',
+                'where'  => array('connect_id' => 'id'),
+            ),
+        ),
+
+        'control' => array
+        (
+            'post_method' => array
+            (
+                'method' => 2,
+            ),
+        ),
+    ),
+);

+ 12 - 0
src/bao/connect/table/manage/convert.php

@@ -0,0 +1,12 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'before',
+            'after',
+        ),
+    ),
+);

+ 23 - 0
src/bao/connect/table/manage/core.php

@@ -0,0 +1,23 @@
+<?php
+return array
+(
+    'menu' => array
+    (
+        'connect_info' => array
+        (
+            'parent'    => 'supplier',
+            'name'      => '通信规则',
+            'icon'      => 'tools-line',
+            'sort'      => '10',
+        ),
+
+        'connect_api' => array
+        (
+            'parent'    => 'supplier',
+            'name'      => '通信接口',
+            'icon'      => 'amazon-line',
+            'sort'      => '10',
+            'show'      => 2,
+        ),
+    ),
+);

+ 13 - 0
src/bao/connect/table/manage/request_body.php

@@ -0,0 +1,13 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'key',
+            'default',
+            'type',
+        ),
+    ),
+);

+ 2 - 0
src/bao/connect/table/manage/request_header.php

@@ -0,0 +1,2 @@
+<?php
+return include('request_body.php');

+ 12 - 0
src/bao/connect/table/manage/response_code.php

@@ -0,0 +1,12 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'value',
+            'type',
+        ),
+    ),
+);

+ 39 - 0
src/bao/connect/table/request_body.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '请求参数配置',
+    'struct' => array
+    (
+        'connect_id' => array
+        (
+            'name'      => '通信规则id',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'default' => array
+        (
+            'name'      => '默认值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 39 - 0
src/bao/connect/table/request_header.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '请求参数配置',
+    'struct' => array
+    (
+        'connect_id' => array
+        (
+            'name'      => '通信规则id',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '参数标识',
+            'type'      => 'varchar(150)',
+        ),
+
+        'default' => array
+        (
+            'name'      => '默认值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '字符串',
+                2 => '数值',
+                3 => 'JSON',
+                4 => '对称加密',
+            ),
+        ),
+    ),
+);

+ 31 - 0
src/bao/connect/table/response_code.php

@@ -0,0 +1,31 @@
+<?php
+return array
+(
+    'name' => '响应状态码列表',
+    'struct' => array
+    (
+        'connect_id' => array
+        (
+            'name'      => '通信规则id',
+            'type'      => 'int(11)',
+        ),
+
+        'value' => array
+        (
+            'name'      => '返回码值',
+            'type'      => 'varchar(150)',
+        ),
+
+        'type' => array
+        (
+            'name'      => '参数类型',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+            'value'     => array
+            (
+                1 => '成功',
+                2 => '失败',
+            ),
+        ),
+    ),
+);

+ 43 - 0
src/dai/channel/api/Manage.php

@@ -0,0 +1,43 @@
+<?php namespace Channel\Api;
+use Dever;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    # 获取渠道下的商品
+    public function getGoods($value = false)
+    {
+        if (!$value) {
+            $result['goods_id']['option'] = array();
+            return $result;
+        }
+        $result = array();
+        $goods = Dever::db('goods', 'channel')->select(array('channel_id' => $value))->fetchAll();
+        if ($goods) {
+            $option = array();
+            foreach ($goods as $k => $v) {
+                $option[] = Dever::db('info', 'goods')->find($v['goods_id']);
+            }
+            $result['goods_id']['option'] = $option;
+        }
+        return $result;
+    }
+
+    # 获取商品下规格
+    public function getSku($value = false)
+    {
+        if (!$value) {
+            $result['goods_id']['option'] = array();
+            return $result;
+        }
+        $result = array();
+        $goods = Dever::db('goods', 'channel')->select(array('channel_id' => $value))->fetchAll();
+        if ($goods) {
+            $option = array();
+            foreach ($goods as $k => $v) {
+                $option[] = Dever::db('info', 'goods')->find($v['goods_id']);
+            }
+            $result['goods_id']['option'] = $option;
+        }
+        return $result;
+    }
+}

+ 5 - 0
src/dai/channel/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'channel');
+define('DEVER_APP_LANG', '渠道管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../../boot.php');

+ 11 - 0
src/dai/channel/lib/Manage.php

@@ -0,0 +1,11 @@
+<?php namespace Channel\Lib;
+use Dever;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    # 获取渠道列表
+    public function getInfo()
+    {
+        return Dever::db('info', 'channel')->select(array('status' => 1))->fetchAll();
+    }
+}

+ 43 - 0
src/dai/channel/table/goods.php

@@ -0,0 +1,43 @@
+<?php
+return array
+(
+    'name' => '渠道商品表',
+    'struct' => array
+    (
+        'channel_id' => array
+        (
+            'name'      => '渠道id',
+            'type'      => 'int(11)',
+        ),
+
+        'goods' => array
+        (
+            'name'      => '商品分类+商品id',
+            'type'      => 'varchar(100)',
+        ),
+
+        'goods_id' => array
+        (
+            'name'      => '商品id',
+            'type'      => 'int(11)',
+        ),
+
+        'sku_id' => array
+        (
+            'name'      => 'SKUid',
+            'type'      => 'int(11)',
+        ),
+
+        'code' => array
+        (
+            'name'      => '商品编码',
+            'type'      => 'varchar(200)',
+        ),
+
+        'discount' => array
+        (
+            'name'      => '折扣',
+            'type'      => 'varchar(200)',
+        ),
+    ),
+);

+ 51 - 0
src/dai/channel/table/info.php

@@ -0,0 +1,51 @@
+<?php
+return array
+(
+    'name' => '渠道表',
+    'order' => 'status asc',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '渠道名称',
+            'type'      => 'varchar(32)',
+        ),
+
+        'connect_id' => array
+        (
+            'name'      => '通信规则',
+            'type'      => 'int(11)',
+            'value'     => 'connect/info',
+        ),
+
+        'appkey' => array
+        (
+            'name'      => 'appkey',
+            'type'      => 'varchar(100)',
+        ),
+
+        'appsecret' => array
+        (
+            'name'      => 'appsecret',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'host' => array
+        (
+            'name'      => '主机域名',
+            'type'      => 'varchar(2000)',
+        ),
+        
+        'status' => array
+        (
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '开启',
+                2 => '禁用',
+            ),
+        ),
+    ),
+);

+ 28 - 0
src/dai/channel/table/manage/core.php

@@ -0,0 +1,28 @@
+<?php
+return array
+(
+    'menu' => array
+    (
+        'dai' => array
+        (
+            'name' => '角色',
+            'icon' => 'contacts-line',
+            'sort' => '1',
+            'system' => 'platform',
+        ),
+        'supplier' => array
+        (
+            'parent' => 'dai',
+            'name' => '供应商',
+            'icon' => 'compasses-line',
+            'sort' => '2',
+        ),
+        'info' => array
+        (
+            'parent'    => 'supplier',
+            'name'      => '渠道管理',
+            'icon'      => 'command-line',
+            'sort'      => '1',
+        ),
+    ),
+);

+ 41 - 0
src/dai/channel/table/manage/goods.php

@@ -0,0 +1,41 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'goods' => array
+            (
+                'name' => '商品',
+                'type' => 'cascader',
+                # 仅显示最后一级
+                //'all' => false,
+                'option'    => 'Dever::load("goods/manage.getGoods")',
+                'remote' => 'goods/manage.getSku',
+                # 无需默认值
+                'remote_default' => false,
+                'rules' => true,
+            ),
+            'goods_id' => array
+            (
+                'name' => '规格',
+                'type' => 'hidden',
+                'rules' => true,
+            ),
+            'sku_id' => array
+            (
+                'name' => '规格',
+                'type' => 'select',
+            ),
+            'code' => array
+            (
+                'type' => 'text',
+            ),
+            'discount' => array
+            (
+                'type' => 'text',
+            ),
+        ),
+    ),
+);

+ 49 - 0
src/dai/channel/table/manage/info.php

@@ -0,0 +1,49 @@
+<?php
+return array
+(
+    'list' => array
+    (
+        'field'      => array
+        (
+            'id',
+            'name',
+            'connect_id',
+            'host',
+            'status' => array
+            (
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ),
+        ),
+        'data_button' => array
+        (
+            '编辑' => 'edit',
+        ),
+        'button' => array
+        (
+            '新增' => 'add',
+        ),
+        'search' => array
+        (
+            'name',
+        ),
+    ),
+    'update' => array
+    (
+        'field'    => array
+        (
+            'name',
+            'connect_id',
+            'appkey',
+            'appsecret',
+            'host',
+            'channel/goods' => array
+            (
+                'name' => '商品设置',
+                'where'  => array('channel_id' => 'id'),
+            ),
+        ),
+    ),
+);

+ 10 - 0
src/dai/seller/api/Channel.php

@@ -0,0 +1,10 @@
+<?php namespace Seller\Api;
+use Dever;
+class Channel
+{
+    # 渠道回调
+    public function callback()
+    {
+        
+    }
+}

+ 129 - 0
src/dai/seller/api/Order.php

@@ -0,0 +1,129 @@
+<?php namespace Seller\Api;
+use Dever;
+class Order
+{
+    private $info;
+    public function test()
+    {
+        $token = $this->token();
+        $request = Dever::input();
+        return \Dever\Secure::get($request, $token);
+    }
+
+    # 队列提交订单 不做任何数据库操作
+    public function submit_secure(){}
+    public function submit_token(){return $this->token();}
+    public function submit()
+    {
+        # 余额保存在redis中
+        # 商户信息和折扣也保存在redis中
+        # 扣款
+        # 收单
+    }
+
+    # 直接提交订单
+    public function act_commit(){}
+    //public function act_secure(){}
+    //public function act_token(){return $this->token();}
+    public function act()
+    {
+        if (!$this->info) {
+            $this->token();
+        }
+        $code = Dever::input('code');
+        if (!$code) {
+            Dever::error('请传入商品编码');
+        }
+        $account = Dever::input('account');
+        if (!$account) {
+            Dever::error('请传入账号');
+        }
+        $order = Dever::input('order');
+        if (!$order) {
+            Dever::error('请传入订单号');
+        }
+
+        $sku = Dever::db('info_sku', 'goods')->find(array('code' => $code));
+        if (!$sku) {
+            Dever::error('商品编码不存在');
+        }
+        $goods = Dever::db('info', 'goods')->find($sku['info_id']);
+        if (!$goods) {
+            Dever::error('商品不存在');
+        }
+        if ($goods['status'] == 2) {
+            Dever::error('商品已下架');
+        }
+        $cate = Dever::db('cate', 'goods')->find($goods['cate_id']);
+        if ($cate && $cate['rule'] && !preg_match($cate['rule'], $account)) {
+            Dever::error($account . '不符合规则');
+        }
+
+        # 查询折扣
+        $seller_goods = Dever::db('goods', 'seller')->find(array('seller_id' => $this->info['id'], 'goods_id' => $sku['info_id'], 'sku_id' => $sku['id']));
+        if ($seller_goods && $seller_goods['discount'] > 0) {
+            $this->info['discount'] = $seller_goods['discount'];
+        }
+        $cash = round($sku['value'] * $this->info['discount'], 2);
+
+        # 查询余额是否充足,看看这里是否需要用redis
+        /* start */
+        $this->info['yue'] = $this->info['credit'] + $this->info['cash'];
+        if ($this->info['yue'] < $cash) {
+            Dever::error('余额不足');
+        }
+        $state = Dever::db('info', 'seller')->update(array('id' => $this->info['id']), array('cash' => array('-', $cash)));
+        /* end */
+
+        # 验证订单号
+        $check = Dever::db('order', 'seller')->find(array('seller_id' => $this->info['id'], 'seller_order_num' => $order));
+        if ($check) {
+            Dever::error('订单重复');
+        }
+
+        # 开始下单
+        $data['account'] = $account;
+        $data['goods_id'] = $sku['info_id'];
+        $data['sku_id'] = $sku['id'];
+        $data['num'] = 1;
+        $data['cash'] = $sku['value'];
+        $data['price'] = $cash;
+        $data['seller_id'] = $this->info['id'];
+        $data['seller_order_num'] = $order;
+        $data['seller_request'] = Dever::json_encode(Dever::input());
+        $order_num = Dever::load('order', 'seller')->add($data);
+
+        return array
+        (
+            'order_status' => 1,
+            'order_num' => $order_num,
+        );
+    }
+
+    # 查询订单
+
+    # 查询账户
+
+    private function token()
+    {
+        $appkey = Dever::input('appkey');
+        if (!$appkey) {
+            Dever::error('appkey错误');
+        }
+        $this->info = Dever::db('info', 'seller')->find(array('appkey' => $appkey));
+        if (!$this->info) {
+            Dever::error('商户不存在');
+        }
+        if ($this->info && $this->info['status'] == 2) {
+            Dever::error('商户已封禁');
+        }
+        return $this->info['appsecret'];
+    }
+
+    # 处理订单
+    public function handle()
+    {
+        Dever::load('order', 'seller')->handle();
+        return 'ok';
+    }
+}

+ 5 - 0
src/dai/seller/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'seller');
+define('DEVER_APP_LANG', '商户管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../../boot.php');

+ 27 - 0
src/dai/seller/lib/Manage.php

@@ -0,0 +1,27 @@
+<?php namespace Seller\Lib;
+use Dever;
+use Dever\Helper\Str;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    # 获取商户列表
+    public function getInfo()
+    {
+        return Dever::db('info', 'seller')->select(array('status' => 1))->fetchAll();
+    }
+
+    # 为商户生成appkey
+    public function createAppKey($data)
+    {
+        $info = Dever::db('info', 'seller')->find($data['id']);
+        if (!$info['appkey']) {
+            $update['appkey'] = 'app' . Str::rand(15, 0);
+            $update['appsecret'] = strtoupper(Str::rand(32));
+            $check = Dever::db('info', 'seller')->find(array('appkey' => $update['appkey']));
+            if ($check) {
+                return $this->createAppKey($data);
+            }
+            Dever::db('info', 'seller')->update($data['id'], $update);
+        }
+    }
+}

+ 113 - 0
src/dai/seller/lib/Order.php

@@ -0,0 +1,113 @@
+<?php namespace Seller\Lib;
+use Dever;
+use Dever\Helper\Str;
+class Order
+{
+    # 新增订单
+    public function add($data)
+    {
+        $data['order_num'] = $this->createOrder();
+        $id = Dever::db('order', 'seller')->insert($data);
+        if (!$id) {
+            Dever::error('下单失败');
+        }
+        return $data['order_num'];
+    }
+
+    # 处理已下单的订单
+    public function handle_commit(){}
+    public function handle()
+    {
+        $data = Dever::db('order', 'seller')->select(array('status' => 1), array('limit' => 100))->fetchAll();
+        foreach ($data as $k => $v) {
+            //Dever::db('order', 'seller')->update($v['id'], array('status' => 2));
+            $status = $this->handleItem($v);
+            if ($status) {
+                //Dever::db('order', 'seller')->update($v['id'], array('status' => $status));
+            }
+        }
+    }
+
+    private function handleItem($info, $selected = array())
+    {
+        # 查找渠道
+        $channel_list = Dever::db('channel', 'seller')->select(array('seller_id' => $info['seller_id'], 'goods_id' => $info['goods_id']))->fetchAll();
+        if (!$channel_list) {
+            return $this->notify($info, '通道未开启');
+        }
+        $channel = array();
+        foreach ($channel_list as $k => $v) {
+            if ($selected && isset($selected[$v['channel_id']])) {
+                continue;
+            }
+            if (!$v['sku_id']) {
+                $channel_sku = Dever::db('goods', 'channel')->find(array('channel_id' => $v['channel_id'], 'goods_id' => $info['goods_id'], 'sku_id' => $info['sku_id']));
+                if ($channel_sku) {
+                    $channel = $v['channel_id'];
+                    break;
+                }
+            } else {
+                $sku_id = explode(',', $v['sku_id']);
+                if (in_array($info['sku_id'], $sku_id)) {
+                    $channel = $v['channel_id'];
+                    break;
+                }
+            }
+        }
+        if (!$channel) {
+            return $this->notify($info, '通道未开启');
+        }
+
+        $channel = Dever::db('info', 'channel')->find($channel);
+        if (!$channel) {
+            return $this->notify($info, '通道未开启');
+        }
+        if ($channel['status'] == 2) {
+            return $this->notify($info, '通道未开启');
+        }
+
+        print_r($channel);die;
+
+        //向渠道发起请求 下单
+        Dever::load('func/api', 'connect')->add(1, $channel);
+
+        return false;
+    }
+
+    # 商户发起回调
+    public function notify($info, $msg, $other = array())
+    {
+        $status = 11;
+        if ($msg == 'ok') {
+            $status = 10;
+        }
+
+        # 获取商户回调地址,向商户发起回调
+        $seller_request = Dever::json_decode($info['seller_request']);
+        if (isset($seller_request['notify']) && $seller_request['notify']) {
+            $notify = $seller_request['notify'];
+            $param = array();
+            $param['seller_order_num'] = $info['seller_order_num'];
+            $param['order_num'] = $info['order_num'];
+            $param['order_status'] = $status;
+            $param['order_cash'] = $info['cash'];
+        }
+
+        if ($status == 11) {
+            # 失败,余额加回来
+            Dever::db('info', 'seller')->update(array('id' => $info['id']), array('cash' => array('+', $info['price'])));
+        }
+        return $status;
+    }
+
+    public function createOrder()
+    {
+        $where['order_num'] = Str::order('C');
+        $state = Dever::db('order', 'seller')->find($where);
+        if (!$state) {
+            return $where['order_num'];
+        } else {
+            return $this->createOrder();
+        }
+    }
+}

+ 39 - 0
src/dai/seller/table/channel.php

@@ -0,0 +1,39 @@
+<?php
+return array
+(
+    'name' => '商户渠道表',
+    'order' => 'sort asc',
+    'struct' => array
+    (
+        'seller_id' => array
+        (
+            'name'      => '商户id',
+            'type'      => 'int(11)',
+        ),
+
+        'channel_id' => array
+        (
+            'name'      => '渠道id',
+            'type'      => 'int(11)',
+        ),
+
+        'goods_id' => array
+        (
+            'name'      => '商品id',
+            'type'      => 'int(11)',
+        ),
+
+        'sort' => array
+        (
+            'name'      => '优先级',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ),
+
+        'sku_id' => array
+        (
+            'name'      => 'SKUid',
+            'type'      => 'varchar(2000)',
+        ),
+    ),
+);

+ 37 - 0
src/dai/seller/table/goods.php

@@ -0,0 +1,37 @@
+<?php
+return array
+(
+    'name' => '商户商品表',
+    'struct' => array
+    (
+        'seller_id' => array
+        (
+            'name'      => '商户id',
+            'type'      => 'int(11)',
+        ),
+
+        'goods' => array
+        (
+            'name'      => '商品分类+商品id',
+            'type'      => 'varchar(100)',
+        ),
+
+        'goods_id' => array
+        (
+            'name'      => '商品id',
+            'type'      => 'int(11)',
+        ),
+
+        'sku_id' => array
+        (
+            'name'      => 'SKUid',
+            'type'      => 'int(11)',
+        ),
+
+        'discount' => array
+        (
+            'name'      => '折扣',
+            'type'      => 'varchar(200)',
+        ),
+    ),
+);

+ 74 - 0
src/dai/seller/table/info.php

@@ -0,0 +1,74 @@
+<?php
+return array
+(
+    'name' => '商户表',
+    'order' => 'status asc',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '商户名称',
+            'type'      => 'varchar(32)',
+        ),
+
+        'discount' => array
+        (
+            'name'      => '默认折扣',
+            'type'      => 'varchar(200)',
+        ),
+
+        'appkey' => array
+        (
+            'name'      => 'appkey',
+            'type'      => 'varchar(100)',
+        ),
+
+        'appsecret' => array
+        (
+            'name'      => 'appsecret',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'cash'      => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '可用金额',
+        ),
+
+        'credit' => array
+        (
+            'name'      => '授信额度',
+            'type'      => 'decimal(11,2)',
+        ),
+
+        'p_cash'        => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '总充值金额',
+        ),
+
+        't_cash'        => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '总消耗金额',
+        ),
+
+        'lock' => array
+        (
+            'name'      => '乐观锁',
+            'type'      => 'int(11)',
+        ),
+        
+        'status' => array
+        (
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '开启',
+                2 => '禁用',
+            ),
+        ),
+    ),
+);

+ 37 - 0
src/dai/seller/table/manage/channel.php

@@ -0,0 +1,37 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'channel_id' => array
+            (
+                'name' => '渠道',
+                'type' => 'select',
+                'option'    => 'Dever::load("channel/manage.getInfo")',
+                'remote' => 'channel/manage.getGoods',
+                # 无需默认值
+                'remote_default' => false,
+            ),
+            'goods_id' => array
+            (
+                'name' => '商品',
+                'type' => 'select',
+                'remote' => 'goods/manage.getSku',
+            ),
+            'sort' => array
+            (
+                'type' => 'text',
+                'rules' => true,
+            ),
+            'sku_id' => array
+            (
+                'name' => '规格-不选择则拥有所有规格',
+                'type' => 'select',
+                'clearable' => true,
+                'multiple' => true,
+            ),
+        ),
+    ),
+);

+ 43 - 0
src/dai/seller/table/manage/core.php

@@ -0,0 +1,43 @@
+<?php
+return array
+(
+    'menu' => array
+    (
+        'dealer' => array
+        (
+            'parent' => 'dai',
+            'name' => '经销商',
+            'icon' => 'exchange-line',
+            'sort' => '1',
+        ),
+        'info' => array
+        (
+            'parent'    => 'dealer',
+            'name'      => '商户管理',
+            'icon'      => 'mickey-line',
+            'sort'      => '1',
+        ),
+
+        'data' => array
+        (
+            'name' => '数据',
+            'icon' => 'database-line',
+            'sort' => '1',
+            'system' => 'platform',
+        ),
+        'order' => array
+        (
+            'parent' => 'data',
+            'name' => '订单管理',
+            'icon' => 'order-play-line',
+            'sort' => '1',
+        ),
+        'order_list' => array
+        (
+            'parent'    => 'order',
+            'name'      => '订单列表',
+            'icon'      => 'album-line',
+            'sort'      => '1',
+        ),
+    ),
+);

+ 37 - 0
src/dai/seller/table/manage/goods.php

@@ -0,0 +1,37 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'goods' => array
+            (
+                'name' => '商品',
+                'type' => 'cascader',
+                # 仅显示最后一级
+                //'all' => false,
+                'option'    => 'Dever::load("goods/manage.getGoods")',
+                'remote' => 'goods/manage.getSku',
+                # 无需默认值
+                'remote_default' => false,
+                'rules' => true,
+            ),
+            'goods_id' => array
+            (
+                'name' => '规格',
+                'type' => 'hidden',
+                'rules' => true,
+            ),
+            'sku_id' => array
+            (
+                'name' => '规格',
+                'type' => 'select',
+            ),
+            'discount' => array
+            (
+                'type' => 'text',
+            ),
+        ),
+    ),
+);

+ 80 - 0
src/dai/seller/table/manage/info.php

@@ -0,0 +1,80 @@
+<?php
+return array
+(
+    'list' => array
+    (
+        'field'      => array
+        (
+            'id',
+            'name',
+            'discount',
+            'cash' => array
+            (
+                'name' => '余额 / 授信 / 充值',
+                'type' => 'show',
+                'show' => '"{cash}/{credit}/{p_cash}"',
+            ),
+            'status' => array
+            (
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ),
+        ),
+        'data_button' => array
+        (
+            '编辑' => array('fastedit', 'name,credit,discount'),
+            '渠道设置' => array('edit', 'seller/channel', 'Operation'),
+            '折扣设置' => array('edit', 'seller/goods', 'Odometer'),
+            '查看账户' => array('fastedit', 'doc,host,appkey,appsecret', 'View'),
+        ),
+        'button' => array
+        (
+            '新增' => array('fastadd', 'name,credit,discount'),
+        ),
+        'search' => array
+        (
+            'name',
+        ),
+    ),
+    'update' => array
+    (
+        'field'    => array
+        (
+            'doc' => array
+            (
+                'name' => '接口文档',
+                'type' => 'show',
+                'default' => 'http://www.docway.net/project/1euEYXnqSa9/1euEYZQ2rUu',
+            ),
+            'host' => array
+            (
+                'name' => '接口域名',
+                'type' => 'show',
+                'default' => Dever::host(),
+            ),
+            'appkey' => 'show',
+            'appsecret' => 'show',
+            'name',
+            'credit',
+            'discount' => array
+            (
+                'desc' => '直接填写折扣数值,如0.98',
+            ),
+            'seller/channel' => array
+            (
+                'name' => '渠道设置',
+                'where'  => array('seller_id' => 'id'),
+            ),
+            'seller/goods' => array
+            (
+                'name' => '折扣设置',
+                'desc' => '设置之后,默认折扣将失效',
+                'where'  => array('seller_id' => 'id'),
+                'show' => false,
+            ),
+        ),
+        'end' => 'seller/manage.createAppKey',
+    ),
+);

+ 75 - 0
src/dai/seller/table/manage/order_list.php

@@ -0,0 +1,75 @@
+<?php
+return array
+(
+    'source' => 'seller/order',
+    'list' => array
+    (
+        'field'      => array
+        (
+            'order_num',
+            'account',
+            'cash',
+            //'num',
+            //'price',
+            'seller_id',
+            'seller_order_num',
+            //'channel_id',
+            'status',
+            /*
+            'channel_callback_date' => array
+            (
+                'name' => '回调时间',
+                'type' => 'show',
+                'show' => '{channel_callback_date} > 0 ? date("Y-m-d H:i", {channel_callback_date}) : "-"',
+            ),*/
+            'cdate' => array
+            (
+                'name' => '下单时间',
+            ),
+        ),
+        'data_button' => array
+        (
+            
+        ),
+        'button' => array
+        (
+            
+        ),
+        'search' => array
+        (
+            'status',
+            'seller_id' => array
+            (
+                'name' => '选择商户',
+            ),
+            'channel_id' => array
+            (
+                'name' => '选择渠道',
+            ),
+            'order_num',
+            'seller_order_num',
+            'channel_order_num',
+            'account',
+            'channel_callback_date' => array
+            (
+                'name' => '回调时间',
+                'type' => 'date',
+                'date_type' => 'datetimerange',
+                'value_format' => 'YYYY-MM-DD HH:mm:ss',
+                'start_placeholder' => '开始回调时间',
+                'end_placeholder' => '结束回调时间',
+                'range_separator' => '至',
+            ),
+            'cdate' => array
+            (
+                'name' => '下单时间',
+                'type' => 'date',
+                'date_type' => 'datetimerange',
+                'value_format' => 'YYYY-MM-DD HH:mm:ss',
+                'start_placeholder' => '开始下单时间',
+                'end_placeholder' => '结束下单时间',
+                'range_separator' => '至',
+            ),
+        ),
+    ),
+);

+ 157 - 0
src/dai/seller/table/order.php

@@ -0,0 +1,157 @@
+<?php
+return array
+(
+    'name' => '商户订单表',
+    'struct' => array
+    (
+        'order_num' => array
+        (
+            'name'      => '系统订单号',
+            'type'      => 'varchar(100)',
+        ),
+
+        'account' => array
+        (
+            'name'      => '充值账号',
+            'type'      => 'varchar(100)',
+        ),
+
+        'goods_id' => array
+        (
+            'name'      => '商品id',
+            'type'      => 'int(11)',
+        ),
+
+        'sku_id' => array
+        (
+            'name'      => '规格id',
+            'type'      => 'int(11)',
+        ),
+
+        'num'        => array
+        (
+            'type'      => 'int(11)',
+            'name'      => '总数量',
+        ),
+
+        'cash'      => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '总面值',
+        ),
+
+        'price'      => array
+        (
+            'type'      => 'decimal(11,2)',
+            'name'      => '实付金额',
+        ),
+
+        'seller_id' => array
+        (
+            'name'      => '商户',
+            'type'      => 'int(11)',
+            'value'     => 'seller/info',
+        ),
+
+        'seller_order_num' => array
+        (
+            'name'      => '商户订单号',
+            'type'      => 'varchar(100)',
+        ),
+
+        'seller_request' => array
+        (
+            'name'      => '商户请求数据',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'seller_callback' => array
+        (
+            'name'      => '商户回调数据',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'seller_callback_date' => array
+        (
+            'name'      => '商户回调时间',
+            'type'      => 'int(11)',
+        ),
+
+        'seller_callback_num' => array
+        (
+            'name'      => '商户回调次数',
+            'type'      => 'int(11)',
+        ),
+
+        'channel_id' => array
+        (
+            'name'      => '渠道',
+            'type'      => 'int(11)',
+            'value'     => 'channel/info',
+        ),
+
+        'channel_order_num' => array
+        (
+            'name'      => '渠道订单号',
+            'type'      => 'varchar(100)',
+        ),
+
+        'channel_request' => array
+        (
+            'name'      => '渠道请求数据',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'channel_response' => array
+        (
+            'name'      => '渠道响应数据',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'channel_callback' => array
+        (
+            'name'      => '渠道回调数据',
+            'type'      => 'varchar(2000)',
+        ),
+
+        'channel_callback_date' => array
+        (
+            'name'      => '渠道回调时间',
+            'type'      => 'int(11)',
+        ),
+
+        'official_order_num' => array
+        (
+            'name'      => '官方流水号',
+            'type'      => 'varchar(100)',
+        ),
+
+        'official_msg' => array
+        (
+            'name'      => '官方充值结果',
+            'type'      => 'varchar(1000)',
+        ),
+
+        'status' => array
+        (
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '已下单',
+                2 => '处理中',
+                //3 => '队列中',
+                //4 => '失败待处理',
+                //5 => '已暂停',
+                10 => '成功',
+                11 => '失败',
+            ),
+        ),
+    ),
+
+    'index' => array
+    (
+        'search' => 'seller_id,channel_id,order_num,seller_order_num,channel_order_num,account,channel_callback_date,cdate',
+    ),
+);

+ 53 - 0
src/yuan/goods/api/Manage.php

@@ -0,0 +1,53 @@
+<?php namespace Goods\Api;
+use Dever;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    # 将sku中的key解析成前端可以读取的格式
+    public function keyToField($key)
+    {
+        if ($key != -1) {
+            $result = array();
+            $array = explode(',', $key);
+            $result['key']['set'] = array();
+            foreach ($array as $k => $v) {
+                $value = Dever::db('info_spec_value', 'goods')->find($v);
+                $spec = Dever::db('info_spec', 'goods')->find($value['spec_id']);
+                $result['key']['set']['s_' . $spec['id']] = array($spec['name'], $value['value']);
+            }
+            return $result;
+        }
+    }
+
+    # 获取规格
+    public function getSku($value = false)
+    {
+        if (is_array($value)) {
+            $value = end($value);
+        }
+        if (!$value) {
+            $result['sku_id']['option'] = array();
+            return $result;
+        }
+        $result = array();
+        $result['goods_id']['value'] = $value;
+        $sku = Dever::db('info_sku', 'goods')->select(array('info_id' => $value))->fetchAll();
+        if ($sku) {
+            $option = array();
+            foreach ($sku as $k => $v) {
+                if ($v['key'] != -1) {
+                    $spec = Dever::db('info_spec_value', 'goods')->find(array('id' => array('in', $v['key'])), array('col' => 'id,group_concat(value) as name', 'group' => 'info_id'));
+                    if ($spec) {
+                        $spec['id'] = $v['id'];
+                        $option[] = $spec;
+                    }
+                } else {
+                    $option = array();
+                }
+            }
+            $result['sku_id']['option'] = $option;
+        }
+        
+        return $result;
+    }
+}

+ 5 - 0
src/yuan/goods/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'goods');
+define('DEVER_APP_LANG', '商品库');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../../boot.php');

+ 57 - 0
src/yuan/goods/lib/Manage.php

@@ -0,0 +1,57 @@
+<?php namespace Goods\Lib;
+use Dever;
+use Manage\Lib\Auth;
+class Manage extends Auth
+{
+    # 获取规格数据
+    public function spec($info_id)
+    {
+        $result = array();
+        if ($info_id) {
+            $result = Dever::db('info_spec', 'goods')->select(array('info_id' => $info_id))->fetchAll();
+            if ($result) {
+                foreach ($result as $k => $v) {
+                    $result[$k]['type'] = 'show';
+                    $result[$k]['width'] = '100';
+                    $result[$k]['show'] = true;
+                    $result[$k]['fixed'] = true;
+                    $result[$k]['key'] = $v['name'];
+                    $value = Dever::db('info_spec_value', 'goods')->select(array('info_id' => $info_id, 'spec_id' => $v['id']))->fetchAll();
+                    if ($value) {
+                        foreach ($value as $k1 => $v1) {
+                            $value[$k1]['parent'] = $result[$k]['key'];
+                            $value[$k1]['name'] = $v1['value'];
+                            $value[$k1]['key'] = $v1['value'];
+                            if ($v1['is_checked'] == 1) {
+                                $value[$k1]['checked'] = true;
+                            } else {
+                                $value[$k1]['checked'] = false;
+                            }
+                        }
+                    }
+                    $result[$k]['value'] = $value;
+                }
+            }
+        }
+        return $result;
+    }
+
+    # 获取商品
+    public function getGoods()
+    {
+        $cate = Dever::db('cate', 'goods')->select([])->fetchAll();
+        $result = array();
+        foreach ($cate as $k => $v) {
+            $goods = Dever::db('info', 'goods')->select(array('cate_id' => $v['id']))->fetchAll();
+            if ($goods) {
+                $result[] = array
+                (
+                    'id' => $v['id'],
+                    'name' => $v['name'],
+                    'children' => $goods,
+                );
+            }
+        }
+        return $result;
+    }
+}

+ 6 - 0
src/yuan/goods/lib/Spec.php

@@ -0,0 +1,6 @@
+<?php namespace Goods\Lib;
+use Dever;
+class Spec
+{
+    
+}

+ 34 - 0
src/yuan/goods/table/cate.php

@@ -0,0 +1,34 @@
+<?php
+return array
+(
+    'name' => '商品分类表',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '分类名称',
+            'type'      => 'varchar(32)',
+        ),
+        'key' => array
+        (
+            'name'      => '分类标识',
+            'type'      => 'varchar(32)',
+        ),
+        'rule' => array
+        (
+            'name'      => '验证正则',
+            'type'      => 'varchar(200)',
+        ),
+    ),
+    'default' => array
+    (
+        'field' => 'name,`key`,rule',
+        'value' => array
+        (
+            '"话费","hf","/^1\d{10}$/"',
+            '"中石化","zsh","/^1\d{18}$/"',
+            '"中石油","zsy","/^(?:7|9)\d{15}$/"',
+        ),
+        'num' => 1,
+    ),
+);

+ 44 - 0
src/yuan/goods/table/info.php

@@ -0,0 +1,44 @@
+<?php
+return array
+(
+    'name' => '商品表',
+    'struct' => array
+    (
+        'name' => array
+        (
+            'name'      => '商品标题',
+            'type'      => 'varchar(32)',
+        ),
+
+        'cate_id' => array
+        (
+            'name'      => '商品分类',
+            'type'      => 'int(11)',
+            'value'     => 'goods/cate',
+        ),
+
+        'spec_type' => array
+        (
+            'name'      => '规格类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '单规格',
+                2 => '多规格',
+            ),
+        ),
+        
+        'status' => array
+        (
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '上架',
+                2 => '下架',
+            ),
+        ),
+    ),
+);

+ 38 - 0
src/yuan/goods/table/info_sku.php

@@ -0,0 +1,38 @@
+<?php
+return array
+(
+    'name' => '商品SKU设置',
+    'struct' => array
+    (
+        'info_id' => array
+        (
+            'name'      => '商品ID',
+            'type'      => 'int(11)',
+        ),
+
+        'key' => array
+        (
+            'name'      => '规格ID',
+            'type'      => 'varchar(500)',
+        ),
+
+        'code' => array
+        (
+            'name'      => '商品编码',
+            'type'      => 'varchar(100)',
+        ),
+
+        'value' => array
+        (
+            'name'      => '面值',
+            'type'      => 'decimal(11,2)',
+        ),
+
+        'state' => array
+        (
+            'name'      => '数据状态',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+        ),
+    ),
+);

+ 32 - 0
src/yuan/goods/table/info_spec.php

@@ -0,0 +1,32 @@
+<?php
+return array
+(
+    'name' => '商品规格设置',
+    'order' => 'sort asc',
+    'struct' => array
+    (
+        'info_id' => array
+        (
+            'name'      => '商品ID',
+            'type'      => 'int(11)',
+        ),
+        'name' => array
+        (
+            'name'      => '规格名称',
+            'type'      => 'varchar(200)',
+        ),
+
+        'sort' => array
+        (
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ),
+        'state' => array
+        (
+            'name'      => '数据状态',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+        ),
+    ),
+);

+ 47 - 0
src/yuan/goods/table/info_spec_value.php

@@ -0,0 +1,47 @@
+<?php
+return array
+(
+    'name' => '商品规格值设置',
+    'order' => 'sort asc',
+    'struct' => array
+    (
+        'info_id' => array
+        (
+            'name'      => '商品ID',
+            'type'      => 'int(11)',
+        ),
+        'spec_id' => array
+        (
+            'name'      => '规格ID',
+            'type'      => 'int(11)',
+        ),
+        'value' => array
+        (
+            'name'      => '规格值',
+            'type'      => 'varchar(500)',
+        ),
+        'is_checked' => array
+        (
+            'name'      => '是否选中',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => array
+            (
+                1 => '选中',
+                2 => '未选中',
+            )
+        ),
+        'sort' => array
+        (
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ),
+        'state' => array
+        (
+            'name'      => '数据状态',
+            'type'      => 'tinyint(1)',
+            'default'   => '1',
+        ),
+    ),
+);

+ 35 - 0
src/yuan/goods/table/manage/core.php

@@ -0,0 +1,35 @@
+<?php
+return array
+(
+    'menu' => array
+    (
+        'yuan' => array
+        (
+            'name' => '资源',
+            'icon' => 'apps-2-line',
+            'sort' => '1',
+            'system' => 'platform',
+        ),
+        'goods' => array
+        (
+            'parent' => 'yuan',
+            'name' => '商品库',
+            'icon' => 'inbox-line',
+            'sort' => '1',
+        ),
+        'info' => array
+        (
+            'parent'    => 'goods',
+            'name'      => '商品列表',
+            'icon'      => 'honour-line',
+            'sort'      => '1',
+        ),
+        'cate' => array
+        (
+            'parent'    => 'goods',
+            'name'      => '商品分类',
+            'icon'      => 'archive-line',
+            'sort'      => '2',
+        ),
+    ),
+);

+ 95 - 0
src/yuan/goods/table/manage/info.php

@@ -0,0 +1,95 @@
+<?php
+return array
+(
+    'list' => array
+    (
+        'field'      => array
+        (
+            'name',
+            'cate_id',
+            'status' => array
+            (
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ),
+            'cdate',
+        ),
+        'search'      => array
+        (
+            'name' => 'like',
+            'cdate' => array
+            (
+                'name' => '创建时间',
+                'type' => 'date',
+                'date_type' => 'datetimerange',
+                'value_format' => 'YYYY-MM-DD HH:mm:ss',
+                'start_placeholder' => '开始日期',
+                'end_placeholder' => '结束日期',
+                'range_separator' => '至',
+            ),
+        ),
+        'data_button' => array
+        (
+            '编辑' => 'edit',
+        ),
+        'button' => array
+        (
+            '新增' => 'add',
+        ),
+    ),
+    'update' => array
+    (
+        'field'    => array
+        (
+            'name',
+            'cate_id' => 'radio',
+            'spec_type' => array
+            (
+                'type' => 'radio',
+                'control' => true,
+            ),
+            'goods/info_sku' => array
+            (
+                'name' => '单规格设置',
+                'where'  => array('info_id' => 'id', 'key' => '-1'),
+                # 默认值,如果有默认值则无法添加和删除
+                'default' => array
+                (
+                    # 默认值
+                    array
+                    (
+                        'code' => '',
+                        'value' => '',
+                    ),
+                ),
+            ),
+
+            'goods/info_sku#' => array
+            (
+                'name' => '多规格设置',
+                'where' => array('info_id' => 'id', 'key' => array('!=', '-1')),
+                'type' => 'sku',
+                # 设置规格表名
+                'spec' => 'goods/info_spec',
+                # 设置规格表关联字段
+                'spec_field' => 'info_id',
+                # 获取规格数据的接口
+                'spec_data' => 'goods/manage.spec',
+            ),
+        ),
+        'control' => array
+        (
+            'goods/info_sku' => array
+            (
+                'spec_type' => 1,
+            ),
+
+            'goods/info_sku#' => array
+            (
+                'spec_type' => 2,
+            ),
+        ),
+    ),
+);

+ 26 - 0
src/yuan/goods/table/manage/info_sku.php

@@ -0,0 +1,26 @@
+<?php
+return array
+(
+    'update' => array
+    (
+        'field'    => array
+        (
+            'key' => array
+            (
+                'type' => 'hidden',
+                'remote' => 'goods/manage.keyToField',
+            ),
+            'code' => array
+            (
+                'type' => 'text',
+                'rules' => true,
+            ),
+            'value' => array
+            (
+                'type' => 'text',
+                'rules' => true,
+            ),
+        ),
+        'check' => 'code',
+    ),
+);