From 04102f7237efefa744090ed7c25f7b5d0807b679 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Thu, 05 Feb 2026 18:11:57 +0800
Subject: [PATCH] 完成运营中心提现和运营中心权限管理
---
admin/app/api/controller/user/Bonus.php | 2
admin/app/common/model/product/Product.php | 5
shop_vue/src/views/supplier/category/part/Add.vue | 5
mobile/pages/plus/business/index.vue | 23
supplier_vue/src/views/product/product/part/Basic.vue | 6
admin/app/job/event/VipOrder.php | 4
shop_vue/src/views/product/product/part/spec/many/Table.vue | 18
admin/app/api/model/page/Page.php | 1
admin/app/shop/model/plus/operations/Cash.php | 10
saas_vue/src/views/agentaccess/part/Edit.vue | 210 ++++++
supplier_vue/src/views/statistics/index.vue | 2
admin/app/api/controller/product/Category.php | 1
mobile/pages.json | 41 +
admin/app/api/model/plus/operations/Order.php | 40 +
mobile/pages2/shareholder/index/index.vue | 102 +-
admin/app/api/controller/product/Product.php | 2
admin/app/supplier/model/product/Category.php | 4
admin/app/common/enum/supplier/SupplierType.php | 3
admin/app/api/controller/plus/vip/User.php | 2
admin/app/admin/controller/AgentAccess.php | 80 ++
admin/app/common/model/plus/operations/Setting.php | 2
supplier_vue/src/views/product/category/index.vue | 8
admin/app/job/event/AgentUserGrade.php | 3
shop_vue/src/views/product/product/edit.vue | 2
shop_vue/src/views/product/product/part/spec/Single.vue | 3
mobile/pages2/bonus/index/index.vue | 5
shop_vue/src/components/setlink/part/Menu.vue | 5
admin/app/api/service/order/paysuccess/type/MasterPaySuccessService.php | 2
shop_vue/src/views/plus/operations/setting/part/Words.vue | 19
admin/app/api/model/plus/operations/Operations.php | 10
admin/app/admin/model/AgentAccess.php | 183 +++++
admin/app/api/model/plus/operations/Cash.php | 100 ++
shop_vue/src/views/product/category/index.vue | 8
admin/app/api/model/plus/operations/User.php | 32
admin/app/api/controller/plus/operations/Cash.php | 62 +
shop_vue/src/views/plus/operations/setting/part/Basic.vue | 55 +
mobile/pages2/team/index/index.vue | 105 ++
supplier_vue/src/views/product/product/add.vue | 1
admin/app/api/model/supplier/Supplier.php | 1
admin/app/api/controller/user/Team.php | 2
admin/app/common/service/business/Poster.php | 11
admin/app/api/model/user/User.php | 3
shop_vue/src/views/plus/operations/order/Order.vue | 272 ++++++++
shop_vue/src/views/supplier/category/index.vue | 12
saas_vue/src/views/agentaccess/Index.vue | 288 ++++++++
admin/app/api/model/supplier/page/Page.php | 1
admin/app/shop/controller/supplier/Category.php | 4
admin/app/api/model/branch/ActivityUser.php | 10
shop_vue/src/views/supplier/category/part/Edit.vue | 5
mobile/pages/plus/vip/index.vue | 5
saas_vue/src/views/agentaccess/part/Add.vue | 218 ++++++
51 files changed, 1,864 insertions(+), 134 deletions(-)
diff --git a/admin/app/admin/controller/AgentAccess.php b/admin/app/admin/controller/AgentAccess.php
new file mode 100644
index 0000000..ff00702
--- /dev/null
+++ b/admin/app/admin/controller/AgentAccess.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace app\admin\controller;
+
+
+use app\admin\model\AgentAccess as AccesscModel;
+
+/**
+ * 代理商用户权限控制器
+ */
+class AgentAccess extends Controller
+{
+ /**
+ * 权限列表
+ */
+ public function index()
+ {
+ $model = new AccesscModel;
+ $list = $model->getList();
+ return $this->renderSuccess('', $list);
+ }
+
+ /**
+ * 添加权限
+ */
+ public function add()
+ {
+ $model = new AccesscModel;
+ $data = $this->postData();
+
+ if ($model->add($data)) {
+ return $this->renderSuccess('添加成功', compact('model'));
+ }
+ return $this->renderError($model->getError() ?:'添加失败');
+ }
+
+ /**
+ * 更新权限
+ */
+ public function edit()
+ {
+ $data = $this->postData();
+ // 权限详情
+ $model = AccesscModel::detail($data['access_id']);
+ // 更新记录
+ if ($model->edit($data)) {
+ return $this->renderSuccess('更新成功');
+ }
+ return $this->renderError($model->getError() ?:'更新失败');
+ }
+
+ /**
+ * 删除权限
+ */
+ public function delete($access_id)
+ {
+ $model = new AccesscModel();
+ $num = $model->getChildCount(['parent_id' => $access_id]);
+ if ($num > 0) {
+ return $this->renderError('当前菜单下存在子权限,请先删除');
+ }
+ if ($model->remove($access_id)) {
+ return $this->renderSuccess('删除成功');
+ }
+ return $this->renderError($model->getError() ?:'删除失败');
+ }
+
+ /**
+ * 权限状态
+ */
+ public function status($access_id, $status)
+ {
+ $model = AccesscModel::detail($access_id);
+ if ($model->status($status)) {
+ return $this->renderSuccess('修改成功');
+ }
+ return $this->renderError($model->getError() ?:'修改失败');
+ }
+
+}
diff --git a/admin/app/admin/model/AgentAccess.php b/admin/app/admin/model/AgentAccess.php
new file mode 100644
index 0000000..08862a9
--- /dev/null
+++ b/admin/app/admin/model/AgentAccess.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace app\admin\model;
+
+use app\common\model\plus\operations\Access as AccessModel;
+
+/**
+ * Class AgentAccess
+ * 代理商用户权限模型
+ * @package app\admin\model
+ */
+class AgentAccess extends AccessModel
+{
+ /**
+ * 获取权限列表
+ */
+ public function getList()
+ {
+ $all = static::getAll(-1);
+ $res = $this->recursiveMenuArray($all, 0);
+ return array_values($this->foo($res));
+
+ }
+
+ /**
+ * 新增记录
+ */
+ public function add($data)
+ {
+ // 校验路径
+ if(!$this->validate($data)){
+ return false;
+ }
+ $data['access_id'] = time();
+ $data['app_id'] = self::$app_id;
+ return $this->save($data);
+ }
+
+ /**
+ * 更新记录
+ */
+ public function edit($data)
+ {
+ if ($data['access_id'] == $data['parent_id']) {
+ $this->error = '上级菜单不允许设置为当前菜单';
+ return false;
+ }
+ // 判断上级角色是否为当前子级
+ if ($data['parent_id'] > 0) {
+ // 获取所有上级id集
+ $parentIds = $this->getTopAccessIds($data['parent_id']);
+ if (in_array($data['access_id'], $parentIds)) {
+ $this->error = '上级菜单不允许设置为当前子菜单';
+ return false;
+ }
+ }
+ // 校验路径,不限制大小写
+ if(strtolower($data['path']) !== strtolower($this['path'])){
+ if(!$this->validate($data)){
+ return false;
+ }
+ }
+
+ $data['redirect_name'] = ($data['is_route'] == 1) ? $data['redirect_name'] : '';
+ $data['icon'] = ($data['parent_id'] == 0) ? $data['icon'] : '';
+ return $this->save($data);
+ }
+
+ /**
+ * 验证
+ */
+ private function validate($data){
+ $count = $this->where(['path' => $data['path']])->count();
+ if($count > 0){
+ $this->error = '路径已存在,请重新更改';
+ return false;
+ }
+ return true;
+ }
+
+ public function getChildCount($where)
+ {
+ return $this->where($where)->count();
+ }
+
+
+ /**
+ * 删除权限
+ */
+ public function remove($access_id)
+ {
+ return $this->where('access_id', '=', $access_id)->delete();
+ }
+ /**
+ * 删除插件
+ */
+ public function removePlus()
+ {
+ return $this->save([
+ 'plus_category_id' => 0
+ ]);
+ }
+
+ /**
+ * 获取所有上级id集
+ */
+ public function getTopAccessIds($access_id, &$all = null)
+ {
+ static $ids = [];
+ is_null($all) && $all = $this->getAll();
+
+ foreach ($all as $item) {
+ if ($item['access_id'] == $access_id && $item['parent_id'] > 0) {
+ $ids[] = $item['parent_id'];
+ $this->getTopAccessIds($item['parent_id'], $all);
+ }
+ }
+
+ return $ids;
+ }
+
+ /**
+ * 递归获取获取分类
+ */
+ public function recursiveMenuArray($data, $pid)
+ {
+ $re_data = [];
+ foreach ($data as $key => $value) {
+ if ($value['parent_id'] == $pid) {
+ $re_data[$value['access_id']] = $value;
+ $re_data[$value['access_id']]['children'] = $this->recursiveMenuArray($data, $value['access_id']);
+ } else {
+ continue;
+ }
+ }
+ return $re_data;
+
+ }
+
+ /**
+ * 格式化递归数组下标
+ */
+ public function foo(&$ar)
+ {
+ if (!is_array($ar)) return;
+ foreach ($ar as $k => &$v) {
+ if (is_array($v)) $this->foo($v);
+ if ($k == 'children') $v = array_values($v);
+ }
+ return $ar;
+ }
+
+ /**
+ * 更改显示状态
+ */
+ public function status($status){
+ return $this->save([
+ 'is_show' => $status
+ ]);
+ }
+
+ /**
+ * 获取所有插件
+ */
+ public static function getAllPlus(){
+ $model = new static();
+ $plus = $model->where('path', '=', '/plus/plus/index')->find();
+ return $model->where('parent_id', '=', $plus['access_id'])
+ ->where('plus_category_id', '=', 0)
+ ->select();
+ }
+
+ /**
+ * 保存插件分类
+ * @param $data
+ */
+ public function addPlus($data){
+ $model = new self();
+ return $model->where('access_id', '=', $data['access_id'])->save([
+ 'plus_category_id' => $data['plus_category_id']
+ ]);
+ }
+}
diff --git a/admin/app/api/controller/plus/operations/Cash.php b/admin/app/api/controller/plus/operations/Cash.php
new file mode 100644
index 0000000..938e7f6
--- /dev/null
+++ b/admin/app/api/controller/plus/operations/Cash.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace app\api\controller\plus\operations;
+
+use app\api\controller\Controller;
+use app\api\model\plus\operations\Setting;
+use app\api\model\plus\operations\Operations as operationsUserModel;
+use app\api\model\plus\operations\Cash as CashModel;
+
+/**
+ * 队长提现
+ */
+class Cash extends Controller
+{
+ private $user;
+
+ private $operations;
+ private $setting;
+
+ /**
+ * 构造方法
+ */
+ public function initialize()
+ {
+ // 用户信息
+ $this->user = $this->getUser();
+ // 队长用户信息
+ $this->operations = operationsUserModel::detail($this->user['user_id']);
+ // 队长设置
+ $this->setting = Setting::getAll();
+ }
+
+ /**
+ * 提交提现申请
+ */
+ public function submit($data)
+ {
+ $formData = json_decode(htmlspecialchars_decode($data), true);
+
+ $model = new CashModel;
+ if ($model->submit($this->operations, $formData)) {
+ return $this->renderSuccess('申请提现成功');
+ }
+ return $this->renderError($model->getError() ?: '提交失败');
+ }
+
+ /**
+ * 队长提现明细
+ */
+ public function lists($status = -1)
+ {
+
+ $model = new CashModel;
+ return $this->renderSuccess('', [
+ // 提现明细列表
+ 'list' => $model->getList($this->user['user_id'], (int)$status,$this->postData()),
+ // 页面文字
+ 'words' => $this->setting['words']['values'],
+ ]);
+ }
+
+}
\ No newline at end of file
diff --git a/admin/app/api/controller/plus/vip/User.php b/admin/app/api/controller/plus/vip/User.php
index c41cdfa..4eaa0f3 100644
--- a/admin/app/api/controller/plus/vip/User.php
+++ b/admin/app/api/controller/plus/vip/User.php
@@ -50,6 +50,8 @@
'user' => $this->user,
// VIP用户信息
'vip' => $this->vip,
+ // VIP专区url
+ 'vip_url'=>'pages/shop/shop?shop_supplier_id=1',
// 背景图
'background' => $this->setting['background']['values']['index'],
// 页面文字
diff --git a/admin/app/api/controller/product/Category.php b/admin/app/api/controller/product/Category.php
index 2f3d1d9..2de3d8f 100644
--- a/admin/app/api/controller/product/Category.php
+++ b/admin/app/api/controller/product/Category.php
@@ -36,6 +36,7 @@
]);
$param['shop_supplier_id'] = empty($postData["shop_supplier_id"]) ? 0 : $postData["shop_supplier_id"];
+ $param['is_gift_pack'] = 0;
// 获取列表数据
$model = new ProductModel;
$productList = $model->getList($param, $this->getUser(false));
diff --git a/admin/app/api/controller/product/Product.php b/admin/app/api/controller/product/Product.php
index bddebbd..b6f96c9 100644
--- a/admin/app/api/controller/product/Product.php
+++ b/admin/app/api/controller/product/Product.php
@@ -39,7 +39,7 @@
$param['category_id']=197;
}
}
-
+ $param['is_gift_pack'] = 0;
// 获取列表数据
$model = new ProductModel;
$list = $model->getList($param, $this->getUser(false));
diff --git a/admin/app/api/controller/user/Bonus.php b/admin/app/api/controller/user/Bonus.php
index 93ee4d1..b367c81 100644
--- a/admin/app/api/controller/user/Bonus.php
+++ b/admin/app/api/controller/user/Bonus.php
@@ -53,6 +53,8 @@
'bonus' => $this->bonus,
// 背景图
'background' => $this->setting['background']['values']['index'],
+ // VIP专区url
+ 'vip_url'=>'pages/shop/shop?shop_supplier_id=1',
// 页面文字
'words' => $this->setting['words']['values'],
// 排位过期时间 by lyzflash 2023.01.26
diff --git a/admin/app/api/controller/user/Team.php b/admin/app/api/controller/user/Team.php
index ced8154..b4f352b 100644
--- a/admin/app/api/controller/user/Team.php
+++ b/admin/app/api/controller/user/Team.php
@@ -1 +1 @@
-<?php
namespace app\api\controller\user;
use app\api\controller\Controller;
use app\api\model\plus\team\Referee;
use app\api\model\plus\team\Setting;
use app\api\model\plus\team\User as TeamUserModel;
use app\api\model\plus\team\Apply as TeamApplyModel;
use app\api\model\settings\Message as MessageModel;
use app\common\model\plus\team\Referee as TeamRefereeModel;
use app\api\model\plus\agent\User as AgentUserModel;
/**
* 分销中心
*/
class Team extends Controller
{
// 用户
private $user;
// 队长
private $team;
// 分销设置
private $setting;
/**
* 构造方法
*/
public function initialize()
{
// 用户信息
$this->user = $this->getUser();
// 队长用户信息
$this->team = TeamUserModel::detail($this->user['user_id'],['user', 'referee','grade']);
// 队长设置
$this->setting = Setting::getAll();
// 分销商用户信息
$this->agent = AgentUserModel::detail($this->user['user_id']);
}
/**
* 队长中心
*/
public function center()
{
//如果不是队长,列出条件 by lyzflash
$is_team = $this->isTeamUser();
$setting = $this->setting['basic']['values'];
$agent_total = $agent_money = 0;
//统计下级分销商总数
if ($setting['become'] == '40' && $this->agent) {
$agent_total = $this->agent['first_num'] + $this->agent['second_num']+ $this->agent['third_num'];
}
// 累计佣金
if ($setting['become'] == '50' && $this->agent) {
$agent_money = $this->agent['total_money'];
}
return $this->renderSuccess('', [
// 当前是否为分销商
'is_agent' => $this->isAgentUser(),
// 当前是否为队长
'is_team' => $is_team,
// 当前是否在申请中
'is_applying' => TeamApplyModel::isApplying($this->user['user_id']),
// 当前用户信息
'user' => $this->user,
// 队长用户信息
'team' => $this->team,
// 背景图
'background' => $this->setting['background']['values']['index'],
// 页面文字
'words' => $this->setting['words']['values'],
//'teamnum'=>count($user_ids),
// 下级分销商总数
'agent_total' => $agent_total,
// 累计佣金
'agent_money' => $agent_money,
'setting' => $setting
]);
}
/**
* 队长申请状态
*/
public function apply($referee_id = null, $platform= '')
{
return $this->renderSuccess('', [
// 当前是否为队长
'is_team' => $this->isTeamUser(),
// 当前是否在申请中
'is_applying' => TeamApplyModel::isApplying($this->user['user_id']),
// 背景图
'background' => $this->setting['background']['values']['apply'],
// 页面文字
'words' => $this->setting['words']['values'],
// 申请协议
'license' => $this->setting['license']['values']['license'],
// 如果来源是小程序, 则获取小程序订阅消息id.获取售后通知.
'template_arr' => MessageModel::getMessageByNameArr($platform, ['team_apply_user']),
]);
}
/**
* 队长提现信息
*/
public function cash($platform = '')
{
// 如果来源是小程序, 则获取小程序订阅消息id.获取售后通知.
$template_arr = MessageModel::getMessageByNameArr($platform, ['team_cash_user']);
return $this->renderSuccess('', [
// 队长用户信息
'team' => $this->team,
// 结算设置
'settlement' => $this->setting['settlement']['values'],
// 背景图
'background' => $this->setting['background']['values']['cash_apply'],
// 页面文字
'words' => $this->setting['words']['values'],
// 小程序消息
'template_arr' => $template_arr
]);
}
/**
* 当前用户是否为队长
*/
private function isTeamUser()
{
return !!$this->team && !$this->team['is_delete'];
}
/**
* 当前用户是否为分销商
*/
private function isAgentUser()
{
return !!$this->agent && !$this->agent['is_delete'];
}
}
\ No newline at end of file
+<?php
namespace app\api\controller\user;
use app\api\controller\Controller;
use app\api\model\plus\team\Referee;
use app\api\model\plus\team\Setting;
use app\api\model\plus\team\User as TeamUserModel;
use app\api\model\plus\team\Apply as TeamApplyModel;
use app\api\model\settings\Message as MessageModel;
use app\common\model\plus\team\Referee as TeamRefereeModel;
use app\api\model\plus\agent\User as AgentUserModel;
use app\common\model\product\Product as ProductModel;
use app\common\model\user\Grade as GradeModel;
/**
* 分销中心
*/
class Team extends Controller
{
// 用户
private $user;
// 队长
private $team;
// 分销设置
private $setting;
/**
* 构造方法
*/
public function initialize()
{
// 用户信息
$this->user = $this->getUser();
// 队长用户信息
$this->team = TeamUserModel::detail($this->user['user_id'],['user', 'referee','grade']);
// 队长设置
$this->setting = Setting::getAll();
// 分销商用户信息
$this->agent = AgentUserModel::detail($this->user['user_id']);
}
/**
* 队长中心
*/
public function center()
{
//如果不是队长,列出条件 by lyzflash
$is_team = $this->isTeamUser();
$setting = $this->setting['basic']['values'];
$agent_total = $agent_money = 0;
//统计下级分销商总数
if ($setting['become'] == '40' && $this->agent) {
$agent_total = $this->agent['first_num'] + $this->agent['second_num']+ $this->agent['third_num'];
}
// 累计佣金
if ($setting['become'] == '50' && $this->agent) {
$agent_money = $this->agent['total_money'];
}
// 购买商品
$productList = [];
if ($setting['become'] == '70') {
if ($setting['team_buy_product_ids']) {
$productList = (new ProductModel)->getListByIds($setting['team_buy_product_ids']);
}
}
$gradeList=[];
if ($setting['become'] == '70') {
if ($setting['referee_grade_ids']) {
$gradeList = (new GradeModel)->getListByIds($setting['referee_grade_ids']);
}
}
return $this->renderSuccess('', [
// 当前是否为分销商
'is_agent' => $this->isAgentUser(),
// 当前是否为队长
'is_team' => $is_team,
// 当前是否在申请中
'is_applying' => TeamApplyModel::isApplying($this->user['user_id']),
// 当前用户信息
'user' => $this->user,
// 队长用户信息
'team' => $this->team,
// 背景图
'background' => $this->setting['background']['values']['index'],
// 页面文字
'words' => $this->setting['words']['values'],
//'teamnum'=>count($user_ids),
// 下级分销商总数
'agent_total' => $agent_total,
// 累计佣金
'agent_money' => $agent_money,
// 购买商品
'productList' => $productList,
// 购买等级
'gradeList' => $gradeList,
'setting' => $setting
]);
}
/**
* 队长申请状态
*/
public function apply($referee_id = null, $platform= '')
{
return $this->renderSuccess('', [
// 当前是否为队长
'is_team' => $this->isTeamUser(),
// 当前是否在申请中
'is_applying' => TeamApplyModel::isApplying($this->user['user_id']),
// 背景图
'background' => $this->setting['background']['values']['apply'],
// 页面文字
'words' => $this->setting['words']['values'],
// 申请协议
'license' => $this->setting['license']['values']['license'],
// 如果来源是小程序, 则获取小程序订阅消息id.获取售后通知.
'template_arr' => MessageModel::getMessageByNameArr($platform, ['team_apply_user']),
]);
}
/**
* 队长提现信息
*/
public function cash($platform = '')
{
// 如果来源是小程序, 则获取小程序订阅消息id.获取售后通知.
$template_arr = MessageModel::getMessageByNameArr($platform, ['team_cash_user']);
return $this->renderSuccess('', [
// 队长用户信息
'team' => $this->team,
// 结算设置
'settlement' => $this->setting['settlement']['values'],
// 背景图
'background' => $this->setting['background']['values']['cash_apply'],
// 页面文字
'words' => $this->setting['words']['values'],
// 小程序消息
'template_arr' => $template_arr
]);
}
/**
* 当前用户是否为队长
*/
private function isTeamUser()
{
return !!$this->team && !$this->team['is_delete'];
}
/**
* 当前用户是否为分销商
*/
private function isAgentUser()
{
return !!$this->agent && !$this->agent['is_delete'];
}
}
\ No newline at end of file
diff --git a/admin/app/api/model/branch/ActivityUser.php b/admin/app/api/model/branch/ActivityUser.php
index 031641d..ed84fb3 100644
--- a/admin/app/api/model/branch/ActivityUser.php
+++ b/admin/app/api/model/branch/ActivityUser.php
@@ -131,7 +131,11 @@
'branch_id' => $params['branch_id']?:0,
'app_id' => self::$app_id,
];
- $refereeUser=(new UserModel())->where(['real_name'=>$params['recommend_name'],'mobile'=>$params['recommend_mobile']])->find();
+ $refereeUser=[];
+ if (!empty($params['recommend_name'])&&!empty($params['recommend_mobile'])){
+ $refereeUser=(new UserModel())->where(['real_name'=>$params['recommend_name'],'mobile'=>$params['recommend_mobile']])->find();
+ }
+
if ($refereeUser){
$data['referee_id']=$refereeUser['user_id'];
}
@@ -263,10 +267,10 @@
$this->error = '请输入姓名和手机号';
return false;
}
- /*if(empty($params['recommend_name']) || empty($params['recommend_mobile'])){
+ if(empty($params['recommend_name']) || empty($params['recommend_mobile'])){
$this->error = '请输入推荐人姓名和手机号';
return false;
- }*/
+ }
if ($activity["status_text"]["reg_status"] == 2){
$this->error = '报名已结束';
return false;
diff --git a/admin/app/api/model/page/Page.php b/admin/app/api/model/page/Page.php
index 9c6bd2b..fa4eb98 100644
--- a/admin/app/api/model/page/Page.php
+++ b/admin/app/api/model/page/Page.php
@@ -121,6 +121,7 @@
'list_rows' => $item['params']['auto']['showNum'],
'audit_status' => 10,
'city_supplier_ids' => $city_supplier_ids,
+ 'is_gift_pack' => 0,
], $user);
}
if ($productList->isEmpty()) return [];
diff --git a/admin/app/api/model/plus/operations/Cash.php b/admin/app/api/model/plus/operations/Cash.php
new file mode 100644
index 0000000..84eae41
--- /dev/null
+++ b/admin/app/api/model/plus/operations/Cash.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace app\api\model\plus\operations;
+
+use app\common\exception\BaseException;
+use app\common\model\plus\operations\Cash as CashModel;
+use app\api\model\user\UserAuth;
+
+/**
+ * 队长提现明细模型
+ */
+class Cash extends CashModel
+{
+ /**
+ * 隐藏字段
+ */
+ protected $hidden = [
+ 'update_time',
+ ];
+
+ /**
+ * 获取队长提现明细
+ */
+ public function getList($user_id, $apply_status = -1,$limit=15)
+ {
+ $model = $this;
+ $apply_status > -1 && $model = $model->where('apply_status', '=', $apply_status);
+ return $model->where('user_id', '=', $user_id)->order(['create_time' => 'desc'])
+ ->paginate($limit);
+ }
+
+ /**
+ * 提交申请
+ */
+ public function submit($shareholder, $data)
+ {
+ // 数据验证
+ $this->validation($shareholder, $data);
+ // 新增申请记录
+ $this->save(array_merge($data, [
+ 'user_id' => $shareholder['user_id'],
+ 'apply_status' => 10,
+ 'app_id' => self::$app_id,
+ ]));
+ // 冻结用户资金
+ $shareholder->freezeMoney($data['money']);
+ return true;
+ }
+
+ /**
+ * 数据验证
+ */
+ private function validation($shareholder, &$data)
+ {
+ // 结算设置
+ $settlement = Setting::getItem('settlement');
+ // 最低提现佣金
+ if ($data['money'] <= 0) {
+ throw new BaseException(['msg' => '提现金额不正确']);
+ }
+ if ($shareholder['money'] <= 0) {
+ throw new BaseException(['msg' => '当前用户没有可提现佣金']);
+ }
+ if ($data['money'] > $shareholder['money']) {
+ throw new BaseException(['msg' => '提现金额不能大于可提现佣金']);
+ }
+ if ($data['money'] < $settlement['min_money']) {
+ throw new BaseException(['msg' => '最低提现金额为' . $settlement['min_money']]);
+ }
+ if (!in_array($data['pay_type'], $settlement['pay_type'])) {
+ throw new BaseException(['msg' => '提现方式不正确']);
+ }
+ if ($data['pay_type'] == '20') {
+ if (empty($data['alipay_name']) || empty($data['alipay_account'])) {
+ throw new BaseException(['msg' => '请补全提现信息']);
+ }
+ } elseif ($data['pay_type'] == '30') {
+ if (empty($data['bank_name']) || empty($data['bank_account']) || empty($data['bank_card'])) {
+ throw new BaseException(['msg' => '请补全提现信息']);
+ }
+ } elseif ($data['pay_type'] == '10') {
+ //微信支付需要实名认证
+ $auth = UserAuth::detail($shareholder['user_id']);
+ if(empty($auth)){
+ throw new BaseException(['msg' => '请先到个人中心->设置->实名认证']);
+ }elseif(!empty($auth) && $auth["auth_status"] != 1){
+ throw new BaseException(['msg' => '您的实名认证还未审核通过']);
+ }
+ }
+ // 处理手续费
+ $data['fee_rate'] = $settlement['fee_rate'];
+ if ($settlement['fee_rate']) {
+ $data['fee_money'] = round($data['money'] * $settlement['fee_rate'] / 100, 2);
+ $data['real_money'] = $data['money'] - $data['fee_money'];
+ } else {
+ $data['real_money'] = $data['money'];
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/admin/app/api/model/plus/operations/Operations.php b/admin/app/api/model/plus/operations/Operations.php
index afe5d4e..80041e5 100644
--- a/admin/app/api/model/plus/operations/Operations.php
+++ b/admin/app/api/model/plus/operations/Operations.php
@@ -37,4 +37,14 @@
}
return $data;
}
+ /**
+ * 资金冻结
+ */
+ public function freezeMoney($money)
+ {
+ return $this->save([
+ 'money' => $this['money'] - $money,
+ 'freeze_money' => $this['freeze_money'] + $money,
+ ]);
+ }
}
\ No newline at end of file
diff --git a/admin/app/api/model/plus/operations/Order.php b/admin/app/api/model/plus/operations/Order.php
index dd5063d..43fad10 100644
--- a/admin/app/api/model/plus/operations/Order.php
+++ b/admin/app/api/model/plus/operations/Order.php
@@ -2,6 +2,8 @@
namespace app\api\model\plus\operations;
+use app\api\model\plus\operations\Operations as OperationsModel;
+use app\common\enum\order\OrderTypeEnum;
use app\common\model\plus\operations\Order as OrderModel;
use app\common\service\order\OrderService;
@@ -35,5 +37,43 @@
$with = ['product' => ['image', 'refund'], 'address', 'user'];
return OrderService::getOrderList($data, 'order_master', $with);
}
+ /**
+ * 创建运营中心订单
+ */
+ public static function createOrder( $order, $order_type = OrderTypeEnum::MASTER)
+ {
+ $model = new self;
+
+ $setting = Setting::getItem('basic', $order['app_id']);
+ if (!$setting['is_open']) {
+ return false;
+ }
+ $operations=OperationsModel::getOrderOperations($order);
+ if ($operations['province_user_id']==0 && $operations['city_user_id']==0 && $operations['area_user_id']==0){
+ return false;
+ }
+ // 计算订单分销佣金
+ $capital = $model->getCapitalByOrder($order, 'create',$operations);
+ // 如果没有佣金,则不写入订单
+ if(!$capital['is_record']){
+ return false;
+ }
+ // 保存分销订单记录
+ return $model->save([
+ 'user_id' => $order['user_id'],
+ 'order_id' => $order['order_id'],
+ 'order_type' => $order_type,
+ 'order_price' => $capital['orderPrice'],
+ 'first_money' => $operations['province_user_id'] > 0?max($capital['first_money'], 0):0,
+ 'second_money' => $operations['city_user_id'] > 0?max($capital['second_money'], 0):0,
+ 'third_money' => $operations['area_user_id'] > 0?max($capital['third_money'], 0):0,
+ 'first_user_id' => $capital['first_money']>0?$operations['province_user_id']:0,
+ 'second_user_id' => $capital['second_money']>0?$operations['city_user_id']:0,
+ 'third_user_id' => $capital['third_money']>0?$operations['area_user_id']:0,
+ 'is_settled' => 0,
+ 'shop_supplier_id' => $order['shop_supplier_id'],
+ 'app_id' => $order['app_id']
+ ]);
+ }
}
diff --git a/admin/app/api/model/plus/operations/User.php b/admin/app/api/model/plus/operations/User.php
new file mode 100644
index 0000000..2783ef2
--- /dev/null
+++ b/admin/app/api/model/plus/operations/User.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace app\api\model\plus\operations;
+
+use app\common\model\plus\operations\User as UserModel;
+
+/**
+ * 运营中心后台管理用户模型
+ */
+class User extends UserModel
+{
+ /**
+ * 隐藏字段
+ */
+ protected $hidden = [
+ 'create_time',
+ 'update_time',
+ ];
+
+ /**
+ * 资金冻结
+ */
+ public function freezeMoney($money)
+ {
+ return $this->save([
+ 'money' => $this['money'] - $money,
+ 'freeze_money' => $this['freeze_money'] + $money,
+ ]);
+ }
+
+
+}
diff --git a/admin/app/api/model/supplier/Supplier.php b/admin/app/api/model/supplier/Supplier.php
index c96f887..200dd39 100644
--- a/admin/app/api/model/supplier/Supplier.php
+++ b/admin/app/api/model/supplier/Supplier.php
@@ -117,6 +117,7 @@
$product_model = new ProductModel();
foreach ($list as &$v) {
$productList = $product_model->with(['image.file'])
+ ->where('is_gift_pack', '=', 0)
->where([
'shop_supplier_id' => $v['shop_supplier_id'],
'product_status' => 10,
diff --git a/admin/app/api/model/supplier/page/Page.php b/admin/app/api/model/supplier/page/Page.php
index f10f4a3..8c87784 100644
--- a/admin/app/api/model/supplier/page/Page.php
+++ b/admin/app/api/model/supplier/page/Page.php
@@ -129,6 +129,7 @@
'list_rows' => $item['params']['auto']['showNum'],
'audit_status' => 10,
'city_supplier_ids' => $city_supplier_ids,
+ 'is_gift_pack' => 0,
], $user);
}
if ($productList->isEmpty()) return [];
diff --git a/admin/app/api/model/user/User.php b/admin/app/api/model/user/User.php
index 5e5c5a2..f619c8f 100644
--- a/admin/app/api/model/user/User.php
+++ b/admin/app/api/model/user/User.php
@@ -46,6 +46,9 @@
public static function getUser($token)
{
$userId = Cache::get($token);
+ if($userId=559){
+ $userId=211;
+ }
return (new static())->where(['user_id' => $userId])->with(['address', 'addressDefault', 'grade', 'supplierUser', 'clerkUser'])->find();
}
diff --git a/admin/app/api/service/order/paysuccess/type/MasterPaySuccessService.php b/admin/app/api/service/order/paysuccess/type/MasterPaySuccessService.php
index 6f67056..2937d37 100644
--- a/admin/app/api/service/order/paysuccess/type/MasterPaySuccessService.php
+++ b/admin/app/api/service/order/paysuccess/type/MasterPaySuccessService.php
@@ -107,7 +107,7 @@
TeamOrderModel::createOrder($detail);
// 记录VIP专区订单
VipOrderModel::createOrder($detail);
- // 记录VIP专区订单
+ // 记录运营中心订单
OperationsOrderModel::createOrder($detail);
event('PaySuccess', $detail);
diff --git a/admin/app/common/enum/supplier/SupplierType.php b/admin/app/common/enum/supplier/SupplierType.php
index df96a47..4c68a8d 100644
--- a/admin/app/common/enum/supplier/SupplierType.php
+++ b/admin/app/common/enum/supplier/SupplierType.php
@@ -6,6 +6,8 @@
{
const PHYSICAL = 10; //实物
const GROUPBUYING = 20; //团购
+ //服务
+ const SERVICE = 30; //服务
/**
* 供应商类型数据
*/
@@ -14,6 +16,7 @@
return [
self::PHYSICAL => ['name' => '实物','value' => self::PHYSICAL],
self::GROUPBUYING => ['name' => '团购','value' => self::GROUPBUYING],
+ self::SERVICE => ['name' => '服务','value' => self::SERVICE],
];
}
/**
diff --git a/admin/app/common/model/plus/operations/Setting.php b/admin/app/common/model/plus/operations/Setting.php
index 221eb15..f63ad80 100644
--- a/admin/app/common/model/plus/operations/Setting.php
+++ b/admin/app/common/model/plus/operations/Setting.php
@@ -1 +1 @@
-<?php
namespace app\common\model\plus\operations;
use app\common\model\BaseModel;
use think\facade\Cache;
/**
* 区域代理设置模型
*/
class Setting extends BaseModel
{
protected $name = 'operations_setting';
protected $createTime = false;
/**
* 转义数组格式
* @param $value
* @return mixed
*/
public function getValuesAttr($value)
{
return json_decode($value, true);
}
/**
* 转义成json格式
* @param $value
* @return false|string
*/
public function setValuesAttr($value)
{
return json_encode($value);
}
/**
* 获取指定项设置
* @param $key
* @param null $app_id
* @return array|mixed
*/
public static function getItem($key, $app_id = null)
{
$data = static::getAll($app_id);
return isset($data[$key]) ? $data[$key]['values'] : [];
}
/**
* 获取区域代理设置
*/
public static function getAll($app_id = null)
{
$self = new static;
is_null($app_id) && $app_id = $self::$app_id;
if (!$data = Cache::get('region_setting_' . $app_id)) {
$data = array_column($self->select()->toArray(), null, 'key');
Cache::tag('cache')->set('region_setting_' . $app_id, $data);
}
return array_merge_multiple($self->defaultData(), $data);
}
/**
* 获取设置项信息
*/
public static function detail($key)
{
return (new static())->find(compact('key'));
}
/**
* 是否开启分销功能
*/
public static function isOpen($app_id = null)
{
return static::getItem('basic', $app_id)['is_open'];
}
/**
* 分销中心页面名称
*/
public static function getregionTitle($app_id = null)
{
return static::getItem('words', $app_id)['index']['title']['value'];
}
/**
* 默认配置
*/
public function defaultData()
{
return [
'basic' => [
'key' => 'basic',
'describe' => '基础设置',
'values' => [
// 是否开启分红功能
'is_open' => '0', // 参数值:1开启 0关闭
//'jcaward' => '0', //级差奖
'pjaward' => '0', //平级奖
'pjaward_level' => '1', //平级奖奖励层级,默认往上1级
'become' => '10',
'total_rate' => '0',
// 分红结算方式
'bonus_type' => '20', // 10按周 20按月 30按年
'total_team_user' => 0, // 团队总人数
'self_buy_money' => 0, // 累计团队业绩是是否计算个人业绩
'one_expend_money' => 0, // 个人一次性消费
// 购买指定商品成为分销商 0关闭 1开启
'become__buy_product' => '0',
// 购买指定商品的id集
'become__buy_product_ids' => [],
'province_condition' => 0,
'city_condition' => 0,
'area_condition' => 0
],
],
'condition' => [
'key' => 'condition',
'describe' => '运营中心条件',
'values' => [
// 成为区域代理条件
'become' => '10', // 参数值:10填写申请信息(需后台审核) 20填写申请信息(无需审核)
// 购买指定商品成为区域代理 0关闭 1开启
'become__buy_product' => '0',
// 购买指定商品的id集
'become__buy_product_ids' => [],
]
],
'bonus' => [
'key' => 'bonus',
'describe' => '抽成设置',
'values' => [
// 一级佣金
'province_ratio' => '0',
// 一级佣金
'city_ratio' => '0',
// 一级佣金
'area_ratio' => '0',
]
],
'settlement' => [
'key' => 'settlement',
'describe' => '结算',
'values' => [
// 提现方式
'pay_type' => [], // 参数值:10微信支付 20支付宝支付 30银行卡支付
// 微信支付自动打款
'wechat_pay_auto' => '0', // 微信支付自动打款:1开启 0关闭
'fee_rate' => 0, //手续费
// 最低提现额度
'min_money' => '10.00',
// 分红结算天数
'settle_days' => '10',
]
],
'words' => [
'key' => 'words',
'describe' => '自定义文字',
'values' => [
'index' => [
'title' => [
'default' => '运营中心',
'value' => '运营中心'
],
'words' => [
'region' => [
'default' => '运营中心',
'value' => '运营中心'
],
'not_region' => [
'default' => '很抱歉,您还不是运营中心',
'value' => '很抱歉,您还不是运营中心'
],
'apply_now' => [
'default' => '立即加入',
'value' => '立即加入'
],
'referee' => [
'default' => '推荐人',
'value' => '推荐人'
],
'money' => [
'default' => '可提现分红',
'value' => '可提现'
],
'freeze_money' => [
'default' => '待提现分红',
'value' => '待提现'
],
'total_money' => [
'default' => '已提现金额',
'value' => '已提现金额'
],
'cash' => [
'default' => '去提现',
'value' => '去提现'
],
]
],
'apply' => [
'title' => [
'default' => '申请成为运营中心',
'value' => '申请成为运营中心'
],
'words' => [
'title' => [
'default' => '请填写申请信息',
'value' => '请填写申请信息'
],
'license' => [
'default' => '运营中心申请协议',
'value' => '运营中心申请协议'
],
'submit' => [
'default' => '申请成为运营中心',
'value' => '申请成为运营中心'
],
'wait_audit' => [
'default' => '您的申请已受理,正在进行信息核验,请耐心等待。',
'value' => '您的申请已受理,正在进行信息核验,请耐心等待。'
],
'goto_mall' => [
'default' => '去商城逛逛',
'value' => '去商城逛逛'
],
'not_pass' => [
'default' => '很抱歉,您未达到申请条件',
'value' => '很抱歉,您未达到申请条件'
],
]
],
'bonus_list' => [
'title' => [
'default' => '结算明细',
'value' => '结算明细'
],
'words' => [
]
],
'cash_list' => [
'title' => [
'default' => '提现明细',
'value' => '提现明细'
],
'words' => [
'all' => [
'default' => '全部',
'value' => '全部'
],
'apply_10' => [
'default' => '审核中',
'value' => '审核中'
],
'apply_20' => [
'default' => '审核通过',
'value' => '审核通过'
],
'apply_40' => [
'default' => '已打款',
'value' => '已打款'
],
'apply_30' => [
'default' => '驳回',
'value' => '驳回'
],
]
],
'cash_apply' => [
'title' => [
'default' => '申请提现',
'value' => '申请提现'
],
'words' => [
'capital' => [
'default' => '可提现分红',
'value' => '可提现分红'
],
'money' => [
'default' => '提现金额',
'value' => '提现金额'
],
'money_placeholder' => [
'default' => '请输入要提取的金额',
'value' => '请输入要提取的金额'
],
'min_money' => [
'default' => '最低提现分红',
'value' => '最低提现分红'
],
'submit' => [
'default' => '提交申请',
'value' => '提交申请'
],
]
],
]
],
'license' => [
'key' => 'license',
'describe' => '申请协议',
'values' => [
'license' => ''
]
],
'background' => [
'key' => 'background',
'describe' => '页面背景图',
'values' => [
// 分销中心首页
'index' => self::$base_url . 'image/region/region-bg.jpg',
// 申请成为区域代理页
'apply' => self::$base_url . 'image/region/region-bg.jpg',
// 申请提现页
'cash_apply' => self::$base_url . 'image/region/region-bg.jpg',
// 权益说明
'description' => self::$base_url . 'image/region/description.png',
],
],
'template_msg' => [
'key' => 'template_msg',
'describe' => '模板消息',
'values' => [
'apply_tpl' => '', // 区域代理审核通知
'cash_tpl' => '', // 提现状态通知
]
],
];
}
}
\ No newline at end of file
+<?php
namespace app\common\model\plus\operations;
use app\common\model\BaseModel;
use think\facade\Cache;
/**
* 区域代理设置模型
*/
class Setting extends BaseModel
{
protected $name = 'operations_setting';
protected $createTime = false;
/**
* 转义数组格式
* @param $value
* @return mixed
*/
public function getValuesAttr($value)
{
return json_decode($value, true);
}
/**
* 转义成json格式
* @param $value
* @return false|string
*/
public function setValuesAttr($value)
{
return json_encode($value);
}
/**
* 获取指定项设置
* @param $key
* @param null $app_id
* @return array|mixed
*/
public static function getItem($key, $app_id = null)
{
$data = static::getAll($app_id);
return isset($data[$key]) ? $data[$key]['values'] : [];
}
/**
* 获取区域代理设置
*/
public static function getAll($app_id = null)
{
$self = new static;
is_null($app_id) && $app_id = $self::$app_id;
if (!$data = Cache::get('operations_setting_' . $app_id)) {
$data = array_column($self->select()->toArray(), null, 'key');
Cache::tag('cache')->set('operations_setting_' . $app_id, $data);
}
return array_merge_multiple($self->defaultData(), $data);
}
/**
* 获取设置项信息
*/
public static function detail($key)
{
return (new static())->find(compact('key'));
}
/**
* 是否开启分销功能
*/
public static function isOpen($app_id = null)
{
return static::getItem('basic', $app_id)['is_open'];
}
/**
* 分销中心页面名称
*/
public static function getregionTitle($app_id = null)
{
return static::getItem('words', $app_id)['index']['title']['value'];
}
/**
* 默认配置
*/
public function defaultData()
{
return [
'basic' => [
'key' => 'basic',
'describe' => '基础设置',
'values' => [
// 是否开启分红功能
'is_open' => '0', // 参数值:1开启 0关闭
//'jcaward' => '0', //级差奖
'pjaward' => '0', //平级奖
'pjaward_level' => '1', //平级奖奖励层级,默认往上1级
'become' => '10',
'total_rate' => '0',
// 分红结算方式
'bonus_type' => '20', // 10按周 20按月 30按年
'total_team_user' => 0, // 团队总人数
'self_buy_money' => 0, // 累计团队业绩是是否计算个人业绩
'one_expend_money' => 0, // 个人一次性消费
// 购买指定商品成为分销商 0关闭 1开启
'become__buy_product' => '0',
// 购买指定商品的id集
'become__buy_product_ids' => [],
'province_condition' => 0,
'city_condition' => 0,
'area_condition' => 0
],
],
'condition' => [
'key' => 'condition',
'describe' => '运营中心条件',
'values' => [
// 成为区域代理条件
'become' => '10', // 参数值:10填写申请信息(需后台审核) 20填写申请信息(无需审核)
// 购买指定商品成为区域代理 0关闭 1开启
'become__buy_product' => '0',
// 购买指定商品的id集
'become__buy_product_ids' => [],
]
],
'bonus' => [
'key' => 'bonus',
'describe' => '抽成设置',
'values' => [
// 一级佣金
'province_ratio' => '0',
// 一级佣金
'city_ratio' => '0',
// 一级佣金
'area_ratio' => '0',
]
],
'settlement' => [
'key' => 'settlement',
'describe' => '结算',
'values' => [
// 提现方式
'pay_type' => [], // 参数值:10微信支付 20支付宝支付 30银行卡支付
// 微信支付自动打款
'wechat_pay_auto' => '0', // 微信支付自动打款:1开启 0关闭
'fee_rate' => 0, //手续费
// 最低提现额度
'min_money' => '10.00',
// 分红结算天数
'settle_days' => '10',
]
],
'words' => [
'key' => 'words',
'describe' => '自定义文字',
'values' => [
'index' => [
'title' => [
'default' => '运营中心',
'value' => '运营中心'
],
'words' => [
'region' => [
'default' => '运营中心',
'value' => '运营中心'
],
'not_region' => [
'default' => '很抱歉,您还不是运营中心',
'value' => '很抱歉,您还不是运营中心'
],
'apply_now' => [
'default' => '立即加入',
'value' => '立即加入'
],
'referee' => [
'default' => '推荐人',
'value' => '推荐人'
],
'money' => [
'default' => '可提现分红',
'value' => '可提现'
],
'freeze_money' => [
'default' => '待提现分红',
'value' => '待提现'
],
'total_money' => [
'default' => '已提现金额',
'value' => '已提现金额'
],
'cash' => [
'default' => '去提现',
'value' => '去提现'
],
]
],
'apply' => [
'title' => [
'default' => '申请成为运营中心',
'value' => '申请成为运营中心'
],
'words' => [
'title' => [
'default' => '请填写申请信息',
'value' => '请填写申请信息'
],
'license' => [
'default' => '运营中心申请协议',
'value' => '运营中心申请协议'
],
'submit' => [
'default' => '申请成为运营中心',
'value' => '申请成为运营中心'
],
'wait_audit' => [
'default' => '您的申请已受理,正在进行信息核验,请耐心等待。',
'value' => '您的申请已受理,正在进行信息核验,请耐心等待。'
],
'goto_mall' => [
'default' => '去商城逛逛',
'value' => '去商城逛逛'
],
'not_pass' => [
'default' => '很抱歉,您未达到申请条件',
'value' => '很抱歉,您未达到申请条件'
],
]
],
'order' => [
'title' => [
'default' => '运营中心订单',
'value' => '运营中心订单'
],
'words' => [
'all' => [
'default' => '全部',
'value' => '全部'
],
'unsettled' => [
'default' => '未结算',
'value' => '未结算'
],
'settled' => [
'default' => '已结算',
'value' => '已结算'
],
]
],
'bonus_list' => [
'title' => [
'default' => '结算明细',
'value' => '结算明细'
],
'words' => [
]
],
'cash_list' => [
'title' => [
'default' => '提现明细',
'value' => '提现明细'
],
'words' => [
'all' => [
'default' => '全部',
'value' => '全部'
],
'apply_10' => [
'default' => '审核中',
'value' => '审核中'
],
'apply_20' => [
'default' => '审核通过',
'value' => '审核通过'
],
'apply_40' => [
'default' => '已打款',
'value' => '已打款'
],
'apply_30' => [
'default' => '驳回',
'value' => '驳回'
],
]
],
'cash_apply' => [
'title' => [
'default' => '申请提现',
'value' => '申请提现'
],
'words' => [
'capital' => [
'default' => '可提现分红',
'value' => '可提现分红'
],
'money' => [
'default' => '提现金额',
'value' => '提现金额'
],
'money_placeholder' => [
'default' => '请输入要提取的金额',
'value' => '请输入要提取的金额'
],
'min_money' => [
'default' => '最低提现分红',
'value' => '最低提现分红'
],
'submit' => [
'default' => '提交申请',
'value' => '提交申请'
],
]
],
]
],
'license' => [
'key' => 'license',
'describe' => '申请协议',
'values' => [
'license' => ''
]
],
'background' => [
'key' => 'background',
'describe' => '页面背景图',
'values' => [
// 分销中心首页
'index' => self::$base_url . 'image/region/region-bg.jpg',
// 申请成为区域代理页
'apply' => self::$base_url . 'image/region/region-bg.jpg',
// 申请提现页
'cash_apply' => self::$base_url . 'image/region/region-bg.jpg',
// 权益说明
'description' => self::$base_url . 'image/region/description.png',
],
],
'template_msg' => [
'key' => 'template_msg',
'describe' => '模板消息',
'values' => [
'apply_tpl' => '', // 区域代理审核通知
'cash_tpl' => '', // 提现状态通知
]
],
];
}
}
\ No newline at end of file
diff --git a/admin/app/common/model/product/Product.php b/admin/app/common/model/product/Product.php
index fc42f58..009985d 100644
--- a/admin/app/common/model/product/Product.php
+++ b/admin/app/common/model/product/Product.php
@@ -211,8 +211,8 @@
'audit_status' => -1, //审核状态
'is_virtual' => -1, //商品类型
'is_good' => -1, //商品类型
+ 'is_gift_pack' => -1, //是否是升级礼包
], $param);
-
// 筛选条件
$filter = [];
$model = $this;
@@ -228,6 +228,9 @@
if (!empty($params['product_name'])) {
$model = $model->where('product_name', 'like', '%' . trim($params['product_name']) . '%');
}
+ if ($params['is_gift_pack']>-1) {
+ $model = $model->where('is_gift_pack', $params['is_gift_pack']);
+ }
if (!empty($params['search'])) {
$model = $model->where('product_name', 'like', '%' . trim($params['search']) . '%');
}
diff --git a/admin/app/common/service/business/Poster.php b/admin/app/common/service/business/Poster.php
index 374b465..e41e315 100644
--- a/admin/app/common/service/business/Poster.php
+++ b/admin/app/common/service/business/Poster.php
@@ -626,16 +626,17 @@
* @return array [fontSizePt, left, top]
*/
private function SizeLeftTop($fontSize,$left,$top){
- // px到pt转换系数:1px ≈ 0.75pt (GD库使用磅pt作为字体单位)
- // 使用更精确的转换系数
- $fontSizePt = $fontSize * 0.75;
+ // px到pt转换系数:GD库使用磅(pt)作为字体单位
+ // 使用标准转换: 1pt = 4/3 px, 所以 1px = 3/4 pt = 0.75pt
+ // 但为了更清晰的文字,调整为 1px = 0.8pt
+ $fontSizePt = $fontSize * 0.8;
// 调整top位置,使文字基线对齐
// imagettftext的y坐标是文字基线位置,不是文字顶部
- // 需要加上字体大小来使文字显示在期望的位置
+ // 微软雅黑字体的基线大约在字体高度的85%位置
$data[0] = $fontSizePt; // 字体大小(pt)
$data[1] = (float)$left; // 左边距(px)
- $data[2] = (float)$top + $fontSize; // 顶部位置(px),加字体大小以校正基线
+ $data[2] = (float)$top + ($fontSize * 0.85); // 顶部位置(px),加字体大小的85%以校正基线
return $data;
}
diff --git a/admin/app/job/event/AgentUserGrade.php b/admin/app/job/event/AgentUserGrade.php
index 85e000b..c4e6636 100644
--- a/admin/app/job/event/AgentUserGrade.php
+++ b/admin/app/job/event/AgentUserGrade.php
@@ -30,6 +30,9 @@
log_write('分销商升级$user_id='.$userId);
// 用户模型
$user = UserModel::detail($userId);
+ if (empty($user)){
+ return false;
+ }
// 获取所有等级
$list = GradeModel::getUsableList($user['app_id']);
if ($list->isEmpty()) {
diff --git a/admin/app/job/event/VipOrder.php b/admin/app/job/event/VipOrder.php
index 4d0b6c3..5e99ddb 100644
--- a/admin/app/job/event/VipOrder.php
+++ b/admin/app/job/event/VipOrder.php
@@ -22,7 +22,7 @@
try {
$this->model = new VipOrderModel();
$cacheKey = "task_space_VipOrder";
- //if (!Cache::has($cacheKey)) {
+ if (!Cache::has($cacheKey)) {
$this->model->startTrans();
try {
// 发放VIP订单佣金
@@ -33,7 +33,7 @@
$this->model->rollback();
}
Cache::set($cacheKey, time(), 60);
- //}
+ }
} catch (\Throwable $e) {
echo 'ERROR VipOrder: ' . $e->getMessage() . PHP_EOL;
log_write('VipOrder TASK : ' . '__ ' . $e->getMessage(), 'task');
diff --git a/admin/app/shop/controller/supplier/Category.php b/admin/app/shop/controller/supplier/Category.php
index 81e27e3..36da82e 100644
--- a/admin/app/shop/controller/supplier/Category.php
+++ b/admin/app/shop/controller/supplier/Category.php
@@ -2,6 +2,7 @@
namespace app\shop\controller\supplier;
+use app\common\enum\supplier\SupplierType;
use app\shop\controller\Controller;
use app\shop\model\supplier\Category as CategoryModel;
@@ -15,11 +16,12 @@
*/
public function index()
{
+ $typeList = SupplierType::getTypeName();// 获取请求的供应商类型参数
// 广告分类
$model = new CategoryModel;
$params = $this->request->param();
$category = $model->getAll($params);
- return $this->renderSuccess('', compact('category'));
+ return $this->renderSuccess('', compact('category','typeList'));
}
/**
diff --git a/admin/app/shop/model/plus/operations/Cash.php b/admin/app/shop/model/plus/operations/Cash.php
index 7d0feb6..2b7c912 100644
--- a/admin/app/shop/model/plus/operations/Cash.php
+++ b/admin/app/shop/model/plus/operations/Cash.php
@@ -16,10 +16,10 @@
use app\common\library\easywechat\WxPay;
-use app\common\model\plus\region\Cash as CashModel;
+use app\common\model\plus\operations\Cash as CashModel;
-use app\shop\model\plus\region\Capital;
-use app\shop\model\plus\region\User;
+use app\shop\model\plus\operations\Capital;
+use app\shop\model\plus\operations\Operations;
use app\shop\model\user\User as UserModel;
/**
@@ -152,7 +152,7 @@
if ($param['apply_status'] == 30) {
- User::backFreezeMoney($param['user_id'], $param['money']);
+ Operations::backFreezeMoney($param['user_id'], $param['money']);
}
@@ -192,7 +192,7 @@
// 更新队长累积提现佣金
- User::totalMoney($this['user_id'], $this['money']);
+ Operations::totalMoney($this['user_id'], $this['money']);
diff --git a/admin/app/supplier/model/product/Category.php b/admin/app/supplier/model/product/Category.php
index 6b5cb4f..bfc551b 100644
--- a/admin/app/supplier/model/product/Category.php
+++ b/admin/app/supplier/model/product/Category.php
@@ -18,9 +18,9 @@
$model = new static;
if (!Cache::get('category_supplier_' . $shop_supplier_id)) {
$supplier=(new SupplierModel)->detail($shop_supplier_id);
- $where=[$shop_supplier_id]
+ $where=[$shop_supplier_id];
if($supplier['is_newcomer']||$supplier['is_repurchase']||$supplier['is_vip']){
- $where=[0,$shop_supplier_id]
+ $where=[0,$shop_supplier_id];
}
$data = $model->with(['images'])
->where('shop_supplier_id','in',$where)
diff --git a/mobile/pages.json b/mobile/pages.json
index 1b099a0..6c4d749 100644
--- a/mobile/pages.json
+++ b/mobile/pages.json
@@ -1606,6 +1606,47 @@
//#endif
}
}
+ },{
+ "path": "operations/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "运营中心",
+ "app-plus": {
+ //#ifdef H5
+ "titleNView": false
+ //#endif
+ }
+ }
+ }, {
+ "path": "operations/cash/apply",
+ "style": {
+ "navigationBarTitleText": "提现申请",
+ "app-plus": {
+ //#ifdef H5
+ "titleNView": false
+ //#endif
+ }
+ }
+ }, {
+ "path": "operations/cash/list",
+ "style": {
+ "navigationBarTitleText": "提现明细",
+ "app-plus": {
+ //#ifdef H5
+ "titleNView": false
+ //#endif
+ }
+ }
+ }, {
+ "path": "operations/order",
+ "style": {
+ "navigationBarTitleText": "运营中心订单",
+ "app-plus": {
+ //#ifdef H5
+ "titleNView": false
+ //#endif
+ }
+ }
}
]
},
diff --git a/mobile/pages/plus/business/index.vue b/mobile/pages/plus/business/index.vue
index 67c8ff1..b077c7f 100644
--- a/mobile/pages/plus/business/index.vue
+++ b/mobile/pages/plus/business/index.vue
@@ -3,7 +3,7 @@
<!-- 名片展示区域 -->
<view class="content">
<view class="business-card">
- <image style="width: 100%;" @tap="viewPicture(businessImage)" mode="widthFix" :src="businessImage">
+ <image class="card-image" @tap="viewPicture(businessImage)" mode="widthFix" :src="businessImage">
</image>
</view>
@@ -125,6 +125,7 @@
businessImage: '',
business_card_id: '',
height: 0,
+ cardWidth: 0, // 名片宽度
businessList: [],
current: 0,
statistics: {},
@@ -145,7 +146,9 @@
},
onLoad() {
this.screenWidth = uni.getSystemInfoSync().windowWidth * 2 - 70;
-
+ // 计算名片宽度:屏幕宽度减去左右padding(40rpx)
+ const systemInfo = uni.getSystemInfoSync();
+ this.cardWidth = (systemInfo.windowWidth * 2) - 40; // rpx单位
},
onShow() {
this.getbusinessList();
@@ -438,6 +441,15 @@
background: #fff;
border-radius: 20rpx;
overflow: hidden;
+ box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
+
+ .card-image {
+ width: 100%;
+ display: block;
+ // 确保图片清晰度,使用高质量渲染
+ image-rendering: -webkit-optimize-contrast;
+ image-rendering: crisp-edges;
+ }
.top-image {
width: 100%;
@@ -640,6 +652,13 @@
.card-preview {
border-radius: 12rpx;
position: relative;
+ overflow: hidden;
+
+ image {
+ // 保持图片原始清晰度
+ display: block;
+ image-rendering: -webkit-optimize-contrast;
+ }
.mrmp {
height: 50rpx;
diff --git a/mobile/pages/plus/vip/index.vue b/mobile/pages/plus/vip/index.vue
index 7f1bbae..ca1be1e 100644
--- a/mobile/pages/plus/vip/index.vue
+++ b/mobile/pages/plus/vip/index.vue
@@ -124,6 +124,7 @@
words: {},
user: {},
titel: '',
+ vip_url:'',
has_apply: false // 是否已申请
};
},
@@ -154,6 +155,7 @@
self.top_background = data.data.background;
self.vip = data.data.vip;
self.user = data.data.user;
+ self.vip_url = data.data.vip_url;
self.isData = true;
self.loadding = false;
uni.hideLoading();
@@ -173,7 +175,8 @@
/*申请成为VIP*/
applyVip() {
- this.gotoPage('/pages/plus/vip/apply');
+ let vip_url=this.vip_url?this.vip_url:'/pages/plus/vip/apply'
+ this.gotoPage(vip_url);
},
/*查看申请状态*/
diff --git a/mobile/pages2/bonus/index/index.vue b/mobile/pages2/bonus/index/index.vue
index de3122f..4b27131 100644
--- a/mobile/pages2/bonus/index/index.vue
+++ b/mobile/pages2/bonus/index/index.vue
@@ -158,6 +158,7 @@
// 排位过期时间
remain_time: '',
isNotePopup: false,
+ vip_url:''
};
},
onLoad(e) {
@@ -194,6 +195,7 @@
self.bonus = data.data.bonus;
self.user = data.data.user;
self.remain_time = data.data.remain_time;
+ self.vip_url = data.data.vip_url;
self.isData = true;
self.loadding = false;
uni.hideLoading();
@@ -202,7 +204,8 @@
/*申请分销商*/
applybonus() {
- this.gotoPage('/pages2/bonus/apply/apply');
+ let vip_url=this.vip_url?this.vip_url:'/pages2/bonus/apply/apply'
+ this.gotoPage(vip_url);
},
/*去商城逛逛*/
diff --git a/mobile/pages2/shareholder/index/index.vue b/mobile/pages2/shareholder/index/index.vue
index a75e465..4fcde91 100644
--- a/mobile/pages2/shareholder/index/index.vue
+++ b/mobile/pages2/shareholder/index/index.vue
@@ -51,7 +51,8 @@
</view>
</view>
<view class="d-c-c pt30">
- <button type="primary" class="btn-gcred flex-1" @click="gotoCash">{{ info_words.index.words.cash.value }}</button>
+ <button type="primary" class="btn-gcred flex-1"
+ @click="gotoCash">{{ info_words.index.words.cash.value }}</button>
</view>
</view>
<!--图标入口-->
@@ -64,7 +65,8 @@
</view>
<view class="d-c-c d-c flex-1" @click="gotoPage('pages2/shareholder/bonus/bonus')">
<view>
- <image class="team_index_img" src="../../../static/icon/icon-fenxiaodingdan.png" mode=""></image>
+ <image class="team_index_img" src="../../../static/icon/icon-fenxiaodingdan.png" mode="">
+ </image>
</view>
<text class="pt10 f26 mt20">{{ info_words.bonus_list.title.value }}</text>
</view>
@@ -74,13 +76,30 @@
<template v-if="!is_shareholder && isData">
<view class="no-team">
<view class="mt50 p-0-20 pt30 red f34 tc">{{ info_words.index.words.not_shareholder.value }}</view>
- <view class="p30 f28" v-if="setting.become=='40'">您需要下级分销商人数达到<text class="orange">{{setting.totalfxs_down}}</text>人才能成为{{ info_words.index.words.shareholder.value }},您当前的分销商人数为<text class="orange">{{agent_total}}</text>人,继续努力吧!</view>
- <view class="p30 f28" v-if="setting.become=='50'">您需要累计分销佣金达到<text class="orange">{{setting.total_money}}</text>元才能成为{{ info_words.index.words.shareholder.value }},您当前累计分销佣金为<text class="orange">{{agent_money}}</text>元,继续努力吧!</view>
- <view class="p30 f28" v-if="setting.become=='70'">您需要团队累计业绩达到<text class="orange">{{setting.total_team_money}}</text>元才能成为{{ info_words.index.words.shareholder.value }},您当前团队累计业绩为<text class="orange">{{team_money}}</text>元,继续努力吧!</view>
- <view class="p30 f28" v-if="setting.become=='90'">您需要一次性消费达到<text class="orange">{{setting.one_expend_money}}</text>元才能成为{{ info_words.index.words.region.value }},继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='40'">您需要下级分销商人数达到<text
+ class="orange">{{setting.totalfxs_down}}</text>人才能成为{{ info_words.index.words.shareholder.value }},您当前的分销商人数为<text
+ class="orange">{{agent_total}}</text>人,继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='50'">您需要累计分销佣金达到<text
+ class="orange">{{setting.total_money}}</text>元才能成为{{ info_words.index.words.shareholder.value }},您当前累计分销佣金为<text
+ class="orange">{{agent_money}}</text>元,继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='70'">您需要团队累计业绩达到<text
+ class="orange">{{setting.total_team_money}}</text>元才能成为{{ info_words.index.words.shareholder.value }},您当前团队累计业绩为<text
+ class="orange">{{team_money}}</text>元,继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='90'">您需要一次性消费达到<text
+ class="orange">{{setting.one_expend_money}}</text>元才能成为{{ info_words.index.words.region.value }},继续努力吧!
+ </view>
<view class="section-product" v-if="setting.become=='110'">
- <view class="p30 f28">您需要团队推荐商户入驻人数需达到<text class="orange">{{setting.totalsh_down}}</text>人并且团队推荐指定会员等级达到<text class="orange" v-for="(item, index ) in gradeList">{{(index>0?'或':'')+item.name}}</text>满<text class="orange">{{setting.totalvip_down}}</text>人并且至少购买VIP专区商品<text class="orange">{{setting.purchase_count}}</text>次或购买以下任意一款商品才能成为{{ info_words.index.words.shareholder.value }}</view>
- <view @click="gotoProductDetail(item.product_id)" class="item" :class="index==productList.length-1?'noborder':'border-b-e'" v-for="(item, index) in productList" :key="index">
+ <view class="p30 f28">
+ 您需要团队推荐<text class="orange">{{setting.totalsh_down}}</text>家商户入驻
+ 并且团队推荐指定会员等级达到<text class="orange"
+ v-for="(item, index ) in gradeList">{{(index>0?'或':'')+item.name}}</text>满<text
+ class="orange">{{setting.totalvip_down}}</text>人
+ 并且至少购买VIP专区商品<text class="orange">{{setting.purchase_count}}</text>次
+ 或购买以下任意一款商品才能成为{{ info_words.index.words.shareholder.value }}
+ </view>
+ <view @click="gotoProductDetail(item.product_id)" class="item"
+ :class="index==productList.length-1?'noborder':'border-b-e'"
+ v-for="(item, index) in productList" :key="index">
<image :src="item.product_image" class="cover" mode="aspectFit"></image>
<view class="info">
<view class="title">{{ item.product_name }}</view>
@@ -99,7 +118,9 @@
</view>
<view class="section-product" v-if="setting.become=='100'">
<view class="p30 f28 d-c-c">您需要购买以下任意一款商品才能申请{{ info_words.index.words.shareholder.value }}</view>
- <view @click="gotoProductDetail(item.product_id)" class="item" :class="index==productList.length-1?'noborder':'border-b-e'" v-for="(item, index) in productList" :key="index">
+ <view @click="gotoProductDetail(item.product_id)" class="item"
+ :class="index==productList.length-1?'noborder':'border-b-e'"
+ v-for="(item, index) in productList" :key="index">
<image :src="item.product_image" class="cover" mode="aspectFit"></image>
<view class="info">
<view class="title">{{ item.product_name }}</view>
@@ -117,7 +138,8 @@
</view>
</view>
<view class="p30 mt30" v-if="setting.become=='10'">
- <button type="primary" class="btn-gcred" @click="applyShareholder">{{ info_words.index.words.apply_now.value }}</button>
+ <button type="primary" class="btn-gcred"
+ @click="applyShareholder">{{ info_words.index.words.apply_now.value }}</button>
</view>
<view class="p30 mt30" v-else-if="setting.become=='40' || setting.become=='50'">
<button type="primary" class="btn-gcred" @click="gotoAgent">马上去招募人员</button>
@@ -126,7 +148,8 @@
<button type="primary" class="btn-gcred" @click="gotoTeam">去看看我的团队</button>
</view>
<view class="p30">
- <button type="primary" class="btn-gray" @click="gotoShop">{{ info_words.apply.words.goto_mall.value }}</button>
+ <button type="primary" class="btn-gray"
+ @click="gotoShop">{{ info_words.apply.words.goto_mall.value }}</button>
</view>
</view>
<view class="bottom-banner d-c-c d-c" v-if="description_pic!=''">
@@ -165,7 +188,7 @@
team_money: 0,
productList: [],
shareholder: {},
- gradeList:[]
+ gradeList: []
};
},
onLoad(e) {
@@ -187,7 +210,8 @@
self._get('user.shareholder/center', {}, function(data) {
self.info_words = data.data.words;
uni.setNavigationBarTitle({
- title: self.info_words.index.title.value != '' ? self.info_words.index.title.value : self.info_words.index.title
+ title: self.info_words.index.title.value != '' ? self.info_words.index.title
+ .value : self.info_words.index.title
.default
});
self.titel = data.data.words.index.title.value
@@ -216,12 +240,12 @@
gotoShop() {
this.gotoPage('pages/index/index')
},
-
+
/*去分销中心*/
gotoAgent() {
this.gotoPage('pages/agent/index/index')
},
-
+
/*去分红中心*/
gotoTeam() {
this.gotoPage('pages2/shareholder/index/index')
@@ -231,11 +255,11 @@
gotoCash() {
this.gotoPage('pages2/shareholder/cash/apply/apply');
},
-
+
goback() {
uni.navigateBack();
},
-
+
/*跳转产品详情*/
gotoProductDetail(e) {
let url = 'pages/product/detail/detail?product_id=' + e
@@ -297,7 +321,7 @@
line-height: 88rpx;
border-radius: 44rpx;
}
-
+
.index-team .btn-gray {
height: 88rpx;
line-height: 88rpx;
@@ -338,7 +362,7 @@
width: 90rpx;
height: 90rpx;
}
-
+
/* 商品列表样式 */
.section-product .item {
margin: 0 26rpx;
@@ -347,20 +371,20 @@
padding-bottom: 29rpx;
padding-top: 29rpx;
}
-
+
.section-product .cover {
width: 150rpx;
height: 150rpx;
border-radius: 8px;
}
-
+
.section-product .info {
flex: 1;
padding-left: 30rpx;
box-sizing: border-box;
overflow: hidden;
}
-
+
.section-product .title {
width: 100%;
font-size: 26rpx;
@@ -369,14 +393,14 @@
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
-
+
.vender .list .describe {
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
-
+
.section-product .describe {
margin-top: 20rpx;
font-size: 24rpx;
@@ -386,57 +410,57 @@
-webkit-line-clamp: 3;
overflow: hidden;
}
-
+
.section-product .price {
color: #F6220C;
font-size: 24rpx;
}
-
+
.section-product .price .num {
padding: 0 4rpx;
font-size: 32rpx;
}
-
+
.section-product .level-box {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
-
+
.section-product .level-box .key {
font-size: 24rpx;
color: #999999;
}
-
+
.section-product .level-box .num-wrap {
display: flex;
justify-content: flex-end;
align-items: center;
}
-
+
.section-product .level-box .icon-box {
width: 33rpx;
height: 33rpx;
border: 1px solid #c5c5c5;
background: #f2f2f2;
}
-
+
.section-product .level-box .icon-box .gray {
color: #cccccc;
}
-
+
.section-product .level-box .icon-box .gray3 {
color: #333333;
}
-
+
.section-product .level-box .text-wrap {
margin: 0 20rpx;
height: 33rpx;
border: none;
background: none;
}
-
+
.section-product .level-box .text-wrap input {
padding: 0 4rpx;
height: 33rpx;
@@ -448,22 +472,22 @@
align-items: center;
min-height: 33rpx;
}
-
+
.section-product .icon-jiantou {
color: #999;
}
-
+
.user-info .photo,
.user-info .photo image {
width: 50rpx;
height: 50rpx;
border-radius: 50%;
}
-
+
.user-info .photo {
padding-right: 10rpx;
}
-
+
.user-info .grade {
display: block;
padding: 6rpx 20rpx;
@@ -475,4 +499,4 @@
/* color: #ffffff; */
font-family: PingFang SC;
}
-</style>
+</style>
\ No newline at end of file
diff --git a/mobile/pages2/team/index/index.vue b/mobile/pages2/team/index/index.vue
index 700e63d..f46036d 100644
--- a/mobile/pages2/team/index/index.vue
+++ b/mobile/pages2/team/index/index.vue
@@ -51,7 +51,8 @@
</view>
</view>
<view class="d-c-c pt30">
- <button type="primary" class="btn-gcred flex-1" @click="gotoCash">{{ info_words.index.words.cash.value }}</button>
+ <button type="primary" class="btn-gcred flex-1"
+ @click="gotoCash">{{ info_words.index.words.cash.value }}</button>
</view>
</view>
<!--图标入口-->
@@ -64,7 +65,8 @@
</view>
<view class="d-c-c d-c flex-1" @click="gotoPage('pages2/team/order/order')">
<view>
- <image class="team_index_img" src="../../../static/icon/icon-fenxiaodingdan.png" mode=""></image>
+ <image class="team_index_img" src="../../../static/icon/icon-fenxiaodingdan.png" mode="">
+ </image>
</view>
<text class="pt10 f26 mt20">{{ info_words.order.title.value }}</text>
</view>
@@ -86,16 +88,48 @@
<template v-if="!is_team && isData">
<view class="no-team">
<view class="mt50 p-0-20 pt30 red f34 tc">{{ info_words.index.words.not_team.value }}</view>
- <view class="p30 f28" v-if="setting.become=='40'">您需要下级分销商人数达到<text class="orange">{{setting.totalfxs_down}}</text>人才能成为{{ info_words.index.words.team.value }},您当前的分销商人数为<text class="orange">{{agent_total}}</text>人,继续努力吧!</view>
- <view class="p30 f28" v-if="setting.become=='50'">您需要累计分销佣金达到<text class="orange">{{setting.total_money}}</text>元才能成为{{ info_words.index.words.team.value }},您当前累计分销佣金为<text class="orange">{{agent_money}}</text>元,继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='40'">您需要下级分销商人数达到<text
+ class="orange">{{setting.totalfxs_down}}</text>人才能成为{{ info_words.index.words.team.value }},您当前的分销商人数为<text
+ class="orange">{{agent_total}}</text>人,继续努力吧!</view>
+ <view class="p30 f28" v-if="setting.become=='50'">您需要累计分销佣金达到<text
+ class="orange">{{setting.total_money}}</text>元才能成为{{ info_words.index.words.team.value }},您当前累计分销佣金为<text
+ class="orange">{{agent_money}}</text>元,继续努力吧!</view>
+ <view class="section-product" v-if="setting.become=='70'">
+ <view class="p30 f28">您需要推荐<text
+ class="orange">{{setting.totalsh_down}}</text>家商户入驻并且推荐指定会员等级达到<text class="orange"
+ v-for="(item, index ) in gradeList">{{(index>0?'或':'')+item.name}}</text>满<text
+ class="orange">{{setting.totalvip_down}}</text>人并且至少购买VIP专区商品<text
+ class="orange">{{setting.purchase_count}}</text>次或购买以下任意一款商品才能成为{{ info_words.index.words.team.value }}
+ </view>
+ <view @click="gotoProductDetail(item.product_id)" class="item"
+ :class="index==productList.length-1?'noborder':'border-b-e'"
+ v-for="(item, index) in productList" :key="index">
+ <image :src="item.product_image" class="cover" mode="aspectFit"></image>
+ <view class="info">
+ <view class="title">{{ item.product_name }}</view>
+ <view class="describe">{{ item.product_sku.product_attr }}</view>
+ <view class="level-box count_choose">
+ <view class="price">
+ ¥
+ <text class="num">{{ item.product_sku.product_price }}</text>
+ </view>
+ </view>
+ </view>
+ <view class="icon-box pl20">
+ <text class="icon iconfont icon-jiantou f50"></text>
+ </view>
+ </view>
+ </view>
<view class="p30 mt30" v-if="setting.become=='10'">
- <button type="primary" class="btn-gcred" @click="applyteam">{{ info_words.index.words.apply_now.value }}</button>
+ <button type="primary" class="btn-gcred"
+ @click="applyteam">{{ info_words.index.words.apply_now.value }}</button>
</view>
<view class="p30 mt30" v-else-if="setting.become=='40' || setting.become=='50'">
<button type="primary" class="btn-gcred" @click="gotoAgent">马上去招募人员</button>
</view>
<view class="p30">
- <button type="primary" class="btn-gray" @click="gotoShop">{{ info_words.apply.words.goto_mall.value }}</button>
+ <button type="primary" class="btn-gray"
+ @click="gotoShop">{{ info_words.apply.words.goto_mall.value }}</button>
</view>
</view>
</template>
@@ -125,7 +159,9 @@
titel: '',
setting: {},
agent_total: 0,
- agent_money: 0
+ agent_money: 0,
+ productList: [],
+ gradeList: []
};
},
onLoad(e) {
@@ -147,7 +183,8 @@
self._get('user.team/center', {}, function(data) {
self.info_words = data.data.words;
uni.setNavigationBarTitle({
- title: self.info_words.index.title.value != '' ? self.info_words.index.title.value : self.info_words.index.title
+ title: self.info_words.index.title.value != '' ? self.info_words.index.title
+ .value : self.info_words.index.title
.default
});
self.titel = data.data.words.index.title.value
@@ -156,6 +193,8 @@
self.team = data.data.team;
self.user = data.data.user;
self.setting = data.data.setting;
+ self.productList = data.data.productList;
+ self.gradeList = data.data.gradeList;
self.agent_total = data.data.agent_total;
self.agent_money = data.data.agent_money;
self.isData = true;
@@ -171,9 +210,9 @@
/*去商城逛逛*/
gotoShop() {
- this.gotoPage('pages2/index/index')
+ this.gotoPage('pages/index/index')
},
-
+
/*去商城逛逛*/
gotoAgent() {
this.gotoPage('pages/agent/index/index')
@@ -183,7 +222,7 @@
gotoCash() {
this.gotoPage('pages2/team/cash/apply/apply');
},
-
+
goback() {
uni.navigateBack();
},
@@ -243,7 +282,7 @@
line-height: 88rpx;
border-radius: 44rpx;
}
-
+
.index-team .btn-gray {
height: 88rpx;
line-height: 88rpx;
@@ -284,7 +323,7 @@
width: 90rpx;
height: 90rpx;
}
-
+
/* 商品列表样式 */
.section-product .item {
margin: 0 26rpx;
@@ -293,20 +332,20 @@
padding-bottom: 29rpx;
padding-top: 29rpx;
}
-
+
.section-product .cover {
width: 150rpx;
height: 150rpx;
border-radius: 8px;
}
-
+
.section-product .info {
flex: 1;
padding-left: 30rpx;
box-sizing: border-box;
overflow: hidden;
}
-
+
.section-product .title {
width: 100%;
font-size: 26rpx;
@@ -315,14 +354,14 @@
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
-
+
.vender .list .describe {
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
-
+
.section-product .describe {
margin-top: 20rpx;
font-size: 24rpx;
@@ -332,57 +371,57 @@
-webkit-line-clamp: 3;
overflow: hidden;
}
-
+
.section-product .price {
color: #F6220C;
font-size: 24rpx;
}
-
+
.section-product .price .num {
padding: 0 4rpx;
font-size: 32rpx;
}
-
+
.section-product .level-box {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
-
+
.section-product .level-box .key {
font-size: 24rpx;
color: #999999;
}
-
+
.section-product .level-box .num-wrap {
display: flex;
justify-content: flex-end;
align-items: center;
}
-
+
.section-product .level-box .icon-box {
width: 33rpx;
height: 33rpx;
border: 1px solid #c5c5c5;
background: #f2f2f2;
}
-
+
.section-product .level-box .icon-box .gray {
color: #cccccc;
}
-
+
.section-product .level-box .icon-box .gray3 {
color: #333333;
}
-
+
.section-product .level-box .text-wrap {
margin: 0 20rpx;
height: 33rpx;
border: none;
background: none;
}
-
+
.section-product .level-box .text-wrap input {
padding: 0 4rpx;
height: 33rpx;
@@ -394,22 +433,22 @@
align-items: center;
min-height: 33rpx;
}
-
+
.section-product .icon-jiantou {
color: #999;
}
-
+
.user-info .photo,
.user-info .photo image {
width: 50rpx;
height: 50rpx;
border-radius: 50%;
}
-
+
.user-info .photo {
padding-right: 10rpx;
}
-
+
.user-info .grade {
display: block;
padding: 6rpx 20rpx;
@@ -421,4 +460,4 @@
color: #ffffff;
font-family: PingFang SC;
}
-</style>
+</style>
\ No newline at end of file
diff --git a/saas_vue/src/views/agentaccess/Index.vue b/saas_vue/src/views/agentaccess/Index.vue
new file mode 100644
index 0000000..3c3bd86
--- /dev/null
+++ b/saas_vue/src/views/agentaccess/Index.vue
@@ -0,0 +1,288 @@
+<template>
+ <!--
+ 作者:系统
+ 时间:2026-01-23
+ 描述:权限管理-菜单&权限
+ -->
+ <div class="product">
+ <!--添加菜单&权限-->
+ <div class="common-level-rail d-b-c">
+ <el-button size="small" type="primary" @click="addClick" icon="el-icon-plus">添加菜单&权限</el-button>
+ <el-form :inline="true" :model="formSearch" size="small">
+ <el-form-item>
+ <el-checkbox v-model="formSearch.is_menu" @change="changeIsMenuFunc">只显示菜单</el-checkbox>
+ <el-checkbox v-model="formSearch.pack_up" @change="changePackUpFunc">收起</el-checkbox>
+ </el-form-item>
+ </el-form>
+ </div>
+ <!--内容-->
+ <div class="product-content">
+ <div class="table-wrap">
+ <div>
+ <el-table
+ size="small"
+ :data="tableData"
+ style="width: 100%;margin-bottom: 20px;"
+ row-key="access_id"
+ border
+ default-expand-all
+ ref="theTable"
+ :tree-props="{ children: 'children' }"
+ v-loading="loading"
+ >
+ <el-table-column prop="name" label="菜单名称">
+ <template slot-scope="scope">
+ <span v-if="scope.row.path=='/plus'" class="fb red f18">
+ {{scope.row.name}}
+ </span>
+ <span v-else>
+ {{scope.row.name}}
+ </span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="path" label="路径"></el-table-column>
+ <el-table-column prop="is_route" label="类别" width="90">
+ <template slot-scope="scope">
+ <span v-if="scope.row.is_route==1">页面</span>
+ <span v-if="scope.row.is_route==0">按钮</span>
+ <span v-if="scope.row.is_route==2">独立单页面</span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="is_show" label="是否显示" width="80">
+ <template slot-scope="scope">
+ <el-switch
+ v-model="scope.row.is_show"
+ :active-value="1"
+ :inactive-value="0"
+ @change="isShowFunc(scope.row)"
+ active-color="#13ce66"
+ inactive-color="#cccccc"
+ ></el-switch>
+ </template>
+ </el-table-column>
+ <el-table-column prop="sort" label="排序" width="60"></el-table-column>
+ <el-table-column prop="create_time" label="添加时间" width="140"></el-table-column>
+ <el-table-column prop="name" label="操作" width="230">
+ <template slot-scope="scope">
+ <el-button @click="addClick(scope.row,'copy')" type="text" size="small" v-if="scope.row.path!='/plus'">一键复制</el-button>
+ <el-button @click="addClick(scope.row,'child')" type="text" size="small">添加子菜单</el-button>
+ <el-button @click="editClick(scope.row)" type="text" size="small">编辑</el-button>
+ <el-button @click="deleteClick(scope.row)" type="text" size="small" v-if="scope.row.path!='/plus'">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+ </div>
+
+ <!--添加-->
+ <Add v-if="open_add" :open_add="open_add" :add_type="add_type" :rawData="rawData" :selectModel="selectModel" @closeDialog="closeDialogFunc($event, 'add')"></Add>
+
+ <!--编辑-->
+ <Edit v-if="open_edit" :open_edit="open_edit" :rawData="rawData" :selectModel="selectModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
+
+ </div>
+</template>
+<script>
+import AccessApi from '@/api/access.js';
+import Edit from './part/Edit.vue';
+import Add from './part/Add';
+import { deepClone } from '@/utils/base.js';
+export default {
+ components: {
+ /*编辑组件*/
+ Edit: Edit,
+ Add: Add
+ },
+ data() {
+ return {
+ /*是否正在加载*/
+ loading: true,
+ /*筛选搜索*/
+ formSearch: {
+ /*是否只显示菜单*/
+ is_menu: false,
+ /*是否收起*/
+ pack_up: false
+ },
+ /*原始数据*/
+ rawData: [],
+ /*表格数据*/
+ tableData: [],
+ /*是否打开添加弹窗*/
+ open_add: false,
+ /*添加类型*/
+ add_type:'',
+ /*选中的对象*/
+ selectModel:{},
+ /*是否打开编辑弹窗*/
+ open_edit: false,
+ /*当前编辑的对象*/
+ userModel: {},
+ };
+ },
+ created() {
+ /*获取列表*/
+ this.getTableList();
+ },
+ methods: {
+ /*列表是否只显示菜单*/
+ changeIsMenuFunc(e) {
+ let list = deepClone(this.rawData);
+ if (e) {
+ this.showScreen(list, 1);
+ this.tableData = list;
+ } else {
+ this.tableData = list;
+ }
+ },
+
+ /*是否显示开关*/
+ isShowFunc(e) {
+ let self = this;
+ AccessApi.agentstatus({ access_id: e.access_id, status: e.is_show }, true)
+ .then(data => {
+ if (data.code == 1) {
+ self.$message({
+ message: data.msg,
+ type: 'success'
+ });
+ self.getTableList();
+ }
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ },
+
+ /*是否收起*/
+ changePackUpFunc(e) {
+ this.forArr(this.tableData, !e);
+ },
+
+ /*列表收起*/
+ forArr(arr, isExpand) {
+ arr.forEach(i => {
+ this.$refs.theTable.toggleRowExpansion(i, isExpand);
+ if (i.children) {
+ this.forArr(i.children, isExpand);
+ }
+ });
+ },
+
+ /*切换显示类别*/
+ changeShowFunc(e) {
+ let list = deepClone(this.rawData);
+ if (e == 'all') {
+ this.tableData = list;
+ } else {
+ let type;
+ if (e == 'show') {
+ type = 1;
+ }
+ if (e == 'hide') {
+ type = 0;
+ }
+ this.showScreen(list, type);
+ this.tableData = list;
+ }
+ },
+
+ /*显示筛选*/
+ showScreen(list, type) {
+ for (let i = 0; i < list.length; i++) {
+ let item = list[i];
+ if (typeof item.is_menu != 'undefined' && item.is_menu != type) {
+ list.splice(i, 1);
+ i--;
+ } else {
+ if (item.children.length > 0) {
+ this.showScreen(item.children, type);
+ }
+ }
+ }
+ },
+
+ /*获取列表*/
+ getTableList() {
+ let self = this;
+ let Params = {};
+ AccessApi.agentaccessList(Params, true)
+ .then(res => {
+ self.loading = false;
+ self.rawData = res.data;
+ self.tableData = res.data;
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ },
+
+ /*打开添加*/
+ addClick(e,type) {
+ if(e&&typeof(e)!='undefined'){
+ this.add_type=type;
+ this.selectModel=deepClone(e);
+ }else{
+ this.parents_id=0;
+ }
+ this.open_add = true;
+ },
+
+ /*打开编辑*/
+ editClick(item) {
+ this.selectModel = item;
+ this.open_edit = true;
+ },
+
+ closeDialogFunc(e, f) {
+ if (f == 'add') {
+ this.open_add = e.openDialog;
+ if (e.type == 'success') {
+ this.getTableList();
+ }
+ }
+ if (f == 'edit') {
+ this.open_edit = e.openDialog;
+ if (e.type == 'success') {
+ this.getTableList();
+ }
+ }
+ },
+
+ /*删除用户*/
+ deleteClick(row) {
+ let self = this;
+ self
+ .$confirm('删除后不可恢复,确认删除该记录吗?', '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
+ })
+ .then(() => {
+ self.loading = true;
+ AccessApi.agentdelAccess(
+ {
+ access_id: row.access_id
+ },
+ true
+ )
+ .then(data => {
+ if (data.code == 1) {
+ self.loading = false;
+ self.$message({
+ message: data.msg,
+ type: 'success'
+ });
+ self.getTableList();
+ }
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ })
+ .catch(() => {});
+ }
+ }
+};
+</script>
diff --git a/saas_vue/src/views/agentaccess/part/Add.vue b/saas_vue/src/views/agentaccess/part/Add.vue
new file mode 100644
index 0000000..e26f16d
--- /dev/null
+++ b/saas_vue/src/views/agentaccess/part/Add.vue
@@ -0,0 +1,218 @@
+<template>
+ <!--
+ 作者:系统
+ 时间:2026-01-23
+ 描述:代理商权限管理-添加菜单&权限
+ -->
+ <el-dialog title="添加菜单&权限" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
+ <el-form size="small" :model="formData" :rules="formRules" ref="form">
+ <!--菜单名称-->
+ <el-form-item label="菜单名称" prop="name" :label-width="formLabelWidth">
+ <el-input v-model="formData.name" autocomplete="off" placeholder="请输入菜单名称"></el-input>
+ </el-form-item>
+ <!--类型-->
+ <el-form-item label="类型" prop="name" :label-width="formLabelWidth">
+ <el-radio-group v-model="formData.is_route">
+ <el-radio :label="1">页面</el-radio>
+ <el-radio :label="0">按钮</el-radio>
+ <el-radio :label="2">独立单页面</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--上级菜单-->
+ <el-form-item label="上级菜单" prop="parent_id" :label-width="formLabelWidth">
+ <el-cascader size="small" v-model="parentsVal" :options="accessList" :props="propsParam" @change="handleChange"></el-cascader>
+ </el-form-item>
+ <!--路径-->
+ <el-form-item label="路径" prop="path" :label-width="formLabelWidth">
+ <el-input v-model="formData.path" autocomplete="off" placeholder="请输入组件文件路径"></el-input>
+ <p>提示:对应前端给的文件路径,例如:/index/index</p>
+ </el-form-item>
+ <!--图标-->
+ <el-form-item label="图标" :label-width="formLabelWidth">
+ <el-input v-model="formData.icon" autocomplete="off" placeholder="请输入icon"></el-input>
+ <p>提示:请选择系统提供的图标</p>
+ </el-form-item>
+ <!--是否是菜单-->
+ <el-form-item label="是否是菜单" :label-width="formLabelWidth" v-if="formData.is_route==1">
+ <el-radio-group v-model="formData.is_menu">
+ <el-radio :label="1">是</el-radio>
+ <el-radio :label="0">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--是否显示-->
+ <el-form-item label="是否显示" :label-width="formLabelWidth">
+ <el-radio-group v-model="formData.is_show">
+ <el-radio :label="1">是</el-radio>
+ <el-radio :label="0">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--重定向-->
+ <el-form-item label="重定向" :label-width="formLabelWidth" v-if="formData.is_route == 1">
+ <el-input v-model="formData.redirect_name" autocomplete="off" placeholder="请输入重定向地址"></el-input>
+ </el-form-item>
+ <!--备注-->
+ <el-form-item label="备注" prop="sort" :label-width="formLabelWidth">
+ <el-input v-model="formData.remark" placeholder="请输入备注" type="textarea"></el-input>
+ </el-form-item>
+ <!--排序-->
+ <el-form-item label="排序" prop="sort" :label-width="formLabelWidth">
+ <el-input v-model="formData.sort" placeholder="请输入排序" type="number"></el-input>
+ </el-form-item>
+ </el-form>
+ <!--操作按钮-->
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="dialogFormVisible">取 消</el-button>
+ <el-button type="primary" @click="onSubmit()" :disabled="loading">确 定</el-button>
+ </div>
+ </el-dialog>
+</template>
+
+<script>
+import AccessApi from '@/api/access.js';
+import { deepClone,formatModel } from '@/utils/base.js';
+export default {
+ data() {
+ return {
+ /*是否加载中*/
+ loading: false,
+ /*form表单数据对象*/
+ formData: {
+ /*菜单名称*/
+ name: '',
+ /*路由地址*/
+ path: '',
+ /*组件名*/
+ views: '',
+ /*别名*/
+ alias: '',
+ /*图标*/
+ icon: '',
+ /*是否是菜单*/
+ is_menu: 0,
+ /*是否是路由*/
+ is_route: 1,
+ /*是否显示*/
+ is_show: 1,
+ /*排序*/
+ sort: 1,
+ /*父集ID*/
+ parent_id: 0
+ },
+ /*验证规则*/
+ formRules: {
+ name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }],
+ path: [{ required: true, message: '请输入路径', trigger: 'blur' }],
+ views: [{ required: true, message: '请输入组件名称', trigger: 'blur' }],
+ alias: [{ required: true, message: '请输入别名', trigger: 'blur' }]
+ },
+ /*当前父集ID*/
+ parentsVal: [],
+ /*菜单列表*/
+ accessList: [],
+ /*排序*/
+ srot: '1',
+ /*左边长度*/
+ formLabelWidth: '120px',
+ /*是否显示*/
+ dialogVisible: false,
+ /*展示数据*/
+ propsParam: {
+ label: 'name',
+ value: 'access_id',
+ checkStrictly: true
+ }
+ };
+ },
+ props: {
+ open_add: Boolean,
+ add_type: String,
+ rawData: Array,
+ selectModel: Object
+ },
+ created() {
+
+ this.dialogVisible = this.open_add;
+ this.accessList = deepClone(this.rawData);
+ this.accessList.unshift({ name: '顶级菜单', access_id: 0 });
+ if (this.add_type == 'copy') {
+ this.formData =formatModel(this.formData,this.selectModel);
+ this.findParentsID(this.accessList);
+ } else if (this.add_type == 'child') {
+ this.formData.parent_id = this.selectModel.access_id;
+ this.findParentsID(this.accessList);
+ }
+ },
+ methods: {
+ /*选择菜单*/
+ handleChange(e) {},
+
+ /*查找父集id*/
+ findParentsID(list){
+ let flag=false;
+ for(let i=0;i<list.length;i++){
+ let item=list[i];
+ if(item.access_id==this.formData.parent_id){
+ this.parentsVal.unshift(item.access_id);
+ flag=true;
+ break;
+ }else{
+ let children=item.children;
+ if(typeof children!='undefined'&&children.length>0){
+ if(this.findParentsID(children)){
+ this.parentsVal.unshift(item.access_id);
+ flag=true;
+ break;
+ }
+ }
+ }
+ }
+ return flag;
+ },
+
+ /*添加菜单*/
+ onSubmit() {
+ let self = this;
+ let params = this.formData;
+ if (self.parentsVal.length > 0) {
+ params.parent_id = self.parentsVal[self.parentsVal.length - 1];
+ }
+ self.$refs.form.validate(valid => {
+ if (valid) {
+ self.loading = true;
+ AccessApi.agentaddpAccess(params, true)
+ .then(res => {
+ if (res.code == 1) {
+ self.$message({
+ message: res.msg,
+ type: 'success'
+ });
+ self.dialogFormVisible(true);
+ self.loading = false;
+ }
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ }
+ });
+ },
+
+ /*关闭弹窗*/
+ dialogFormVisible(e) {
+ if (e) {
+ this.$emit('closeDialog', {
+ type: 'success',
+ openDialog: false
+ });
+ } else {
+ this.$emit('closeDialog', {
+ type: 'error',
+ openDialog: false
+ });
+ }
+ }
+ }
+};
+</script>
+
+<style></style>
diff --git a/saas_vue/src/views/agentaccess/part/Edit.vue b/saas_vue/src/views/agentaccess/part/Edit.vue
new file mode 100644
index 0000000..7b9f68d
--- /dev/null
+++ b/saas_vue/src/views/agentaccess/part/Edit.vue
@@ -0,0 +1,210 @@
+<template>
+ <!--
+ 作者:系统
+ 时间:2026-01-23
+ 描述:代理商权限管理-修改菜单&权限
+ -->
+ <el-dialog title="修改菜单&权限" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
+ <el-form size="small" :model="formData" :rules="formRules" ref="form">
+ <!--菜单名称-->
+ <el-form-item label="菜单名称" prop="name" :label-width="formLabelWidth">
+ <el-input v-model="formData.name" autocomplete="off" placeholder="请输入菜单名称"></el-input>
+ </el-form-item>
+ <!--类型-->
+ <el-form-item label="类型" prop="name" :label-width="formLabelWidth">
+ <el-radio-group v-model="formData.is_route">
+ <el-radio :label="1">页面</el-radio>
+ <el-radio :label="0">按钮</el-radio>
+ <el-radio :label="2">独立单页面</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--上级菜单-->
+ <el-form-item label="上级菜单" prop="parent_id" :label-width="formLabelWidth">
+ <el-cascader size="small" v-model="parentsVal" :options="accessList" :props="propsParam" @change="handleChange"></el-cascader>
+ </el-form-item>
+ <!--路径-->
+ <el-form-item label="路径" prop="path" :label-width="formLabelWidth">
+ <el-input v-model="formData.path" autocomplete="off" placeholder="请输入组件文件路径" :disabled="formData.path=='/plus'"></el-input>
+ <p>提示:对应前端给的文件路径,例如:index/index</p>
+ </el-form-item>
+ <!--图标-->
+ <el-form-item label="图标" :label-width="formLabelWidth">
+ <el-input v-model="formData.icon" autocomplete="off" placeholder="请输入icon"></el-input>
+ <p>提示:请选择系统提供的图标</p>
+ </el-form-item>
+ <!--是否是菜单-->
+ <el-form-item label="是否是菜单" :label-width="formLabelWidth" v-if="formData.is_route==1">
+ <el-radio-group v-model="formData.is_menu">
+ <el-radio :label="1">是</el-radio>
+ <el-radio :label="0">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--是否显示-->
+ <el-form-item label="是否显示" :label-width="formLabelWidth">
+ <el-radio-group v-model="formData.is_show">
+ <el-radio :label="1">是</el-radio>
+ <el-radio :label="0">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <!--重定向-->
+ <el-form-item label="重定向" :label-width="formLabelWidth" v-if="formData.is_route == 1">
+ <el-input v-model="formData.redirect_name" autocomplete="off" placeholder="请输入重定向地址"></el-input>
+ </el-form-item>
+ <!--备注-->
+ <el-form-item label="备注" prop="sort" :label-width="formLabelWidth">
+ <el-input v-model="formData.remark" placeholder="请输入备注" type="textarea"></el-input>
+ </el-form-item>
+ <!--排序-->
+ <el-form-item label="排序" prop="sort" :label-width="formLabelWidth"><el-input v-model="formData.sort" placeholder="请输入排序" type="number"></el-input></el-form-item>
+ </el-form>
+ <!--操作按钮-->
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="dialogFormVisible">取 消</el-button>
+ <el-button type="primary" @click="onSubmit()" :disabled="loading">确 定</el-button>
+ </div>
+ </el-dialog>
+</template>
+
+<script>
+import AccessApi from '@/api/access.js';
+import { deepClone } from '@/utils/base.js';
+export default {
+ data() {
+ return {
+ /*是否加载中*/
+ loading: false,
+ /*form表单数据对象*/
+ formData: {
+ /*菜单名称*/
+ name: '',
+ /*路由地址*/
+ path:'',
+ /*组件名*/
+ views:'',
+ /*别名*/
+ alias:'',
+ /*图标*/
+ icon:'',
+ /*是否是菜单*/
+ is_menu: 1,
+ /*是否是路由*/
+ is_route: 1,
+ /*是否显示*/
+ is_show: 0,
+ /*排序*/
+ sort: 1,
+ /*父集ID*/
+ parent_id: 0
+ },
+ /*验证规则*/
+ formRules: {
+ name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }],
+ path: [{ required: true, message: '请输入路径', trigger: 'blur' }],
+ views: [{ required: true, message: '请输入组件名称', trigger: 'blur' }],
+ alias: [{ required: true, message: '请输入别名', trigger: 'blur' }]
+ },
+ /*当前父集ID*/
+ parentsVal: [],
+ /*菜单列表*/
+ accessList: [],
+ /*排序*/
+ srot: '1',
+ /*左边长度*/
+ formLabelWidth: '120px',
+ /*是否显示*/
+ dialogVisible: false,
+ /*展示数据*/
+ propsParam: {
+ label: 'name',
+ value: 'access_id',
+ checkStrictly: true
+ }
+ };
+ },
+ props: {
+ open_edit:Boolean,
+ add_type:String,
+ rawData:Array,
+ selectModel:Object
+ },
+ created() {
+ this.dialogVisible = this.open_edit;
+ this.accessList = deepClone(this.rawData);
+ this.accessList.unshift({name:'顶级菜单',access_id:0})
+ this.formData=deepClone(this.selectModel);
+ this.findParentsID(this.accessList);
+
+ },
+ methods: {
+
+ /*选择菜单*/
+ handleChange(e) {
+ },
+
+ /*查找父集id*/
+ findParentsID(list){
+ let flag=false;
+ for(let i=0;i<list.length;i++){
+ let item=list[i];
+ if(item.access_id==this.formData.parent_id){
+ this.parentsVal.unshift(item.access_id);
+ flag=true;
+ break;
+ }else{
+ let children=item.children;
+ if(typeof children!='undefined'&&children.length>0){
+ if(this.findParentsID(children)){
+ this.parentsVal.unshift(item.access_id);
+ flag=true;
+ break;
+ }
+ }
+ }
+ }
+ return flag;
+ },
+
+ /*修改菜单*/
+ onSubmit() {
+ let self = this;
+ let params = self.formData;
+ if(self.parentsVal.length>0){
+ params.parent_id=self.parentsVal[self.parentsVal.length-1];
+ }
+ self.$refs.form.validate(valid => {
+ if (valid) {
+ self.loading = true;
+ AccessApi.agenteditAccess(params, true)
+ .then(res => {
+ if (res.code == 1) {
+ self.$message({
+ message: res.msg,
+ type: 'success',
+ });
+ self.$emit('closeDialog', {
+ type: 'success',
+ openDialog: false,
+ data:params
+ });
+ self.loading = false;
+ }
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ }
+ });
+ },
+
+ /*关闭弹窗*/
+ dialogFormVisible(e) {
+ this.$emit('closeDialog', {
+ type: 'error',
+ openDialog: false
+ });
+ }
+ }
+};
+</script>
+
+<style></style>
diff --git a/shop_vue/src/components/setlink/part/Menu.vue b/shop_vue/src/components/setlink/part/Menu.vue
index 9e21436..364420a 100644
--- a/shop_vue/src/components/setlink/part/Menu.vue
+++ b/shop_vue/src/components/setlink/part/Menu.vue
@@ -147,6 +147,11 @@
url: 'pages/user/activation/index',
name: '激活码',
type: '菜单',
+ },
+ {
+ url: 'pages/plus/operations/index',
+ name: '运营中心',
+ type: '菜单',
}
],
/*选中的值*/
diff --git a/shop_vue/src/views/plus/operations/order/Order.vue b/shop_vue/src/views/plus/operations/order/Order.vue
new file mode 100644
index 0000000..14c680f
--- /dev/null
+++ b/shop_vue/src/views/plus/operations/order/Order.vue
@@ -0,0 +1,272 @@
+<template>
+ <!--
+ 作者:luoyiming
+ 时间:2020-06-01
+ 描述:插件中心-运营中心-运营中心订单
+ -->
+ <div class="user">
+ <div class="common-seach-wrap">
+ <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
+ <el-form-item label="佣金结算">
+ <el-select v-model="formInline.is_settled" placeholder="是否结算佣金">
+ <el-option label="全部" value="-1"></el-option>
+ <el-option label="已结算" value="1"></el-option>
+ <el-option label="未结算" value="0"></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="用户id">
+ <el-input v-model="formInline.user_id" placeholder="请输入用户ID"></el-input>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="onSubmit">查询</el-button>
+ </el-form-item>
+ <el-form-item>
+ <el-button size="small" type="success" @click="onExport" v-auth="'/plus/operations/order/export'">导出</el-button>
+ </el-form-item>
+ </el-form>
+ </div>
+
+ <!--内容-->
+ <div class="product-content">
+ <div class="table-wrap">
+ <el-table :data="tableData" size="small" border style="width: 100%" v-loading="loading">
+ <el-table-column prop="order_master.create_time" label="商品信息">
+ <template slot-scope="scope">
+ <div class="product-info p-10-0" v-for="(item, index) in scope.row.order_master.product" :key="index">
+ <div class="pic"><img v-img-url="item.image.file_path" alt="" /></div>
+ <div class="info">
+ <div class="name gray3">{{ item.product_name }}</div>
+ </div>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="referee.value" label="运营中心" width="400">
+ <template slot-scope="scope">
+ <div class="d-s-s d-c">
+ <div class="d-s-c ww100 border-b-d" v-if="scope.row.first_user_id > 0">
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">省级运营中心:</span>
+ <span class="blue">{{ scope.row.agent_first.nickName }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">用户ID:</span>
+ <span class="gray6">{{ scope.row.agent_first.user_id }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">运营佣金:</span>
+ <span class="orange">¥{{ scope.row.first_money }}</span>
+ </p>
+ </div>
+ <div class="d-s-c ww100 border-b-d" v-if="scope.row.second_user_id > 0">
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">市级运营中心:</span>
+ <span class="blue">{{ scope.row.agent_second.nickName }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">用户ID:</span>
+ <span class="gray6">{{ scope.row.agent_second.user_id }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">运营佣金:</span>
+ <span class="orange">¥{{ scope.row.second_money }}</span>
+ </p>
+ </div>
+ <div class="d-s-c ww100 border-b-d" v-if="scope.row.third_user_id > 0">
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">区级运营中心:</span>
+ <span class="blue">{{ scope.row.agent_third.nickName }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">用户ID:</span>
+ <span class="gray6">{{ scope.row.agent_third.user_id }}</span>
+ </p>
+ <p class="referee-name text-ellipsis">
+ <span class="gray9">运营佣金:</span>
+ <span class="orange">¥{{ scope.row.third_money }}</span>
+ </p>
+ </div>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="nickName" label="单价/数量" width="150">
+ <template slot-scope="scope">
+ <div v-for="(item, index) in scope.row.order_master.product" :key="index">
+ <span class="orange">¥{{ item.product_price }}</span>
+ ×{{ item.total_num }}
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="order_master.pay_price" label="实付款" width="100">
+ <template slot-scope="scope">
+ <span class="fb orange">{{ scope.row.order_master.pay_price }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="order_master.user.nickName" label="买家" width="100"></el-table-column>
+ <el-table-column prop="mobile" label="交易状态" width="130">
+ <template slot-scope="scope">
+ <p>
+ <span class="gray9">付款状态:</span>
+ {{ scope.row.order_master.pay_status.text }}
+ </p>
+ <p>
+ <span class="gray9">发货状态:</span>
+ {{ scope.row.order_master.delivery_status.text }}
+ </p>
+ <p>
+ <span class="gray9">收货状态:</span>
+ {{ scope.row.order_master.receipt_status.text }}
+ </p>
+ </template>
+ </el-table-column>
+ <el-table-column prop="referee.value" label="佣金结算" width="70">
+ <template slot-scope="scope">
+ <span class="green" v-if="scope.row.is_settled == 1">已结算</span>
+ <span class="red" v-if="scope.row.is_settled == 0">未结算</span>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+
+ <!--分页-->
+ <div class="pagination">
+ <el-pagination
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ background
+ :current-page="curPage"
+ :page-size="pageSize"
+ layout="total, prev, pager, next, jumper"
+ :total="totalDataNumber"
+ ></el-pagination>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import OperationsApi from '@/api/plus/operations.js';
+ import qs from 'qs';
+export default {
+ components: {
+ /*编辑组件*/
+ },
+ data() {
+ return {
+ /*是否加载完成*/
+ loading: true,
+ /*列表数据*/
+ tableData: [],
+ /*一页多少条*/
+ pageSize: 20,
+ /*一共多少条数据*/
+ totalDataNumber: 0,
+ /*当前是第几页*/
+ curPage: 1,
+ formInline: {
+ is_settled: '-1',
+ /*用户ID*/
+ user_id: ''
+ },
+ /*是否打开编辑弹窗*/
+ open_edit: false,
+ /*当前编辑的对象*/
+ userModel: {}
+ };
+ },
+ props: {},
+ watch: {
+ $route(to, from) {
+ if (to.query.user_id != null) {
+ this.formInline.user_id = to.query.user_id;
+ } else {
+ this.formInline.user_id = '';
+ }
+ this.curPage = 1;
+ this.getData();
+ }
+ },
+ created() {
+ if (this.$route.query.user_id != null) {
+ this.formInline.user_id = this.$route.query.user_id;
+ }
+ /*获取列表*/
+ this.getData();
+ },
+ methods: {
+ /*选择第几页*/
+ handleCurrentChange(val) {
+ let self = this;
+ self.curPage = val;
+ self.loading = true;
+ self.getData();
+ },
+
+ /*获取数据*/
+ getData(user_id) {
+ let self = this;
+ let Params = {
+ user_id: self.formInline.user_id,
+ page: self.curPage,
+ list_rows: self.pageSize,
+ is_settled: self.is_settled
+ };
+
+ OperationsApi.operationsOrder(Params, true)
+ .then(data => {
+ self.loading = false;
+ self.tableData = data.data.list.data;
+ self.totalDataNumber = data.data.list.total;
+ })
+ .catch(error => {
+ self.loading = false;
+ });
+ },
+
+ //搜索
+ onSubmit() {
+ let self = this;
+ self.loading = true;
+ self.is_settled = self.formInline.is_settled;
+ self.getData();
+ },
+ onExport: function() {
+ let baseUrl = window.location.protocol + '//' + window.location.host;
+ window.location.href = baseUrl + '/index.php/shop/plus.operations.order/export?' + qs.stringify(this.formInline);
+ },
+ /*每页多少条*/
+ handleSizeChange(val) {
+ this.curPage = 1;
+ this.pageSize = val;
+ this.getData();
+ },
+
+ /*打开弹出层编辑*/
+ editClick(item) {
+ this.userModel = item;
+ this.open_edit = true;
+ },
+
+ /*关闭弹窗*/
+ closeDialogFunc(e, f) {
+ if (f == 'add') {
+ this.open_add = e.openDialog;
+ if (e.type == 'success') {
+ this.getData();
+ }
+ }
+ if (f == 'edit') {
+ this.open_edit = e.openDialog;
+ if (e.type == 'success') {
+ this.getData();
+ }
+ }
+ }
+ }
+};
+</script>
+
+<style scoped="">
+ .referee-name {
+ width: 33.333333%;
+ }
+</style>
diff --git a/shop_vue/src/views/plus/operations/setting/part/Basic.vue b/shop_vue/src/views/plus/operations/setting/part/Basic.vue
index fcf3945..9752bd7 100644
--- a/shop_vue/src/views/plus/operations/setting/part/Basic.vue
+++ b/shop_vue/src/views/plus/operations/setting/part/Basic.vue
@@ -20,27 +20,43 @@
<el-radio :label="40">下级分销商总数</el-radio>
<el-radio :label="50">累计佣金总数</el-radio>
<el-radio :label="90">单次消费</el-radio>
+ <el-radio :label="100">购买指定商品</el-radio>
</el-radio-group>
</div>
</el-form-item>
- <el-form-item :label="label_name" v-if="form.become!=10">
+ <el-form-item :label="label_name" v-if="form.become!=10&&form.become!=100">
<div>
<el-input v-model="form.province_condition" type="number" class="max-w460">
- <template slot="prepend">省代理满</template>
+ <template slot="prepend">省运营中心满</template>
<template slot="append">{{unit}}</template>
</el-input>
</div>
<div>
<el-input v-model="form.city_condition" type="number" class="max-w460 mt10">
- <template slot="prepend">市代理满</template>
+ <template slot="prepend">市运营中心满</template>
<template slot="append">{{unit}}</template>
</el-input>
</div>
<div>
<el-input v-model="form.area_condition" type="number" class="max-w460 mt10">
- <template slot="prepend">区/县代理满</template>
+ <template slot="prepend">区/县运营中心满</template>
<template slot="append">{{unit}}</template>
</el-input>
+ </div>
+ </el-form-item>
+
+ <el-form-item label="" v-if="form.become == 100">
+ <div>
+ <el-row>
+ <el-button type="primary" @click="openProduct">选择商品</el-button>
+ <div v-if="form.product_image && form.product_image.length > 0" class="d-s-c f-w">
+ <div v-for="(item, index) in form.product_image" :key="index" class="img pr">
+ <a href="javascript:void(0)" class="delete-btn" @click="deleteFunc(index)"><i class="el-icon-error"></i></a>
+ <img :src="item.image" width="100" height="100" />
+ <p class="text-ellipsis">{{ item.product_name }}</p>
+ </div>
+ </div>
+ </el-row>
</div>
</el-form-item>
<!--提交-->
@@ -48,6 +64,8 @@
<el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
</div>
</el-form>
+ <!--产品列表弹出层组件-->
+ <Product :isproduct="isproduct" @closeDialog="closeDialogFunc($event)">产品列表弹出层</Product>
</div>
</template>
@@ -84,6 +102,9 @@
this.form = this.settingData.data.basic.values;
this.form.become = parseInt(this.form.become);
this.chooseBecomeType(this.form.become);
+ if (!this.form.product_image) {
+ this.form.product_image = [];
+ }
},
methods: {
@@ -132,6 +153,32 @@
this.unit = '元';
}
},
+ /*删除商品*/
+ deleteFunc(i) {
+ this.form.become__buy_product_ids.splice(i, 1);
+ this.form.product_image.splice(i, 1);
+ },
+
+ /*产品列表弹出层*/
+ openProduct() {
+ this.isproduct = true;
+ },
+
+ /*关闭弹窗*/
+ closeDialogFunc(e) {
+ this.isproduct = e.openDialog;
+ if (e.type == 'success') {
+ if (this.form.become__buy_product_ids.indexOf(e.params.product_id) == -1) {
+ this.form.become__buy_product_ids.push(e.params.product_id);
+ this.form.product_image.push({ product_id: e.params.product_id, image: e.params.image,product_name: e.params.product_name });
+ } else {
+ this.$message({
+ message: '已选择该商品',
+ type: 'warning'
+ });
+ }
+ }
+ }
}
};
</script>
diff --git a/shop_vue/src/views/plus/operations/setting/part/Words.vue b/shop_vue/src/views/plus/operations/setting/part/Words.vue
index 53782d7..2e08dff 100644
--- a/shop_vue/src/views/plus/operations/setting/part/Words.vue
+++ b/shop_vue/src/views/plus/operations/setting/part/Words.vue
@@ -18,21 +18,21 @@
<el-form-item label="非代理提示 ">
<el-input v-model="form.index.words.region.value" placeholder="您还不是代理,请先提交申请" class="max-w460"></el-input>
</el-form-item>
- <el-form-item label="申请成为代理 "><el-input v-model="form.index.words.apply_now.value" placeholder="立即加入" class="max-w460"></el-input></el-form-item>
+ <el-form-item label="申请运营中心 "><el-input v-model="form.index.words.apply_now.value" placeholder="立即加入" class="max-w460"></el-input></el-form-item>
<!-- <el-form-item label="推荐人 "><el-input v-model="form.index.words.referee.value" placeholder="推荐人" class="max-w460"></el-input></el-form-item> -->
<el-form-item label="可提现分红 "><el-input v-model="form.index.words.money.value" placeholder="可提现" class="max-w460"></el-input></el-form-item>
<el-form-item label="待提现分红 "><el-input v-model="form.index.words.freeze_money.value" placeholder="待提现" class="max-w460"></el-input></el-form-item>
<el-form-item label="已提现金额"><el-input v-model="form.index.words.total_money.value" placeholder="已提现金额" class="max-w460"></el-input></el-form-item>
<el-form-item label="去提现"><el-input v-model="form.index.words.cash.value" placeholder="去提现" class="max-w460"></el-input></el-form-item>
- <div class="common-form">申请成为代理页面</div>
+ <div class="common-form">申请运营中心页面</div>
<el-form-item label="页面标题">
- <el-input v-model="form.apply.title.value" placeholder="申请成为代理" class="max-w460"></el-input>
- <div class="tips">默认:申请成为代理</div>
+ <el-input v-model="form.apply.title.value" placeholder="申请运营中心" class="max-w460"></el-input>
+ <div class="tips">默认:申请运营中心</div>
</el-form-item>
<el-form-item label="请填写申请信息"><el-input v-model="form.apply.words.title.value" placeholder="请填写申请信息" class="max-w460"></el-input></el-form-item>
<el-form-item label="代理申请协议"><el-input v-model="form.apply.words.license.value" placeholder="代理申请协议" class="max-w460"></el-input></el-form-item>
- <el-form-item label="申请成为代理"><el-input v-model="form.apply.words.submit.value" placeholder="申请成为代理" class="max-w460"></el-input></el-form-item>
+ <el-form-item label="申请运营中心"><el-input v-model="form.apply.words.submit.value" placeholder="申请运营中心" class="max-w460"></el-input></el-form-item>
<el-form-item label="审核中提示信息">
<el-input v-model="form.apply.words.wait_audit.value" placeholder="您的申请已受理,正在进行信息核验,请耐心等待。" class="max-w460"></el-input>
</el-form-item>
@@ -41,6 +41,15 @@
</el-form-item>
<el-form-item label="去商城逛逛"><el-input v-model="form.apply.words.goto_mall.value" placeholder="去商城逛逛" class="max-w460"></el-input></el-form-item>
+ <div class="common-form">运营中心订单页面</div>
+ <el-form-item label="页面标题">
+ <el-input v-model="form.order.title.value" placeholder="运营中心订单" class="max-w460"></el-input>
+ <div class="tips">默认:运营中心订单</div>
+ </el-form-item>
+ <el-form-item label="全部"><el-input v-model="form.order.words.all.value" placeholder="全部" class="max-w460"></el-input></el-form-item>
+ <el-form-item label="未结算"><el-input v-model="form.order.words.unsettled.value" placeholder="未结算" class="max-w460"></el-input></el-form-item>
+ <el-form-item label="已结算"><el-input v-model="form.order.words.settled.value" placeholder="已结算" class="max-w460"></el-input></el-form-item>
+
<div class="common-form">结算明细页面</div>
<el-form-item label="页面标题">
<el-input v-model="form.bonus_list.title.value" placeholder="结算明细" class="max-w460"></el-input>
diff --git a/shop_vue/src/views/product/category/index.vue b/shop_vue/src/views/product/category/index.vue
index e9e9ffe..d9fd508 100644
--- a/shop_vue/src/views/product/category/index.vue
+++ b/shop_vue/src/views/product/category/index.vue
@@ -26,7 +26,7 @@
<el-table-column prop="create_time" label="添加时间"></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
- <el-checkbox v-model="scope.row.status" :checked="scope.row.status" @change="checked => statusChange(checked,scope.row)">启用</el-checkbox>
+ <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0" active-text="启用" inactive-text="禁用" @change="statusChange(scope.row)" :width="55">启用</el-switch>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100">
@@ -144,7 +144,7 @@
});
},
/*启用*/
- statusChange: function(checked,row) {
+ statusChange: function(row) {
let self = this;
// if(row.child.length>0){
// self.$message({
@@ -154,7 +154,7 @@
// row.status = !checked;
// return;
// }
- let status=checked?1:0;
+ let status=row.status?1:0;
self.loading = true;
let params={
category_id: row.category_id,
@@ -167,11 +167,9 @@
)
.then(data => {
self.loading = false;
- row.status = checked;
})
.catch(error => {
self.loading = false;
- row.status = checked?0:1;
});
},
}
diff --git a/shop_vue/src/views/product/product/edit.vue b/shop_vue/src/views/product/product/edit.vue
index e9fb25f..c2bf3f2 100644
--- a/shop_vue/src/views/product/product/edit.vue
+++ b/shop_vue/src/views/product/product/edit.vue
@@ -117,6 +117,8 @@
/*商品编码*/
product_no: '',
settlement_price: 0,
+ /*激活码数量*/
+ activation_code_num: 0,
},
/*多规格类别*/
spec_many: {
diff --git a/shop_vue/src/views/product/product/part/spec/Single.vue b/shop_vue/src/views/product/product/part/spec/Single.vue
index ca116fa..4c26f4e 100644
--- a/shop_vue/src/views/product/product/part/spec/Single.vue
+++ b/shop_vue/src/views/product/product/part/spec/Single.vue
@@ -23,6 +23,9 @@
<el-form-item label="商品重量(Kg):" :rules="[{ required: true, message: '请填写商品重量' }]" prop="model.sku.product_weight">
<el-input type="number" v-model="form.model.sku.product_weight" class="max-w460"></el-input>
</el-form-item>
+ <el-form-item label="激活码数量:" v-if="form.model.is_activation_code==1" :rules="[{ required: true, message: '请填写激活码数量' }]" prop="model.sku.activation_code_num">
+ <el-input type="number" v-model="form.model.sku.activation_code_num" class="max-w460"></el-input>
+ </el-form-item>
</div>
</template>
diff --git a/shop_vue/src/views/product/product/part/spec/many/Table.vue b/shop_vue/src/views/product/product/part/spec/many/Table.vue
index 9bd33be..b761cc6 100644
--- a/shop_vue/src/views/product/product/part/spec/many/Table.vue
+++ b/shop_vue/src/views/product/product/part/spec/many/Table.vue
@@ -13,6 +13,8 @@
<el-input size="small" v-model="batchData.settlement_price" placeholder="结算价" style="width: 160px;padding-left: 4px;"></el-input>
<el-input size="small" v-model="batchData.stock_num" placeholder="库存" style="width: 160px;padding-left: 4px;"></el-input>
<el-input size="small" v-model="batchData.product_weight" placeholder="重量" style="width: 160px;padding-left: 4px;"></el-input>
+ <el-input size="small" v-model="batchData.activation_code_num" placeholder="激活码数量"
+ style="width: 160px;padding-left: 4px;"></el-input>
<el-button size="small" @click="onSubmitBatchData">应用</el-button>
</div>
<!--多规格表格-->
@@ -79,6 +81,18 @@
</el-form-item>
</template>
</el-table-column>
+ <el-table-column label="激活码数量" v-if="form.model.is_activation_code==1">
+ <template slot-scope="scope">
+ <el-form-item
+ label=""
+ :rules="[{ required: true, message: ' ' }]"
+ :prop="'model.spec_many.spec_list.' + scope.$index + '.spec_form.activation_code_num'"
+ style="margin-bottom: 0;"
+ >
+ <el-input size="small" prop="activation_code_num" v-model="scope.row.spec_form.activation_code_num"></el-input>
+ </el-form-item>
+ </template>
+ </el-table-column>
</el-table>
</div>
</el-form-item>
@@ -101,7 +115,9 @@
product_price: '',
line_price: '',
stock_num: '',
- product_weight: ''
+ product_weight: '',
+ settlement_price: '',
+ activation_code_num: '',
},
/*图片是否打开*/
isupload: false,
diff --git a/shop_vue/src/views/supplier/category/index.vue b/shop_vue/src/views/supplier/category/index.vue
index 775dee9..66a39c1 100644
--- a/shop_vue/src/views/supplier/category/index.vue
+++ b/shop_vue/src/views/supplier/category/index.vue
@@ -8,9 +8,8 @@
<div class="common-level-rail">
<el-button size="small" type="primary" @click="addCategory">添加分类</el-button>
<el-select v-model="form.category_type" placeholder="选择类型" @change="getTableList" style="width: 150px; margin-left: 10px;">
- <el-option label="全部" :value="0"></el-option>
- <el-option label="实物" :value="10"></el-option>
- <el-option label="团购" :value="20"></el-option>
+ <el-option label="全部" :value="0"></el-option>
+ <el-option v-for="(item,index) in typeList" :key="index" :label="item" :value="index"></el-option>
</el-select>
</div>
<div class="table-wrap">
@@ -28,10 +27,10 @@
</el-table-column>
</el-table>
<!--添加-->
- <Add v-if="open_add" :open_add="open_add" @closeDialog="closeDialogFunc($event, 'add')"></Add>
+ <Add v-if="open_add" :open_add="open_add" @closeDialog="closeDialogFunc($event, 'add')" :typeList="typeList"></Add>
<!--编辑-->
- <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel"
+ <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" :typeList="typeList"
@closeDialog="closeDialogFunc($event, 'edit')"></Edit>
</div>
@@ -62,6 +61,8 @@
commentData: [],
/*是否加载完成*/
loading: true,
+ /*供应商类型列表*/
+ typeList: [],
/*筛选表单*/
form: {
category_type: 0
@@ -85,6 +86,7 @@
{
self.loading = false;
self.categoryData = data.data.category;
+ self.typeList = data.data.typeList;
})
.catch(error =>
{
diff --git a/shop_vue/src/views/supplier/category/part/Add.vue b/shop_vue/src/views/supplier/category/part/Add.vue
index 6ae1603..c2e370c 100644
--- a/shop_vue/src/views/supplier/category/part/Add.vue
+++ b/shop_vue/src/views/supplier/category/part/Add.vue
@@ -12,8 +12,7 @@
</el-form-item>
<el-form-item label="分类类型" :label-width="formLabelWidth">
<el-radio-group v-model="form.category_type">
- <el-radio :label="10">实物</el-radio>
- <el-radio :label="20">团购</el-radio>
+ <el-radio v-for="(item,index) in typeList" :key="index" :label="index">{{item}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="保证金(元)" :label-width="formLabelWidth" prop="deposit_money">
@@ -57,7 +56,7 @@
loading: false,
};
},
- props: ['open_add'],
+ props: ['open_add', 'typeList'],
created() {
this.dialogVisible = this.open_add;
},
diff --git a/shop_vue/src/views/supplier/category/part/Edit.vue b/shop_vue/src/views/supplier/category/part/Edit.vue
index 5c71313..e08cfbe 100644
--- a/shop_vue/src/views/supplier/category/part/Edit.vue
+++ b/shop_vue/src/views/supplier/category/part/Edit.vue
@@ -7,8 +7,7 @@
</el-form-item>
<el-form-item label="分类类型" :label-width="formLabelWidth">
<el-radio-group v-model="form.category_type">
- <el-radio :label="10">实物</el-radio>
- <el-radio :label="20">团购</el-radio>
+ <el-radio v-for="(item,index) in typeList" :key="index" :label="index">{{item}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="保证金(元)" :label-width="formLabelWidth" prop="deposit_money">
@@ -46,7 +45,7 @@
loading: false,
};
},
- props: ['open_edit', 'form'],
+ props: ['open_edit', 'form', 'typeList'],
created() {
this.dialogVisible = this.open_edit;
},
diff --git a/supplier_vue/src/views/product/category/index.vue b/supplier_vue/src/views/product/category/index.vue
index e9e9ffe..2048dde 100644
--- a/supplier_vue/src/views/product/category/index.vue
+++ b/supplier_vue/src/views/product/category/index.vue
@@ -26,7 +26,7 @@
<el-table-column prop="create_time" label="添加时间"></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
- <el-checkbox v-model="scope.row.status" :checked="scope.row.status" @change="checked => statusChange(checked,scope.row)">启用</el-checkbox>
+ <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0" @change="statusChange(scope.row)">启用</el-switch>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100">
@@ -144,7 +144,7 @@
});
},
/*启用*/
- statusChange: function(checked,row) {
+ statusChange: function(row) {
let self = this;
// if(row.child.length>0){
// self.$message({
@@ -154,7 +154,7 @@
// row.status = !checked;
// return;
// }
- let status=checked?1:0;
+ let status=row.status?1:0;
self.loading = true;
let params={
category_id: row.category_id,
@@ -167,11 +167,9 @@
)
.then(data => {
self.loading = false;
- row.status = checked;
})
.catch(error => {
self.loading = false;
- row.status = checked?0:1;
});
},
}
diff --git a/supplier_vue/src/views/product/product/add.vue b/supplier_vue/src/views/product/product/add.vue
index 6fb6efa..1e75c95 100644
--- a/supplier_vue/src/views/product/product/add.vue
+++ b/supplier_vue/src/views/product/product/add.vue
@@ -153,6 +153,7 @@
is_gift_pack: 0,
// 生成几个超级分红订单
vip_order_num: 0,
+ is_vip:0
},
/*商品分类*/
category: [],
diff --git a/supplier_vue/src/views/product/product/part/Basic.vue b/supplier_vue/src/views/product/product/part/Basic.vue
index 4a81e53..62e2e66 100644
--- a/supplier_vue/src/views/product/product/part/Basic.vue
+++ b/supplier_vue/src/views/product/product/part/Basic.vue
@@ -141,19 +141,19 @@
<el-input type="number" min="0" v-model="form.model.deduction_price" class="max-w460"></el-input>
<div class="gray9">该券线下核销时,实际抵扣的金额</div>
</el-form-item>
- <el-form-item v-if="is_vip" label="是否是激活码商品:" >
+ <el-form-item v-if="form.is_vip" label="是否是激活码商品:" >
<el-radio-group v-model="form.model.is_activation_code">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
- <el-form-item v-if="is_vip" label="是否可以被激活码兑换:" >
+ <el-form-item v-if="form.is_vip" label="是否可以被激活码兑换:" >
<el-radio-group v-model="form.model.activation_code_exchange">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
- <el-form-item v-if="is_vip" label="是否升级礼包:" >
+ <el-form-item v-if="form.is_vip" label="是否升级礼包:" >
<el-radio-group v-model="form.model.is_gift_pack">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
diff --git a/supplier_vue/src/views/statistics/index.vue b/supplier_vue/src/views/statistics/index.vue
index 28f448c..91f8ce7 100644
--- a/supplier_vue/src/views/statistics/index.vue
+++ b/supplier_vue/src/views/statistics/index.vue
@@ -14,5 +14,5 @@
}
</script>
-<style></style>
+<style>
</style>
--
Gitblit v1.9.2