From f5e792dbe08809217aa600cd165cf4b13d3d7fe1 Mon Sep 17 00:00:00 2001
From: sugar1569
Date: Mon, 24 Dec 2018 15:15:30 +0800
Subject: [PATCH 01/12] =?UTF-8?q?=E5=8D=87=E7=BA=A7form=5Fbuider=201.2.7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
composer.lock | 26 ++++---
vendor/composer/installed.json | 24 +++----
vendor/xaboy/form-builder/README.md | 11 ++-
vendor/xaboy/form-builder/src/Form.php | 68 +++++++++++++++----
vendor/xaboy/form-builder/src/Helper.php | 5 +-
vendor/xaboy/form-builder/src/Json.php | 8 +--
.../form-builder/src/components/Cascader.php | 16 ++---
.../form-builder/src/components/Checkbox.php | 35 +++++-----
.../xaboy/form-builder/src/components/Col.php | 18 ++---
.../src/components/ColorPicker.php | 4 +-
.../src/components/DatePicker.php | 39 +++++++++--
.../form-builder/src/components/FormStyle.php | 11 +--
.../form-builder/src/components/Frame.php | 5 +-
.../form-builder/src/components/Hidden.php | 2 +
.../form-builder/src/components/Input.php | 9 ++-
.../src/components/InputNumber.php | 5 +-
.../form-builder/src/components/Option.php | 8 ++-
.../form-builder/src/components/Radio.php | 6 +-
.../form-builder/src/components/Rate.php | 5 +-
.../xaboy/form-builder/src/components/Row.php | 6 +-
.../form-builder/src/components/Select.php | 14 ++--
.../form-builder/src/components/Slider.php | 7 +-
.../form-builder/src/components/Switches.php | 7 +-
.../src/components/TimePicker.php | 22 +++++-
.../form-builder/src/components/Tree.php | 27 ++++----
.../form-builder/src/components/TreeData.php | 16 +++--
.../form-builder/src/components/Upload.php | 13 ++--
.../form-builder/src/components/Validate.php | 44 +++++++++---
.../src/exception/FormBuilderException.php | 20 ++++++
.../src/interfaces/FormComponentInterFace.php | 2 +
.../src/traits/component/CallPropsTrait.php | 9 ++-
.../component/ComponentOptionsTrait.php | 22 +++---
.../src/traits/form/FormCascaderTrait.php | 28 ++++----
.../src/traits/form/FormCheckBoxTrait.php | 7 +-
.../src/traits/form/FormColorPickerTrait.php | 7 +-
.../src/traits/form/FormDatePickerTrait.php | 57 ++++++++++++----
.../src/traits/form/FormFrameTrait.php | 63 +++++++++++------
.../src/traits/form/FormHiddenTrait.php | 3 +
.../src/traits/form/FormInputNumberTrait.php | 7 +-
.../src/traits/form/FormInputTrait.php | 44 ++++++++----
.../src/traits/form/FormOptionTrait.php | 10 ++-
.../src/traits/form/FormRadioTrait.php | 7 +-
.../src/traits/form/FormRateTrait.php | 11 +--
.../src/traits/form/FormSelectTrait.php | 19 ++++--
.../src/traits/form/FormSliderTrait.php | 13 ++--
.../src/traits/form/FormStyleTrait.php | 19 ++++--
.../src/traits/form/FormSwitchesTrait.php | 7 +-
.../src/traits/form/FormTimePickerTrait.php | 29 +++++---
.../src/traits/form/FormTreeTrait.php | 31 ++++++---
.../src/traits/form/FormUploadTrait.php | 49 ++++++++-----
.../src/traits/form/FormValidateTrait.php | 35 ++++++++++
.../form-builder/src/view/formScript.php | 10 +--
52 files changed, 664 insertions(+), 306 deletions(-)
create mode 100644 vendor/xaboy/form-builder/src/exception/FormBuilderException.php
diff --git a/composer.lock b/composer.lock
index 0e28e20a..c9dcd42d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "3dd0118e5d08ef728cb0c2f4f7de15a5",
+ "content-hash": "ae2e50326d8e83fd299c3350bb0f87d1",
"packages": [
{
"name": "doctrine/cache",
@@ -1078,16 +1078,16 @@
},
{
"name": "tp5er/tp5-databackup",
- "version": "dev-master",
+ "version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/tp5er/tp5-databackup.git",
- "reference": "101477abe810fb91bad5c1304a93c5f461db6dc8"
+ "reference": "10abd4383cf78844e1c22584fd823ef1d18e75dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tp5er/tp5-databackup/zipball/101477abe810fb91bad5c1304a93c5f461db6dc8",
- "reference": "101477abe810fb91bad5c1304a93c5f461db6dc8",
+ "url": "https://api.github.com/repos/tp5er/tp5-databackup/zipball/10abd4383cf78844e1c22584fd823ef1d18e75dc",
+ "reference": "10abd4383cf78844e1c22584fd823ef1d18e75dc",
"shasum": ""
},
"require": {
@@ -1110,20 +1110,20 @@
}
],
"description": "Implement the database backup restore",
- "time": "2018-04-07T11:20:53+00:00"
+ "time": "2017-12-29T05:36:58+00:00"
},
{
"name": "xaboy/form-builder",
- "version": "1.2.5",
+ "version": "1.2.7",
"source": {
"type": "git",
"url": "https://github.com/xaboy/form-builder.git",
- "reference": "73cb5be3d9f57680f64d01ab424c4ac5c462f1b8"
+ "reference": "43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/xaboy/form-builder/zipball/73cb5be3d9f57680f64d01ab424c4ac5c462f1b8",
- "reference": "73cb5be3d9f57680f64d01ab424c4ac5c462f1b8",
+ "url": "https://api.github.com/repos/xaboy/form-builder/zipball/43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf",
+ "reference": "43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf",
"shasum": ""
},
"require": {
@@ -1148,15 +1148,13 @@
],
"description": "PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。",
"homepage": "https://github.com/xaboy/form-builder",
- "time": "2018-11-13T12:44:31+00:00"
+ "time": "2018-12-12T12:20:38+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": {
- "tp5er/tp5-databackup": 20
- },
+ "stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 9a7c4bed..add6e245 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1111,23 +1111,23 @@
},
{
"name": "tp5er/tp5-databackup",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/tp5er/tp5-databackup.git",
- "reference": "101477abe810fb91bad5c1304a93c5f461db6dc8"
+ "reference": "10abd4383cf78844e1c22584fd823ef1d18e75dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tp5er/tp5-databackup/zipball/101477abe810fb91bad5c1304a93c5f461db6dc8",
- "reference": "101477abe810fb91bad5c1304a93c5f461db6dc8",
+ "url": "https://api.github.com/repos/tp5er/tp5-databackup/zipball/10abd4383cf78844e1c22584fd823ef1d18e75dc",
+ "reference": "10abd4383cf78844e1c22584fd823ef1d18e75dc",
"shasum": ""
},
"require": {
"php": ">=5.4.0"
},
- "time": "2018-04-07T11:20:53+00:00",
+ "time": "2017-12-29T05:36:58+00:00",
"type": "library",
"installation-source": "source",
"autoload": {
@@ -1149,24 +1149,24 @@
},
{
"name": "xaboy/form-builder",
- "version": "1.2.5",
- "version_normalized": "1.2.5.0",
+ "version": "1.2.7",
+ "version_normalized": "1.2.7.0",
"source": {
"type": "git",
"url": "https://github.com/xaboy/form-builder.git",
- "reference": "73cb5be3d9f57680f64d01ab424c4ac5c462f1b8"
+ "reference": "43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/xaboy/form-builder/zipball/73cb5be3d9f57680f64d01ab424c4ac5c462f1b8",
- "reference": "73cb5be3d9f57680f64d01ab424c4ac5c462f1b8",
+ "url": "https://api.github.com/repos/xaboy/form-builder/zipball/43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf",
+ "reference": "43d5c0a8f1f1f0fc1f6430b827fbe2b7b0d5b5cf",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": ">=5.4.0"
},
- "time": "2018-11-13T12:44:31+00:00",
+ "time": "2018-12-12T12:20:38+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
diff --git a/vendor/xaboy/form-builder/README.md b/vendor/xaboy/form-builder/README.md
index 798c3e0d..c7c40b4a 100644
--- a/vendor/xaboy/form-builder/README.md
+++ b/vendor/xaboy/form-builder/README.md
@@ -21,12 +21,21 @@
PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及省市区三级联动、时间选择、日期选择、颜色选择、树型、文件/图片上传等功能。
-> 1.2.4 版本支持简单字段验证
+> 1.2.4 版本支持字段验证
#### 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢!
#### 本项目还在不断开发完善中,如有建议或问题请[在这里提出](https://github.com/xaboy/form-builder/issues/new)
+
+## 更新说明
+
+#### 1.2.7 (2018-12-12)
+- 完善时间选择组件,日期选择组件验证规则
+- 新增 fields 类型验证规则
+- 新增 使用 view 方法生成时,表单只能被创建一次
+- 修复一些小问题
+
## 安装
`composer require xaboy/form-builder`
diff --git a/vendor/xaboy/form-builder/src/Form.php b/vendor/xaboy/form-builder/src/Form.php
index 74ca2956..77af87ce 100644
--- a/vendor/xaboy/form-builder/src/Form.php
+++ b/vendor/xaboy/form-builder/src/Form.php
@@ -11,6 +11,7 @@ use FormBuilder\components\Cascader;
use FormBuilder\components\FormStyle;
use FormBuilder\components\Hidden;
use FormBuilder\components\Row;
+use FormBuilder\exception\FormBuilderException;
use FormBuilder\traits\form\FormCascaderTrait;
use FormBuilder\traits\form\FormCheckBoxTrait;
use FormBuilder\traits\form\FormColorPickerTrait;
@@ -33,6 +34,7 @@ use FormBuilder\traits\form\FormValidateTrait;
/**
* Class Form
+ *
* @package FormBuilder
*/
class Form
@@ -59,12 +61,14 @@ class Form
/**
* 三级联动 加载省市数据
+ *
* @var bool
*/
protected $loadCityData = false;
/**
* 三级联动 加载省市区数据
+ *
* @var bool
*/
protected $loadCityAreaData = false;
@@ -96,18 +100,21 @@ class Form
/**
* 加载 jquery
+ *
* @var bool
*/
protected $linkJq = true;
/**
* 加载 vue
+ *
* @var bool
*/
protected $linkVue = true;
/**
* 加载 iview
+ *
* @var bool
*/
protected $linkIview = true;
@@ -119,24 +126,28 @@ class Form
/**
* 网页标题
+ *
* @var string
*/
protected $title = 'formBuilder';
/**
* 提交地址
+ *
* @var string
*/
protected $action = '';
/**
* 表单id
+ *
* @var string
*/
protected $id = '';
/**
* 提交方式
+ *
* @var string
*/
protected $method = 'post';
@@ -147,6 +158,7 @@ class Form
/**
* 表单配置
+ *
* @var array|mixed
*/
protected $config = [
@@ -162,8 +174,9 @@ class Form
/**
* Form constructor.
+ *
* @param string $action 提交地址
- * @param array $components 组件
+ * @param array $components 组件
*/
public function __construct($action = '', array $components = [])
{
@@ -171,6 +184,11 @@ class Form
$this->action = $action;
}
+ public static function json()
+ {
+ return new Json();
+ }
+
/**
* @param bool $linkJq
*/
@@ -217,7 +235,7 @@ class Form
*/
public function components(array $components = [])
{
- foreach ($components as $component){
+ foreach ($components as $component) {
$this->append($component);
}
return $this;
@@ -254,6 +272,7 @@ class Form
/**
* 表单提交后成功执行的js地址
* formCreate.formSuccess(formData,$f)
+ *
* @param string $successScript
* @return $this
*/
@@ -292,6 +311,7 @@ class Form
/**
* 提交地址
+ *
* @param string $action
* @return $this
*/
@@ -315,7 +335,7 @@ class Form
*/
public function getConfig($key = '')
{
- if($key =='')
+ if ($key == '')
return $this->config;
else
return isset($this->config[$key]) ? $this->config[$key] : null;
@@ -323,6 +343,7 @@ class Form
/**
* 提交方式
+ *
* @param string $method
* @return $this
*/
@@ -334,6 +355,7 @@ class Form
/**
* 标题
+ *
* @return string
*/
public function getTitle()
@@ -354,13 +376,14 @@ class Form
/**
* 追加组件
+ *
* @param FormComponentDriver $component
* @return $this
*/
public function append(FormComponentDriver $component)
{
$field = $component->getField();
- if(!isset($this->components[$field]))
+ if (!isset($this->components[$field]))
$this->fields[] = $field;
$this->components[$field] = $component;
$this->checkLoadData($component);
@@ -369,13 +392,14 @@ class Form
/**
* 开头插入组件
+ *
* @param FormComponentDriver $component
* @return $this
*/
public function prepend(FormComponentDriver $component)
{
$field = $component->getField();
- if(!isset($this->components[$field]))
+ if (!isset($this->components[$field]))
array_unshift($this->fields, $field);
$this->components[$field] = $component;
$this->checkLoadData($component);
@@ -384,14 +408,15 @@ class Form
/**
* 是否需要引入省市区数据
+ *
* @param FormComponentDriver $component
*/
protected function checkLoadData(FormComponentDriver $component)
{
- if(
+ if (
$component instanceof Cascader
&& ($this->loadCityData == false || $this->loadCityAreaData == false)
- ){
+ ) {
$type = $component->getType();
if ($type == Cascader::TYPE_CITY)
$this->loadCityData = true;
@@ -402,18 +427,26 @@ class Form
/**
* 获得表单规则
+ *
* @return array
+ * @throws FormBuilderException
*/
public function getRules()
{
$rules = [];
+ $fields = [];
foreach ($this->fields as $field) {
$component = $this->components[$field];
if (!($component instanceof FormComponentDriver))
continue;
+ $field = $component->getField();
+ if (in_array($field, $fields))
+ throw new FormBuilderException($field . '字段已重复,请保证组件 field 无重复');
+
+ $fields[] = $field;
$rule = $component->build();
- if(!$component instanceof Hidden)
- $rule['validate'] = array_merge(isset($rule['validate']) ? $rule['validate'] : [],$component->validate()->build());
+ if (!$component instanceof Hidden)
+ $rule['validate'] = array_merge(isset($rule['validate']) ? $rule['validate'] : [], $component->validate()->build());
$rules[] = $rule;
}
return $rules;
@@ -422,6 +455,7 @@ class Form
/**
* 获取表单视图
+ *
* @return string
*/
public function view()
@@ -435,6 +469,7 @@ class Form
/**
* 获取表单生成器所需全部js
+ *
* @return array
*/
public function script()
@@ -444,6 +479,7 @@ class Form
/**
* 获取生成表单的js代码
+ *
* @return string
*/
public function formScript()
@@ -458,6 +494,7 @@ class Form
/**
* 获取表单生成器所需js
+ *
* @return array
*/
public function getScript()
@@ -470,19 +507,20 @@ class Form
$script[] = $_script['city-area-data'];
if ($this->loadCityData == true)
$script[] = $_script['city-data'];
- if($this->linkJq)
+ if ($this->linkJq)
$script[] = $_script['jq'];
- if($this->linkIview){
+ if ($this->linkIview) {
$script[] = $_script['iview'];
$script[] = $_script['iview-css'];
}
- if($this->linkVue)
+ if ($this->linkVue)
$script[] = $_script['vue'];
return array_reverse($script);
}
/**
* 是否隐藏提交按钮(默认显示)
+ *
* @param bool $isShow
* @return Form
*/
@@ -495,6 +533,7 @@ class Form
/**
* 是否隐藏重置按钮(默认隐藏)
+ *
* @param bool $isShow
* @return Form
*/
@@ -523,12 +562,13 @@ class Form
/**
* 生成表单快捷方法
+ *
* @param string $action
- * @param array $components
+ * @param array $components
* @return Form
*/
public static function create($action, array $components = [])
{
- return new static($action, $components);
+ return new self($action, $components);
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/Helper.php b/vendor/xaboy/form-builder/src/Helper.php
index be744dd3..450ff2c7 100644
--- a/vendor/xaboy/form-builder/src/Helper.php
+++ b/vendor/xaboy/form-builder/src/Helper.php
@@ -8,6 +8,8 @@
namespace FormBuilder;
+use FormBuilder\exception\FormBuilderException;
+
class Helper
{
public static function toType($var, $type = 'string')
@@ -42,6 +44,7 @@ class Helper
return "unknown type";
}
+
public static function verifyType($var, $verify, $title = '')
{
if (!is_array($verify)) $verify = [$verify];
@@ -51,7 +54,7 @@ class Helper
}
$type = self::getVarType($var);
if (!in_array($type, $verify))
- throw new \Exception($title . '类型需为' . implode(',', $verify));
+ throw new FormBuilderException($title . '类型需为' . implode(',', $verify));
}
public static function getDate($date)
diff --git a/vendor/xaboy/form-builder/src/Json.php b/vendor/xaboy/form-builder/src/Json.php
index a999015e..24a123a3 100644
--- a/vendor/xaboy/form-builder/src/Json.php
+++ b/vendor/xaboy/form-builder/src/Json.php
@@ -17,22 +17,22 @@ class Json
public static function succ($msg, $data = [])
{
- return static::result(200, $msg, $data);
+ return self::result(200, $msg, $data);
}
public static function fail($msg, $data = [])
{
- return static::result(400, $msg, $data);
+ return self::result(400, $msg, $data);
}
public static function uploadSucc($filePath, $msg = '上传成功', $data = [])
{
$data['filePath'] = $filePath;
- return static::succ($msg, $data);
+ return self::succ($msg, $data);
}
public static function uploadFail($msg = '上传失败', $data = [])
{
- return static::fail($msg, $data);
+ return self::fail($msg, $data);
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Cascader.php b/vendor/xaboy/form-builder/src/components/Cascader.php
index 2fe67875..a5daf57b 100644
--- a/vendor/xaboy/form-builder/src/components/Cascader.php
+++ b/vendor/xaboy/form-builder/src/components/Cascader.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 多级联动组件
* Class Cascader
+ *
* @package FormBuilder\components
* @method $this type(String $type) 数据类型, 支持 city_area(省市区三级联动), city (省市二级联动), other (自定义)
* @method $this disabled(Boolean $bool) 是否禁用选择器
@@ -70,9 +71,6 @@ class Cascader extends FormComponentDriver
'notFoundText' => 'string',
];
- /**
- *
- */
protected function init()
{
$this->placeholder($this->getPlaceHolder());
@@ -96,13 +94,14 @@ class Cascader extends FormComponentDriver
* "value":"东城区", "label":"东城区"
* }]
* }
+ *
* @param array $data
* @return $this
*/
public function data(array $data)
{
- if(!is_array($this->props['data'])) $this->props['data'] = [];
- $this->props['data'] = array_merge($this->props['data'],$data);
+ if (!is_array($this->props['data'])) $this->props['data'] = [];
+ $this->props['data'] = array_merge($this->props['data'], $data);
return $this;
}
@@ -112,12 +111,13 @@ class Cascader extends FormComponentDriver
*/
public function jsData($var)
{
- $this->props['data'] = 'js.'.$var;
+ $this->props['data'] = 'js.' . $var;
return $this;
}
/**
* 获取组件类型
+ *
* @return mixed
*/
public function getType()
@@ -128,7 +128,7 @@ class Cascader extends FormComponentDriver
/**
* @return Validate
*/
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::arr();
}
@@ -145,7 +145,7 @@ class Cascader extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Checkbox.php b/vendor/xaboy/form-builder/src/components/Checkbox.php
index e2beee01..5af9ac75 100644
--- a/vendor/xaboy/form-builder/src/components/Checkbox.php
+++ b/vendor/xaboy/form-builder/src/components/Checkbox.php
@@ -15,6 +15,7 @@ use FormBuilder\traits\component\ComponentOptionsTrait;
/**
* 复选框组件
* Class Checkbox
+ *
* @package FormBuilder\components
* @method $this size(String $size) 多选框组的尺寸,可选值为 large、small、default 或者不设置
*/
@@ -36,7 +37,7 @@ class Checkbox extends FormComponentDriver
* @var array
*/
protected static $propsRule = [
- 'size'=>'string'
+ 'size' => 'string'
];
/**
@@ -45,18 +46,18 @@ class Checkbox extends FormComponentDriver
*/
public function value($value)
{
- if($value === null) return $this;
- if(!is_array($value))
+ if ($value === null) return $this;
+ if (!is_array($value))
$this->value[] = (string)$value;
- else{
- foreach ($value as $v){
- $this->value[] = (string) $v;
+ else {
+ foreach ($value as $v) {
+ $this->value[] = (string)$v;
}
}
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::arr();
}
@@ -67,23 +68,23 @@ class Checkbox extends FormComponentDriver
public function build()
{
$options = [];
- foreach ($this->options as $option){
+ foreach ($this->options as $option) {
if ($option instanceof Option)
$options[] = $option->build();
}
$value = array_unique($this->value);
- foreach ($value as $k=>$v){
+ foreach ($value as $k => $v) {
$value[$k] = (string)$v;
}
return [
- 'type'=>$this->name,
- 'field'=>$this->field,
- 'title'=>$this->title,
- 'value'=>$value,
- 'props'=>(object)$this->props,
- 'options'=>$options,
- 'validate'=>$this->validate,
- 'col'=>$this->col
+ 'type' => $this->name,
+ 'field' => $this->field,
+ 'title' => $this->title,
+ 'value' => $value,
+ 'props' => (object)$this->props,
+ 'options' => $options,
+ 'validate' => $this->validate,
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/Col.php b/vendor/xaboy/form-builder/src/components/Col.php
index 53ac97d3..9bbf9af1 100644
--- a/vendor/xaboy/form-builder/src/components/Col.php
+++ b/vendor/xaboy/form-builder/src/components/Col.php
@@ -14,18 +14,19 @@ use FormBuilder\traits\component\CallPropsTrait;
/**
* col栅格规则
* Class Col
+ *
* @package FormBuilder\components
* @method $this span(Number $span) 栅格的占位格数,可选值为0~24的整数,为 0 时,相当于display:none
* @method $this order(Number $order) 栅格的顺序,在flex布局模式下有效
* @method $this offset(Number $offset) 栅格左侧的间隔格数,间隔内不可以有栅格
* @method $this push(Number $push) 栅格向右移动格数
* @method $this pull(Number $pull) 栅格向左移动格数
- * @method $this labelWidth(Number $labelWidth) 表单域标签的的宽度,默认150px
+ * @method $this labelWidth(Number $labelWidth) 表单域标签的的宽度, 默认150px
* @method $this className(String $className) 自定义的class名称
- * @method $this xs(Number|Col $span) <768px 响应式栅格,可为栅格数或一个包含其他属性的对象
- * @method $this sm(Number|Col $span) ≥768px 响应式栅格,可为栅格数或一个包含其他属性的对象
- * @method $this md(Number|Col $span) ≥992px 响应式栅格,可为栅格数或一个包含其他属性的对象
- * @method $this lg(Number|Col $span) ≥1200px 响应式栅格,可为栅格数或一个包含其他属性的对象
+ * @method $this xs(Number | Col $span) <768px 响应式栅格,可为栅格数或一个包含其他属性的对象
+ * @method $this sm(Number | Col $span) ≥768px 响应式栅格,可为栅格数或一个包含其他属性的对象
+ * @method $this md(Number | Col $span) ≥992px 响应式栅格,可为栅格数或一个包含其他属性的对象
+ * @method $this lg(Number | Col $span) ≥1200px 响应式栅格,可为栅格数或一个包含其他属性的对象
*/
class Col implements FormComponentInterFace
{
@@ -56,10 +57,11 @@ class Col implements FormComponentInterFace
/**
* @var array
*/
- protected static $model = ['xs','sm','md','lg'];
+ protected static $model = ['xs', 'sm', 'md', 'lg'];
/**
* Col constructor.
+ *
* @param int $span
*/
public function __construct($span = 24)
@@ -72,8 +74,8 @@ class Col implements FormComponentInterFace
*/
public function build()
{
- foreach (self::$model as $m){
- if(isset($this->props[$m]) && $this->props[$m] instanceof Col){
+ foreach (self::$model as $m) {
+ if (isset($this->props[$m]) && $this->props[$m] instanceof Col) {
$this->props[$m] = $this->props[$m]->build();
}
}
diff --git a/vendor/xaboy/form-builder/src/components/ColorPicker.php b/vendor/xaboy/form-builder/src/components/ColorPicker.php
index 241eb996..bbcf85cd 100644
--- a/vendor/xaboy/form-builder/src/components/ColorPicker.php
+++ b/vendor/xaboy/form-builder/src/components/ColorPicker.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 颜色选择器组件
* Class ColorPicker
+ *
* @package FormBuilder\components
* @method $this disabled(Boolean $bool) 是否禁用
* @method $this alpha(Boolean $bool) 是否支持透明度选择, 默认为false
@@ -50,6 +51,7 @@ class ColorPicker extends FormComponentDriver
/**
* 自定义颜色预设
+ *
* @param $colors
* @return $this
*/
@@ -77,7 +79,7 @@ class ColorPicker extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/DatePicker.php b/vendor/xaboy/form-builder/src/components/DatePicker.php
index 219f15a0..98501518 100644
--- a/vendor/xaboy/form-builder/src/components/DatePicker.php
+++ b/vendor/xaboy/form-builder/src/components/DatePicker.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 日期选择器组件
* Class DatePicker
+ *
* @package FormBuilder\components
* @method $this type(String $type) 显示类型,可选值为 date、daterange、datetime、datetimerange、year、month
* @method $this format(String $format) 展示的日期格式, 默认为yyyy-MM-dd HH:mm:ss
@@ -67,7 +68,8 @@ class DatePicker extends FormComponentDriver
*/
protected $props = [
'type' => self::TYPE_DATE,
- 'editable' => false
+ 'editable' => false,
+ 'multiple' => false
];
/**
@@ -86,7 +88,7 @@ class DatePicker extends FormComponentDriver
'editable' => 'boolean',
'transfer' => 'boolean',
'splitPanels' => 'boolean',
- 'showWeekNumbers' => 'boolean',
+ 'showWeekNumbers' => 'boolean'
];
/**
@@ -97,6 +99,22 @@ class DatePicker extends FormComponentDriver
$this->placeholder($this->getPlaceHolder());
}
+ /**
+ * 开启后, 可以选择多个日期, 仅在 date 下可用, 默认为false
+ *
+ * @param bool $bool
+ * @return $this
+ */
+ public function multiple($bool = true)
+ {
+ if ($this->props['type'] == 'date')
+ $this->props['multiple'] = (bool)$bool;
+ else
+ $this->props['multiple'] = false;
+
+ return $this;
+ }
+
/**
* @param $value
* @return $this
@@ -116,12 +134,25 @@ class DatePicker extends FormComponentDriver
public function getValidateHandler()
{
- if(in_array($this->props['type'],['datetimerange','daterange']))
+ if (in_array($this->props['type'], ['datetimerange', 'daterange']) || $this->props['multiple'])
return Validate::arr();
else
return Validate::date();
}
+ public function required($message = null)
+ {
+ $message = $message ?: $this->getPlaceHolder();
+ if (in_array($this->props['type'], ['datetimerange', 'daterange'])) {
+ $this->validate()->fields([
+ '0' => ['required' => true, 'type' => 'date', 'message' => $message],
+ '1' => ['required' => true, 'type' => 'date', 'message' => $message]
+ ], true, $message);
+ return $this;
+ } else
+ return parent::required($message);
+ }
+
/**
* @return array
*/
@@ -134,7 +165,7 @@ class DatePicker extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/FormStyle.php b/vendor/xaboy/form-builder/src/components/FormStyle.php
index c49d2a2b..f2819249 100644
--- a/vendor/xaboy/form-builder/src/components/FormStyle.php
+++ b/vendor/xaboy/form-builder/src/components/FormStyle.php
@@ -14,6 +14,7 @@ use FormBuilder\traits\component\CallPropsTrait;
/**
* form表单样式
* Class FormStyle
+ *
* @package FormBuilder\components
* @method $this inline(Boolean $bool) 是否开启行内表单模式
* @method $this labelPosition(String $labelPosition) 表单域标签的位置,可选值为 left、right、top
@@ -41,20 +42,22 @@ class FormStyle implements FormComponentInterFace
/**
* FormStyle constructor.
- * @param bool $inline
+ *
+ * @param bool $inline
* @param string $labelPosition
- * @param int $labelWidth
- * @param bool $showMessage
+ * @param int $labelWidth
+ * @param bool $showMessage
* @param string $autocomplete
*/
public function __construct($inline = false, $labelPosition = 'right', $labelWidth = 125, $showMessage = true, $autocomplete = 'off')
{
- $this->props = compact('inline','labelPosition','labelWidth','showMessage');
+ $this->props = compact('inline', 'labelPosition', 'labelWidth', 'showMessage');
$this->autocomplete($autocomplete);
}
/**
* 原生的 autocomplete 属性,可选值为 true = off 或 false = on
+ *
* @param bool $bool
* @return $this
*/
diff --git a/vendor/xaboy/form-builder/src/components/Frame.php b/vendor/xaboy/form-builder/src/components/Frame.php
index 72660d16..0778330d 100644
--- a/vendor/xaboy/form-builder/src/components/Frame.php
+++ b/vendor/xaboy/form-builder/src/components/Frame.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 框架组件
* Class Frame
+ *
* @package FormBuilder\components
* @method $this type(String $type) frame类型, 有input, file, image, 默认为input
* @method $this src(String $src) iframe地址
@@ -90,7 +91,7 @@ class Frame extends FormComponentDriver
$this->frameTitle($this->getPlaceHolder());
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::arr();
}
@@ -111,7 +112,7 @@ class Frame extends FormComponentDriver
'value' => $value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Hidden.php b/vendor/xaboy/form-builder/src/components/Hidden.php
index 1487b44a..3c1388c4 100644
--- a/vendor/xaboy/form-builder/src/components/Hidden.php
+++ b/vendor/xaboy/form-builder/src/components/Hidden.php
@@ -13,6 +13,7 @@ use FormBuilder\FormComponentDriver;
/**
* hidden组件
* Class Hidden
+ *
* @package FormBuilder\components
*/
class Hidden extends FormComponentDriver
@@ -25,6 +26,7 @@ class Hidden extends FormComponentDriver
/**
* Hidden constructor.
+ *
* @param String $field
* @param String $value
*/
diff --git a/vendor/xaboy/form-builder/src/components/Input.php b/vendor/xaboy/form-builder/src/components/Input.php
index 9afe84c8..0ba73d42 100644
--- a/vendor/xaboy/form-builder/src/components/Input.php
+++ b/vendor/xaboy/form-builder/src/components/Input.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* Input组件,支持类型text、password、textarea、url、email、date
* Class Input
+ *
* @package FormBuilder\components
* @method $this type(String $type) 输入框类型,可选值为 text、password、textarea、url、email、date;
* @method $this size(String $size) 输入框尺寸,可选值为large、small、default或者不设置;
@@ -102,7 +103,7 @@ class Input extends FormComponentDriver
return parent::getPlaceHolder($pre);
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::str(Validate::TRIGGER_BLUR);
}
@@ -110,6 +111,7 @@ class Input extends FormComponentDriver
/**
* 自适应内容高度,仅在 textarea 类型下有效
+ *
* @param Bool|Number $minRows
* @param null|Number $maxRows
* @return $this
@@ -117,12 +119,13 @@ class Input extends FormComponentDriver
public function autoSize($minRows = false, $maxRows = null)
{
- $this->props['autosize'] = $maxRows === null ? boolval($minRows) : compact('minRows', 'maxRows');
+ $this->props['autosize'] = $maxRows === null ? boolval($minRows) : compact('minRows', 'maxRows');
return $this;
}
/**
* 生成表单规则
+ *
* @return array
*/
public function build()
@@ -134,7 +137,7 @@ class Input extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/InputNumber.php b/vendor/xaboy/form-builder/src/components/InputNumber.php
index cad234b6..6809539f 100644
--- a/vendor/xaboy/form-builder/src/components/InputNumber.php
+++ b/vendor/xaboy/form-builder/src/components/InputNumber.php
@@ -13,6 +13,7 @@ use FormBuilder\FormComponentDriver;
/**
* 数字输入框组件
* Class InputNumber
+ *
* @package FormBuilder\components
* @method $this max(float $max) 最大值
* @method $this min(float $min) 最小值
@@ -59,7 +60,7 @@ class InputNumber extends FormComponentDriver
return parent::getPlaceHolder($pre);
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::num(Validate::TRIGGER_BLUR);
}
@@ -76,7 +77,7 @@ class InputNumber extends FormComponentDriver
'value' => $this->value === '' ? '' : (float)$this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/Option.php b/vendor/xaboy/form-builder/src/components/Option.php
index 207499c0..7229c1f0 100644
--- a/vendor/xaboy/form-builder/src/components/Option.php
+++ b/vendor/xaboy/form-builder/src/components/Option.php
@@ -13,6 +13,7 @@ use FormBuilder\Helper;
/**
* Class Option
+ *
* @package FormBuilder\components
*/
class Option implements FormComponentInterFace
@@ -25,9 +26,11 @@ class Option implements FormComponentInterFace
/**
* Option constructor.
- * @param $value
+ *
+ * @param $value
* @param string $label
- * @param bool $disabled
+ * @param bool $disabled
+ * @throws \FormBuilder\exception\FormBuilderException
*/
public function __construct($value, $label = '', $disabled = false)
{
@@ -40,6 +43,7 @@ class Option implements FormComponentInterFace
/**
* @param $value
* @param $label
+ * @throws \FormBuilder\exception\FormBuilderException
*/
public static function verify($value, $label)
{
diff --git a/vendor/xaboy/form-builder/src/components/Radio.php b/vendor/xaboy/form-builder/src/components/Radio.php
index c3c12c17..6df00496 100644
--- a/vendor/xaboy/form-builder/src/components/Radio.php
+++ b/vendor/xaboy/form-builder/src/components/Radio.php
@@ -15,6 +15,7 @@ use FormBuilder\traits\component\ComponentOptionsTrait;
/**
* 单选框组件
* Class Radio
+ *
* @package FormBuilder\components
* @method $this size(String $size) 单选框的尺寸,可选值为 large、small、default 或者不设置
* @method $this vertical(Boolean $bool) 是否垂直排列,按钮样式下无效
@@ -38,6 +39,7 @@ class Radio extends FormComponentDriver
/**
* 使用按钮样式
+ *
* @return $this
*/
public function button()
@@ -46,7 +48,7 @@ class Radio extends FormComponentDriver
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::str();
}
@@ -69,7 +71,7 @@ class Radio extends FormComponentDriver
'props' => (object)$this->props,
'options' => $options,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Rate.php b/vendor/xaboy/form-builder/src/components/Rate.php
index 021cd67d..6ee73015 100644
--- a/vendor/xaboy/form-builder/src/components/Rate.php
+++ b/vendor/xaboy/form-builder/src/components/Rate.php
@@ -13,6 +13,7 @@ use FormBuilder\FormComponentDriver;
/**
* 评分组件
* Class Rate
+ *
* @package FormBuilder\components
* @method $this count(int $star) star 总数, 默认为 5
* @method $this allowHalf(Boolean $bool) 是否允许半选, 默认为 false
@@ -39,7 +40,7 @@ class Rate extends FormComponentDriver
'clearable' => 'boolean',
];
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::num();
}
@@ -56,7 +57,7 @@ class Rate extends FormComponentDriver
'value' => (float)$this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Row.php b/vendor/xaboy/form-builder/src/components/Row.php
index a55313ed..2649e6af 100644
--- a/vendor/xaboy/form-builder/src/components/Row.php
+++ b/vendor/xaboy/form-builder/src/components/Row.php
@@ -14,6 +14,7 @@ use FormBuilder\traits\component\CallPropsTrait;
/**
* row栅格规则
* Class Row
+ *
* @package FormBuilder\components
* @method $this gutter(Number $gutter) 栅格间距,单位 px,左右平分
* @method $this type(String $type) 栅格的顺序,在flex布局模式下有效
@@ -43,7 +44,8 @@ class Row implements FormComponentInterFace
/**
* Row constructor.
- * @param int $gutter
+ *
+ * @param int $gutter
* @param string $type
* @param string $align
* @param string $justify
@@ -51,7 +53,7 @@ class Row implements FormComponentInterFace
*/
public function __construct($gutter = 0, $type = '', $align = '', $justify = '', $className = '')
{
- $this->props = compact('gutter','type','align','justify','className');
+ $this->props = compact('gutter', 'type', 'align', 'justify', 'className');
}
/**
diff --git a/vendor/xaboy/form-builder/src/components/Select.php b/vendor/xaboy/form-builder/src/components/Select.php
index 433f4b54..589aa039 100644
--- a/vendor/xaboy/form-builder/src/components/Select.php
+++ b/vendor/xaboy/form-builder/src/components/Select.php
@@ -15,6 +15,7 @@ use FormBuilder\traits\component\ComponentOptionsTrait;
/**
* 选择器组件
* Class Select
+ *
* @package FormBuilder\components
* @method $this multiple(Boolean $bool) 是否支持多选, 默认为false
* @method $this disabled(Boolean $bool) 是否禁用, 默认为false
@@ -63,9 +64,6 @@ class Select extends FormComponentDriver
'notFoundText' => 'string',
];
- /**
- *
- */
protected function init()
{
$this->placeholder($this->getPlaceHolder());
@@ -89,9 +87,9 @@ class Select extends FormComponentDriver
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
- if($this->props['multiple'] == true)
+ if ($this->props['multiple'] == true)
return Validate::arr();
else
return Validate::str();
@@ -111,9 +109,9 @@ class Select extends FormComponentDriver
$isArr = is_array($value);
if ($this->props['multiple'] == false && $isArr)
$value = isset($value[0]) ? $value[0] : '';
- else if($isArr){
+ else if ($isArr) {
$value = array_unique($value);
- foreach ($value as $k=>$v){
+ foreach ($value as $k => $v) {
$value[$k] = (string)$v;
}
}
@@ -125,7 +123,7 @@ class Select extends FormComponentDriver
'props' => (object)$this->props,
'options' => $options,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Slider.php b/vendor/xaboy/form-builder/src/components/Slider.php
index 3296f5fa..07025b3e 100644
--- a/vendor/xaboy/form-builder/src/components/Slider.php
+++ b/vendor/xaboy/form-builder/src/components/Slider.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 滑块组件
* Class Slider
+ *
* @package FormBuilder\components
* @method $this min(float $min) 最小值, 默认 0
* @method $this max(float $max) 最大值, 默认 100
@@ -65,9 +66,9 @@ class Slider extends FormComponentDriver
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
- if($this->props['range'] == true)
+ if ($this->props['range'] == true)
return Validate::arr();
else
return Validate::num();
@@ -96,7 +97,7 @@ class Slider extends FormComponentDriver
'value' => $value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Switches.php b/vendor/xaboy/form-builder/src/components/Switches.php
index 628e945e..175fd03f 100644
--- a/vendor/xaboy/form-builder/src/components/Switches.php
+++ b/vendor/xaboy/form-builder/src/components/Switches.php
@@ -12,6 +12,7 @@ use FormBuilder\FormComponentDriver;
/**
* 开关组件
* Class Switches
+ *
* @package FormBuilder\components
* @method $this size(String $size) 开关的尺寸,可选值为large、small、default或者不写。建议开关如果使用了2个汉字的文字,使用 large。
* @method $this disabled(Boolean $bool) 禁用开关, 默认为false
@@ -50,6 +51,7 @@ class Switches extends FormComponentDriver
/**
* 自定义显示打开时的内容
+ *
* @param $open
* @return $this
*/
@@ -61,6 +63,7 @@ class Switches extends FormComponentDriver
/**
* 自定义显示关闭时的内容
+ *
* @param $close
* @return $this
*/
@@ -70,7 +73,7 @@ class Switches extends FormComponentDriver
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
return Validate::str();
}
@@ -88,7 +91,7 @@ class Switches extends FormComponentDriver
'props' => (object)$this->props,
'slot' => (object)$this->slot,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/TimePicker.php b/vendor/xaboy/form-builder/src/components/TimePicker.php
index 3eb21f9d..8a2ca7e1 100644
--- a/vendor/xaboy/form-builder/src/components/TimePicker.php
+++ b/vendor/xaboy/form-builder/src/components/TimePicker.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 时间选择器组件
* Class TimePicker
+ *
* @package FormBuilder\components
* @method $this type(String $type) 显示类型,可选值为 time、timerange
* @method $this format(String $format) 展示的时间格式, 默认为HH:mm:ss
@@ -81,7 +82,8 @@ class TimePicker extends FormComponentDriver
/**
* 下拉列表的时间间隔,数组的三项分别对应小时、分钟、秒。
* 例如设置为 [1, 15] 时,分钟会显示:00、15、30、45。
- * @param $h
+ *
+ * @param $h
* @param int $i
* @param int $s
* @return $this
@@ -109,14 +111,28 @@ class TimePicker extends FormComponentDriver
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
- if($this->props['type'] == 'timerange')
+ if ($this->props['type'] == 'timerange')
return Validate::arr();
else
return Validate::str();
}
+
+ public function required($message = null)
+ {
+ $message = $message ?: $this->getPlaceHolder();
+ if ($this->props['type'] == 'timerange') {
+ $this->validate()->fields([
+ '0' => ['required' => true, 'message' => $message],
+ '1' => ['required' => true, 'message' => $message]
+ ], true, $message);
+ return $this;
+ } else
+ return parent::required($message);
+ }
+
/**
* @return array
*/
diff --git a/vendor/xaboy/form-builder/src/components/Tree.php b/vendor/xaboy/form-builder/src/components/Tree.php
index 31f1eaac..03129d4a 100644
--- a/vendor/xaboy/form-builder/src/components/Tree.php
+++ b/vendor/xaboy/form-builder/src/components/Tree.php
@@ -13,11 +13,12 @@ use FormBuilder\FormComponentDriver;
/**
* 树型组件
* Class Tree
+ *
* @package FormBuilder\components
* @method $this type(String $type) 类型,可选值为 checked、selected
- * @method $this multiple(Boolean $bool) 是否支持多选,当`type=selected`并且`multiple=false`,默认为false,值为String或Number类型,其他情况为Array类型
- * @method $this showCheckbox(Boolean $bool) 是否显示多选框,默认为false
- * @method $this emptyText(String $emptyText) 没有数据时的提示,默认为'暂无数据'
+ * @method $this multiple(Boolean $bool) 是否支持多选, 当`type=selected`并且`multiple=false`, 默认为false, 值为String或Number类型,其他情况为Array类型
+ * @method $this showCheckbox(Boolean $bool) 是否显示多选框, 默认为false
+ * @method $this emptyText(String $emptyText) 没有数据时的提示, 默认为'暂无数据'
*/
class Tree extends FormComponentDriver
{
@@ -41,7 +42,7 @@ class Tree extends FormComponentDriver
protected $props = [
'type' => self::TYPE_CHECKED,
'data' => [],
- 'multiple'=>true
+ 'multiple' => true
];
/**
@@ -60,8 +61,8 @@ class Tree extends FormComponentDriver
*/
public function data(array $treeData)
{
- if(!is_array($this->props['data'])) $this->props['data'] = [];
- foreach ($treeData as $child){
+ if (!is_array($this->props['data'])) $this->props['data'] = [];
+ foreach ($treeData as $child) {
$this->props['data'][] = $child instanceof TreeData
? $child->build()
: $child;
@@ -75,7 +76,7 @@ class Tree extends FormComponentDriver
*/
public function jsData($var)
{
- $this->props['data'] = 'js.'.$var;
+ $this->props['data'] = 'js.' . $var;
return $this;
}
@@ -85,20 +86,20 @@ class Tree extends FormComponentDriver
*/
public function value($value)
{
- if(is_array($value)){
- foreach ($value as $k=>$v){
+ if (is_array($value)) {
+ foreach ($value as $k => $v) {
$value[$k] = (string)$v;
}
- }else{
+ } else {
$value = (string)$value;
}
$this->value = $value;
return $this;
}
- protected function getValidateHandler()
+ public function getValidateHandler()
{
- if($this->props['multiple'])
+ if ($this->props['multiple'])
return Validate::arr();
else
return Validate::str();
@@ -116,7 +117,7 @@ class Tree extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
diff --git a/vendor/xaboy/form-builder/src/components/TreeData.php b/vendor/xaboy/form-builder/src/components/TreeData.php
index 5a07cd4b..46eaaf92 100644
--- a/vendor/xaboy/form-builder/src/components/TreeData.php
+++ b/vendor/xaboy/form-builder/src/components/TreeData.php
@@ -13,11 +13,12 @@ use FormBuilder\traits\component\CallPropsTrait;
/**
* Class TreeData
+ *
* @package FormBuilder\components
- * @method $this id(String $id) Id,必须唯一
+ * @method $this id(String $id) Id, 必须唯一
* @method $this title(String $title) 标题
- * @method $this expand(Boolean $bool) 是否展开直子节点,默认为false
- * @method $this disabled(Boolean $bool) 禁掉响应,默认为false
+ * @method $this expand(Boolean $bool) 是否展开直子节点, 默认为false
+ * @method $this disabled(Boolean $bool) 禁掉响应, 默认为false
* @method $this disableCheckbox(Boolean $bool) 禁掉 checkbox
* @method $this selected(Boolean $bool) 是否选中子节点
* @method $this checked(Boolean $bool) 是否勾选(如果勾选,子节点也会全部勾选)
@@ -51,8 +52,9 @@ class TreeData implements FormComponentInterFace
/**
* TreeData constructor.
- * @param $id
- * @param $title
+ *
+ * @param $id
+ * @param $title
* @param array $children
*/
public function __construct($id, $title, array $children = [])
@@ -68,7 +70,7 @@ class TreeData implements FormComponentInterFace
*/
public function children(array $children)
{
- $this->children = array_merge($this->children,$children);
+ $this->children = array_merge($this->children, $children);
return $this;
}
@@ -88,7 +90,7 @@ class TreeData implements FormComponentInterFace
public function build()
{
$children = [];
- foreach ($this->children as $child){
+ foreach ($this->children as $child) {
$children[] = $child instanceof TreeData
? $child->build()
: $child;
diff --git a/vendor/xaboy/form-builder/src/components/Upload.php b/vendor/xaboy/form-builder/src/components/Upload.php
index 3a1a7411..764ec3b2 100644
--- a/vendor/xaboy/form-builder/src/components/Upload.php
+++ b/vendor/xaboy/form-builder/src/components/Upload.php
@@ -14,6 +14,7 @@ use FormBuilder\Helper;
/**
* 上传组件
* Class Upload
+ *
* @package FormBuilder\components
* @method $this uploadType(String $uploadType) 上传文件类型,可选值为 image(图片上传),file(文件上传)
* @method $this action(String $action) 上传的地址
@@ -79,6 +80,7 @@ class Upload extends FormComponentDriver
/**
* 设置上传的请求头部
+ *
* @param array $headers
* @return $this
*/
@@ -92,6 +94,7 @@ class Upload extends FormComponentDriver
* 支持的文件类型,与 accept 不同的是,
* format 是识别文件的后缀名,accept 为 input 标签原生的 accept 属性,
* 会在选择文件时过滤,可以两者结合使用
+ *
* @param array $headers
* @return $this
*/
@@ -103,6 +106,7 @@ class Upload extends FormComponentDriver
/**
* 上传时附带的额外参数
+ *
* @param array $headers
* @return $this
*/
@@ -112,7 +116,7 @@ class Upload extends FormComponentDriver
return $this;
}
- protected function getPlaceHolder($pre = '请上传')
+ public function getPlaceHolder($pre = '请上传')
{
return parent::getPlaceHolder($pre);
}
@@ -129,10 +133,7 @@ class Upload extends FormComponentDriver
protected function getValidateHandler()
{
- if($this->props['maxLength'] == 1)
- return Validate::str();
- else
- return Validate::arr();
+ return Validate::arr();
}
/**
@@ -147,7 +148,7 @@ class Upload extends FormComponentDriver
'value' => $this->value,
'props' => (object)$this->props,
'validate' => $this->validate,
- 'col'=>$this->col
+ 'col' => $this->col
];
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/components/Validate.php b/vendor/xaboy/form-builder/src/components/Validate.php
index fc4e8916..d624cebb 100644
--- a/vendor/xaboy/form-builder/src/components/Validate.php
+++ b/vendor/xaboy/form-builder/src/components/Validate.php
@@ -39,61 +39,78 @@ class Validate implements FormComponentInterFace
public static function str($trigger = self::TRIGGER_CHANGE)
{
- return new static(self::TYPE_STRING,$trigger);
+ return new self(self::TYPE_STRING, $trigger);
}
public static function arr($trigger = self::TRIGGER_CHANGE)
{
- return new static(self::TYPE_ARRAY,$trigger);
+ return new self(self::TYPE_ARRAY, $trigger);
}
public static function num($trigger = self::TRIGGER_CHANGE)
{
- return new static(self::TYPE_NUMBER,$trigger);
+ return new self(self::TYPE_NUMBER, $trigger);
}
public static function date($trigger = self::TRIGGER_CHANGE)
{
- return new static(self::TYPE_DATE,$trigger);
+ return new self(self::TYPE_DATE, $trigger);
}
- protected function set($validate, $message = null)
+ public function set($validate, $message = null)
{
$this->validate[] = $validate + [
'trigger' => $this->trigger,
'type' => $this->type,
'message' => $message
];
+
+ return $this;
+ }
+
+ public function fields(array $fields, $required = null, $message = null)
+ {
+ $data = [];
+ if (!is_null($required))
+ $data['required'] = $required;
+ if (is_null($message))
+ $data['message'] = $message;
+ $data['fields'] = (object)$fields;
+
+ return $this->set($data);
}
/**
* 必须为链接
+ *
* @param string|null $message
* @return $this
*/
public function url($message = null)
{
$this->set([
- 'type'=>'url'
- ],$message);
+ 'type' => 'url'
+ ], $message);
return $this;
}
/**
* 必须为邮箱
+ *
* @param string|null $message
* @return $this
*/
public function email($message = null)
{
$this->set([
- 'type'=>'email'
- ],$message);
+ 'type' => 'email'
+ ], $message);
return $this;
}
/**
* 必填
+ *
* @param string|null $message
* @return $this
*/
@@ -107,6 +124,7 @@ class Validate implements FormComponentInterFace
/**
* 长度或值必须在这个范围内
+ *
* @param int $min
* @param int $max
* @param string|null $message
@@ -123,6 +141,7 @@ class Validate implements FormComponentInterFace
/**
* 长度或值必须大于这个值
+ *
* @param int $min
* @param string|null $message
* @return $this
@@ -137,6 +156,7 @@ class Validate implements FormComponentInterFace
/**
* 长度或值必须小于这个值
+ *
* @param int $max
* @param string|null $message
* @return $this
@@ -151,6 +171,7 @@ class Validate implements FormComponentInterFace
/**
* 长度或值必须等于这个值
+ *
* @param int $length
* @param string|null $message
* @return $this
@@ -158,13 +179,14 @@ class Validate implements FormComponentInterFace
public function length($length, $message = null)
{
$this->set([
- 'length' => (int)$length
+ 'len' => (int)$length
], $message);
return $this;
}
/**
* 值必须在 list 中
+ *
* @param array $list
* @param string|null $message
* @return $this
@@ -172,7 +194,7 @@ class Validate implements FormComponentInterFace
public function enum($list, $message = null)
{
$this->set([
- 'type'=>'enum',
+ 'type' => 'enum',
'enum' => (array)$list
], $message);
return $this;
diff --git a/vendor/xaboy/form-builder/src/exception/FormBuilderException.php b/vendor/xaboy/form-builder/src/exception/FormBuilderException.php
new file mode 100644
index 00000000..5a2feec9
--- /dev/null
+++ b/vendor/xaboy/form-builder/src/exception/FormBuilderException.php
@@ -0,0 +1,20 @@
+props[$name] = $arguments[0];
} else if (is_array(static::$propsRule[$name])) {
$this->props[static::$propsRule[$name][1]] = Helper::toType(
@@ -41,7 +44,7 @@ trait CallPropsTrait
}
return $this;
} else {
- throw new \Exception($name . '方法不存在');
+ throw new FormBuilderException($name . '方法不存在');
}
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/traits/component/ComponentOptionsTrait.php b/vendor/xaboy/form-builder/src/traits/component/ComponentOptionsTrait.php
index edc10422..bbd8b06c 100644
--- a/vendor/xaboy/form-builder/src/traits/component/ComponentOptionsTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/component/ComponentOptionsTrait.php
@@ -12,6 +12,7 @@ use FormBuilder\components\Option;
/**
* Class ComponentOptionsTrait
+ *
* @package FormBuilder\traits\component
*/
trait ComponentOptionsTrait
@@ -23,10 +24,12 @@ trait ComponentOptionsTrait
/**
* 设置的选项
- * @param $value
- * @param $label
+ *
+ * @param $value
+ * @param $label
* @param bool $disabled
* @return $this
+ * @throws \FormBuilder\exception\FormBuilderException
*/
public function option($value, $label, $disabled = false)
{
@@ -37,9 +40,11 @@ trait ComponentOptionsTrait
/**
* 批量设置的选项
+ *
* @param array $options
- * @param bool $disabled
+ * @param bool $disabled
* @return $this
+ * @throws \FormBuilder\exception\FormBuilderException
*/
public function options(array $options, $disabled = false)
{
@@ -59,16 +64,17 @@ trait ComponentOptionsTrait
/**
* 批量设置选项 支持匿名函数
- * @param $options
+ *
+ * @param $options
* @param bool $disabled
* @return $this
*/
public function setOptions($options, $disabled = false)
{
- if(is_callable($options))
- return $this->setOptions($options($this),$disabled);
- else if(is_array($options))
- return $this->options($options,$disabled);
+ if (is_callable($options))
+ return $this->setOptions($options($this), $disabled);
+ else if (is_array($options))
+ return $this->options($options, $disabled);
else
return $this;
}
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormCascaderTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormCascaderTrait.php
index c3ea95ed..1f27d732 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormCascaderTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormCascaderTrait.php
@@ -12,15 +12,17 @@ use FormBuilder\components\Cascader;
/**
* Class FormCascaderTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormCascaderTrait
{
/**
* 多级联动组件
- * @param $field
- * @param $title
- * @param array $value
+ *
+ * @param $field
+ * @param $title
+ * @param array $value
* @param string $type
* @return Cascader
*/
@@ -34,15 +36,16 @@ trait FormCascaderTrait
/**
* 省市二级联动
- * @param $field
- * @param $title
+ *
+ * @param $field
+ * @param $title
* @param array|string $province
- * @param string $city
+ * @param string $city
* @return Cascader
*/
public static function city($field, $title, $province = [], $city = '')
{
- if(is_array($province))
+ if (is_array($province))
$value = $province;
else
$value = [(string)$province, (string)$city];
@@ -55,16 +58,17 @@ trait FormCascaderTrait
/**
* 省市区三级联动
- * @param $field
- * @param $title
+ *
+ * @param $field
+ * @param $title
* @param array|string $province
- * @param string $city
- * @param string $area
+ * @param string $city
+ * @param string $area
* @return Cascader
*/
public static function cityArea($field, $title, $province = [], $city = '', $area = '')
{
- if(is_array($province))
+ if (is_array($province))
$value = $province;
else
$value = [(string)$province, (string)$city, (string)$area];
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormCheckBoxTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormCheckBoxTrait.php
index 1c19928b..fd0d4f6e 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormCheckBoxTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormCheckBoxTrait.php
@@ -11,13 +11,16 @@ use FormBuilder\components\Checkbox;
/**
* Class FormCheckBoxTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormCheckBoxTrait
{
/**
- * @param $field
- * @param $title
+ * 多选框组件
+ *
+ * @param $field
+ * @param $title
* @param array $value
* @return Checkbox
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormColorPickerTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormColorPickerTrait.php
index 8c03ad34..1df3bc7b 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormColorPickerTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormColorPickerTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\ColorPicker;
/**
* Class FormColorPickerTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormColorPickerTrait
{
/**
- * @param $field
- * @param $title
+ * 颜色选择组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return ColorPicker
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormDatePickerTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormDatePickerTrait.php
index b4e87899..60d52287 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormDatePickerTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormDatePickerTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\DatePicker;
/**
* Class FormDatePickerTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormDatePickerTrait
{
/**
- * @param $field
- * @param $title
+ * 日期组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @param string $type
* @return DatePicker
@@ -31,8 +34,10 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 单选日期
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return DatePicker
*/
@@ -42,8 +47,24 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 多选日期
+ *
+ * @param $field
+ * @param $title
+ * @param array $value
+ * @return DatePicker
+ */
+ public static function dateMultiple($field, $title, array $value)
+ {
+ $date = self::datePicker($field, $title, $value, DatePicker::TYPE_DATE);
+ return $date->multiple();
+ }
+
+ /**
+ * 日期区间选择
+ *
+ * @param $field
+ * @param $title
* @param string $startDate
* @param string $endDate
* @return DatePicker
@@ -54,8 +75,10 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 单选日期时间
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return DatePicker
*/
@@ -65,8 +88,10 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 日期时间区间选择
+ *
+ * @param $field
+ * @param $title
* @param string $startDate
* @param string $endDate
* @return DatePicker
@@ -77,8 +102,10 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 选择年
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return DatePicker
*/
@@ -88,8 +115,10 @@ trait FormDatePickerTrait
}
/**
- * @param $field
- * @param $title
+ * 选择月
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return DatePicker
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormFrameTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormFrameTrait.php
index 169992ed..1883b598 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormFrameTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormFrameTrait.php
@@ -12,14 +12,17 @@ use FormBuilder\components\Frame;
/**
* Class FormFrameTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormFrameTrait
{
/**
- * @param $field
- * @param $title
- * @param $src
+ * 框架组件
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param string $value
* @param string $type
* @return Frame
@@ -33,9 +36,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用input 类型显示,多选
+ * value为Array类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param array $value
* @return Frame
*/
@@ -45,9 +51,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用文件类型显示,多选
+ * value为Array类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param array $value
* @return Frame
*/
@@ -57,9 +66,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用文件类型显示,多选
+ * value为Array类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param array $value
* @return Frame
*/
@@ -69,9 +81,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用input 类型显示,单选
+ * value为String类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param string $value
* @return Frame
*/
@@ -81,9 +96,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用文件类型显示,单选
+ * value为String类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param string $value
* @return Frame
*/
@@ -93,9 +111,12 @@ trait FormFrameTrait
}
/**
- * @param $field
- * @param $title
- * @param $src
+ * 使用文件类型显示,单选
+ * value为String类型
+ *
+ * @param $field
+ * @param $title
+ * @param $src
* @param string $value
* @return Frame
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormHiddenTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormHiddenTrait.php
index 5f543c82..f02ccd75 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormHiddenTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormHiddenTrait.php
@@ -12,11 +12,14 @@ use FormBuilder\components\Hidden;
/**
* Class FormHiddenTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormHiddenTrait
{
/**
+ * 隐藏组件
+ *
* @param $field
* @param $value
* @return Hidden
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormInputNumberTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormInputNumberTrait.php
index b0ce5909..112785af 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormInputNumberTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormInputNumberTrait.php
@@ -12,14 +12,17 @@ use FormBuilder\components\InputNumber;
/**
* Class FormInputNumberTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormInputNumberTrait
{
/**
- * @param $field
- * @param $title
+ * 数字输入框组件
+ *
+ * @param $field
+ * @param $title
* @param null $value
* @return InputNumber
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormInputTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormInputTrait.php
index e8b87138..5ba00271 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormInputTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormInputTrait.php
@@ -12,14 +12,16 @@ use FormBuilder\components\Input;
/**
* Class FormInputTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormInputTrait
{
/**
- * 获取input组件
- * @param $field
- * @param $title
+ * input输入框组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @param string $type
* @return Input
@@ -32,8 +34,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * text 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
@@ -43,8 +47,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * password 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
@@ -54,8 +60,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * textarea 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
@@ -65,8 +73,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * url 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
@@ -76,8 +86,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * email 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
@@ -87,8 +99,10 @@ trait FormInputTrait
}
/**
- * @param $field
- * @param $title
+ * date 类型输入框
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Input
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormOptionTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormOptionTrait.php
index 4d580128..aa229fd7 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormOptionTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormOptionTrait.php
@@ -12,18 +12,22 @@ use FormBuilder\components\Option;
/**
* Class FormOptionTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormOptionTrait
{
/**
- * @param $value
+ * 获取选择类组件 option 类
+ *
+ * @param $value
* @param string $label
- * @param bool $disabled
+ * @param bool $disabled
* @return Option
+ * @throws \FormBuilder\exception\FormBuilderException
*/
public static function option($value, $label = '', $disabled = false)
{
- return new Option($value,$label,$disabled);
+ return new Option($value, $label, $disabled);
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormRadioTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormRadioTrait.php
index dd65d284..8a8d19f9 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormRadioTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormRadioTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\Radio;
/**
* Class FormRadioTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormRadioTrait
{
/**
- * @param $field
- * @param $title
+ * 单选框组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Radio
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormRateTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormRateTrait.php
index b153261a..1b627ac7 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormRateTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormRateTrait.php
@@ -12,17 +12,20 @@ use FormBuilder\components\Rate;
/**
* Class FormRateTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormRateTrait
{
/**
- * @param $field
- * @param $title
- * @param number $value
+ * 评分选择组件
+ *
+ * @param $field
+ * @param $title
+ * @param float $value
* @return Rate
*/
- public static function rate($field, $title, $value = 0)
+ public static function rate($field, $title, $value = 0.0)
{
return new Rate($field, $title, (float)$value);
}
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormSelectTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormSelectTrait.php
index 1a110d4c..3e77bdc8 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormSelectTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormSelectTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\Select;
/**
* Class FormSelectTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormSelectTrait
{
/**
- * @param $field
- * @param $title
+ * 下拉选择组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Select
*/
@@ -31,8 +34,10 @@ trait FormSelectTrait
}
/**
- * @param $field
- * @param $title
+ * 多选
+ *
+ * @param $field
+ * @param $title
* @param array $value
* @return Select
*/
@@ -42,8 +47,10 @@ trait FormSelectTrait
}
/**
- * @param $field
- * @param $title
+ * 单选
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Select
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormSliderTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormSliderTrait.php
index e2c0fa5b..1ee17e26 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormSliderTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormSliderTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\Slider;
/**
* Class FormSliderTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormSliderTrait
{
/**
- * @param $field
- * @param $title
+ * 滑块组件
+ *
+ * @param $field
+ * @param $title
* @param int $value
* @return Slider
*/
@@ -28,8 +31,10 @@ trait FormSliderTrait
}
/**
- * @param $field
- * @param $title
+ * 区间选择
+ *
+ * @param $field
+ * @param $title
* @param int $start
* @param int $end
* @return Slider
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormStyleTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormStyleTrait.php
index e72550d1..a6226c3f 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormStyleTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormStyleTrait.php
@@ -14,12 +14,15 @@ use FormBuilder\components\Row;
/**
* Class FormStyleTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormStyleTrait
{
/**
+ * 组件布局规则类
+ *
* @param int $span
* @return Col
*/
@@ -29,7 +32,9 @@ trait FormStyleTrait
}
/**
- * @param int $gutter
+ * 表格布局规则类
+ *
+ * @param int $gutter
* @param string $type
* @param string $align
* @param string $justify
@@ -38,19 +43,21 @@ trait FormStyleTrait
*/
public static function row($gutter = 0, $type = '', $align = '', $justify = '', $className = '')
{
- return new Row($gutter,$type,$align,$justify,$className);
+ return new Row($gutter, $type, $align, $justify, $className);
}
/**
- * @param bool $inline
+ * 表格样式类
+ *
+ * @param bool $inline
* @param string $labelPosition
- * @param int $labelWidth
- * @param bool $showMessage
+ * @param int $labelWidth
+ * @param bool $showMessage
* @param string $autocomplete
* @return FormStyle
*/
public static function style($inline = false, $labelPosition = 'right', $labelWidth = 125, $showMessage = true, $autocomplete = 'off')
{
- return new FormStyle($inline,$labelPosition,$labelWidth,$showMessage,$autocomplete);
+ return new FormStyle($inline, $labelPosition, $labelWidth, $showMessage, $autocomplete);
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormSwitchesTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormSwitchesTrait.php
index 5a829b55..254fb2ba 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormSwitchesTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormSwitchesTrait.php
@@ -12,13 +12,16 @@ use FormBuilder\components\Switches;
/**
* Class FormSwitchesTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormSwitchesTrait
{
/**
- * @param $field
- * @param $title
+ * 开关组件
+ *
+ * @param $field
+ * @param $title
* @param string $value
* @return Switches
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormTimePickerTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormTimePickerTrait.php
index 3e3f6023..bfb2d59f 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormTimePickerTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormTimePickerTrait.php
@@ -12,15 +12,18 @@ use FormBuilder\components\TimePicker;
/**
* Class FormTimePickerTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormTimePickerTrait
{
/**
- * @param $field
- * @param $title
- * @param string $value
- * @param string $type
+ * 时间选择组件
+ *
+ * @param $field
+ * @param $title
+ * @param string|int $value
+ * @param string $type
* @return TimePicker
*/
public static function timePicker($field, $title, $value = '', $type = TimePicker::TYPE_TIME)
@@ -29,9 +32,11 @@ trait FormTimePickerTrait
}
/**
- * @param $field
- * @param $title
- * @param string $value
+ * 事件选择
+ *
+ * @param $field
+ * @param $title
+ * @param string|int $value
* @return TimePicker
*/
public static function time($field, $title, $value = '')
@@ -40,10 +45,12 @@ trait FormTimePickerTrait
}
/**
- * @param $field
- * @param $title
- * @param string $startTime
- * @param string $endTime
+ * 时间区间选择
+ *
+ * @param $field
+ * @param $title
+ * @param string|int $startTime
+ * @param string|int $endTime
* @return TimePicker
*/
public static function timeRange($field, $title, $startTime = '', $endTime = '')
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormTreeTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormTreeTrait.php
index 12cff8f7..c81affdc 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormTreeTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormTreeTrait.php
@@ -13,14 +13,17 @@ use FormBuilder\components\TreeData;
/**
* Class FormTreeTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormTreeTrait
{
/**
- * @param $field
- * @param $title
- * @param array $value
+ * 树形组件
+ *
+ * @param $field
+ * @param $title
+ * @param array $value
* @param string $type
* @return Tree
*/
@@ -30,19 +33,23 @@ trait FormTreeTrait
}
/**
- * @param $field
- * @param $title
+ * 获取选中的值
+ *
+ * @param $field
+ * @param $title
* @param array $value
* @return Tree
*/
public static function treeSelected($field, $title, $value = [])
{
- return self::tree($field, $title, $value,Tree::TYPE_SELECTED);
+ return self::tree($field, $title, $value, Tree::TYPE_SELECTED);
}
/**
- * @param $field
- * @param $title
+ * 获取勾选的值
+ *
+ * @param $field
+ * @param $title
* @param array $value
* @return Tree
*/
@@ -52,13 +59,15 @@ trait FormTreeTrait
}
/**
- * @param $id
- * @param $title
+ * 树形组件数据 date 类
+ *
+ * @param $id
+ * @param $title
* @param array $children
* @return TreeData
*/
public static function treeData($id, $title, array $children = [])
{
- return new TreeData($id,$title,$children);
+ return new TreeData($id, $title, $children);
}
}
\ No newline at end of file
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormUploadTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormUploadTrait.php
index f4851a75..9c50e2f4 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormUploadTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormUploadTrait.php
@@ -12,14 +12,17 @@ use FormBuilder\components\Upload;
/**
* Class FormUploadTrait
+ *
* @package FormBuilder\traits\form
*/
trait FormUploadTrait
{
/**
- * @param $field
- * @param $title
- * @param $action
+ * 上传组件
+ *
+ * @param $field
+ * @param $title
+ * @param $action
* @param string $value
* @param string $type
* @return Upload
@@ -32,24 +35,30 @@ trait FormUploadTrait
}
/**
- * @param $field
- * @param $title
- * @param $action
+ * 图片上传
+ * value 为 Array类型
+ *
+ * @param $field
+ * @param $title
+ * @param $action
* @param array $value
* @return Upload
*/
public static function uploadImages($field, $title, $action, array $value = [])
{
$upload = self::upload($field, $title, $action, $value, Upload::TYPE_IMAGE);
- $upload->format(['jpg','jpeg','png','gif'])->accept('image/*');
+ $upload->format(['jpg', 'jpeg', 'png', 'gif'])->accept('image/*');
return $upload;
}
/**
- * @param $field
- * @param $title
- * @param $action
+ * 文件上传
+ * value 为 Array类型
+ *
+ * @param $field
+ * @param $title
+ * @param $action
* @param array $value
* @return Upload
*/
@@ -59,23 +68,29 @@ trait FormUploadTrait
}
/**
- * @param $field
- * @param $title
- * @param $action
+ * 图片上传
+ * value 为 String类型
+ *
+ * @param $field
+ * @param $title
+ * @param $action
* @param string $value
* @return Upload
*/
public static function uploadImageOne($field, $title, $action, $value = '')
{
$upload = self::upload($field, $title, $action, $value, Upload::TYPE_IMAGE);
- $upload->format(['jpg','jpeg','png','gif'])->accept('image/*')->maxLength(1);
+ $upload->format(['jpg', 'jpeg', 'png', 'gif'])->accept('image/*')->maxLength(1);
return $upload;
}
/**
- * @param $field
- * @param $title
- * @param $action
+ * 文件上传
+ * value 为 String类型
+ *
+ * @param $field
+ * @param $title
+ * @param $action
* @param string $value
* @return Upload
*/
diff --git a/vendor/xaboy/form-builder/src/traits/form/FormValidateTrait.php b/vendor/xaboy/form-builder/src/traits/form/FormValidateTrait.php
index 63651e1d..8efa26e8 100644
--- a/vendor/xaboy/form-builder/src/traits/form/FormValidateTrait.php
+++ b/vendor/xaboy/form-builder/src/traits/form/FormValidateTrait.php
@@ -12,36 +12,71 @@ use FormBuilder\components\Validate;
trait FormValidateTrait
{
+ /**
+ * string 类型验证器
+ *
+ * @return Validate
+ */
public static function validateStr()
{
return Validate::str();
}
+ /**
+ * input 组件验证器
+ *
+ * @return Validate
+ */
public static function validateInput()
{
return Validate::str(Validate::TRIGGER_BLUR);
}
+ /**
+ * array 类型验证器
+ *
+ * @return Validate
+ */
public static function validateArr()
{
return Validate::arr();
}
+ /**
+ * number 类型验证器
+ *
+ * @return Validate
+ */
public static function validateNum()
{
return Validate::num();
}
+ /**
+ * inputNumber 组件验证器
+ *
+ * @return Validate
+ */
public static function validateNumInput()
{
return Validate::num(Validate::TRIGGER_BLUR);
}
+ /**
+ * date 类型验证器
+ *
+ * @return Validate
+ */
public static function validateDate()
{
return Validate::date();
}
+ /**
+ * frame 组件验证器
+ *
+ * @return Validate
+ */
public static function validateFrame()
{
return self::ValidateArr();
diff --git a/vendor/xaboy/form-builder/src/view/formScript.php b/vendor/xaboy/form-builder/src/view/formScript.php
index 716e4794..accff2bb 100644
--- a/vendor/xaboy/form-builder/src/view/formScript.php
+++ b/vendor/xaboy/form-builder/src/view/formScript.php
@@ -10,10 +10,12 @@
});
return rule;
}, vm = new Vue,name = 'formBuilderExec= !$form->getId() ? '' : '_'.$form->getId() ?>';
-
+ var _b = false;
window[name] = function create(el, callback) {
+ if(_b) return ;
+ _b = true;
if (!el) el = document.body;
- $f = formCreate.create(getRule(), {
+ var $f = formCreate.create(getRule(), {
el: el,
form:=json_encode($form->getConfig('form'))?>,
row:=json_encode($form->getConfig('row'))?>,
@@ -48,12 +50,10 @@
success: function (res) {
if (res.code == 200) {
vm.$Message.success(res.msg);
- $f.submitStatus({loading: false});
- formCreate.formSuccess && formCreate.formSuccess(res, $f, formData);
callback && callback(0, res, $f, formData);
//TODO 表单提交成功!
} else {
- vm.$Message.error(res.msg);
+ vm.$Message.error(res.msg || '表单提交失败');
$f.btn.finish();
callback && callback(1, res, $f, formData);
//TODO 表单提交失败
From aab614620f8d369e8e8928106aa5378ad8f8f492 Mon Sep 17 00:00:00 2001
From: sugar1569
Date: Thu, 27 Dec 2018 11:03:53 +0800
Subject: [PATCH 02/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8E=E5=8F=B0?=
=?UTF-8?q?=E7=A7=92=E6=9D=80=E3=80=81=E4=BA=A7=E5=93=81=E3=80=81=E8=AE=A2?=
=?UTF-8?q?=E5=8D=95=E3=80=81=E7=A7=AF=E5=88=86=E5=88=97=E8=A1=A8=E9=A1=B5?=
=?UTF-8?q?=E6=A0=B7=E5=BC=8F=EF=BC=8C=E5=90=8E=E5=8F=B0=E5=8F=91=E8=B4=A7?=
=?UTF-8?q?=E6=A8=A1=E7=89=88=E9=80=9A=E7=9F=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../admin/controller/order/StoreOrder.php | 2 +-
.../admin/controller/ump/StoreSeckill.php | 18 +--
application/admin/model/order/StoreOrder.php | 114 ++++++++++++++----
.../admin/model/order/StoreOrderCartInfo.php | 33 +++++
.../admin/model/routine/RoutineFormId.php | 43 +++++++
application/admin/model/user/User.php | 2 +-
application/admin/model/user/UserAddress.php | 51 ++++++++
application/admin/model/wechat/WechatUser.php | 21 +++-
.../admin/view/order/store_order/index.php | 1 +
.../routine/model/routine/RoutineTemplate.php | 35 +-----
10 files changed, 248 insertions(+), 72 deletions(-)
create mode 100644 application/admin/model/order/StoreOrderCartInfo.php
create mode 100644 application/admin/model/routine/RoutineFormId.php
create mode 100644 application/admin/model/user/UserAddress.php
diff --git a/application/admin/controller/order/StoreOrder.php b/application/admin/controller/order/StoreOrder.php
index 426aa4f9..415e678b 100644
--- a/application/admin/controller/order/StoreOrder.php
+++ b/application/admin/controller/order/StoreOrder.php
@@ -1 +1 @@
-assign([
'year'=>getMonth('y'),
'real_name'=>$this->request->get('real_name',''),
'orderCount'=>StoreOrderModel::orderCount(),
]);
return $this->fetch();
}
/**
* 获取头部订单金额等信息
* return json
*
*/
public function getBadge(){
$where = Util::postMore([
['status',''],
['real_name',''],
['is_del',0],
['data',''],
['type',''],
['order','']
]);
return JsonService::successful(StoreOrderModel::getBadge($where));
}
/**
* 获取订单列表
* return json
*/
public function order_list(){
$where = Util::getMore([
['status',''],
['real_name',$this->request->param('real_name','')],
['is_del',0],
['data',''],
['type',''],
['order',''],
['page',1],
['limit',20],
['excel',0]
]);
return JsonService::successlayui(StoreOrderModel::OrderList($where));
}
public function orderchart(){
$where = Util::getMore([
['status',''],
['real_name',''],
['is_del',0],
['data',''],
['combination_id',''],
['export',0],
['order','id desc']
],$this->request);
$limitTimeList = [
'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]),
'week'=>implode(' - ',[
date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)),
date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600))
]),
'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]),
'quarter'=>implode(' - ',[
date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01',
date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y')))
]),
'year'=>implode(' - ',[
date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day'))
])
];
if($where['data'] == '') $where['data'] = $limitTimeList['today'];
$orderCount = [
urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(),
urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(),
urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(),
urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(),
urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(),
urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(),
urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count()
];
$model = StoreOrderModel::getOrderWhere($where,new StoreOrderModel())->field('sum(total_num) total_num,count(*) count,sum(total_price) total_price,sum(refund_price) refund_price,from_unixtime(add_time,\'%Y-%m-%d\') add_time')
->group('from_unixtime(add_time,\'%Y-%m-%d\')');
$orderPrice = $model->select()->toArray();
$orderDays = [];
$orderCategory = [
['name'=>'商品数','type'=>'line','data'=>[]],
['name'=>'订单数','type'=>'line','data'=>[]],
['name'=>'订单金额','type'=>'line','data'=>[]],
['name'=>'退款金额','type'=>'line','data'=>[]]
];
foreach ($orderPrice as $price){
$orderDays[] = $price['add_time'];
$orderCategory[0]['data'][] = $price['total_num'];
$orderCategory[1]['data'][] = $price['count'];
$orderCategory[2]['data'][] = $price['total_price'];
$orderCategory[3]['data'][] = $price['refund_price'];
}
$this->assign(StoreOrderModel::systemPage($where,$this->adminId));
$this->assign('price',StoreOrderModel::getOrderPrice($where));
$this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory'));
return $this->fetch();
}
/**
* 修改支付金额等
* @param $id
* @return mixed|\think\response\Json|void
*/
public function edit($id)
{
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f = array();
$f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0);
$f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0);
$f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0);
$f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage'));
$f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral'));
// $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
$form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/** 修改订单提交更新
* @param Request $request
* @param $id
*/
public function update(Request $request, $id)
{
$data = Util::postMore([
'order_id',
'total_price',
'total_postage',
'pay_price',
'pay_postage',
'gain_integral',
],$request);
if($data['total_price'] <= 0) return Json::fail('请输入商品总价');
if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额');
$data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']);
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_edit',$data,$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']);
return Json::successful('修改成功!');
}
/**
* 送货
* @param $id
* send
*/
public function delivery($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1 && $product['status'] == 0) {
$f = array();
$f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;');
$f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone');
$form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
public function updateDelivery(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
$data['delivery_type'] = 'send';
if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
$data['status'] = 1;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_delivery',$data,$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 发货
* @param $id
* express
*/
public function deliver_goods($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1 && $product['status'] == 0){
$f = array();
$f[] = Form::select('delivery_name','快递公司')->setOptions(function(){
$list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name');
$menus = [];
foreach ($list as $k=>$v){
$menus[] = ['value'=>$v,'label'=>$v];
}
return $menus;
})->filterable(1);
$f[] = Form::input('delivery_id','快递单号')->number(1);
$form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
/**发货保存
* @param Request $request
* @param $id
*/
public function updateDeliveryGoods(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
$data['delivery_type'] = 'express';
if(!$data['delivery_name']) return Json::fail('请选择快递公司');
if(!$data['delivery_id']) return Json::fail('请输入快递单号');
$data['status'] = 1;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 修改状态为已收货
* @param $id
* @return \think\response\Json|void
*/
public function take_delivery($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['status'] == 2) return Json::fail('不能重复收货!');
if($product['paid'] == 1 && $product['status'] == 1) $data['status'] = 2;
else if($product['pay_type'] == 'offline') $data['status'] = 2;
else return Json::fail('请先发货或者送货!');
if(!StoreOrderModel::edit($data,$id))
return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!'));
else{
try{
HookService::listen('store_product_order_take_delivery',$data,$id,false,StoreProductBehavior::class);
}catch (Exception $e){
return Json::fail($e->getMessage());
}
StoreOrderStatus::setStatus($id,'take_delivery','已收货');
return Json::successful('收货成功!');
}
}
/**
* 修改退款状态
* @param $id
* @return \think\response\Json|void
*/
public function refund_y($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1){
$f = array();
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01);
$f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]);
$form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
/**退款处理
* @param Request $request
* @param $id
*/
public function updateRefundY(Request $request, $id){
$data = Util::postMore([
'refund_price',
['type',1],
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if(!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2);
$bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2);
if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额');
if($data['type'] == 1){
$data['refund_status'] = 2;
}else if($data['type'] == 2){
$data['refund_status'] = 0;
}
$type = $data['type'];
unset($data['type']);
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if($product['pay_type'] == 'weixin'){
if($product['is_channel']){
try{
HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
}catch(\Exception $e){
return Json::fail($e->getMessage());
}
}else{
try{
HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
}catch(\Exception $e){
return Json::fail($e->getMessage());
}
}
}else if($product['pay_type'] == 'yue'){
ModelBasic::beginTrans();
$res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid');
$res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],$product['pay_price'],'订单退款到余额'.floatval($refund_price).'元');
try{
HookService::listen('store_order_yue_refund',$product,$refund_data,false,StoreProductBehavior::class);
}catch (\Exception $e){
ModelBasic::rollbackTrans();
return Json::fail($e->getMessage());
}
$res = $res1 && $res2;
ModelBasic::checkTrans($res);
if(!$res) return Json::fail('余额退款失败!');
}
$resEdit = StoreOrderModel::edit($data,$id);
if($resEdit){
$data['type'] = $type;
if($data['type'] == 1) StorePink::setRefundPink($id);
HookService::afterListen('store_product_order_refund_y',$data,$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元');
return Json::successful('修改成功!');
}else{
StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败');
return Json::successful('修改失败!');
}
}
public function order_info($oid = '')
{
if(!$oid || !($orderInfo = StoreOrderModel::get($oid)))
return $this->failed('订单不存在!');
$userInfo = User::getUserInfo($orderInfo['uid']);
if($userInfo['spread_uid']){
$spread = User::where('uid',$userInfo['spread_uid'])->value('nickname');
}else{
$spread ='';
}
$this->assign(compact('orderInfo','userInfo','spread'));
return $this->fetch();
}
public function express($oid = '')
{
if(!$oid || !($order = StoreOrderModel::get($oid)))
return $this->failed('订单不存在!');
if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!');
$cacheName = $order['order_id'].$order['delivery_id'];
$result = CacheService::get($cacheName,null);
if($result === null || 1==1){
$result = Express::query($order['delivery_id']);
if(is_array($result) &&
isset($result['result']) &&
isset($result['result']['deliverystatus']) &&
$result['result']['deliverystatus'] >= 3)
$cacheTime = 0;
else
$cacheTime = 1800;
CacheService::set($cacheName,$result,$cacheTime);
}
$this->assign([
'order'=>$order,
'express'=>$result
]);
return $this->fetch();
}
/**
* 修改配送信息
* @param $id
* @return mixed|\think\response\Json|void
*/
public function distribution($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f = array();
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
if($product['delivery_type'] == 'send'){
$f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name'));
$f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id'));
}else if($product['delivery_type'] == 'express'){
$f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){
$list = Db::name('express')->where('is_show',1)->column('id,name');
$menus = [];
foreach ($list as $k=>$v){
$menus[] = ['value'=>$v,'label'=>$v];
}
return $menus;
});
$f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id'));
}
$form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/**修改配送信息
* @param Request $request
* @param $id
*/
public function updateDistribution(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['delivery_type'] == 'send'){
if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
}else if($product['delivery_type'] == 'express'){
if(!$data['delivery_name']) return Json::fail('请选择快递公司');
if(!$data['delivery_id']) return Json::fail('请输入快递单号');
}
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_distribution',$data,$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 修改退款状态
* @param $id
* @return mixed|\think\response\Json|void
*/
public function refund_n($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::input('refund_reason','退款原因')->type('textarea');
$form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/**不退款原因
* @param Request $request
* @param $id
*/
public function updateRefundN(Request $request, $id){
$data = Util::postMore([
'refund_reason',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if(!$data['refund_reason']) return Json::fail('请输入退款原因');
$data['refund_status'] = 0;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,StoreProductBehavior::class);
StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']);
return Json::successful('修改成功!');
}
/**
* 立即支付
* @param $id
*/
public function offline($id){
$res = StoreOrderModel::updateOffline($id);
if($res){
try{
HookService::listen('store_product_order_offline',$id,false,StoreProductBehavior::class);
}catch (Exception $e){
return Json::fail($e->getMessage());
}
StoreOrderStatus::setStatus($id,'offline','线下付款');
return Json::successful('修改成功!');
}else{
return Json::fail('修改失败!');
}
}
/**
* 修改积分和金额
* @param $id
* @return mixed|\think\response\Json|void
*/
public function integral_back($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1){
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('back_integral','退积分')->min(0);
$form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}else{
return Json::fail('参数错误!');
}
return $this->fetch('public/form-builder');
}
/** 退积分保存
* @param Request $request
* @param $id
*/
public function updateIntegralBack(Request $request, $id){
$data = Util::postMore([
'back_integral',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($data['back_integral'] <= 0) return Json::fail('请输入积分');
if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了');
$back_integral = $data['back_integral'];
$data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2);
$bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2);
if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分');
ModelBasic::beginTrans();
$res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid');
$res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],$product['pay_price'],'订单退积分'.floatval($back_integral).'积分到用户积分');
try{
HookService::listen('store_order_integral_back',$product,$back_integral,false,StoreProductBehavior::class);
}catch (\Exception $e){
ModelBasic::rollbackTrans();
return Json::fail($e->getMessage());
}
$res = $res1 && $res2;
ModelBasic::checkTrans($res);
if(!$res) return Json::fail('退积分失败!');
StoreOrderModel::edit($data,$id);
StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']);
return Json::successful('退积分成功!');
}
public function remark(Request $request){
$data = Util::postMore(['id','remark'],$request);
if(!$data['id']) return Json::fail('参数错误!');
if($data['remark'] == '') return Json::fail('请输入要备注的内容!');
$id = $data['id'];
unset($data['id']);
StoreOrderModel::edit($data,$id);
return Json::successful('备注成功!');
}
public function order_status($oid){
if(!$oid) return $this->failed('数据不存在');
$this->assign(StoreOrderStatus::systemPage($oid));
return $this->fetch();
}
}
\ No newline at end of file
+
* @day: 2017/11/11
*/
namespace app\admin\controller\order;
use basic\ModelBasic;
use Api\Express;
use app\admin\controller\AuthController;
use service\FormBuilder as Form;
use app\admin\model\order\StoreOrderStatus;
use app\admin\model\ump\StorePink;
use app\admin\model\user\User;
use app\admin\model\user\UserBill;
use behavior\system\OrderBehavior;
use behavior\wechat\PaymentBehavior;
use EasyWeChat\Core\Exception;
use service\CacheService;
use service\HookService;
use service\JsonService;
use service\SystemConfigService;
use service\UtilService as Util;
use service\JsonService as Json;
use think\Db;
use think\Request;
use think\Url;
use app\admin\model\order\StoreOrder as StoreOrderModel;
/**
* 订单管理控制器 同一个订单表放在一个控制器
* Class StoreOrder
* @package app\admin\controller\store
*/
class StoreOrder extends AuthController
{
/**
* @return mixed
*/
public function index()
{
$config = SystemConfigService::more(['pay_routine_appid','pay_routine_appsecret','pay_routine_mchid','pay_routine_key','pay_routine_client_cert','pay_routine_client_key']);
$this->assign([
'year'=>getMonth('y'),
'real_name'=>$this->request->get('real_name',''),
'orderCount'=>StoreOrderModel::orderCount(),
]);
return $this->fetch();
}
/**
* 获取头部订单金额等信息
* return json
*
*/
public function getBadge(){
$where = Util::postMore([
['status',''],
['real_name',''],
['is_del',0],
['data',''],
['type',''],
['order','']
]);
return JsonService::successful(StoreOrderModel::getBadge($where));
}
/**
* 获取订单列表
* return json
*/
public function order_list(){
$where = Util::getMore([
['status',''],
['real_name',$this->request->param('real_name','')],
['is_del',0],
['data',''],
['type',''],
['order',''],
['page',1],
['limit',20],
['excel',0]
]);
return JsonService::successlayui(StoreOrderModel::OrderList($where));
}
public function orderchart(){
$where = Util::getMore([
['status',''],
['real_name',''],
['is_del',0],
['data',''],
['combination_id',''],
['export',0],
['order','id desc']
],$this->request);
$limitTimeList = [
'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]),
'week'=>implode(' - ',[
date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)),
date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600))
]),
'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]),
'quarter'=>implode(' - ',[
date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01',
date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y')))
]),
'year'=>implode(' - ',[
date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day'))
])
];
if($where['data'] == '') $where['data'] = $limitTimeList['today'];
$orderCount = [
urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(),
urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(),
urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(),
urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(),
urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(),
urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(),
urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count()
];
$model = StoreOrderModel::getOrderWhere($where,new StoreOrderModel())->field('sum(total_num) total_num,count(*) count,sum(total_price) total_price,sum(refund_price) refund_price,from_unixtime(add_time,\'%Y-%m-%d\') add_time')
->group('from_unixtime(add_time,\'%Y-%m-%d\')');
$orderPrice = $model->select()->toArray();
$orderDays = [];
$orderCategory = [
['name'=>'商品数','type'=>'line','data'=>[]],
['name'=>'订单数','type'=>'line','data'=>[]],
['name'=>'订单金额','type'=>'line','data'=>[]],
['name'=>'退款金额','type'=>'line','data'=>[]]
];
foreach ($orderPrice as $price){
$orderDays[] = $price['add_time'];
$orderCategory[0]['data'][] = $price['total_num'];
$orderCategory[1]['data'][] = $price['count'];
$orderCategory[2]['data'][] = $price['total_price'];
$orderCategory[3]['data'][] = $price['refund_price'];
}
$this->assign(StoreOrderModel::systemPage($where,$this->adminId));
$this->assign('price',StoreOrderModel::getOrderPrice($where));
$this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory'));
return $this->fetch();
}
/**
* 修改支付金额等
* @param $id
* @return mixed|\think\response\Json|void
*/
public function edit($id)
{
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f = array();
$f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0);
$f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0);
$f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0);
$f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage'));
$f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral'));
// $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
$form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/** 修改订单提交更新
* @param Request $request
* @param $id
*/
public function update(Request $request, $id)
{
$data = Util::postMore([
'order_id',
'total_price',
'total_postage',
'pay_price',
'pay_postage',
'gain_integral',
],$request);
if($data['total_price'] <= 0) return Json::fail('请输入商品总价');
if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额');
$data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']);
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_edit',$data,$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']);
return Json::successful('修改成功!');
}
/**
* 送货
* @param $id
* send
*/
public function delivery($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1 && $product['status'] == 0) {
$f = array();
$f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;');
$f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone');
$form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
/**送货
* @param Request $request
* @param $id
*/
public function updateDelivery(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
$data['delivery_type'] = 'send';
if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
$data['status'] = 1;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 发货
* @param $id
* express
*/
public function deliver_goods($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1 && $product['status'] == 0){
$f = array();
$f[] = Form::select('delivery_name','快递公司')->setOptions(function(){
$list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name');
$menus = [];
foreach ($list as $k=>$v){
$menus[] = ['value'=>$v,'label'=>$v];
}
return $menus;
})->filterable(1);
$f[] = Form::input('delivery_id','快递单号')->number(1);
$form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
/**发货保存
* @param Request $request
* @param $id
*/
public function updateDeliveryGoods(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
$data['delivery_type'] = 'express';
if(!$data['delivery_name']) return Json::fail('请选择快递公司');
if(!$data['delivery_id']) return Json::fail('请输入快递单号');
$data['status'] = 1;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 修改状态为已收货
* @param $id
* @return \think\response\Json|void
*/
public function take_delivery($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['status'] == 2) return Json::fail('不能重复收货!');
if($product['paid'] == 1 && $product['status'] == 1) $data['status'] = 2;
else if($product['pay_type'] == 'offline') $data['status'] = 2;
else return Json::fail('请先发货或者送货!');
if(!StoreOrderModel::edit($data,$id))
return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!'));
else{
try{
HookService::listen('store_product_order_take_delivery',$data,$id,false,OrderBehavior::class);
}catch (Exception $e){
return Json::fail($e->getMessage());
}
StoreOrderStatus::setStatus($id,'take_delivery','已收货');
return Json::successful('收货成功!');
}
}
/**
* 修改退款状态
* @param $id
* @return \think\response\Json|void
*/
public function refund_y($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1){
$f = array();
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01);
$f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]);
$form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
else return Json::fail('数据不存在!');
}
/**退款处理
* @param Request $request
* @param $id
*/
public function updateRefundY(Request $request, $id){
$data = Util::postMore([
'refund_price',
['type',1],
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if(!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2);
$bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2);
if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额');
if($data['type'] == 1){
$data['refund_status'] = 2;
}else if($data['type'] == 2){
$data['refund_status'] = 0;
}
$type = $data['type'];
unset($data['type']);
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if($product['pay_type'] == 'weixin'){
if($product['is_channel']){
try{
HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
}catch(\Exception $e){
return Json::fail($e->getMessage());
}
}else{
try{
HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
}catch(\Exception $e){
return Json::fail($e->getMessage());
}
}
}else if($product['pay_type'] == 'yue'){
ModelBasic::beginTrans();
$res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid');
$res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],$product['pay_price'],'订单退款到余额'.floatval($refund_price).'元');
try{
HookService::listen('store_order_yue_refund',$product,$refund_data,false,OrderBehavior::class);
}catch (\Exception $e){
ModelBasic::rollbackTrans();
return Json::fail($e->getMessage());
}
$res = $res1 && $res2;
ModelBasic::checkTrans($res);
if(!$res) return Json::fail('余额退款失败!');
}
$resEdit = StoreOrderModel::edit($data,$id);
if($resEdit){
$data['type'] = $type;
if($data['type'] == 1) StorePink::setRefundPink($id);
HookService::afterListen('store_product_order_refund_y',$data,$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元');
return Json::successful('修改成功!');
}else{
StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败');
return Json::successful('修改失败!');
}
}
public function order_info($oid = '')
{
if(!$oid || !($orderInfo = StoreOrderModel::get($oid)))
return $this->failed('订单不存在!');
$userInfo = User::getUserInfos($orderInfo['uid']);
if($userInfo['spread_uid']){
$spread = User::where('uid',$userInfo['spread_uid'])->value('nickname');
}else{
$spread ='';
}
$this->assign(compact('orderInfo','userInfo','spread'));
return $this->fetch();
}
public function express($oid = '')
{
if(!$oid || !($order = StoreOrderModel::get($oid)))
return $this->failed('订单不存在!');
if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!');
$cacheName = $order['order_id'].$order['delivery_id'];
$result = CacheService::get($cacheName,null);
if($result === null || 1==1){
$result = Express::query($order['delivery_id']);
if(is_array($result) &&
isset($result['result']) &&
isset($result['result']['deliverystatus']) &&
$result['result']['deliverystatus'] >= 3)
$cacheTime = 0;
else
$cacheTime = 1800;
CacheService::set($cacheName,$result,$cacheTime);
}
$this->assign([
'order'=>$order,
'express'=>$result
]);
return $this->fetch();
}
/**
* 修改配送信息
* @param $id
* @return mixed|\think\response\Json|void
*/
public function distribution($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f = array();
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
if($product['delivery_type'] == 'send'){
$f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name'));
$f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id'));
}else if($product['delivery_type'] == 'express'){
$f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){
$list = Db::name('express')->where('is_show',1)->column('id,name');
$menus = [];
foreach ($list as $k=>$v){
$menus[] = ['value'=>$v,'label'=>$v];
}
return $menus;
});
$f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id'));
}
$form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/**修改配送信息
* @param Request $request
* @param $id
*/
public function updateDistribution(Request $request, $id){
$data = Util::postMore([
'delivery_name',
'delivery_id',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['delivery_type'] == 'send'){
if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
}else if($product['delivery_type'] == 'express'){
if(!$data['delivery_name']) return Json::fail('请选择快递公司');
if(!$data['delivery_id']) return Json::fail('请输入快递单号');
}
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_distribution',$data,$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']);
return Json::successful('修改成功!');
}
/**
* 修改退款状态
* @param $id
* @return mixed|\think\response\Json|void
*/
public function refund_n($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::input('refund_reason','退款原因')->type('textarea');
$form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
/**不退款原因
* @param Request $request
* @param $id
*/
public function updateRefundN(Request $request, $id){
$data = Util::postMore([
'refund_reason',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if(!$data['refund_reason']) return Json::fail('请输入退款原因');
$data['refund_status'] = 0;
StoreOrderModel::edit($data,$id);
HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,OrderBehavior::class);
StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']);
return Json::successful('修改成功!');
}
/**
* 立即支付
* @param $id
*/
public function offline($id){
$res = StoreOrderModel::updateOffline($id);
if($res){
try{
HookService::listen('store_product_order_offline',$id,false,OrderBehavior::class);
}catch (Exception $e){
return Json::fail($e->getMessage());
}
StoreOrderStatus::setStatus($id,'offline','线下付款');
return Json::successful('修改成功!');
}else{
return Json::fail('修改失败!');
}
}
/**
* 修改积分和金额
* @param $id
* @return mixed|\think\response\Json|void
*/
public function integral_back($id){
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($product['paid'] == 1){
$f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
$f[] = Form::number('back_integral','退积分')->min(0);
$form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id)));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}else{
return Json::fail('参数错误!');
}
return $this->fetch('public/form-builder');
}
/** 退积分保存
* @param Request $request
* @param $id
*/
public function updateIntegralBack(Request $request, $id){
$data = Util::postMore([
'back_integral',
],$request);
if(!$id) return $this->failed('数据不存在');
$product = StoreOrderModel::get($id);
if(!$product) return Json::fail('数据不存在!');
if($data['back_integral'] <= 0) return Json::fail('请输入积分');
if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了');
$back_integral = $data['back_integral'];
$data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2);
$bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2);
if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分');
ModelBasic::beginTrans();
$res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid');
$res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],$product['pay_price'],'订单退积分'.floatval($back_integral).'积分到用户积分');
try{
HookService::listen('store_order_integral_back',$product,$back_integral,false,OrderBehavior::class);
}catch (\Exception $e){
ModelBasic::rollbackTrans();
return Json::fail($e->getMessage());
}
$res = $res1 && $res2;
ModelBasic::checkTrans($res);
if(!$res) return Json::fail('退积分失败!');
StoreOrderModel::edit($data,$id);
StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']);
return Json::successful('退积分成功!');
}
public function remark(Request $request){
$data = Util::postMore(['id','remark'],$request);
if(!$data['id']) return Json::fail('参数错误!');
if($data['remark'] == '') return Json::fail('请输入要备注的内容!');
$id = $data['id'];
unset($data['id']);
StoreOrderModel::edit($data,$id);
return Json::successful('备注成功!');
}
public function order_status($oid){
if(!$oid) return $this->failed('数据不存在');
$this->assign(StoreOrderStatus::systemPage($oid));
return $this->fetch();
}
}
\ No newline at end of file
diff --git a/application/admin/controller/ump/StoreSeckill.php b/application/admin/controller/ump/StoreSeckill.php
index 71e5605d..46158f99 100644
--- a/application/admin/controller/ump/StoreSeckill.php
+++ b/application/admin/controller/ump/StoreSeckill.php
@@ -75,13 +75,13 @@ class StoreSeckill extends AuthController
public function create()
{
$f = array();
- $f[] = Form::input('title','产品标题')->required();
- $f[] = Form::input('info','秒杀活动简介')->type('textarea')->required();
- $f[] = Form::input('unit_name','单位')->placeholder('个、位')->required();
- $f[] = Form::dateTimeRange('section_time','活动时间')->required();
- $f[] = Form::frameImageOne('image','产品主图片(305*305px)',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image')->required();
- $f[] = Form::frameImages('images','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'images')))->maxLength(5)->icon('images')->required();
- $f[] = Form::number('price','秒杀价')->min(0)->col(12)->required();
+ $f[] = Form::input('title','产品标题');
+ $f[] = Form::input('info','秒杀活动简介')->type('textarea');
+ $f[] = Form::input('unit_name','单位')->placeholder('个、位');
+ $f[] = Form::dateTimeRange('section_time','活动时间');
+ $f[] = Form::frameImageOne('image','产品主图片(305*305px)',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image');
+ $f[] = Form::frameImages('images','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'images')))->maxLength(5)->icon('images');
+ $f[] = Form::number('price','秒杀价')->min(0)->col(12);
$f[] = Form::number('ot_price','原价')->min(0)->col(12);
$f[] = Form::number('cost','成本价')->min(0)->col(12);
$f[] = Form::number('stock','库存')->min(0)->precision(0)->col(12);
@@ -93,7 +93,7 @@ class StoreSeckill extends AuthController
$f[] = Form::radio('is_postage','是否包邮',1)->options([['label'=>'是','value'=>1],['label'=>'否','value'=>0]])->col(12);
$f[] = Form::radio('is_hot','热门推荐',1)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]])->col(12);
$f[] = Form::radio('status','活动状态',1)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]])->col(12);
- $form = Form::make_post_form('开启秒杀',$f,Url::build('save'));
+ $form = Form::make_post_form('添加用户通知',$f,Url::build('save'));
$this->assign(compact('form'));
return $this->fetch('public/form-builder');
}
@@ -128,6 +128,7 @@ class StoreSeckill extends AuthController
],$request);
if(!$data['title']) return Json::fail('请输入产品标题');
if(!$data['unit_name']) return Json::fail('请输入产品单位');
+ if(!$data['product_id']) return Json::fail('产品ID不能为空');
// var_dump($this->request->post());
if(count($data['section_time'])<1) return Json::fail('请选择活动时间');
$data['start_time'] = strtotime($data['section_time'][0]);
@@ -217,6 +218,7 @@ class StoreSeckill extends AuthController
$product = StoreSeckillModel::get($id);
if(!$product) return Json::fail('数据不存在!');
$f = array();
+ $f[] = Form::hidden('product_id',$product->getData('product_id'));
$f[] = Form::input('title','产品标题',$product->getData('title'));
$f[] = Form::input('info','秒杀活动简介',$product->getData('info'))->type('textarea');
$f[] = Form::input('unit_name','单位',$product->getData('unit_name'))->placeholder('个、位');
diff --git a/application/admin/model/order/StoreOrder.php b/application/admin/model/order/StoreOrder.php
index f4d76783..99da5ee6 100644
--- a/application/admin/model/order/StoreOrder.php
+++ b/application/admin/model/order/StoreOrder.php
@@ -10,11 +10,15 @@ namespace app\admin\model\order;
use app\admin\model\wechat\WechatUser;
use app\admin\model\ump\StorePink;
+use app\admin\model\order\StoreOrderCartInfo;
use app\admin\model\store\StoreProduct;
+use app\admin\model\routine\RoutineFormId;
+use app\admin\model\routine\RoutineTemplate;
use service\PHPExcelService;
use traits\ModelTrait;
use basic\ModelBasic;
use service\WechatTemplateService;
+use service\RoutineTemplateService;
use think\Url;
use think\Db;
/**
@@ -47,7 +51,12 @@ class StoreOrder extends ModelBasic
}else{
$model = $model->order('a.id desc');
}
- $data=($data=$model->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
+ if(isset($where['excel']) && $where['excel']==1){
+ $data=($data=$model->select()) && count($data) ? $data->toArray() : [];
+ }else{
+ $data=($data=$model->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
+ }
+// $data=($data=$model->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
foreach ($data as &$item){
$_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->field('cart_info')->select();
foreach ($_info as $k=>$v){
@@ -460,6 +469,7 @@ HTML;
* @return array
*/
public static function getOrderPrice($where){
+ $where['is_del'] = 0;//删除订单不统计
$model = new self;
$price = array();
$price['pay_price'] = 0;//支付金额
@@ -473,7 +483,7 @@ HTML;
$price['deduction_price'] = 0;//抵扣金额
$price['total_num'] = 0; //商品总数
$model = self::getOrderWhere($where,$model);
- $list = $model->select()->toArray();
+ $list = $model->where('is_del',0)->select()->toArray();
foreach ($list as $v){
$price['total_num'] = bcadd($price['total_num'],$v['total_num'],0);
$price['pay_price'] = bcadd($price['pay_price'],$v['pay_price'],2);
@@ -871,30 +881,84 @@ HTML;
]
];
}
- /*
- * 退款列表
- * $where array
- * return array
+
+ /**微信 订单发货
+ * @param $oid
+ * @param array $postageData
*/
-// public static function getRefundList($where){
-// $refundlist=self::setEchatWhere($where)->field([
-// 'order_id','total_price','coupon_price','deduction_price',
-// 'use_integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time','FROM_UNIXTIME(pay_time,"%Y-%m-%d") as pay_time','combination_id',
-// 'seckill_id','bargain_id','cost','status','cart_id','pay_price','refund_status'
-// ])->page((int)$where['page'],(int)$where['limit'])->select();
-// count($refundlist) && $refundlist=$refundlist->toArray();
-// foreach($refundlist as &$item){
-// $item['product']=StoreProduct::where('id','in',function ($quers) use($item){
-// $quers->name('store_cart')->where('id','in',json_decode($item['cart_id'],true))->field('product_id');
-// })->field(['store_name','cost','price','image'])->select()->toArray();
-// if($item['refund_status']==1) {
-// $item['_refund'] = '申请退款中';
-// }elseif ($item['refund_status']==2){
-// $item['_refund'] = '退款成功';
-// }
-// }
-// return $refundlist;
-// }
+ public static function orderPostageAfter($oid,$postageData = [])
+ {
+ $order = self::where('id',$oid)->find();
+ $openid = WechatUser::uidToOpenid($order['uid']);
+ $url = Url::build('wap/My/order',['uni'=>$order['order_id']],true,true);
+ $group = [
+ 'first'=>'亲,您的订单已发货,请注意查收',
+ 'remark'=>'点击查看订单详情'
+ ];
+ if($postageData['delivery_type'] == 'send'){//送货
+ $goodsName = StoreOrderCartInfo::getProductNameList($order['id']);
+ $group = array_merge($group,[
+ 'keyword1'=>$goodsName,
+ 'keyword2'=>$order['pay_type'] == 'offline' ? '线下支付' : date('Y/m/d H:i',$order['pay_time']),
+ 'keyword3'=>$order['user_address'],
+ 'keyword4'=>$postageData['delivery_name'],
+ 'keyword5'=>$postageData['delivery_id']
+ ]);
+ WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_DELIVER_SUCCESS,$group,$url);
+
+ }else if($postageData['delivery_type'] == 'express'){//发货
+ $group = array_merge($group,[
+ 'keyword1'=>$order['order_id'],
+ 'keyword2'=>$postageData['delivery_name'],
+ 'keyword3'=>$postageData['delivery_id']
+ ]);
+ WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_POSTAGE_SUCCESS,$group,$url);
+ }
+ }
+ /**
+ * 小程序 订单发货提醒
+ * @param int $oid
+ * @param array $postageData
+ * @return bool
+ */
+ public static function sendOrderGoods($oid = 0,$postageData=array()){
+ if(!$oid || !$postageData) return true;
+ $order = self::where('id',$oid)->find();
+ $routine_openid = WechatUser::uidToRoutineOpenid($order['uid']);
+ if(!$routine_openid) return true;
+ if($postageData['delivery_type'] == 'send'){//送货
+ $data['keyword1']['value'] = $order['order_id'];
+ $data['keyword2']['value'] = $order['delivery_name'];
+ $data['keyword3']['value'] = $order['delivery_id'];
+ $data['keyword4']['value'] = date('Y-m-d H:i:s',time());
+ $data['keyword5']['value'] = '您的商品已经发货请注意查收';
+ $formId = RoutineFormId::getFormIdOne($order['uid']);
+ if($formId){
+ RoutineFormId::delFormIdOne($formId);
+ RoutineTemplateService::sendTemplate($routine_openid,
+ RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_DELIVER_SUCCESS),
+ '',
+ $data,
+ $formId);
+ }
+ }else if($postageData['delivery_type'] == 'express'){//发货
+ $data['keyword1']['value'] = $order['order_id'];
+ $data['keyword2']['value'] = $order['delivery_name'];
+ $data['keyword3']['value'] = $order['delivery_id'];
+ $data['keyword4']['value'] = date('Y-m-d H:i:s',time());
+ $data['keyword5']['value'] = '您的商品已经发货请注意查收';
+ $formId = RoutineFormId::getFormIdOne($order['uid']);
+ if($formId){
+ RoutineFormId::delFormIdOne($formId);
+ RoutineTemplateService::sendTemplate($routine_openid,
+ RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_POSTAGE_SUCCESS),
+ '',
+ $data,
+ $formId);
+ }
+ }
+ }
+
/**
* 获取订单总数
diff --git a/application/admin/model/order/StoreOrderCartInfo.php b/application/admin/model/order/StoreOrderCartInfo.php
new file mode 100644
index 00000000..ef5e86a8
--- /dev/null
+++ b/application/admin/model/order/StoreOrderCartInfo.php
@@ -0,0 +1,33 @@
+
+ * @day: 2017/12/26
+ */
+
+namespace app\admin\model\order;
+
+
+use basic\ModelBasic;
+use traits\ModelTrait;
+
+class StoreOrderCartInfo extends ModelBasic
+{
+ use ModelTrait;
+
+ /** 获取订单产品列表
+ * @param $oid
+ * @return array
+ */
+ public static function getProductNameList($oid)
+ {
+ $cartInfo = self::where('oid',$oid)->select();
+ $goodsName = [];
+ foreach ($cartInfo as $cart){
+ $suk = isset($cart['cart_info']['productInfo']['attrInfo']) ? '('.$cart['cart_info']['productInfo']['attrInfo']['suk'].')' : '';
+ $goodsName[] = $cart['cart_info']['productInfo']['store_name'].$suk;
+ }
+ return $goodsName;
+ }
+
+}
\ No newline at end of file
diff --git a/application/admin/model/routine/RoutineFormId.php b/application/admin/model/routine/RoutineFormId.php
new file mode 100644
index 00000000..9a72b78c
--- /dev/null
+++ b/application/admin/model/routine/RoutineFormId.php
@@ -0,0 +1,43 @@
+where('stop_time','LT',time())->delete();
+ }
+
+ /**
+ * 获取一个可以使用的formId
+ * @return bool|mixed
+ */
+ public static function getFormIdOne($uid = 0){
+ $formId = self::where('status',1)->where('stop_time','GT',time())->where('uid',$uid)->order('id asc')->find();
+ if($formId) return $formId['form_id'];
+ else return false;
+ }
+
+ /**
+ * 修改一个FormID为已使用
+ * @param string $formId
+ * @return $this|bool
+ */
+ public static function delFormIdOne($formId = ''){
+ if($formId == '') return true;
+ return self::where('form_id',$formId)->update(['status'=>2]);
+ }
+}
\ No newline at end of file
diff --git a/application/admin/model/user/User.php b/application/admin/model/user/User.php
index 43e82e83..a752537c 100644
--- a/application/admin/model/user/User.php
+++ b/application/admin/model/user/User.php
@@ -1 +1 @@
-
* @day: 2017/11/11
*/
namespace app\admin\model\user;
use app\admin\model\order\StoreOrder;
use traits\ModelTrait;
use app\wap\model\user\UserBill;
use basic\ModelBasic;
use app\admin\model\wechat\WechatUser;
use app\admin\model\store\StoreCouponUser;
use app\admin\model\user\UserExtract;
use think\Db;
/**
* 用户管理 model
* Class User
* @package app\admin\model\user
*/
class User extends ModelBasic
{
use ModelTrait;
/**
* @param $where
* @return array
*/
public static function systemPage($where){
$model = new self;
if($where['status'] != '') $model = $model->where('status',$where['status']);
if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']);
if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']);
if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%");
$model = $model->order('uid desc');
return self::page($model,function ($item){
if($item['spread_uid']){
$item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname');
}else{
$item['spread_uid_nickname'] = '无';
}
},$where);
}
/*
* 设置搜索条件
*
*/
public static function setWhere($where)
{
if($where['order']!=''){
$model=self::order(self::setOrder($where['order']));
}else{
$model=self::order('u.uid desc');
}
if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or');
}
if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.last_time', '>', strtotime($startTime));
$model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600);
}
if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.add_time', '>', strtotime($startTime));
$model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600);
}
if($where['pay_count'] !== '') {
if($where['pay_count'] == '-1') $model = $model->where('pay_count',0);
else $model = $model->where('pay_count','>',$where['pay_count']);
}
if($where['user_type'] != ''){
if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null');
else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null');
}
if($where['country'] != ''){
if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国');
else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国');
}
return $model;
}
/**
* 异步获取当前用户 信息
* @param $where
* @return array
*/
public static function getUserList($where){
$model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']);
$list = $model->alias('u')
->join('WechatUser w','u.uid=w.uid')
->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time')
->page((int)$where['page'],(int)$where['limit'])
->select()
->each(function ($item){
$item['add_time']=date('Y-m-d H:i:s',$item['add_time']);
if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期
else $item['last_time'] = '无访问';//最近一次访问日期
self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']);
$item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
if($item['spread_uid']){
$item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid'];
}else{
$item['spread_uid_nickname'] = '无';
}
if($item['openid'] != '' && $item['routine_openid'] != ''){
$item['user_type']='公众号小程序类型';
}else if($item['openid'] == '' && $item['routine_openid'] != ''){
$item['user_type']='小程序类型';
}else if($item['openid'] != '' && $item['routine_openid'] == ''){
$item['user_type']='公众号类型';
}else $item['user_type']='其他类型';
if($item['sex'] == 1){
$item['sex']='男';
}else if($item['sex'] == 2){
$item['sex']='女';
}else $item['sex']='保密';
})->toArray();
$count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count();
return ['count'=>$count,'data'=>$list];
}
/**
* 修改用户状态
* @param $uids 用户uid
* @param $status 修改状态
* @return array
*/
public static function destrSyatus($uids,$status){
if(empty($uids) && !is_array($uids)) return false;
if($status=='') return false;
self::beginTrans();
try{
$res=self::where('uid','in',$uids)->update(['status'=>$status]);
self::checkTrans($res);
return true;
}catch (\Exception $e){
self::rollbackTrans();
return Json::fail($e->getMessage());
}
}
/*
* 获取某季度,某年某年后的时间戳
*
* self::getMonth('n',1) 获取当前季度的上个季度的时间戳
* self::getMonth('n') 获取当前季度的时间戳
*/
public static function getMonth($time='',$ceil=0){
if(empty($time)){
$firstday = date("Y-m-01",time());
$lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day"));
}else if($time=='n'){
if($ceil!=0)
$season = ceil(date('n') /3)-$ceil;
else
$season = ceil(date('n') /3);
$firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
$lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
}else if($time=='y'){
$firstday=date('Y-01-01');
$lastday=date('Y-12-31');
}else if($time=='h'){
$firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00';
$lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59';
}
return array($firstday,$lastday);
}
public static function getcount(){
return self::count();
}
/*
*获取用户某个时间段的消费信息
*
* reutrn Array || number
*/
public static function consume($where,$status='',$keep=''){
$model = new self;
$user_id=[];
if(is_array($where)){
if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']);
if($where['status']!='') $model=$model->where('status',$where['status']);
switch ($where['date']){
case null:case 'today':case 'week':case 'year':
if($where['date']==null){
$where['date']='month';
}
if($keep){
$model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']);
}else{
$model=$model->whereTime('add_time',$where['date']);
}
break;
case 'quarter':
$quarter=self::getMonth('n');
$startTime=strtotime($quarter[0]);
$endTime=strtotime($quarter[1]);
if($keep){
$model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime);
}else{
$model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime);
}
break;
default:
//自定义时间
if(strstr($where['date'],'-')!==FALSE){
list($startTime,$endTime)=explode('-',$where['date']);
$model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime));
}else{
$model=$model->whereTime('add_time','month');
}
break;
}
}else{
if(is_array($status)){
$model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]);
}
}
if($keep===true){
return $model->count();
}
if($status==='default'){
return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray();
}
if($status==='grouping'){
return $model->group('user_type')->field('user_type')->select()->toArray();
}
$uid=$model->field('uid')->select()->toArray();
foreach ($uid as $val){
$user_id[]=$val['uid'];
}
if(empty($user_id)){
$user_id=[0];
}
if($status==='xiaofei'){
$list=UserBill::where('uid','in',$user_id)
->group('type')
->field('sum(number) as top_number,title')
->select()
->toArray();
$series=[
'name'=>isset($list[0]['title'])?$list[0]['title']:'',
'type'=>'pie',
'radius'=> ['40%', '50%'],
'data'=>[]
];
foreach($list as $key=>$val){
$series['data'][$key]['value']=$val['top_number'];
$series['data'][$key]['name']=$val['title'];
}
return $series;
}else if($status==='form'){
$list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray();
$count=self::getcount();
$option=[
'legend_date'=>[],
'series_date'=>[]
];
foreach($list as $key=>$val){
$num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0;
$t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle'];
$option['legend_date'][$key]=$t;
$option['series_date'][$key]=['value'=>$num,'name'=>$t['name']];
}
return $option;
}else{
$number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number');
return $number;
}
}
/*
* 获取 用户某个时间段的钱数或者TOP20排行
*
* return Array || number
*/
public static function getUserSpend($date,$status=''){
$model=new self();
$model=$model->alias('A');
switch ($date){
case null:case 'today':case 'week':case 'year':
if($date==null) $date='month';
$model=$model->whereTime('A.add_time',$date);
break;
case 'quarter':
list($startTime,$endTime)=User::getMonth('n');
$model = $model->where('A.add_time','>',strtotime($startTime));
$model = $model->where('A.add_time','<',strtotime($endTime));
break;
default:
list($startTime,$endTime)=explode('-',$date);
$model = $model->where('A.add_time','>',strtotime($startTime));
$model = $model->where('A.add_time','<',strtotime($endTime));
break;
}
if($status===true){
return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
}
$list=$model->join('user_bill B','B.uid=A.uid')
->where('B.type','pay_product')
->where('B.pm',0)
->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time')
->order('totel_number desc')
->limit(0,20)
->select()
->toArray();
if(!isset($list[0]['totel_number'])){
$list=[];
}
return $list;
}
/*
* 获取 相对于上月或者其他的数据
*
* return Array
*/
public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){
$model=new self();
if(!$status) $model=$model->alias('A');
switch ($date){
case null:case 'today':case 'week':case 'year':
if($date==null) {
$date='last month';
$title='相比上月用户'.$t.'增长';
}
if($date=='today') {
$date='yesterday';
$title='相比昨天用户'.$t.'增长';
}
if($date=='week') {
$date='last week';
$title='相比上周用户'.$t.'增长';
}
if($date=='year') {
$date='last year';
$title='相比去年用户'.$t.'增长';
}
$model=$model->whereTime($field,$date);
break;
case 'quarter':
$title='相比上季度用户'.$t.'增长';
list($startTime,$endTime)=User::getMonth('n',1);
$model = $model->where($field,'>',$startTime);
$model = $model->where($field,'<',$endTime);
break;
default:
list($startTime,$endTime)=explode('-',$date);
$title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长';
$Time=strtotime($endTime)-strtotime($startTime);
$model = $model->where($field,'>',strtotime($startTime)+$Time);
$model = $model->where($field,'<',strtotime($endTime)+$Time);
break;
}
if($status){
return [$model->count(),$title];
}
$number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
return [$number,$title];
}
//获取用户新增,头部信息
public static function getBadgeList($where){
$user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count();
$user_count_old=self::getOldDate($where)->count();
$fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count();
$fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count();
$newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0);
$order_count=bcsub($user_count,$user_count_old,0);
return [
[
'name'=>'会员人数',
'field'=>'个',
'count'=>$user_count,
'content'=>'会员总人数',
'background_color'=>'layui-bg-blue',
'sum'=>self::count(),
'class'=>'fa fa-bar-chart',
],
[
'name'=>'会员增长',
'field'=>'个',
'count'=>$order_count,
'content'=>'会员增长率',
'background_color'=>'layui-bg-cyan',
'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0,
'class'=>'fa fa-line-chart',
],
[
'name'=>'分销人数',
'field'=>'个',
'count'=>$fenxiao,
'content'=>'分销总人数',
'background_color'=>'layui-bg-green',
'sum'=>self::where('spread_uid','neq',0)->count(),
'class'=>'fa fa-bar-chart',
],
[
'name'=>'分销增长',
'field'=>'个',
'count'=>$newFemxiao_count,
'content'=>'分销总人数',
'background_color'=>'layui-bg-orange',
'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0,
'class'=>'fa fa-cube',
],
];
}
/*
* 获取会员增长曲线图和分布图
* $where 查询条件
* $limit 显示条数,是否有滚动条
*/
public static function getUserChartList($where,$limit=20){
$list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])
->where('add_time','neq',0)
->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num'])
->order('_add_time asc')
->group('_add_time')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$Zoom='';
foreach ($list as $item){
$seriesdata[]=$item['num'];
$xdata[]=$item['_add_time'];
}
(count($xdata) > $limit) && $Zoom=$xdata[$limit-5];
//多次购物会员数量饼状图
$count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count();
$user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter'])
->where('r.paid',1)->count('a.uid');
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0],
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1],
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom');
}
//获取$date的前一天或者其他的时间段
public static function getOldDate($where,$moedls=null){
$model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls;
switch ($where['data']){
case 'today':
$model=$model->whereTime('add_time','yesterday');
break;
case 'week':
$model=$model->whereTime('add_time','last week');
break;
case 'month':
$model=$model->whereTime('add_time','last month');
break;
case 'year':
$model=$model->whereTime('add_time','last year');
break;
case 'quarter':
$time=self::getMonth('n',1);
$model=$model->where('add_time','between',$time);
break;
}
return $model;
}
//获取用户属性和性别分布图
public static function getEchartsData($where){
$model=self::alias('a');
$data=self::getModelTime($where,$model,'a.add_time')
->join('wechat_user r','r.uid=a.uid')
->group('r.province')
->field('count(r.province) as count,province')
->order('count desc')
->limit(15)
->select();
if(count($data)) $data=$data->toArray();
$legdata=[];
$dataList=[];
foreach ($data as $value){
$value['province']=='' && $value['province']='未知省份';
$legdata[]=$value['province'];
$dataList[]=$value['count'];
}
$model=self::alias('a');
$sex=self::getModelTime($where,$model,'a.add_time')
->join('wechat_user r','r.uid=a.uid')
->group('r.sex')
->field('count(r.uid) as count,sex')
->order('count desc')
->select();
if(count($sex)) $sex=$sex->toArray();
$sexlegdata=['男','女','未知'];
$sexcount=self::getModelTime($where,new self())->count();
$sexList=[];
$color=['#FB7773','#81BCFE','#91F3FE'];
foreach ($sex as $key=>$item){
if($item['sex']==1){
$item_date['name']='男';
}else if($item['sex']==2){
$item_date['name']='女';
}else{
$item_date['name']='未知性别';
}
$item_date['value']=bcdiv($item['count'],$sexcount,2)*100;
$item_date['itemStyle']['color']=$color[$key];
$sexList[]=$item_date;
}
return compact('sexList','sexlegdata','legdata','dataList');
}
//获取佣金记录列表
public static function getCommissionList($where){
$list=self::setCommissionWhere($where)
->page((int)$where['page'],(int)$where['limit'])
->select();
count($list) && $list=$list->toArray();
foreach ($list as &$value){
$value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price');
$value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price');
}
$count=self::setCommissionWhere($where)->count();
return ['data'=>$list,'count'=>$count];
}
//获取佣金记录列表的查询条件
public static function setCommissionWhere($where){
$models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid'])
->join('user_bill B','B.uid=A.uid')
->group('A.uid')
->where(['B.category'=>'now_money','B.type'=>'brokerage'])
->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']);
if($where['order']==''){
$models=$models->order('sum_number desc');
}else{
$models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc');
}
if($where['price_max']!='' && $where['price_min']!=''){
$models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]);
}
return $models;
}
//获取某人用户推广信息
public static function getUserinfo($uid){
$userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray();
$userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number');
$userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :'';
return $userinfo;
}
//获取某用户的详细信息
public static function getUserDetailed($uid){
$key_field=['real_name','phone','province','city','district','detail','post_code'];
$Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ?
$thisAddress :
Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find();
$UserInfo=self::get($uid);
return [
['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''],
// ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8],
['name'=>'手机号码','value'=>$UserInfo['phone']],
// ['name'=>'ID','value'=>$uid],
['name'=>'姓名','value'=>''],
['name'=>'微信昵称','value'=>$UserInfo['nickname']],
['name'=>'邮箱','value'=>''],
['name'=>'生日','value'=>''],
['name'=>'积分','value'=>UserBill::where(['category'=>'integral','uid'=>$uid])->where('type','in',['sign','system_add'])->sum('number')],
['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''],
['name'=>'账户余额','value'=>$UserInfo['now_money']],
['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')],
['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')],
];
}
//获取某用户的订单个数,消费明细
public static function getHeaderList($uid){
return [
[
'title'=>'总计订单',
'value'=>StoreOrder::where(['uid'=>$uid])->count(),
'key'=>'笔',
'class'=>'',
],
[
'title'=>'总消费金额',
'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'),
'key'=>'元',
'class'=>'',
],
[
'title'=>'本月订单',
'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(),
'key'=>'笔',
'class'=>'',
],
[
'title'=>'本月消费金额',
'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'),
'key'=>'元',
'class'=>'',
]
];
}
/*
* 获取 会员 订单个数,积分明细,优惠劵明细
*
* $uid 用户id;
*
* return array
*/
public static function getCountInfo($uid){
$order_count=StoreOrder::where(['uid'=>$uid])->count();
$integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count();
$sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count();
$balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money'])
->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub'])
->count();
$coupon_count=StoreCouponUser::where(['uid'=>$uid])->count();
$spread_count=self::where(['spread_uid'=>$uid])->count();
return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count');
}
/*
* 获取 会员业务的
* 购物会员统计
* 会员访问量
*
* 曲线图
*
* $where 查询条件
*
* return array
*/
public static function getUserBusinessChart($where,$limit=20){
//获取购物会员人数趋势图
$list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where(['r.paid'=>1,'a.is_promoter'=>0])
->where('a.add_time','neq',0)
->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$zoom='';
foreach ($list as $item){
$seriesdata[]=$item['count_user'];
$xdata[]=$item['_add_time'];
}
count($xdata) > $limit && $zoom=$xdata[$limit-5];
//会员访问量
$visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time')
->where('a.is_promoter',0)
->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($visit) && $visit=$visit->toArray();
$visit_data=[];
$visit_xdata=[];
$visit_zoom='';
foreach ($visit as $item){
$visit_data[]=$item['count_user'];
$visit_xdata[]=$item['_add_time'];
}
count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
//多次购物会员数量饼状图
$count=self::getModelTime($where,self::where('is_promoter',0))->count();
$user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where('a.is_promoter',0)
->where('r.paid',1)
->group('a.uid')
->count();
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0],
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1],
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata');
}
/*
* 获取用户
* 积分排行
* 会员余额排行榜
* 分销商佣金总额排行榜
* 购物笔数排行榜
* 购物金额排行榜
* 分销商佣金提现排行榜
* 上月消费排行榜
* $limit 查询多少条
* return array
*/
public static function getUserTop10List($limit=10,$is_promoter=0){
//积分排行
$integral=self::where('status',1)
->where('is_promoter',$is_promoter)
->order('integral desc')
->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time'])
->limit($limit)
->select();
count($integral) && $integral=$integral->toArray();
//会员余额排行榜
$now_money=self::where('status',1)
->where('is_promoter',$is_promoter)
->order('now_money desc')
->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time'])
->limit($limit)
->select();
count($now_money) && $now_money=$now_money->toArray();
//购物笔数排行榜
$shopcount=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
->group('r.uid')
->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time'])
->order('sum_count desc')
->limit($limit)
->select();
count($shopcount) && $shopcount=$shopcount->toArray();
//购物金额排行榜
$order=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
->group('r.uid')
->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid'])
->order('sum_price desc')
->limit($limit)
->select();
count($order) && $order=$order->toArray();
//上月消费排行
$lastorder=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
->whereTime('r.pay_time','last month')
->group('r.uid')
->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid'])
->order('sum_price desc')
->limit($limit)
->select();
return compact('integral','now_money','shopcount','order','lastorder');
}
/*
* 获取 会员业务
* 会员总余额 会员总积分
* $where 查询条件
*
* return array
*/
public static function getUserBusinesHeade($where){
return [
[
'name'=>'会员总余额',
'field'=>'元',
'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'),
'background_color'=>'layui-bg-cyan',
'col'=>6,
],
[
'name'=>'会员总积分',
'field'=>'分',
'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'),
'background_color'=>'layui-bg-cyan',
'col'=>6
]
];
}
/*
* 分销会员头部信息查询获取
*
* 分销商总佣金余额
* 分销商总提现佣金
* 本月分销商业务佣金
* 本月分销商佣金提现金额
* 上月分销商业务佣金
* 上月分销商佣金提现金额
* $where array 时间条件
*
* return array
*/
public static function getDistributionBadgeList($where){
return [
[
'name'=>'分销商总佣金',
'field'=>'元',
'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'分销商总佣金余额',
'field'=>'元',
'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'分销商总提现佣金',
'field'=>'元',
'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'本月分销商业务佣金',
'field'=>'元',
'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage'))
->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'本月分销商佣金提现金额',
'field'=>'元',
'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1))
->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->field('uid');
})->sum('extract_price'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
[
'name'=>'上月分销商业务佣金',
'field'=>'元',
'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->where('type','brokerage'))->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
[
'name'=>'上月分销商佣金提现金额',
'field'=>'元',
'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->where('type','brokerage'))->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
];
}
/*
* 分销会员
* 分销数量 饼状图
* 分销商会员访问量 曲线
* 获取购物会员人数趋势图 曲线
* 多次购物分销会员数量 饼状图
* $where array 条件
* $limit int n条数据后出拖动条
* return array
*/
public static function getUserDistributionChart($where,$limit=20){
//分销数量
$fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select();
count($fenbu_user) && $fenbu_user=$fenbu_user->toArray();
$sum_user=0;
$fenbu_data=[];
$fenbu_xdata=['分销商','非分销商'];
$color=['#81BCFE','#91F3FE'];
foreach($fenbu_user as $item){
$sum_user+=$item['num'];
}
foreach ($fenbu_user as $key=>$item){
$value['value']=bcdiv($item['num'],$sum_user,2)*100;
$value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :'';
$value['itemStyle']['color']=$color[$key];
$fenbu_data[]=$value;
}
//分销商会员访问量
$visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time')
->where('a.is_promoter',1)
->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($visit) && $visit=$visit->toArray();
$visit_data=[];
$visit_xdata=[];
$visit_zoom='';
foreach ($visit as $item){
$visit_data[]=$item['count_user'];
$visit_xdata[]=$item['_add_time'];
}
count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
//获取购物会员人数趋势图
$list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where(['r.paid'=>1,'a.is_promoter'=>1])
->where('a.add_time','neq',0)
->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$zoom='';
foreach ($list as $item){
$seriesdata[]=$item['count_user'];
$xdata[]=$item['_add_time'];
}
count($xdata) > $limit && $zoom=$xdata[$limit-5];
//多次购物分销会员数量饼状图
$count=self::getModelTime($where,self::where('is_promoter',1))->count();
$user_count=self::getModelTime($where,self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where('a.is_promoter',1)
->where('r.paid',1)
->group('a.uid')
->count();
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0].$user_count.'人',
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1].($count-$user_count).'人',
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data');
}
/*
* 分销商佣金提现排行榜
* 分销商佣金总额排行榜
* $limit 截取条数
* return array
*/
public static function getUserDistributionTop10List($limit){
//分销商佣金提现排行榜
$extract=self::alias('a')
->join('user_extract t','a.uid=t.uid')
->where(['t.status'=>1,'a.is_promoter'=>1])
->group('t.uid')
->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid'])
->order('sum_price desc')
->limit($limit)
->select();
count($extract) && $extract=$extract->toArray();
//分销商佣金总额排行榜
$commission=UserBill::alias('l')
->join('user a','l.uid=a.uid')
->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1])
->group('l.uid')
->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time'])
->order('sum_number desc')
->limit($limit)
->select();
count($commission) && $commission=$commission->toArray();
return compact('extract','commission');
}
public static function getSpreadList($uid,$page,$limit){
$list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time'])
->order('uid desc')->page((int)$page,(int)$limit)->select();
count($list) && $list=$list->toArray();
foreach ($list as &$item){
$item['add_time']=date('Y-m-d H',$item['add_time']);
}
return $list;
}
}
\ No newline at end of file
+
* @day: 2017/11/11
*/
namespace app\admin\model\user;
use app\admin\model\order\StoreOrder;
use traits\ModelTrait;
use app\wap\model\user\UserBill;
use basic\ModelBasic;
use app\admin\model\wechat\WechatUser;
use app\admin\model\store\StoreCouponUser;
use app\admin\model\user\UserExtract;
use think\Db;
/**
* 用户管理 model
* Class User
* @package app\admin\model\user
*/
class User extends ModelBasic
{
use ModelTrait;
/**
* @param $where
* @return array
*/
public static function systemPage($where){
$model = new self;
if($where['status'] != '') $model = $model->where('status',$where['status']);
if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']);
if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']);
if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%");
$model = $model->order('uid desc');
return self::page($model,function ($item){
if($item['spread_uid']){
$item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname');
}else{
$item['spread_uid_nickname'] = '无';
}
},$where);
}
/*
* 设置搜索条件
*
*/
public static function setWhere($where)
{
if($where['order']!=''){
$model=self::order(self::setOrder($where['order']));
}else{
$model=self::order('u.uid desc');
}
if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or');
}
if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.last_time', '>', strtotime($startTime));
$model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600);
}
if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){
list($startTime, $endTime) = explode(' - ', $where['user_time']);
$model = $model->where('u.add_time', '>', strtotime($startTime));
$model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600);
}
if($where['pay_count'] !== '') {
if($where['pay_count'] == '-1') $model = $model->where('pay_count',0);
else $model = $model->where('pay_count','>',$where['pay_count']);
}
if($where['user_type'] != ''){
if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null');
else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null');
}
if($where['country'] != ''){
if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国');
else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国');
}
return $model;
}
/**
* 异步获取当前用户 信息
* @param $where
* @return array
*/
public static function getUserList($where){
$model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']);
$list = $model->alias('u')
->join('WechatUser w','u.uid=w.uid')
->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time')
->page((int)$where['page'],(int)$where['limit'])
->select()
->each(function ($item){
$item['add_time']=date('Y-m-d H:i:s',$item['add_time']);
if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期
else $item['last_time'] = '无访问';//最近一次访问日期
self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']);
$item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
if($item['spread_uid']){
$item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid'];
}else{
$item['spread_uid_nickname'] = '无';
}
if($item['openid'] != '' && $item['routine_openid'] != ''){
$item['user_type']='通用';
}else if($item['openid'] == '' && $item['routine_openid'] != ''){
$item['user_type']='小程序';
}else if($item['openid'] != '' && $item['routine_openid'] == ''){
$item['user_type']='公众号';
}else $item['user_type']='其他';
if($item['sex'] == 1){
$item['sex']='男';
}else if($item['sex'] == 2){
$item['sex']='女';
}else $item['sex']='保密';
})->toArray();
$count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count();
return ['count'=>$count,'data'=>$list];
}
/**
* 修改用户状态
* @param $uids 用户uid
* @param $status 修改状态
* @return array
*/
public static function destrSyatus($uids,$status){
if(empty($uids) && !is_array($uids)) return false;
if($status=='') return false;
self::beginTrans();
try{
$res=self::where('uid','in',$uids)->update(['status'=>$status]);
self::checkTrans($res);
return true;
}catch (\Exception $e){
self::rollbackTrans();
return Json::fail($e->getMessage());
}
}
/*
* 获取某季度,某年某年后的时间戳
*
* self::getMonth('n',1) 获取当前季度的上个季度的时间戳
* self::getMonth('n') 获取当前季度的时间戳
*/
public static function getMonth($time='',$ceil=0){
if(empty($time)){
$firstday = date("Y-m-01",time());
$lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day"));
}else if($time=='n'){
if($ceil!=0)
$season = ceil(date('n') /3)-$ceil;
else
$season = ceil(date('n') /3);
$firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
$lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
}else if($time=='y'){
$firstday=date('Y-01-01');
$lastday=date('Y-12-31');
}else if($time=='h'){
$firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00';
$lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59';
}
return array($firstday,$lastday);
}
public static function getcount(){
return self::count();
}
/*
*获取用户某个时间段的消费信息
*
* reutrn Array || number
*/
public static function consume($where,$status='',$keep=''){
$model = new self;
$user_id=[];
if(is_array($where)){
if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']);
if($where['status']!='') $model=$model->where('status',$where['status']);
switch ($where['date']){
case null:case 'today':case 'week':case 'year':
if($where['date']==null){
$where['date']='month';
}
if($keep){
$model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']);
}else{
$model=$model->whereTime('add_time',$where['date']);
}
break;
case 'quarter':
$quarter=self::getMonth('n');
$startTime=strtotime($quarter[0]);
$endTime=strtotime($quarter[1]);
if($keep){
$model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime);
}else{
$model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime);
}
break;
default:
//自定义时间
if(strstr($where['date'],'-')!==FALSE){
list($startTime,$endTime)=explode('-',$where['date']);
$model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime));
}else{
$model=$model->whereTime('add_time','month');
}
break;
}
}else{
if(is_array($status)){
$model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]);
}
}
if($keep===true){
return $model->count();
}
if($status==='default'){
return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray();
}
if($status==='grouping'){
return $model->group('user_type')->field('user_type')->select()->toArray();
}
$uid=$model->field('uid')->select()->toArray();
foreach ($uid as $val){
$user_id[]=$val['uid'];
}
if(empty($user_id)){
$user_id=[0];
}
if($status==='xiaofei'){
$list=UserBill::where('uid','in',$user_id)
->group('type')
->field('sum(number) as top_number,title')
->select()
->toArray();
$series=[
'name'=>isset($list[0]['title'])?$list[0]['title']:'',
'type'=>'pie',
'radius'=> ['40%', '50%'],
'data'=>[]
];
foreach($list as $key=>$val){
$series['data'][$key]['value']=$val['top_number'];
$series['data'][$key]['name']=$val['title'];
}
return $series;
}else if($status==='form'){
$list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray();
$count=self::getcount();
$option=[
'legend_date'=>[],
'series_date'=>[]
];
foreach($list as $key=>$val){
$num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0;
$t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle'];
$option['legend_date'][$key]=$t;
$option['series_date'][$key]=['value'=>$num,'name'=>$t['name']];
}
return $option;
}else{
$number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number');
return $number;
}
}
/*
* 获取 用户某个时间段的钱数或者TOP20排行
*
* return Array || number
*/
public static function getUserSpend($date,$status=''){
$model=new self();
$model=$model->alias('A');
switch ($date){
case null:case 'today':case 'week':case 'year':
if($date==null) $date='month';
$model=$model->whereTime('A.add_time',$date);
break;
case 'quarter':
list($startTime,$endTime)=User::getMonth('n');
$model = $model->where('A.add_time','>',strtotime($startTime));
$model = $model->where('A.add_time','<',strtotime($endTime));
break;
default:
list($startTime,$endTime)=explode('-',$date);
$model = $model->where('A.add_time','>',strtotime($startTime));
$model = $model->where('A.add_time','<',strtotime($endTime));
break;
}
if($status===true){
return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
}
$list=$model->join('user_bill B','B.uid=A.uid')
->where('B.type','pay_product')
->where('B.pm',0)
->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time')
->order('totel_number desc')
->limit(0,20)
->select()
->toArray();
if(!isset($list[0]['totel_number'])){
$list=[];
}
return $list;
}
/*
* 获取 相对于上月或者其他的数据
*
* return Array
*/
public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){
$model=new self();
if(!$status) $model=$model->alias('A');
switch ($date){
case null:case 'today':case 'week':case 'year':
if($date==null) {
$date='last month';
$title='相比上月用户'.$t.'增长';
}
if($date=='today') {
$date='yesterday';
$title='相比昨天用户'.$t.'增长';
}
if($date=='week') {
$date='last week';
$title='相比上周用户'.$t.'增长';
}
if($date=='year') {
$date='last year';
$title='相比去年用户'.$t.'增长';
}
$model=$model->whereTime($field,$date);
break;
case 'quarter':
$title='相比上季度用户'.$t.'增长';
list($startTime,$endTime)=User::getMonth('n',1);
$model = $model->where($field,'>',$startTime);
$model = $model->where($field,'<',$endTime);
break;
default:
list($startTime,$endTime)=explode('-',$date);
$title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长';
$Time=strtotime($endTime)-strtotime($startTime);
$model = $model->where($field,'>',strtotime($startTime)+$Time);
$model = $model->where($field,'<',strtotime($endTime)+$Time);
break;
}
if($status){
return [$model->count(),$title];
}
$number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
return [$number,$title];
}
//获取用户新增,头部信息
public static function getBadgeList($where){
$user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count();
$user_count_old=self::getOldDate($where)->count();
$fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count();
$fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count();
$newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0);
$order_count=bcsub($user_count,$user_count_old,0);
return [
[
'name'=>'会员人数',
'field'=>'个',
'count'=>$user_count,
'content'=>'会员总人数',
'background_color'=>'layui-bg-blue',
'sum'=>self::count(),
'class'=>'fa fa-bar-chart',
],
[
'name'=>'会员增长',
'field'=>'个',
'count'=>$order_count,
'content'=>'会员增长率',
'background_color'=>'layui-bg-cyan',
'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0,
'class'=>'fa fa-line-chart',
],
[
'name'=>'分销人数',
'field'=>'个',
'count'=>$fenxiao,
'content'=>'分销总人数',
'background_color'=>'layui-bg-green',
'sum'=>self::where('spread_uid','neq',0)->count(),
'class'=>'fa fa-bar-chart',
],
[
'name'=>'分销增长',
'field'=>'个',
'count'=>$newFemxiao_count,
'content'=>'分销总人数',
'background_color'=>'layui-bg-orange',
'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0,
'class'=>'fa fa-cube',
],
];
}
/*
* 获取会员增长曲线图和分布图
* $where 查询条件
* $limit 显示条数,是否有滚动条
*/
public static function getUserChartList($where,$limit=20){
$list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])
->where('add_time','neq',0)
->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num'])
->order('_add_time asc')
->group('_add_time')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$Zoom='';
foreach ($list as $item){
$seriesdata[]=$item['num'];
$xdata[]=$item['_add_time'];
}
(count($xdata) > $limit) && $Zoom=$xdata[$limit-5];
//多次购物会员数量饼状图
$count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count();
$user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter'])
->where('r.paid',1)->count('a.uid');
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0],
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1],
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom');
}
//获取$date的前一天或者其他的时间段
public static function getOldDate($where,$moedls=null){
$model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls;
switch ($where['data']){
case 'today':
$model=$model->whereTime('add_time','yesterday');
break;
case 'week':
$model=$model->whereTime('add_time','last week');
break;
case 'month':
$model=$model->whereTime('add_time','last month');
break;
case 'year':
$model=$model->whereTime('add_time','last year');
break;
case 'quarter':
$time=self::getMonth('n',1);
$model=$model->where('add_time','between',$time);
break;
}
return $model;
}
//获取用户属性和性别分布图
public static function getEchartsData($where){
$model=self::alias('a');
$data=self::getModelTime($where,$model,'a.add_time')
->join('wechat_user r','r.uid=a.uid')
->group('r.province')
->field('count(r.province) as count,province')
->order('count desc')
->limit(15)
->select();
if(count($data)) $data=$data->toArray();
$legdata=[];
$dataList=[];
foreach ($data as $value){
$value['province']=='' && $value['province']='未知省份';
$legdata[]=$value['province'];
$dataList[]=$value['count'];
}
$model=self::alias('a');
$sex=self::getModelTime($where,$model,'a.add_time')
->join('wechat_user r','r.uid=a.uid')
->group('r.sex')
->field('count(r.uid) as count,sex')
->order('count desc')
->select();
if(count($sex)) $sex=$sex->toArray();
$sexlegdata=['男','女','未知'];
$sexcount=self::getModelTime($where,new self())->count();
$sexList=[];
$color=['#FB7773','#81BCFE','#91F3FE'];
foreach ($sex as $key=>$item){
if($item['sex']==1){
$item_date['name']='男';
}else if($item['sex']==2){
$item_date['name']='女';
}else{
$item_date['name']='未知性别';
}
$item_date['value']=bcdiv($item['count'],$sexcount,2)*100;
$item_date['itemStyle']['color']=$color[$key];
$sexList[]=$item_date;
}
return compact('sexList','sexlegdata','legdata','dataList');
}
//获取佣金记录列表
public static function getCommissionList($where){
$list=self::setCommissionWhere($where)
->page((int)$where['page'],(int)$where['limit'])
->select();
count($list) && $list=$list->toArray();
foreach ($list as &$value){
$value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price');
$value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price');
}
$count=self::setCommissionWhere($where)->count();
return ['data'=>$list,'count'=>$count];
}
//获取佣金记录列表的查询条件
public static function setCommissionWhere($where){
$models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid'])
->join('user_bill B','B.uid=A.uid')
->group('A.uid')
->where(['B.category'=>'now_money','B.type'=>'brokerage'])
->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']);
if($where['order']==''){
$models=$models->order('sum_number desc');
}else{
$models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc');
}
if($where['price_max']!='' && $where['price_min']!=''){
$models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]);
}
return $models;
}
/**获取用户详细信息
* @param $uid
* @return array
*/
public static function getUserInfos($uid)
{
$userInfo = self::where('uid',$uid)->find();
if(!$userInfo) exception('读取用户信息失败!');
return $userInfo->toArray();
}
//获取某人用户推广信息
public static function getUserinfo($uid){
$userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray();
$userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number');
$userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :'';
return $userinfo;
}
//获取某用户的详细信息
public static function getUserDetailed($uid){
$key_field=['real_name','phone','province','city','district','detail','post_code'];
$Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ?
$thisAddress :
Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find();
$UserInfo=self::get($uid);
return [
['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''],
// ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8],
['name'=>'手机号码','value'=>$UserInfo['phone']],
// ['name'=>'ID','value'=>$uid],
['name'=>'姓名','value'=>''],
['name'=>'微信昵称','value'=>$UserInfo['nickname']],
['name'=>'邮箱','value'=>''],
['name'=>'生日','value'=>''],
['name'=>'积分','value'=>UserBill::where(['category'=>'integral','uid'=>$uid])->where('type','in',['sign','system_add'])->sum('number')],
['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''],
['name'=>'账户余额','value'=>$UserInfo['now_money']],
['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')],
['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')],
];
}
//获取某用户的订单个数,消费明细
public static function getHeaderList($uid){
return [
[
'title'=>'总计订单',
'value'=>StoreOrder::where(['uid'=>$uid])->count(),
'key'=>'笔',
'class'=>'',
],
[
'title'=>'总消费金额',
'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'),
'key'=>'元',
'class'=>'',
],
[
'title'=>'本月订单',
'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(),
'key'=>'笔',
'class'=>'',
],
[
'title'=>'本月消费金额',
'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'),
'key'=>'元',
'class'=>'',
]
];
}
/*
* 获取 会员 订单个数,积分明细,优惠劵明细
*
* $uid 用户id;
*
* return array
*/
public static function getCountInfo($uid){
$order_count=StoreOrder::where(['uid'=>$uid])->count();
$integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count();
$sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count();
$balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money'])
->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub'])
->count();
$coupon_count=StoreCouponUser::where(['uid'=>$uid])->count();
$spread_count=self::where(['spread_uid'=>$uid])->count();
return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count');
}
/*
* 获取 会员业务的
* 购物会员统计
* 会员访问量
*
* 曲线图
*
* $where 查询条件
*
* return array
*/
public static function getUserBusinessChart($where,$limit=20){
//获取购物会员人数趋势图
$list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where(['r.paid'=>1,'a.is_promoter'=>0])
->where('a.add_time','neq',0)
->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$zoom='';
foreach ($list as $item){
$seriesdata[]=$item['count_user'];
$xdata[]=$item['_add_time'];
}
count($xdata) > $limit && $zoom=$xdata[$limit-5];
//会员访问量
$visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time')
->where('a.is_promoter',0)
->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($visit) && $visit=$visit->toArray();
$visit_data=[];
$visit_xdata=[];
$visit_zoom='';
foreach ($visit as $item){
$visit_data[]=$item['count_user'];
$visit_xdata[]=$item['_add_time'];
}
count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
//多次购物会员数量饼状图
$count=self::getModelTime($where,self::where('is_promoter',0))->count();
$user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where('a.is_promoter',0)
->where('r.paid',1)
->group('a.uid')
->count();
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0],
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1],
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata');
}
/*
* 获取用户
* 积分排行
* 会员余额排行榜
* 分销商佣金总额排行榜
* 购物笔数排行榜
* 购物金额排行榜
* 分销商佣金提现排行榜
* 上月消费排行榜
* $limit 查询多少条
* return array
*/
public static function getUserTop10List($limit=10,$is_promoter=0){
//积分排行
$integral=self::where('status',1)
->where('is_promoter',$is_promoter)
->order('integral desc')
->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time'])
->limit($limit)
->select();
count($integral) && $integral=$integral->toArray();
//会员余额排行榜
$now_money=self::where('status',1)
->where('is_promoter',$is_promoter)
->order('now_money desc')
->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time'])
->limit($limit)
->select();
count($now_money) && $now_money=$now_money->toArray();
//购物笔数排行榜
$orderPayCount = StoreOrder::getOrderPayCount($is_promoter);
if($orderPayCount){
$shopcount=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
->group('r.uid')
->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time'])
->order('sum_count desc')
->limit($limit)
->select();
}else $shopcount = [];
count($shopcount) && $shopcount=$shopcount->toArray();
//购物金额排行榜
if($orderPayCount){
$order=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
->group('r.uid')
->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid'])
->order('sum_price desc')
->limit($limit)
->select();
}else $order = [];
count($order) && $order=$order->toArray();
//上月消费排行
$orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter);
if($orderPayCount){
$lastorder=self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid')
->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter])
// ->whereTime('r.pay_time','last month')
->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))])
->group('r.uid')
->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid'])
->order('sum_price desc')
->limit($limit)
->select();
}else $lastorder = [];
count($lastorder) && $lastorder=$lastorder->toArray();
return compact('integral','now_money','shopcount','order','lastorder');
}
/*
* 获取 会员业务
* 会员总余额 会员总积分
* $where 查询条件
*
* return array
*/
public static function getUserBusinesHeade($where){
return [
[
'name'=>'会员总余额',
'field'=>'元',
'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'),
'background_color'=>'layui-bg-cyan',
'col'=>6,
],
[
'name'=>'会员总积分',
'field'=>'分',
'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'),
'background_color'=>'layui-bg-cyan',
'col'=>6
]
];
}
/*
* 分销会员头部信息查询获取
*
* 分销商总佣金余额
* 分销商总提现佣金
* 本月分销商业务佣金
* 本月分销商佣金提现金额
* 上月分销商业务佣金
* 上月分销商佣金提现金额
* $where array 时间条件
*
* return array
*/
public static function getDistributionBadgeList($where){
return [
[
'name'=>'分销商总佣金',
'field'=>'元',
'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'分销商总佣金余额',
'field'=>'元',
'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'分销商总提现佣金',
'field'=>'元',
'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'本月分销商业务佣金',
'field'=>'元',
'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage'))
->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>3,
],
[
'name'=>'本月分销商佣金提现金额',
'field'=>'元',
'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1))
->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->field('uid');
})->sum('extract_price'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
[
'name'=>'上月分销商业务佣金',
'field'=>'元',
'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->where('type','brokerage'))->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
[
'name'=>'上月分销商佣金提现金额',
'field'=>'元',
'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){
$query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid');
})->where('type','brokerage'))->sum('number'),
'background_color'=>'layui-bg-cyan',
'col'=>4,
],
];
}
/*
* 分销会员
* 分销数量 饼状图
* 分销商会员访问量 曲线
* 获取购物会员人数趋势图 曲线
* 多次购物分销会员数量 饼状图
* $where array 条件
* $limit int n条数据后出拖动条
* return array
*/
public static function getUserDistributionChart($where,$limit=20){
//分销数量
$fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select();
count($fenbu_user) && $fenbu_user=$fenbu_user->toArray();
$sum_user=0;
$fenbu_data=[];
$fenbu_xdata=['分销商','非分销商'];
$color=['#81BCFE','#91F3FE'];
foreach($fenbu_user as $item){
$sum_user+=$item['num'];
}
foreach ($fenbu_user as $key=>$item){
$value['value']=bcdiv($item['num'],$sum_user,2)*100;
$value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :'';
$value['itemStyle']['color']=$color[$key];
$fenbu_data[]=$value;
}
//分销商会员访问量
$visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time')
->where('a.is_promoter',1)
->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($visit) && $visit=$visit->toArray();
$visit_data=[];
$visit_xdata=[];
$visit_zoom='';
foreach ($visit as $item){
$visit_data[]=$item['count_user'];
$visit_xdata[]=$item['_add_time'];
}
count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
//获取购物会员人数趋势图
$list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where(['r.paid'=>1,'a.is_promoter'=>1])
->where('a.add_time','neq',0)
->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user'])
->group('_add_time')
->order('_add_time asc')
->select();
count($list) && $list=$list->toArray();
$seriesdata=[];
$xdata=[];
$zoom='';
foreach ($list as $item){
$seriesdata[]=$item['count_user'];
$xdata[]=$item['_add_time'];
}
count($xdata) > $limit && $zoom=$xdata[$limit-5];
//多次购物分销会员数量饼状图
$count=self::getModelTime($where,self::where('is_promoter',1))->count();
$user_count=self::getModelTime($where,self::alias('a')
->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time')
->where('a.is_promoter',1)
->where('r.paid',1)
->group('a.uid')
->count();
$shop_xdata=['多次购买数量占比','无购买数量占比'];
$shop_data=[];
$count >0 && $shop_data=[
[
'value'=>bcdiv($user_count,$count,2)*100,
'name'=>$shop_xdata[0].$user_count.'人',
'itemStyle'=>[
'color'=>'#D789FF',
]
],
[
'value'=>bcdiv($count-$user_count,$count,2)*100,
'name'=>$shop_xdata[1].($count-$user_count).'人',
'itemStyle'=>[
'color'=>'#7EF0FB',
]
]
];
return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data');
}
/*
* 分销商佣金提现排行榜
* 分销商佣金总额排行榜
* $limit 截取条数
* return array
*/
public static function getUserDistributionTop10List($limit){
//分销商佣金提现排行榜
$extract=self::alias('a')
->join('user_extract t','a.uid=t.uid')
->where(['t.status'=>1,'a.is_promoter'=>1])
->group('t.uid')
->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid'])
->order('sum_price desc')
->limit($limit)
->select();
count($extract) && $extract=$extract->toArray();
//分销商佣金总额排行榜
$commission=UserBill::alias('l')
->join('user a','l.uid=a.uid')
->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1])
->group('l.uid')
->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time'])
->order('sum_number desc')
->limit($limit)
->select();
count($commission) && $commission=$commission->toArray();
return compact('extract','commission');
}
public static function getSpreadList($uid,$page,$limit){
$list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time'])
->order('uid desc')->page((int)$page,(int)$limit)->select();
count($list) && $list=$list->toArray();
foreach ($list as &$item){
$item['add_time']=date('Y-m-d H',$item['add_time']);
}
return $list;
}
}
\ No newline at end of file
diff --git a/application/admin/model/user/UserAddress.php b/application/admin/model/user/UserAddress.php
new file mode 100644
index 00000000..056ba236
--- /dev/null
+++ b/application/admin/model/user/UserAddress.php
@@ -0,0 +1,51 @@
+
+ * @day: 2017/12/25
+ */
+
+namespace app\admin\model\user;
+
+
+use basic\ModelBasic;
+use traits\ModelTrait;
+
+class UserAddress extends ModelBasic
+{
+ use ModelTrait;
+
+ protected $insert = ['add_time'];
+
+ protected function setAddTimeAttr()
+ {
+ return time();
+ }
+
+ public static function setDefaultAddress($id,$uid)
+ {
+ self::beginTrans();
+ $res1 = self::where('uid',$uid)->update(['is_default'=>0]);
+ $res2 = self::where('id',$id)->where('uid',$uid)->update(['is_default'=>1]);
+ $res =$res1 !== false && $res2 !== false;
+ self::checkTrans($res);
+ return $res;
+ }
+
+ public static function userValidAddressWhere($model=null,$prefix = '')
+ {
+ if($prefix) $prefix .='.';
+ $model = self::getSelfModel($model);
+ return $model->where("{$prefix}is_del",0);
+ }
+
+ public static function getUserValidAddressList($uid,$field = '*')
+ {
+ return self::userValidAddressWhere()->where('uid',$uid)->order('add_time DESC')->field($field)->select()->toArray()?:[];
+ }
+
+ public static function getUserDefaultAddress($uid,$field = '*')
+ {
+ return self::userValidAddressWhere()->where('uid',$uid)->where('is_default',1)->field($field)->find();
+ }
+}
\ No newline at end of file
diff --git a/application/admin/model/wechat/WechatUser.php b/application/admin/model/wechat/WechatUser.php
index 0ee0b3d3..fe16aff4 100644
--- a/application/admin/model/wechat/WechatUser.php
+++ b/application/admin/model/wechat/WechatUser.php
@@ -33,7 +33,7 @@ use service\SystemConfigService;
protected $insert = ['add_time'];
/**
- * 用uid获得openid
+ * 用uid获得 微信openid
* @param $uid
* @return mixed
*/
@@ -47,6 +47,21 @@ use service\SystemConfigService;
Cache::set($cacheName,$openid,0);
return $openid;
}
+ /**
+ * 用uid获得 小程序 openid
+ * @param $uid
+ * @return mixed
+ */
+ public static function uidToRoutineOpenid($uid,$update = false)
+ {
+ $cacheName = 'routine_openid'.$uid;
+ $openid = Cache::get($cacheName);
+ if($openid && !$update) return $openid;
+ $openid = self::where('uid',$uid)->value('routine_openid');
+ if(!$openid) exception('对应的routine_openid不存在!');
+ Cache::set($cacheName,$openid,0);
+ return $openid;
+ }
public static function setAddTimeAttr($value)
{
@@ -145,7 +160,7 @@ use service\SystemConfigService;
* @return array
*/
public static function agentSystemPage($where = array(),$isall=false){
- self::setWechatUserOrder();//设置 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单 佣金
+// self::setWechatUserOrder();//设置 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单 佣金
$model = new self;
if($isall==false) {
$status = (int)SystemConfigService::get('store_brokerage_statu');
@@ -200,7 +215,7 @@ use service\SystemConfigService;
->ExcelSave();
}
return self::page($model,function ($item){
- $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid'])?:'';
+ $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid']);
$item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
$item['extract_count_num'] = UserExtract::getUserCountNum($item['uid']);//提现次数
},$where);
diff --git a/application/admin/view/order/store_order/index.php b/application/admin/view/order/store_order/index.php
index 04c64692..1ef3f776 100644
--- a/application/admin/view/order/store_order/index.php
+++ b/application/admin/view/order/store_order/index.php
@@ -486,6 +486,7 @@
});
},
search:function () {
+ this.where.excel=0;
this.getBadge();
layList.reload(this.where);
},
diff --git a/application/routine/model/routine/RoutineTemplate.php b/application/routine/model/routine/RoutineTemplate.php
index c74b0102..d62a76fb 100644
--- a/application/routine/model/routine/RoutineTemplate.php
+++ b/application/routine/model/routine/RoutineTemplate.php
@@ -86,38 +86,5 @@ class RoutineTemplate{
RoutineFormId::delFormIdOne($formId);
RoutineTemplateService::sendTemplate(WechatUser::getOpenId($order['uid']),RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_PAY_SUCCESS),'',$data,$formId);
}
- /**
- * 订单发货提醒
- * @param int $oid
- * @param array $postageData
- * @return bool
- */
- public static function sendOrderGoods($oid = 0,$postageData=array()){
- if(!$oid || !$postageData) return true;
- $order = StoreOrder::where('id',$oid)->find();
- if(!RoutineUser::isRoutineUser($order['uid'])) return true;
- if($postageData['delivery_type'] == 'send'){//送货
- $data['keyword1']['value'] = $order['order_id'];
- $data['keyword2']['value'] = $order['delivery_name'];
- $data['keyword3']['value'] = $order['delivery_id'];
- $data['keyword4']['value'] = date('Y-m-d H:i:s',time());
- $data['keyword5']['value'] = '您的商品已经发货请注意查收';
- $formId = RoutineFormId::getFormIdOne($order['uid']);
- if($formId){
- RoutineFormId::delFormIdOne($formId);
- RoutineTemplateService::sendTemplate(WechatUser::getOpenId($order['uid']),RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_DELIVER_SUCCESS),'',$data,$formId);
- }
- }else if($postageData['delivery_type'] == 'express'){//发货
- $data['keyword1']['value'] = $order['order_id'];
- $data['keyword2']['value'] = $order['delivery_name'];
- $data['keyword3']['value'] = $order['delivery_id'];
- $data['keyword4']['value'] = date('Y-m-d H:i:s',time());
- $data['keyword5']['value'] = '您的商品已经发货请注意查收';
- $formId = RoutineFormId::getFormIdOne($order['uid']);
- if($formId){
- RoutineFormId::delFormIdOne($formId);
- RoutineTemplateService::sendTemplate(WechatUser::getOpenId($order['uid']),RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_POSTAGE_SUCCESS),'',$data,$formId);
- }
- }
- }
+
}
\ No newline at end of file
From b7890e3e3720e72884093a57515987859641d37a Mon Sep 17 00:00:00 2001
From: sugar1569
Date: Thu, 27 Dec 2018 11:05:01 +0800
Subject: [PATCH 03/12] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B8=85=E9=99=A4?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=96=87=E7=AB=A0=E6=B2=A1=E6=9C=89=E6=B8=85?=
=?UTF-8?q?=E7=A9=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/system/SystemCleardata.php | 29 ++++---------------
.../view/system/system_cleardata/index.php | 2 +-
2 files changed, 7 insertions(+), 24 deletions(-)
diff --git a/application/admin/controller/system/SystemCleardata.php b/application/admin/controller/system/SystemCleardata.php
index 98208360..03bb4d79 100644
--- a/application/admin/controller/system/SystemCleardata.php
+++ b/application/admin/controller/system/SystemCleardata.php
@@ -85,28 +85,11 @@ class SystemCleardata extends AuthController
SystemCleardata::ClearData('store_service_log',1);
return Json::successful('清除数据成功!');
}
- //修改用户默认密码
- public function userdate(){
-// SystemCleardata::ClearData('user',1);
- $headimgurl= WechatUser::Where('uid',1)->value('headimgurl');
- $data['account']='crmeb';
- $data['pwd']=md5(123456);
- $data['avatar']=$headimgurl;
- $data['add_time']=time();
- $data['status']=1;
- $data['level']=0;
- $data['user_type']="wechat";
- $data['is_promoter']=1;
- User::create($data);
- return Json::successful('清除数据成功!');
- }
+
//清除微信管理数据
public function wechatdata(){
SystemCleardata::ClearData('wechat_media',1);
SystemCleardata::ClearData('wechat_reply',1);
- SystemCleardata::ClearData('wechat_news_content',1);
- SystemCleardata::ClearData('wechat_news',1);
- SystemCleardata::ClearData('wechat_news_category',1);
$this->delDirAndFile('./public/uploads/wechat');
return Json::successful('清除数据成功!');
}
@@ -117,15 +100,15 @@ class SystemCleardata extends AuthController
}
//清除微信用户
public function wechatuserdata(){
- $data= WechatUser::get(1)->toArray();
SystemCleardata::ClearData('wechat_user',1);
- unset($data['uid']);
- WechatUser::set($data);
+ SystemCleardata::ClearData('user',1);
return Json::successful('清除数据成功!');
}
//清除内容分类
public function articledata(){
SystemCleardata::ClearData('article_category',1);
+ SystemCleardata::ClearData('article',1);
+ SystemCleardata::ClearData('article_content',1);
$this->delDirAndFile('./public/uploads/article/');
return Json::successful('清除数据成功!');
}
@@ -133,9 +116,9 @@ class SystemCleardata extends AuthController
public function ClearData($table_name,$status){
$table_name = Config::get('database')['prefix'].$table_name;
if($status){
- db::query('TRUNCATE TABLE '.$table_name);
+ @db::query('TRUNCATE TABLE '.$table_name);
}else{
- db::query('DELETE FROM'.$table_name);
+ @db::query('DELETE FROM'.$table_name);
}
}
diff --git a/application/admin/view/system/system_cleardata/index.php b/application/admin/view/system/system_cleardata/index.php
index b3ee510b..3fafeccd 100644
--- a/application/admin/view/system/system_cleardata/index.php
+++ b/application/admin/view/system/system_cleardata/index.php
@@ -21,7 +21,7 @@
-
+
+
+
+
+
+