This commit is contained in:
2025-10-29 15:32:26 +08:00
parent d90614805b
commit b7462657cd
78921 changed files with 2753938 additions and 71 deletions

View File

@@ -0,0 +1,209 @@
<?php
/**
*/
namespace addon\pointexchange\api\controller;
use app\api\controller\BaseApi;
use addon\pointexchange\model\Exchange as ExchangeModel;
use app\model\goods\GoodsService;
use app\model\web\Config as ConfigModel;
use app\model\goods\GoodsCategory as GoodsCategoryModel;
/**
* 积分兑换
*/
class Goods extends BaseApi
{
/**
* 详情信息
*/
public function detail()
{
$id = $this->params['id'] ?? 0;
if (empty($id)) {
return $this->response($this->error('', 'REQUEST_ID'));
}
$exchange_model = new ExchangeModel();
$exchange_info = $exchange_model->getExchangeInfo($id, 'type, type_id')[ 'data' ];
$condition = [
[ 'peg.id', '=', $id ],
[ 'peg.site_id', '=', $this->site_id ],
[ 'peg.state', '=', 1 ],
];
if (empty($exchange_info)) return $this->response($this->error('', '商品未找到'));
$info = $exchange_model->getExchangeDetail($condition, $exchange_info[ 'type' ])[ 'data' ];
if (empty($info)) return $this->response($this->error($info));
if ($exchange_info[ 'type' ] == 1) {
//判断商品规格项
$goods_spec_format = $exchange_model->getGoodsSpecFormat($info[ 'exchange_id' ], $this->site_id, $info[ 'goods_spec_format' ]);
$info[ 'goods_spec_format' ] = json_encode($goods_spec_format);
$goods_service = new GoodsService();
$info[ 'goods_service' ] = $goods_service->getServiceList([ [ 'site_id', '=', $this->site_id ], [ 'id', 'in', $info[ 'goods_service_ids' ] ] ], 'service_name,desc,icon')[ 'data' ];
}
return $this->response($this->success($info));
}
/**
* 查询商品SKU集合
* @return false|string
*/
public function goodsSku()
{
$goods_id = $this->params['goods_id'] ?? 0;
$exchange_id = $this->params['exchange_id'] ?? 0;
$type = $this->params['type'] ?? 0;
if (empty($goods_id)) {
return $this->response($this->error('', 'REQUEST_ID'));
}
if (empty($exchange_id)) {
return $this->response($this->error('', 'REQUEST_ID'));
}
$exchange_model = new ExchangeModel();
$condition = [
[ 'peg.id', '=', $exchange_id ],
[ 'peg.site_id', '=', $this->site_id ],
[ 'peg.state', '=', 1 ],
];
$list = $exchange_model->getExchangeSkuList($condition, $type);
if (!empty($list[ 'data' ])) {
foreach ($list[ 'data' ] as $k => $v) {
if (!empty($v[ 'goods_spec_format' ])) {
$goods_spec_format = $exchange_model->getGoodsSpecFormat($v[ 'exchange_id' ], $this->site_id, $v[ 'goods_spec_format' ]);
$list[ 'data' ][ $k ][ 'goods_spec_format' ] = json_encode($goods_spec_format);
}
}
}
return $this->response($list);
}
public function page()
{
$page = $this->params['page'] ?? 1;
$page_size = $this->params['page_size'] ?? PAGE_LIST_ROWS;
$type = $this->params['type'] ?? 1;//兑换类型1商品2优惠券3红包
//商品类型条件查询
$keyword = $this->params['keyword'] ?? ''; //关键词
$order = $this->params['order'] ?? '';//排序(综合、上新时间、价格)
$sort = $this->params['sort'] ?? '';//升序、降序
$min_point = $this->params['min_point'] ?? 0;//积分区间,小
$max_point = $this->params['max_point'] ?? 0;//积分区间,大
$category_id = $this->params['category_id'] ?? 0;//分类
$condition = [
[ 'peg.state', '=', 1 ],
[ 'peg.type', '=', $type ],
[ 'peg.site_id', '=', $this->site_id ]
];
if (!empty($keyword)) {
$condition[] = [ 'g.goods_name|peg.name', 'like', '%' . $keyword . '%' ];
}
// 非法参数进行过滤
if ($sort != 'desc' && $sort != 'asc') {
$sort = '';
}
// 非法参数进行过滤
if ($order != '') {
if ($order != 'create_time' && $order != 'point') {
$order = 'peg.sort';
} elseif ($order == 'create_time') {
$order = 'peg.create_time';
} else {
$order = 'peg.' . $order;
}
$order_by = $order . ' ' . $sort;
} else {
$config_model = new ConfigModel();
$sort_config = $config_model->getGoodsSort($this->site_id)[ 'data' ][ 'value' ];
$order_by = 'peg.sort ' . $sort_config[ 'type' ] . ',peg.create_time desc';
}
if ($min_point != '' && $max_point != '') {
$condition[] = [ 'peg.point', 'between', [ $min_point, $max_point ] ];
} elseif ($min_point != '') {
$condition[] = [ 'peg.point', '>=', $min_point ];
} elseif ($max_point != '') {
$condition[] = [ 'peg.point', '<=', $max_point ];
}
if (!empty($category_id)) {
$goods_category_model = new GoodsCategoryModel();
// 查询当前
$category_list = $goods_category_model->getCategoryList([ [ 'category_id', '=', $category_id ], [ 'site_id', '=', $this->site_id ] ], 'category_id,pid,level')[ 'data' ];
// 查询子级
$category_child_list = $goods_category_model->getCategoryList([ [ 'pid', '=', $category_id ], [ 'site_id', '=', $this->site_id ] ], 'category_id,pid,level')[ 'data' ];
$temp_category_list = [];
if (!empty($category_list)) {
$temp_category_list = $category_list;
} elseif (!empty($category_child_list)) {
$temp_category_list = $category_child_list;
}
if (!empty($temp_category_list)) {
$category_id_arr = [];
foreach ($temp_category_list as $k => $v) {
// 三级分类,并且都能查询到
if ($v[ 'level' ] == 3 && !empty($category_list) && !empty($category_child_list)) {
$category_id_arr[] = $v['pid'];
} else {
$category_id_arr[] = $v['category_id'];
}
}
$category_id_arr = array_unique($category_id_arr);
$temp_condition = [];
foreach ($category_id_arr as $ck => $cv) {
$temp_condition[] = '%,' . $cv . ',%';
}
$category_condition = $temp_condition;
$condition[] = [ 'g.category_id', 'like', $category_condition, 'or' ];
}
}
$field = 'peg.*';
$alias = 'peg';
$join = [];
if ($type == 1) {
$condition[] = [ 'g.is_delete', '=', 0 ];
$condition[] = [ 'g.goods_state', '=', 1 ];
$join = [
[ 'goods g', 'peg.type_id = g.goods_id', 'inner' ]
];
$field .= ',g.goods_name as name,g.goods_image as image, g.goods_stock as stock, g.stock_show,g.sale_show,(g.sale_num + g.virtual_sale) as sale_num';
} elseif ($type == 2) {
$field .= ',pct.type as coupon_type,pct.goods_type,pct.at_least,pct.money,pct.discount';
$join = [
[ 'promotion_coupon_type pct', 'peg.type_id = pct.coupon_type_id', 'inner' ]
];
}
$exchange_model = new ExchangeModel();
$list = $exchange_model->getExchangeGoodsPageList($condition, $page, $page_size, $order_by, $field, $alias, $join);
return $this->response($list);
}
}

View File

@@ -0,0 +1,83 @@
<?php
/**
*/
namespace addon\pointexchange\api\controller;
use app\api\controller\BaseApi;
use addon\pointexchange\model\Order as OrderModel;
/**
* 积分兑换订单
*/
class Order extends BaseApi
{
/**
* 基础信息
*/
public function info()
{
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$order_id = $this->params['order_id'] ?? 0;
if (empty($order_id)) {
return $this->response($this->error('', 'REQUEST_ORDER_ID'));
}
$condition = [
[ 'order_id', '=', $order_id ],
[ 'member_id', '=', $this->member_id ],
[ 'site_id', '=', $this->site_id ],
];
$field = '*';
$exchange_model = new OrderModel();
$info = $exchange_model->getOrderInfo($condition, $field);
return $this->response($info);
}
public function page()
{
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$page = $this->params['page'] ?? 1;
$page_size = $this->params['page_size'] ?? PAGE_LIST_ROWS;
$order_status = $this->params['order_status'] ?? 'all';
$condition = [
[ 'member_id', '=', $this->member_id ],
[ 'site_id', '=', $this->site_id ],
];
if ($order_status != 'all') $condition[] = ['order_status', '=', $order_status];
$order = 'create_time desc';
$field = '*';
$exchange_model = new OrderModel();
$list = $exchange_model->getExchangePageList($condition, $page, $page_size, $order, $field);
return $this->response($list);
}
/**
* 关闭订单
* @return false|string
*/
public function close(){
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$order_id = $this->params['order_id'] ?? 0;
$exchange_model = new OrderModel();
$result = $exchange_model->closeOrder($order_id);
return $this->response($result);
}
}

View File

@@ -0,0 +1,99 @@
<?php
namespace addon\pointexchange\api\controller;
use app\api\controller\BaseApi;
use addon\pointexchange\model\OrderCreate as OrderCreateModel;
/**
* 订单创建
*
*/
class Ordercreate extends BaseApi
{
/**
* 创建订单
*/
public function create()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'order_key' => $this->params[ 'order_key' ] ?? '',
'member_id' => $this->member_id,
'site_id' => $this->site_id,
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'delivery' => isset($this->params[ 'delivery' ]) && !empty($this->params[ 'delivery' ]) ? json_decode($this->params[ 'delivery' ], true) : [],
'member_address' => isset($this->params[ 'member_address' ]) && !empty($this->params[ 'member_address' ]) ? json_decode($this->params[ 'member_address' ], true) : [],
'latitude' => $this->params[ 'latitude' ] ?? '',
'longitude' => $this->params[ 'longitude' ] ?? '',
// 'buyer_ask_delivery_time' => !empty($this->params[ 'buyer_ask_delivery_time' ]) ? $this->params[ 'buyer_ask_delivery_time' ] : '',
'buyer_message' => $this->params[ 'buyer_message' ],
];
$res = $order_create->setParam($data)->create();
return $this->response($res);
}
/**
* 计算信息
*/
public function calculate()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'order_key' => $this->params[ 'order_key' ] ?? '',
'member_id' => $this->member_id,
'site_id' => $this->site_id,
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'delivery' => isset($this->params[ 'delivery' ]) && !empty($this->params[ 'delivery' ]) ? json_decode($this->params[ 'delivery' ], true) : [],
'member_address' => isset($this->params[ 'member_address' ]) && !empty($this->params[ 'member_address' ]) ? json_decode($this->params[ 'member_address' ], true) : [],
'latitude' => $this->params[ 'latitude' ] ?? '',
'longitude' => $this->params[ 'longitude' ] ?? '',
// 'buyer_ask_delivery_time' => !empty($this->params[ 'buyer_ask_delivery_time' ]) ? $this->params[ 'buyer_ask_delivery_time' ] : '',
];
$res = $order_create->setParam($data)->confirm();
return $this->response($this->success($res));
}
/**
* 待支付订单 数据初始化
* @return string
*/
public function payment()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'id' => $this->params[ 'id' ] ?? '',//兑换id
'num' => $this->params[ 'num' ] ?? 1,//兑换数量(买几套)
'sku_id' => $this->params[ 'sku_id' ] ?? 0,
'site_id' => $this->site_id,//站点id
'member_id' => $this->member_id,
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'latitude' => $this->params[ 'latitude' ] ?? '',
'longitude' => $this->params[ 'longitude' ] ?? '',
];
if (empty($data[ 'id' ])) {
return $this->response($this->error('', '缺少必填参数商品数据'));
}
if($data['num'] < 1){
return $this->response($this->error('', '兑换数量不能小于1'));
}
$res = $order_create->setParam($data)->payment();
return $this->response($this->success($res));
}
}

View File

@@ -0,0 +1,63 @@
<?php
return [
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据json格式' ]
'template' => [],
// 后台自定义组件——装修
'util' => [],
// 自定义页面路径
'link' => [
[
'name' => 'INTEGRAL',
'title' => '积分商城',
'parent' => 'PROMOTION_ROOT',
'wap_url' => '',
'web_url' => '',
'sort' => 0,
'child_list' => [
[
'name' => 'INTEGRAL_STORE',
'title' => '积分商城',
'wap_url' => '/pages_promotion/point/list',
'web_url' => '',
'sort' => 0
],
[
'name' => 'STORE_MY_INTEGRAL',
'title' => '我的积分',
'wap_url' => '/pages_tool/member/point',
'web_url' => '',
'sort' => 0
],
[
'name' => 'INTEGRAL_CONVERSION',
'title' => '兑换订单',
'wap_url' => '/pages_promotion/point/order_list',
'web_url' => '',
'sort' => 0
]
]
]
],
// 自定义图标库
'icon_library' => [],
// uni-app 组件,格式:[ 'name' => '组件名称/文件夹名称', 'path' => '文件路径/目录路径' ]多个逗号隔开自定义组件名称前缀必须是diy-,也可以引用第三方组件
'component' => [],
// uni-app 页面,多个逗号隔开
'pages' => [],
// 模板信息,格式:'title' => '模板名称', 'name' => '模板标识', 'cover' => '模板封面图', 'preview' => '模板预览图', 'desc' => '模板描述'
'info' => [],
// 主题风格配色格式可以自由定义扩展【在uni-app中通过this.themeStyle... 获取定义的颜色字段例如this.themeStyle.main_color】
'theme' => [],
// 自定义页面数据,格式:[ 'title' => '页面名称', 'name' => "页面标识", 'value' => [页面数据json格式] ]
'data' => []
];

View File

@@ -0,0 +1,35 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
//展示活动
'ShowPromotion' => [
'addon\pointexchange\event\ShowPromotion',
],
'PointexchangeOrderPayNotify' => [
'addon\pointexchange\event\PointexchangeOrderPayNotify',
],
'MemberAccountFromType' => [
'addon\pointexchange\event\MemberAccountFromType',
],
'OrderClose' => [
'addon\pointexchange\event\OrderClose'
],
// 订单营销活动类型
'OrderPromotionType' => [
'addon\pointexchange\event\OrderPromotionType',
],
// 优惠券获取来源
'CouponGetType' => [
'addon\pointexchange\event\CouponGetType',
],
],
'subscribe' => [
],
];

View File

@@ -0,0 +1,20 @@
<?php
/**
*/
return [
'name' => 'pointexchange',
'title' => '积分商城',
'description' => '积分购买商品,形成积分营销闭环',
'type' => 'tool', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '1.0',
'version_no' => '100000',
'content' => '',
];

View File

@@ -0,0 +1,81 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'PROMOTION_POINGEXCHANGE_ROOT',
'title' => '积分商城',
'url' => 'pointexchange://shop/exchange/lists',
'parent' => 'PROMOTION_TOOL',
'is_show' => 1,
'is_control' => 1,
'is_icon' => 0,
'picture' => 'addon/pointexchange/shop/view/public/img/point_site.png',
'picture_select' => '',
'sort' => 100,
'child_list' => [
[
'name' => 'PROMOTION_POINGEXCHANGE',
'title' => '积分商品',
'url' => 'pointexchange://shop/exchange/lists',
'is_show' => 0,
'is_control' => 1,
'is_icon' => 0,
'picture' => '',
'picture_select' => '',
'sort' => 1,
'child_list' => [
[
'name' => 'PROMOTION_POINGEXCHANGE_ADD',
'title' => '添加商品',
'url' => 'pointexchange://shop/exchange/add',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_POINGEXCHANGE_EDIT',
'title' => '编辑商品',
'url' => 'pointexchange://shop/exchange/edit',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_POINGEXCHANGE_CLOSE',
'title' => '下架商品',
'url' => 'pointexchange://shop/exchange/close',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_POINGEXCHANGE_DELETE',
'title' => '删除商品',
'url' => 'pointexchange://shop/exchange/delete',
'sort' => 1,
'is_show' => 0
],
]
],
]
],
[
'name' => 'PROMOTION_POINGEXCHANGE_ORDER_LISTS',
'title' => '积分兑换',
'url' => 'pointexchange://shop/pointexchange/lists',
'parent' => 'ORDER_POINT_MANAGE',
'sort' => 6,
'is_show' => 1,
'child_list' => [
[
'name' => 'PROMOTION_POINGEXCHANGE_DETAIL',
'title' => '订单详情',
'url' => 'pointexchange://shop/pointexchange/detail',
'sort' => 1,
'is_show' => 0
],
]
],
];

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 优惠券来源类型
*/
class CouponGetType
{
/**
* 执行安装
*/
public function handle()
{
return [ 7 => '积分兑换'];
}
}

View File

@@ -0,0 +1,28 @@
<?php
/**
*/
namespace addon\pointexchange\event;
use addon\pointexchange\model\Order;
/**
* 积分兑换订单关闭
*/
class CronExchangeOrderClose
{
// 行为扩展的执行入口必须是run
public function handle($data)
{
$order = new Order();
$order->closeOrder($data['relate_id']);
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@@ -0,0 +1,46 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 会员账户变化来源类型
*/
class MemberAccountFromType
{
public function handle($data)
{
$from_type = [
'point' => [
'pointexchange' => [
'type_name' => '积分兑换',
'type_url' => ''
]
],
// 'point' => [
// 'pointexchangerefund' => [
// 'type_name' => '积分兑换退还',
// 'type_url' => ''
// ],
//
// ]
];
if($data == ''){
return $from_type;
}else{
return $from_type[$data] ?? [];
}
}
}

View File

@@ -0,0 +1,41 @@
<?php
/**
*/
namespace addon\pointexchange\event;
use addon\pointexchange\model\Order;
/**
* 订单关闭
*/
class OrderClose
{
/**
* 订单关闭
* @param $param
* @return array|int|mixed|void
*/
public function handle($param)
{
$order_model = new Order();
$order_info_result = $order_model->getOrderInfo([ [ 'relate_order_id', '=', $param[ 'order_id' ] ] ]);
if ($order_info_result[ 'code' ] < 0 || empty($order_info_result[ 'data' ])) {
return $order_info_result;
}
if (empty($order_info_result[ 'data' ])) {
$order_info_result[ 'data' ][ 'order_id' ] = $param[ 'order_id' ];
}
$res = $order_model->closeOrder($order_info_result[ 'data' ][ 'order_id' ]);
return $res;
}
}

View File

@@ -0,0 +1,29 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 订单营销活动类型
*/
class OrderPromotionType
{
/**
* 订单营销活动类型
* @return array
*/
public function handle()
{
return ["name" => "积分兑换", "type" => "pointexchange"];
}
}

View File

@@ -0,0 +1,29 @@
<?php
/**
*/
namespace addon\pointexchange\event;
use addon\pointexchange\model\Order;
/**
* 积分兑换订单异步回调执行
*/
class PointexchangeOrderPayNotify
{
// 行为扩展的执行入口必须是run
public function handle($data)
{
$order = new Order();
$order->orderPay($data);
}
}

View File

@@ -0,0 +1,52 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 活动展示
*/
class ShowPromotion
{
/**
* 活动展示
* @return array
*/
public function handle()
{
$data = [
'admin' => [
],
'shop' => [
[
//插件名称
'name' => 'pointexchange',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'shop',
//展示主题
'title' => '积分商城',
//展示介绍
'description' => '客户积分兑换更多好物',
//展示图标
'icon' => 'addon/pointexchange/icon.png',
//跳转链接
'url' => 'pointexchange://shop/exchange/lists',
],
],
];
return $data;
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\pointexchange\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return error("系统插件不能删除");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,724 @@
<?php
/**
*/
namespace addon\pointexchange\model;
use app\model\BaseModel;
use addon\coupon\model\Coupon;
use app\model\goods\Goods;
use app\model\upload\Upload;
/**
* 积分兑换
*/
class Exchange extends BaseModel
{
public $type = [
1 => [
'name' => 'goods',
'title' => '兑换商品',
],
2 => [
'name' => 'coupon',
'title' => '兑换优惠券',
],
3 => [
'name' => 'balance',
'title' => '兑换红包',
],
];
/**
* 添加积分兑换
* @param array $data
*/
public function addExchange($data)
{
model('promotion_exchange')->startTrans();
try {
$exchange_goods_data = [
'site_id' => $data[ 'site_id' ],
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'state' => $data[ 'state' ],
'create_time' => time(),
];
if ($data[ 'type' ] == 1) {
$exchange_goods = $data[ 'goods_data' ];
foreach ($exchange_goods as $k => $v) {
$exist = model('promotion_exchange_goods')->getInfo([ [ 'type', '=', 1 ], [ 'type_id', '=', $v[ 'goods_id' ] ] ], 'id');
if (!empty($exist)) {
return $this->error('', '商品已存在,请不要重复添加');
}
$sku_model = new Goods();
$sku_info = $sku_model->getGoodsSkuInfo([ [ 'sku_id', '=', $v[ 'sku_list' ][ 0 ][ 'sku_id' ] ] ], 'sku_name,sku_image,price,stock,goods_content')[ 'data' ];
$exchange_goods_data[ 'type_id' ] = $v[ 'goods_id' ];
$exchange_goods_data[ 'name' ] = $sku_info[ 'sku_name' ];
$exchange_goods_data[ 'image' ] = $sku_info[ 'sku_image' ];
$exchange_goods_data[ 'point' ] = $v[ 'sku_list' ][ 0 ][ 'point' ];
$exchange_goods_data[ 'price' ] = $v[ 'sku_list' ][ 0 ][ 'exchange_price' ];
$exchange_goods_data[ 'content' ] = $sku_info[ 'goods_content' ];
$exchange_goods_data[ 'rule' ] = $data[ 'rule' ];
$exchange_goods_data[ 'pay_type' ] = $v[ 'sku_list' ][ 0 ][ 'exchange_price' ] ? 1 : 0;
$exchange_goods_id = model('promotion_exchange_goods')->add($exchange_goods_data);
foreach ($v[ 'sku_list' ] as $index => $item) {
$sku_info = $sku_model->getGoodsSkuInfo([ [ 'sku_id', '=', $item[ 'sku_id' ] ] ], 'sku_name,sku_image,price,stock,goods_content')[ 'data' ];
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'type_id' => $item[ 'sku_id' ],
'state' => $data[ 'state' ],
'rule' => $data[ 'rule' ],
'name' => $sku_info[ 'sku_name' ],
'image' => $sku_info[ 'sku_image' ],
'stock' => $sku_info[ 'stock' ],
'pay_type' => empty($item[ 'exchange_price' ]) ? 0 : 1,
'point' => $item[ 'point' ],
'market_price' => $sku_info[ 'price' ],
'price' => $item[ 'exchange_price' ],
'limit_num' => $item[ 'limit_num' ],
'create_time' => time(),
'content' => $sku_info[ 'goods_content' ],
'is_free_shipping' => $data[ 'is_free_shipping' ], //是否免邮0不免邮 1免邮
'delivery_type' => $data[ 'delivery_type' ] ?? 1, //运费类型( 0 固定运费 1运费模板 2按照商品
'shipping_template' => $data[ 'shipping_template' ], //运费模板
'delivery_price' => $data[ 'delivery_price' ] ?? 0 //运费
];
model('promotion_exchange')->add($exchange_data);
}
}
} elseif ($data[ 'type' ] == 2) {
$exist = model('promotion_exchange_goods')->getInfo([ [ 'type', '=', 2 ], [ 'type_id', '=', $data[ 'coupon_type_id' ] ] ], 'id');
if (!empty($exist)) {
return $this->error('', '该优惠券已存在,请不要重复添加');
}
$coupon = new Coupon();
$coupon_type_info = $coupon->getCouponTypeInfo([ [ 'coupon_type_id', '=', $data[ 'coupon_type_id' ] ] ], 'coupon_type_id,coupon_name,money,count,image,status,type,discount')[ 'data' ];
$exchange_goods_data[ 'type_id' ] = $data[ 'coupon_type_id' ];
$exchange_goods_data[ 'name' ] = $coupon_type_info[ 'coupon_name' ];
$exchange_goods_data[ 'image' ] = $coupon_type_info[ 'image' ];
$exchange_goods_data[ 'point' ] = $data[ 'point' ];
$exchange_goods_data[ 'content' ] = $data[ 'content' ];
$exchange_goods_id = model('promotion_exchange_goods')->add($exchange_goods_data);
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'state' => $data[ 'state' ],
'type_id' => $data[ 'coupon_type_id' ],
'name' => $coupon_type_info[ 'coupon_name' ],
'image' => $coupon_type_info[ 'image' ],
'stock' => $data[ 'stock' ],
'pay_type' => 0,
'point' => $data[ 'point' ],
'create_time' => time(),
'content' => $data[ 'content' ],
];
if ($coupon_type_info[ 'type' ] == 'reward') {
$exchange_data[ 'market_price' ] = $coupon_type_info[ 'money' ];
} elseif ($coupon_type_info[ 'type' ] == 'discount') {
$exchange_data[ 'market_price' ] = $coupon_type_info[ 'discount' ];
}
model('promotion_exchange')->add($exchange_data);
} elseif ($data[ 'type' ] == 3) {
$exchange_goods_data[ 'name' ] = $data[ 'name' ];
$exchange_goods_data[ 'image' ] = $data[ 'image' ];
$exchange_goods_data[ 'point' ] = $data[ 'point' ];
$exchange_goods_data[ 'balance' ] = $data[ 'balance' ];
$exchange_goods_data[ 'content' ] = $data[ 'content' ];
$exchange_goods_id = model('promotion_exchange_goods')->add($exchange_goods_data);
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'state' => $data[ 'state' ],
'name' => $data[ 'name' ],
'image' => $data[ 'image' ],
'stock' => $data[ 'stock' ],
'pay_type' => 0,
'point' => $data[ 'point' ],
'balance' => $data[ 'balance' ],
'create_time' => time(),
'content' => $data[ 'content' ],
];
model('promotion_exchange')->add($exchange_data);
}
model('promotion_exchange')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_exchange')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 编辑积分兑换
* @param array $data
*/
public function editExchange($data)
{
model('promotion_exchange')->startTrans();
try {
$exchange_goods_id = $data[ 'id' ];
if ($data[ 'type' ] == 1) {
$goods_data = $data[ 'goods_data' ];
$sku_model = new Goods();
$sku_info = $sku_model->getGoodsSkuInfo([ [ 'sku_id', '=', $goods_data[ 0 ][ 'sku_id' ] ] ], 'sku_name,sku_image,price,stock,goods_content')[ 'data' ];
$exchange_goods_data = [
'modify_time' => time(),
'pay_type' => $goods_data[ 0 ][ 'exchange_price' ] ? 1 : 0,
];
$exchange_goods_data[ 'name' ] = $sku_info[ 'sku_name' ];
$exchange_goods_data[ 'image' ] = $sku_info[ 'sku_image' ];
$exchange_goods_data[ 'point' ] = $goods_data[ 0 ][ 'point' ];
$exchange_goods_data[ 'price' ] = $goods_data[ 0 ][ 'exchange_price' ];
$exchange_goods_data[ 'content' ] = $sku_info[ 'goods_content' ];
$exchange_goods_data[ 'rule' ] = $data[ 'rule' ];
$exchange_goods_data[ 'state' ] = $data[ 'state' ];
model('promotion_exchange_goods')->update($exchange_goods_data, [ [ 'id', '=', $exchange_goods_id ] ]);
model('promotion_exchange')->delete([ [ 'exchange_goods_id', '=', $exchange_goods_id ] ]);
foreach ($goods_data as $index => $item) {
$sku_info = $sku_model->getGoodsSkuInfo([ [ 'sku_id', '=', $item[ 'sku_id' ] ] ], 'sku_name,sku_image,price,stock,goods_content')[ 'data' ];
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'type_id' => $item[ 'sku_id' ],
'state' => $data[ 'state' ],
'rule' => $data[ 'rule' ],
'name' => $sku_info[ 'sku_name' ],
'image' => $sku_info[ 'sku_image' ],
'stock' => $sku_info[ 'stock' ],
'pay_type' => empty($item[ 'exchange_price' ]) ? 0 : 1,
'point' => $item[ 'point' ],
'market_price' => $sku_info[ 'price' ],
'price' => $item[ 'exchange_price' ],
'limit_num' => $item[ 'limit_num' ],
'create_time' => time(),
'content' => $sku_info[ 'goods_content' ],
'is_free_shipping' => $data[ 'is_free_shipping' ], //是否免邮0不免邮 1免邮
'delivery_type' => $data[ 'delivery_type' ] ?? 1, //运费类型( 0 固定运费 1运费模板 2按照商品
'shipping_template' => $data[ 'shipping_template' ], //运费模板
'delivery_price' => $data[ 'delivery_price' ] ?? 0 //运费
];
model('promotion_exchange')->add($exchange_data);
}
} else if ($data[ 'type' ] == 2) {
$coupon = new Coupon();
$coupon_type_info = $coupon->getCouponTypeInfo([ [ 'coupon_type_id', '=', $data[ 'coupon_type_id' ] ] ], 'coupon_type_id,coupon_name,money,count,image,status,type,discount')[ 'data' ];
$exchange_goods_data = [];
$exchange_goods_data[ 'type_id' ] = $data[ 'coupon_type_id' ];
$exchange_goods_data[ 'name' ] = $coupon_type_info[ 'coupon_name' ];
$exchange_goods_data[ 'image' ] = $coupon_type_info[ 'image' ];
$exchange_goods_data[ 'point' ] = $data[ 'point' ];
$exchange_goods_data[ 'content' ] = $data[ 'content' ];
$exchange_goods_data[ 'state' ] = $data[ 'state' ];
model('promotion_exchange_goods')->update($exchange_goods_data, [ [ 'id', '=', $exchange_goods_id ] ]);
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'state' => $data[ 'state' ],
'type_id' => $data[ 'coupon_type_id' ],
'name' => $coupon_type_info[ 'coupon_name' ],
'image' => $coupon_type_info[ 'image' ],
'stock' => $data[ 'stock' ],
'pay_type' => 0,
'point' => $data[ 'point' ],
'create_time' => time(),
'content' => $data[ 'content' ],
];
if ($coupon_type_info[ 'type' ] == 'reward') {
$exchange_data[ 'market_price' ] = $coupon_type_info[ 'money' ];
} elseif ($coupon_type_info[ 'type' ] == 'discount') {
$exchange_data[ 'market_price' ] = $coupon_type_info[ 'discount' ];
}
model('promotion_exchange')->delete([ [ 'exchange_goods_id', '=', $exchange_goods_id ] ]);
model('promotion_exchange')->add($exchange_data);
} else if ($data[ 'type' ] == 3) {
$exchange_goods_data = [];
$exchange_goods_data[ 'name' ] = $data[ 'name' ];
$exchange_goods_data[ 'image' ] = $data[ 'image' ];
$exchange_goods_data[ 'point' ] = $data[ 'point' ];
$exchange_goods_data[ 'balance' ] = $data[ 'balance' ];
$exchange_goods_data[ 'content' ] = $data[ 'content' ];
$exchange_goods_data[ 'state' ] = $data[ 'state' ];
$exchange_goods_info = model('promotion_exchange_goods')->getInfo([ [ 'id', '=', $exchange_goods_id ] ]);
if (!empty($exchange_goods_info[ 'image' ]) && !empty($data[ 'image' ]) && $exchange_goods_info[ 'image' ] != $data[ 'image' ]) {
$upload_model = new Upload();
$upload_model->deletePic($exchange_goods_info[ 'image' ], $data[ 'site_id' ]);
}
model('promotion_exchange_goods')->update($exchange_goods_data, [ [ 'id', '=', $exchange_goods_id ] ]);
$exchange_data = [
'site_id' => $data[ 'site_id' ],
'exchange_goods_id' => $exchange_goods_id,
'type' => $data[ 'type' ],
'type_name' => $data[ 'type_name' ],
'state' => $data[ 'state' ],
'name' => $data[ 'name' ],
'image' => $data[ 'image' ],
'stock' => $data[ 'stock' ],
'pay_type' => 0,
'point' => $data[ 'point' ],
'balance' => $data[ 'balance' ],
'create_time' => time(),
'content' => $data[ 'content' ],
];
model('promotion_exchange')->delete([ [ 'exchange_goods_id', '=', $exchange_goods_id ] ]);
model('promotion_exchange')->add($exchange_data);
}
model('promotion_exchange')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_exchange')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 删除积分兑换
* @param string $ids
*/
public function deleteExchange($ids)
{
$list = model("promotion_exchange")->getList([ [ 'exchange_goods_id', 'in', $ids ] ]);
if ($list) {
foreach ($list as $k => $v) {
if (!empty($v[ 'image' ])) {
$upload_model = new Upload();
$upload_model->deletePic($v[ 'image' ], $v[ 'site_id' ]);
}
}
}
model("promotion_exchange")->delete([ [ 'exchange_goods_id', 'in', $ids ] ]);
model("promotion_exchange_goods")->delete([ [ 'id', 'in', $ids ] ]);
return $this->success();
}
/**
* 获取积分兑换信息
* @param int $id
*/
public function getExchangeInfo($id, $field = '*', $sku_id = 0)
{
$condition = [
[ 'exchange_goods_id', '=', $id ]
];
if ($sku_id) $condition[] = [ 'type_id', '=', $sku_id ];
$info = model("promotion_exchange")->getInfo($condition, $field);
if (!empty($info) && !empty($info[ 'type' ])) {
switch ( $info[ 'type' ] ) {
case 1:
//商品
$goods = new Goods();
$goods_sku_info = $goods->getGoodsSkuInfo([ [ 'sku_id', '=', $info[ 'type_id' ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ] ], 'sku_id,sku_name,stock')[ 'data' ];
if (!empty($goods_sku_info)) {
$goods_sku_info[ 'stock' ] = numberFormat($goods_sku_info[ 'stock' ]);
$info = array_merge($info, $goods_sku_info);
} else {
$info = [];
}
break;
case 2:
//优惠券
$coupon = new Coupon();
$coupon_type_info = $coupon->getCouponTypeInfo([ [ 'coupon_type_id', '=', $info[ 'type_id' ] ] ], 'type as coupon_type,discount_limit,count,lead_count')[ 'data' ];
if (!empty($coupon_type_info)) {
$info = array_merge($info, $coupon_type_info);
} else {
$info = [];
}
break;
case 3:
//余额红包
break;
}
}
return $this->success($info);
}
/**
* 获取积分兑换商品详情
* @param $id
* @param $site_id
* @return array
*/
public function getExchangeGoodsDetail($id, $site_id)
{
$info = model("promotion_exchange_goods")->getInfo([ [ 'id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'id,type,type_name,type_id,name,image,pay_type,point,price,delivery_price,balance,state,content,rule');
// 兑换类型1商品2优惠券3红包
switch ( $info[ 'type' ] ) {
case 1:
//商品
$goods_sku = model('goods_sku')->getList([ [ 'goods_id', '=', $info[ 'type_id' ] ], [ 'is_delete', '=', 0 ], [ 'goods_state', '=', 1 ] ], 'stock, price,sku_id,sku_name,discount_price,stock as goods_stock,sku_image,sku_images,goods_id,site_id,goods_content');
$exchange_list = model("promotion_exchange")->getList([ [ 'exchange_goods_id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'limit_num, id,type,type_name,type_id,name,image,pay_type,point,price,delivery_price,balance,state,content,delivery_type,is_free_shipping,shipping_template,rule');
foreach ($goods_sku as $k => $v) {
$goods_sku[ $k ][ 'is_select' ] = 0;
$goods_sku[ $k ][ 'exchange_price' ] = 0;
$goods_sku[ $k ][ 'point' ] = 0;
$goods_sku[ $k ][ 'limit_num' ] = 0;
$goods_sku[ $k ][ 'stock' ] = numberFormat($goods_sku[ $k ][ 'stock' ]);
$goods_sku[ $k ][ 'goods_stock' ] = numberFormat($goods_sku[ $k ][ 'goods_stock' ]);
foreach ($exchange_list as $key => $val) {
if ($val[ 'type_id' ] == $v[ 'sku_id' ]) {
$goods_sku[ $k ][ 'is_select' ] = 1;
$goods_sku[ $k ][ 'exchange_price' ] = $val[ 'price' ];
$goods_sku[ $k ][ 'limit_num' ] = $val[ 'limit_num' ];
$goods_sku[ $k ][ 'point' ] = $val[ 'point' ];
}
}
}
$info[ 'goods_sku' ] = $goods_sku;
$info[ 'exchange_goods' ] = $exchange_list;
break;
case 2:
//优惠券
$coupon = new Coupon();
$coupon_type_info = $coupon->getCouponTypeInfo([ [ 'coupon_type_id', '=', $info[ 'type_id' ] ] ], 'coupon_type_id,coupon_name,money,count as stock,status,lead_count,max_fetch,at_least,end_time,validity_type,fixed_term,goods_type,is_limit,type as coupon_type,discount_limit,discount')[ 'data' ];
$exchange_info = model("promotion_exchange")->getInfo([ [ 'exchange_goods_id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'market_price,stock');
if (!empty($coupon_type_info)) {
$info = array_merge($info, $coupon_type_info);
} else {
$info = [];
}
$info = array_merge($info, $exchange_info);
break;
case 3:
//余额红包
$exchange_info = model("promotion_exchange")->getInfo([ [ 'exchange_goods_id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'stock');
if (!empty($exchange_info)) {
$info = array_merge($info, $exchange_info);
} else {
$info = [];
}
break;
}
if (!empty($info)) {
return $this->success($info);
} else {
return $this->error('', '该兑换物品已失效');
}
}
/**
* 获取积分兑换列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @param string $alias
* @param array $join
* @return array
*/
public function getExchangeList($condition = [], $field = '*', $order = '', $limit = null, $alias = '', $join = [])
{
$list = model('promotion_exchange')->getList($condition, $field, $order, $alias, $join, '', $limit);
return $this->success($list);
}
/**
* 获取积分兑换列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getExchangePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = '*', $alias = '', $join = [])
{
$list = model('promotion_exchange')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 获取积分兑换列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @return array
*/
public function getExchangeGoodsList($condition = [], $field = '*', $order = '', $limit = null)
{
$list = model('promotion_exchange_goods')->getList($condition, $field, $order, '', '', '', $limit);
return $this->success($list);
}
/**
* 获取积分兑换列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getExchangeGoodsPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = '*', $alias = '', $join = [])
{
$list = model('promotion_exchange_goods')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
if(!empty($list['list']))
{
$goods_id_array = [];
foreach ($list['list'] as $k => $v)
{
if($v['type'] == 1)
{
$goods_id_array[] = $v['type_id'];
}
}
if(!empty($goods_id_array))
{
$goods_array = [];
$goods_ids = implode(",", $goods_id_array);
$goods_list = model('goods')->getList([ [ 'goods_id', 'in', $goods_ids ], ['is_delete', '=', 0] ], "goods_id, goods_name, is_delete");
if(!empty($goods_list))
{
$key = array_column($goods_list, 'goods_id');
$goods_array = array_combine($key, $goods_list);
}
}
foreach ($list[ 'list' ] as $k => $v) {
if ($v[ 'type' ] == 1) {
$goods_info = $goods_array[$v['type_id']] ?? [];
if (empty($goods_info)) {
unset($list[ 'list' ][ $k ]);
} else {
if ($goods_info[ 'is_delete' ] == 1) {
unset($list[ 'list' ][ $k ]);
} else {
$list[ 'list' ][ $k ][ 'g_name' ] = $goods_info[ 'goods_name' ];
}
}
}
}
}
return $this->success($list);
}
/**
* 增加库存
* @param $param
*/
public function incStock($param)
{
$condition = array (
[ "id", "=", $param[ "id" ] ]
);
$num = $param[ "num" ];
$info = model("promotion_exchange")->getInfo($condition, "stock, name");
if (empty($info))
return $this->error(-1, "");
//编辑sku库存
$result = model("promotion_exchange")->setInc($condition, "stock", $num);
return $this->success($result);
}
/**
* 减少库存
* @param $param
*/
public function decStock($param)
{
$condition = array (
[ "id", "=", $param[ "id" ] ]
);
$num = $param[ "num" ];
$info = model("promotion_exchange")->getInfo($condition, "stock, name, type");
if (empty($info))
return $this->error();
if ($info[ 'type' ] == 2 && $info[ 'stock' ] == -1) {
return $this->success();
}
if ($info[ "stock" ] < 0) {
return $this->error('', $info[ "name" ] . "库存不足!");
}
//编辑sku库存
$result = model("promotion_exchange")->setDec($condition, "stock", $num);
if ($result === false)
return $this->error();
return $this->success($result);
}
/**
* 修改标签排序
* @param $sort
* @param $id
* @return array
*/
public function modifyExchangeSort($sort, $id)
{
$res = model('promotion_exchange_goods')->update([ 'sort' => $sort ], [ [ 'id', '=', $id ] ]);
return $this->success($res);
}
/**
* 兑换商品详情
* @param array $condition
* @param int $type
* @return array
*/
public function getExchangeDetail($condition = [], $type = 1)
{
$alias = 'pe';
$field = 'peg.type,peg.id as exchange_id, pe.id,pe.type_id as sku_id,peg.type_id as goods_id,pe.pay_type,pe.point, pe.price as exchange_price, pe.limit_num,
pe.delivery_price,pe.balance,pe.state,pe.content,pe.exchange_goods_id,pe.rule';
$join = [
[ 'promotion_exchange_goods peg', 'pe.exchange_goods_id = peg.id', 'inner' ]
];
if ($type == 1) {
$condition[] = [ 'g.goods_state', '=', 1 ];
$condition[] = [ 'g.is_delete', '=', 0 ];
$field .= ',sku.site_id,sku.sku_name,sku.sku_spec_format,sku.price,sku.promotion_type,sku.stock,sku.click_num,
(sku.sale_num + sku.virtual_sale) as sale_num,sku.collect_num,sku.sku_image,
sku.sku_images,sku.site_id,sku.goods_content,sku.goods_state,sku.is_virtual,
sku.is_free_shipping,sku.goods_spec_format,sku.goods_attr_format,sku.introduction,
sku.unit,sku.video_url,sku.evaluate,sku.goods_service_ids,g.goods_image,g.goods_stock,g.goods_name,sku.qr_id,g.stock_show,g.sale_show';
$join[] = [ 'goods_sku sku', 'pe.type_id = sku.sku_id', 'inner' ];
$join[] = [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ];
} else if ($type == 2) {
$join[] = [ 'promotion_coupon_type pct', 'pct.coupon_type_id = peg.type_id', 'inner' ];
$field .= ',pe.stock,pct.type as coupon_type,pct.discount_limit,pct.image,pct.coupon_name as name,pct.count, pct.lead_count
,pct.money, pct.discount, pct.at_least, pct.validity_type,pct.fixed_term,pct.end_time, pct.image';
// $condition[] = [ 'pct.is_show', '=', 1 ];
// $condition[] = [ 'pct.is_forbidden', '=', 0 ];
} else if ($type == 3) {
$field .= ',pe.stock,pe.name,pe.image,pe.balance';
}
$info = model('promotion_exchange')->getInfo($condition, $field, $alias, $join);
if (!empty($info)) {
if (isset($info[ 'stock' ])) {
$info[ 'stock' ] = numberFormat($info[ 'stock' ]);
}
if (isset($info[ 'sale_num' ])) {
$info[ 'sale_num' ] = numberFormat($info[ 'sale_num' ]);
}
}
return $this->success($info);
}
/**
* 兑换商品详情
* @param array $condition
* @param string $field
* @return array
*/
public function getExchangeSkuList($condition = [], $type = 1)
{
$alias = 'pe';
$field = 'peg.type,peg.id as exchange_id, pe.id,pe.type_id as sku_id,peg.type_id as goods_id,pe.pay_type,pe.point, pe.price as exchange_price, pe.limit_num,
pe.delivery_price,pe.balance,pe.state,pe.exchange_goods_id,pe.rule';
$join = [
[ 'promotion_exchange_goods peg', 'pe.exchange_goods_id = peg.id', 'inner' ]
];
if ($type == 1) {
$condition[] = [ 'g.goods_state', '=', 1 ];
$condition[] = [ 'g.is_delete', '=', 0 ];
$field .= ',sku.sku_name,sku.sku_spec_format,sku.price,sku.stock,sku.sku_image,sku.sku_images,sku.goods_spec_format,g.goods_image';
$join[] = [ 'goods_sku sku', 'pe.type_id = sku.sku_id', 'inner' ];
$join[] = [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ];
} else if ($type == 2) {
$join[] = [ 'promotion_coupon_type pct', 'pct.coupon_type_id = peg.type_id', 'inner' ];
$field .= ',pe.stock,pct.type as coupon_type,pct.discount_limit,pct.image,pct.coupon_name as name,pct.count, pct.lead_count
,pct.money, pct.discount, pct.at_least, pct.validity_type,pct.fixed_term,pct.end_time, pct.image';
} else if ($type == 3) {
$field .= ',pe.stock,pe.name,pe.image,pe.balance';
}
$list = model('promotion_exchange')->getList($condition, $field, '', $alias, $join);
foreach ($list as $k => $v) {
if (isset($v[ 'stock' ])) {
$list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
}
}
return $this->success($list);
}
/**
* 判断规格值是否禁用
* @param $id
* @param $site_id
* @param string $goods_spec_format
* @return int|mixed
*/
public function getGoodsSpecFormat($id, $site_id, $goods_spec_format = '')
{
//获取活动参与的商品sku_ids
$sku_ids = model('promotion_exchange')->getColumn([ [ 'exchange_goods_id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'type_id');
$goods_model = new Goods();
$res = $goods_model->getGoodsSpecFormat($sku_ids, $goods_spec_format);
return $res;
}
}

View File

@@ -0,0 +1,368 @@
<?php
namespace addon\pointexchange\model;
use addon\coupon\model\Coupon;
use app\dict\member_account\AccountDict;
use app\dict\order\OrderGoodsDict;
use app\model\member\MemberAccount;
use app\model\BaseModel;
use app\model\order\VirtualOrder;
use app\model\system\Pay;
use app\model\order\OrderCreate;
use app\model\order\Order as CommonOrder;
use app\model\order\StoreOrder;
use app\model\order\LocalOrder;
use app\model\order\OrderCommon;
use think\facade\Log;
/**
* 积分兑换订单
*/
class Order extends BaseModel
{
/**
* 支付订单
* @param $data
* @return array
*/
public function orderPay($data)
{
$out_trade_no = $data[ 'out_trade_no' ];
$order_info = model('promotion_exchange_order')->getInfo([ [ 'out_trade_no', '=', $out_trade_no ] ], '*');
if (empty($order_info)) {
return $this->error([], '找不到可支付的订单');
}
if ($order_info[ 'order_status' ] == 1) {
return $this->error([], '当前订单已支付');
}
model('promotion_exchange_order')->startTrans();
try {
$order_data = array (
'order_status' => 1,
'pay_time' => time()
);
switch ( $order_info[ 'type' ] ) {
case 1://商品
//添加对应商品订单
$order_create = new OrderCreate();
$order_no = $order_create->createOrderNo();
//查询兑换的商品信息
$exchange_info = model('promotion_exchange')->getInfo([ [ 'id', '=', $order_info[ 'exchange_id' ] ] ], 'price,type_id');
$sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $exchange_info[ 'type_id' ] ] ], 'sku_id,sku_name,sku_no,sku_image,is_virtual,goods_class,goods_class_name,cost_price,goods_id,goods_name,sku_spec_format,supplier_id');
$goods = model('goods')->getInfo(['goods_id'=>$sku_info['goods_id']]);
//订单类型
$order_type = $this->orderType($order_info[ 'delivery_type' ], $sku_info[ 'is_virtual' ]);
$data_order = [
'order_no' => $order_no,
'site_id' => $order_info[ 'site_id' ],
'site_name' => '',
'order_from' => $order_info[ 'order_from' ],
'order_from_name' => $order_info[ 'order_from_name' ],
'order_type' => $order_type[ 'order_type_id' ],
'order_type_name' => $order_type[ 'order_type_name' ],
'order_status_name' => $order_type[ 'order_status' ][ 'name' ],
'order_status_action' => json_encode($order_type[ 'order_status' ], JSON_UNESCAPED_UNICODE),
'out_trade_no' => $out_trade_no,
'member_id' => $order_info[ 'member_id' ],
'name' => $order_info[ 'name' ],
'mobile' => $order_info[ 'mobile' ],
'telephone' => $order_info[ 'telephone' ],
'province_id' => $order_info[ 'province_id' ],
'city_id' => $order_info[ 'city_id' ],
'district_id' => $order_info[ 'district_id' ],
'community_id' => $order_info[ 'community_id' ],
'address' => $order_info[ 'address' ],
'full_address' => $order_info[ 'full_address' ],
'longitude' => $order_info[ 'longitude' ],
'latitude' => $order_info[ 'latitude' ],
'buyer_ip' => '',
'goods_money' => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
'delivery_money' => $order_info[ 'delivery_price' ],
'coupon_id' => 0,
'coupon_money' => 0,
'adjust_money' => 0,
'invoice_money' => 0,
'promotion_money' => 0,
'order_money' => $order_info[ 'order_money' ],
'balance_money' => 0,
'pay_money' => $order_info[ 'order_money' ],
'create_time' => time(),
'is_enable_refund' => $order_type[ 'order_type_id' ] == 4 ? 0 : 1,
'order_name' => $order_info[ 'exchange_name' ],
'goods_num' => $order_info[ 'num' ],
'delivery_type' => $order_info[ 'delivery_type' ],
'delivery_type_name' => $order_info[ 'delivery_type_name' ],
'delivery_store_id' => $order_info[ 'delivery_store_id' ],
'delivery_store_name' => $order_info[ 'delivery_store_name' ],
'delivery_store_info' => $order_info[ 'delivery_store_info' ],
'buyer_message' => $order_info[ 'buyer_message' ],
'invoice_delivery_money' => 0,
'taxpayer_number' => '',
'invoice_rate' => 0,
'invoice_content' => '',
'invoice_full_address' => '',
'is_invoice' => 0,
'invoice_type' => 0,
'invoice_title' => '',
'is_tax_invoice' => '',
'invoice_email' => '',
'invoice_title_type' => 0,
'buyer_ask_delivery_time' => $order_info[ 'buyer_ask_delivery_time' ],//定时达
'delivery_start_time' => $order_info[ 'delivery_start_time' ],
'delivery_end_time' => $order_info[ 'delivery_end_time' ],
'promotion_type' => 'pointexchange',
'promotion_type_name' => '积分兑换',
'store_id' => $order_info[ 'delivery_store_id' ],
'merch_id'=>$goods['merch_id'],//多商户id
];
$order_id = model('order')->add($data_order);
$order_data[ 'relate_order_id' ] = $order_id;
$data_order_goods = [
'order_id' => $order_id,
'site_id' => $order_info[ 'site_id' ],
'order_no' => $order_no,
'member_id' => $order_info[ 'member_id' ],
'sku_id' => $sku_info[ 'sku_id' ],
'sku_name' => $sku_info[ 'sku_name' ],
'sku_image' => $sku_info[ 'sku_image' ],
'sku_no' => $sku_info[ 'sku_no' ],
'is_virtual' => $sku_info[ 'is_virtual' ],
'goods_class' => $sku_info[ 'goods_class' ],
'goods_class_name' => $sku_info[ 'goods_class_name' ],
'price' => $order_info[ 'exchange_price' ],
'cost_price' => $sku_info[ 'cost_price' ],
'num' => $order_info[ 'num' ],
'goods_money' => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
'cost_money' => $sku_info[ 'cost_price' ] * $order_info[ 'num' ],
'goods_id' => $sku_info[ 'goods_id' ],
'delivery_status' => OrderGoodsDict::wait_delivery,
'delivery_status_name' => OrderGoodsDict::getDeliveryStatus(OrderGoodsDict::wait_delivery),
'real_goods_money' => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
'coupon_money' => 0,
'promotion_money' => 0,
'goods_name' => $sku_info[ 'goods_name' ],
'sku_spec_format' => $sku_info[ 'sku_spec_format' ],
'store_id' => $order_info[ 'delivery_store_id' ],
'supplier_id' => $sku_info[ 'supplier_id' ] ?? 0
];
model('order_goods')->add($data_order_goods);
$order_common = new OrderCommon();
$pay = new Pay();
$pay_info = $pay->getPayInfo($out_trade_no);
$res = $order_common->orderOnlinePay($pay_info[ 'data' ]);
if (isset($res[ 'code' ]) && $res[ 'code' ] != 0) {
Log::write('积分兑换商品订单支付失败:' . $res[ 'message' ]);
}
break;
case 2://优惠券
$coupon_model = new Coupon();
$res = $coupon_model->giveCoupon([ [ 'coupon_type_id' => $order_info[ 'type_id' ], 'num' => 1 ] ], $order_info[ 'site_id' ], $order_info[ 'member_id' ], 1);
break;
case 3://红包
$member_account_model = new MemberAccount();
$res = $member_account_model->addMemberAccount($order_info[ 'site_id' ], $order_info[ 'member_id' ], AccountDict::balance, $order_info[ 'balance' ], 'order', '积分兑换,', '积分兑换');
break;
}
$res = model('promotion_exchange_order')->update($order_data, [ [ 'order_id', '=', $order_info[ 'order_id' ] ] ]);
model('promotion_exchange_order')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_exchange_order')->rollback();
return $this->error('', $e->getMessage());
}
}
private function orderType($type_name, $is_virtual = 0)
{
if ($type_name == 'express') {
$order = new CommonOrder();
return [
'order_type_id' => 1,
'order_type_name' => '普通订单',
'order_status' => $order->order_status[ 0 ]
];
} elseif ($type_name == 'store') {
$order = new StoreOrder();
return [
'order_type_id' => 2,
'order_type_name' => '自提订单',
'order_status' => $order->order_status[ 0 ]
];
} elseif ($type_name == 'local') {
$order = new LocalOrder();
return [
'order_type_id' => 3,
'order_type_name' => '外卖订单',
'order_status' => $order->order_status[ 0 ]
];
} elseif ($is_virtual) {
$order = new VirtualOrder();
return [
'order_type_id' => 4,
'order_type_name' => '虚拟订单',
'order_status' => $order->order_status[ 0 ]
];
}
}
/**
* 关闭订单
* @param $order_id
* @return array|int|mixed|void
*/
public function closeOrder($order_id)
{
$order_info = model('promotion_exchange_order')->getInfo([ [ 'order_id', '=', $order_id ] ], '*');
if (empty($order_info)) return $this->error();
model('promotion_exchange_order')->startTrans();
try {
$data = array (
'order_status' => -1,
);
$result = model('promotion_exchange_order')->update($data, [ [ 'order_id', '=', $order_id ] ]);
//返还积分
$member_account_model = new MemberAccount();
$member_account_result = $member_account_model->addMemberAccount($order_info[ 'site_id' ], $order_info[ 'member_id' ], 'point', $order_info[ 'point' ], 'pointexchangerefund', $order_id, '积分兑换关闭返还');
if ($member_account_result[ 'code' ] < 0) {
model('promotion_exchange_order')->rollback();
return $member_account_result;
}
//判断库存
$exchange_model = new Exchange();
switch ( $order_info[ 'type' ] ) {//兑换类型
case '1'://商品
// $sku_info = model('goods_sku')->getInfo( [ ['sku_id','=',$order_info['type_id']] ], '');
// if(!empty($sku_info)){
// //库存变化
// $goods_stock_model = new GoodsStock();
// $stock_result = $goods_stock_model->incStock(['sku_id' => $order_info['type_id'], 'num' => $order_info['num']]);
// if ($stock_result['code'] != 0) {
// model('promotion_exchange_order')->rollback();
// return $stock_result;
// }
// }
break;
case '2'://优惠券
//返回优惠券库存
$coupon_model = new Coupon();
$coupon_info = $coupon_model->getCouponTypeInfo([ [ 'coupon_type_id', '=', $order_info[ 'type_id' ] ] ], 'coupon_type_id');
if (!empty($coupon_info)) {
$result = $coupon_model->incStock([ [ 'coupon_type_id', '=', $order_info[ 'type_id' ] ], [ 'num', '=', $order_info[ 'num' ] ] ]);
}
break;
case '3'://红包
break;
}
//返还套餐库存
$exchange_model->incStock([ 'id' => $order_info[ 'exchange_id' ], 'num' => $order_info[ 'num' ] ]);
if ($order_info[ 'type' ] == 1 && $order_info[ 'order_money' ] > 0 && $order_info[ 'order_status' ] == 0) {
//关闭支付
$pay_model = new Pay();
$result = $pay_model->deletePay($order_info[ 'out_trade_no' ]);//关闭旧支付单据
if ($result[ 'code' ] < 0) {
model('promotion_exchange_order')->rollback();
return $result;
}
}
model('promotion_exchange_order')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_exchange_order')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 获取积分兑换订单信息
* @param $condition
* @param string $field
* @return array
*/
public function getOrderInfo($condition, $field = '*')
{
$res = model('promotion_exchange_order')->getInfo($condition, $field);
return $this->success($res);
}
/**
* 获取订单列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @return array
*/
public function getOrderList($condition = [], $field = '*', $order = '', $limit = null)
{
$list = model('promotion_exchange_order')->getList($condition, $field, $order, '', '', '', $limit);
return $this->success($list);
}
/**
* 获取订单总和
* @param array $where
* @param string $field
* @param string $alias
* @param null $join
* @return array
*/
public function getOrderSum($where = [], $field = '', $alias = 'a', $join = null)
{
$data = model('promotion_exchange_order')->getSum($where, $field, $alias, $join);
return $this->success($data);
}
/**
* 获取积分兑换订单分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getExchangePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = '', $join = [])
{
$list = model('promotion_exchange_order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 发货
* @param $param
* @return array
*/
public function delivery($param)
{
$order_id = $param[ 'order_id' ];
$delivery_code = $param[ 'delivery_code' ];
$order_data = array (
'delivery_status' => OrderGoodsDict::delivery,
'delivery_status_name' => OrderGoodsDict::getDeliveryStatus(OrderGoodsDict::delivery),
'delivery_code' => $delivery_code
);
$res = model('promotion_exchange_order')->update($order_data, [ [ 'order_id', '=', $order_id ] ]);
return $this->success();
}
}

View File

@@ -0,0 +1,302 @@
<?php
namespace addon\pointexchange\model;
use app\dict\order\OrderGoodsDict;
use app\model\BaseModel;
use app\model\express\Config as ExpressConfig;
use app\model\express\Express;
use app\model\express\Local;
use app\model\goods\Goods;
use app\model\member\Member;
use app\model\member\MemberAccount;
use app\model\member\MemberAddress;
use app\model\order\Config;
use app\model\order\LocalOrder;
use app\model\order\Order as CommonOrder;
use app\model\order\OrderCreateTool;
use app\model\order\StoreOrder;
use app\model\store\Store;
use app\model\system\Cron;
use app\model\system\Pay;
use extend\exception\OrderException;
use think\facade\Cache;
/**
* 积分兑换
*/
class OrderCreate extends BaseModel
{
use OrderCreateTool;
public $point = 0;
public $balance = 0;
public $exchange_info = [];
public function __construct()
{
$this->promotion_type = 'pointexchange';
$this->promotion_type_name = '积分商城';
$this->is_limit_start_money = false;
}
/**
* 创建订单
*/
public function create()
{
//计算
$this->confirm();
if ($this->error > 0) {
return $this->error(['error_code' => $this->error], $this->error_msg);
}
model('promotion_exchange_order')->startTrans();
try {
$this->order_no = $this->createOrderNo();
$pay_model = new Pay();
$this->out_trade_no = $pay_model->createOutTradeNo($this->member_id);
//配送数据
if ($this->exchange_info['type'] == 1) {
$express_type_list = $this->config('delivery_type');
$delivery_type_name = $express_type_list[$this->delivery['delivery_type']] ?? '';
}
$order_id = 0;
$delivery_time_data = $this->delivery[ 'buyer_ask_delivery_time' ] ?? [];
$order_data = array (
'order_no' => $this->order_no,
'member_id' => $this->member_id,
'out_trade_no' => $this->out_trade_no,
'point' => $this->point,
'exchange_price' => $this->exchange_info[ 'price' ],
'delivery_price' => $this->delivery_money,
'price' => $this->exchange_info[ 'price' ],
'order_money' => $this->order_money,
'create_time' => time(),
'exchange_id' => $this->exchange_info[ 'id' ],
'exchange_goods_id' => $this->exchange_info[ 'exchange_goods_id' ],
'exchange_name' => $this->exchange_info[ 'name' ],
'exchange_image' => $this->exchange_info[ 'image' ],
'num' => $this->goods_num,
'order_status' => 0,
'type' => $this->exchange_info[ 'type' ],
'type_name' => $this->exchange_info[ 'type_name' ],
'name' => $this->delivery[ 'member_address' ][ 'name' ] ?? '',
'mobile' => $this->delivery[ 'member_address' ][ 'mobile' ] ?? '',
'telephone' => $this->delivery[ 'member_address' ][ 'telephone' ] ?? '',
'province_id' => $this->delivery[ 'member_address' ][ 'province_id' ] ?? '',
'city_id' => $this->delivery[ 'member_address' ][ 'city_id' ] ?? '',
'district_id' => $this->delivery[ 'member_address' ][ 'district_id' ] ?? '',
'community_id' => $this->delivery[ 'member_address' ][ 'community_id' ] ?? '',
'address' => $this->delivery[ 'member_address' ][ 'address' ] ?? '',
'full_address' => $this->delivery[ 'member_address' ][ 'full_address' ] ?? '',
'longitude' => $this->delivery[ 'member_address' ][ 'longitude' ] ?? '',
'latitude' => $this->delivery[ 'member_address' ][ 'latitude' ] ?? '',
'delivery_store_id' => $this->delivery[ 'store_id' ] ?? 0,
'delivery_store_name' => $this->delivery[ 'delivery_store_name' ] ?? '',
'delivery_store_info' => $this->delivery[ 'delivery_store_info' ] ?? '',
//配送时间
'buyer_ask_delivery_time' => $delivery_time_data['remark'] ?? '',//定时达
'delivery_start_time' => $delivery_time_data['start_time'] ?? '',//配送开始时间
'delivery_end_time' => $delivery_time_data['end_time'] ?? '',//配送结束时间
'order_from' => $this->order_from,
'order_from_name' => $this->order_from_name,
'buyer_message' => $this->param[ 'buyer_message' ],
'type_id' => $this->exchange_info[ 'type_id' ],
'balance' => $this->balance,
'site_id' => $this->site_id,
'order_id' => $order_id,
'delivery_type' => $this->delivery['delivery_type'] ?? '',
'delivery_type_name' => $delivery_type_name ?? '',
'delivery_status' => OrderGoodsDict::wait_delivery,
'delivery_status_name' => OrderGoodsDict::getDeliveryStatus(OrderGoodsDict::wait_delivery),
);
$this->order_id = model('promotion_exchange_order')->add($order_data);
//判断库存
$exchange_model = new Exchange();
//减去套餐的库存
$exchange_result = $exchange_model->decStock([ 'id' => $this->exchange_info[ 'id' ], 'num' => $this->goods_num ]);
if ($exchange_result[ 'code' ] < 0) {
model('promotion_exchange_order')->rollback();
return $exchange_result;
}
//扣除积分
$member_account_model = new MemberAccount();
$member_account_result = $member_account_model->addMemberAccount($this->site_id, $this->member_id, 'point', -$this->point, 'pointexchange', $order_id, '积分兑换扣除');
if ($member_account_result[ 'code' ] < 0) {
model('promotion_exchange_order')->rollback();
return $member_account_result;
}
if($this->exchange_info[ 'type' ] == 1){
$goods_info = $this->goods_list[0];
$stock_result = $this->skuDecStock($goods_info, $this->store_id);
if ($stock_result[ 'code' ] != 0) {
model('promotion_exchange_order')->rollback();
return $stock_result;
}
}
model('promotion_exchange_order')->commit();
// 积分兑换订单生成后操作
event('PointExchangeOrderCreate', [ 'order_id' => $order_id, 'create_data' => get_object_vars($this)]);
//支付单据
$pay_model->addPay($this->site_id, $this->out_trade_no, 'POINT', $this->order_name, $this->order_name, $this->order_money, '', 'PointexchangeOrderPayNotify', '');
return $this->success($this->out_trade_no);
} catch (\Exception $e) {
model('promotion_exchange_order')->rollback();
return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
}
}
/**
* 待支付订单
* @param $data
*/
public function payment()
{
$this->calculate();//计算并查询套餐信息
if($this->exchange_info[ 'type' ] == 1){
//查询配送信息
$this->getDeliveryData();
}
return get_object_vars($this);
}
/**
* 计算后的进一步计算(不存缓存,每次都是重新计算)
* @return array
*/
public function confirm()
{
$order_key = $this->param['order_key'];
$this->getOrderCache($order_key);
//初始化地址
$this->initMemberAddress();
//初始化门店信息
$this->initStore();
if ($this->exchange_info['type'] == 1) {
//配送计算
$this->calculateDelivery();
if ($this->exchange_info['is_free_shipping'] == 0 && $this->exchange_info['delivery_type'] == 0) {
//固定运费
$this->delivery_money = $this->exchange_info['delivery_price'];
}
}
$this->order_money = $this->goods_money + $this->delivery_money;
$this->pay_money = $this->order_money;
//设置过的商品项信息
return get_object_vars($this);
}
/**
* 计算
* @param $data
*/
public function calculate()
{
$this->initMemberAddress();
$this->initMemberAccount(); //初始化会员账户
$id = $this->param[ 'id' ];
$sku_id = $this->param[ 'sku_id' ];
$num = $this->param[ 'num' ];
$exchange_model = new Exchange();
$exchange_info = $exchange_model->getExchangeInfo($id, '*', $sku_id)[ 'data' ] ?? [];
if (empty($exchange_info)) throw new OrderException('找不到对应的积分兑换活动!');
$this->exchange_info = $exchange_info;
if ($this->exchange_info[ 'state' ] == 0) {
$this->error = 1;
$this->error_msg = '当前兑换活动未开启!';
}
if ($this->exchange_info[ 'type' ] == 1 && $exchange_info[ 'limit_num' ] > 0) {
// 已兑换数量
$exchangeed_num = model('promotion_exchange_order')->getSum([ [ 'exchange_id', '=', $this->exchange_info[ 'id' ] ], [ 'order_status', '<>', '-1' ], [ 'member_id', '=', $this->member_id ] ], 'num');
if (( $exchangeed_num + $num ) > $this->exchange_info[ 'limit_num' ]) {
$this->error = 1;
$this->error_msg = '兑换数量已超出该兑换活动的兑换限制!';
}
}
if ($this->exchange_info[ 'stock' ] <= 0) {
if ($this->exchange_info[ 'type' ] == 2 && $this->exchange_info[ 'stock' ] < 0) {
} else {
$this->error = 1;
$this->error_msg = '当前兑换库存不足!';
}
}
//兑换类型为1时 兑换物品为商品(相对优惠券和红包来说较为特殊)
if ($this->exchange_info[ 'type' ] == 1) {
$goods_model = new Goods();
$goods_info = $goods_model->getGoodsSkuInfo([['sku_id', '=', $this->exchange_info['sku_id']], ['site_id', '=', $this->site_id]], '*')['data'] ?? [];
if (empty($goods_info)) throw new OrderException('商品不存在!');
$goods_info['num'] = $num;
if ($this->exchange_info['type'] == 1){
if ($exchange_info['is_free_shipping'] == 1 ) {
//免邮
$goods_info['is_free_shipping'] = 1;
} else {
if ($this->exchange_info['delivery_type'] == 2) {
} else if ($this->exchange_info['delivery_type'] == 1) {
//运费模板
$goods_info['shipping_template'] = $this->exchange_info['shipping_template'];
}
}
}
$goods_info['goods_money'] = $this->exchange_info[ 'price' ] * $num;
$this->goods_list[] = $goods_info;
$this->is_virtual = $goods_info[ 'is_virtual' ];
}
$point = $this->exchange_info[ 'point' ];
$price = $this->exchange_info[ 'price' ];
$balance = $exchange_info[ 'balance' ];
$goods_num = $num;
$this->goods_money = $price * $num;
$this->order_money = $this->goods_money;
$this->pay_money = $this->order_money;
$this->order_name = $this->exchange_info[ 'name' ] . '【' . $this->exchange_info[ 'type_name' ] . '】';
$this->point = $point * $num;
$this->price = $price * $num;
$this->goods_num = $goods_num;
$this->balance = $balance * $num;
$this->order_key = create_no();
$this->setOrderCache(get_object_vars($this), $this->order_key);
return true;
}
/**
* 增加订单自动关闭事件
*/
public function addOrderCronClose()
{
//计算订单自动关闭时间
$config_model = new Config();
$order_config_result = $config_model->getOrderEventTimeConfig($this->site_id);
$order_config = $order_config_result[ 'data' ];
$now_time = time();
if (!empty($order_config)) {
$execute_time = $now_time + $order_config[ 'value' ][ 'auto_close' ] * 60;//自动关闭时间
} else {
$execute_time = $now_time + 3600;//尚未配置 默认一天
}
$cron_model = new Cron();
$cron_model->addCron(1, 0, '积分兑换订单自动关闭', 'CronExchangeOrderClose', $execute_time, $this->order_id);
return true;
}
}

View File

@@ -0,0 +1,155 @@
<?php
/**
*/
namespace addon\pointexchange\model\share;
use addon\pointexchange\model\Exchange as ExchangeModel;
use app\model\share\WchatShareBase as BaseModel;
use app\model\system\Config as ConfigModel;
/**
* 分享
*/
class WchatShare extends BaseModel
{
protected $config = [
[
'title' => '积分商城',
'config_key' => 'WCHAT_SHARE_CONFIG_POINTEXCHANGE_LIST',
'path' => [ '/pages_promotion/point/list' ],
'method_prefix' => 'goodsList',
],
[
'title' => '积分商品',
'config_key' => 'WCHAT_SHARE_CONFIG_POINTEXCHANGE_DETAIL',
'path' => [ '/pages_promotion/point/detail' ],
'method_prefix' => 'goodsDetail',
],
];
protected $sort = 6;
/**
* 积分商城列表
* @param $param
* @return array
*/
protected function goodsListShareData($param)
{
//跳转路径
$link = $this->getShareLink($param);
$config_data = $this->goodsListShareConfig($param)[ 'value' ];
$data = [
'link' => $link,
'desc' => $config_data[ 'desc' ],
'imgUrl' => $config_data[ 'imgUrl' ],
'title' => $config_data[ 'title' ]
];
return [
'permission' => [
'hideOptionMenu' => false,
'hideMenuItems' => [],
],
'data' => $data,//分享内容
];
}
/**
* 积分商城列表分享配置
* @param $param
* @return array
*/
public function goodsListShareConfig($param)
{
$site_id = $param[ 'site_id' ];
$config = $param[ 'config' ];
$config_model = new ConfigModel();
$data = $config_model->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', $config[ 'config_key' ] ] ])[ 'data' ];
if (empty($data[ 'value' ])) {
$data[ 'value' ] = [
'title' => "积分商城",
'desc' => "积分兑换更优惠哦",
'imgUrl' => ''
];
}
if (empty($data[ 'value' ][ 'imgUrl' ])) {
$data[ 'value' ][ 'imgUrl' ] = img('addon/pointexchange/icon.png');
}
return [
'value' => $data[ 'value' ],
];
}
/**
* 积分商城详情
* @param $param
* @return array
*/
protected function goodsDetailShareData($param)
{
$site_id = $param[ 'site_id' ] ?? 0;
parse_str(parse_url($param[ 'url' ])[ 'query' ] ?? '', $query);
if (isset($query[ 'id' ])) {
$id = $query[ 'id' ];
$exchange_model = new ExchangeModel();
$exchange_info = $exchange_model->getExchangeInfo($id, 'type, type_id');
$exchange_info = $exchange_info[ 'data' ];
$condition = [
[ 'peg.id', '=', $id ],
[ 'peg.site_id', '=', $site_id ],
[ 'peg.state', '=', 1 ],
];
$exchange_detail = $exchange_model->getExchangeDetail($condition, $exchange_info[ 'type' ])[ 'data' ];
if (!empty($exchange_detail)) {
$image_url = '';
$title = '';
switch ( $exchange_detail[ 'type' ] ) {
case 1://商品
$title = $exchange_detail[ 'sku_name' ];
$image_url = $exchange_detail[ 'sku_image' ];
break;
case 2://优惠券
case 3://红包
$title = $exchange_detail[ 'name' ];
$image_url = $exchange_detail[ 'image' ];
break;
}
if ($image_url) {
$image_url = img($image_url);
} else {
$image_url = $this->getDefaultShareIcon();
}
$exchange_condition = [];
if ($exchange_detail[ 'point' ] > 0) $exchange_condition[] = "{$exchange_detail['point']}积分";
if ($exchange_detail[ 'exchange_price' ] > 0) $exchange_condition[] = "{$exchange_detail['exchange_price']}";
$desc = "仅需" . join("+", $exchange_condition) . "即可兑换";
$link = $this->getShareLink($param);
$data = [
'title' => $title,
'desc' => $desc,
'link' => $link,
'imgUrl' => $image_url,
];
return [
'permission' => [
'hideOptionMenu' => false,
'hideMenuItems' => [],
],
'data' => $data,//分享内容
];
}
}
}
}

View File

@@ -0,0 +1,90 @@
<?php
/**
*/
namespace addon\pointexchange\model\share;
use app\model\share\WeappShareBase;
use app\model\system\Config as ConfigModel;
/**
* 分享
*/
class WeappShare extends WeappShareBase
{
protected $config = [
[
'title' => '积分商城列表',
'config_key' => 'WEAPP_SHARE_CONFIG_POINTEXCHANGE_LIST',
'path' => ['/pages_promotion/point/list'],
'method_prefix' => 'pointexchangeList',
],
];
protected $sort = 13;
/**
* 积分商城列表
* @param $param
* @return array
*/
protected function pointexchangeListShareData($param)
{
//获取和替换配置数据
$config_data = $this->pointexchangeListShareConfig($param);
$title = $config_data['value']['title'];
$image_url = $config_data['value']['imageUrl'] ? img($config_data['value']['imageUrl']) : '';
$path = $this->getSharePath($param);
$data = [
'title' => $title,
'path' => $path,
'imageUrl' => $image_url,
];
return [
'permission' => [
'onShareAppMessage' => true,
'onShareTimeline' => true,
],
'data' => $data,//分享内容
];
}
/**
* 积分商城列表
* @param $param
* @return array
*/
protected function pointexchangeListShareConfig($param)
{
$site_id = $param['site_id'];
$config = $param['config'];
$config_model = new ConfigModel();
$data = $config_model->getConfig([
['site_id', '=', $site_id],
['app_module', '=', 'shop'],
['config_key', '=', $config['config_key']],
])['data'];
if (empty($data['value'])) {
$data['value'] = [
'title' => '用积分兑换更有优惠哦!',
'imageUrl' => '',
];
}
$variable = [];
return [
'value' => $data['value'],
'variable' => $variable,
];
}
}

View File

@@ -0,0 +1,302 @@
<?php
/**
*/
namespace addon\pointexchange\shop\controller;
use addon\coupon\model\CouponType as CouponTypeModel;
use addon\pointexchange\model\Exchange as ExchangeModel;
use app\shop\controller\BaseShop;
use app\model\express\ExpressTemplate as ExpressTemplateModel;
/**
* 积分兑换
* @author Administrator
*
*/
class Exchange extends BaseShop
{
/**
* 积分兑换列表
*/
public function lists()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$type = input('type', '');
$state = input('state', '');
$sort = input('sort', 'asc');
$condition[] = [ 'peg.site_id', '=', $this->site_id ];
if ($search_text) {
$condition[] = [ 'peg.name', 'like', '%' . $search_text . '%' ];
}
if ($type) {
$condition[] = [ 'peg.type', '=', $type ];
}
if ($state != '') {
$condition[] = [ 'peg.state', '=', $state ];
}
$field = 'peg.*';
$alias = 'peg';
$join = [];
//排序
$order = input('order', 'create_time');
$sort = input('sort', 'desc');
if ($order == 'sort') {
$order_by = 'peg.' . $order . ' ' . $sort;
} else {
$order_by = 'peg.' . $order . ' ' . $sort . ',peg.sort desc';
}
$exchange_model = new ExchangeModel();
//兑换名称 兑换图片 兑换库存 兑换价格
$lists = $exchange_model->getExchangeGoodsPageList($condition, $page, $page_size, $order_by, $field, $alias, $join);
return $lists;
}
return $this->fetch("exchange/lists");
}
/**
* 添加积分兑换
*/
public function add()
{
if (request()->isJson()) {
$type = input('type', '1');//兑换类型 1 商品 2 优惠券 3 红包
$data = [
'site_id' => $this->site_id,
'type' => $type,//兑换类型 1 商品 2 优惠券 3 红包
'point' => input('point', ''),//积分
'state' => input('state', ''),
'is_free_shipping' => input('is_free_shipping', ''),
'delivery_type' => input('delivery_type', ''),
'delivery_price' => input('delivery_price', ''),
'shipping_template' => input('shipping_template', ''),
];
if ($type == 1) {
$data[ 'goods_data' ] = input('goods_data', '');
$data[ 'rule' ] = input('content', '');
$data[ 'type_name' ] = '商品';
} elseif ($type == 2) {
$data[ 'coupon_type_id' ] = input('coupon_type_id', '0');//优惠券id
$data[ 'content' ] = input('content', '');
$data[ 'type_name' ] = '优惠券';
$data[ 'stock' ] = input('stock', '');
} elseif ($type == 3) {
$data[ 'name' ] = input('name', '');
$data[ 'image' ] = input('image', '');
$data[ 'stock' ] = input('stock', '');
$data[ 'balance' ] = input('balance', '0');
$data[ 'content' ] = input('content', '');
$data[ 'type_name' ] = '红包';
} else {
return error(-1, '');
}
$exchange_model = new ExchangeModel();
$res = $exchange_model->addExchange($data);
return $res;
} else {
//获取运费模板
$express_template_model = new ExpressTemplateModel();
$express_template_list = $express_template_model->getExpressTemplateList([ [ 'site_id', "=", $this->site_id ] ], 'template_id,template_name', 'is_default desc');
$express_template_list = $express_template_list[ 'data' ];
$this->assign("express_template_list", $express_template_list);
return $this->fetch("exchange/add");
}
}
/**
* 编辑积分兑换
*/
public function edit()
{
$id = input("id", 0);
$exchange_model = new ExchangeModel();
if (request()->isJson()) {
$type = input('type', '1');//兑换类型 1 商品 2 优惠券 3 红包
$data = [
'site_id' => $this->site_id,
'type' => $type,//兑换类型 1 商品 2 优惠券 3 红包
'point' => input('point', ''),//积分
'state' => input('state', ''),
'id' => $id,
'is_free_shipping' => input('is_free_shipping', ''),
'delivery_type' => input('delivery_type', ''),
'delivery_price' => input('delivery_price', ''),
'shipping_template' => input('shipping_template', ''),
];
if ($type == 1) {
$data[ 'goods_data' ] = input('goods_data', '');
$data[ 'rule' ] = input('content', '');
$data[ 'type_name' ] = '商品';
} elseif ($type == 2) {
$data[ 'coupon_type_id' ] = input('coupon_type_id', '0');//优惠券id
$data[ 'content' ] = input('content', '');
$data[ 'type_name' ] = '优惠券';
$data[ 'stock' ] = input('stock', '');
} elseif ($type == 3) {
$data[ 'name' ] = input('name', '');
$data[ 'image' ] = input('image', '');
$data[ 'stock' ] = input('stock', '');
$data[ 'balance' ] = input('balance', '0');
$data[ 'content' ] = input('content', '');
$data[ 'type_name' ] = '红包';
} else {
return error(-1, '');
}
$res = $exchange_model->editExchange($data);
return $res;
} else {
$exchange_info = $exchange_model->getExchangeGoodsDetail($id, $this->site_id);
if (empty($exchange_info[ 'data' ][ 'id' ])) {
$this->error('对应的积分兑换活动商品/优惠券已经不存在了!');
}
$this->assign("exchange_info", $exchange_info[ 'data' ]);
//获取运费模板
$express_template_model = new ExpressTemplateModel();
$express_template_list = $express_template_model->getExpressTemplateList([ [ 'site_id', "=", $this->site_id ] ], 'template_id,template_name', 'is_default desc');
$express_template_list = $express_template_list[ 'data' ];
$this->assign("express_template_list", $express_template_list);
return $this->fetch("exchange/edit");
}
}
/**
*关闭积分兑换
*/
public function delete()
{
$id = input("id", 0);
$exchange_model = new ExchangeModel();
$res = $exchange_model->deleteExchange($id);
return $res;
}
/**
* 修改排序
*/
public function modifySort()
{
$sort = input('sort', 0);
$id = input('id', 0);
$exchange_model = new ExchangeModel();
return $exchange_model->modifyExchangeSort($sort, $id);
}
/**
* 获取商品列表
* @return array
*/
public function getSkuList()
{
if (request()->isJson()) {
$exchange_model = new ExchangeModel();
$exchange_id = input('exchange_id', '');
$field = 'pe.*,sku.sku_name,sku.price as market_price,sku.sku_image,sku.stock';
$alias = 'pe';
$join = [
[
'promotion_exchange_goods peg',
'peg.id = pe.exchange_goods_id',
'inner'
],
[
'goods_sku sku',
'sku.sku_id = pe.type_id',
'inner'
]
];
$condition = [
[ 'peg.id', '=', $exchange_id ],
[ 'sku.is_delete', '=', 0 ],
[ 'sku.goods_state', '=', 1 ],
[ 'peg.state', '=', 1 ],
];
$goods_list = $exchange_model->getExchangeList($condition, $field, '', null, $alias, $join);
foreach ($goods_list[ 'data' ] as $k => $v) {
$goods_list[ 'data' ][ $k ][ 'stock' ] = numberFormat($goods_list[ 'data' ][ $k ][ 'stock' ]);
}
return $goods_list;
}
}
/**
* 获取优惠券列表
*/
public function getCouponList()
{
$coupon_type_model = new CouponTypeModel();
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$status = input('status', '');
$condition = [];
if ($status !== "") {
$condition[] = [ 'status', '=', $status ];
}
$condition[] = [ 'site_id', '=', $this->site_id ];
$order = 'sort asc';
$field = '*';
$res = $coupon_type_model->getCouponTypePageList($condition, $page, $page_size, $order, $field);
$exchange_model = new ExchangeModel();
//兑换名称 兑换图片 兑换库存 兑换价格
$exchange_list = $exchange_model->getExchangeList([ [ 'type', '=', 2 ] ], 'type_id')[ 'data' ] ?? [];
if ($exchange_list) {
$exchange_list = array_column($exchange_list, 'type_id');
}
if ($res[ 'data' ][ 'list' ]) {
foreach ($res[ 'data' ][ 'list' ] as $key => $val) {
if (in_array($val[ 'coupon_type_id' ], $exchange_list)) {
$res[ 'data' ][ 'list' ][ $key ][ 'is_exit' ] = 1;
} else {
$res[ 'data' ][ 'list' ][ $key ][ 'is_exit' ] = 0;
}
}
}
return $res;
}
}
/**
*关闭积分兑换
*/
public function deleteAll()
{
if (request()->isJson()) {
$id = input("exchange_id", '');
$exchange_model = new ExchangeModel();
foreach ($id as $k => $v){
$res = $exchange_model->deleteExchange($v);
}
return $res;
}
}
}

View File

@@ -0,0 +1,113 @@
<?php
/**
*/
namespace addon\Pointexchange\shop\controller;
use addon\pointexchange\model\Order as ExchangeOrderModel;
use app\shop\controller\BaseShop;
use think\App;
/**
* 兑换发放订单
*/
class Pointexchange extends BaseShop
{
public function __construct(App $app = null)
{
$this->replace = [
'POINTEXCHANGE_CSS' => __ROOT__ . '/addon/pointexchange/shop/view/public/css',
'POINTEXCHANGE_JS' => __ROOT__ . '/addon/pointexchange/shop/view/public/js',
'POINTEXCHANGE_IMG' => __ROOT__ . '/addon/pointexchange/shop/view/public/img',
];
parent::__construct($app);
}
/**
* 兑换订单列表
* @return mixed
*/
public function lists()
{
$exchange_id = input('exchange_id', '');
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$condition = [
['eo.site_id','=',$this->site_id]
];
if ($search_text) {
$condition[] = [ 'eo.exchange_name', 'like', '%' . $search_text . '%' ];
}
$name = input('name', '');
if (!empty($name)) {
$condition[] = [ 'm.nickname', 'like', '%' . $name . '%' ];
}
$mobile = input('mobile', '');
if (!empty($mobile)) {
$condition[] = [ 'eo.mobile', 'like', '%' . $mobile . '%' ];
}
$type = input('type', '');
if ($type) {
$condition[] = [ 'eo.type', '=', $type ];
}
if ($exchange_id) {
$condition[] = [ 'eo.exchange_goods_id', '=', $exchange_id ];
}
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && !$end_time) {
$condition[] = [ 'eo.pay_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'eo.pay_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$condition[] = [ 'eo.pay_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
}
$order = 'eo.create_time desc';
$field = 'eo.*,m.nickname';
$exchange_order_model = new ExchangeOrderModel();
$list = $exchange_order_model->getExchangePageList($condition, $page, $page_size, $order, $field, 'eo', [
[ 'member m', 'm.member_id=eo.member_id', 'left' ]
]);
file_put_contents(__DIR__ . '/debug.txt', var_export($condition,true));
return $list;
} else {
$this->assign('exchange_id', $exchange_id);
return $this->fetch("exchange_order/lists");
}
}
/**订单详情
* @return mixed
*/
public function detail()
{
$order_id = input('order_id', 0);
$order_model = new ExchangeOrderModel();
$order_info = $order_model->getOrderInfo([ [ 'site_id', '=', $this->site_id ], [ 'order_id', '=', $order_id ] ]);
$order_info = $order_info[ "data" ];
if (empty($order_info)) $this->error('未获取到订单数据', href_url('pointexchange://shop/pointexchange/lists'));
$this->assign("order_info", $order_info);
return $this->fetch('exchange_order/detail');
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,855 @@
<style>
.gift-box{padding: 20px;}
.gift-box .layui-form{padding: 0!important;}
.form-wrap{margin-top: 0;}
.layui-input {display: inline-block;}
.forbidden {cursor: not-allowed;}
.layui-table-body{max-height: 480px !important;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;}
.forbidden{cursor:not-allowed;background-color: #eee;}
.prompt-block .prompt-box{
top:unset;bottom:30px;left:-85px;
}
.layui-table-cell{overflow:inherit;}
.layui-table-box{overflow:inherit;}
.layui-table-header{overflow:inherit;}
.prompt-block .prompt-box:before{
transform:rotate(-90deg);left:84px;top:104px;
}
.prompt-block .prompt-box:after{
transform:rotate(-90deg);left:84px;top:103px;
}
.delivery_model{width:20%;display: inline-block;}
.layui-input-block{margin-bottom:16px;}
.print.delivery_model .layui-anim-upbit{z-index:1000}
</style>
{if $exchange_info['type'] == 1}
<!-- 商品 -->
<div class="exchange-gift content layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">商品图片:</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square">
<div class="upload-img-box">
{if condition="$exchange_info.image"}
<img layer-src src="{:img($exchange_info.image)}" >
{else/}
<img layer-src src="__STATIC__/img/shape.png" />
{/if}
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-block">
<p class="input-text">{$exchange_info.name}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否上架:</label>
<div class="layui-input-block">
<p class="input-text len-long"><input id="state" type="checkbox" name="state" lay-skin="switch" {if $exchange_info['state'] == 1}checked {/if} value="1" lay-filter="state"></p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否免邮:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_free_shipping" {if $exchange_info['exchange_goods'][0]['is_free_shipping'] == 1}checked {/if} value="1" lay-filter="shipping" class="shipping" lay-skin="switch" >
</div>
</div>
<div class="layui-form-item ems_block" style="display:{if $exchange_info['exchange_goods'][0]['is_free_shipping'] == 1}none{else/}block{/if};padding-left:100px;">
<div class="layui-input-block">
<input type="checkbox" name="delivery_type" title="按照商品设置" lay-skin="primary" lay-filter="delivery_type" class="delivery_type" value="2" {if $exchange_info['exchange_goods'][0]['delivery_type'] == 2}checked {/if}>
<div class="word-aux" style="margin-left: 28px;margin-top: 0">
<p>如果选择按照商品设置,那么积分商城商品将会根据商品中设置的运费模版进行</p>
<p>计算运费</p>
</div>
</div>
<div class="layui-input-block">
<input type="checkbox" name="delivery_type" title="固定运费" lay-skin="primary" lay-filter="delivery_type" class="delivery_type" value="0" {if $exchange_info['exchange_goods'][0]['delivery_type'] == 0}checked {/if}>
<input class="layui-input len-short print" type="number" style="display:{if $exchange_info['exchange_goods'][0]['delivery_type'] == 0}inline-block{else/}none{/if};" name="delivery_price" {if $exchange_info['exchange_goods'][0]['delivery_type'] == 0}value="{$exchange_info['exchange_goods'][0]['delivery_price']}"{/if} onblur="checkInput(this)">
<div class="word-aux" style="margin-left: 28px;margin-top: 0">
<p>如果选择固定运费,积分商城的商品无论购买几件,将会按照设置的固定运费收取,</p>
<p>如:固定运费设置为12元,客户兑换A商品时无论一次兑换几件,运费都是12元.</p>
</div>
</div>
<div class="layui-input-block">
<input type="checkbox" name="delivery_type" title="运费模版" lay-skin="primary" lay-filter="delivery_type" class="delivery_type layui-form-label" value="1" {if $exchange_info['exchange_goods'][0]['delivery_type'] == 1}checked {/if}>
<div class="print delivery_model" style="display:{if $exchange_info['exchange_goods'][0]['delivery_type'] == 1}inline-block{else/}none{/if};">
<select name="shipping_template" lay-filter="delivery_model">
<option value="0">请选择运费模版</option>
{foreach name="$express_template_list" item="vo"}
<option value="{$vo['template_id']}" {if $exchange_info['exchange_goods'][0]['shipping_template'] == $vo['template_id']} selected {/if}>{$vo['template_name']}</option>
{/foreach}
</select>
</div>
<div class="word-aux" style="margin-left: 28px;margin-top: 0">
<p>如果选择运费模版,积分商城的商品将会按照该处选择的运费模版进行单独计算</p>
<p>运费,与商品本身设置的是否包邮以及运费模版无关.</p>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换规则:</label>
<div class="layui-input-block special-length">
<script id="containerG" name="containerG" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label"><span class="required">*</span>规格选择:</label>
<div class="layui-input-block">
<table id="selected_goods_list" lay-filter="selected_goods_list"></table>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
{{# if (d.is_select == 1){ }}
<a class="layui-btn no-participation" >不参与</a>
{{# }else{ }}
<a class="layui-btn participation" >参与</a>
{{# } }}
</div>
</script>
<script type="text/html" id="exchangePoint">
{{# if (d.is_select == 1){ }}
<input type="number" class="layui-input len-input exchange_point expoint" onchange="setSkulist('point', {{d.sku_id}}, this , 'integral')" value="{{d.point ? d.point : 0.00}}" lay-verify="exchange_point" min="0.00"/>
{{# }else{ }}
<input type="number" class="layui-input len-input exchange_point forbidden" disabled="disabled" onchange="setSkulist('point', {{d.sku_id}}, this, 'integral')" value="{{d.point ? d.point : 0.00}}" lay-verify="exchange_point" min="0.00"/>
{{# } }}
</script>
<script type="text/html" id="exchangeLimit">
{{# if (d.is_select == 1){ }}
<input type="number" class="layui-input len-input exchange_limit_num expoint" onchange="setSkulist('limit_num', {{d.sku_id}}, this, 'integral')" value="{{d.limit_num ? d.limit_num : 0}}" lay-verify="exchange_point" min="0.00"/>
{{# }else{ }}
<input type="number" class="layui-input len-input exchange_limit_num forbidden" disabled="disabled" onchange="setSkulist('limit_num', {{d.sku_id}}, this, 'integral')" value="{{d.limit_num ? d.limit_num : 0}}" lay-verify="exchange_point" min="0.00"/>
{{# } }}
</script>
<script type="text/html" id="exchangeMoney">
{{# if (d.is_select == 1){ }}
<input type="number" class="layui-input len-input exchange_money" onchange="setSkulist('exchange_price', {{d.sku_id}}, this, 'positiveNumber')" value="{{d.exchange_price ? d.exchange_price : 0.00}}" lay-verify="exchange_money" min="0.00"/>
{{# }else{ }}
<input type="number" class="layui-input len-input exchange_money forbidden" disabled="disabled" onchange="setSkulist('exchange_price', {{d.sku_id}}, this, 'positiveNumber')" value="{{d.exchange_price ? d.exchange_price : 0.00}}" lay-verify="exchange_money" min="0.00"/>
{{# } }}
</script>
<input type="hidden" name="type" value="1">
<input type="hidden" name="id" value="{$exchange_info.id}">
<input type="hidden" id="contentG" value="{$exchange_info.rule}" />
</div>
{/if}
{if $exchange_info['type'] == 2}
<!-- 优惠券 -->
<div class="exchange-coupon content layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">优惠券图片:</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square">
<div class="upload-img-box">
{if condition="$exchange_info.image"}
<img layer-src src="{:img($exchange_info.image)}" id="exchange_type_2_img">
{else/}
<img layer-src src="__STATIC__/img/shape.png" />
{/if}
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">优惠券名称:</label>
<div class="layui-input-block" id="exchange_type_2_name">
<p class="input-text">{$exchange_info.name}</p>
</div>
</div>
{if condition="$exchange_info['coupon_type'] == 'reward'"}
<div class="layui-form-item">
<label class="layui-form-label">优惠券面值:</label>
<div class="layui-input-block" id="exchange_type_2_price">
<p class="input-text">¥{$exchange_info.market_price}</p>
</div>
</div>
{elseif condition="$exchange_info['coupon_type'] == 'discount'"}
<div class="layui-form-item js-coupon-discount">
<label class="layui-form-label">优惠券折扣:</label>
<div class="layui-input-block" id="coupon_discount">
<p class="input-text text-empty">{$exchange_info.market_price}折</p>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>兑换积分:</label>
<div class="layui-input-block">
<input type="number" name="point" lay-verify="required|required_point" placeholder="请输入所需的兑换积分数" value="{$exchange_info.point}" onchange="detectionNumType(this,'integral')" class="layui-input len-short expoint">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>可兑换数量:</label>
<div class="layui-input-block">
<input type="number" name="stock" min="0" lay-verify="required|required_coupon_stock" placeholder="可兑换数量" value="{$exchange_info.stock}" onchange="detectionNumType(this,'integral')" class="layui-input len-short stock">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否上架:</label>
<div class="layui-input-block">
<input id="state" type="checkbox" name="state" lay-skin="switch" {if $exchange_info['state'] == 1}checked {/if} value="1" lay-filter="state">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换规则:</label>
<div class="layui-input-block special-length">
<script id="container" name="content" type="text/plain" style="width: 800px; height: 300px;"></script>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="type" value="2">
<input type="hidden" name="id" value="{$exchange_info.id}">
<input type="hidden" name="coupon_type_id" value="{$exchange_info.type_id}">
<input type="hidden" id="content" value="{$exchange_info.content}" />
</div>
{/if}
{if $exchange_info['type'] == 3}
<!-- 红包 -->
<div class="exchange-red-packet content layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>红包名称:</label>
<div class="layui-input-block">
<input type="text" name="name" lay-verify="required" placeholder="请输入红包名称" value="{$exchange_info.name}" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">红包封面:</label>
<div class="layui-input-inline img-upload">
<div class="upload-img-block icon square">
<div class="upload-img-box {if condition="$exchange_info.image"}hover{/if}">
<div class="upload-default" id="redPacket">
{if condition="$exchange_info.image"}
<div id="preview_redPacket" class="preview_img">
<img src="{:img($exchange_info.image)}" alt="" class="img_prev">
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/if}
</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="image" value="{$exchange_info.image}" />
</div>
<!-- <p id="redPacket" class='{if condition="$exchange_info.image"}replace {else/} no-replace{/if}'>替换</p>
<i class="del {if condition="$exchange_info.image"}show{/if}">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>兑换积分:</label>
<div class="layui-input-block">
<input type="number" name="point" lay-verify="required|required_point" placeholder="请输入所需的兑换积分数" value="{$exchange_info.point}" onchange="detectionNumType(this,'integral')" class="layui-input len-short expoint">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>可兑换数量:</label>
<div class="layui-input-block">
<input type="number" name="stock" min="0" lay-verify="required|required_balance_stock" placeholder="可兑换数量" value="{$exchange_info.stock}" onchange="detectionNumType(this,'integral')" class="layui-input len-short stock">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>余额:</label>
<div class="layui-input-block">
<input type="number" name="balance" lay-verify="required|required_balance" placeholder="请输入红包余额" value="{$exchange_info.balance}" onchange="detectionNumType(this,'positiveNumber')" class="layui-input len-short">
</div>
<p class="word-aux">兑换的红包会以余额的形式发放给指定会员</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否上架:</label>
<div class="layui-input-block">
<input id="state" type="checkbox" name="state" lay-skin="switch" {if $exchange_info['state'] == 1}checked {/if} value="1" lay-filter="state">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换规则:</label>
<div class="layui-input-block special-length">
<script id="containerT" name="content" type="text/plain" style="height: 300px;"></script>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="type" value="3">
<input type="hidden" name="id" value="{$exchange_info.id}">
<input type="hidden" id="contentT" value="{$exchange_info.content}" />
</div>
{/if}
<input type="hidden" id="type" value="{$exchange_info.type}" />
<a id="redPacketImage"></a>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="change-number">兑换次数</button>
<button class="layui-btn layui-btn-primary" lay-event="goods-integral">所需积分</button>
<button class="layui-btn layui-btn-primary" lay-event="goods-price">所需金额</button>
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var _type = $("#type").val();
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var upload;
//实例化富文本
var ue, html = '';
if (_type == 2) {
ue = UE.getEditor('container');
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
var con = $("#content").val();
ue.setContent(con); //获取html内容返回: <p>hello</p>
});
} else if (_type == 3) {
ue = UE.getEditor('containerT');
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
var con = $("#contentT").val();
ue.setContent(con); //获取html内容返回: <p>hello</p>
});
} else if(_type == 1){
ue = UE.getEditor('containerG');
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
var con = $("#contentG").val();
ue.setContent(con); //获取html内容返回: <p>hello</p>
});
}
var giftTable, couponTable, form, laytpl,sku_list;
{if $exchange_info['type'] == 1}
sku_list = {:json_encode($exchange_info.goods_sku, JSON_UNESCAPED_UNICODE)};
{/if}
layui.use(['form', 'laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
form.render();
upload = new Upload({
elem: '#redPacket',
auto:false,
bindAction:'#redPacketImage',
callback: function(res) {
uploadComplete('image', res.data.pic_path);
}
});
renderTable(sku_list);
//监听兑换方式
form.on('radio(pay_type)', function(data){
var value = data.value;
var html = '';
if(value == 1){
html = '<input type="number" name="point" min="0" lay-verify="required_point" autocomplete="off" class="layui-input len-short"> 积分' +
'&nbsp;&nbsp;+ &nbsp;&nbsp;<input type="number" name="price" min="0" lay-verify="required_money" autocomplete="off" class="layui-input len-short"> 元';
}
if(value == 0){
html = '<input type="number" name="point" min="0" lay-verify="required_point" autocomplete="off" class="layui-input len-short"> 积分';
}
$('.pay_price').html(html);
});
/**
* 商品列表搜索
*/
form.on('submit(gift-search)', function(data) {
giftTable.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('switch(shipping)', function(data){
if(data.elem.checked){
$(".ems_block").hide();
}else{
$(".ems_block").show();
}
});
//监听邮费设置
form.on('checkbox(delivery_type)', function(data){
if(data.elem.checked){
$("input[name='delivery_type']").prop("checked", false);
$(this).prop("checked", true);
form.render('checkbox');
$(this).siblings(".print").show();
$(this).parent().siblings().children(".print").hide()
}else{
$(this).siblings(".print").hide();
}
});
/**
* 监听表单提交
*/
form.on('submit(save)', function(data) {
if (_type == 1) {
var goods_list = [];
for (var i in sku_list){
if(sku_list[i]['is_select'] == 1){
goods_list.push(sku_list[i]);
}
}
if(goods_list.length == 0){
layer.msg('请选择商品', {icon: 5, anim: 6});
return false;
}
for (var i in sku_list){
if (parseFloat(sku_list[i]['point']) <= 0 && sku_list[i]['is_select'] == 1) {
layer.msg('兑换积分不能小于等于0', {icon: 5, anim: 6});
return false;
}
}
data.field.goods_data = goods_list;
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
}else if (_type == 2) {
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
} else if (_type == 3) {
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
}
data.field.content = html;
//不免邮
if(data.field.is_free_shipping==undefined){
data.field.is_free_shipping = 0;
}
if(data.field.is_free_shipping == 0 && data.field.type == 1){
data.field.delivery_type = $('[name="delivery_type"]:checked').val();
if(data.field.delivery_type==undefined){
layer.msg('请选择运费类型', {icon: 5, anim: 6});
return false;
}else if(data.field.delivery_type==0){
if(data.field.delivery_price==""){
layer.msg('请填写固定邮费', {icon: 5, anim: 6});
return false;
}
}else if(data.field.delivery_type==1){
if(data.field.shipping_template<=0){
layer.msg('请选择运费模版', {icon: 5, anim: 6});
return false;
}
}
}else{
data.field.delivery_type = "";
data.field.delivery_price = "";
data.field.shipping_template = 0;
}
saveData = data;
var obj = $("img.img_prev[data-prev='1']");
totalUploadNum = obj.length;
if(totalUploadNum > 0){
obj.each(function(){
var actionId = $(this).attr('data-action-id');
$(actionId).click();
})
}else{
saveFunc();
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
function saveFunc(){
var data = saveData;
// 删除图片
if(!data.field.image) upload.delete();
$.ajax({
url: ns.url("pointexchange://shop/exchange/edit"),
data: data.field,
dataType: 'JSON',
type: 'POST',
async: false,
success: function(res) {
if (res.code == 0) {
layer.confirm('编辑成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("pointexchange://shop/exchange/lists")
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
}
form.verify({
required_point: function(value) {
if (value == "") {
return '积分不能为空';
}
if (Number(value) <= 0){
return '积分必须大于0';
}
},
required_money: function(value) {
if (value == "") {
return '金额不能为空';
}
if (Number(value) <= 0){
return '价格必须大于0';
}
},
required_limit: function(value) {
if (Number(value) < 1){
return '兑换限制不能小于1';
}
},
required_coupon_stock: function(value) {
if (Number(value) <= 0){
return '可兑换数量必须大于0';
}
},
required_balance_stock: function(value) {
if (Number(value) <= 0){
return '可兑换数量必须大于0';
}
},
required_balance: function(value) {
if (Number(value) <= 0){
return '红包余额必须大于0';
}
}
})
});
function setSelect(status,id) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == parseInt(id)){
sku_list[i]['is_select'] = status;
}
}
renderTable(sku_list);
return false;
}
// 表格渲染
function renderTable(sku_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page: false,
limit: Number.MAX_VALUE,
cols: [
[{
width: "3%",
type: 'checkbox',
unresize: 'false'
},{
field: 'sku_name',
title: '商品名称',
width: '23%',
unresize: 'false',
templet: function(data) {
var html = '';
html += `
<div class="goods-title">
<div class="goods-img">
<img layer-src src="${data.sku_image ? ns.img(data.sku_image) : ''}" alt="">
</div>
<p class="multi-line-hiding goods-name" data-goods_id="${data.goods_id}" data-sku_id="${data.sku_id}" title="${data.sku_name}">${data.sku_name}</p>
</div>
`;
return html;
}
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'left',
width: '10%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'">¥<span>' + data.price +'</span></p>';
}
}, {
field: 'stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return '<p class="stock">' + data.stock +'</p>';
}
}, {
title: '<span title="兑换次数(0为不限次)">兑换次数(0为不限次)</span>',
unresize: 'false',
width: '14%',
templet: '#exchangeLimit'
}, {
title: '<span title="兑换所需积分">所需积分</span>',
unresize: 'false',
width: '12%',
templet: '#exchangePoint'
}, {
title: '<span title="兑换所需金额">所需金额</span>',
unresize: 'false',
width: '12%',
templet: '#exchangeMoney'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
data: sku_list,
toolbar: '#toolbarOperation'
});
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "change-number":
editInput(0,obj);
break;
case "goods-integral":
editInput(1,obj);
break;
case "goods-price":
editInput(2,obj);
break;
}
});
}
function editInput(textIndex=0,data) {
var text = [{
name: '兑换次数',
value: 'limit_num'
},{
name: '所需积分',
value: 'point'
},{
name: '所需金额',
value: 'exchange_price'
}];
layer.open({
type: 1,
title:"修改"+text[textIndex].name,
area:['600px'],
btn:["保存","返回"],
content: `
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>${text[textIndex].name}</label>
<div class="layui-input-block">
<input type="text" name="bargain_edit_input" lay-verify="required" autocomplete="off" class="layui-input len-mid" placeholder="请输入${text[textIndex].name}">
</div>
</div>
`,
yes: function(index, layero){
var val = $("input[name='bargain_edit_input']").val();
if (!val){
layer.msg("请输入" + text[textIndex].name);
return false;
}
data.data.forEach(function (item,index) {
sku_list.forEach(function (skuItem,skuIndex) {
if (item.sku_id == skuItem.sku_id){
sku_list[skuIndex][text[textIndex].value] = val;
}
})
});
renderTable(sku_list);
layer.closeAll();
}
});
}
function setSkulist(type, sku_id, obj, num_type){
var value = $(obj).val();
//大于零 且 不是小数
if (value < 0 && num_type == 'integral')
$(obj).val(0);
else if (num_type == 'integral')
$(obj).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && num_type == 'positiveInteger')
$(obj).val(1);
else if (num_type == 'positiveInteger')
$(obj).val(Math.round(value));
//大于零可以是小数
if (num_type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(obj).val(0);
else
$(obj).val(value);
}
$.each(sku_list, function (i, e) {
if(sku_id == e.sku_id){
sku_list[i][type] = $(obj).val();
}
})
}
$("body").off("click",".no-participation").on("click",".no-participation",function(){
$(this).text("参与");
$(this).parents("tr").find("input").each(function (index,item) {
$(item).attr("readonly",true);
$(item).attr("disabled",true);
$(item).addClass("forbidden");
$(item).attr("lay-verify","");
});
// pintuan_price promotion_price lay-verify
$(this).addClass("participation").removeClass("no-participation");
sku_list[$(this).parents("tr").attr("data-index")].is_select = 0;
});
$("body").off("click",".participation").on("click",".participation",function(){
$(this).text("不参与");
$(this).parents("tr").find("input").each(function (index,item) {
$(item).attr("readonly",false);
$(item).attr("disabled",false);
$(item).removeClass("forbidden");
// if($(item).hasClass(".pintuan-price")){
// $(item).attr("lay-verify","pintuan_price");
// }else{
// $(item).attr("lay-verify","promotion_price");
// }
// console.log($(item))
});
$(this).removeClass("participation").addClass("no-participation");
sku_list[$(this).parents("tr").attr("data-index")].is_select = 1;
});
//返回
function back() {
location.hash = ns.hash("pointexchange://shop/exchange/lists");
}
$("body").off('keyup', '.stock').on('keyup', '.stock', function() {
var value = $(this).val();
if(value % 1 !== 0){
layer.msg("红包数量请输入整数");
$(this).val(0);
}
});
$("body").off('keyup', '.expoint').on('keyup', '.expoint', function() {
var value = $(this).val() ;
if(value % 1 !== 0){
layer.msg("兑换积分请输入整数");
$(this).val(0);
}
});
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
function checkInput(obj){
$(obj).val(Math.abs($(obj).val()));
}
</script>

View File

@@ -0,0 +1,443 @@
<style>
.edit-sort{width: 70px !important;}
.contraction span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;user-select: none;}
.contraction-disable span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;user-select: none;}
.sku-list{overflow: hidden;padding: 0 45px;max-width: 100%;}
.sku-list li .img-wrap{vertical-align: middle;margin-right: 8px;width: 120px;height: 120px;text-align: center;line-height: 120px;}
.sku-list li .img-wrap img{max-width: 100%;max-height: 100%;}
.sku-list li .info-wrap span.sku-name{-webkit-line-clamp: 2;margin-bottom: 5px;}
.sku-list li .info-wrap span{display: -webkit-box;margin-bottom: 5px;overflow: hidden;text-overflow: ellipsis;white-space: normal;word-break: break-all;-webkit-box-orient: vertical;-webkit-line-clamp: 1;}
.sku-list li{float: left;display: flex;padding: 10px;margin-right: 10px;margin-bottom: 10px;border: 1px solid #EFEFEF;width: 294px;height: 180px;align-items: center;}
.layui-layout-admin.admin-style-2 .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加积分商品</button>
</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">
<input type="text" name="search_text" placeholder="兑换商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品状态:</label>
<div class="layui-input-inline">
<select name="state" lay-filter="state">
<option value="">全部</option>
<option value="1">上架</option>
<option value="0">下架</option>
</select>
</div>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="type_name">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="">全部</li>
<li lay-id="1">商品</li>
<li lay-id="2">优惠券</li>
<li lay-id="3">红包</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="exchange_list" lay-filter="exchange_list"></table>
</div>
</div>
<!-- 兑换信息 -->
<script type="text/html" id="exchange_info">
<div class="table-title">
{{# if(d.type == 1){ }}
<div class="contraction" data-id="{{d.id}}" data-open="0">
<span>+</span>
</div>
{{# }else{ }}
<div class="contraction-disable">
<span></span>
</div>
{{# } }}
{{# if(d.type == 1){ }}
<div class="title-pic">
{{# if(d.image){ }}
<img layer-src="{{ns.img(d.image.split(',')[0],'big')}}" src="{{ns.img(d.image.split(',')[0],'small')}}"/>
{{# } }}
</div>
{{# } }}
{{# if(d.type == 2){ }}
<div class="title-pic">
{{# if(d.image){ }}
<img layer-src src="{{ns.img(d.image)}}"/>
{{# }else{ }}
<img layer-src src="__STATIC__/img/coupon_default.png"/>
{{# } }}
</div>
{{# } }}
{{# if(d.type == 3){ }}
<div class="title-pic">
{{# if(d.image){ }}
<img layer-src src="{{ns.img(d.image)}}"/>
{{# }else{ }}
<img layer-src src="__STATIC__/img/hongbao_default.png"/>
{{# } }}
</div>
{{# } }}
<div class="contraction-disable">
<span></span>
</div>
<div class="title-content">
{{# if(d.type == 1){ }}
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.name}}">{{d.g_name}}</a>
{{# }else{ }}
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.name}}">{{d.name}}</a>
{{# } }}
</div>
</div>
</script>
<!-- 状态 -->
<script type="text/html" id="state">
{{d.state == 1?'上架':'下架'}}
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarAction">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
</script>
<!-- 编辑删除操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="order">兑换记录</a>
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="skuList">
<tr class="js-list-{{d.index}}" id="sku_img_{{d.index}}">
<td colspan="10">
<ul class="sku-list">
{{# for(var i=0; i<d.list.length; i++){ }}
<li>
<div class="img-wrap">
<img layer-src src="{{ns.img(d.list[i].sku_image)}}">
</div>
<div class="info-wrap">
<span class="sku-name" title="{{d.list[i].sku_name}}">{{d.list[i].sku_name}}</span>
<span class="price">商品价格{{d.list[i].market_price}}</span>
{{# if(d.list[i].price != 0 ){ }}
<span class="sale_num">兑换{{d.list[i].point}}积分 + {{d.list[i].price}} </span>
{{# }else{ }}
<span class="sale_num">兑换{{d.list[i].point}}积分 </span>
{{# } }}
<span class="price">库存{{d.list[i].stock}}</span>
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<script>
var table,laytpl;
$("body").off("click", ".contraction").on("click", ".contraction", function () {
var exchange_id = $(this).attr("data-id");
var open = $(this).attr("data-open");
var tr = $(this).parent().parent().parent().parent();
var index = tr.attr("data-index");
if (open == 1) {
$(this).children("span").text("+");
$(".js-list-" + index).remove();
} else {
$(this).children("span").text("-");
$.ajax({
url: ns.url("pointexchange://shop/exchange/getSkuList"),
data: {exchange_id: exchange_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
var sku_list = $("#skuList").html();
var data = {
list: res.data,
index: index
};
laytpl(sku_list).render(data, function (html) {
tr.after(html);
});
layer.photos({
photos: '.img-wrap',
anim: 5
});
}
});
}
$(this).attr("data-open", (open == 0 ? 1 : 0));
});
layui.use(['form', 'element', 'laytpl'], function() {
laytpl = layui.laytpl;
var form = layui.form,
element = layui.element,
repeat_flag = false; //防重复标识
form.render();
//监听Tab切换
element.on('tab(type_name)', function(data) {
var type = $(this).attr("lay-id");
table.reload( {
page: {
curr: 1
},
where: {
'type': type
}
});
});
table = new Table({
elem: '#exchange_list',
url: ns.url("pointexchange://shop/exchange/lists"),
cols: [
[{
type: 'checkbox',
width: '3%',
},{
field: 'name',
title: '兑换信息',
unresize: 'false',
width: '30%',
templet: '#exchange_info'
}, {
field: 'type_name',
title: '兑换类型',
unresize: 'false',
width: '10%',
}, {
title: '兑换价格',
unresize: 'false',
width: '10%',
templet: function(data) {
if(data.pay_type == 1){
return data.point+'积分 + '+data.price + "元";
}else{
return data.point+'积分';
}
}
}, {
field: 'create_time',
title: '添加时间',
unresize: 'false',
width: '15%',
align: 'center',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'state',
title: '状态',
unresize: 'false',
width: '10%',
align: 'center',
templet: '#state',
}, {
field: 'sort',
unresize:'false',
title: '排序',
width: '10%',
align: 'center',
templet: '#editSort',
sort: true
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
width: '12%',
align:'right'
}]
],
toolbar: '#toolbarAction'
});
// 监听工具栏操作
table.toolbar(function (obj) {
var data = obj.data;
if(data.length <= 0) return;
var exchangeIdAll = [];
for (var i in data){
exchangeIdAll.push(data[i].id);
}
switch (obj.event) {
case 'delete':
deleteExchangeAll(exchangeIdAll)
break;
}
})
function deleteExchangeAll(data){
layer.confirm('确定要删除商品吗?', function(index) {
if (repeat_flag) return false;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("pointexchange://shop/exchange/deleteAll"),
data: {exchange_id: data},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
table.reload({
page: {
curr: 1
},
});
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'order': //管理
location.hash = ns.hash("pointexchange://shop/pointexchange/lists?exchange_id=" + data.id);
break;
case 'edit': //管理
location.hash = ns.hash("pointexchange://shop/exchange/edit?id=" + data.id);
break;
case 'delete': //删除
deleteGift(data.id);
break;
}
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 删除
*/
function deleteGift(id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该商品吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("pointexchange://shop/exchange/delete"),
data: {id},
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;
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function add() {
location.hash = ns.hash("pointexchange://shop/exchange/add");
}
// 监听单元格编辑
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("pointexchange://shop/exchange/modifySort"),
data: {
sort: data,
id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,167 @@
<!-- 订单物流发货 -->
<style>
.delivery-box {
padding: 20px;
/*border-bottom:1px solid #e6e6e6;*/
}
.layui-table-body {
overflow: unset;
}
.delivery-content {
padding: 7px 0 !important;
}
.layui-table-view {
border-top: 1px solid #eee;
/*border-bottom: 1px solid #eee;*/
}
.order-delivery .layui-table {
/*margin-bottom: 30px;*/
}
.layui-form #order_goods_list thead th, .layui-form #order_goods_list tbody tr {
border-bottom: 1px solid #E6E6E6;
}
.layui-form #order_goods_list thead th {
background-color: #F5F5F5;
line-height: 30px;
}
.order-delivery .input-text {
height: auto;
min-height: 34px;
}
</style>
<!--发货订单弹出框-->
<script type="text/html" id="order_delivery_html">
<div class="order-delivery">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">收货地址</label>
<div class="layui-input-block">
<p class="input-text len-long"> {{ d.full_address }}{{ d.address }}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发货编号</label>
<div class="layui-input-block">
<input type="text" name="delivery_code" lay-verify="required" placeholder="" autocomplete="off" class="layui-input len-mid">
</div>
</div>
<input type="hidden" name="order_id" value="{{ d.order_id }}" class="layui-input" />
<div class="form-row">
<button type="button" class="layui-btn" lay-submit id="button_delivery_order" lay-filter="button_delivery_order" style="display:none;">保存
</button>
</div>
</div>
</div>
</script>
<script>
/**
* 外卖配送订单发货
*/
var submitting = false;
function orderDelivery(data) {
layui.use(['form', 'laytpl'], function () {
var laytpl = layui.laytpl, form = layui.form;
form.render();
//获取模板
var getTpl = $("#order_delivery_html").html();
laytpl(getTpl).render(data, function (html) {
layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
fixed: false,
scrollbar: false,
title: "订单发货",
area: '800px',
btn: ['保存'],
yes: function (index, layero) {
$("#button_delivery_order").click();
},
content: html,
cancel: function (index, layero) {
//右上角关闭回调
layer.close(index);
//return false 开启该代码可禁止点击该按钮关闭
},
success: function (layero, index) {
form.render();
form.on('submit(button_delivery_order)', function (data) {
if (submitting) return false;
submitting = true;
$.ajax({
type: "post",
url: ns.url("pointexchange://shop/pointexchange/delivery"),
async: true,
dataType: 'json',
data: data.field,
success: function (res) {
layer.msg(res.message, {}, function () {
submitting = false;
if (res.code == 0) {
listenerHash(); // 刷新页面
layer.closeAll();
}
});
}
})
});
}
});
})
})
}
function delivery(order_info){
//只有商品订单才需要发货
if(order_info.type == 1){
if(order_info.delivery_type == 'express'){
orderDelivery(order_info);
}else if(order_info.delivery_type == 'store'){
deliveryAction(order_info.order_id);
}else if(order_info.delivery_type == 'local'){
deliveryAction(order_info.order_id);
}
}
}
/**
* 配送操作
* @param order_id
*/
function deliveryAction(order_id){
$.ajax({
type: "post",
url: ns.url("pointexchange://shop/pointexchange/delivery"),
async: true,
dataType: 'json',
data: {order_id:order_id},
success: function (res) {
layer.msg(res.message, {}, function () {
if (res.code == 0) {
listenerHash(); // 刷新页面
layer.closeAll();
}
});
}
})
}
</script>

View File

@@ -0,0 +1,108 @@
<style>
.input-text {
height: auto;
}
</style>
<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">
<p class="input-text len-long">{$order_info.order_no}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">支付流水号:</label>
<div class="layui-input-block">
<p class="input-text len-long">{$order_info.out_trade_no}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换积分数:</label>
<div class="layui-input-block">
<p class="input-text len-mid">{$order_info.point}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换价格:</label>
<div class="layui-input-block">
<p class="input-text len-mid">{$order_info.exchange_price}</p>
</div>
</div>
{if $order_info.buyer_message != ''}
<div class="layui-form-item">
<label class="layui-form-label">买家留言:</label>
<div class="layui-input-block">
<p class="input-text len-mid">{$order_info.buyer_message}</p>
</div>
</div>
{/if}
</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">
<p class="input-text len-long">{$order_info.exchange_name}</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 square">
<div class="upload-img-box">
<img layer-src src="{:img($order_info.exchange_image)}" />
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">兑换数量:</label>
<div class="layui-input-block">
<p class="input-text len-mid">{$order_info.num}</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">类型名称:</label>
<div class="layui-input-block">
<p class="input-text len-mid">{$order_info.type_name}</p>
</div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="form-row">
<button type="button" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script>
layui.use('form', function() {
var form = layui.form;
form.render();
});
function back() {
location.hash = ns.hash("pointexchange://shop/pointexchange/lists")
}
</script>

View File

@@ -0,0 +1,333 @@
<link rel="stylesheet" href="POINTEXCHANGE_CSS/order_list.css"/>
<style>
.layui-layout-admin.admin-style-2 .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin.admin-style-2 .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
<!-- 搜索框 -->
<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">
<input type="text" name="search_text" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">会员名称</label>
<div class="layui-input-inline">
<input type="text" name="name" placeholder="请输入会员名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">会员电话</label>
<div class="layui-input-inline">
<input type="text" name="mobile" placeholder="请输入会员电话" autocomplete="off" class="layui-input">
</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_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="order_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="">全部</li>
<li lay-id="1">商品</li>
<li lay-id="2">优惠券</li>
<li lay-id="3">红包</li>
</ul>
<div class="layui-tab-content">
<div id="order_list"></div>
</div>
<div id="order_page"></div>
</div>
<script src="POINTEXCHANGE_JS/order_list.js"></script>
<script>
var form,laypage,element,laydate;
var is_refresh = false;
var order_type_status_json = {'1': '商品', '2': '优惠券', '3': '红包'};
layui.use(['laypage','laydate','form', 'element'], function(){
form = layui.form;
laypage = layui.laypage;
element = layui.element;
laydate = layui.laydate;
form.render();
// 支付时间
laydate.render({
elem: '#start_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
//监听Tab切换以改变地址hash值
element.on('tab(order_tab)', function(){
$(".all-selected-checkbox input").prop("checked",false);
var type = this.getAttribute('lay-id');
var hash_data = getHashList();
hash_data.type = type;
hash_data.page = 1;
setHashOrderList(hash_data);
});
//监听筛选事件
form.on('submit(search)', function(data){
is_refresh = true;
data.field.page = 1;
resetOrderStatus(data.field.order_type, 2);
setHashOrderList(data.field);
setOrderStatusTab(data.field.order_status);
return false;
});
getHashData();
getOrderList();//筛选
});
var order = new Order();
function getOrderList(){
var url = ns.url("pointexchange://shop/pointexchange/lists", getHashArr().join('&'));
$.ajax({
type : 'get',
dataType: 'json',
url :url,
success : function(res){
if(res.code == 0){
order.setData(res.data);
$("#order_list").html(order.fetch());
form.render();
laypage_util = new Page({
elem: 'order_page',
count: res.data.count,
curr: getHashPage(),
limit:getHashData()['page_size'] || 10,
callback: function(obj){
var hash_data = getHashData();
hash_data.page = obj.curr;
hash_data.page_size = obj.limit;
setHashOrderList(hash_data);
}
});
}else{
layer.msg(res.message);
}
}
});
}
// 通过hash获取页数
function getHashPage(){
var page = 1;
var startTime = '';
var endTime = '';
var hash_arr = getHashArr();
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
switch(item_arr[0]){
case "page":
page = item_arr[1];
break;
case "start_time":
startTime = ns.date_to_time(item_arr[1].split("%")[0]);
break;
case "end_time":
endTime = ns.date_to_time(item_arr[1].split("%")[0]);
break;
}
}
});
var _time = (endTime - startTime) / (24 * 60 * 60);
if (_time == 6) {
$(".date-picker-btn-seven").addClass("selected");
$(".date-picker-btn-thirty").removeClass("selected");
} else if (_time == 29) {
$(".date-picker-btn-thirty").addClass("selected");
$(".date-picker-btn-seven").removeClass("selected");
} else {
$(".date-picker-btn-seven").removeClass("selected");
$(".date-picker-btn-thirty").removeClass("selected");
}
return page;
}
//从hash中获取数据
function getHashData(){
var hash_arr = getHashArr();
var form_json = {
"start_time" : "",
"end_time" : "",
"nickname" : "",
"order_no" : "",
"type" : "",
'page_size':'',
"page" : ""
};
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
$.each(form_json,function(key, form_val){
if(item_arr[0] == key){
form_json[key] = item_arr[1];
}
})
}
})
}
resetOrderStatus(form_json.type, 2);
setOrderStatusTab(form_json.type);
return form_json;
}
function getHashList(){
var hash_arr = getHashArr();
var form_json = {
"start_time" : "",
"end_time" : "",
"nickname" : "",
"order_no" : "",
"type" : "",
'page_size':'',
"page" : ""
};
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
$.each(form_json,function(key, form_val){
if(item_arr[0].indexOf(key) != "-1"){
form_json[key] = item_arr[1];
}
})
}
})
}
return form_json;
}
function setOrderStatusTab(order_status){
$(".layui-tab-title li").removeClass("layui-this");
$(".layui-tab-title li").each(function(){
var status = $(this).attr("lay-id");
if(status == order_status){
$(this).addClass("layui-this")
}
});
}
//重置状态tab 选项卡
function resetOrderStatus(order_type, is_tab){
var hash_order_type = getHashOrderType();
if(hash_order_type != order_type || is_refresh == false){
if(is_tab != 1 || is_refresh == false) {
$(".layui-tab-title li").not(':first').remove();
$(".layui-tab-title li:first").addClass("layui-this");
}
$.each(order_type_status_json,function(index, itemobj){
if(is_tab != 1 || is_refresh == false) {
$(".layui-tab-title").append('<li lay-id="' + index + '">' + itemobj + '</li>');
}
});
form.render('select');
}
}
/**
* 获取哈希值order_type
*/
function getHashOrderType(){
var hash_arr = getHashArr();
var type = "";
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
if(item_arr[0].indexOf("type") != "-1") {
type = item_arr[1];
}
}
})
}
return type;
}
function setHashOrderList(data){
var hash = ['url=pointexchange://shop/pointexchange/lists'];
for (let key in data) {
if (data[key] != '' && data[key] != 'all') {
hash.push(`${key}=${data[key]}`)
}
}
location.hash = hash.join('&');
localStorage.setItem('formSubmit','search'); // 表单搜索标识,防止页面重新加载
getOrderList();
}
/**
* 七天时间
*/
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
Date.prototype.Format = function (fmt,date_num) { //author: meizz
this.setDate(this.getDate()-date_num);
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"H+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
var before_time = new Date().Format("yyyy-MM-dd 00:00:00",date_num-1);//前几天日期
$("input[name=start_time]").val(before_time,0);
$("input[name=end_time]").val(now_time,date_num-1);
}
</script>

View File

@@ -0,0 +1,78 @@
.layui-table {margin-top: 15px;}
.layui-table thead tr {background-color: #F8F6F9;}
.layui-table th {border-width: 0; font-size: 14px!important;}
.layui-table td {padding: 8px 15px;}
.layui-table .header-row {border-top: 1px solid #e6e6e6;background: #f7f7f7;}
.layui-table .header-row:hover{background: #f7f7f7 !important;}
.separation-row hr {margin: 0;}
/* .layui-layout-admin .layui-body{min-width:1100px} */
/*.date-picker-btn.selected{background-color:#0d73f9;color:#fff}*/
.layui-table td,.layui-table th,.layui-table-fixed-r,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-color:#f1f1f1 !important;}
.layui-table thead th{border-bottom:none;padding-left:0;padding-right:0;}
.order-list-table .separation-row td{padding:10px 20px;border: 0;}
.order-list-table .separation-row:hover{background-color: #fff;}
.order-list-table .remark-row{background: #FFF9DF!important;color: #D09B4C;}
.order-list-table .remark-row:hover{background: #FFF9DF!important}
.order-list-table .header-row td{padding: 8px 15px!important;}
.order-list-table .header-row td:nth-child(1){border-right: 0;}
.order-list-table .header-row td:nth-child(2){text-align:center;border-left: 0;}
.order-list-table .header-row span{vertical-align:middle}
.order-list-table .header-row td .order-item-header{text-align:left;color:#333;}
.order-list-table .header-row td .order-item-header.more{cursor: pointer;overflow: hidden;position: relative;}
.order-list-table .header-row td .more-operation{display: none;font-size: 14px;line-height: 20px;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 8px 0 rgba(200,201,204,.5);position: absolute;z-index: 2000;padding: 10px;top: 28px;transform: translateX(10px);left: -12px;width: 200px;}
.order-list-table .header-row td .more-operation:before{left: 8px;top: -14px;border: solid transparent;content: "";height: 0;width: 0;position: absolute;pointer-events: none;border-color: transparent;border-bottom-color: #fff;border-width: 8px;}
.order-list-table .header-row td .more-operation span{color:#333;}
.order-list-table .checkbox-all .layui-table-cell{padding:0;text-align:center;}
.order-list-table .product-info .layui-table-cell{padding:0 5px}
.order-list-table .content-row:hover{background-color:#fff !important;}
.order-list-table .content-row .product-info{border-right: 0;}
.order-list-table .content-row .product-info .img-block{width:60px;height:60px;float:left;border:1px solid #e2e2e2;display: flex;align-items: center;justify-content: center;}
.order-list-table .content-row .product-info .img-block>img{max-width:100%;max-height:100%;}
.order-list-table .content-row .product-info .info{margin-left:70px}
.order-list-table .content-row .product-info .info p{color:#8e8c8c;font-size:12px}
.order-list-table .content-row .order-price{border-left: 0;}
.order-list-table .content-row .product-list{border-right-width:1px}
.order-list-table .content-row .product-list p{font-size:12px}
.order-list-table .content-row .transaction-status{line-height: 24px;}
.order-list-table .content-row .buyers{line-height: 24px;}
.order-list-table .operation a{font-size: 14px;}
.order-list-table .text-tile{color:rgb(164,164,164);}
.order-no-data-block ul{width:200px;margin:20px auto; padding-bottom: 20px;}
.order-no-data-block ul li{text-align:center;color:#c2c2c2}
.order-no-data-block ul li:first-child{height:70px;line-height:70px}
.order-no-data-block ul li:first-child i{font-size:35px}
.footer-row{border:1px solid #f2f2f2}
.screen{margin-top: 0;}
/*.order-money span {color: red;}*/
#order_page {text-align: right;}
.bottom-row{color:#e0a723;background: #fffbec;}
.bottom-row:hover{background: #fffbec!important;}
.table-tab .layui-tab-content {padding-top: 0;}
.line-hiding{ cursor : default; -webkit-line-clamp: 2 !important;}
.address_box{width:87%; display: inline-block}
.address_input{width: 1px;height: 0px;overflow: hidden;border: 0px}
.screen .layui-colla-title .layui-colla-icon{color:#3D88FB !important}
.screen .layui-colla-title .text-color{position: absolute;right: 45px;font-size: 14px;padding: 5px;}
.operation .operation-type{display: block;}
.operation .operation-type .layui-btn{display: inline;text-align: left;line-height: 23px;padding: 0px;margin: 0px;padding-left:8px;}
.layui-colla-title .put-open{position: absolute;right: 40px;padding: 5px;color: #3D88FB ;}
.content-row .order-price {
border-left: 0;
}
.content-row .card-info {
border-right: 0;
}
/*订单顶部的一行*/
.order-list-top-line{justify-content:flex-end;}
.order-list-top-line a{padding-right: 0px !important;}
.order-list-table .order-goods{align-items: flex-start !important;}
.order-list-table .order-goods .info{margin-top: 3px;}
.order-list-table .order-goods , .order-list-table .order-goods-item{display: flex;align-items: center;}
.order-list-table .order-goods .img-block{margin-right: 10px;width: 60px;height: 60px;flex-shrink: 0;border: 1px solid #e2e2e2;display: flex;align-items: center;justify-content: center;}
.order-list-table .order-goods .img-block img{max-width: 100%;max-height: 100%;}
.order-list-table .order-goods-item{margin-top: 10px;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,277 @@
/**
* 渲染订单列表
*/
Order = function () {};
/**
* 设置数据集
*/
Order.prototype.setData = function (data) {
Order.prototype.data = data;
};
/**
* 列名数据
*/
Order.prototype.cols = [
{
type: 'checkbox',
fixed: 'left',
width: '3%',
merge: true,
template: function (orderitem, order) {
var json = {}
json.order_id = order.order_id;
json.order_no = order.order_no;
json.giftcard_id = order.giftcard_id;
var h = '<div class="sub-selected-checkbox" data-json='+ JSON.stringify(json) +' data-id='+ order.order_id +' >';
h += '<input type="checkbox" lay-skin="primary" lay-filter="subCheckbox" name="" >';
h += '</div>';
return h;
}
},
{
title: '<span>兑换内容</span>',
width: "30%",
align: "left",
className: "card-info",
template: function (orderitem, order) {
var h = '';
var img = orderitem.exchange_image ? ns.img(orderitem.exchange_image.split(",")[0]) : '__STATIC__/img/shape.png'
h += '<div class="order-goods">';
h += '<div class="img-block">';
h += '<img layer-src="' + img + '" src="' + img + '">';
h += '</div>';
h += '<div class="info">';
h += '<span title="' + orderitem.exchange_name + '" class="multi-line-hiding text-color-sub">' + orderitem.exchange_name + '</span>';
h += '</div>';
h += '</div>';
return h;
}
},
{
title: "数量",
width: "6%",
align: "center",
className: "order-price",
template: function (orderitem, order) {
var h = '<div style="text-align: center;">';
h += '<span>' + orderitem.num + '件</span>';
h += '</div>';
return h;
}
},
{
title: "兑换类型",
width: "10%",
align: "left",
className: "card-right-type",
template: function (orderitem, order) {
var h = '<div style="padding-left: 15px;">';
h += '<span>' + orderitem.type_name + '</span>';
h += '</div>';
return h;
}
},
{
title: "积分价格",
width: "14%",
align: "left",
className: "order-money",
merge: true,
template: function (orderitem, order) {
var h = '<div style="padding-left: 15px;">';
h += '<div>积分:' + orderitem.point + '</div>';
if(orderitem.exchange_price > 0) {
h += '<div>实付:' + orderitem.exchange_price + '元</div>';
}
h += '</div>';
return h;
}
},
{
title: "买家",
width: "14%",
align: "left",
className: "table-member-td",
template: function (orderitem, order) {
var h = '';
h += '<p>';
h += '<a class="text-color" target="_blank" href="' + ns.href("shop/member/editmember?member_id=") + order.member_id + '">' + order.nickname + '</a>';
h += '</p>';
h += '<p>';
h += '<span>' + order.name + '&nbsp;&nbsp;</span>';
h += '<span style="">' + order.mobile + '</span>';
h += '</p>';
h += '<span class="line-hiding address_box" title="' + order.full_address + ' ' + order.address + '">' + order.full_address + " " + order.address +'</span>';
return h;
}
},
{
title: "状态",
width: "10%",
align: "left",
className: "transaction-status",
merge: true,
template: function (orderitem, order) {
switch (orderitem.order_status){
case 0:
return '<div style="padding-left: 15px;">待支付</div>';
case 1:
return '<div style="padding-left: 15px;">已支付</div>';
case -1:
return '<div style="padding-left: 15px;">已关闭</div>';
}
}
},
{
title : "兑换时间",
width : "15%",
align : "center",
className : "create-time",
merge : true,
template : function(orderitem,order){
return '<div>' + ns.time_to_date(order.pay_time) + '</div>';
}
},
{
title: "操作",
align: "right",
className: "operation",
merge: true,
template: function (orderitem, order) {
var html='';
html += '<div>';
html += '<a class="layui-btn text-color" href="'+ns.href("pointexchange://shop/pointexchange/detail", {order_id: orderitem.order_id}) +'">详情</a>';
if(orderitem.relate_order_id > 0){
html += '<a class="layui-btn text-color" href="'+ns.href("shop/order/detail", {order_id: orderitem.relate_order_id}) +'">查看订单</a>';
}
html += '</div>';
return html;
}
}
];
/**
* 渲染表头
*/
Order.prototype.header = function (hasThead) {
var colgroup = '<colgroup>';
var thead = '';
if (hasThead) thead = '<thead><tr>';
for (var i = 0; i < this.cols.length; i++) {
var align = this.cols[i].align ? "text-align:" + this.cols[i].align : "";
colgroup += '<col width="' + this.cols[i].width + '">';
if (hasThead) {
thead += '<th style="' + align + '" class="' + (this.cols[i].className || "") + '">';
thead += '<div class="layui-table-cell">';
if(this.cols[i].type){
thead += '<div class="all-selected-checkbox">';
thead += '<input type="checkbox" lay-skin="primary" lay-filter="allCheckbox" name="">';
thead += '</div>';
}else{
thead += this.cols[i].title;
}
thead += '</div>';
thead += '</th>';
}
}
colgroup += '</colgroup>';
if (hasThead) thead += '</tr></thead>';
return colgroup + thead;
};
/**
* 渲染内容
*/
Order.prototype.tbody = function () {
var tbody = '<tbody>';
for (var i = 0; i < this.data.list.length; i++) {
var order = this.data.list[i];
if (i > 0) {
//分割行
tbody += '<tr class="separation-row">';
tbody += '<td colspan="' + this.cols.length + '"></td>';
tbody += '</tr>';
}
//订单项头部
tbody += '<tr class="header-row">';
tbody += '<td colspan="9">';
tbody += '<span class="order-item-header" style="margin-right:10px;">订单号:' + order.order_no + '</span>';
tbody += '<span class="order-item-header text-color more" style="margin-right:50px;" onclick="showMore(' + order.order_id + ')">更多';
tbody += '<div class="more-operation" data-order-id="' + order.order_id + '">';
tbody += '<span>支付流水号:' + order.out_trade_no + '</span>';
tbody += '</div></span>';
tbody += '<span class="order-item-header" style="margin-right:50px;">下单时间:' + ns.time_to_date(order.create_time) + '</span>';
tbody += '<span class="order-item-header" style="margin-right:50px;">订单来源:'+ order.order_from_name + (order.is_video_number ? '(视频号)' : '') +'</span>';
tbody += '</td>';
tbody += '</tr>';
var orderitemHtml = '';
loadImgMagnify();
orderitemHtml += '<tr class="content-row">';
for (var k = 0; k < this.cols.length; k++) {
orderitemHtml += '<td class="' + (this.cols[k].className || "") + '" align="' + (this.cols[k].align || "") + '" style="' + (this.cols[k].style || "") + '" rowspan="1">';
orderitemHtml += this.cols[k].template(order, order);
orderitemHtml += '</td>';
}
orderitemHtml += '</tr>';
tbody += orderitemHtml;
if(order.buyer_message != '') {
//订单项底部
tbody += '<tr class="bottom-row">';
tbody += '<td colspan="9">';
tbody += '<span class="order-item-header" style="margin-right:10px;">买家备注:' + order.buyer_message + '</span>';
tbody += '</td>';
tbody += '</tr>';
}
}
tbody += '</tbody>';
return tbody;
};
/**
* 渲染表格
*/
Order.prototype.fetch = function () {
if (this.data.list.length > 0) {
return '<table class="layui-table layui-form">' + this.header(true) + '</table><table class="layui-table order-list-table layui-form">' + this.header(false) + this.tbody() + '</table>';
} else {
return '<table class="layui-table order-list-table layui-form">' + this.header(true) + '</table>' + '<div class="order-no-data-block"><ul><li><i class="layui-icon layui-icon-tabs"></i> </li><li>暂无订单</li></ul></div>';
}
};
function showMore(order_id) {
$(".more-operation[data-order-id]").hide();
$(".more-operation[data-order-id='" + order_id + "']").show();
$("body").bind('click',function (e) {
if (!$(e.target).closest(".order-item-header.more").length) {
$(".more-operation[data-order-id='" + order_id + "']").hide();
$("body").unbind('click');
}
});
}
$(".layui-colla-title").on("click", function(){
if($(".layui-colla-title>i").hasClass("layui-icon-down") === false && $(".layui-colla-title>i").hasClass("layui-icon-up") === false){
$(".layui-colla-title .put-open").html("展开");
}else if($(".layui-colla-title>i").hasClass("layui-icon-down") === true){
$(".layui-colla-title .put-open").html("展开");
}else if($(".layui-colla-title>i").hasClass("layui-icon-up") === true){
$(".layui-colla-title .put-open").html("收起");
}
})