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 = 'formBuilderExecgetId() ? '' : '_'.$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:getConfig('form'))?>, row: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 @@


- + + + + + +