初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\store\shop\controller;
use addon\store\model\StoreAccount;
use app\model\system\Export as ExportModel;
use app\shop\controller\BaseShop;
/**
* 门店账户
*/
class Account extends BaseShop
{
/**
* 门店提现列表
* @return mixed
*/
public function lists()
{
$account_model = new StoreAccount();
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$remark = input('remark', '');
$start_date = input('start_date', '');
$end_date = input('end_date', '');
$from_type = input('from_type', '');
$store_id = input('store_id', 0);//门店
$alias = 'sa';
$join = [
['store s', 'sa.store_id = s.store_id', 'inner'],
];
$condition = [ [ 'sa.site_id', '=', $this->site_id ] ];
if (!empty($remark)) {
$condition[] = [ 'sa.remark', 'like', '%' . $remark . '%' ];
}
if (!empty($from_type)) {
$condition[] = [ 'sa.from_type', '=', $from_type ];
}
if ($store_id > 0) {
$condition[] = [ 'sa.store_id', '=', $store_id ];
}
if ($start_date != '' && $end_date != '') {
$condition[] = [ 'sa.create_time', 'between', [ strtotime($start_date), strtotime($end_date) ] ];
} else if ($start_date != '' && $end_date == '') {
$condition[] = [ 'sa.create_time', '>=', strtotime($start_date) ];
} else if ($start_date == '' && $end_date != '') {
$condition[] = [ 'sa.create_time', '<=', strtotime($end_date) ];
}
$field = 'sa.*,s.store_name';
$order = 'sa.id desc';
$res = $account_model->getStoreAccountPageList($condition, $page, $page_size, $order, $field, $alias, $join);
//账户金额累加
$account_info = $account_model->getStoreAccountInfo($condition, 'sum(sa.account_data) as account_data_sum', $alias, $join)['data'];
$res['data']['account_data_sum'] = $account_info['account_data_sum'] ?? 0;
return $res;
} else {
//门店列表
$store_model = new \app\model\store\Store();
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ] ], '*', 'is_default desc,store_id desc')[ 'data' ] ?? [];
$this->assign('store_list', $store_list);
//门店相关统计
$stat_model = new \addon\store\model\Stat();
$stat_condition = array (
[ 'site_id', '=', $this->site_id ]
);
$total_account = $stat_model->getStoreAccountSum($stat_condition, 'account')[ 'data' ] ?? 0;
$total_account_apply = $stat_model->getStoreAccountSum($stat_condition, 'account_apply')[ 'data' ] ?? 0;
$total_account_withdraw = $stat_model->getStoreAccountSum($stat_condition, 'account_withdraw')[ 'data' ] ?? 0;
$this->assign('stat', [
'total_account' => $total_account,
'total_account_apply' => $total_account_apply,
'total_account_withdraw' => $total_account_withdraw,
]);
//来源方式
$from_type_list = $account_model->from_type;
$this->assign('from_type_list', $from_type_list);
return $this->fetch('account/lists');
}
}
/**
* 添加导出
*/
public function addExport()
{
$input = input();
$input['site_id'] = $this->site_id;
$account_model = new StoreAccount();
return $account_model->addStoreAccountExport($input);
}
/**
* 导出列表
*/
public function exportList()
{
$param = [
'from_type_list' => [
['id' => 'store_account', 'name' => '门店账户'],
],
'lists_url' => 'store://shop/account/exportList',
'delete_url' => 'store://shop/account/deleteExport',
];
$export_controller = new \app\shop\controller\Export();
return $export_controller->lists($param);
}
/**
* 删除导出
*/
public function deleteExport()
{
$export_controller = new \app\shop\controller\Export();
return $export_controller->delete('store_account');
}
}

View File

@@ -0,0 +1,85 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\store\shop\controller;
use addon\store\model\Config as ConfigModel;
use app\model\order\OrderCommon as OrderCommonModel;
use app\shop\controller\BaseShop;
use think\App;
/**
* 门店设置控制器
*/
class Config extends BaseShop
{
public function __construct(App $app = null)
{
$this->replace = [
'STORE_IMG' => __ROOT__ . '/addon/store/shop/view/public/img',
'STORE_JS' => __ROOT__ . '/addon/store/shop/view/public/js',
'STORE_CSS' => __ROOT__ . '/addon/store/shop/view/public/css',
];
parent::__construct($app);
}
/**
* 门店结算周期配置
*/
public function index()
{
$config_model = new ConfigModel();
if (request()->isJson()) {
if(env('IS_RELEASE_WEAPP')){
return error(-1, '发布小程序期间禁止操作');
}
//门店结算与提现设置
$withdraw_config = [
'is_settlement' => input('is_settlement', 0), // 是否进行门店结算
'period_type' => input('period_type', 4), // 结算方式 1 按天 2. 按周 3. 按月 4. 门店申请结算
'settlement_rate' => input('settlement_rate', 0), // 结算比率
'settlement_pay_type' => input('settlement_pay_type', ''), // 结算付款控制
'settlement_cost' => input('settlement_cost', ''), // 结算成本控制 coupon,point,balance,fenxiao_commission
'is_withdraw' => input('is_withdraw', 0), // 是否允许提现
'is_audit' => input('is_audit', 0), // 是否需要提现审核
'is_auto_transfer' => input('is_auto_transfer', 0), // 是否自动转账
'withdraw_type' => input('withdraw_type', ''), // 可提现账户类型 wechatalipay bank
'withdraw_least' => input('withdraw_least', 0), // 提现最低金额
];
$config_model->setStoreWithdrawConfig($this->site_id, $withdraw_config);
$business_config = [
'store_business' => input('store_business', 'shop'), // 门店运营模式 shop店铺整体运营 store连锁门店运营模式
'is_allow_change' => input('is_allow_change', 1), // 是否允许切换门店
'confirm_popup_control' => input('confirm_popup_control', 0), // 门店确认弹窗
'store_auth' => input('store_auth', ''), // 门店控制权限
];
$res = $config_model->setStoreBusinessConfig($this->site_id, $business_config);
return $res;
} else {
$business_config = $config_model->getStoreBusinessConfig($this->site_id)[ 'data' ][ 'value' ];
$this->assign('business_config', $business_config);
$withdraw_config = $config_model->getStoreWithdrawConfig($this->site_id)[ 'data' ][ 'value' ];
$this->assign('withdraw_config', $withdraw_config);
if (addon_is_exit('cashier') == 1) {
$order_common_model = new OrderCommonModel();
$pay_type = $order_common_model->getPayType([ 'order_type' => 5 ]);
if (isset($pay_type[ 'BALANCE' ])) unset($pay_type[ 'BALANCE' ]);
if (isset($pay_type[ 'ONLINE_PAY' ])) unset($pay_type[ 'ONLINE_PAY' ]);
$this->assign('pay_type_list', $pay_type);
}
return $this->fetch('config/index');
}
}
}

View File

@@ -0,0 +1,104 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\store\shop\controller;
use app\model\order\OrderCommon as OrderCommonModel;
use app\model\store\Store;
use app\shop\controller\BaseShop;
use addon\store\model\Settlement as SettlementModel;
/**
* 门店结算控制器
*/
class Settlement extends BaseShop
{
/**
* 门店结算列表
*/
public function index()
{
if (request()->isJson()) {
$model = new SettlementModel();
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$store_id = input('store_id', '');
if (!empty($store_id)) {
$condition[] = [ 'store_id', '=', $store_id ];
}
$condition[] = [ 'site_id', '=', $this->site_id ];
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if (!empty($start_time) && empty($end_time)) {
$condition[] = [ 'start_time', '>=', $start_time ];
} elseif (empty($start_time) && !empty($end_time)) {
$condition[] = [ 'end_time', '<=', $end_time ];
} elseif (!empty($start_time) && !empty($end_time)) {
$condition[] = [ 'start_time', '>=', $start_time ];
$condition[] = [ 'end_time', '<=', $end_time ];
}
$order = 'id desc';
$field = 'id,settlement_no,site_id,site_name,store_name,order_money,shop_money,refund_platform_money,platform_money,refund_shop_money,
refund_money,create_time,commission,is_settlement,offline_refund_money,offline_order_money,start_time,end_time, store_commission, withdraw_id';
$list = $model->getStoreSettlementPageList($condition, $page, $page_size, $order, $field);
return $list;
}
//门店列表
$store_model = new Store();
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ] ]);
$this->assign('store_list', $store_list[ 'data' ]);
return $this->fetch('settlement/index');
}
/**
* 已结算
* @return array
*/
public function settlement()
{
if (request()->isJson()) {
$remark = input('remark', '');
$settlement_id = input('settlement_id', 0);
if (empty($remark)) {
return error(-1, '请填写备注!');
}
$settlement_model = new SettlementModel();
$res = $settlement_model->editSettlement([ 'is_settlement' => 1, 'remark' => $remark ], [ [ 'id', '=', $settlement_id ] ]);
return $res;
}
}
/**
* detail 结算详情
*/
public function detail()
{
$settlement_id = input('settlement_id', 0);
$order_model = new OrderCommonModel();
if (request()->isJson()) {
$condition[] = [ 'store_settlement_id', '=', $settlement_id ];
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$field = 'order_id,order_no,pay_type,order_money,pay_type_name,order_status,refund_money,commission,finish_time,store_commission';
$list = $order_model->getOrderPageList($condition, $page, $page_size, 'finish_time desc', $field);
return $list;
}
$settlement_model = new SettlementModel();
$settlement_info = $settlement_model->getSettlementInfo([ [ 'id', '=', $settlement_id ] ]);
$store_model = new Store();
$store_info = $store_model->getStoreInfoByAccount([ [ 'store_id', '=', $settlement_info[ 'data' ][ 'store_id' ] ] ], 'create_time');
$this->assign('store_info', $store_info[ 'data' ]);
$this->assign('info', $settlement_info[ 'data' ]);
return $this->fetch('settlement/detail');
}
}

View File

@@ -0,0 +1,159 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
namespace addon\store\shop\controller;
use app\model\store\Stat as StatModel;
use app\model\store\Store as StoreModel;
use app\shop\controller\BaseShop;
use Carbon\Carbon;
class Stat extends BaseShop
{
/**
* 门店统计数据
*/
public function store()
{
$store_list = ( new StoreModel() )->getStoreList([ [ 'site_id', '=', $this->site_id ] ], 'store_id,store_name');
$this->assign('store_list', $store_list[ 'data' ]);
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
return $this->fetch('stat/store');
}
/**
* 统计数据总和
*/
public function statTotal()
{
if (request()->isJson()) {
$store_id = input('store_id', 0);
$start_time = $end_time = input('start_time', strtotime(date('Y-m-d', time())));
$end_time = input('end_time', time());
if ($start_time > $end_time) {
$start_time = input('end_time');
$end_time = input('start_time');
}
$stat_model = new StatModel();
$data = $stat_model->getShopStatSum($this->site_id, $start_time, $end_time, $store_id);
return $data;
}
}
/**
* 获取天统计趋势数据
*/
public function dayStatData()
{
if (request()->isJson()) {
$store_id = input('store_id', 0);
$start_time = input('start_time', strtotime(date('Y-m-d', strtotime('-6 day'))));
$end_time = input('end_time', time());
if ($start_time > $end_time) {
$start_time = input('end_time');
$end_time = input('start_time');
}
$stat_model = new StatModel();
$fields = $stat_model->getStatField();
$fields[] = 'expected_earnings_total_money';
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time, $end_time, $store_id)[ 'data' ];
$temp_stat_list = [];
foreach ($stat_list as $v){
$temp_day = date('Y-m-d', $v[ 'day_time' ]);
$v['day_time'] = $temp_day;
$temp_stat_list[$temp_day][] = $v;
}
// $stat_list = array_map(function($item) {
// $item[ 'day_time' ] = date('Y-m-d', $item[ 'day_time' ]);
// return $item;
// }, $stat_list);
// $stat_list = array_column($stat_list, null, 'day_time');
$day = ceil(( $end_time - $start_time ) / 86400);
foreach ($fields as $field) {
$value = [];
$time = [];
for ($i = 0; $i < $day; $i++) {
$date = date('Y-m-d', $start_time + $i * 86400);
$time[] = $date;
$temp_day_stat_list = $temp_stat_list[$date] ?? [];
$field_value = 0;
if(!empty($temp_day_stat_list)){
foreach($temp_day_stat_list as $temp_v){
$field_value += $temp_v ? $temp_v[ $field ] : 0;
}
}
$value[] += $field_value;
}
$data[ $field ] = $value;
$data[ 'time' ] = $time;
}
return success(0, '', $data);
}
}
/**
* 获取小时统计趋势数据
*/
public function hourStatData()
{
if (request()->isJson()) {
$time = input('start_time', time());
$store_id = input('store_id', 0);
$carbon = Carbon::createFromTimestamp($time);
$stat_model = new StatModel();
$fields = $stat_model->getStatHourField();
$fields[] = 'expected_earnings_total_money';
$stat_list = $stat_model->getShopStatHourList($this->site_id, $carbon->year, $carbon->month, $carbon->day, $store_id)[ 'data' ];
$data = [];
$empty = array_map(function() { return 0; }, range(0, 23, 1));
if (!empty($stat_list)) {
// $stat_list = array_column($stat_list, null, 'hour');
$temp_stat_list = [];
foreach($stat_list as $v){
$temp_stat_list[$v['hour']][] = $v;
}
foreach ($fields as $field) {
$value = [];
for ($i = 0; $i < 24; $i++) {
$value[ $i ] = 0;
$temp_item_stat_list = $temp_stat_list[ $i ] ?? [];
if(!empty($temp_item_stat_list)){
foreach($temp_item_stat_list as $temp_v){
$value[ $i ] += $temp_v ? $temp_v[ $field ] : 0;
}
}
}
$data[ $field ] = $value;
}
} else {
foreach ($fields as $field) {
$data[ $field ] = $empty;
}
}
$data[ 'time' ] = array_map(function($value) { return $value . '时'; }, range(0, 23, 1));
return success(0, '', $data);
}
}
}

View File

@@ -0,0 +1,863 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\store\shop\controller;
use addon\store\model\Category;
use addon\store\model\Label;
use addon\store\model\StoreWithdraw;
use app\model\express\Config as ExpressConfig;
use app\model\express\ExpressDeliver;
use app\model\express\Local as LocalModel;
use app\model\order\Order;
use app\model\shop\ShopApply as ShopApplyModel;
use app\model\store\Store as StoreModel;
use app\model\system\Address as AddressModel;
use app\model\system\User;
use app\model\web\Config as ConfigModel;
use app\model\web\Config as WebConfig;
use app\shop\controller\BaseShop;
use addon\store\model\Config as StoreConfig;
use think\facade\Cache;
use think\facade\Session;
/**
* 门店
* Class Store
* @package app\shop\controller
*/
class Store extends BaseShop
{
/**
* 门店首页
*/
public function index()
{
if (request()->isJson()) {
$store_model = new StoreModel();
$order_model = new Order();
$withdrawal_model = new StoreWithdraw();
$data = [
'store_num' => $store_model->getStoreCount([ [ 'site_id', '=', $this->site_id ] ])[ 'data' ],
'in_business_num' => $store_model->getStoreCount([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ],
'total_order_num' => $order_model->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'store_id', '>', 0 ], [ 'is_delete', '=', 0 ], [ 'pay_status', '=', 1 ] ])[ 'data' ],
'total_order_money' => $order_model->getOrderMoneySum([ [ 'site_id', '=', $this->site_id ], [ 'store_id', '>', 0 ], [ 'is_delete', '=', 0 ], [ 'pay_status', '=', 1 ] ])[ 'data' ],
'account_apply' => $store_model->getStoreSum([ [ 'site_id', '=', $this->site_id ] ], 'account_apply')[ 'data' ],
'wait_audit_num' => $withdrawal_model->getStoreWithdrawCount([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 0 ] ])[ 'data' ],
'wait_audit_money' => $withdrawal_model->getStoreWithdrawSum([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 0 ] ], 'money')[ 'data' ],
'wait_transfer_num' => $withdrawal_model->getStoreWithdrawCount([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ],
'wait_transfer_money' => $withdrawal_model->getStoreWithdrawSum([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ], 'money')[ 'data' ],
];
return $store_model->success($data);
}
return $this->fetch('store/index');
}
/**
* 门店排行
*/
public function storeRanking()
{
if (request()->isJson()) {
$order = input('order', 'num');
$stat_model = new \addon\store\model\Stat();
$data = $stat_model->getStoreOrderRank([
'site_id' => $this->site_id,
'order' => $order,
]);
return $data;
}
}
/**
* 商品排行
*/
public function goodsRanking()
{
if (request()->isJson()) {
$order_model = new Order();
$order = input('order', 'num');
$condition = [
[ 'og.site_id', '=', $this->site_id ],
[ 'og.store_id', '>', 0 ],
[ 'o.pay_status', '=', 1 ],
[ 'o.is_delete', '=', 0 ]
];
$join = [
[ 'order o', 'o.order_id = og.order_id', 'inner' ],
[ 'store s', 's.store_id = o.store_id', 'inner' ]
];
$order = $order == 'num' ? 'goods_num desc' : 'goods_money desc';
$res = $order_model->getOrderGoodsList($condition, 'sum(og.num) as goods_num, sum(o.goods_money) as goods_money,og.goods_name', $order, 5, 'og.goods_id', 'og', $join);
return $res;
}
}
/**
* 门店列表
* @return mixed
*/
public function lists()
{
if (request()->isJson()) {
$store_model = new StoreModel();
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
// $order = input("order", "create_time desc");
$keyword = input('search_text', '');
$status = input('status', '');
$type = input('type', '');
$condition = [];
if ($type == 1) {
if ($status != null) {
$condition[] = [ 'status', '=', $status ];
$condition[] = [ 'is_frozen', '=', 0 ];
}
} else if ($type == 2) {
$condition[] = [ 'is_frozen', '=', $status ];
}
$condition[] = [ 'site_id', '=', $this->site_id ];
//关键字查询
if (!empty($keyword)) {
$condition[] = ['store_name', 'like', '%' . $keyword . '%'];
}
$order = 'is_default desc,store_id desc';
$list = $store_model->getStorePageListByAccount($condition, $page, $page_size, $order);
return $list;
} else {
//判断门店插件是否存在
$store_is_exit = addon_is_exit('store', $this->site_id);
$this->assign('store_is_exit', $store_is_exit);
$this->assign('title', $store_is_exit ? '门店' : '自提点');
$this->assign('store_type', ( new StoreModel() )->getStoreType());
$config_model = new ConfigModel();
$default_img = $config_model->getDefaultImg($this->site_id, $this->app_module)[ 'data' ][ 'value' ];
$this->assign('default_img', $default_img);
return $this->fetch('store/lists');
}
}
/**
* 添加门店
* @return mixed
*/
public function addStore()
{
$is_store = addon_is_exit('store');
if (request()->isJson()) {
$store_name = input('store_name', '');
$telphone = input('telphone', '');
$store_image = input('store_image', '');
$province_id = input('province_id', 0);
$city_id = input('city_id', 0);
$district_id = input('district_id', 0);
$community_id = input('community_id', 0);
$address = input('address', '');
$full_address = input('full_address', '');
$longitude = input('longitude', 0);
$latitude = input('latitude', 0);
$is_pickup = input('is_pickup', 0);
$is_o2o = input('is_o2o', 0);
$start_time = input('start_time', 0);
$end_time = input('end_time', 0);
$time_type = input('time_type', 0);
$time_week = input('time_week', '');
$stock_type = input('stock_type', '');
if (!empty($time_week)) {
$time_week = implode(',', $time_week);
}
$data = [
'store_name' => $store_name,
'telphone' => $telphone,
'store_image' => $store_image,
'province_id' => $province_id,
'city_id' => $city_id,
'district_id' => $district_id,
'community_id' => $community_id,
'address' => $address,
'full_address' => $full_address,
'longitude' => $longitude,
'latitude' => $latitude,
'open_date' => '全天营业',
'site_id' => $this->site_id,
'start_time' => $start_time,
'end_time' => $end_time,
'time_type' => $time_type,
'time_week' => $time_week,
'stock_type' => $stock_type,
'is_pickup' => $is_pickup,
'is_o2o' => $is_o2o,
'store_type' => input('store_type', ''),
'category_id' => input('category_id', 0),
'category_name' => input('category_name', ''),
'label_id' => input('label_id', ''),
'label_name' => input('label_name', ''),
'store_images' => input('store_images', ''),
'store_introduce' => input('store_introduce', '')
];
//判断是否开启多门店
if ($is_store == 1) {
$user_data = [
'uid' => input('uid', ''),
];
} else {
$user_data = [];
}
$store_model = new StoreModel();
$result = $store_model->addStore($data, $user_data, $is_store);
return $result;
} else {
//查询省级数据列表
$address_model = new AddressModel();
$list = $address_model->getAreaList([ ['pid', '=', 0 ], ['level', '=', 1 ] ]);
$this->assign('province_list', $list['data']);
$this->assign('is_exit', $is_store);
$this->assign('title', $is_store ? '门店' : '自提点');
$this->assign('http_type', get_http_type());
$config_model = new ConfigModel();
$mp_config = $config_model->getMapConfig($this->site_id);
$this->assign('tencent_map_key', $mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
//效验腾讯地图KEY
$check_map_key = $config_model->checkQqMapKey($mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
$this->assign('check_map_key', $check_map_key);
$express_type = ( new ExpressConfig() )->getEnabledExpressType($this->site_id);
if (isset($express_type[ 'express' ])) unset($express_type[ 'express' ]);
$this->assign('express_type', $express_type);
$this->assign('store_type', ( new StoreModel() )->getStoreType());
$user_list = ( new User() )->getUserList([ [ 'site_id', '=', $this->site_id ],['app_module', '=', 'shop'],['is_admin', '=', 0] ], 'uid,username')[ 'data' ];
$this->assign('user_list', $user_list);
$category = new Category();
$category_config = $category->getCategoryConfig($this->site_id)[ 'data' ][ 'value' ];
if ($category_config[ 'status' ]) {
$category_list = $category->getStoreCategoryList([ [ 'site_id', '=', $this->site_id ] ], 'category_id,category_name')[ 'data' ];
$this->assign('category_list', $category_list);
}
$this->assign('category_status', $category_config[ 'status' ]);
$label_list = ( new Label() )->getStoreLabelList([ [ 'site_id', '=', $this->site_id ] ], 'label_id,label_name')[ 'data' ];
$this->assign('label_list', $label_list);
return $this->fetch('store/add_store');
}
}
/**
* 编辑门店
* @return mixed
*/
public function editStore()
{
$is_exit = addon_is_exit('store');
$store_id = input('store_id', 0);
$condition = [
['site_id', '=', $this->site_id ],
['store_id', '=', $store_id ]
];
$store_model = new StoreModel();
if (request()->isJson()) {
$store_name = input('store_name', '');
$telphone = input('telphone', '');
$store_image = input('store_image', '');
$province_id = input('province_id', 0);
$city_id = input('city_id', 0);
$district_id = input('district_id', 0);
$community_id = input('community_id', 0);
$address = input('address', '');
$full_address = input('full_address', '');
$longitude = input('longitude', 0);
$latitude = input('latitude', 0);
$is_pickup = input('is_pickup', 0);
$is_o2o = input('is_o2o', 0);
$start_time = input('start_time', 0);
$end_time = input('end_time', 0);
$time_type = input('time_type', 0);
$time_week = input('time_week', '');
$stock_type = input('stock_type', '');
if (!empty($time_week)) {
$time_week = implode(',', $time_week);
}
$data = [
'store_name' => $store_name,
'telphone' => $telphone,
'store_image' => $store_image,
'province_id' => $province_id,
'city_id' => $city_id,
'district_id' => $district_id,
'community_id' => $community_id,
'address' => $address,
'full_address' => $full_address,
'longitude' => $longitude,
'latitude' => $latitude,
'start_time' => $start_time,
'end_time' => $end_time,
'time_type' => $time_type,
'time_week' => $time_week,
'stock_type' => $stock_type,
'is_pickup' => $is_pickup,
'is_o2o' => $is_o2o,
'store_type' => input('store_type', ''),
'category_id' => input('category_id', 0),
'category_name' => input('category_name', ''),
'label_id' => input('label_id', ''),
'label_name' => input('label_name', ''),
'store_images' => input('store_images', ''),
'store_introduce' => input('store_introduce', '')
];
$result = $store_model->editStore($data, $condition, [], $is_exit, 1);
return $result;
} else {
//查询省级数据列表
$address_model = new AddressModel();
$list = $address_model->getAreaList([ ['pid', '=', 0 ], ['level', '=', 1 ] ]);
$this->assign('province_list', $list['data']);
$info_result = $store_model->getStoreDetail($condition);//门店信息
$info = $info_result['data'];
if (empty($info)) $this->error('未获取到门店数据', href_url('store://shop/store/lists'));
$this->assign('info', $info);
$this->assign('store_id', $store_id);
$this->assign('is_exit', $is_exit);
$this->assign('title', $is_exit ? '门店' : '自提点');
$this->assign('http_type', get_http_type());
$config_model = new ConfigModel();
$mp_config = $config_model->getMapConfig($this->site_id);
$this->assign('tencent_map_key', $mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
//效验腾讯地图KEY
$check_map_key = $config_model->checkQqMapKey($mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
$this->assign('check_map_key', $check_map_key);
$express_type = ( new ExpressConfig() )->getEnabledExpressType($this->site_id);
if (isset($express_type[ 'express' ])) unset($express_type[ 'express' ]);
$this->assign('express_type', $express_type);
$this->assign('store_type', ( new StoreModel() )->getStoreType());
$category = new Category();
$category_config = $category->getCategoryConfig($this->site_id)[ 'data' ][ 'value' ];
if ($category_config[ 'status' ]) {
$category_list = $category->getStoreCategoryList([ [ 'site_id', '=', $this->site_id ] ], 'category_id,category_name')[ 'data' ];
$this->assign('category_list', $category_list);
}
$this->assign('category_status', $category_config[ 'status' ]);
$label_list = ( new Label() )->getStoreLabelList([ [ 'site_id', '=', $this->site_id ] ], 'label_id,label_name')[ 'data' ];
$this->assign('label_list', $label_list);
return $this->fetch('store/edit_store');
}
}
/**
* @return mixed
*/
public function operate()
{
$store_id = input('store_id', 0);
$condition = [
['site_id', '=', $this->site_id ],
['store_id', '=', $store_id ]
];
$store_model = new StoreModel();
if (request()->isJson()) {
$status = input('status', 0);
$is_pickup = input('is_pickup', 0);
$is_o2o = input('is_o2o', 0);
$start_time = input('start_time', 0);
$end_time = input('end_time', 0);
$time_type = input('time_type', 0);
$time_week = input('time_week', '');
$stock_type = input('stock_type', '');
if (!empty($time_week)) {
$time_week = implode(',', $time_week);
}
$data = [
'status' => $status,
'start_time' => $start_time,
'end_time' => $end_time,
'time_type' => $time_type,
'time_week' => $time_week,
'stock_type' => $stock_type,
'is_pickup' => $is_pickup,
'is_o2o' => $is_o2o,
'time_interval' => input('time_interval', 30),
'delivery_time' => input('delivery_time', ''),
'advance_day' => input('advance_day', 0),
'most_day' => input('most_day', 7),
'is_express' => input('is_express', 0),
'open_date_config' => input('open_date_config', '[]'),
'open_date' => input('open_date', ''),
'out_open_date_o2o_pay' => input('out_open_date_o2o_pay', 1),
'close_show' => input('close_show', 0),
'close_desc' => input('close_desc', ''),
];
$result = $store_model->editStore($data, $condition, [], 1, 1);
return $result;
}
$store_info = $store_model->getStoreDetail($condition)[ 'data' ];//门店信息
if (empty($store_info)) $this->error('未获取到门店信息');
$this->assign('info', $store_info);
$this->assign('store_id', $store_id);
$business_config = ( new StoreConfig() )->getStoreBusinessConfig($this->site_id);
$this->assign('business_config', $business_config[ 'data' ][ 'value' ]);
return $this->fetch('store/operate');
}
public function frozenStore()
{
if (request()->isJson()) {
$store_id = input('store_id', 0);
$is_frozen = input('is_frozen', 0);
$condition = [
['site_id', '=', $this->site_id ],
['store_id', '=', $store_id ]
];
$store_model = new StoreModel();
$res = $store_model->frozenStore($condition, $is_frozen);
return $res;
}
}
/**
* 重置密码
*/
public function modifyPassword()
{
if (request()->isJson()) {
$store_id = input('store_id', '');
$password = input('password', '123456');
$store_model = new StoreModel();
return $store_model->resetStorePassword($password, [ [ 'store_id', '=', $store_id ] ]);
}
}
/**
* 同城配送
*/
public function local()
{
$store_id = input('store_id', 0);
$store_model = new StoreModel();
$info_result = $store_model->getStoreInfo([ [ 'site_id', '=', $this->site_id ], [ 'store_id', '=', $store_id ] ]);//门店信息
$info = $info_result['data'];
if (empty($info)) {
$this->error([], '门店未找到');
}
$local_model = new LocalModel();
if (request()->isJson()) {
$data = [
'type' => input('type', 'default'),//配送方式 default 商家自配送 other 第三方配送
'area_type' => input('area_type', 1),//配送区域
'local_area_json' => input('local_area_json', ''),//区域及业务集合json
'time_is_open' => input('time_is_open', 0),
'time_type' => input('time_type', 0),//时间选取类型 0 全天 1 自定义
'time_week' => input('time_week', ''),
'start_time' => input('start_time', 0),
'end_time' => input('end_time', 0),
'update_time' => time(),
'is_open_step' => input('is_open_step', 0),
'start_distance' => input('start_distance', 0),
'start_delivery_money' => input('start_delivery_money', 0),
'continued_distance' => input('continued_distance', 0),
'continued_delivery_money' => input('continued_delivery_money', 0),
'start_money' => input('start_money', 0),
'delivery_money' => input('delivery_money', 0),
'area_array' => input('area_array', ''),//地域集合
'man_money' => input('man_money', ''),
'man_type' => input('man_type', ''),
'man_discount' => input('man_discount', ''),
'time_interval' => input('time_interval', 30),
'delivery_time' => input('delivery_time', ''),
'advance_day' => input('advance_day', 0),
'most_day' => input('most_day', 7)
];
$condition = [
[ 'site_id', '=', $this->site_id ],
[ 'store_id', '=', $store_id ],
];
return $local_model->editLocal($data, $condition);
} else {
$this->assign('store_detail', $info);
$local_result = $local_model->getLocalInfo([ [ 'site_id', '=', $this->site_id ], [ 'store_id', '=', $store_id ] ]);
$district_list = [];
if ($info[ 'province_id' ] > 0 && $info[ 'city_id' ] > 0) {
//查询省级数据列表
$address_model = new AddressModel();
$list = $address_model->getAreaList([ ['pid', '=', $info[ 'city_id' ] ], ['level', '=', 3 ] ]);
$district_list = $list['data'];
}
$this->assign('district_list', $district_list);
$this->assign('local_info', $local_result[ 'data' ]);
$config_model = new WebConfig();
$mp_config = $config_model->getMapConfig($this->site_id);
$this->assign('tencent_map_key', $mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
//效验腾讯地图KEY
$check_map_key = $config_model->checkQqMapKey($mp_config[ 'data' ][ 'value' ][ 'tencent_map_key' ]);
$this->assign('check_map_key', $check_map_key);
$this->assign('store_id', $store_id);
return $this->fetch('store/local');
}
}
/**
* 结算设置
*/
public function settlement()
{
$store_id = input('store_id', 0);
if (empty($store_id)) {
$this->error('未获取到门店信息');
}
$store_model = new StoreModel();
if (request()->isJson()) {
$is_settlement = input('is_settlement', 0);
if (empty($is_settlement)) {
$data = [
'is_settlement' => 0,
'settlement_rate' => 0
];
} else {
$data = [
'is_settlement' => 1,
'settlement_rate' => input('settlement_rate', 0),//跟随系统传入0独立设置大于0
'bank_type' => input('bank_type', 0),//1微信 2.支付宝 3银行卡
'bank_type_name' => input('bank_type_name', ''), //账户类型名称 微信默认为微信 支付宝默认是支付宝 银行卡需要传银行名称
'bank_user_name' => input('bank_user_name', ''), //账户所属人姓名 针对银行卡需要传入
'bank_type_account' => input('bank_type_account', ''), //具体账户信息,微信需要传入微信名称
];
}
$condition = [
[ 'site_id', '=', $this->site_id ],
[ 'store_id', '=', $store_id ],
];
$result = $store_model->editStore($data, $condition, [], 1, 1);
return $result;
}
$store_info = $store_model->getStoreInfo([ [ 'site_id', '=', $this->site_id ], [ 'store_id', '=', $store_id ] ]);//门店信息
if (empty($store_info)) $this->error('未获取到门店信息');
$this->assign('info', $store_info[ 'data' ]);
$this->assign('store_id', $store_id);
$withdraw_config = ( new StoreConfig() )->getStoreWithdrawConfig($this->site_id);
$this->assign('withdraw_config', $withdraw_config[ 'data' ][ 'value' ]);
return $this->fetch('store/settlement');
}
/**
* 微信授权二维码
*/
public function createWechatAuthQrcode()
{
$cache_key = 'wechat_auth_' . md5(uniqid(null, true));
$model = new \app\model\system\Qrcode();
$url = addon_url("wechat://api/auth/getAuthInfo", [ "cache_key" => $cache_key ]);
$qrcode = $model->createBase64Qrcode($url)['data'];
return $model->success([
'cache_key' => $cache_key,
'qrcode' => $qrcode,
]);
}
/**
* 获取微信授权数据
*/
public function getWechatAuthData()
{
$cache_key = input('cache_key', '');
$data = Cache::get($cache_key);
$model = new StoreModel();
return $model->success($data);
}
/**
* 配送员列表
*/
public function deliverLists()
{
$store_id = input('store_id', 0);
$deliver_model = new ExpressDeliver();
if (request()->isJson()) {
$page = input('page', '1');
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [
[
'site_id', '=', $this->site_id,
],
[
'store_id', '=', $store_id,
]
];
$search_text = input('search_text', '');
if (!empty($search_text)) {
$condition[] = [ 'deliver_name', 'like', '%' . $search_text . '%' ];
}
$deliver_lists = $deliver_model->getDeliverPageLists($condition, '*', 'create_time desc', $page, $page_size);
return $deliver_lists;
} else {
$this->assign('store_id', $store_id);
return $this->fetch('store/deliverlists');
}
}
/**
* 添加配送员
*/
public function addDeliver()
{
$store_id = input('store_id', 0);
$this->assign('store_id', $store_id);
return $this->fetch('store/adddeliver');
}
/**
* 编辑配送员
*/
public function editDeliver()
{
$store_id = input('store_id', 0);
$this->assign('store_id', $store_id);
$deliver_model = new ExpressDeliver();
$deliver_id = input('deliver_id', 0);
$this->assign('deliver_id', $deliver_id);
$deliver_info = $deliver_model->getDeliverInfo($deliver_id, $this->site_id);
$this->assign('deliver_info', $deliver_info[ 'data' ]);
return $this->fetch('store/editdeliver');
}
/**
* 选择门店
* @return mixed
*/
public function selectStore()
{
$store_list = ( new StoreModel() )->getStoreList([ [ 'site_id', '=', $this->site_id ] ], 'store_id,store_name,status,address,full_address,is_frozen');
$this->assign('store_list', $store_list[ 'data' ]);
$store_id = explode(',', input('store_id', ''));
$this->assign('store_id', $store_id);
return $this->fetch('store/select');
}
/**
* 门店主页装修
*/
public function diy()
{
$data = [
'site_id' => $this->site_id,
'name' => 'DIY_STORE'
];
$edit_view = event('DiyViewEdit', $data, true);
return $edit_view;
}
/**
* 门店分类
* @return mixed
*/
public function category()
{
$category = new Category();
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [
[ 'site_id', '=', $this->site_id ]
];
if (!empty($search_text)) $condition[] = [ 'category_name', 'like', "%{$search_text}%" ];
return $category->getStoreCategoryPageList($condition, $page, $page_size);
}
$config = $category->getCategoryConfig($this->site_id)[ 'data' ][ 'value' ];
$this->assign('status', $config[ 'status' ]);
return $this->fetch('store/category');
}
/**
* 添加分类
* @return array
*/
public function addCategory()
{
if (request()->isJson()) {
$data = [
'category_name' => input('category_name', ''),
'site_id' => $this->site_id
];
return ( new Category() )->addStoreCategory($data);
}
}
/**
* 编辑分类
* @return array
*/
public function editCategory()
{
if (request()->isJson()) {
$category_id = input('category_id', 0);
$data = [
'category_name' => input('category_name', ''),
'sort' => input('sort', 0)
];
return ( new Category() )->editStoreCategory($data, [ [ 'category_id', '=', $category_id ], [ 'site_id', '=', $this->site_id ] ]);
}
}
/**
* 删除分类
* @return array
*/
public function deleteCategory()
{
if (request()->isJson()) {
$category_id = input('category_id', 0);
return ( new Category() )->deleteStoreCategory([ [ 'category_id', 'in', $category_id ], [ 'site_id', '=', $this->site_id ] ]);
}
}
/**
* 门店分类是否启用
*/
public function categoryConfig()
{
if (request()->isJson()) {
$status = input('status', 0);
return ( new Category() )->setCategoryConfig([ 'status' => $status ], $this->site_id);
}
}
/**
* 门店标签
* @return mixed
*/
public function tag()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$condition = [
[ 'site_id', '=', $this->site_id ]
];
if (!empty($search_text)) $condition[] = [ 'label_name', 'like', "%{$search_text}%" ];
return ( new Label() )->getStoreLabelPageList($condition, $page, $page_size);
}
return $this->fetch('store/tag');
}
/**
* 添加标签
* @return array
*/
public function addLabel()
{
if (request()->isJson()) {
$data = [
'label_name' => input('label_name', ''),
'site_id' => $this->site_id,
'create_time' => time()
];
return ( new Label() )->addStoreLabel($data);
}
}
/**
* 编辑标签
* @return array
*/
public function editLabel()
{
if (request()->isJson()) {
$label_id = input('label_id', 0);
$data = [
'label_name' => input('label_name', ''),
'sort' => input('sort', 0)
];
return ( new Label() )->editStoreLabel($data, [ [ 'label_id', '=', $label_id ], [ 'site_id', '=', $this->site_id ] ]);
}
}
/**
* 删除标签
* @return array
*/
public function deleteLabel()
{
if (request()->isJson()) {
$label_id = input('label_id', 0);
return ( new Label() )->deleteStoreLabel([ [ 'label_id', '=', $label_id ], [ 'site_id', '=', $this->site_id ] ]);
}
}
/**
* 门店标签选择框
* @return mixed
*/
public function labelSelect()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$condition = [
[ 'site_id', '=', $this->site_id ]
];
if (!empty($search_text)) $condition[] = [ 'label_name', 'like', "%{$search_text}%" ];
return ( new Label() )->getStoreLabelPageList($condition, $page, $page_size);
} else {
$select_id = input('select_id', '');
$this->assign('select_id', $select_id);
return $this->fetch('store/label_select');
}
}
/**
* 修改排序
*/
public function modifySort()
{
if (request()->isJson()) {
$sort = input('sort', 0);
$label_id = input('label_id', 0);
$label_model = new Label();
$res = $label_model->modifySort($sort, $label_id, $this->site_id);
return $res;
}
}
}

View File

@@ -0,0 +1,202 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\store\shop\controller;
use addon\mobileshop\model\Config as ConfigModel;
use addon\store\model\StoreWithdraw;
use addon\wechatpay\model\Config as WechatPayConfig;
use app\shop\controller\BaseShop;
/**
* 门店提现控制器
*/
class Withdraw extends BaseShop
{
/**
* 转账
*/
public function transferFinish()
{
if (request()->isJson()) {
$withdraw_id = input('withdraw_id', 0);
$voucher_img = input('voucher_img', '');
$voucher_desc = input('voucher_desc', '');
$withdraw_model = new StoreWithdraw();
$data = array (
'withdraw_id' => $withdraw_id,
'site_id' => $this->site_id,
'voucher_desc' => $voucher_desc,
'voucher_img' => $voucher_img,
);
$result = $withdraw_model->transferFinish($data);
return $result;
}
}
/**
* 门店提现列表
* @return mixed
*/
public function lists()
{
$withdraw_model = new StoreWithdraw();
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$withdraw_no = input('withdraw_no', '');
$start_date = input('start_date', '');
$end_date = input('end_date', '');
$status = input('status', 'all');//提现状态
$transfer_type = input('transfer_type', '');//提现转账方式
$store_id = input('store_id', 0);//门店
$transfer_start_date = input('transfer_start_date', '');
$transfer_end_date = input('transfer_end_date', '');
$settlement_type = input('settlement_type', '');
$condition = [ [ 'sw.site_id', '=', $this->site_id ] ];
if (!empty($withdraw_no)) {
$condition[] = [ 'withdraw_no', 'like', '%' . $withdraw_no . '%' ];
}
if (!empty($transfer_type)) {
$condition[] = [ 'transfer_type', '=', $transfer_type ];
}
if ($store_id > 0) {
$condition[] = [ 'sw.store_id', '=', $store_id ];
}
if (!empty($settlement_type)) {
$condition[] = [ 'settlement_type', '=', $settlement_type ];
}
if ($status != 'all') {
$condition[] = [ 'sw.status', '=', $status ];
}
if ($start_date != '' && $end_date != '') {
$condition[] = [ 'apply_time', 'between', [ strtotime($start_date), strtotime($end_date) ] ];
} else if ($start_date != '' && $end_date == '') {
$condition[] = [ 'apply_time', '>=', strtotime($start_date) ];
} else if ($start_date == '' && $end_date != '') {
$condition[] = [ 'apply_time', '<=', strtotime($end_date) ];
}
if ($transfer_start_date != '' && $transfer_end_date != '') {
$condition[] = [ 'transfer_time', 'between', [ strtotime($transfer_start_date), strtotime($transfer_end_date) ] ];
} else if ($transfer_start_date != '' && $transfer_end_date == '') {
$condition[] = [ 'transfer_time', '>=', strtotime($transfer_start_date) ];
} else if ($transfer_start_date == '' && $transfer_end_date != '') {
$condition[] = [ 'transfer_time', '<=', strtotime($transfer_end_date) ];
}
$order = 'apply_time desc';
$join = [
[ 'store s', 's.store_id = sw.store_id', 'left' ]
];
return $withdraw_model->getStoreWithdrawPageList($condition, $page, $page_size, $order, 'sw.*,s.telphone', 'sw', $join);
} else {
$this->assign('settlement_type_list', $withdraw_model->settlement_type);
$transfer_type_list = $withdraw_model->getTransferType($this->site_id);
$this->assign('transfer_type_list', $transfer_type_list);
$store_model = new \app\model\store\Store();
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ] ])[ 'data' ] ?? [];
$this->assign('store_list', $store_list);
$stat_model = new \addon\store\model\Stat();
$stat_condition = array (
[ 'site_id', '=', $this->site_id ]
);
$total_account = $stat_model->getStoreAccountSum($stat_condition, 'account')[ 'data' ] ?? 0;
$total_account_apply = $stat_model->getStoreAccountSum($stat_condition, 'account_apply')[ 'data' ] ?? 0;
$total_account_withdraw = $stat_model->getStoreAccountSum($stat_condition, 'account_withdraw')[ 'data' ] ?? 0;
$this->assign('stat', [
'total_account' => $total_account,
'total_account_apply' => $total_account_apply,
'total_account_withdraw' => $total_account_withdraw,
]);
$this->assign('status_list', $withdraw_model->status);
$config_model = new WechatPayConfig();
$config = $config_model->getPayConfig($this->site_id)[ 'data' ][ 'value' ];;
$transfer_v3_type = $config['transfer_type'] == 'v3' && $config['transfer_v3_type'] == $config_model::TRANSFER_V3_TYPE_USER ;
$this->assign("transfer_v3_type",$transfer_v3_type);
return $this->fetch('withdraw/lists');
}
}
/**
* 提现详情
* @return mixed
*/
public function detail()
{
$withdraw_id = input('withdraw_id', 0);
$withdraw_model = new StoreWithdraw();
$withdraw_info = $withdraw_model->detail([ 'site_id' => $this->site_id, 'withdraw_id' => $withdraw_id ])[ 'data' ] ?? [];
if (empty($withdraw_info))
$this->error('找不到此项提现记录!');
$this->assign('withdraw_info', $withdraw_info);
return $this->fetch('withdraw/detail');
}
/**
* 同意
* @return array
*/
public function agree()
{
if (request()->isJson()) {
$withdraw_id = input('withdraw_id', 0);
$withdraw_model = new StoreWithdraw();
$params = array (
'site_id' => $this->site_id,
'withdraw_id' => $withdraw_id,
'status' => 0
);
$result = $withdraw_model->agree($params);
return $result;
}
}
/**
* 拒绝
* @return array
*/
public function refuse()
{
if (request()->isJson()) {
$withdraw_id = input('withdraw_id', 0);
$refuse_reason = input('refuse_reason', '');
$withdraw_model = new StoreWithdraw();
$params = array (
'site_id' => $this->site_id,
'withdraw_id' => $withdraw_id,
'refuse_reason' => $refuse_reason
);
$result = $withdraw_model->refuse($params);
return $result;
}
}
/**
* 转账
*/
public function transfer()
{
if (request()->isJson()) {
$withdraw_id = input('withdraw_id', 0);
$withdraw_model = new StoreWithdraw();
$result = $withdraw_model->transfer($withdraw_id);
return $result;
}
}
}

View File

@@ -0,0 +1,241 @@
<style>
.layui-card-body .content{width: 33.3%;}
.layui-layout-admin .screen{margin-bottom: 15px;}
.account-data-sum{padding-left:10px;}
</style>
<div class="layui-card panel-content card-common card-brief">
<div class="layui-card-header simple">
<span class="card-title">账户概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">待结算(元)</p>
<p class="money">{$stat.total_account}</p>
</div>
<div class="content">
<p class="title">已结算(元)</p>
<p class="money">{$stat.total_account_withdraw}</p>
</div>
<div class="content">
<p class="title">结算中(元)</p>
<p class="money">{$stat.total_account_apply}</p>
</div>
</div>
</div>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">门店</label>
<div class="layui-input-inline">
<select name="store_id" lay-filter="store_id">
<option value="">全部</option>
{foreach name="$store_list" item="store"}
<option value="{$store['store_id']}">{$store['store_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">来源方式</label>
<div class="layui-input-inline">
<select name="from_type">
<option value="">全部</option>
{foreach $from_type_list as $from_type_k=> $from_type_v}
<option value="{$from_type_k}">{$from_type_v.type_name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">发生时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_date" id="start_time" placeholder="请输入开始时间" autocomplete="off" readonly>
</div>
<div class="layui-input-inline split">-</div>
<div class="layui-input-inline end-time">
<input type="text" class="layui-input" name="end_date" id="end_time" placeholder="请输入结束时间" autocomplete="off" readonly>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">备注</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="remark" placeholder="请输入开始时间" autocomplete="off">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="export">导出</button>
<button class="layui-btn layui-btn-primary" onclick="exportList()">导出记录</button>
<span class="account-data-sum">账户汇总:<span id="account_data_sum">0.00</span></span>
</div>
</form>
</div>
</div>
<!-- 列表 -->
<table id="withdraw_list" lay-filter="withdraw_list"></table>
<script type="text/html" id="status">
{{# if(d.status == 0){ }}
<div class="layui-elip" style="color: red">
{{# }else if(d.status == 1){ }}
<div class="layui-elip" style="color: blue">
{{# }else if(d.status == 2){ }}
<div class="layui-elip" style="color: green">
{{# }else if(d.status == -1){ }}
<div class="layui-elip" style="color: gray">
{{# } }}
{{ d.status_name }}</div>
</script>
<!--操作-->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">查看</a>
</div>
</script>
<script>
var table,upload;
layui.use(['form', 'laydate','laytpl'], function() {
var form = layui.form,
laydate = layui.laydate,
currentDate = new Date(),
laytpl = layui.laytpl,
minDate = "";
form.render();
currentDate.setDate(currentDate.getDate() - 7);
//开始时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time',
type: 'datetime'
})
/**
* 表格加载
*/
table = new Table({
elem: '#withdraw_list',
url: ns.url("store://shop/account/lists"),
beforeParseData: function (res){
$("#account_data_sum").html(Number(res.data.account_data_sum).toFixed(2));
},
cols: [
[{
field: 'store_name',
title: '门店',
width: '12%',
unresize: 'false',
},{
field: 'type_name',
title: '来源方式',
width: '10%',
unresize: 'false',
}, {
field: 'account_data',
title: '记录金额',
width: '10%',
unresize: 'false',
}, {
title: '发生时间',
unresize: 'false',
width: '16%',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'remark',
title: '备注',
width: '44%',
unresize: 'false',
templet: function(data) {
return '<div class="text">'+ data.remark +'</div>'
}
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch(obj.event){
case 'detail':
detail(data);
break;
}
});
form.on('submit(export)', function(data){
$.ajax({
type: 'post',
dataType: 'json',
url: ns.url("store://shop/account/addexport"),
data: data.field,
success: function (res) {
console.log(res);
}
})
setTimeout(()=>{
window.open(ns.href("store://shop/account/exportlist"));
}, 500);
return false;
});
});
/**
* 查看详情
*/
function detail(data) {
switch(data.from_type){
case 'order':
window.open(ns.href("shop/order/detail",{order_id:data.related_id}));
break;
case 'refund':
window.open(ns.href("shop/orderrefund/detail",{order_goods_id:data.related_id}));
break;
case 'withdraw':
window.open(ns.href("store://shop/withdraw/detail",{withdraw_id:data.related_id}));
break;
}
}
function exportList(){
window.open(ns.href("store://shop/account/exportlist"));
}
</script>

View File

@@ -0,0 +1,316 @@
<style>
.layui-form-label{width: 160px;}
.layui-form-label + .layui-input-block{margin-left: 160px;}
.word-aux{margin-left: 160px;}
.form-row{margin-left: 160px;}
.confirm-popup.prompt-block span{height:18px;}
.confirm-popup.prompt-block .prompt {display: inline-block;width: auto;margin-left: 5px;}
.confirm-popup.prompt-block .prompt-box{width: 230px;left: 42px;}
.confirm-popup.prompt-block .prompt img{width: 200px;}
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">运营设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">门店运营模式:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="store_business" value="shop" title="平台运营模式" {if $business_config.store_business eq 'shop'}checked{/if} />
<input type="radio" name="store_business" value="store" title="连锁门店模式" {if $business_config.store_business eq 'store'}checked{/if} />
</div>
</div>
<div class="word-aux">
<p>平台运营模式:展示平台整体页面,商品全部展示,考虑门店库存</p>
<p>连锁门店模式:只会展示门店独立页面,商品查询只需查询对应门店</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店切换:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_allow_change" value="1" title="允许用户切换门店" {if $business_config.is_allow_change eq 1}checked{/if} />
<input type="radio" name="is_allow_change" value="0" title="禁止用户切换门店" {if $business_config.is_allow_change eq 0}checked{/if} />
</div>
</div>
<div class="word-aux">禁止切换门店,会锁定距离用户最近的门店,定位失败进入默认总店</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店确认弹窗:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="confirm_popup_control" value="1" title="开启" {if $business_config.confirm_popup_control eq 1}checked{/if} />
<input type="radio" name="confirm_popup_control" value="0" title="关闭" {if $business_config.confirm_popup_control eq 0}checked{/if} />
</div>
</div>
<div class="word-aux prompt-block confirm-popup">
<span>开启后,每次进入门店时弹窗提示当前门店信息</span>
<div class="prompt">
<span class="text-color">示例</span>
<div class="growth-box reason-box reason-growth prompt-box">
<div class="prompt-con">
<img src="STORE_IMG/store_confirm_popup_preview.png">
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item" style="display: none;">
<label class="layui-form-label">功能设置:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="store_auth" lay-filter="store_auth" value="config" title="是否允许门店设置" lay-skin="primary" {if strpos($business_config['store_auth'], 'config') !== false}checked{/if} />
<input type="checkbox" name="store_auth" lay-filter="store_auth" value="balance" title="是否允许调整会员余额" lay-skin="primary" {if strpos($business_config['store_auth'], 'balance') !== false}checked{/if} />
<input type="checkbox" name="store_auth" lay-filter="store_auth" value="point" title="是否允许调整会员积分" lay-skin="primary" {if strpos($business_config['store_auth'], 'point') !== false}checked{/if} />
<input type="checkbox" name="store_auth" lay-filter="store_auth" value="coupon" title="是否允许发放优惠券" lay-skin="primary" {if strpos($business_config['store_auth'], 'coupon') !== false}checked{/if} />
<input type="checkbox" name="store_auth" lay-filter="store_auth" value="adjust" title="是否允许会员改价" lay-skin="primary" {if strpos($business_config['store_auth'], 'adjust') !== false}checked{/if} />
</div>
</div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">结算设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">是否需要结算:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_settlement" lay-filter="is_settlement" value="0" title="总部直营,无需结算" {if $withdraw_config.is_settlement eq 0}checked{/if} />
<input type="radio" name="is_settlement" lay-filter="is_settlement" value="1" title="总部收款,周期性自动结算" {if $withdraw_config.is_settlement eq 1}checked{/if} />
<input type="radio" name="is_settlement" lay-filter="is_settlement" value="2" title="总部收款,门店申请结算" {if $withdraw_config.period_type eq 4}checked{/if} />
</div>
</div>
</div>
<div class="layui-form-item period-type layui-hide">
<label class="layui-form-label">结算周期:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="period_type" value="1" title="每日结算" {if $withdraw_config.period_type eq 1 || $withdraw_config.period_type eq 4}checked{/if} />
<input type="radio" name="period_type" value="2" title="每周结算" {if $withdraw_config.period_type eq 2}checked{/if} />
<input type="radio" name="period_type" value="3" title="每月结算" {if $withdraw_config.period_type eq 3}checked{/if} />
</div>
</div>
</div>
<div class="layui-form-item settlement-rate">
<label class="layui-form-label">门店抽成比率:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="settlement_rate" lay-verify="positivEinteger" placeholder="0" class="layui-input len-short" autocomplete="off" value="{$withdraw_config.settlement_rate}">
</div>
<div class="layui-form-mid layui-word-aux">%</div>
</div>
<div class="word-aux">门店抽成比率需是0-100,且保存两位小数</div>
</div>
<div class="layui-form-item is-withdraw">
<label class="layui-form-label">是否提现:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="is_withdraw" value="1" lay-filter="third_party" lay-skin="switch" {if $withdraw_config.is_withdraw eq 1}checked{/if}>
</div>
</div>
</div>
{notempty name="$pay_type_list"}
<div class="layui-form-item settlement-pay-type">
<label class="layui-form-label">结算付款控制:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
{foreach name="$pay_type_list" item="vo" key="k"}
<input type="checkbox" name="settlement_pay_type" value="{$k}" title="{$vo}" lay-skin="primary" {if strpos($withdraw_config['settlement_pay_type'], $k) !== false}checked{/if} />
{/foreach}
</div>
</div>
</div>
{/notempty}
<div class="layui-form-item settlement-cost">
<label class="layui-form-label">结算成本控制:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="settlement_cost" lay-filter="settlement_cost" value="coupon" title="结算优惠券" lay-skin="primary" {if strpos($withdraw_config['settlement_cost'], 'coupon') !== false}checked{/if} />
<input type="checkbox" name="settlement_cost" lay-filter="settlement_cost" value="point" title="结算积分抵扣" lay-skin="primary" {if strpos($withdraw_config['settlement_cost'], 'point') !== false}checked{/if} />
<input type="checkbox" name="settlement_cost" lay-filter="settlement_cost" value="fenxiao_commission" title="结算扣除佣金" lay-skin="primary" {if strpos($withdraw_config['settlement_cost'], 'fenxiao_commission') !== false}checked{/if} />
</div>
</div>
</div>
<div class="layui-form-item is-audit">
<label class="layui-form-label">是否提现审核:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="is_audit" value="1" lay-skin="switch" {if $withdraw_config.is_audit eq 1}checked{/if}>
</div>
</div>
</div>
<div class="layui-form-item is-audit">
<label class="layui-form-label">是否自动转账:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="is_auto_transfer" value="1" lay-skin="switch" {if $withdraw_config.is_auto_transfer eq 1}checked{/if}>
</div>
</div>
<div class="word-aux">只有微信和支付宝支付支持自动转账</div>
</div>
<div class="layui-form-item withdraw-least">
<label class="layui-form-label">最低提现金额:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="withdraw_least" lay-verify="withdrawLeast" placeholder="0" class="layui-input len-short" autocomplete="off" value="{$withdraw_config.withdraw_least}">
</div>
</div>
<div class="word-aux">最低提现金额必须大于0</div>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script>
var form,
repeat_flag = false, //防重复标识
submitIsSettlement;
layui.use(['form'], function() {
form = layui.form;
form.render();
initFn();
// 是否出现结算周期
form.on('radio(is_settlement)', function(data){
submitIsSettlement = data.value;
if(parseFloat(data.value) == 0){
$(".settlement-rate").addClass("layui-hide");
$(".period-type").addClass("layui-hide");
$('.settlement-pay-type').addClass("layui-hide");
$(".settlement-cost").addClass("layui-hide");
$(".is-withdraw").addClass("layui-hide");
$(".withdraw-least").addClass("layui-hide");
$(".is-audit").addClass("layui-hide");
}else if(parseFloat(data.value) == 1){
$(".is-withdraw").addClass("layui-hide");
$(".settlement-rate").removeClass("layui-hide");
$(".period-type").removeClass("layui-hide");
$('.settlement-pay-type').removeClass("layui-hide");
$(".settlement-cost").removeClass("layui-hide");
$(".withdraw-least").addClass("layui-hide");
$(".is-audit").removeClass("layui-hide");
}else if(parseFloat(data.value) == 2){
$('.settlement-pay-type').removeClass("layui-hide");
$(".settlement-cost").removeClass("layui-hide");
$(".is-withdraw").removeClass("layui-hide");
$(".settlement-rate").removeClass("layui-hide");
$(".period-type").addClass("layui-hide");
$(".withdraw-least").removeClass("layui-hide");
$(".is-audit").removeClass("layui-hide");
}
});
// 验证正整数
form.verify({
positivEinteger: function(value) {
if (parseFloat(value) < 0 || parseFloat(value) > 100) {
return '请输入0-100之间的数';
}
if (value.split(".").length > 1) {
let len = value.split(".")[1].length;
if (len > 2) {
return '门店抽成比率最多两位小数';
}
}
},
withdrawLeast: function(value){
if(value <= 0){
return '最低提现金额必须大于0';
}
if (value.split(".").length > 1) {
let len = value.split(".")[1].length;
if (len > 2) {
return '最低提现金额最多保留两位小数';
}
}
}
});
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
let field = data.field;
if($('input[name="settlement_pay_type"]').length) {
field.settlement_pay_type = [];
$('input[name="settlement_pay_type"]:checked').each(function () {
field.settlement_pay_type.push($(this).val());
});
field.settlement_pay_type = field.settlement_pay_type.toString();
}
field.settlement_cost = [];
$('input[name="settlement_cost"]:checked').each(function () {
field.settlement_cost.push($(this).val());
});
field.settlement_cost = field.settlement_cost.toString();
field.store_auth = [];
$('input[name="store_auth"]:checked').each(function () {
field.store_auth.push($(this).val());
});
field.store_auth = field.store_auth.toString();
if(submitIsSettlement == 2){
field.is_settlement = 1;
field.period_type = 4;
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("store://shop/config/index"),
data: field,
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
});
function initFn(){
// 是否展示结算周期
var isSettlement = '{$withdraw_config.is_settlement}';
var periodType = '{$withdraw_config.period_type}';
if(parseFloat(isSettlement) == 0){
$(".settlement-rate").addClass("layui-hide");
$(".period-type").addClass("layui-hide");
$('.settlement-pay-type').addClass("layui-hide");
$(".settlement-cost").addClass("layui-hide");
$(".is-withdraw").addClass("layui-hide");
}else if(parseFloat(isSettlement) == 1){
$(".is-withdraw").addClass("layui-hide");
$(".settlement-rate").removeClass("layui-hide");
$(".period-type").removeClass("layui-hide");
$('.settlement-pay-type').removeClass("layui-hide");
$(".settlement-cost").removeClass("layui-hide");
$(".is-audit").removeClass("layui-hide");
$(".withdraw-least").addClass("layui-hide");
}
if(parseFloat(periodType) == 4){
submitIsSettlement = 2;
$('.settlement-pay-type').removeClass("layui-hide");
$(".settlement-cost").removeClass("layui-hide");
$(".is-withdraw").removeClass("layui-hide");
$(".settlement-rate").removeClass("layui-hide");
$(".period-type").addClass("layui-hide");
$(".is-audit").removeClass("layui-hide");
$(".withdraw-least").removeClass("layui-hide");
}
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,83 @@
<style>
#detail_list {
margin-top: 15px;
}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<ul class="layui-colla-content layui-show">
<li>账期时间:{if $info.start_time > 0}{:date('Y-m-d H:i:s', $info.start_time)} {else/} {:date('Y-m-d H:i:s', $store_info['create_time'])} {/if} 至 {:date('Y-m-d H:i:s', $info.end_time)}</li>
<li>线上结算金额 = 线上付款金额(<span style="color: red">¥{$info.order_money}</span>)</li>
<li>线下付款金额<span style="color: red">¥{$info.offline_order_money}</span></li>
<li>线下退款金额<span style="color: red">¥{$info.offline_refund_money}</span></li>
<li>门店抽成金额<span style="color: red">¥{$info.store_commission}</span></li>
</ul>
</div>
</div>
<table id="detail_list" lay-filter="detail_list"></table>
<script>
layui.use(['laydate','form'], function () {
var form = layui.form;
form.render();
var table = new Table({
elem: '#detail_list',
url: ns.url("store://shop/settlement/detail", {'settlement_id': {$info.id}}),
where:{id:"{$info.id}"},
cols: [
[{
field: 'order_no',
title: '订单编号',
unresize: 'false',
width: '18%'
}, {
field: 'pay_type_name',
title: '支付方式',
unresize: 'false',
width: '12%'
}, {
field:'order_money',
title: '订单销售额(元)',
unresize: 'false',
align: 'right',
templet: function (res){
return '¥'+res.order_money;
},
width: '12%'
}, {
field:'refund_money',
title: '订单退款(元)',
unresize: 'false',
align: 'right',
templet: function (res){
return '¥'+res.refund_money;
},
width: '14%'
}, {
title: '门店抽成(元)',
unresize: 'false',
align: 'right',
templet: function (res){
return '¥'+res.store_commission;
},
width: '12%'
}, {
unresize: 'false',
width: '12%'
}, {
field: 'finish_time',
title: '订单完成时间',
unresize: 'false',
templet: function (res){
if(res.finish_time == 0){
return '--';
}else{
return ns.time_to_date(res.finish_time)
}
},
width: '20%'
}]
]
});
});
</script>

View File

@@ -0,0 +1,227 @@
<style>
.calendar{text-align: center;line-height: 34px;}
.layui-layout-admin .single-filter-box{padding-bottom: 0;}
</style>
<!-- 筛选面板 -->
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-inline">
<div class="layui-inline">
<div class="layui-input-inline"></div>
</div>
<div class="layui-input-inline">
<select name="store_id" lay-filter="store_id">
<option value="">请选择门店</option>
{foreach name="$store_list" item="store"}
<option value="{$store['store_id']}">{$store['store_name']}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline">
<input type="text" name="start_time" id="start_time" placeholder="结算开始时间" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-input-inline end-time">
<input type="text" name="end_time" id="end_time" placeholder="结算结束时间" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="search">搜索</button>
</div>
</div>
</div>
<div class="layui-tab table-tab">
<div class="layui-tab-content">
<table id="account_list" lay-filter="account_list"></table>
</div>
</div>
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(d.is_settlement == 0){ }}
<a class="layui-btn" lay-event="settlement">结算</a>
{{# } }}
<a class="layui-btn" lay-event="detail">详情</a>
</div>
</script>
<script type="text/html" id="shop_money">
<span style="color: red;">{{d.shop_money}}</span>
</script>
<script type="text/html" id="reviewReason">
<div class="layui-form">
<div class="layui-form-item layui-form-text">
<label class="layui-form-label mid">结算备注</label>
<div class="layui-input-block len-mid">
<textarea name="remark" placeholder="请输入内容" class="layui-textarea" maxlength="150"></textarea>
</div>
</div>
<input name="settlement_id" value="{{d.id}}" type="hidden"/>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">结算</button>
<button onclick="cancel()" class="layui-btn layui-btn-primary">取消</button>
</div>
</div>
</script>
<script>
var start_time,end_time,
repeat_flag = false;
layui.use(['laydate','form','laytpl'], function () {
var laydate = layui.laydate,
laytpl = layui.laytpl,
form = layui.form;
form.render();
//开始时间
laydate.render({
elem: '#start_time' //指定元素
});
//结束时间
laydate.render({
elem: '#end_time' //指定元素
});
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
data.field.start_time = start_time;
data.field.end_time = end_time;
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
function settlement(data) {
laytpl($("#reviewReason").html()).render(data, function(html){
layer.open({
type: 1,
title:'结算',
content: html,
area: ['500px']
});
})
}
form.on('submit(save)', function (data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("store://shop/settlement/settlement"),
data: data.field,
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
});
var table = new Table({
elem: '#account_list',
url: ns.url("store://shop/settlement/index"),
cols: [
[{
field:'settlement_no',
title: '账单编号',
unresize: 'false',
width:'16%',
},{
field: 'store_name',
title: '门店',
width:'10%',
}, {
title: '订单总额',
unresize: 'false',
width:'8%',
align: 'right',
templet: function (res){
return '¥' + (res.order_money*1 + res.offline_order_money*1 - res.refund_shop_money*1- res.offline_refund_money*1);
}
}, {
title: '线上结算金额',
unresize: 'false',
width:'9%',
align: 'right',
templet: function (res) {
return '<span style="color: red;">¥'+ (res.order_money*1 - res.refund_shop_money*1 -res.commission*1) + '</span>';
}
}, {
title: '线下结算金额',
unresize: 'false',
width:'9%',
align: 'right',
templet: function (res){
return '<span style="color: red;">¥'+ (res.offline_order_money*1 - res.offline_refund_money*1) + '</span>';
}
},{
title: '门店抽成金额',
unresize: 'false',
width:'10%',
align: 'right',
templet: function (res){
return '<span style="color: red;">¥'+ (res.store_commission) + '</span>';
}
}, {
title: '结算开始时间',
unresize: 'false',
width:'14%',
templet: function (res){
if(res.start_time == 0){
return '--';
}else{
return ns.time_to_date(res.start_time)
}
}
}, {
title: '结算结束时间',
unresize: 'false',
width:'14%',
templet: function (res){
if(res.end_time == 0){
return '--';
}else{
return ns.time_to_date(res.end_time)
}
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'settlement': //编辑
settlement(data);
break;
case 'detail':
location.hash = ns.hash("store://shop/settlement/detail",{'settlement_id': data.id});
break;
}
});
});
function cancel(){
layer.closeAll()
}
</script>

View File

@@ -0,0 +1,413 @@
<style>
/*时间选择*/
.time-screen .screen{display: flex}
.time-screen .screen .item {height: 32px;line-height: 32px;padding: 0 20px;border: 1px solid #D2D2D2;cursor: pointer;border-right: none;border-left: none;position: relative}
.time-screen .screen .item:after{content: '';position: absolute;top: -1px;left: 0;bottom: -1px;right: -1px;border-right: 1px solid #D2D2D2;border-left: 1px solid #D2D2D2;}
.time-screen .screen .selected,.time-screen .item:hover{color: #fff;background: var(--base-color);border-color: var(--base-color) }
.time-screen .screen .selected:after, .time-screen .item:hover:after {border-right: 1px solid var(--base-color);border-left: 1px solid var(--base-color);}
.data-wrap {display: flex;flex-wrap: wrap; margin-top: 15px;}
.data-wrap .data-item {display: flex;min-width: 250px;margin-bottom: 15px;}
.data-wrap .data-item .box {flex: 1;margin-right: 15px;border: 1px solid #eee;box-sizing: border-box;padding: 15px;cursor: pointer}
.data-wrap .data-item:last-child .box {margin-right: 0}
.data-wrap .data-item .value {font-size: 25px;font-weight: bolder;line-height: 40px}
.data-wrap .data-item .js-prompt-top {color:#C8C9CC;font-size:14px;z-index:999;cursor:pointer;}
.data-wrap .data-item .info {font-size: 12px;color: #999;}
.data-wrap .info .iconfont {font-size: 12px;}
.data-wrap .data-item .text-color-green {color: #00A717}
.data-wrap .data-item .text-color-red {color: #ff0000}
.data-wrap .data-item.selected .box {border-color: var(--base-color);color: var(--base-color);}
.statistics-wrap {position: relative}
.statistics-wrap .loading {background: rgba(255,255,255,.5);position: absolute;left: 0; top: 0;text-align: center;width: 100%;height: 100%;box-sizing: border-box;padding-top: 100px;display: none}
.statistics-wrap .loading i {font-size: 25px}
.layui-layer-content .layui-form-label {width: 100px}
.echart {margin-top: 15px}
.echart-wrap {margin-top: 30px;display: flex;}
.echart-wrap .main {flex: 1;height: 400px}
.echart-wrap .main:nth-child(2) {margin-left: 15px}
.date-input{width: 300px}
.time-screen{display: flex;justify-content: space-between; }
</style>
<div class="main-wrap">
<div class="time-screen statistics">
<div class="screen">
<div class="item selected" date-type="today">今日</div>
<div class="item" date-type="yesterday">昨日</div>
<div class="item" date-type="seven">7日内</div>
<div class="item" date-type="thirty">30日内</div>
<div class="item" date-type="custom">自定义</div>
</div>
<div class="layui-form">
<div class="layui-inline">
<label class="layui-form-label">门店</label>
<div class="layui-input-inline">
<select name="store_id" lay-filter="store_id">
<option value="">全部</option>
{foreach name="$store_list" item="store_vo"}
<option value="{$store_vo['store_id']}">{$store_vo['store_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
</div>
<div class="statistics-wrap">
<div class="data-wrap">
<div class="data-item selected" data-value="expected_earnings_total_money">
<div class="box">
<div class="title">
<span class="title-text">预计收入(元)</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
<div class="data-item" data-value="billing_money">
<div class="box">
<div class="title">
<span class="title-text">开单金额数(元)</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
<div class="data-item" data-value="billing_count">
<div class="box">
<div class="title">
<span class="title-text">开单数量</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="num">0</div>
</div>
</div>
<div class="data-item" data-value="buycard_money">
<div class="box">
<div class="title">
<span class="title-text">办卡金额数(元)</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
<div class="data-item" data-value="buycard_count">
<div class="box">
<div class="title">
<span class="title-text">办卡数</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="num">0</div>
</div>
</div>
<div class="data-item" data-value="recharge_money">
<div class="box">
<div class="title">
<span class="title-text">会员充值金额(元)</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
<div class="data-item" data-value="recharge_count">
<div class="box">
<div class="title">
<span class="title-text">会员充值数量</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="num">0</div>
</div>
</div>
<div class="data-item" data-value="refund_money">
<div class="box">
<div class="title">
<span class="title-text">会员退款金额(元)</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
<div class="data-item" data-value="refund_count">
<div class="box">
<div class="title">
<span class="title-text">会员退款数量</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="num">0</div>
</div>
</div>
<div class="data-item" data-value="order_member_count">
<div class="box">
<div class="title">
<span class="title-text">门店下单会员数</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="num">0</div>
</div>
</div>
<div class="data-item" data-value="balance_money">
<div class="box">
<div class="title">
<span class="title-text">会员余额消费金额</span>
<!-- <span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,新注册会员的数量"></span> -->
</div>
<div class="value" data-type="money">0</div>
</div>
</div>
</div>
<div class="loading">
<i class="common-loading-layer layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>
</div>
</div>
<div class="echart-wrap">
<div class="main" id="main"></div>
</div>
</div>
<script type="text/html" id="custom-box">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">选择时间</label>
<div class="layui-inline layui-inline-margin" id="time_fission">
<div class="layui-input-inline">
<input type="text" id="date" name="date" autocomplete="off" class="layui-input date-input" placeholder="请选择日期">
<i class="iconfont iconriqi"></i>
</div>
</div>
<input type="hidden" name="start_time" value="">
<input type="hidden" name="end_time" value="">
</div>
</div>
</script>
<script src="SHOP_JS/echarts.min.js"></script>
<script>
var store_id = "",form;
initFn();
function initFn(){
// 选择门店
layui.use('form', function () {
form = layui.form;
form.render();
form.on('select(store_id)', function(data){
store_id = data.value;
let type = $('.time-screen.statistics .item.selected').attr("date-type");
cutTimeTemp(type);
});
});
// 切换时间
$('.time-screen.statistics .item').click(function () {
var type = $(this).attr('date-type');
if (type != 'custom') $(this).addClass('selected').siblings().removeClass('selected');
cutTimeTemp(type);
});
getShopStatData({}, 'hour');
getShopStatistics({});
// 切换数据模块
$('.statistics-wrap .data-item').click(function () {
if ($(this).hasClass('selected')) return;
$('.statistics-wrap .data-item').removeClass('selected');
$(this).addClass('selected');
fetchEchart();
})
}
/**
* 选择模块
* */
function cutTimeTemp(type){
var self = this;
switch (type) {
case 'today':
var time = {
start_time: (new Date('{$today} 00:00:00')).getTime() / 1000,
end_time: (new Date('{$today} 23:59:59')).getTime() / 1000,
store_id
}
getShopStatistics(time);
getShopStatData(time, 'hour');
break;
case 'yesterday':
var time = {
start_time: (new Date('{$yesterday} 00:00:00')).getTime() / 1000,
end_time: (new Date('{$yesterday} 23:59:59')).getTime() / 1000,
store_id
}
getShopStatistics(time);
getShopStatData(time, 'hour');
break;
case 'seven':
var dateObj = new Date(Date.now() - 604800000);
var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();
var date1 = new Date(Date.now()).getFullYear() + '-' + (new Date(Date.now()).getMonth() + 1) + '-' + new Date(Date.now()).getDate();
var data1 = {start_time: new Date(date).getTime() / 1000, end_time:new Date(date1).getTime() / 1000};
getShopStatistics(data1);
getShopStatData(data1, 'day');
break;
case 'thirty':
var dateObj = new Date(Date.now() - 2592000000);
var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();
var date1 = new Date(Date.now()).getFullYear() + '-' + (new Date(Date.now()).getMonth() + 1) + '-' + new Date(Date.now()).getDate();
let data = {start_time: new Date(date).getTime() / 1000, end_time:new Date(date1).getTime() / 1000,store_id};
getShopStatistics(data);
getShopStatData(data, 'day');
break;
case 'custom':
var _layer = layer.open({
title: '自定义时间选择',
type: 1,
area: ['480px', '160px'], //自定义文本域宽高
btn: ['确认', '取消'],
content: $('#custom-box').html(),
success: function (layero, index) {
new LayDate({
elem: '#date',
type: 'datetime',
rangeId:['start_time','end_time'],
max: '{:date("Y-m-d")}',
value:[],
done: function(value, date, endDate){
var time_arr = value.split(' - ');
var start_time = time_arr[0];
var end_time = time_arr[1];
$('input[name="start_time"]').val(time_arr[0]);
$('input[name="end_time"]').val(time_arr[1]);
}
});
},
yes: function () {
var start_time = $('input[name="start_time"]').val();
var end_time = $('input[name="end_time"]').val();
if (start_time == ''){
layer.msg('请选择时间');
return;
}
var time = {
start_time: (new Date(start_time)).getTime() / 1000,
end_time: (new Date(end_time)).getTime() / 1000
};
getShopStatistics(time);
getShopStatData(time, 'day');
$(self).addClass('selected').siblings().removeClass('selected');
layer.close(_layer);
}
})
break;
}
}
/**
* 获取统计数据
* */
function getShopStatistics(data) {
$('.statistics-wrap .loading').show();
$.ajax({
dataType: "JSON",
type: "POST",
data: data,
url: ns.url("store://shop/stat/statTotal"),
success: function(res){
$('.statistics-wrap .loading').hide();
if (res.code == 0) {
Object.keys(res.data).forEach(function (key) {
var type = $('[data-value="'+ key +'"] .value').attr('data-type');
var value = (type == 'money' ? moneyFormat(res.data[key]) : parseInt(res.data[key])) || 0;
$('[data-value="'+ key +'"] .value').text(value);
})
}
}
})
}
/**
* 获取趋势数据
* */
var statData = [];
function getShopStatData(data, type) {
$.ajax({
dataType: 'JSON',
type: 'POST',
url: type == 'hour' ? ns.url("store://shop/stat/hourStatData") : ns.url("store://shop/stat/dayStatData"),
data: data,
success: function(res) {
statData = res.data;
fetchEchart();
}
});
}
/**
* 渲染echart图表
*/
// 图表
if($('#main').length) {
var baseColor = getComputedStyle(document.documentElement).getPropertyValue('--base-color');
var myChart = echarts.init(document.getElementById('main'));
var option = {
tooltip: {
trigger: 'axis'
},
legend: {
data: ['新增商品数'],
textStyle: {
fontSize: 14,
color: "#000"
}
},
grid: {
left: '4%',
right: '4%'
},
xAxis: {
type: 'category',
boundaryGap: false,
data: []
},
yAxis: {
type: 'value',
axisLabel: {
formatter: '{value} '
},
splitLine: {
show: false
},
},
color: [baseColor],
series: [
{
name: '新增商品数',
type: 'line',
smooth: true,
data: [],
}
]
};
}
// 图表函数
function fetchEchart() {
var key = $('.statistics-wrap .data-item.selected').attr('data-value');
option.xAxis.data = statData.time;
option.legend.data[0] = $('.statistics-wrap .data-item.selected .title-text').text();
option.series[0].name = $('.statistics-wrap .data-item.selected .title-text').text();
option.series[0].data = statData[key];
myChart.setOption(option);
}
</script>

View File

@@ -0,0 +1,680 @@
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.empty-address-text{font-size: 14px;color: #f43530;height: 34px;line-height: 34px;}
.empty-address-text a{cursor: pointer;}
.upload_img_square {border-radius: 0}
.upload-img-block .upload-img-box .preview_img{width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;}
.upload-img-block .upload-img-box .preview_img img{max-width: 100%; max-height: 100%;}
</style>
<div class="layui-form form-wrap" lay-filter="editselffetch">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>{$title}名称:</label>
<div class="layui-input-block">
<input type="text" name="store_name" autocomplete="off" lay-verify="store_name" class="layui-input len-long">
</div>
<div class="word-aux">{$title}的名称(招牌)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>{$title}类型:</label>
<div class="layui-input-inline len-mid">
<select name="store_type" lay-verify="required">
<option value="">请选择门店类型</option>
{foreach $store_type as $k => $v}
<option value="{$v.type}">{$v.name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}Logo</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box logo-image-box hover"></div>
</div>
</div>
<div class="word-aux">
<p>{$title}Logo在PC及移动端对应页面及列表作为{$title}标志出现。</p>
<p>建议图片尺寸100 * 100像素图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}图片:</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}简介:</label>
<div class="layui-input-block">
<script id="editor" type="text/plain" class="special-length" style="height:300px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}电话:</label>
<div class="layui-input-block">
<input type="text" name="telphone" autocomplete="off" lay-verify="tel" class="layui-input len-long">
</div>
</div>
{if $category_status == 1}
<div class="layui-form-item store-category">
<label class="layui-form-label"><span class="required">*</span>门店分类:</label>
<div class="layui-input-inline len-mid">
<select name="category_id" lay-verify="required">
{foreach $category_list as $k => $v}
<option value="{$v.category_id}" >{$v.category_name}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required">*</span>门店标签:</label>
<div class="layui-input-inline len-long">
{foreach $label_list as $k => $v}
<input type="checkbox" name="label_id" value="{$v.label_id}" title="{$v.label_name}" lay-skin="primary" />
{/foreach}
</div>
</div>
<!--自提点地址-->
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>{$title}地址:</label>
<div class="layui-input-inline len-mid area-select">
<select name="province_id" lay-filter="province_id" lay-verify="province_id">
<option value="">请选择省份</option>
{foreach $province_list as $k => $v}
<option value="{$v.id}">{$v.name}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline len-mid area-select">
<select name="city_id" lay-filter="city_id" lay-verify="city_id">
<option value="">请选择城市</option>
</select>
</div>
<div class="layui-input-inline len-mid area-select">
<select name="district_id" lay-filter="district_id" lay-verify="district_id">
<option value="">请选择区/县</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="address" placeholder="请填写{$title}的具体地址" lay-verify="required" autocomplete="off" class="layui-input len-long address-content" value="">
<input type = "hidden" name="longitude" lay-verify="required" class="layui-input"/>
<input type = "hidden" name="latitude" lay-verify="required" class="layui-input"/>
<button class='layui-btn-primary layui-btn' onclick="refreshFrom();">查找地址</button>
</div>
<div class="word-aux">点击查找地址可在地图上显示输入的地理位置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">地图定位:</label>
{if $tencent_map_key}
{if $check_map_key.status == 0}
<div class="layui-input-block special-length">
<div id="container" class="selffetch-map"></div>
</div>
{else/}
<div class="empty-local-map">
<div class="word-aux empty-address-text">{$check_map_key.message}。<a href="{:href_url('shop/config/map')}" class="text-color">重新配置</a></div>
</div>
{/if}
{else/}
<div class="empty-local-map">
<div class="word-aux empty-address-text">腾讯地图尚未配置,无法定位地址。<a href="{:href_url('shop/config/map')}" class="text-color">点击配置</a></div>
</div>
{/if}
<div class="word-aux empty-address">请选择地理位置!在地图上点击得到的地理位置会自动填入到对应的输入框中</div>
</div>
{if $is_exit == 1}
<div class="layui-form-item layui-hide">
<label class="layui-form-label">同城配送:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_o2o" value="1" lay-skin="switch">
</div>
<div class="word-aux ">开启同城配送需要门店设置配送费用以及配送员</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">门店自提:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_pickup" value="1" lay-skin="switch" checked lay-filter="pickup">
</div>
</div>
{/if}
<div class="layui-form-item time-view layui-hide">
<div class="layui-inline">
<label class="layui-form-label">自提日期:</label>
<div class="layui-input-inline">
<input type="radio" name="time_type" value="0" title="每天" lay-filter="time_type" checked>
<input type="radio" name="time_type" value="1" title="自定义" lay-filter="time_type">
</div>
</div>
</div>
<div class="time-view layui-hide">
<div class="layui-form-item time-type-view" lay-verify="time_week">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="checkbox" value="1" class='time-week' name="time_week[]" title="周一" lay-skin="primary">
<input type="checkbox" value="2" class='time-week' name="time_week[]" title="周二" lay-skin="primary">
<input type="checkbox" value="3" class='time-week' name="time_week[]" title="周三" lay-skin="primary">
<input type="checkbox" value="4" class='time-week' name="time_week[]" title="周四" lay-skin="primary">
<input type="checkbox" value="5" class='time-week' name="time_week[]" title="周五" lay-skin="primary">
<input type="checkbox" value="6" class='time-week' name="time_week[]" title="周六" lay-skin="primary">
<input type="checkbox" value="0" class='time-week' name="time_week[]" title="周日" lay-skin="primary">
</div>
</div>
</div>
<div class="layui-form-item time-type-view-all" >
<label class="layui-form-label">自提时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime" lay-verify="start_time" placeholder="自提开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="自提开始时间" >
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime" lay-verify="end_time" placeholder="自提结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="自提结束时间" >
</div>
</div>
</div>
{if $is_exit == 1}
<div class="layui-form-item layui-hide">
<div class="layui-inline">
<label class="layui-form-label">库存设置:</label>
<div class="layui-input-inline">
<input type="radio" name="stock_type" value="all" title="总部统一库存" checked>
<input type="radio" name="stock_type" value="store" title="{$title}独立库存" >
</div>
</div>
<div class="word-aux">总部统一库存:门店不用入库,商品查询以及销售由总部进行出入库<br>门店独立库存:门店自提以及收银扣除门店库存,门店需要入库</div>
</div>
{/if}
{if $is_exit == 1}
<div class="layui-form-item">
<label class="layui-form-label">{$title}管理员:</label>
<div class="layui-input-block">
<div class="len-mid">
<select name="uid">
<option value="">请选择员工</option>
{foreach $user_list as $k => $v}
<option value="{$v.uid}">{$v.username}</option>
{/foreach}
</select>
</div>
</div>
<div class="word-aux">请选择员工作为门店管理员</div>
</div>
{/if}
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backStockList()">返回</button>
<a id="storeImage"></a>
</div>
</div>
<script type="text/html" id="storeLogoImageTpl">
{{# if(d.list){ }}
<div class="preview_img">
<img layer-src src="{{ns.img(d.list)}}" class="img_prev"/>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" ></i>
</div>
<div class="replace_img js-replace js-add-logo-image">点击替换</div>
</div>
<input type="hidden" name="store_image" value="{{d.list}}">
{{# }else{ }}
<div class="upload-default">
<div class="upload js-add-logo-image" >
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
{{# } }}
</script>
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i])}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script type="text/javascript" src="SHOP_JS/address.js"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key={$tencent_map_key}"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key={$tencent_map_key}"></script>
<script src="https://mapapi.qq.com/jsapi_v2/2/4/148/main.js"></script>
<script type="text/javascript" src="STATIC_JS/qq_map.js?time=20240601"></script>
<script>
var form, repeat_flag, map_class, laytpl;
var saveData = null;
var completeUploadNum = 0;
var storeImage = [];
var STORE_IMAGE_MAX = 5;
var ue = UE.getEditor('editor');
layui.use(['form','laydate', 'laytpl'], function() {
var laydate = layui.laydate;
form = layui.form;
repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
if($("#container").length) {
setTimeout(function () {
map_class = new mapClass("container", {lat: '', lng: ''});
map_class.mpKey = '{$tencent_map_key}';
},200);
}
form.render();
//时间选择器
laydate.render({
elem: '#startTime'
, type: 'time'
,value: ""
,done: function(value, date, endDate) {
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$("input[name=start_time]").val(time);
}
});
//时间选择器
laydate.render({
elem: '#endTime'
, type: 'time'
,value: ""
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$("input[name=end_time]").val(time);
}
});
form.verify({
start_time: function(value, item){
var end_time = $("input[name=end_time]").val();
var start_time = $("input[name=start_time]").val();
if(parseInt(start_time) > parseInt(end_time)){
return '营业开始时间不能大于自提结束时间';
}
},
end_time: function(value, item){
var end_time = $("input[name=end_time]").val();
var start_time = $("input[name=start_time]").val();
if(parseInt(end_time) < parseInt(start_time)){
return '营业结束时间不能小于自提开始时间';
}
},
});
$('.time-type-view').hide();
form.on('radio(time_type)', function(data){
timeTypeChange(data.value);
});
form.on('switch(pickup)', function(data){
if(data.elem.checked){
$('.time-view').removeClass('layui-hide')
}else{
$('.time-view').addClass('layui-hide')
}
});
/**
* 验证码
*/
form.verify({
required : function(value, item){
var msg = $(item).attr("placeholder") != undefined ? $(item).attr("placeholder") : '';
if(value == '') return msg;
},
province_id : function(value, item){
if(value == ''){
return '请选择省份';
}
},
city_id : function(value, item){
if(value == ''){
return '请选择城市';
}
},
// district_id : function(value, item){
// if(value == ''){
// return '请选择区/县';
// }
// },
tel : function(value, item) {
if (value != '') {
if (!ns.parse_telephone(value) && !ns.parse_mobile(value)) {
return '请输入正确的电话号码或手机号!';
}
}
},
store_name : function (value,item) {
if(value == ""){
return '请输入{$title}名称';
}
},
time_week: function(){
var supportTradeType = [];
$('[name="support_trade_type"]:checked').each(function () {
supportTradeType.push($(this).val())
})
if (supportTradeType.indexOf('store') != -1 && $('[name="time_type"]:checked').val() == 1 && !$('.time-week:checked').length)
return '请选择可配送日期';
}
});
function saveFunc(){
var data = saveData;
var full_address = [];
full_address.push($("select[name=province_id] option:selected").text());
full_address.push($("select[name=city_id] option:selected").text());
full_address.push($("select[name=district_id] option:selected").text());
data.field.full_address = full_address.toString();
var supportTradeType = [];
$('[name="support_trade_type"]:checked').each(function () {
supportTradeType.push($(this).val())
})
{if $is_exit}
data.field.support_trade_type = supportTradeType.toString();
{else /}
data.field.support_trade_type = 'store';
{/if}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("store://shop/store/addStore"),
async : true,
data : data.field,
success : function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title: '操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero) {
location.hash = ns.hash("store://shop/store/lists");
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
}
/**
* 监听提交
*/
form.on('submit(save)', function(data){
var labelLen = $("input[name='label_id']:checked").length;
var labelId = [];
var labelName = [];
if(!labelLen){
layer.msg("请至少选择一个门店标签");
return false;
}
for(var i = 0; i < labelLen; i++){
labelId.push($("input[name='label_id']:checked").eq(i).val());
labelName.push($("input[name='label_id']:checked").eq(i).attr('title'));
}
data.field.label_id = labelLen ? (',' + labelId.toString() + ',') : '';
data.field.label_name = labelLen ? (',' + labelName.toString() + ',') : '';
data.field.category_name = $("select[name='category_id'] option:selected").text();
data.field.store_images = storeImage.toString();
data.field.store_introduce = ue.getContent();
saveData = data;
if( data.field.longitude == "" || data.field.latitude == ""){
layer.msg('请确认地理位置!');
$(".empty-address").show();
return;
}else{
$(".empty-address").hide();
}
saveFunc();
});
// 添加logo图片
let storeLogoImage = '';
$("body").off("click", ".js-add-logo-image").on("click", ".js-add-logo-image", function () {
openAlbum(function (data) {
storeLogoImage = data[0].pic_path;
refreshLogoStoreImage();
}, 1, 1);
});
//渲染logo图片
function refreshLogoStoreImage() {
var store_image_template = $("#storeLogoImageTpl").html();
var data = {
list: storeLogoImage
};
laytpl(store_image_template).render(data, function (html) {
$(".logo-image-box").html(html);
//加载图片放大
loadImgMagnify();
if (storeLogoImage.length) {
//预览
$(".logo-image-box .js-preview").click(function () {
$(this).parent().parent().prev().find("img").click();
});
//图片删除
$(".logo-image-box .js-delete").click(function () {
storeLogoImage = '';
refreshLogoStoreImage();
});
}
});
}
refreshLogoStoreImage();
// 添加门店图片
$("body").off("click", ".js-add-image").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
//渲染门店图片
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
});
function backStockList() {
location.hash = ns.hash("store://shop/store/lists");
}
/**
* 重新渲染表单
*/
function refreshFrom(){
form.render();
orderAddressChange();//改变地址
map_class.mapChange();
}
//动态改变订单地址赋值
function orderAddressChange(){
map_class.address.province = $("select[name=province_id]").val();
map_class.address.province_name = $("select[name=province_id] option:selected").text();
map_class.address.city = $("select[name=city_id]").val();
map_class.address.city_name = $("select[name=city_id] option:selected").text();
map_class.address.district = $("select[name=district_id]").val();
map_class.address.district_name = $("select[name=district_id] option:selected").text();
map_class.address.detail_address = $("input[name=address]").val()
}
/**
* 地址下拉框(主要用于坐标记录)
*/
function selectCallBack(){
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
}
//地图点击回调事件
function mapChangeCallBack(){
$("input[name=address]").val(map_class.address.address);//详细地址
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/address/getGeographicId"),
async : true,
data : {
"address" : map_class.address.area
},
success : function(data) {
map_class.address.province = data.province_id;
map_class.address.city = data.city_id;
map_class.address.district = data.district_id;
map_class.address.township = data.subdistrict_id;
map_class.map_change = false;
form.val("editselffetch", {
"province_id": data.province_id
});
$("select[name=province_id]").change();
form.val("editselffetch", {
"city_id": data.city_id
});
$("select[name=city_id]").change();
form.val("editselffetch", {
"district_id": data.district_id
});
refreshFrom();//重新渲染form
map_class.map_change = true;
}
});
}
function timeTypeChange(type){
if(type == 1){
$('.time-type-view').show();
}else{
$('.time-type-view').hide();
}
}
</script>

View File

@@ -0,0 +1,103 @@
<style>
.form-row{margin-top: 0;margin-left: 220px;}
.express-sheet-rule .form-row{margin-left: 200px;}
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">配送员信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送员名称:</label>
<div class="layui-input-inline">
<input type="text" name="deliver_name" lay-verify="required|deliverName" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送员手机号:</label>
<div class="layui-input-block">
<input type="text" name="deliver_mobile" lay-verify="required|deliverMobile" class="layui-input len-long">
</div>
</div>
</div>
</div>
<input type="hidden" value="{$store_id ?? 0}" name="store_id">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script>
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/local/addDeliver"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title: '操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function (index, layero) {
if ($('input[name="store_id"]').val() > 0) {
location.hash = ns.hash("store://shop/store/deliverLists", {'store_id': $('input[name="store_id"]').val()});
} else {
location.hash = ns.hash("shop/local/deliverLists");
}
layer.close(index);
},
btn2: function (index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
deliverName: function(value){
if (value == '') {
return '配送员名称不能为空!';
}
},
deliverMobile: function (value) {
if (value == '') {
return '手机号不能为空!';
}
if (!ns.parse_mobile(value)) {
return '请输入合法的手机号!'
}
}
});
});
function back(){
if($('input[name="store_id"]').val() > 0){
location.hash = ns.hash("store://shop/store/deliverLists",{'store_id':$('input[name="store_id"]').val()});
}else{
location.hash = ns.hash("shop/local/deliverLists");
}
}
</script>

View File

@@ -0,0 +1,180 @@
<style>
.layui-form-radio{margin-top: 0;}
.layui-form-label{width: 160px;}
.layui-form-label + .layui-input-block{margin-left: 160px;}
.word-aux{margin-left: 160px;}
.card-common{margin-top: 0;}
/* 分类数据 */
.category-table{width: 665px;}
.category-table .category-head, .category-table .category-tr{display: flex;width: 100%;height: 50px;padding: 8px 0;box-sizing: border-box;background-color: #f9f9fc;}
.category-table .category-body{overflow: auto;max-height: 470px;}
.category-table .category-head span:first-of-type, .category-table .category-tr .tr-input{flex: 1;}
.category-table .category-head span:last-of-type{width: 150px;text-align: center;}
.category-table .category-head span{padding: 0 15px;box-sizing: border-box;}
.category-table .category-tr{background-color: transparent;border-bottom: 1px solid #e4e4e4;padding: 15px 0;height: auto;}
.category-table .category-tr .tr-input{background-color: transparent;padding-left: 15px;}
.category-table .category-tr .tr-input input{border: 1px solid #e4e4e4;height: 36px;line-height: 36px;border-radius: 3px;width: 350px;padding: 0 15px;box-sizing: border-box;}
.category-table .category-tr .tr-active{display: flex;}
.category-table .category-tr .tr-delete, .category-table .category-tr .tr-save{cursor: pointer; padding: 0 15px;}
.add-category{cursor: pointer;}
.category-empty{padding: 15px 0;text-align: center;border-bottom: 1px solid #e4e4e4;}
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">分类设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item is-withdraw">
<label class="layui-form-label">门店分类:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="status" value="1" lay-filter="status_filter" lay-skin="switch" {if $status == 1} checked{/if}>
</div>
</div>
<div class="word-aux">启用门店分类后,用户选择门店时,将显示门店分类并可以切换筛选。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类数据:</label>
<div class="layui-input-block">
<div class="category-table">
<div class="category-head">
<span>分类名称</span>
<span>操作</span>
</div>
<div class="category-body"></div>
</div>
<div class="add-category text-color" onclick="addCategory()">+添加分类名称</div>
</div>
</div>
</div>
</div>
</div>
<script>
var form;
layui.use(['form'], function() {
form = layui.form;
form.render();
getCategory();
form.on('switch(status_filter)', function(data){
let val = data.elem.checked ? 1 : 0;
categoryConfig(val);
});
});
function getCategory(){
$.ajax({
url: ns.url("store://shop/store/category"),
dataType: 'JSON',
type: 'POST',
success: function(res) {
if (res.code == 0) {
let list = res.data.list;
let html = "";
if(list.length) {
list.forEach((item, index) => {
html += `
<div class="category-tr">
<div class="tr-input">
<input type="text" attr_category_id="${item.category_id}" value="${item.category_name}" />
</div>
<div class="tr-active">
<span class="tr-save text-color" onclick="editCategory(this)">保存</span>
<span class="tr-delete text-color" onclick="deleteCategory(this)">删除</span>
</div>
</div>
`;
});
}else{
html = '<div class="category-empty">暂无分类,请添加分类</div>';
}
$(".category-table .category-body").html(html);
}
}
});
}
function addCategory(){
var html = `
<div class="category-tr">
<div class="tr-input">
<input type="text" />
</div>
<div class="tr-active">
<span class="tr-save text-color" onclick="editCategory(this)">保存</span>
<span class="tr-delete text-color" onclick="deleteCategory(this)">删除</span>
</div>
</div>
`;
$(".category-table .category-body").append(html);
let len = $(".category-table .category-body .category-tr").length;
if(len) $(".category-table .category-empty").remove();
$.ajax({
url: ns.url("store://shop/store/addCategory"),
data:{category_name: ''},
dataType: 'JSON',
type: 'POST',
success: function(res) {
if (res.code == 0) {
let data = res.data;
$(".category-table .category-body .tr-input input").last().attr("attr_category_id",data);
}
}
});
}
function editCategory(event){
let categoryId = $(event).parents(".category-tr").find("input").attr("attr_category_id");
let categoryName = $(event).parents(".category-tr").find("input").val();
$.ajax({
url: ns.url("store://shop/store/editCategory"),
data:{category_id: categoryId, category_name: categoryName},
dataType: 'JSON',
type: 'POST',
success: function(res) {
if (res.code == 0) {
layer.msg(res.message);
}
}
});
}
function deleteCategory(event){
let categoryId = $(event).parents(".category-tr").find("input").attr("attr_category_id");
$.ajax({
url: ns.url("store://shop/store/deleteCategory"),
data:{category_id: categoryId},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
$(event).parents('.category-tr').remove();
let len = $(".category-table .category-body .category-tr").length;
if(!len){
let html = `<div class="category-empty">暂无分类,请添加分类</div>`;
$(".category-table .category-body").append(html);
}
}
}
});
}
function categoryConfig(data){
$.ajax({
url: ns.url("store://shop/store/categoryConfig"),
data:{status: data},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
}
});
}
</script>

View File

@@ -0,0 +1,158 @@
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加配送员</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入配送员名称" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="deliverLists" lay-filter="deliverLists"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var form, table;
layui.use(['form'], function() {
form = layui.form;
var repeat_flag = false; //防重复标识
table = new Table({
elem: '#deliverLists',
url: ns.url("store://shop/store/deliverlists"),
where:{'store_id':"{$store_id}"},
cols: [
[{
title: '配送员名称',
unresize: 'false',
field: 'deliver_name',
width: '40%'
}, {
field:'deliver_mobile',
title: '配送员电话',
unresize: 'false',
width: '40%'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("store://shop/store/editDeliver?store_id={$store_id}&deliver_id=" + data.deliver_id);
break;
case 'delete': //删除
deleteDeliver(data.deliver_id);
break;
}
});
/**
* 删除
*/
function deleteDeliver(deliver_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该配送员吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/local/deleteDeliver"),
data: {deliver_ids},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload(
{
page: {
curr: 1
}
}
);
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 批量操作
*/
table.bottomToolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].company_id);
deleteCompany(id_array.toString());
break;
}
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].company_id);
deleteCompany(id_array.toString());
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function add() {
location.hash = ns.hash("store://shop/store/addDeliver?store_id={$store_id}");
}
</script>

View File

@@ -0,0 +1,679 @@
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.empty-address-text{font-size: 14px;color: #f43530;height: 34px;line-height: 34px;}
.tag-wrap{overflow: auto;height: 140px;}
.upload-img-block .upload-img-box .preview_img{width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;}
.upload-img-block .upload-img-box .preview_img img{max-width: 100%; max-height: 100%;}
</style>
<div class="layui-form form-wrap" lay-filter="storeform" >
<input type="hidden" name="store_id" value="{$store_id}"/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>{$title}名称:</label>
<div class="layui-input-block">
<input type="text" name="store_name" autocomplete="off" lay-verify="store_name" class="layui-input len-mid" value="{$info.store_name}">
</div>
<div class="word-aux">{$title}的名称(招牌)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>{$title}类型:</label>
<div class="layui-input-inline len-mid">
<select name="store_type" lay-verify="required">
<option value="">请选择门店类型</option>
{foreach $store_type as $k => $v}
<option value="{$v.type}" {if $info.store_type eq $v.type}selected{/if}>{$v.name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}Logo</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box logo-image-box {if !empty($info.store_image)}hover{/if}" >
<input type="hidden" name="store_image" value="{$info.store_image}">
</div>
</div>
</div>
<div class="word-aux">
<p>{$title}Logo在PC及移动端对应页面及列表作为{$title}标志出现。</p>
<p>建议图片尺寸100 * 100像素图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}图片:</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}简介:</label>
<div class="layui-input-block">
<script id="editor" type="text/plain" class="special-length" style="height:300px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{$title}电话:</label>
<div class="layui-input-block">
<input type="text" name="telphone" value="{$info.telphone}" lay-verify="tel" autocomplete="off" class="layui-input len-mid">
</div>
</div>
{if $category_status == 1}
<div class="layui-form-item store-category">
<label class="layui-form-label"><span class="required">*</span>门店分类:</label>
<div class="layui-input-inline len-mid">
<select name="category_id" lay-verify="required">
{foreach $category_list as $k => $v}
<option value="{$v.category_id}" {if $info.category_id eq $v.category_id}selected{/if}>{$v.category_name}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required">*</span>门店标签:</label>
<div class="layui-input-inline len-long">
{foreach $label_list as $k => $v}
<input type="checkbox" name="label_id" value="{$v.label_id}" title="{$v.label_name}" lay-skin="primary" {if strpos($info.label_id, ','.$v['label_id'].',') !== false}checked{/if}/>
{/foreach}
</div>
</div>
<!--自提点地址-->
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">* </span>{$title}地址:</label>
<div class="layui-input-inline area-select">
<select name="province_id" lay-filter="province_id" lay-verify="province_id">
{foreach $province_list as $k => $v}
<option value="{$v.id}" {if $info.province_id == $v.id}select{/if}>{$v.name}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline area-select">
<select name="city_id" lay-filter="city_id" lay-verify="city_id">
<option value="">请选择城市</option>
</select>
</div>
<div class="layui-input-inline area-select">
<select name="district_id" lay-filter="district_id" lay-verify="district_id">
<option value="">请选择区/县</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="address" placeholder="请填写{$title}的具体地址" value="{$info.address}" lay-verify="required" autocomplete="off" class="layui-input len-long address-content">
<input type = "hidden" name="longitude" lay-verify="required" class="layui-input" value="{$info.longitude}"/>
<input type = "hidden" name="latitude" lay-verify="required" class="layui-input" value="{$info.latitude}"/>
<button class='layui-btn-primary layui-btn' onclick="refreshFrom();">查找地址</button>
</div>
<div class="word-aux">点击查找地址可在地图上显示输入的地理位置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">地图定位:</label>
{if $tencent_map_key}
{if $check_map_key.status == 0}
<div class="layui-input-block">
<div id="container" class="selffetch-map"></div>
</div>
{else/}
<div class="empty-local-map">
<div class="word-aux empty-address-text">{$check_map_key.message}。<a href="{:href_url('shop/config/map')}" class="text-color">重新配置</a></div>
</div>
{/if}
{else/}
<div class="empty-local-map">
<div class="word-aux empty-address-text">腾讯地图尚未配置,无法定位地址。<a href="{:href_url('shop/config/map')}" class="text-color">点击配置</a></div>
</div>
{/if}
<span class="layui-word-aux empty-address">请选择地理位置!在地图上点击得到的地理位置会自动填入到对应的输入框中</span>
</div>
{if $is_exit == 1}
<div class="layui-form-item layui-hide">
<label class="layui-form-label">同城配送:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_o2o" value="1" lay-skin="switch" {if $info['is_o2o'] == 1} checked {/if}>
</div>
<div class="word-aux ">开启同城配送需要门店设置配送费用以及配送员</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">门店自提:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_pickup" value="1" lay-skin="switch" {if $info['is_pickup'] == 1} checked {/if} lay-filter="pickup">
</div>
</div>
{/if}
<div class="layui-form-item time-view layui-hide">
<div class="layui-inline">
<label class="layui-form-label">自提日期:</label>
<div class="layui-input-inline">
<input type="radio" name="time_type" value="0" title="每天" lay-filter="time_type" {if $info.time_type == 0 || !isset($info.time_type)}checked{/if}/>
<input type="radio" name="time_type" value="1" title="自定义" lay-filter="time_type" {if $info.time_type == 1 }checked{/if}/>
</div>
</div>
</div>
<div class="time-view layui-hide">
<div class="layui-form-item time-type-view" lay-verify="time_week">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="checkbox" value="1" class='time-week' name="time_week[]" title="周一" lay-skin="primary" {if !empty($info.time_week) && in_array(1,$info.time_week)} checked {/if}>
<input type="checkbox" value="2" class='time-week' name="time_week[]" title="周二" lay-skin="primary" {if !empty($info.time_week) && in_array(2,$info.time_week)} checked {/if}>
<input type="checkbox" value="3" class='time-week' name="time_week[]" title="周三" lay-skin="primary" {if !empty($info.time_week) && in_array(3,$info.time_week)} checked {/if}>
<input type="checkbox" value="4" class='time-week' name="time_week[]" title="周四" lay-skin="primary" {if !empty($info.time_week) && in_array(4,$info.time_week)} checked {/if}>
<input type="checkbox" value="5" class='time-week' name="time_week[]" title="周五" lay-skin="primary" {if !empty($info.time_week) && in_array(5,$info.time_week)} checked {/if}>
<input type="checkbox" value="6" class='time-week' name="time_week[]" title="周六" lay-skin="primary" {if !empty($info.time_week) && in_array(6,$info.time_week)} checked {/if}>
<input type="checkbox" value="0" class='time-week' name="time_week[]" title="周日" lay-skin="primary" {if !empty($info.time_week) && in_array(0,$info.time_week)} checked {/if}>
</div>
</div>
</div>
<div class="layui-form-item time-type-view-all" >
<label class="layui-form-label">自提时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime" lay-verify="start_time" placeholder="自提开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="自提开始时间" value="{$info.start_time}">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime" lay-verify="end_time" placeholder="自提结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="自提结束时间" value="{$info.end_time}">
</div>
</div>
</div>
{if $is_exit == 1}
<div class="layui-form-item layui-hide">
<div class="layui-inline">
<label class="layui-form-label">库存设置:</label>
<div class="layui-input-inline">
<input type="radio" name="stock_type" value="all" title="总部统一库存" {if $info['stock_type'] == 'all'} checked {/if}>
<input type="radio" name="stock_type" value="store" title="{$title}独立库存" {if $info['stock_type'] == 'store'} checked {/if}>
</div>
</div>
<div class="word-aux">总部统一库存:门店不用入库,商品查询以及销售由总部进行出入库<br>门店独立库存:门店自提以及收银扣除门店库存,门店需要入库</div>
</div>
{/if}
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backStockList()">返回</button>
<a id="storeImage"></a>
</div>
</div>
<script type="text/html" id="storeLogoImageTpl">
{{# if(d.list){ }}
<div class="preview_img">
<img layer-src src="{{ns.img(d.list)}}" class="img_prev"/>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" ></i>
</div>
<div class="replace_img js-replace js-add-logo-image">点击替换</div>
</div>
<input type="hidden" name="store_image" value="{{d.list}}">
{{# }else{ }}
<div class="upload-default">
<div class="upload js-add-logo-image" >
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
{{# } }}
</script>
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i])}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script type="text/javascript" src="SHOP_JS/address.js"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key={$tencent_map_key}"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key={$tencent_map_key}"></script>
<script src="https://mapapi.qq.com/jsapi_v2/2/4/148/main.js"></script>
<script type="text/javascript" src="STATIC_JS/qq_map.js?time=20240601"></script>
<script>
var form,laytpl, repeat_flag, map_class;
var saveData = null;
var completeUploadNum = 0;
var storeImage = [];
{notempty name="$info.store_images"}
storeImage = '{$info.store_images}'.split(',');
{/notempty}
var STORE_IMAGE_MAX = 5;
var ue = UE.getEditor('editor');
{notempty name="$info.store_introduce"}
ue.ready(function() {
ue.setContent(`{:html_entity_decode($info.store_introduce)}`);
});
{/notempty}
layui.use(['form','laydate','laytpl'], function() {
var laydate = layui.laydate;
form = layui.form;
laytpl = layui.laytpl;
repeat_flag = false;//防重复标识
form.render();
//时间选择器
laydate.render({
elem: '#startTime'
, type: 'time'
,value: "{:date('H:i:s', strtotime(date('Y-m-d')) + $info.start_time)}"
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$("input[name=start_time]").val(time);
}
});
//时间选择器
laydate.render({
elem: '#endTime'
, type: 'time'
,value: "{:date('H:i:s', strtotime(date('Y-m-d')) + $info.end_time)}"
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$("input[name=end_time]").val(time);
}
});
form.verify({
start_time: function(value, item){
var end_time = $("input[name=end_time]").val();
var start_time = $("input[name=start_time]").val();
if(parseInt(start_time) > parseInt(end_time)){
return '营业开始时间不能大于自提结束时间';
}
},
end_time: function(value, item){
var end_time = $("input[name=end_time]").val();
var start_time = $("input[name=start_time]").val();
if(parseInt(end_time) < parseInt(start_time)){
return '营业结束时间不能小于自提开始时间';
}
},
});
timeTypeChange($("input[name=time_type]:checked").val());
form.on('radio(time_type)', function(data){
timeTypeChange(data.value);
});
form.on('switch(pickup)', function(data){
if(data.elem.checked){
$('.time-view').removeClass('layui-hide')
}else{
$('.time-view').addClass('layui-hide')
}
});
var initdata = {province_id : '{$info.province_id}', city_id : '{$info.city_id}', district_id : '{$info.district_id}'};
initAddress(initdata, "storeform");
if('{$info.latitude}' == "" || '{$info.longitude}' == ""){
var latlng = {lat:'',lng:''};
}else{
var latlng = {lat:'{$info.latitude}',lng:'{$info.longitude}'};
}
if($("#container").length) {
//地图展示
setTimeout(function () {
map_class = new mapClass("container", latlng);
},200);
}
/**
* 验证码
*/
form.verify({
required : function(value, item){
var msg = $(item).attr("placeholder") != undefined ? $(item).attr("placeholder") : '';
if(value == '') return msg;
},
province_id : function(value, item){
if(value == ''){
return '请选择省份';
}
},
city_id : function(value, item){
if(value == ''){
return '请选择城市';
}
},
// district_id : function(value, item){
// if(value == ''){
// return '请选择区/县';
// }
// },
tel : function(value, item) {
if (value != '') {
if (!ns.parse_telephone(value) && !ns.parse_mobile(value)) {
return '请输入正确的电话号码或手机号!';
}
}
},
store_name : function (value,item) {
if(value == ""){
return '请输入{$title}名称';
}
},
time_week: function(){
var supportTradeType = [];
$('[name="support_trade_type"]:checked').each(function () {
supportTradeType.push($(this).val())
})
if (supportTradeType.indexOf('store') != -1 && $('[name="time_type"]:checked').val() == 1 && !$('.time-week:checked').length)
return '请选择可配送日期';
}
});
function saveFunc(){
var data = saveData;
var full_address = [];
full_address.push($("select[name=province_id] option:selected").text());
full_address.push($("select[name=city_id] option:selected").text());
full_address.push($("select[name=district_id] option:selected").text());
data.field.full_address = full_address.toString();
var supportTradeType = [];
$('[name="support_trade_type"]:checked').each(function () {
supportTradeType.push($(this).val())
})
{if $is_exit}
data.field.support_trade_type = supportTradeType.toString();
{else /}
data.field.support_trade_type = 'store';
{/if}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("store://shop/store/editStore"),
async : true,
data : data.field,
success : function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("store://shop/store/lists");
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
}
/**
* 监听提交
*/
form.on('submit(save)', function(data){
var labelLen = $("input[name='label_id']:checked").length;
var labelId = [];
var labelName = [];
if(!labelLen){
layer.msg("请至少选择一个门店标签");
return false;
}
for(var i = 0; i < labelLen; i++){
labelId.push($("input[name='label_id']:checked").eq(i).val());
labelName.push($("input[name='label_id']:checked").eq(i).attr('title'));
}
data.field.label_id = labelLen ? (',' + labelId.toString() + ',') : '';
data.field.label_name = labelLen ? (',' + labelName.toString() + ',') : '';
data.field.category_name = $("select[name='category_id'] option:selected").text();
data.field.store_images = storeImage.toString();
data.field.store_introduce = ue.getContent();
saveData = data;
if( data.field.longitude == "" || data.field.latitude == ""){
layer.msg('请确认地理位置!');
$(".empty-address").show();
return;
}else{
$(".empty-address").hide();
}
saveFunc();
});
// 添加logo图片
let storeLogoImage = '{$info.store_image}';
$("body").off("click", ".js-add-logo-image").on("click", ".js-add-logo-image", function () {
openAlbum(function (data) {
storeLogoImage = data[0].pic_path;
refreshLogoStoreImage();
}, 1, 1);
});
//渲染logo图片
function refreshLogoStoreImage() {
var store_image_template = $("#storeLogoImageTpl").html();
var data = {
list: storeLogoImage
};
laytpl(store_image_template).render(data, function (html) {
$(".logo-image-box").html(html);
//加载图片放大
loadImgMagnify();
if (storeLogoImage.length) {
//预览
$(".logo-image-box .js-preview").click(function () {
$(this).parent().parent().prev().find("img").click();
});
//图片删除
$(".logo-image-box .js-delete").click(function () {
storeLogoImage = '';
refreshLogoStoreImage();
});
}
});
}
refreshLogoStoreImage();
// 添加门店图片
$("body").off("click", ".js-add-image").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
//渲染门店图片
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
});
function backStockList() {
location.hash = ns.hash("store://shop/store/lists");
}
/**
* 重新渲染表单
*/
function refreshFrom(){
form.render();
orderAddressChange();//改变地址
map_class.mapChange();
}
//动态改变订单地址赋值
function orderAddressChange(){
map_class.address.province = $("select[name=province_id]").val();
map_class.address.province_name = $("select[name=province_id] option:selected").text();
map_class.address.city = $("select[name=city_id]").val();
map_class.address.city_name = $("select[name=city_id] option:selected").text();
map_class.address.district = $("select[name=district_id]").val();
map_class.address.district_name = $("select[name=district_id] option:selected").text();
map_class.address.detail_address = $("input[name='address']").val();
}
/**
* 地址下拉框(主要用于坐标记录)
*/
function selectCallBack(){
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
}
//地图点击回调事件
function mapChangeCallBack(){
$("input[name=address]").val(map_class.address.address);//详细地址
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/address/getGeographicId"),
async : true,
data : {
"address" : map_class.address.area
},
success : function(data) {
map_class.address.province = data.province_id;
map_class.address.city = data.city_id;
map_class.address.district = data.district_id;
map_class.address.township = data.subdistrict_id;
map_class.map_change = false;
form.val("storeform", {
"province_id": data.province_id
});
$("select[name=province_id]").change();
form.val("storeform", {
"city_id": data.city_id
});
$("select[name=city_id]").change();
form.val("storeform", {
"district_id": data.district_id
});
refreshFrom();//重新渲染form
map_class.map_change = true;
}
})
}
function timeTypeChange(type){
if(type == 1){
$('.time-type-view').show();
}else{
$('.time-type-view').hide();
}
}
</script>

View File

@@ -0,0 +1,94 @@
<style>
.form-row{margin-top: 0;margin-left: 220px;}
.express-sheet-rule .form-row{margin-left: 200px;}
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">配送员信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送员名称:</label>
<div class="layui-input-inline">
<input type="text" name="deliver_name" lay-verify="required|deliverName" value="{$deliver_info.deliver_name}" class="layui-input len-long">
<input type="hidden" name="deliver_id" lay-verify="required|deliverName" value="{$deliver_id}" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送员手机号:</label>
<div class="layui-input-block">
<input type="text" name="deliver_mobile" lay-verify="required|deliverMobile" value="{$deliver_info.deliver_mobile}" class="layui-input len-long">
</div>
</div>
</div>
</div>
<input type="hidden" value="{$store_id ?? 0}" name="store_id">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script>
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/local/editDeliver"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.msg(res.message);
if($('input[name="store_id"]').val() > 0){
location.hash = ns.hash("store://shop/store/deliverLists",{'store_id':$('input[name="store_id"]').val()});
}else{
location.hash = ns.hash("shop/local/deliverLists");
}
} else {
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
deliverName: function(value){
if (value == '') {
return '配送员名称不能为空!';
}
},
deliverMobile: function (value) {
if (value == '') {
return '手机号不能为空!';
}
if (!ns.parse_mobile(value)) {
return '请输入合法的手机号!'
}
}
});
});
function back(){
if($('input[name="store_id"]').val() > 0){
location.hash = ns.hash("store://shop/store/deliverLists",{'store_id':$('input[name="store_id"]').val()});
}else{
location.hash = ns.hash("shop/local/deliverLists");
}
}
</script>

View File

@@ -0,0 +1,206 @@
<link rel="stylesheet" href="SHOP_CSS/index.css">
<style>
.echart-wrap .head { display: flex; }
.echart-wrap .head .title {flex: 1}
.echart-wrap .head .sort-type {display: flex;border: 1px solid #eee;border-radius: 5px;overflow:hidden}
.echart-wrap .sort-type .type-item {width: 80px;text-align: center;background: #F5F5F5;line-height: 28px;cursor: pointer;transition: all .3s;font-size: 12px}
.echart-wrap .sort-type .type-item:hover {background: #eee}
.echart-wrap .sort-type .type-item.active {background: var(--base-color);color: #fff}
.align-right {text-align: right!important;}
.ranking-empty {text-align: center;padding: 100px 0;}
.echart-wrap .common-wrap { min-width: calc((100% - 45px) / 2); max-width: calc((100% - 45px) / 2); box-sizing: border-box; }
.echart-wrap .common-wrap .body {width: 100%}
.ranking-wrap tr th {white-space: nowrap}
.ranking-wrap .goods-name {height: 20px;overflow: hidden;text-overflow: ellipsis}
</style>
<div class="common-wrap">
<div class="head">
<div class="title">实时概况</div>
<div class="sub-title">更新时间:{:date('Y-m-d H:i:s')}</div>
</div>
<div class="body summary-wrap">
<div class="summary-item">
<div class="title">营业中门店数量</div>
<div class="value" id="in_business_num">0</div>
</div>
<div class="summary-item">
<div class="title">门店总数</div>
<div class="value" id="store_num">0</div>
</div>
<div class="summary-item">
<div class="title">累计门店订单量</div>
<div class="value" id="total_order_num">0</div>
</div>
<div class="summary-item">
<div class="title">累计门店交易额</div>
<div class="value" id="total_order_money" value-type="money">0.00</div>
</div>
</div>
<div class="body summary-wrap">
<div class="summary-item">
<div class="title">待审核结算单</div>
<div class="value" id="wait_audit_num">0</div>
</div>
<div class="summary-item">
<div class="title">待审核结算金额(元)</div>
<div class="value" id="wait_audit_money" value-type="money">0.00</div>
</div>
<div class="summary-item">
<div class="title">待打款结算单</div>
<div class="value" id="wait_transfer_num">0</div>
</div>
<div class="summary-item">
<div class="title">待打款结算金额(元)</div>
<div class="value" id="wait_transfer_money" value-type="money">0.00</div>
</div>
</div>
</div>
<div class="echart-wrap ranking-wrap">
<div class="common-wrap store-ranking">
<div class="head">
<div class="title">门店排行</div>
<div class="sort-type">
<div class="type-item active" sort-type="num">交易量</div>
<div class="type-item" sort-type="money">交易额</div>
</div>
</div>
<div class="market-item-content store body">
<div class="ranking-empty">暂无排名</div>
</div>
</div>
<div class="common-wrap goods-ranking">
<div class="head">
<div class="title">商品排行</div>
<div class="sort-type">
<div class="type-item active" sort-type="num">交易量</div>
<div class="type-item" sort-type="money">交易额</div>
</div>
</div>
<div class="market-item-content goods body">
<div class="ranking-empty">暂无排名</div>
</div>
</div>
</div>
<script src="SHOP_JS/echarts.min.js"></script>
<script>
//综合统计
function getSumCount() {
$.ajax({
type:'post',
dataType:'json',
url:ns.url('store://shop/store/index'),
success:function(res){
if (res.code == 0) {
Object.keys(res.data).forEach(function(key){
let value = res.data[key];
if ($('#' + key).attr('value-type') == 'money') value = moneyFormat(value);
$('#' + key).text(value)
})
}
}
})
}
getSumCount();
// 门店排名
function storeRanking() {
var order = $('.store-ranking .active').attr('sort-type');
$.ajax({
dataType: 'JSON',
type: 'POST',
url: ns.url("store://shop/store/storeranking"),
data: {
order: order
},
success: function(res) {
var html = "";
if(res.code >= 0 && res.data.length){
html += `<table class="layui-table" lay-skin="nob">
<thead>
<tr>
<th>排名</th>
<th>门店名称</th>
<th class="align-right">${order == 'num' ? '交易量(单)' : '交易额(元)'}</th>
</tr>
</thead>
<tbody>`;
res.data.forEach((item,index)=>{
html += `<tr>
<td>${index + 1}</td>
<td>${item.store_name}</td>
<td class="align-right">${order == 'num' ? item.order_num : item.order_money}</td>
</tr>
`;
});
html += ' </tbody></table>'
$(".market-item-content.store").html(html);
}else{
html += `<div class="ranking-empty">暂无排名</div>`;
$(".market-item-content.store").html(html);
}
}
});
}
storeRanking();
// 商品排名
function goodsRanking() {
var order = $('.goods-ranking .active').attr('sort-type');
$.ajax({
dataType: 'JSON',
type: 'POST',
url: ns.url("store://shop/store/goodsranking"),
data: {
order: order
},
success: function(res) {
var html = "";
if(res.code >= 0 && res.data.length){
html += `<table class="layui-table" lay-skin="nob">
<colgroup>
<col>
<col width="60%">
<col>
</colgroup>
<thead>
<tr>
<th>排名</th>
<th>商品名称</th>
<th class="align-right">${order == 'num' ? '交易量(件)' : '交易额(元)'}</th>
</tr>
</thead>
<tbody>`;
res.data.forEach((item,index)=>{
html += `<tr>
<td>${index + 1}</td>
<td><div class="goods-name" title="${item.goods_name}">${item.goods_name}</div></td>
<td class="align-right">${order == 'num' ? item.goods_num : item.goods_money}</td>
</tr>
`;
});
html += ' </tbody></table>';
$(".market-item-content.goods").html(html);
}else{
html += `<div class="ranking-empty">暂无排名</div>`;
$(".market-item-content.goods").html(html);
}
}
});
}
goodsRanking();
$(function(){
$('.store-ranking .type-item').click(function () {
$(this).addClass('active').siblings().removeClass('active');
storeRanking();
})
$('.goods-ranking .type-item').click(function () {
$(this).addClass('active').siblings().removeClass('active');
goodsRanking();
})
})
</script>

View File

@@ -0,0 +1,137 @@
<style>
.store-label-list {
padding: 0 20px;
}
</style>
<div class="store-label-list">
<!-- 列表 -->
<table id="store_label_list" lay-filter="store_label_list"></table>
</div>
<script type="text/html" id="checkbox">
{{# if($.inArray(d.label_id.toString(), selected_id_arr) != -1){ }}
<input type="checkbox" data-label-id="{{d.label_id}}" name="store_label_checkbox" lay-skin="primary" lay-filter="store_label_checkbox" checked>
{{# }else{ }}
<input type="checkbox" data-label-id="{{d.label_id}}" name="store_label_checkbox" lay-skin="primary" lay-filter="store_label_checkbox">
{{# } }}
<input type="hidden" data-label-id="{{d.label_id}}" name="store_label_json" value='{{ JSON.stringify(d) }}' />
</script>
<script>
var table, form, laytpl,
select_id = "{$select_id}", //选中商品id
selected_id_arr = select_id.length ? select_id.split(',') : [],
select_list = []; //选中商品所有数据
$(function () {
layui.use(['form', 'laytpl'], function () {
form = layui.form;
laytpl = layui.laytpl;
table = new Table({
elem: '#store_label_list',
url: ns.url("store://shop/store/labelSelect"),
cols: [
[
{
title:'<input type="checkbox" name="store_label_checkbox_all" lay-skin="primary" lay-filter="store_label_checkbox_all">',
unresize: 'false',
width: '10%',
templet: '#checkbox'
}, {
width: '55%',
title: '标签名称',
field:'label_name',
unresize: 'false',
}, {
width: '35%',
title: '创建时间',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}
]
],
callback : function () {
// 更新商品复选框状态
for (var i=0;i<selected_id_arr.length;i++) {
var selected = $("input[name='store_label_checkbox'][data-label-id='" + selected_id_arr[i] + "']");
if (selected.length) {
$("input[name='store_label_checkbox'][data-label-id='" + selected_id_arr[i] + "']").prop("checked", true);
}
}
form.render();
initData();
}
});
// 勾选商品
form.on('checkbox(store_label_checkbox_all)', function (data) {
var all_checked = data.elem.checked;
$("input[name='store_label_checkbox']").each(function () {
var checked = $(this).prop('checked');
if (all_checked != checked) {
$(this).next().click();
}
});
});
// 勾选商品
form.on('checkbox(store_label_checkbox)', function(data) {
var label_id = $(data.elem).attr("data-label-id"), json = {};
form.render();
var labelLen = $("input[name='store_label_checkbox'][data-label-id="+ label_id +"]:checked").length;
if (labelLen){
json = JSON.parse($("input[name='store_label_json'][data-label-id="+ label_id +"]").val());
delete json.LAY_INDEX;
delete json.LAY_TABLE_INDEX;
delete json.create_time;
select_list.push(json);
} else{
for (var i = 0; i < select_list.length; i++) {
if (select_list[i].label_id == label_id) {
select_list.splice(i, 1);
break;
}
}
}
$.unique(select_list);
});
//初始化数据
function initData(){
var labelLen = $("input[name='store_label_checkbox'][data-label-id]:checked").length;
for (var i = 0; i < labelLen; i++){
var labelId = $("input[name='store_label_checkbox'][data-label-id]:checked").eq(i).attr("data-label-id");
var ident = false;
for (var k = 0; k < select_list.length; k++){
if(select_list[k].id == labelId){
ident = true;
break;
}
}
if (ident) return;
json = JSON.parse($("input[name='store_label_json'][data-label-id="+ labelId +"]").val());
delete json.LAY_INDEX;
delete json.LAY_TABLE_INDEX;
delete json.create_time;
select_list.push(json);
}
}
});
});
function selectStoreLabelListener(callback) {
var res = select_list;
callback(res);
}
</script>

View File

@@ -0,0 +1,249 @@
<link rel="stylesheet" type="text/css" href="SHOP_CSS/store_lists.css" />
<style>
.store-info{display: flex;align-items: center;}
.store-info img{margin-right: 10px;width: 40px;}
.store-info .store-tab-wrap{display: flex;flex-wrap: wrap;}
.store-info .store-content p{line-height: 1;margin-bottom: 5px;}
.store-info .store-tab-wrap span{font-size: 12px;border: 1px solid;border-radius: 2px;padding: 3px 4px;line-height: 1;margin-right: 5px;margin-top: 5px;}
.relation-info{display: flex;flex-direction: column;}
.relation-info p{white-space: break-spaces;line-height: 1.5;}
.single-filter-box{
padding: 0;
}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加{$title}</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="keyword" placeholder="请输入{$title}名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="store_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="" lay-typer="">全部{$title}</li>
<li lay-id="1" lay-type="1">营业中</li>
<li lay-id="0" lay-type="1">休息中</li>
<li lay-id="1" lay-type="2">已停业</li>
</ul>
<table id="store_list" lay-filter="store_list"></table>
</div>
<!-- 门店信息 -->
<script type="text/html" id="store_info">
<div class="store-info">
{{# if(d.store_image){ }}
<img src="{{ns.img(d.store_image)}}" alt="" onerror="this.src = ns.img('{$default_img.store}')">
{{# }else{ }}
<img src="{{ns.img('{$default_img.store}')}}">
{{# } }}
<div class="store-content">
<p>{{d.store_name}}</p>
<div class="store-tab-wrap">
{{# if(d.is_default == 1){ }}
<span class="border-color text-color">总店</span>
{{# } }}
{{# if(d.is_pickup == 1){ }}
<span class="border-color text-color">门店自提</span>
{{# } }}
{{# if(d.is_o2o == 1){ }}
<span class="border-color text-color">同城配送</span>
{{# } }}
{{# if(d.is_express == 1){ }}
<span class="border-color text-color">物流配送</span>
{{# } }}
</div>
</div>
</div>
</script>
<!-- 联系信息 -->
<script type="text/html" id="relation_info">
<div class="relation-info">
<p>联系方式{{d.telphone || '--'}}</p>
<p>地址{{d.full_address + ' ' + d.address}}</p>
</div>
</script>
<!-- 订单信息 -->
<script type="text/html" id="order_info">
<div class="relation-info">
<p>订单金额{{d.order_money}}</p>
<p>订单数量{{d.order_num}}</p>
</div>
</script>
<!-- 门店信息 -->
<script type="text/html" id="settlement_info">
<div class="relation-info">
{{# if(!d.is_settlement){ }}
<p>无需结算</p>
{{# }else{ }}
<p>抽成总额{{(parseFloat(d.account) + parseFloat(d.account_withdraw) + parseFloat(d.account_apply)).toFixed(2)}}</p>
<p>待结算{{parseFloat(d.account).toFixed(2)}}</p>
<p>结算中{{parseFloat(d.account_apply).toFixed(2)}}</p>
<p>已结算{{parseFloat(d.account_withdraw).toFixed(2)}}</p>
{{# } }}
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="editStore">门店设置</a>
{{# if(d.is_default != 1){ }}
{{# if(d.is_frozen) { }}
<a class="layui-btn" lay-event="closeStore">开启</a>
{{# } else{ }}
<a class="layui-btn" lay-event="closeStore">停业</a>
{{# } }}
{{# } }}
<a class="layui-btn" lay-event="joinStore">进入门店</a>
</div>
</script>
<script>
var table,form,element;
layui.use(['form','element'], function() {
form = layui.form;
element = layui.element;
form.render();
refreshTable();
// 搜索功能
form.on('submit(search)', function(data) {
refreshTable();
});
element.on('tab(store_tab)', function(){
refreshTable();
});
// 监听工具栏操作
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'editStore':
editStore(data.store_id);
break;
case 'closeStore':
closeStore(data.store_id,data.is_frozen);
break;
case 'joinStore':
joinStore(data.store_id);
break;
}
});
});
// 刷新表格列表
function refreshTable(){
table = new Table({
id: 'store_list',
elem: '#store_list',
url: ns.url("store://shop/store/lists"),
cols: [
[ {
title: '门店信息',
unresize: 'false',
width: '23%',
templet: '#store_info'
}, {
title: '联系信息',
unresize: 'false',
width: '17%',
templet: '#relation_info'
}, {
title: '结算比率',
unresize: 'false',
width: '10%',
templet: function(data) {
let html = '';
if(data.is_settlement == 1){
html += "<p>"+ (data.settlement_rate == 0 ? '跟随系统' : (data.settlement_rate + '%')) +"</p>";
}
return html;
}
}, {
title: '门店结算',
unresize: 'false',
width: '16%',
templet: "#settlement_info"
}, {
title: '库存管理方式',
unresize: 'false',
width: '12%',
templet: function(data) {
let stockType = data.stock_type == 'all' ? '总部统一库存' : '门店独立库存';
return stockType;
}
},{
unresize:'false',
title: '门店状态',
width: '8%',
align: 'center',
templet: function(data){
let state = '--';
if(data.is_frozen == 1){
state = '<span style="color:red;">停业</span>';
}else{
state = data.status == 0 ? '<span style="color:#09bb07;">休息</span>' : '<span style="color:#105CFB;">正常</span>';
}
return state;
}
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align: 'right',
}]
],
where: {
search_text: $("input[name='keyword']").val(),
status: $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-id'),
type: $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-type')
}
});
}
function joinStore(storeId) {
window.open(ns.href("cashier://shop/index/cashier", {store_id: storeId}))
}
function add() {
location.hash = ns.hash("store://shop/store/addStore");
}
function editStore(data) {
location.hash = ns.hash("store://shop/store/editStore",{"store_id":data});
}
function closeStore(store_id, is_frozen){
var msg = '{$title}已开始运营,确认要关闭吗?';
if(is_frozen == 1) {
msg = '确定要开启该{$title}吗?';
}
layer.confirm(msg, function(index) {
layer.close(index);
$.ajax({
url: ns.url("store://shop/store/frozenStore"),
data: {store_id:store_id, is_frozen:is_frozen},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
refreshTable();
}
}
});
});
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,578 @@
<style>
.day-wrap {display: flex;align-items: center}
.day-input {width: 80px}
.day-input[readonly] {background: #f5f5f5}
.day-wrap .layui-form-radio:nth-child(4) {margin-right: 0px}
</style>
<div class="layui-form form-wrap" lay-filter="storeform" >
<input type="hidden" name="store_id" value="{$info.store_id}"/>
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">配送设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">物流配送:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_express" value="1" lay-skin="switch" {if !empty($info) && $info.is_express==1 }checked{/if}>
</div>
<div class="word-aux">物流配送只有在连锁门店模式有效,在平台运营模式,按照总店查询</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">同城配送:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_o2o" value="1" lay-skin="switch" {if $info['is_o2o'] == 1} checked {/if} lay-verify="is_o2o">
</div>
<div class="word-aux ">开启同城配送需要门店设置配送费用以及配送员</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店自提:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_pickup" value="1" lay-skin="switch" {if $info['is_pickup'] == 1} checked {/if} lay-verify="is_pickup" lay-filter="pickup">
</div>
</div>
<div class="layui-form-item time-view {if $info['is_pickup'] == 0}layui-hide{/if}">
<div class="layui-inline">
<label class="layui-form-label">自提日期:</label>
<div class="layui-input-inline">
<input type="radio" name="time_type" value="0" title="每天" lay-filter="time_type" {if $info.time_type == 0 || !isset($info.time_type)}checked{/if}/>
<input type="radio" name="time_type" value="1" title="自定义" lay-filter="time_type" {if $info.time_type == 1 }checked{/if}/>
</div>
</div>
</div>
<div class="time-view {if $info['is_pickup'] == 0}layui-hide{/if}">
<div class="layui-form-item time-type-view" lay-verify="time_week">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="checkbox" value="1" class='time-week' name="time_week[]" title="周一" lay-skin="primary" {if !empty($info.time_week) && in_array(1,$info.time_week)} checked {/if}>
<input type="checkbox" value="2" class='time-week' name="time_week[]" title="周二" lay-skin="primary" {if !empty($info.time_week) && in_array(2,$info.time_week)} checked {/if}>
<input type="checkbox" value="3" class='time-week' name="time_week[]" title="周三" lay-skin="primary" {if !empty($info.time_week) && in_array(3,$info.time_week)} checked {/if}>
<input type="checkbox" value="4" class='time-week' name="time_week[]" title="周四" lay-skin="primary" {if !empty($info.time_week) && in_array(4,$info.time_week)} checked {/if}>
<input type="checkbox" value="5" class='time-week' name="time_week[]" title="周五" lay-skin="primary" {if !empty($info.time_week) && in_array(5,$info.time_week)} checked {/if}>
<input type="checkbox" value="6" class='time-week' name="time_week[]" title="周六" lay-skin="primary" {if !empty($info.time_week) && in_array(6,$info.time_week)} checked {/if}>
<input type="checkbox" value="0" class='time-week' name="time_week[]" title="周日" lay-skin="primary" {if !empty($info.time_week) && in_array(0,$info.time_week)} checked {/if}>
</div>
</div>
</div>
<div class="time-type-view-all">
<div class="delivery-time">
{foreach name="$info.delivery_time" key="k" item="item"}
<div class="layui-form-item" >
<label class="layui-form-label">{$k == 0 ? '自提时段设置:' : ''}</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime{$k == 0 ? '' : $k}" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="{$item.start_time}">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime{$k == 0 ? '' : $k}" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="{$item.end_time}">
</div>
<div class="layui-form-mid layui-word-aux">
{if $k eq 0}
<a href="javascript:;" class="text-color add">添加</a>
{else/}
<a href="javascript:;" class="text-color delete">删除</a>
{/if}
</div>
</div>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">细分时段:</label>
<div class="layui-input-block">
<input type="radio" name="time_interval" value="30" title="30分钟" {if $info.time_interval == 30}checked{/if}/>
<input type="radio" name="time_interval" value="60" title="一小时" {if $info.time_interval == 60}checked{/if}/>
<input type="radio" name="time_interval" value="90" title="90分钟" {if $info.time_interval == 90}checked{/if}/>
<input type="radio" name="time_interval" value="120" title="两小时" {if $info.time_interval == 120}checked{/if}/>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">提前预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="advance_day" value="0" title="无需提前" {if $info.advance_day == 0}checked{/if} lay-filter="day_select"/>
<input type="radio" name="advance_day" value="1" title="提前" {if $info.advance_day != 0}checked{/if} lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="advance_day_num" lay-verify="advance_day" class="layui-input day-input" {if $info.advance_day == 0}readonly{else/}value="{$info.advance_day}"{/if}>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="word-aux">预约提货是否需提前进行预约</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最长预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="most_day" value="0" title="仅当日" {if $info.most_day == 0}checked{/if} lay-filter="day_select"/>
<input type="radio" name="most_day" value="1" title="可预约" {if $info.most_day != 0}checked{/if} lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="most_day_num" lay-verify="most_day" class="layui-input day-input" {if $info.most_day == 0}readonly{else/}value="{$info.most_day}"{/if}>
</div>
<div class="layui-form-mid layui-word-aux">天内</div>
</div>
<div class="word-aux">预约提货最长可预约多少天内进行提货</div>
</div>
</div>
</div>
<div class="layui-card-header">
<span class="card-title">库存设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">库存设置:</label>
<div class="layui-input-inline">
<input type="radio" {if $info.is_default}disabled{/if} name="stock_type" value="all" title="总部统一库存" {if $info['stock_type'] == 'all'} checked {/if}>
<input type="radio" {if $info.is_default}disabled{/if} name="stock_type" value="store" title="门店独立库存" {if $info['stock_type'] == 'store'} checked {/if}>
</div>
</div>
<div class="word-aux">总部统一库存:门店不用入库,商品查询以及销售由总部进行出入库<br>门店独立库存:门店自提以及收银扣除门店库存,门店需要入库</div>
</div>
</div>
<div class="layui-card-header">
<span class="card-title">营业设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item" {if $info.is_default == 1}style="display:none;"{/if}>
<label class="layui-form-label">营业状态:</label>
<div class="layui-input-block">
{if $info.is_default == 1}
<input type="checkbox" name="status" value="1" lay-skin="switch" checked lay-filter="status" title="营业|休息">
{else/}
<input type="checkbox" name="status" value="1" lay-skin="switch" lay-filter="status" {if !empty($info) && $info.status==1 }checked{/if} title="营业|休息">
{/if}
</div>
<div class="word-aux">门店休息并且设置前台不展示则前台无法看到该门店</div>
</div>
<div class="close-block {if $info.status == 1}layui-hide{/if}">
<div class="layui-form-item">
<label class="layui-form-label">休息展示:</label>
<div class="layui-input-block">
<input type="radio" name="close_show" value="0" title="前台不展示" lay-filter="close_show" {if $info.close_show == 0}checked{/if}/>
<input type="radio" name="close_show" value="1" title="前台展示" lay-filter="close_show" {if $info.close_show == 1}checked{/if}/>
</div>
<div class="word-aux">门店休息并且设置前台不展示则前台无法看到该门店</div>
</div>
<div class="layui-form-item {if $info.close_show == 0}layui-hide{/if} close-desc-block" >
<label class="layui-form-label"><span class="required">*</span>休息说明:</label>
<div class="layui-input-block">
<input type="text" name="close_desc" autocomplete="off" lay-verify="close_desc" class="layui-input len-long" value="{$info.close_desc}" placeholder="请输入临时停业说明最多输入50个字">
</div>
<div class="word-aux">门店休息且前台展示时会显示该说明最多输入50个字</div>
</div>
</div>
<div class="time-type-view-all">
<div class="open-date-delivery-time">
{foreach name="$info.open_date_config" key="k" item="item"}
<div class="layui-form-item" >
<label class="layui-form-label">{$k == 0 ? '营业时间设置:' : ''}</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="openDateStartTime{$k == 0 ? '' : $k}" lay-verify="open_date_start_time" placeholder="营业开始时间" value="" readonly >
<input type="hidden" name="open_date_start_time" placeholder="配送开始时间" value="{$item.start_time}">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="openDateEndTime{$k == 0 ? '' : $k}" lay-verify="open_date_end_time" placeholder="营业结束时间" value="" readonly >
<input type="hidden" name="open_date_end_time" placeholder="配送结束时间" value="{$item.end_time}">
</div>
<div class="layui-form-mid layui-word-aux">
{if $k eq 0}
<a href="javascript:;" class="text-color add">添加</a>
{else/}
<a href="javascript:;" class="text-color delete">删除</a>
{/if}
</div>
</div>
{/foreach}
</div>
<div class="word-aux">如果不设置,则默认全天营业</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">非营业时间配送下单:</label>
<div class="layui-input-block">
<input type="radio" name="out_open_date_o2o_pay" value="1" title="允许" lay-filter="time_type" {if $info.out_open_date_o2o_pay == 1}checked{/if}/>
<input type="radio" name="out_open_date_o2o_pay" value="0" title="不允许" lay-filter="time_type" {if $info.out_open_date_o2o_pay == 0 }checked{/if}/>
</div>
<div class="word-aux">如果设置为不允许,则在非营业时间用户不可以选择同城配送下单</div>
</div>
</div>
</div>
<div class="layui-card-body">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backStockList()">返回</button>
<a id="storeImage"></a>
</div>
</div>
</div>
<script>
var form, repeat_flag, map_class;
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var upload;
var store_business = "{$business_config['store_business']}";
layui.use(['form','laydate'], function() {
var laydate = layui.laydate;
form = layui.form;
repeat_flag = false;//防重复标识
form.render();
/************************************* 自提时间选择 开始 **********************************/
function fetchTimeSelect(){
$('.delivery-time .layui-form-item').each(function (index, item) {
//时间选择器
var startTime = $(item).find("input[name=start_time]").val(), endTime = $(item).find("input[name=end_time]").val(), initTime = parseInt({:strtotime(date('Y-m-d'))});
laydate.render({
elem: '#startTime' + (index ? index : '')
,type: 'time'
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=start_time]").val(time || 0);
}
});
$('#startTime' + (index ? index : '')).val(startTime ? ns.time_to_date((initTime + parseInt(startTime)), 'H:i:s') : '');
//时间选择器
laydate.render({
elem: '#endTime' + (index ? index : '')
,type: 'time'
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=end_time]").val(time || 0);
}
});
$('#endTime' + (index ? index : '')).val(endTime ? ns.time_to_date((initTime + parseInt(endTime)), 'H:i:s') : '');
})
}
fetchTimeSelect();
$('body').off('click', '.delivery-time .delete').on('click', '.delivery-time .delete', function () {
$(this).parents('.layui-form-item').remove()
});
$('body').off('click', '.delivery-time .add').on('click', '.delivery-time .add', function () {
var length = $('.delivery-time .layui-form-item').length;
if (length >= 3) { layer.msg('最多添加三个时段'); return;}
var h = `<div class="layui-form-item" >
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime`+ length +`" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime`+ length +`" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$('.delivery-time').append(h);
fetchTimeSelect();
});
/************************************* 自提时间选择 结束 **********************************/
/************************************* 营业时间选择 开始 **********************************/
function fetchOpenDateTimeSelect(){
$('.open-date-delivery-time .layui-form-item').each(function (index, item) {
//时间选择器
var startTime = $(item).find("input[name=open_date_start_time]").val(), endTime = $(item).find("input[name=open_date_end_time]").val(), initTime = parseInt({:strtotime(date('Y-m-d'))});
laydate.render({
elem: '#openDateStartTime' + (index ? index : '')
,type: 'time'
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=open_date_start_time]").val(time || 0);
}
});
$('#openDateStartTime' + (index ? index : '')).val(startTime ? ns.time_to_date((initTime + parseInt(startTime)), 'H:i:s') : '');
//时间选择器
laydate.render({
elem: '#openDateEndTime' + (index ? index : '')
,type: 'time'
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=open_date_end_time]").val(time || 0);
}
});
$('#openDateEndTime' + (index ? index : '')).val(endTime ? ns.time_to_date((initTime + parseInt(endTime)), 'H:i:s') : '');
})
}
fetchOpenDateTimeSelect();
$('body').off('click', '.open-date-delivery-time .delete').on('click', '.open-date-delivery-time .delete', function () {
$(this).parents('.layui-form-item').remove();
});
$('body').off('click', '.open-date-delivery-time .add').on('click', '.open-date-delivery-time .add', function () {
var length = $('.open-date-delivery-time .layui-form-item').length;
if (length >= 3) { layer.msg('最多添加三个时段'); return;}
var h = `<div class="layui-form-item" >
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="openDateStartTime`+ length +`" lay-verify="open_date_start_time" placeholder="营业开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="open_date_start_time" placeholder="营业开始时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="openDateEndTime`+ length +`" lay-verify="open_date_end_time" placeholder="营业结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="open_date_end_time" placeholder="营业送结束时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$('.open-date-delivery-time').append(h);
fetchOpenDateTimeSelect();
});
/************************************* 营业时间选择 结束 **********************************/
form.on('radio(day_select)', function (data){
if (data.value == 1) {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', false);
} else {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', true);
}
})
form.on('switch(status)', function (data){
if (!data.elem.checked) {
$(".close-block").removeClass('layui-hide');
} else {
$(".close-block").addClass('layui-hide');
}
})
form.on('radio(close_show)', function (data){
if (data.value == 1) {
$(".close-desc-block").removeClass('layui-hide');
} else {
$(".close-desc-block").addClass('layui-hide');
}
})
form.verify({
start_time: function(value, item){
if($('[name="is_pickup"]').is(':checked')) {
if(!value) return '请选择自提开始时间';
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
if (parseInt(start_time) > parseInt(end_time)) {
return '开始时间不能大于结束时间';
}
// var prev_endtime = $(item).parents('.layui-form-item').prev('.layui-form-item').find("input[name=end_time]").val();
// if (prev_endtime && parseInt(prev_endtime) > parseInt(start_time)) return '开始时间不能小于上一阶段结束时间';
}
},
end_time: function(value, item){
if($('[name="is_pickup"]').is(':checked')) {
if(!value) return '请选择自提结束时间';
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
var time_interval = $('[name="time_interval"]:checked').val();
if (parseInt(end_time) < parseInt(start_time)) {
return '结束时间不能小于开始时间';
}
if ((parseInt(end_time) - parseInt(start_time)) / 60 < parseInt(time_interval)) {
return '时间间隔不能小于' + time_interval + '分钟';
}
}
},
open_date_start_time: function(value, item){
if(!value && $('input[name=open_date_start_time]').length > 1) return '请选择营业开始时间';
var end_time = $(item).parents('.layui-form-item').find("input[name=open_date_end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=open_date_start_time]").val();
if (parseInt(start_time) > parseInt(end_time)) {
return '开始时间不能大于结束时间';
}
var prev_endtime = $(item).parents('.layui-form-item').prev('.layui-form-item').find("input[name=open_date_end_time]").val();
// if (prev_endtime && parseInt(prev_endtime) > parseInt(start_time)) return '开始时间不能小于上一阶段结束时间';
},
open_date_end_time: function(value, item){
if(!value && ($('input[name=open_date_end_time]').length > 1 || Number($('input[name=open_date_start_time]').val()) > 0)) return '请选择营业结束时间';
var end_time = $(item).parents('.layui-form-item').find("input[name=open_date_end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=open_date_start_time]").val();
if (parseInt(end_time) < parseInt(start_time)) {
return '结束时间不能小于开始时间';
}
},
required : function(value, item){
var msg = $(item).attr("placeholder") != undefined ? $(item).attr("placeholder") : '';
if(value == '') return msg;
},
time_week: function(){
if ($('[name="is_pickup"]').is(':checked') && $('[name="time_type"]:checked').val() == 1 && !$('.time-week:checked').length)
return '请选择可配送日期';
},
advance_day: function (value){
if ($('[name="advance_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入提前预约时间';
if (value < 0) return '提前预约时间不能为负数';
}
},
most_day: function (value){
if ($('[name="most_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入最长可预约时间';
if (value < 0) return '最长可预约时间不能为负数';
if (value > 15) return '最长可预约时间不能超过15天';
}
},
is_o2o:function (value, item){
var longitude = '{$info.longitude}';
var latitude = '{$info.latitude}';
if((!longitude || !latitude) && item.checked){
return '开启同城配送需先完善门店地址';
}
},
is_pickup:function (value, item){
var longitude = '{$info.longitude}';
var latitude = '{$info.latitude}';
if((!longitude || !latitude) && item.checked){
return '开启门店自提需先完善门店地址';
}
},
close_desc:function (value){
var status = $("input[name=status]").prop('checked');
var close_show = $("input[name=close_show]:checked").val();
if(!status && close_show === '1' && !value){
return '请输入休息说明';
}
}
});
timeTypeChange($("input[name=time_type]:checked").val());
form.on('radio(time_type)', function(data){
timeTypeChange(data.value);
});
form.on('switch(pickup)', function(data){
if(data.elem.checked){
$('.time-view').removeClass('layui-hide')
}else{
$('.time-view').addClass('layui-hide')
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data){
//组装自提时间
data.field.delivery_time = [];
$('.delivery-time .layui-form-item').each(function (index, item) {
data.field.delivery_time.push({
start_time: $(item).find("input[name=start_time]").val(),
end_time: $(item).find("input[name=end_time]").val()
})
});
data.field.delivery_time = JSON.stringify(data.field.delivery_time);
//组装营业时间
data.field.open_date_config = [];
$('.open-date-delivery-time .layui-form-item').each(function (index, item) {
let start_time = $(item).find("input[name=open_date_start_time]").val();
let end_time = $(item).find("input[name=open_date_end_time]").val();
if(Number(start_time) >= 0 && Number(end_time) > 0){
data.field.open_date_config.push({
start_time: start_time,
end_time: end_time,
})
}
});
data.field.open_date = getOpenDateShow(data.field.open_date_config);
data.field.open_date_config = JSON.stringify(data.field.open_date_config);
data.field.advance_day = $('[name="advance_day"]:checked').val() == 0 ? 0 : $('[name="advance_day_num"]').val();
data.field.most_day = $('[name="most_day"]:checked').val() == 0 ? 0 : $('[name="most_day_num"]').val();
if (store_business == 'store' && !data.field.is_express && !data.field.is_o2o && !data.field.is_pickup) {
layer.msg('至少需启用一种配送方式');
return;
}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("store://shop/store/operate"),
async : true,
data : data.field,
success : function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("store://shop/store/lists");
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
});
});
//获取营业时间显示
function getOpenDateShow(open_date_config) {
let open_date = '';
if(open_date_config.length > 0){
let arr = [];
open_date_config.forEach((item)=>{
arr.push(stampToTime(item.start_time)+'-'+stampToTime(item.end_time));
})
open_date = arr.join('');
}else{
open_date = '全天';
}
return open_date;
}
//时间戳转时间
function stampToTime(stamp, type='all'){
let m = Math.floor(stamp / 60);
let h = Math.floor(m / 60);
m = m % 60;
if(m < 10) m = '0'+m;
if(h < 10) h = '0'+h;
if(type === 'harf' && h > 12) h -= 12;
return h + ':' + m;
}
function backStockList() {
location.hash = ns.hash("store://shop/store/lists");
}
function timeTypeChange(type){
if(type == 1){
$('.time-type-view').show();
}else{
$('.time-type-view').hide();
}
}
</script>

View File

@@ -0,0 +1,50 @@
<style>
html,body {width: 100%;height: 100%}
.store-empty {display: flex;height: 100%; align-items: center;justify-content: center}
.store-wrap {display: flex;height: 100%;flex-wrap: wrap;overflow-y: auto;padding: 15px;box-sizing: border-box}
.store-wrap .store-item {box-sizing: border-box;margin: 0 15px 15px 0;border: 1px solid #f5f5f5;width: calc((100% - 30px) / 3);padding: 10px;cursor: pointer}
.store-wrap .store-item.active {border-color: var(--base-color);}
.store-wrap .store-item .name {font-weight: bold;}
.store-wrap .store-item .status {margin: 5px 0;line-height: 1;font-size: 12px}
.store-wrap .store-item .address {color: #999;font-size: 12px}
.store-wrap .store-item:nth-child(3n+3) {margin-right: 0}
.open {color: #00A717;}
.close {color: #ff0000;}
</style>
{notempty name="store_list"}
<div class="store-wrap">
{foreach name="store_list" item="vo"}
<div class="store-item {if in_array($vo.store_id, $store_id)}active{/if}" data-store="{$vo.store_id}">
<div class="name">{$vo.store_name}</div>
<div class="status">
{if $vo.is_frozen == 1 || $vo.status == 0}
<span class="close">未开启</span>
{else/}
<span class="open">开启中</span>
{/if}
</div>
<div class="address">{$vo.full_address}{$vo.address}</div>
</div>
{/foreach}
</div>
{else/}
<div class="store-empty">暂无可用门店</div>
{/notempty}
<script>
var storeList = {:json_encode($store_list)};
$('.store-item').click(function () {
if ($(this).hasClass('active')) $(this).removeClass('active');
else $(this).addClass('active');
})
function selectStoreListener(callback) {
var store = [];
$('.store-item.active').each(function () {
var index = $(this).index();
store.push(storeList[index])
})
if (typeof callback == "function") callback(store);
}
</script>

View File

@@ -0,0 +1,394 @@
<style>
.layui-form-radio{margin-top: 0;}
.layui-form-label{width: 160px;}
.layui-form-label + .layui-input-block{margin-left: 160px;}
.word-aux{margin-left: 160px;}
.form-row{margin-left: 160px;}
.bank-type-wrap{display: flex;}
.bank-type-wrap .bank-type-item{display: flex;align-items: center;margin-right: 15px;}
.bank-type-wrap .bank-type-item .layui-form-radio{padding: 0;margin: 0;}
.bank-type-wrap .bank-type-item .layui-form-radio .layui-icon{margin-right: 5px;}
.bank-type-wrap .bank-type-item > .iconfont{margin-right: 3px;}
.bank-type-wrap .bank-type-item:nth-child(2) > .iconfont{color: #24af41;}
.bank-type-wrap .bank-type-item:nth-child(3) > .iconfont{color: #00a0e9;}
.img-box{position: relative;}
.img-box .img-load{position: absolute;width: 100%;height: 100%;background: rgba(0,0,0,0.8);left:0;top:0;color:#fff;display: flex;justify-content: center;align-items: center;align-content: center;line-height: 20px;padding: 4px;box-sizing: border-box;cursor: pointer;}
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">结算设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item is-withdraw">
<label class="layui-form-label">是否结算:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="is_settlement" lay-filter="is_settlement" value="1" lay-filter="third_party" lay-skin="switch" {if $info.is_settlement == 1} checked{/if}>
</div>
</div>
</div>
<div class="layui-form-item settlement_rate {if $info.is_settlement == 0} layui-hide{/if}" >
<label class="layui-form-label">门店抽成:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="settlement_rate" lay-filter="settlement_rate" value="0" title="跟随系统" {if $info.settlement_rate == 0} checked{/if} />
<input type="radio" name="settlement_rate" lay-filter="settlement_rate" value="1" title="自定义"{if $info.settlement_rate > 0} checked{/if}/>
</div>
</div>
<div class="word-aux along-system {if $info.settlement_rate != 0}layui-hide{/if}">跟随系统时门店抽成比率是{$withdraw_config.settlement_rate}%</div>
</div>
<div class="layui-form-item settlement-rate-wrap {if $info.is_settlement == 0 || $info.settlement_rate == 0} layui-hide{/if}">
<label class="layui-form-label">门店抽成比率:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="settlement_rate" lay-verify="settlement_rate" placeholder="0" class="layui-input len-short" autocomplete="off" value="{$info.settlement_rate}"/>
</div>
<div class="layui-form-mid layui-word-aux">%</div>
</div>
<div class="word-aux">门店抽成比率需是0-100且保存两位小数</div>
</div>
<div class="layui-form-item bank-type {if $info.is_settlement == 0} layui-hide{/if}">
<label class="layui-form-label">账户类型:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="bank_type" lay-filter="bank_type" value="3" title="银行卡" {if $info.bank_type == 3 || $info.bank_type == 0} checked{/if}/>
<input type="radio" name="bank_type" lay-filter="bank_type" value="1" title="微信" {if $info.bank_type == 1} checked{/if}/>
<input type="radio" name="bank_type" lay-filter="bank_type" value="2" title="支付宝" {if $info.bank_type == 2} checked{/if}/>
</div>
</div>
</div>
<!-- 银行卡 -->
<div class="layui-form-item bank_card {if $info.is_settlement == 0 || $info.bank_type != 3} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>开户行:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_type_name" {if $info.bank_type == 3}lay-verify="bank_type_name"{/if} placeholder="请输入开户行" class="layui-input len-mid" autocomplete="off" value="{$info.bank_type_name}">
</div>
</div>
</div>
<div class="layui-form-item bank_card {if $info.is_settlement == 0 || $info.bank_type != 3} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>户头:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_user_name" {if $info.bank_type == 3}lay-verify="bank_user_name"{/if} placeholder="请输入户头" class="layui-input len-mid" autocomplete="off" value="{$info.bank_user_name}">
</div>
</div>
</div>
<div class="layui-form-item bank_card {if $info.is_settlement == 0 || $info.bank_type != 3} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>账户:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_type_account" {if $info.bank_type == 3}lay-verify="bank_type_account"{/if} placeholder="请输入账户" class="layui-input len-mid" autocomplete="off" value="{$info.bank_type_account}">
</div>
</div>
</div>
<!-- 微信 -->
<div class="layui-form-item wixin-wrap {if $info.is_settlement == 0 || $info.bank_type != 1} layui-hide{/if}">
<label class="layui-form-label">微信绑定:</label>
<div class="layui-input-block">
<div class="img-box" style="height: 100px!important;width: auto;" id="wechat_auth_qrcode">
<image src="" />
<div class="img-load layui-hide"></div>
</div>
</div>
<div class="word-aux">请扫描二维码与微信绑定</div>
</div>
<div class="layui-form-item wixin-wrap {if $info.is_settlement == 0 || $info.bank_type != 1} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>微信openid</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_type_account_weixin" {if $info.bank_type == 1}lay-verify="bank_type_account_weixin"{/if} class="layui-input len-mid" autocomplete="off" value="{$info.bank_type_account}" readonly>
</div>
</div>
</div>
<div class="layui-form-item wixin-wrap {if $info.is_settlement == 0 || $info.bank_type != 1} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>真实姓名:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_user_name_weixin" {if $info.bank_type == 1}lay-verify="bank_user_name_weixin"{/if} placeholder="请输入微信名" class="layui-input len-mid" autocomplete="off" value="{$info.bank_user_name}">
</div>
</div>
<div class="word-aux">请输入真实姓名,否则转账会校验失败</div>
</div>
<!-- 支付宝 -->
<div class="layui-form-item alipay-wrap {if $info.is_settlement == 0 || $info.bank_type != 2} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>真实名字:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_user_name_alipay" {if $info.bank_type == 2}lay-verify="bank_user_name_alipay"{/if} placeholder="请输入真实名字" class="layui-input len-mid" autocomplete="off" value="{$info.bank_user_name}">
</div>
</div>
</div>
<div class="layui-form-item alipay-wrap {if $info.is_settlement == 0 || $info.bank_type != 2} layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>支付宝账号:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="bank_type_account_alipay" {if $info.bank_type == 2}lay-verify="required"{/if} placeholder="请输入支付宝账户" class="layui-input len-mid" autocomplete="off" value="{$info.bank_type_account}">
</div>
</div>
</div>
<input type="hidden" name="store_id" value="{$store_id}">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script>
var form,
repeat_flag=false,
isSettlementRate=false, //抽成比率是否跟随系统
bankType='{$info.bank_type}' == 0 ? 3 : '{$info.bank_type}'; //账户类型
//微信授权
var wechatAuth;
getWechatAuthInstance();
wechatAuth.bankTypeChange(bankType);
layui.use(['form'], function() {
form = layui.form;
form.render();
// 是否结算
form.on('switch(is_settlement)', function (data) {
$(".bank_card").addClass("layui-hide");
$(".wixin-wrap").addClass("layui-hide");
$(".alipay-wrap").addClass("layui-hide");
if (data.elem.checked) {
$(".settlement_rate").removeClass("layui-hide");
$(".bank-type").removeClass("layui-hide");
//账户类型
if (bankType == 1) {
$(".wixin-wrap").removeClass("layui-hide");
} else if (bankType == 2) {
$(".alipay-wrap").removeClass("layui-hide");
} else if (bankType == 3) {
$(".bank_card").removeClass("layui-hide");
}
} else {
$(".settlement-rate-wrap").addClass("layui-hide");
$(".settlement_rate").addClass("layui-hide");
$(".bank-type").addClass("layui-hide");
}
if (isSettlementRate) {
$(".along-system").addClass("layui-hide");
$(".settlement-rate-wrap").removeClass("layui-hide");
} else {
$(".along-system").removeClass("layui-hide");
$(".settlement-rate-wrap").addClass("layui-hide");
}
});
// 提现抽成
form.on('radio(settlement_rate)', function (data) {
isSettlementRate = Boolean(parseFloat(data.value));
if (parseFloat(data.value)) {
$(".along-system").addClass("layui-hide");
$(".settlement-rate-wrap").removeClass("layui-hide");
} else {
$(".along-system").removeClass("layui-hide");
$(".settlement-rate-wrap").addClass("layui-hide");
}
});
// 账户类型选择
form.on('radio(bank_type)', function (data) {
bankType = parseFloat(data.value);
$("input[name='bank_type_name']").removeAttr('lay-verify');
$("input[name='bank_user_name']").removeAttr('lay-verify');
$("input[name='bank_type_account']").removeAttr('lay-verify');
$("input[name='bank_user_name_alipay']").removeAttr('lay-verify');
$("input[name='bank_type_account_alipay']").removeAttr('lay-verify');
$("input[name='bank_user_name_weixin']").removeAttr('lay-verify');
if (parseFloat(data.value) == 1) {
$(".bank_card").addClass("layui-hide");
$(".wixin-wrap").removeClass("layui-hide");
$(".alipay-wrap").addClass("layui-hide");
$("input[name='bank_user_name_weixin']").attr('lay-verify', 'required');
$("input[name='bank_type_account_weixin']").attr('lay-verify', 'required');
} else if (parseFloat(data.value) == 2) {
$(".bank_card").addClass("layui-hide");
$(".wixin-wrap").addClass("layui-hide");
$(".alipay-wrap").removeClass("layui-hide");
$("input[name='bank_user_name_alipay']").attr('lay-verify', 'required');
$("input[name='bank_type_account_alipay']").attr('lay-verify', 'required');
} else if (parseFloat(data.value) == 3) {
$(".bank_card").removeClass("layui-hide");
$(".wixin-wrap").addClass("layui-hide");
$(".alipay-wrap").addClass("layui-hide");
$("input[name='bank_type_name']").attr('lay-verify', 'required');
$("input[name='bank_user_name']").attr('lay-verify', 'required');
$("input[name='bank_type_account']").attr('lay-verify', 'required');
}
wechatAuth.bankTypeChange(data.value);
});
form.on('submit(save)', function (data) {
if (repeat_flag) return;
repeat_flag = true;
let field = data.field;
if (bankType == 1){
field.bank_user_name = field.bank_user_name_weixin;
field.bank_type_account = field.bank_type_account_weixin;
} else if (bankType == 2) {
field.bank_user_name = field.bank_user_name_alipay;
field.bank_type_account = field.bank_type_account_alipay;
}
if (!isSettlementRate) {
field.settlement_rate = 0;
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("store://shop/store/settlement"),
data: field,
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
// 验证正整数
form.verify({
bank_type_name:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 3){
if(value.length == 0){
return '请输入开户行';
}
}
},
bank_user_name:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 3){
if(value.length == 0){
return '请输入户头';
}
}
},
bank_type_account:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 3){
if(value.length == 0){
return '请输入账户';
}
}
},
bank_user_name_weixin:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 1){
if(value.length == 0){
return '请输入微信名';
}
}
},
bank_user_name_alipay:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 2){
if(value.length == 0){
return '请输入真实名字';
}
}
},
bank_type_account_alipay:function(value){
if($("input[name='is_settlement']:checked").val() && parseInt($("input[name='bank_type']:checked").val()) == 2){
if(value.length == 0){
return '请输入支付宝账号';
}
}
},
settlement_rate: function (value) {
if (parseFloat(value) < 0 || parseFloat(value) > 100) {
return '请输入0-100之间的数';
}
let len = value.split(".")[1] ? value.split(".")[1].length : 0;
if (len > 2) {
return '门店抽成比率最多两位小数';
}
}
});
});
//微信授权操作
function getWechatAuthInstance(){
wechatAuth = {
cache_key : '',
interval: null,
create: function (){
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("store://shop/store/createWechatAuthQrcode"),
data: {},
success: (res) => {
if(res.code >= 0){
this.cache_key = res.data.cache_key;
$("#wechat_auth_qrcode img").attr('src', res.data.qrcode);
this.startCheck();
}
}
});
},
check: function (){
//如果切换了页面就不要继续执行了
if(location.hash.indexOf('store://shop/store/settlement') === -1){
this.stopCheck();
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("store://shop/store/getWechatAuthData"),
data: {
cache_key : this.cache_key,
},
success: (res) => {
if (res.code >= 0 && res.data){
$("#wechat_auth_qrcode .img-load").removeClass("layui-hide").html('已绑定成功<br/>点击重新绑定');
$("input[name='bank_type_account_weixin']").val(res.data.openid)
this.stopCheck();
}
}
});
},
startCheck: function (){
clearInterval(this.interval);
this.interval = setInterval(()=>{
this.check();
}, 1000)
},
stopCheck: function(){
clearInterval(this.interval);
},
init: function(){
let img_load_dom = $("#wechat_auth_qrcode .img-load");
img_load_dom.click(()=>{
img_load_dom.addClass('layui-hide');
this.create();
})
},
bankTypeChange: function (bank_type){
if(parseInt(bank_type) === 1){
this.create();
}else{
this.stopCheck();
}
}
}
wechatAuth.init();
}
</script>

View File

@@ -0,0 +1,269 @@
<style>
.layui-layer-content {padding-bottom: 20px!important;}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addLabel()">添加标签</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入门店标签名称" autocomplete="off" class="layui-input" maxlength="10">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="attr_class_list" lay-filter="attr_class_list"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="addLabel">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="label_name" type="text" placeholder="请输入门店标签名称" lay-verify="required" class="layui-input len-mid" maxlength="10">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editLabel">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="label_name" type="text" value="{{ d.label_name }}" placeholder="请输入门店标签名称" lay-verify="required" class="layui-input len-mid" maxlength="10">
</div>
</div>
<input type="hidden" name="label_id" value="{{ d.label_id }}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.label_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<script>
var laytpl, add_attr_index = -1,
form, table;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#attr_class_list',
url: ns.url("store://shop/store/tag"),
cols: [
[{
field: 'label_name',
title: '标签名称',
unresize: 'false'
}, {
unresize: 'false',
title: '创建时间',
width: '20%',
align: 'center',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'sort',
width: '20%',
title: '排序',
templet: '#editSort',
sort: true
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align: 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
editLabel(data);
break;
case 'delete':
deleteLabel(data.label_id);
break;
}
});
/**
* 删除
*/
function deleteLabel(id) {
layer.confirm('确认删除该标签吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("store://shop/store/deleteLabel"),
data: {
label_id: id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url('store://shop/store/addLabel'),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
form.on('submit(edit_save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url('store://shop/store/editLabel'),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
});
function addLabel() {
var add_attr = $("#addLabel").html();
laytpl(add_attr).render({}, function(html) {
add_attr_index = layer.open({
title: '添加门店标签',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '220px'],
content: html
});
});
}
function editLabel(data) {
var add_attr = $("#editLabel").html();
laytpl(add_attr).render(data, function(html) {
add_attr_index = layer.open({
title: '编辑门店标签',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '220px'],
content: html
});
});
}
function closeAttrLayer() {
layer.close(add_attr_index);
}
// 监听单元格编辑
function editSort(id, event){
var data = $(event).val();
if (data == '') {
$(event).val(0);
data = 0;
}
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url('store://shop/store/modifySort'),
data: {
label_id: id,
sort: data
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,128 @@
<link rel="stylesheet" href="STATIC_CSS/promotion_detail.css">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">结算信息</span>
</div>
<div class="layui-card-body">
<div class="promotion-view">
<div class="promotion-view-item">
<label>结算编号:</label>
<span>{$withdraw_info.withdraw_no}</span>
</div>
<div class="promotion-view-item">
<label>结算状态:</label>
<span>{$withdraw_info.status_name}</span>
</div>
{if $withdraw_info['status'] == -1 || $withdraw_info['status'] == -2}
<div class="promotion-view-item">
<label>拒绝理由:</label>
<span>{$withdraw_info.refuse_reason}</span>
</div>
{/if}
<div class="promotion-view-item">
<label>结算金额:</label>
<span>{$withdraw_info.money}</span>
</div>
<div class="promotion-view-item">
<label>转账方式:</label>
<span>{$withdraw_info.transfer_type_name}</span>
</div>
<div class="promotion-view-item">
<label>结算类型:</label>
<span>{$withdraw_info.settlement_type_name}</span>
</div>
<div class="promotion-view-item">
<label>结算申请时间:</label>
<span>{:time_to_date($withdraw_info.apply_time)}</span>
</div>
{if $withdraw_info.transfer_type == "bank"}
<div class="promotion-view-item">
<label>银行名称:</label>
<span>{$withdraw_info['bank_name']}</span>
</div>
{/if}
<div class="promotion-view-item">
<label>结算收款账号:</label>
<span>{$withdraw_info.account_number}</span>
</div>
<div class="promotion-view-item">
<label>结算方式:</label>
<span>{$withdraw_info.transfer_type_name}</span>
</div>
<div class="promotion-view-item">
<label>真实姓名:</label>
<span>{$withdraw_info.realname}</span>
</div>
</div>
<div class="promotion-view">
{if !empty($withdraw_info['voucher_img'])}
<div class="promotion-view-item-line">
<label class="promotion-view-item-custom-label">转账凭证:</label>
<div class="promotion-view-item-custom-box img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box">
{if condition="$withdraw_info.voucher_img"}
<img layer-src src="{:img($withdraw_info.voucher_img)}" >
{else/}
<img layer-src src="__STATIC__/img/shape.png" />
{/if}
</div>
</div>
</div>
</div>
{/if}
{if !empty($withdraw_info.voucher_desc)}
<div class="promotion-view-item-line">
<label class="promotion-view-item-custom-label">凭证说明:</label>
<div class="promotion-view-item-custom-box">{$withdraw_info.voucher_desc}</div>
</div>
{/if}
</div>
</div>
</div>
{if $withdraw_info.settlement_type != 'apply'}
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">周期结算</span>
</div>
<div class="layui-card-body">
<div class="promotion-view">
<div class="promotion-view-item">
<label>周期结算编号:</label>
<span>{$withdraw_info.settlement_info.settlement_no}</span>
</div>
<div class="promotion-view-item">
<label>周期开始时间:</label>
<span>{:time_to_date($withdraw_info.settlement_info.start_time)}</span>
</div>
<div class="promotion-view-item">
<label>周期结束时间:</label>
<span>{:time_to_date($withdraw_info.settlement_info.end_time)}</span>
</div>
<div class="promotion-view-item">
<label>结算订单总额:</label>
<span>{$withdraw_info.settlement_info.order_money}</span>
</div>
<div class="promotion-view-item">
<label>结算总分销佣金:</label>
<span>{$withdraw_info.settlement_info.commission}</span>
</div>
</div>
</div>
</div>
{/if}
<div class="form-row sm">
<button class="layui-btn layui-btn-primary" onclick="backStockWithdrawList()">返回</button>
</div>
<script>
function backStockWithdrawList() {
location.hash = ns.hash("store://shop/withdraw/lists");
}
</script>

View File

@@ -0,0 +1,577 @@
<style>
.layui-card-body .content{width: 33.3%;}
.layui-layout-admin .screen{margin-bottom: 15px;}
</style>
<div class="layui-card panel-content card-common card-brief">
<div class="layui-card-header simple">
<span class="card-title">结算概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">待结算(元)</p>
<p class="money">{$stat.total_account}</p>
</div>
<div class="content">
<p class="title">已结算(元)</p>
<p class="money">{$stat.total_account_withdraw}</p>
</div>
<div class="content">
<p class="title">结算中(元)</p>
<p class="money">{$stat.total_account_apply}</p>
</div>
</div>
</div>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">门店</label>
<div class="layui-input-inline">
<select name="store_id" lay-filter="store_id">
<option value="">全部</option>
{foreach name="$store_list" item="store"}
<option value="{$store['store_id']}">{$store['store_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">结算方式</label>
<div class="layui-input-inline">
<select name="transfer_type">
<option value="">全部</option>
{foreach $transfer_type_list as $transfer_type_k=> $transfer_type_v}
<option value="{$transfer_type_k}">{$transfer_type_v}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">结算类型</label>
<div class="layui-input-inline">
<select name="settlement_type">
<option value="">全部</option>
{foreach $settlement_type_list as $settlement_type_k=> $settlement_type_v}
<option value="{$settlement_type_k}">{$settlement_type_v}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<select name="status">
<option value="all">全部</option>
{foreach $status_list as $status_k=> $status_v}
<option value="{$status_k}">{$status_v}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">申请时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_date" id="start_time" placeholder="请输入开始时间" autocomplete="off" readonly>
</div>
<div class="layui-input-inline split">-</div>
<div class="layui-input-inline end-time">
<input type="text" class="layui-input" name="end_date" id="end_time" placeholder="请输入结束时间" autocomplete="off" readonly>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">转账时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="transfer_start_date" id="transfer_start_time" placeholder="请输入开始时间" autocomplete="off" readonly>
</div>
<div class="layui-input-inline split">-</div>
<div class="layui-input-inline end-time">
<input type="text" class="layui-input" name="transfer_end_date" id="transfer_end_time" placeholder="请输入结束时间" autocomplete="off" readonly>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<!-- 列表 -->
<table id="withdraw_list" lay-filter="withdraw_list"></table>
<script type="text/html" id="status">
{{# if(d.status == 0){ }}
<div class="layui-elip text-color">{{ d.status_name }}</div>
{{# }else if(d.status == 1){ }}
<div class="layui-elip text-color">{{ d.status_name }}</div>
{{# }else if(d.status == 2){ }}
<div class="layui-elip" style="color: green">{{ d.status_name }}</div>
{{# }else if(d.status == 3){ }}
<div class="layui-elip" style="color: gray">{{ d.status_name }}</div>
{{# }else if(d.status == -1){ }}
<div class="layui-elip text" style="color: red">{{ d.status_name }}</div>
<div class="layui-elip text" style="color: gray">{{d.refuse_reason}}</div>
{{# }else if(d.status == -2){ }}
<div class="layui-elip text" style="color: red">{{ d.status_name }}</div>
<div class="layui-elip text" style="color: gray">{{d.refuse_reason}}</div>
{{# } }}
</script>
<!--操作-->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">查看</a>
{{# if(d.status == 0){ }}
<a href="javascript:;" class="layui-btn" lay-event="agree">同意</a>
<a href="javascript:;" class="layui-btn" lay-event="refuse">拒绝</a>
{{# }else if(d.status == 1){ }}
{{# if((d.transfer_type != "bank" && (d.transfer_type != 'wechatpay' || (d.transfer_type == 'wechatpay' && !transfer_v3_type)) )){ }}
<a href="javascript:;" class="layui-btn" lay-event="transfer">在线转账</a>
{{# } }}
{{# if(d.transfer_type != 'wechatpay' || (d.transfer_type == 'wechatpay' && !transfer_v3_type)){ }}
<a href="javascript:;" class="layui-btn" lay-event="actiontransfer">手动转账</a>
{{# } }}
<a href="javascript:;" class="layui-btn" lay-event="refuse">拒绝</a>
{{# } }}
</div>
</script>
<!--时间-->
<script type="text/html" id="apply_time">
<div class="layui-elip" title="{{ns.time_to_date(d.apply_time)}}">{{ns.time_to_date(d.apply_time)}}</div>
</script>
<script>
var table,upload;
var transfer_v3_type = "{$transfer_v3_type}"
layui.use(['form', 'laydate','laytpl'], function() {
var form = layui.form,
laydate = layui.laydate,
currentDate = new Date(),
laytpl = layui.laytpl,
minDate = "";
form.render();
currentDate.setDate(currentDate.getDate() - 7);
//开始时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time',
type: 'datetime'
})
laydate.render({
elem: '#transfer_start_time',
type: 'datetime'
});
laydate.render({
elem: '#transfer_end_time',
type: 'datetime'
});
/**
* 重新渲染结束时间
*/
function reRender(){
$("#end_time").remove();
$(".end-time").html('<input type="text" class="layui-input" placeholder="结束时间" name="end_date" id="end_time" >');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表格加载
*/
table = new Table({
elem: '#withdraw_list',
url: ns.url("store://shop/withdraw/lists"),
cols: [
[{
field: 'store_name',
title: '门店',
width: '13%',
unresize: 'false',
},{
field: 'telphone',
title: '联系人',
width: '11%',
unresize: 'false',
templet: function(data) {
return data.telphone || '--';
}
}, {
field: 'transfer_type_name',
title: '结算方式',
width: '10%',
unresize: 'false',
}, {
field:'settlement_type_name',
title: '结算类型',
unresize: 'false',
width: '10%',
}, {
field: 'money',
title: '结算金额',
width: '10%',
unresize: 'false',
align: 'right',
templet: function(data) {
return '¥'+ data.money
}
},{
field: 'status_name',
title: '结算状态',
width: '10%',
unresize: 'false',
templet: '#status'
}, {
title: '申请时间',
unresize: 'false',
width: '15%',
templet: '#apply_time'
}, {
title: '转账时间',
unresize: 'false',
width: '13%',
templet: function(data) {
return `<div class="layui-elip" title="`+ ns.time_to_date(data.transfer_time) +`">`+ ns.time_to_date(data.transfer_time) +`</div>`
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch(obj.event){
case 'detail':
detail(data);
break;
case 'detail_refuse':
layer.open({
title: '拒绝理由',
content: data.refuse_reason,
})
break;
case 'agree':
agree(data);
break;
case 'refuse':
refuse(data);
break;
case 'transfer':
transfer(data);
break;
case 'actiontransfer':
laytpl($("#actiontransfer_html").html()).render(data, function(html) {
layer_pass = layer.open({
title: '结算转账',
skin: 'layer-tips-class',
type: 1,
area: ['800px'],
content: html,
});
});
//转账凭证
upload = new Upload({
elem: '#voucher_img'
});
break;
}
});
//提交
form.on('submit(actiontransfer)', function(data) {
actiontransfer(data.field);
return false;
});
});
/**
* 查看详情
*/
function detail(field) {
location.hash = ns.hash("store://shop/withdraw/detail",{withdraw_id:field.withdraw_id});
}
/**
* 自动转账
*/
var transfer_repeat_flag = false;
function transfer(field) {
if(transfer_repeat_flag) return false;
transfer_repeat_flag = true;
layer.confirm('确定要进行自动转账吗?', function(index) {
$.ajax({
url: ns.url("store://shop/withdraw/transfer"),
data: field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
transfer_repeat_flag = false;
if (res.code >= 0) {
table.reload({
page: {
curr: 1
}
});
layer.closeAll();
} else {
layer.closeAll();
layer.msg(res.message);
}
}
});
}, function () {
layer.close();
transfer_repeat_flag = false;
});
}
/**
* 手动转账
*/
var actiontransfer_repeat_flag = false;
function actiontransfer(field) {
if(actiontransfer_repeat_flag) return false;
actiontransfer_repeat_flag = true;
// 删除图片
// if(!data.field.certificate) upload.delete();
$.ajax({
url: ns.url("store://shop/withdraw/transferfinish"),
data: field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
actiontransfer_repeat_flag = false;
if (res.code >= 0) {
// table.reload({
// page: {
// curr: 1
// }
// });
layer.closeAll();
listenerHash(); // 刷新页面
}else{
layer.msg(res.message);
}
}
});
}
/**
* 同意
*/
var agree_repeat_flag = false;
function agree(field) {
if(agree_repeat_flag) return false;
agree_repeat_flag = true;
layer.confirm('确定要通过该转账申请吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("store://shop/withdraw/agree"),
data: field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
agree_repeat_flag = false;
layer.closeAll();
if (res.code >= 0) {
listenerHash(); // 刷新页面
} else {
layer.msg(res.message);
}
}
});
}, function () {
layer.closeAll();
agree_repeat_flag = false;
});
}
/**
* 拒绝
*/
var refuse_repeat_flag = false;
function refuse(field) {
layer.prompt({
title: '拒绝理由',
formType: 2,
yes: function(index, layero) {
var value = layero.find(".layui-layer-input").val();
if (value) {
if(refuse_repeat_flag) return false;
refuse_repeat_flag = true;
field.refuse_reason = value;
$.ajax({
url: ns.url("store://shop/withdraw/refuse"),
data: field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
layer.msg(res.message);
refuse_repeat_flag = false;
if (res.code >= 0) {
listenerHash(); // 刷新页面
}
}
});
layer.close(index);
} else {
layer.msg('请输入拒绝理由!', {icon: 5, anim: 6});
}
}
});
}
function closePass() {
layer.close(layer_pass);
}
</script>
<!-- 在线转账html -->
<script type="text/html" id="actiontransfer_html">
<div class="layui-form" lay-filter="form">
<div class="layui-form-item">
<label class="layui-form-label">结算类型</label>
<div class="layui-input-block">
<p class="input-text ">{{d.transfer_type_name}}</p>
</div>
</div>
{{# if(d.transfer_type == "bank"){ }}
<div class="layui-form-item">
<label class="layui-form-label">账户名称</label>
<div class="layui-input-block">
<p class="input-text ">{{d.bank_name}}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">银行账号</label>
<div class="layui-input-block">
<p class="input-text ">{{d.account_number}}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">真实姓名</label>
<div class="layui-input-block">
<p class="input-text ">{{ d.realname }}</p>
</div>
</div>
{{# }else if(d.transfer_type == "alipay"){ }}
<div class="layui-form-item">
<label class="layui-form-label">支付宝账号</label>
<div class="layui-input-block">
<p class="input-text ">{{d.account_number}}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">真实姓名</label>
<div class="layui-input-block">
<p class="input-text ">{{ d.realname }}</p>
</div>
</div>
{{# }else if(d.transfer_type == "wechatpay"){ }}
<div class="layui-form-item">
<label class="layui-form-label">微信号</label>
<div class="layui-input-block">
<p class="input-text ">{{d.account_number}}</p>
</div>
</div>
{{# } }}
<div class="layui-form-item">
<label class="layui-form-label">结算金额</label>
<div class="layui-input-block">
<p class="input-text">{{d.money}}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">转账凭证</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="voucher_img">
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="voucher_img" >
</div>
<!-- <p id="certificate" class="no-replace">替换</p>
<input type="hidden" name="certificate" >
<i class="del">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">转账凭证说明</label>
<div class="layui-input-block len-long">
<textarea name="voucher_desc" class="layui-textarea" maxlength="150"></textarea>
</div>
</div>
<input type="hidden" name="withdraw_id" value="{{ d.withdraw_id }}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="actiontransfer">确定</button>
<button class="layui-btn layui-btn-primary" onclick="closePass()">返回</button>
</div>
</div>
</script>