### 通過訂單的唯一碼數組參數和顧客身份判斷是否符合滿減滿折營銷活動規則
**位置:**
Wpos\Controller\IndexController.class.php
**參數:**
* 判斷是否符合滿減滿折營銷活動規則
* @param $number_goods array 這條訂單的唯一碼數組
* @param $customer int 顧客會員身份
* @return array
**調用:**
* $result = $this->check_numbers_active($number_goods,$customer);
**完整代碼:**
~~~
/**
* 整個訂單的營銷活動判斷封裝
* 包括活動最優判斷,優惠最多的營銷活動
* Lanson 2017-08-31
* @param $number_goods array 這條訂單的唯一碼數組 例如:$number_goods = array(array( 'S02CB130C01400416',1786)
,array('F02CCMAAZ96M0001',2992),array('F02CAJQ3Z95L0401',6000))
* @param $customer int 顧客會員身份
* @return array
*/
// 滿減滿折的判斷邏輯很復雜 Lanson 2017-08-31
public function check_numbers_active($number_goods,$customer) {
// 1.調用營銷活動公共方法
$event_result = $this->check_public_active();
if (empty($event_result)) {
return array('success' => false, 'msg' => '暫時不符合活動條件');
}
// 2.判斷是否滿減滿折活動
foreach ($event_result as $key => $value) {
// 判斷活動是否包含滿減滿折
if (empty($value['order_discount']) && empty($value['order_reduce'])) {
unset($event_result[$key]);
}
}
if (empty($event_result)) {
return array('success' => false, 'msg' => '暫時不符合活動條件');
}
// 3.判斷唯一碼是否符合營銷活動的范圍內
$event_goods = array(); // 記錄符合營銷活動的商品和活動ID
foreach ($event_result as $keyA => $valueA) {
$this_goods = 0; // 記錄每個活動符合范圍的商品信息 0代表沒有商品符合活動范圍 1代表有商品符合活動范圍
foreach ($number_goods as $keyB => $valueB) {
// 查詢每個的唯一碼的基本信息
$goods = M('goods_no no')
->field("no.no,no.system_style_no,menu.brand,menu.large_class,menu.middle_class,menu.small_class,menu.sex,
no.company_retail_price as price,no.discount,no.color_name,no.size")
->join("coscia_goods_menu as menu on no.menu_id = menu.id", "left")
->where("no.no = '{$valueB[0]}'")
->find();
// 將商品的品牌、大類、中類、小類、性別全部轉化為ID值
$brand_id = M('goods_base_data_value_list')
->where(" `key` = 'name_en' and `value` = '{$goods['brand']}'")
->getField('base_data_id');
$large_class_id = M('goods_base_data_value_list')
->where(" `key` = 'name' and `value` = '{$goods['large_class']}'")
->getField('base_data_id');
$middle_class_id = M('goods_base_data_value_list as list')
->join("coscia_goods_base_data_mark as mark on mark.id = list.base_data_id")
->join("coscia_goods_base_data_list as b on mark.data_list_id = b.id")
->where("list.key = 'no' and list.value = '{$goods['middle_class']}' and b.name = '中類'")
->getField('base_data_id');
$small_class_id = M('goods_base_data_value_list as list')
->join("coscia_goods_base_data_mark as mark on mark.id = list.base_data_id")
->join("coscia_goods_base_data_list as b on mark.data_list_id = b.id")
->where("list.key = 'name' and list.value = '{$goods['small_class']}' and b.name = '小類'")
->getField('base_data_id');
$sex_id = M('goods_base_data_value_list as list')
->join("coscia_goods_base_data_mark as mark on mark.id = list.base_data_id")
->join("coscia_goods_base_data_list as b on mark.data_list_id = b.id")
->where("list.key = 'name' and list.value = '{$goods['sex']}' and b.name = '性別'")
->getField('base_data_id');
$goods['brand'] = $brand_id;
$goods['large_class'] = $large_class_id;
$goods['middle_class'] = $middle_class_id;
$goods['small_class'] = $small_class_id;
$goods['sex'] = $sex_id;
// 對營銷活動的類型判斷,是滿減還是滿折,商品范圍是按品牌還是款號或SKU (邏輯判斷非常復雜)
// 判斷是滿減滿折的商品活動范圍
// 1.滿減滿折品類
if ($valueA['order_reduce'] == 1 || $valueA['order_discount'] == 1) {
$whereA['event_id'] = array('eq',$valueA['id']);
$whereA['is_delete'] = array('eq',0);
$event_class = M('event_total_goods_class')->where($whereA)->select();
foreach ($event_class as $keyC => $valueC) {
// 判斷大類ID是否相等
if (!empty($valueC['large_class'])) {
if ($valueC['large_class'] == 1) {
continue;
} elseif ($valueC['large_class'] != $goods['large_class']) {
unset($event_class[$keyC]);
continue;
}
}
// 判斷品牌ID是否相等
if (!empty($valueC['brand'])) {
if ($valueC['brand'] != $goods['brand']) {
unset($event_class[$keyC]);
continue;
}
}
// 判斷中類ID是否相等
if (!empty($valueC['middle_class'])) {
if ($valueC['middle_class'] != $goods['middle_class']) {
unset($event_class[$keyC]);
continue;
}
}
// 判斷小類ID是否相等
if (!empty($valueC['small_class'])) {
if ($valueC['small_class'] != $goods['small_class']) {
unset($event_class[$keyC]);
continue;
}
}
// 判斷性別ID是否相等
if (!empty($valueC['sex'])) {
if ($valueC['sex'] != $goods['sex']) {
unset($event_class[$keyC]);
continue;
}
}
}
// 只要滿足其中一個活動范圍,說明這商品滿足活動范圍
if (!empty($event_class)) {
$this_goods = 1;
$event_goods[] = array('goods' => $valueB ,'event_id' => $valueA['id']);
}
}
// 2.滿減滿折款號
elseif ($valueA['order_reduce'] == 2 || $valueA['order_discount'] == 2) {
$whereD['event_id'] = array('eq',$valueA['id']);
$whereD['is_delete'] = array('eq',0);
$event_no = M('event_total_goods_no')->where($whereD)->select();
$system_no = $goods['system_style_no'];
foreach ($event_no as $keyD => $valueD) {
if ($valueD['system_style_no'] == $system_no) {
$this_goods = 1;
$event_goods[] = array('goods' => $valueB ,'event_id' => $valueA['id']);
break;
}
}
}
// 3.滿減滿折SKU
elseif ($valueA['order_reduce'] == 3 || $valueA['order_discount'] == 3) {
$whereE['event_id'] = array('eq', $valueA['id']);
$whereE['is_delete'] = array('eq', 0);
$event_no = M('event_total_goods_no')->where($whereE)->select();
$sku = $this->noToSku($goods['no']); // 通過函數從唯一碼截取SKU碼
foreach ($event_no as $keyE => $valueE) {
if ($valueE['system_style_no'] == $sku) {
$this_goods = 1;
$event_goods[] = array('goods' => $valueB, 'event_id' => $valueA['id']);
break;
}
}
}
}
// 判斷沒有活動商品符合條件,篩選掉這個活動信息
if ($this_goods == 0) {
unset($event_result[$keyA]);
}
}
if (empty($event_result)) {
return array('success' => false, 'msg' => '暫時不符合活動條件');
}
// 5.根據滿減滿折的規則來判斷在活動范圍的商品是否符合規則
foreach ($event_result as $keyA => $valueA) {
// 滿減規則的邏輯判斷
if (!empty($valueA['order_reduce'])) {
// 查詢滿減規則的數組,需要符合最優原則
$whereF['event_id'] = array('eq',$valueA['id']);
$whereF['type'] = array('eq',2);
$rules = M('event_rules')->where($whereF)->select();
$price_sum = 0;
foreach ($event_goods as $keyB => $valueB) {
if ($valueB['event_id'] == $valueA['id']) {
// 得出活動商品的消費總金額
$price_sum += $valueB['goods']['price'];
}
}
foreach ($rules as $keyC => $valueC) {
if ($valueC['full'] > $price_sum) {
unset($rules[$keyC]);
}
}
if (empty($rules)) {
unset($event_result[$keyA]);
} else {
// 最優滿減規則判斷
$rules_full = 0;
$k = 0;
foreach ($rules as $keyD => $valueD) {
if (empty($rules_full)) {
$rules_full = $valueD['full'];
$k = $keyD;
continue;
}
if ($valueD['full'] < $rules_full) {
unset($rules[$keyD]);
} else {
unset($rules[$k]);
$k = $keyD;
$rules_full = $valueD['full'];
}
}
}
}
// 滿折規則的邏輯判斷
else {
// 查詢滿折規則的數組,需要符合最優原則
$whereG['event_id'] = array('eq',$valueA['id']);
$whereG['type'] = array('eq',3);
$rules = M('event_rules')->where($whereG)->select();
$count = 0;
foreach ($event_goods as $keyH => $valueH) {
if ($valueH['event_id'] == $valueA['id']) {
// 得出活動商品的總數量
$count += 1;
}
}
foreach ($rules as $keyC => $valueC) {
if ($valueC['full'] > $count) {
unset($rules[$keyC]);
}
}
if (empty($rules)) {
unset($event_result[$keyA]);
} else {
// 最優滿折規則判斷
$rules_full = 0;
$k = 0;
foreach ($rules as $keyD => $valueD) {
if (empty($rules_full)) {
$rules_full = $valueD['full'];
$k = $keyD;
continue;
}
if ($valueD['full'] < $rules_full) {
unset($rules[$keyD]);
} else {
unset($rules[$k]);
$k = $keyD;
$rules_full = $valueD['full'];
}
}
}
}
if (!empty($rules)) {
$r_a = array();
foreach ($rules as $k => $v) {
$r_a = $v;
}
$event_result[$keyA]['rule'] = $r_a;
}
}
if (empty($event_result)) {
return array('success' => false, 'msg' => '暫時不符合活動條件');
}
// 6.最優活動判斷,分別計算整單的優惠金多少,哪個優惠金額多,就是最優營銷活動
$all_price = array_sum(array_column($number_goods,1)); // 當前的整單總金額
// dump($all_price);
$coupon = 0; // 設置優惠金初始值
$kA = 0;
foreach ($event_result as $keyA => $valueA) {
// 初始參數設定
if (empty($coupon)) {
// 滿減規則
if ($valueA['rule']['type'] == 2) {
$coupon = $valueA['rule']['reduce'];
$kA = $keyA;
continue;
}
// 滿折規則
elseif ($valueA['rule']['type'] == 3) {
$coupon = $all_price * ((10 - $valueA['rule']['reduce'])/10);
$kA = $keyA;
continue;
}
}
// 滿減規則
if ($valueA['rule']['type'] == 2) {
if ($valueA['rule']['reduce'] < $coupon) {
unset($event_result[$keyA]);
} else {
unset($event_result[$kA]);
$kA = $keyA;
$coupon = $valueA['rule']['reduce'];
}
}
// 滿折規則
elseif ($valueA['rule']['type'] == 3) {
$couponA = $all_price * ((10 - $valueA['rule']['reduce'])/10);
if ($couponA < $coupon) {
unset($event_result[$keyA]);
} else {
unset($event_result[$kA]);
$kA = $keyA;
$coupon = $couponA;
}
}
}
if (empty($event_result)) {
return array('success' => false, 'msg' => '暫時不符合活動條件');
}
$event_a = array();
foreach ($event_result as $key => $value) {
$event_a = $value;
}
$coupon = round($coupon,0); // 滿減滿折優惠總金額
$price_coupon = $all_price - $coupon; // 最終活動優惠后的金額
$active = array('event_id' => $event_a['id'],'coupon' => $coupon,'price' => $price_coupon,
'event_name' => $event_a['event_name']);
return array('success' => true,'active' => $active);
}
~~~
- 模版
- 前言
- 項目架構
- 項目規范
- HTML
- CSS
- Javascript
- PHP
- MySQL
- 注意規范
- 開發版本管理
- 開發流程
- 系統配置
- 阿里云服務器配置
- 計劃任務配置說明
- 開發示例
- Page分頁
- Search_param搜索結果賦值
- Add新增
- Edit編輯
- Ajax表單驗證
- Ajax二級聯動
- Excel 導出數據首位不去0的方法
- POS總部控制
- 下載CSV格式的模板
- 訂單唯一碼表和訂單SKU表實收金額生成
- 快捷日期選擇
- JS函數
- ajax_send
- ajax_result
- createQrCodes
- createBarCodes
- printTpl
- JS插件
- BootstrapValidator表單驗證插件
- Address省市區插件
- Bootstrap-datepicker日期插件
- Bootstrap-select多選框插件
- Toastr消息提示插件
- PalyAudit掃描聲音提示插件
- WebUploader多圖片上傳插件
- Ueditor富文本編輯器插件
- Function
- alert
- object_to_array
- array_to_object
- get_address
- set_param_url
- get_shops_name
- get_user_name
- get_warehouse
- get_cheapest_sku
- print_attr(新)
- print_img(新)
- get_spu_no(新)
- get_type_name(新)
- get_brand_en(新)
- get_cat_name(新)
- get_attr_name(新)
- spu_cat_info(新)
- get_time_event_price
- get_vendors
- check_total_reduce
- check_total_discount
- get_inventory
- get_delivery
- get_sale_inventory
- get_customer_name
- phone_protection
- get_order_no
- get_event_name
- get_order_status
- get_item_status
- get_ditch_name
- get_card_no
- get_shop_sales
- get_pay_name
- get_season
- amt_format
- get_cat_parent
- print_attr_id
- round_bcadd
- round_bcsub
- round_bcmul
- round_bcdiv
- get_account_name
- Controller
- Common_BaseController
- check_membership_card
- get_menu_list
- importErrorMassage
- Wpos_IndexController
- get_customer_vip_card
- get_shops_id
- calculate_active_integral
- check_numbers_active
- check_goods_active
- Woms_IndexController
- Model
- View
- category
- cycle_date.html
- shop_select門店多選搜索框
- 品牌A-Z排序多選brand_mc.html
- 供應商代碼A-Z排序vendor_no_mc.html
- Lib
- BuyerLib
- WarehouseLib
- EventLib
- getTimeEventPrice
- getVipType
- getEvent
- orderTotalEvent
- orderTimeEvent
- getTotalReduce
- getTotalDiscount
- SaleLib
- CustomerLib
- addCustomerService
- GiftcardLib
- WechatLib
- wxRefund
- OrdersLib
- orderLog
- calculatePayinAmount
- calculateSubtotal
- correctPayinAmount
- saveOrderAddress
- getOrderAddress
- setDeliveryNo
- SyncLib
- updateOuterStock
- UserLib
- createCommission
- FlowLib
- orderList
- addOrder
- addLog
- orderInfo
- checkSku
- orderSave
- orderStop
- orderExecute
- skuEdit
- orderPrinta
- scanGoods
- boxClose
- orderOut
- take
- bview
- check
- deliveryStatus
- checkGoods
- GoodsLib
- createGoodsNo
- createNewGoodsNo
- getSystemStyleNo
- getDim
- MallLib
- smsLog
- GoodsBaseLib
- getBrandInfo
- getBrandsInfo
- getAttrIdArray
- getPrintAttr
- getMustAttr
- getCatIdInfo
- valTypeId
- valsTypeId
- getCatNoInfo
- getCatInfo
- getAttrArr
- getAttrInfo
- getValInfo
- getAttrId
- getValId
- getAttrSeaon
- getValueId
- PointsLog
- pointsIn
- pointsUp
- EcGoodsLib
- getSkuInventory
- Tools
- CsvTools
- csvImport
- csvExport
- ExcelTools
- importExcel
- exportExcel
- exportHeadExcel
- MailTools
- SmsTools
- sendMessage
- UploadTools
- ExportTools
- exportData
- TaobaoTools
- getOnsaleItems
- getSkusItems
- PicturesTools
- uploadPicture
- Plugins
- WxBase
- Taobao
- 問題反饋