Forráskód Böngészése

Merge branch 'liuxiangxin' into jun

jun 5 hónapja
szülő
commit
afd24e9719

+ 164 - 0
app/Http/Controllers/Admin/CouponProductExclude.php

@@ -0,0 +1,164 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Http\Requests\Admin\CouponProductExclude as Request;
+use App\Models\Product;
+use App\Models\CouponProductExclude as Model;
+use App\Models\Coupon;
+
+/**
+ * 优惠券排除规则产品范围
+ *
+ * @author    刘相欣
+ *
+ */
+class CouponProductExclude extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','营销管理');
+		$this->assign('breadcrumb2','优惠券排除商品');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,Coupon $Coupon,Product $Product){
+		// 接收参数
+		$couponCode				= request('coupon_code','');
+		$productCode			= request('product_code','');
+		$productId				= $Product->codeToId($productCode);
+		$couponId				= $Coupon->codeToId($couponCode);
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $couponId )			$map[] = ['coupon_product_exclude.coupon_id','=',$couponId];
+		if( $productId )		$map[] = ['product.id','=',$productId];
+		// 查询数据
+		$list					= $Model->query()
+									->join('product','coupon_product_exclude.product_id','=','product.id')
+									->join('coupon','coupon.id','=','coupon_product_exclude.coupon_id')
+									->where($map)
+									->orderByDesc('id')
+									->select(['coupon_product_exclude.*','product.name as product_name','coupon.name as coupon_name'])
+									->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			$value['coupon_code'] = $Coupon->idToCode($value['coupon_id']);
+			$value['product_code'] = $Product->idToCode($value['product_id']);
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 分配数据
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		$this->assign('list',$list);
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+	/**
+	 * 添加
+	 * 
+	 * */
+	public function add(Request $request,Model $Model,Product $Product,Coupon $Coupon){
+		if( request()->isMethod('post') ){
+			// 验证参数
+			$request->scene('add')->validate();
+			// 接收数据
+			$productCode			= request('product_code','');
+			$couponCode				= request('coupon_code','');
+			$data['product_id']		= $Product->codeToId($productCode);
+			$data['coupon_id']		= $Coupon->codeToId($couponCode);
+			// 如果操作失败
+			if( !$data['product_id'] ) return json_send(['code'=>'error','msg'=>'请填写正确的产品编码']);
+			if( !$data['coupon_id'] ) return json_send(['code'=>'error','msg'=>'请填写正确的优惠券编码']);
+			// 查询产品ID是否存在
+			$oldId					= $Model->query()->where([['coupon_id','=',$data['coupon_id']],['product_id','=',$data['product_id']]])->value('id');
+			// 重复提醒
+			if( $oldId ) 			return json_send(['code'=>'error','msg'=>'产品编码已存在']);
+			// 写入数据表
+			$id						= $Model->add($data);
+			// 如果操作失败
+			if( !$id ) 				return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
+		}
+		// 分配数据
+		$this->assign('crumbs','新增');
+		// 加载模板
+		return						$this->fetch(); 
+	}
+
+	/**
+	 * 修改
+	 * 
+	 * */
+	public function edit(Request $request,Model $Model,Product $Product,Coupon $Coupon){
+		// 接收参数
+		$id							= request('id',0);
+		// 查询用户
+		$oldData					= $Model->where(['id'=>$id])->first();
+		// 修改
+		if(request()->isMethod('post')){
+			// 验证参数
+			$request->scene('edit')->validate();
+			// 接收数据
+			$productCode			= request('product_code','');
+			$couponCode				= request('coupon_code','');
+			$data['product_id']		= $Product->codeToId($productCode);
+			$data['coupon_id']		= $Coupon->codeToId($couponCode);
+			// 如果操作失败
+			if( !$data['product_id'] ) return json_send(['code'=>'error','msg'=>'请填写正确的产品编码']);
+			if( !$data['coupon_id'] ) return json_send(['code'=>'error','msg'=>'请填写正确的优惠券编码']);
+			// 查询产品ID是否存在
+			$oldId					= $Model->query()->where([['coupon_id','=',$data['coupon_id']],['product_id','=',$data['product_id']]])->value('id');
+			// 重复提醒
+			if( $oldId && $oldId != $id ) return json_send(['code'=>'error','msg'=>'产品编码已存在']);
+			// 写入数据表
+			$result					= $Model->edit($id,$data);
+			// 如果操作失败
+			if( !$result ) 			return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
+		}
+		// 错误告知
+		if( !$oldData )				return $this->error('查无数据');
+		// 产品编码
+		$oldData['product_code'] 	= $Product->idToCode($oldData['product_id']);
+		$oldData['coupon_code'] 	= $Coupon->idToCode($oldData['coupon_id']);
+		// 分配数据
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','修改');
+		// 加载模板
+		return						$this->fetch();
+	}
+
+	/**
+	 * 修改状态
+	 * 
+	 * */
+	public function set_status(Request $request,Model $Model){
+		// 验证参数
+		$request->scene('set_status')->validate();
+		// 设置状态
+		$id				= request('id',0);
+		$status			= request('status',0);
+		// 查询用户
+		$oldData		= $Model->where(['id'=>$id])->first();
+		// 如果用户不存在
+		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
+		// 执行修改
+		$result			= $Model->edit($id,['status'=>$status]);		
+		// 提示新增失败
+		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
+		// 记录行为
+		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['status'=>$status]);
+		// 告知结果
+		return 			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
+	}
+
+}

+ 29 - 15
app/Http/Controllers/Admin/CustomScore.php

@@ -154,10 +154,18 @@ class CustomScore extends Auth{
 		if( isset($sheetList['error']) )	return json_send(['code'=>'error','msg'=>$sheetList['error']]);
 		// 通过微伴ID查询用户ID
 		$uidList							= $WeiBanExternal->query()->whereIn('id',array_column($sheetList,'weiban_extid'))->pluck('custom_uid','id')->toArray();
+		// 未知用户
+		$noUsers							= [];
 		// 循环列表
 		foreach ($sheetList as $key=>$value) 		{
 			// 如果查询不到数据
-			if( empty($uidList[$value['weiban_extid']]) )   return json_send(['code'=>'error','msg'=>$value['weiban_extid'].'不在系统内']);
+			if( empty($uidList[$value['weiban_extid']]) )   {
+				// 判断
+				$noUsers[]					= $value['weiban_extid'];
+				$noUsers[]					= $value['weiban_extid'];
+				unset($sheetList[$key]);
+				continue;
+			}
 			// 获取客户ID
 			$value['custom_uid']			= $uidList[$value['weiban_extid']];
 			// 重组
@@ -165,22 +173,28 @@ class CustomScore extends Auth{
 		}
 		// 组合数据,写入订单表,子表
 		DB::beginTransaction();
-		// 循环表格数据
-		foreach ($sheetList as $value) 		{
-			// 写入数据表
-			$payId							= $Model->trade($value['custom_uid'],0,$value['score'],4,($value['score']>0?1:2),$value['description']);
-			// 如果操作失败
-			if( isset($payId['error']) ) 	{
-				// 回滚
-				DB::rollBack();
-				// 结果提示
-				return 						json_send(['code'=>'error','msg'=>$value['weiban_extid'].'=>'.$payId['error']]);
+		// 错误信息
+		try {
+			// 循环表格数据
+			foreach ($sheetList as $value) 		{
+				// 写入数据表
+				$payId							= $Model->trade($value['custom_uid'],0,$value['score'],4,($value['score']>0?1:2),$value['description']);
+				// 如果操作失败
+				if( isset($payId['error']) ) 	{
+					// 回滚
+					DB::rollBack();
+					// 结果提示
+					return 						json_send(['code'=>'error','msg'=>$value['weiban_extid'].'=>'.$payId['error']]);
+				}
 			}
+			// 提交事务
+			DB::commit();
+			// 提示成功
+			return								json_send(['code'=>'success','msg'=>($noUsers? ' 以下不存用户<br/>'.implode('<br/>',$noUsers) : '批量导入成功'),'path'=>'']);
+		} catch (\Throwable $th) {
+			// 提示成功
+			return								json_send(['code'=>'success','msg'=>'批量导入失败','path'=>'','data'=>['error'=>$th->getMessage()]]);
 		}
-		// 提交事务
-		DB::commit();
-		// 提示成功
-		return								json_send(['code'=>'success','msg'=>'批量导入成功','path'=>'']);
 	}
 
 }

+ 36 - 26
app/Http/Controllers/Admin/Orders.php

@@ -41,6 +41,7 @@ class Orders extends Auth{
     public function index(Model $Model,OrdersProduct $OrdersProduct,Product $Product,Custom $Custom){
 		// 接受参数
 		$code					= request('order_code','');
+		$orders_other			= request('orders_other',0);
 		$productCode			= request('product_code','');
 		$phone					= request('phone','');
 		$customCode				= request('custom_code','');
@@ -59,6 +60,8 @@ class Orders extends Auth{
 		$map 					= [];
 		// 编码ID
 		if( $id )				$map[] = ['orders_product.order_id','=',$id];
+		// 编码ID
+		if( $orders_other )		$map[] = $orders_other == 1 ? ['orders_product.product_id','>',0] : ['orders_product.product_id','=',0];
 		if( $uid )				$map[] = ['custom.uid','=',$uid];
 		if( $productId )		$map[] = ['orders_product.product_id','=',$productId];
 		if( $productName )		$map[] = ['orders_product.product_name','LIKE','%'.$productName.'%'];
@@ -357,6 +360,7 @@ class Orders extends Auth{
 		// 接受参数
 		$code					= request('order_code','');
 		$productCode			= request('product_code','');
+		$orders_other			= request('orders_other',0);
 		$customCode				= request('custom_code','');
 		$productName			= request('product_name','');
 		$phone					= request('phone','');
@@ -375,6 +379,8 @@ class Orders extends Auth{
 		// 编码ID
 		if( $id )				$map[] = ['orders_product.order_id','=',$id];
 		if( $uid )				$map[] = ['custom.uid','=',$uid];
+		// 编码ID
+		if( $orders_other )		$map[] = $orders_other == 1 ? ['orders_product.product_id','>',0] : ['orders_product.product_id','=',0];
 		if( $productId )		$map[] = ['orders_product.product_id','=',$productId];
 		if( $productName )		$map[] = ['orders_product.product_name','=',$productName];
 		if( $phone )			$map[] = ['orders_addr.contact_phone','=',$phone];
@@ -394,6 +400,7 @@ class Orders extends Auth{
 										'orders_product.id as id',
 										'orders_product.order_id',
 										'orders_product.custom_uid',
+										'orders_product.product_id',
 										'orders_product.product_name',
 										'orders_product.sku_attr_names as product_spec',
 										'orders_product.product_thumb',
@@ -431,7 +438,7 @@ class Orders extends Auth{
 			$data[$value['order_id']]['contact_area'] = $value['contact_area'];
 			$data[$value['order_id']]['contact_addr'] = $value['contact_addr'] .($value['contact_shop'] ? '【'.$value['contact_shop'].'】' : '');
 			// 子订单
-			$data[$value['order_id']]['product'][] 	  = ['product_name'=>$value['product_name'],'product_spec'=>$value['product_spec'],'product_thumb'=>$value['product_thumb'],'product_price'=>$value['product_price'],'pay_price'=>$value['pay_price'],'buy_num'=>$value['buy_num'],'pay_total'=>$value['pay_total'],'price_total'=>$value['price_total'],'coupon_total'=>$value['coupon_total']];
+			$data[$value['order_id']]['product'][] 	  = ['product_id'=>$value['product_id'] ? $Product->idToCode($value['product_id']) : '— —','product_name'=>$value['product_name'],'product_spec'=>$value['product_spec'],'product_thumb'=>$value['product_thumb'],'product_price'=>$value['product_price'],'pay_price'=>$value['pay_price'],'buy_num'=>$value['buy_num'],'pay_total'=>$value['pay_total'],'price_total'=>$value['price_total'],'coupon_total'=>$value['coupon_total']];
 		}
 
 		try {
@@ -486,17 +493,18 @@ class Orders extends Auth{
 			$sheet->setCellValue('H'.$row, $value['contact_city']);
 			$sheet->setCellValue('I'.$row, $value['contact_area']);
 			$sheet->setCellValue('J'.$row, $value['contact_addr']);
-			$sheet->setCellValue('R'.$row, $value['weiban_extid']);
-			$sheet->setCellValue('S'.$row, date('Y-m-d H:i:s',$value['insert_time']));
+			$sheet->setCellValue('S'.$row, $value['weiban_extid']);
+			$sheet->setCellValue('T'.$row, date('Y-m-d H:i:s',$value['insert_time']));
 			// 循环产品
 			foreach ($value['product'] as $v) {
-				$sheet->setCellValue('K'.$row, $v['product_name']);
-				$sheet->setCellValue('L'.$row, $v['product_spec']);
-				$sheet->setCellValue('M'.$row, $v['product_price']);
-				$sheet->setCellValue('N'.$row, $v['pay_price']);
-				$sheet->setCellValue('O'.$row, $v['buy_num']);
-				$sheet->setCellValue('P'.$row, $v['coupon_total']);
-				$sheet->setCellValue('Q'.$row, $v['pay_total']);
+				$sheet->setCellValue('K'.$row, $v['product_id']);
+				$sheet->setCellValue('L'.$row, $v['product_name']);
+				$sheet->setCellValue('M'.$row, $v['product_spec']);
+				$sheet->setCellValue('N'.$row, $v['product_price']);
+				$sheet->setCellValue('O'.$row, $v['pay_price']);
+				$sheet->setCellValue('P'.$row, $v['buy_num']);
+				$sheet->setCellValue('Q'.$row, $v['coupon_total']);
+				$sheet->setCellValue('R'.$row, $v['pay_total']);
 				// 函数自增
 				$row++;
 			}
@@ -529,21 +537,22 @@ class Orders extends Auth{
 		$sheet->getColumnDimension('H')->setWidth(15);
 		$sheet->getColumnDimension('I')->setWidth(15);
 		$sheet->getColumnDimension('J')->setWidth(50);
-		$sheet->getColumnDimension('K')->setWidth(80);
+		$sheet->getColumnDimension('K')->setWidth(20);
 		$sheet->getColumnDimension('L')->setWidth(80);
-		$sheet->getColumnDimension('M')->setWidth(10);
+		$sheet->getColumnDimension('M')->setWidth(80);
 		$sheet->getColumnDimension('N')->setWidth(10);
 		$sheet->getColumnDimension('O')->setWidth(10);
 		$sheet->getColumnDimension('P')->setWidth(10);
 		$sheet->getColumnDimension('Q')->setWidth(10);
-		$sheet->getColumnDimension('R')->setWidth(50);
-		$sheet->getColumnDimension('S')->setWidth(20);
+		$sheet->getColumnDimension('R')->setWidth(10);
+		$sheet->getColumnDimension('S')->setWidth(50);
+		$sheet->getColumnDimension('T')->setWidth(20);
 		// 默认高度
 		$sheet->getDefaultRowDimension()->setRowHeight(18);
 		// 加粗第一行
-		$sheet->getStyle('A:S')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER);
-		$sheet->getStyle('A1:S1')->getFont()->setBold(true);
-		$sheet->getStyle('A1:S1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FF00FF00'); // ARGB颜色代码,例如绿色
+		$sheet->getStyle('A:T')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER);
+		$sheet->getStyle('A1:T1')->getFont()->setBold(true);
+		$sheet->getStyle('A1:T1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FF00FF00'); // ARGB颜色代码,例如绿色
 		// 设置表格标题
 		$sheet
 		->setCellValue('A1', '订单ID')
@@ -556,15 +565,16 @@ class Orders extends Auth{
 		->setCellValue('H1', '市')
 		->setCellValue('I1', '区县')
 		->setCellValue('J1', '收货地址')
-		->setCellValue('K1', '产品名称')
-		->setCellValue('L1', '产品规格')
-		->setCellValue('M1', '产品单价')
-		->setCellValue('N1', '折后单价')
-		->setCellValue('O1', '产品数量')
-		->setCellValue('P1', '优惠金额')
-		->setCellValue('Q1', '产品金额')
-		->setCellValue('R1', '微伴ID')
-		->setCellValue('S1', '下单时间');
+		->setCellValue('K1', '产品编码')
+		->setCellValue('L1', '产品名称')
+		->setCellValue('M1', '产品规格')
+		->setCellValue('N1', '产品单价')
+		->setCellValue('O1', '折后单价')
+		->setCellValue('P1', '产品数量')
+		->setCellValue('Q1', '优惠金额')
+		->setCellValue('R1', '产品金额')
+		->setCellValue('S1', '微伴ID')
+		->setCellValue('T1', '下单时间');
 		// 返回结果
 		return 					$sheet;
 	}

+ 43 - 11
app/Http/Controllers/Api/CustomCoupon.php

@@ -6,6 +6,7 @@ use App\Models\CouponRebate;
 use App\Models\CustomCoupon as Model;
 use App\Http\Requests\Api\Coupon\Custom as Request;
 use App\Models\Coupon;
+use App\Models\CouponProductExclude;
 use App\Models\Custom;
 
 /**
@@ -23,7 +24,7 @@ class CustomCoupon extends Api{
 	 * @param	string		$code		授权码
 	 * 
 	 * */
-	public function get_list(Model $Model,CouponRebate $CouponRebate,CouponProduct $CouponProduct){
+	public function get_list(Model $Model,CouponRebate $CouponRebate,CouponProduct $CouponProduct,CouponProductExclude $CouponProductExclude){
 		// 接口验签
 		// $this->verify_sign();
 		// 检查登录
@@ -38,6 +39,8 @@ class CustomCoupon extends Api{
 		$rebates					= $CouponRebate->getRebatesByCouponIds(array_column($Paginator->items(),'coupon_id'));
 		// 商品范围
 		$products					= $CouponProduct->getProductList(array_column($Paginator->items(),'coupon_id'));
+		// 排除商品
+		$productsExclude			= $CouponProductExclude->getProductList(array_column($Paginator->items(),'coupon_id'));
 		// 循环处理数据
 		foreach ($Paginator as $key => $value) {
 			$rebateScope			= [];
@@ -63,23 +66,36 @@ class CustomCoupon extends Api{
 			$productScope			= [];
 			// 状态可用 且指定商品
 			if( $value['status'] == 0 && $value['type_id'] == 1 ) {
-				// 获取赠品列表
+				// 循环商品范围
 				foreach ($products as $vv) {
-					// 获取优惠券的赠品
+					// 获取商品范围
 					if( $vv['coupon_id'] == $value['coupon_id'] ) {
-						// 赠品信息
+						// 商品范围
 						$productScope[] = $vv['product_id'];
 					}
 				}
 			}
+			// 状态可用 且排除商品
+			if( $value['status'] == 0 && $value['type_id'] == 3 ) {
+				// 循环排除范围
+				foreach ($productsExclude as $vv) {
+					// 排除范围
+					if( $vv['coupon_id'] == $value['coupon_id'] ) {
+						// 排除范围
+						$productExclude[] = $vv['product_id'];
+					}
+				}
+			}
 			// 商品范围
-			$value['product_scope']	= $productScope;
+			$value['product_scope']		= $productScope;
+			// 排除范围
+			$value['product_exclude']	= $productExclude;
 			// 时间
-			$value['exp_time']		= date('Y-m-d H:i:s',$value['exp_time']);
+			$value['exp_time']			= date('Y-m-d H:i:s',$value['exp_time']);
 			// 优惠券回馈类型
-			$value['rebate']		= $value['rebate_type'] == 1 ? $value['rebate'] : intval($value['rebate']);
+			$value['rebate']			= $value['rebate_type'] == 1 ? $value['rebate'] : intval($value['rebate']);
 			// 重组
-			$list[$key]				= $value;
+			$list[$key]					= $value;
 		}
 		// 获取数据
 		$data['total']				= $Paginator->total();
@@ -98,7 +114,7 @@ class CustomCoupon extends Api{
 	 * @param	string		$code		授权码
 	 * 
 	 * */
-	public function get_checked(Model $Model,CouponRebate $CouponRebate,CouponProduct $CouponProduct){
+	public function get_checked(Model $Model,CouponRebate $CouponRebate,CouponProduct $CouponProduct,CouponProductExclude $CouponProductExclude){
 		// 接口验签
 		// $this->verify_sign();
 		// 检查登录
@@ -111,6 +127,8 @@ class CustomCoupon extends Api{
 		$products					= $CouponProduct->getProductList(array_column($list,'coupon_id'));
 		// 通过优惠券ID,查询赠品
 		$rebates					= $CouponRebate->getRebatesByCouponIds(array_column($list,'coupon_id'));
+		// 排除商品
+		$productsExclude			= $CouponProductExclude->getProductList(array_column($list,'coupon_id'));
 		// 循环处理数据
 		foreach ($list as $key => $value) {
 			// 适用范围
@@ -119,15 +137,29 @@ class CustomCoupon extends Api{
 			if( $value['type_id'] == 1 ){
 				// 获取适用的商品范围
 				foreach ($products as $vv) {
-					// 获取优惠券指定的商品
+					// 获取优商品范围
 					if( $vv['coupon_id'] == $value['coupon_id'] ) {
 						unset($vv['coupon_id']);
 						$productScope[] = $vv;
 					}
 				}
 			}
-			// 适用范围
+			// 状态可用 且排除商品
+			if( $value['type_id'] == 3 ) {
+				// 循环排除范围
+				foreach ($productsExclude as $vv) {
+					// 排除范围
+					if( $vv['coupon_id'] == $value['coupon_id'] ) {
+						unset($vv['coupon_id']);
+						// 排除范围
+						$productExclude[] = $vv;
+					}
+				}
+			}
+			// 商品范围
 			$value['product_scope']	= $productScope;
+			// 排除范围
+			$value['product_exclude']= $productExclude;
 			// 赠品范围
 			$rebateScope			= [];
 			// 获取赠品列表

+ 52 - 0
app/Http/Requests/Admin/CouponProductExclude.php

@@ -0,0 +1,52 @@
+<?php namespace App\Http\Requests\Admin;
+
+use App\Http\Requests\BaseRequest;
+
+/**
+ * 优惠券商品排除验证器
+ * 
+ */
+class CouponProductExclude extends BaseRequest
+{
+    /**
+     * 获取应用于请求的规则
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        // 返回结果
+        return      [
+            // 有时候我们希望某个字段在第一次验证失败后就停止运行验证规则,只需要将 bail 添加到规则中:
+            // 验证字段,验证规则,提示信息
+	        'product_code' 		=> 'required',
+            'coupon_id' 	    => 'required',
+	        'id'                => 'required|integer|gt:0',
+        ];
+    }
+
+    
+    // 场景列表
+    protected   $scenes         = [
+		'add'  		            => ['name'],
+        'edit'  		        => ['id','name'],
+        'set_status'  		    => ['id'],
+	];
+
+    /**
+     * 获取已定义验证规则的错误消息
+     *
+     * @return array
+     */
+    public function messages()
+    {
+        return [
+            'product_code.required'     => '产品编码必填',
+            'coupon_id.required'	    => '优惠券必选',
+            'id.required'               => 'ID未知',
+            'id.integer'                => 'ID格式错误',
+            'id.gt'   		            => 'ID格式错误',
+        ];
+    }
+    
+}

+ 105 - 0
app/Models/CouponProductExclude.php

@@ -0,0 +1,105 @@
+<?php namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 优惠券商品排除范围模型
+ * 
+ */
+class CouponProductExclude extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'coupon_product_exclude';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 返回结果
+        return                              $result;
+    }
+
+    /**
+     * 查询多个优惠券的商品范围列表
+     * 
+     * @param   array  $couponIds  适用产品的列表
+     * 
+     */
+    public function getProductList($couponIds)
+    {
+        // 写入数据表
+        $result						        = $this->query()->whereIn('coupon_id',$couponIds)->get(['coupon_id','product_id'])->toArray();
+        // 返回结果
+        return                              $result;
+    }
+
+
+    /**
+     * 查询单个优惠券的商品范围
+     * 
+     * @param   array  $couponId  优惠券的
+     * 
+     */
+    public function getProducts($couponId)
+    {
+        // 写入数据表
+        $result						        = $this->query()->where([['coupon_id','=',$couponId]])->pluck('product_id')->toArray();
+        // 返回结果
+        return                              $result;
+    }
+
+
+    /**
+     * 查询单个优惠券的商品范围
+     * 
+     * @param   array  $couponId  优惠券的
+     * 
+     */
+    public function getProductListByCouponIds($couponIds)
+    {
+        // 写入数据表
+        $list						    = $this->query()
+                                            ->join('product','coupon_product_exclude.product_id','=','product.id')
+                                            ->whereIn('coupon_id',$couponIds)
+                                            ->get(['product.name as product_name','product.id as product_id','product.thumb as thumb','product.price as price','product.market_price as market_price','product.stock as stock'])
+                                            ->toArray();
+        // 返回结果
+        foreach ($list as $key => $value)   {
+            // 缩略图处理
+            $value['thumb']                 = $value['thumb'] ? path_compat($value['thumb']) : '';
+            $list[$key]                     = $value;
+        }
+        // 返回结果
+        return                              $list;
+    }
+
+}

+ 19 - 1
app/Models/CustomCoupon.php

@@ -71,6 +71,8 @@ class CustomCoupon extends Model
         $coupon                     = $coupon->toArray();
         // 查询优惠券的商品范围
         $coupon['product_scope']    = $coupon['type_id'] == 1 ? (new CouponProduct())->getProducts($coupon['coupon_id']) : [];
+        // 查询优惠券的商品范围
+        $coupon['product_exclude']  = $coupon['type_id'] == 3 ? (new CouponProductExclude())->getProducts($coupon['coupon_id']) : [];
         // 获取赠品信息
         $coupon['rebate_scope']     = $coupon['rebate_type'] == 3 ? (new CouponRebate())->getProductByCouponId($coupon['coupon_id']) : [];
         // 返回结果
@@ -144,7 +146,18 @@ class CustomCoupon extends Model
                 // 如果在商品范围
                 if( isset($productPrice[$productId]['price_total']) )  $totalPrice = $totalPrice + $productPrice[$productId]['price_total'];
             }
-        }else{
+        // 排除的商品,不参与
+        } elseif ( $coupon['product_exclude'] ) {
+            // 去重,避免重复计算
+            $coupon['product_exclude']    = array_values(array_unique($coupon['product_exclude']));
+            // 循环产品价格
+            foreach ( $productPrice as  $productId=>$value ) {
+                // 如果产品在排除范围内
+                if( in_array($productId,$coupon['product_exclude']) )  continue;
+                // 计算总价
+                $totalPrice = $totalPrice + $value['price_total'];
+            }
+        } else{
             $totalPrice				        = array_sum(array_column($productPrice,'price_total'));
         }
         // 如果没有达标
@@ -190,6 +203,11 @@ class CustomCoupon extends Model
                 // 跳过,不做计算
                 continue;
             }
+            // 如果有商品排除范围,且产品id在商品排除范围的
+            if( !empty($coupon['product_exclude']) && in_array($productId,$coupon['product_exclude']) ) {
+                // 跳过,不做计算
+                continue;
+            }
             // 优惠价格 = 价格占总价的比例 * 优惠的总价
             $value['rebate_price']          = number_format( $rebatePrice * ($value['price_total'] / $totalPrice) , 2 , '.' ,'');
             // 重组

+ 2 - 2
app/Models/FilesManager.php

@@ -492,7 +492,7 @@ class FilesManager extends Model
             }
             // 验证必须数据
             if( empty($custom['weiban_extid']) )    return ['error' => ($row + 1).' 没有识别到微伴ID'];
-            if( empty($custom['phone']) )           return ['error' => ($row + 1).' 没有识别到联系方式'];
+            // if( empty($custom['phone']) )           return ['error' => ($row + 1).' 没有识别到联系方式'];
             if( empty($custom['score']) )           return ['error' => ($row + 1).' 没有识别到积分数量'];
             if( empty($custom['description']) )     $custom['description'] = '';
             // 积分转整数
@@ -514,7 +514,7 @@ class FilesManager extends Model
         // 循环列标题
         foreach ($column as $key => $value) {
             if( $value == '微伴ID')         $field[$key]  = 'weiban_extid';
-            if( $value == '联系方式')        $field[$key]  = 'phone';
+            // if( $value == '联系方式')        $field[$key]  = 'phone';
             if( $value == '积分数量')        $field[$key] = 'score';
             if( $value == '备注' )          $field[$key] = 'description';
         }

+ 0 - 1
public/uploads/product/detail/1.html

@@ -1 +0,0 @@
-<p>1231231</p>

+ 0 - 1
public/uploads/product/detail/14.html

@@ -1 +0,0 @@
-<p>围绕我</p>

+ 0 - 1
public/uploads/product/detail/15.html

@@ -1 +0,0 @@
-<p>ert re&nbsp;</p>

+ 0 - 1
public/uploads/product/detail/16.html

@@ -1 +0,0 @@
-<p>eg er e</p>

+ 0 - 3
public/uploads/product/detail/2.html

@@ -1,3 +0,0 @@
-<p>【药品名称】通用名称:三九胃泰颗粒&nbsp;</p><p>【成份】三叉苦、九里香、两面针、木香、黄芩、茯苓、地黄、白芍。辅料:为乳糖。&nbsp;</p><p>【性状】本品为灰黄色至褐黄色颗粒;味苦、辛。&nbsp;</p><p>【功能主治】清热燥湿,行气活血,柔肝止痛。用于湿热内蕴、气滞血瘀所致的胃痛,症见脘腹隐痛、饱胀反酸、恶心呕吐、嘈杂纳减;浅表性胃炎见上述证候者。&nbsp;</p><p>【用法用量】开水冲服。一次1袋,一日2次。&nbsp;</p><p>【不良反应】尚不明确。&nbsp;</p><p>【禁忌】尚不明确。
-【</p><p>注意事项】1.忌食辛辣刺激性食物。 2.忌情绪激动或生闷气。 3.浅表性、糜烂性、萎缩性等慢性胃炎应在医师指导下服用。 4.孕妇应在医师指导下服用。 5.慢性胃炎患者服药2周症状无改善,应立即停药并去医院就诊。 6.按照用法用量服用,小儿、年老体弱者应在医师指导下服用。 7.对本品过敏者禁用,过敏体质者慎用。 8.本品性状发生改变时禁止使用。 9.儿童必须在成人监护下使用。 10.请将本品放在儿童不能接触的地方。 11.如正在使用其他药品,使用本品前请咨询医师或药师。</p><p>【药物相互作用】如与其他药物同时使用可能会发生药物相互作用,详情请咨询医师或药师。&nbsp;</p><p>【药理作用】本品为胃脘痛类非处方药药品。 1. 三九胃泰对实验性胃炎各类病变有显著治疗作用和预防效果,有显著的止血和抗溃疡的功效。 2. 三九胃泰对胃肠功能紊乱有调节作用,使其恢复正常。因此,对精神紧张引起的胃肠功能紊乱有积极治疗和预防功效。 3. 三九胃泰有促进胃合成蛋白质代谢作用,并有抑制和吸附胃蛋白酶的作用,故有利于胃溃疡创面的修复。 4. 三九胃泰能显著地促进胸腺核蛋白、胸腺RNA、脾脏RNA的合成,故有增强免疫功能和免疫调节作用,从而有利于慢性胃炎的康复。&nbsp;</p><p>【贮藏】密封。</p><p>&nbsp;【规格】每袋装2.5克;20克
-【包装规格】2.5g*6袋&nbsp;</p><p>【有效期】36个月&nbsp;</p><p>【执行标准】《中国药典》2010年版一部&nbsp;</p><p>【批准文号】国药准字Z44020705&nbsp;</p><p>【说明书修订日期】2010年10月01日&nbsp;</p><p>【生产企业】企业名称:华润三九医药股份有限公司&nbsp; 企业简称:华润三九</p>

+ 0 - 1
public/uploads/product/detail/4.html

@@ -1 +0,0 @@
-<p>人惹二</p>

+ 0 - 1
public/uploads/product/detail/5.html

@@ -1 +0,0 @@
-<p>任文涛&nbsp;</p>

+ 0 - 1
public/uploads/product/detail/6.html

@@ -1 +0,0 @@
-<p>瑞特&nbsp;</p>

BIN
public/uploads/weiban_score_tpl.xlsx


+ 1 - 0
resources/views/admin/coupon/add.blade.php

@@ -69,6 +69,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		<select name="type_id" class="form-control" >
 			<option value="2" >全部商品</option>
 			<option value="1" >指定商品</option>
+			<option value="3" >排除商品</option>
 		</select>
 	</div>
 	<div class="form-group col-sm-2">

+ 1 - 0
resources/views/admin/coupon/edit.blade.php

@@ -69,6 +69,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		<select name="type_id" class="form-control" >
 			<option value="2" @if ( $oldData['type_id'] == '2' ) selected="selected" @endif>全部商品</option>
 			<option value="1" @if ( $oldData['type_id'] == '1' ) selected="selected" @endif>指定商品</option>
+			<option value="3" @if ( $oldData['type_id'] == '3' ) selected="selected" @endif>排除商品</option>
 		</select>
 	</div>
 	<div class="form-group col-sm-2">

+ 2 - 0
resources/views/admin/coupon/index.blade.php

@@ -88,6 +88,8 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<td> 
 							@if ( $a['type_id'] == 1 )
 								<a href="{{url('admin/coupon_product/index?'.http_build_query(['coupon_code'=>$a['coupon_code']]))}}">指定商品</a>
+							@elseif ( $a['type_id'] == 3 )
+							<a href="{{url('admin/coupon_product_exclude/index?'.http_build_query(['coupon_code'=>$a['coupon_code']]))}}">排除商品</a>
 							@else
 								全部商品
 							@endif

+ 20 - 0
resources/views/admin/coupon_product_exclude/add.blade.php

@@ -0,0 +1,20 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-12">
+		<label class="control-label">优惠券编码</label>
+		<input class="form-control" required="required" type="text" placeholder="优惠券编码" name="coupon_code" value="{{request('coupon_code','')}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">产品编码</label>
+		<input class="form-control" required="required" type="text" placeholder="产品编码" name="product_code" value="" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 21 - 0
resources/views/admin/coupon_product_exclude/edit.blade.php

@@ -0,0 +1,21 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+<div class="form-group col-sm-12">
+		<label class="control-label">优惠券编码</label>
+		<input class="form-control" required="required" type="text" placeholder="优惠券编码" name="coupon_code" value="{{$oldData['coupon_code']}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">产品编码</label>
+		<input class="form-control" required="required" type="text" placeholder="产品编码" name="product_code" value="{{$oldData['product_code']}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input type="hidden" name="id" id="id" value="{{$oldData['id']}}" />
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 77 - 0
resources/views/admin/coupon_product_exclude/index.blade.php

@@ -0,0 +1,77 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+@if(check_auth('admin/coupon_product_exclude/add'))
+	<div class="page-header">
+		<a href="{{url('admin/coupon_product_exclude/add?'.http_build_query(['coupon_code'=>request('coupon_code','')]))}}" class="btn btn-primary">新增</a>
+	</div>
+@endif
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-2" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="coupon_code" value="{{request('coupon_code','')}}" placeholder="请输入优惠券编码查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-2" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="product_code" value="{{request('product_code','')}}" placeholder="请输入产品编码查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/coupon_product_exclude/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>优惠券编码</th>
+						<th>优惠券名称</th>
+						<th>产品编码</th>
+						<th>产品名称</th>
+						<th>状态</th>
+						<th>修改时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['coupon_code']}}</td>
+							<td>{{$a['coupon_name']}}</td>
+							<td>{{$a['product_code']}}</td>
+							<td>{{$a['product_name']}}</td>
+							<td>{{$a['status']?'停用':'启用'}}</td>
+							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
+							<td>
+								@if(check_auth('admin/coupon_product_exclude/edit'))
+								<a href="{{url('admin/coupon_product_exclude/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@endif
+								@if(check_auth('admin/coupon_product_exclude/set_status'))
+									@if($a['status'])
+									<a data-url="{{url('admin/coupon_product_exclude/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
+									@else
+									<a data-url="{{url('admin/coupon_product_exclude/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
+									@endif
+								@endif
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个商店</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 7 - 0
resources/views/admin/orders/index.blade.php

@@ -49,6 +49,13 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 			<option value="4" @if ( request('status') === '4' ) selected="selected" @endif >已取消</option>
 		</select>
 	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<select name="orders_other" class="form-control">
+			<option value="0" >订单分类</option>
+			<option value="1" @if ( request('orders_other',0) == 1 ) selected="selected" @endif >系统订单</option>
+			<option value="2" @if ( request('orders_other',0) == 2 ) selected="selected" @endif >非系统订单</option>
+		</select>
+	</div>
 	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
 		<input type="text" class="form-control" name="start_time" value="{{request('start_time','')}}" placeholder="请输入开始时间查询" />
 	</div>

+ 10 - 0
routes/web.php

@@ -204,6 +204,16 @@ Route::middleware('admin')->prefix('admin')->group(function(){
     // 状态
     Route::any('coupon_product/set_status',[App\Http\Controllers\Admin\CouponProduct::class,'set_status']);
 
+    /* 优惠券发放规则-商品排除范围 */
+    // 列表
+    Route::any('coupon_product_exclude/index',[App\Http\Controllers\Admin\CouponProductExclude::class,'index']);
+    // 详情
+    Route::any('coupon_product_exclude/add',[App\Http\Controllers\Admin\CouponProductExclude::class,'add']);
+    // 详情
+    Route::any('coupon_product_exclude/edit',[App\Http\Controllers\Admin\CouponProductExclude::class,'edit']);
+    // 状态
+    Route::any('coupon_product_exclude/set_status',[App\Http\Controllers\Admin\CouponProductExclude::class,'set_status']);
+
     /* 优惠券 */
     // 列表
     Route::any('custom_coupon/index',[App\Http\Controllers\Admin\CustomCoupon::class,'index']);