Commision.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. /**
  3. * 保洁师提成模型
  4. * @author 2015-12-01
  5. */
  6. class Commision extends MongoAr {
  7. public $_id;
  8. public $time; // 订单完成时间
  9. public $booking_time; // 预定时间
  10. public $user; // 保洁师ID
  11. public $order; // 订单ID
  12. public $commision; // 提成价格
  13. public $type; // 订单类型
  14. /*
  15. */
  16. const MAIN = 0;
  17. const APPEND = 1;
  18. public static $type_option = array(
  19. 0 => array('name' => '普通'),
  20. 1 => array('name' => '追加'),
  21. -1 => array('name' => '手动添加'),
  22. );
  23. public function __construct($scenario='insert') {
  24. $this->setMongoDBComponent(Yii::app()->getComponent('mongodb_o2o'));
  25. parent::__construct($scenario);
  26. }
  27. public static function model($className = __CLASS__) {
  28. return parent::model($className);
  29. }
  30. public static function get($_id) {
  31. if(CommonFn::isMongoId($_id)){
  32. $criteria = new EMongoCriteria();
  33. $criteria->_id('==', $_id);
  34. $model = self::model()->find($criteria);
  35. return $model;
  36. }else{
  37. return false;
  38. }
  39. }
  40. /**
  41. * 根据订单ID获得commision对象
  42. * @param MongoId $id : 订单ID
  43. * @return Commision|Boolean $commision : Commision对象或false
  44. */
  45. public static function getByOrder($id) {
  46. if (CommonFn::isMongoId($id)) {
  47. $criteria = new EMongoCriteria();
  48. $criteria->order('==', $id);
  49. $commision = Commision::model()->find($criteria);
  50. if (empty($commision)) {
  51. return false;
  52. } else {
  53. return $commision;
  54. }
  55. } else {
  56. return true;
  57. }
  58. }
  59. public function getCollectionName () {
  60. return 'commision';
  61. }
  62. /**
  63. * 计算单个订单内保洁师提成
  64. * @param Object $order : 订单Object(AppendOrder或ROrder)
  65. * @param Boolean $type : 订单类型
  66. * @param String $scheme_name : 提成方案
  67. * @return Float $commision : 计算所得提成
  68. */
  69. public static function getCommision($order, $type = self::MAIN, $scheme_name = 'scheme_30') {
  70. $commision = 0.0;
  71. // 订单内服务数量统计
  72. $products = array();
  73. $count = array();
  74. foreach ($order->products as $key => $row) {
  75. $products[] = $row['product'];
  76. $product_id = (string)$row['product'];
  77. $count[$product_id] = $row['count'];
  78. }
  79. // 订单内所有服务详细信息
  80. $criteria = new EMongoCriteria();
  81. $criteria->_id('in', $products);
  82. $cursor = Product::model()->findAll($criteria);
  83. // 提成方案
  84. $scheme_name = $scheme_name == 'no_scheme' ? 'scheme_30' : $scheme_name;
  85. $scheme = self::$scheme_list[$scheme_name];
  86. // 默认百分比
  87. $default = floatval(substr($scheme_name, strlen($scheme_name) - 2))/100;
  88. foreach ($cursor as $key => $row) {
  89. foreach ($scheme as $k => $value) {
  90. $pattern = '/'.$value['name'].'/';
  91. $subject = $row->name;
  92. // 正则匹配字典中的name字段与服务名
  93. if (preg_match($pattern, $subject) > 0) {
  94. if ($value['fixed'] != false) {
  95. $commision += $value['fixed'] * $count[(string)$row->_id];
  96. break;
  97. } else {
  98. $commision += floatval($row->price) * $count[(string)$row->_id] * $value['percentage'];
  99. break;
  100. }
  101. } else {
  102. if ($k == count($scheme)) {
  103. $commision += floatval($row->price) * $count[(string)$row->_id] * $default;
  104. break;
  105. } else {
  106. continue;
  107. }
  108. }
  109. }
  110. }
  111. return $commision;
  112. }
  113. /**
  114. * 整理函数,用于后台管理显示
  115. */
  116. public function parseRow($row, $output=array()) {
  117. $newRow = array();
  118. $newRow['id'] = (string)$row['_id'];
  119. $newRow['time'] = CommonFn::get_val_if_isset($row, 'time', 0);
  120. $newRow['time_str'] = $newRow['time'] == 0? '': date('Y-m-d H:i', $newRow['time']);
  121. $newRow['user'] = CommonFn::get_val_if_isset($row, 'user', '');
  122. if ($newRow['user'] != '') {
  123. //$user = User::get($newRow['user']);
  124. $newRow['user_str'] = $newRow['user'];
  125. } else {
  126. $newRow['user_str'] = '';
  127. }
  128. $newRow['order'] = (string)CommonFn::get_val_if_isset($row, 'order', '');
  129. $newRow['commision'] = CommonFn::get_val_if_isset($row, 'commision', 0);
  130. $newRow['type'] = CommonFn::get_val_if_isset($row, 'type', -1);
  131. $type_option = self::$type_option;
  132. $newRow['type_str'] = $type_option[$newRow['type']]['name'];
  133. $newRow['action_user'] = CommonFn::get_val_if_isset($row,'action_user',"");
  134. $newRow['action_time'] = CommonFn::get_val_if_isset($row,'action_time',"");
  135. $newRow['action_log'] = CommonFn::get_val_if_isset($row,'action_log',"");
  136. $newRow['booking_time'] = CommonFn::get_val_if_isset($row, 'booking_time', 0);
  137. if ($newRow['booking_time']) {
  138. if (date('Y', time()) == date('Y', $newRow['booking_time'])) {
  139. $newRow['booking_time_str'] = date('m月d日 H:i', $newRow['booking_time']);
  140. } else {
  141. $newRow['booking_time_str'] = date('Y年m月d日 H:i', $newRow['booking_time']);
  142. }
  143. } else {
  144. $newRow['booking_time_str'] = '';
  145. }
  146. return $this->output($newRow, $output);
  147. }
  148. /**
  149. * 提成方案设置
  150. */
  151. public static $scheme_option = array(
  152. -1 => array('name' => '未选择方案', 'alias' => 'no_scheme'),
  153. 0 => array('name' => '提成方案60%', 'alias' => 'scheme_60'),
  154. 1 => array('name' => '提成方案30%', 'alias' => 'scheme_30'),
  155. 2 => array('name' => '提成方案50%', 'alias' => 'scheme_50'),
  156. 3 => array('name' => '提成方案80%', 'alias' => 'scheme_80'),
  157. );
  158. /**
  159. * 提成方案字典
  160. * key : 方案名称scheme_百分比
  161. * @param String $name : 类别的名称
  162. * @param Float $percentage : 提成百分比
  163. * @param Boolean|Number $fixed : 是否采用固定提成价格,否则填false,是则填相应数字
  164. */
  165. public static $scheme_list = array(
  166. /* 提成方案60% */
  167. 'scheme_60' => array(
  168. 1 => array('name' => '日常清洁', 'percentage' => 0.6, 'fixed' => false),
  169. 2 => array('name' => '深度清洁', 'percentage' => 0.6, 'fixed' => false),
  170. 3 => array('name' => '除螨杀菌', 'percentage' => 0.6, 'fixed' => false),
  171. 4 => array('name' => '家电清洗', 'percentage' => 0.6, 'fixed' => false),
  172. 5 => array('name' => '民宿保洁', 'percentage' => 0.6, 'fixed' => false),
  173. 6 => array('name' => '新居开荒', 'percentage' => 0.6, 'fixed' => false),
  174. 7 => array('name' => '母婴房清洁', 'percentage' => 0.6, 'fixed' => false),
  175. 15 => array('name' => '租房清洁', 'percentage' => 0.6, 'fixed' => false),
  176. 8 => array('name' => '擦玻璃', 'percentage' => 0.6, 'fixed' => false),
  177. ),
  178. /* 提成方案30% */
  179. 'scheme_30' => array(
  180. 1 => array('name' => '日常清洁', 'percentage' => 0.3, 'fixed' => false),
  181. 2 => array('name' => '深度清洁', 'percentage' => 0.3, 'fixed' => false),
  182. 3 => array('name' => '除螨杀菌', 'percentage' => 0.3, 'fixed' => false),
  183. 4 => array('name' => '家电清洗', 'percentage' => 0.3, 'fixed' => false),
  184. 5 => array('name' => '民宿保洁', 'percentage' => 0.3, 'fixed' => false),
  185. 3 => array('name' => '新居开荒', 'percentage' => 0.5, 'fixed' => false),
  186. 7 => array('name' => '母婴房清洁', 'percentage' => 0.3, 'fixed' => false),
  187. 15 => array('name' => '租房清洁', 'percentage' => 0.3, 'fixed' => false),
  188. 8 => array('name' => '擦玻璃', 'percentage' => 0.3, 'fixed' => false),
  189. ),
  190. /* 提成方案50% */
  191. 'scheme_50' => array(
  192. 1 => array('name' => '日常清洁', 'percentage' => 0.5, 'fixed' => false),
  193. 2 => array('name' => '深度清洁', 'percentage' => 0.5, 'fixed' => false),
  194. 3 => array('name' => '除螨杀菌', 'percentage' => 0.5, 'fixed' => false),
  195. 4 => array('name' => '家电清洗', 'percentage' => 0.5, 'fixed' => false),
  196. 5 => array('name' => '民宿保洁', 'percentage' => 0.5, 'fixed' => false),
  197. 6 => array('name' => '新居开荒', 'percentage' => 0.5, 'fixed' => false),
  198. 7 => array('name' => '母婴房清洁', 'percentage' => 0.5, 'fixed' => false),
  199. 15 => array('name' => '租房清洁', 'percentage' => 0.5, 'fixed' => false),
  200. 8 => array('name' => '擦玻璃', 'percentage' => 0.5, 'fixed' => false),
  201. ),
  202. /* 提成方案80% */
  203. 'scheme_80' => array(
  204. 1 => array('name' => '日常清洁', 'percentage' => 0.8, 'fixed' => false),
  205. 2 => array('name' => '深度清洁', 'percentage' => 0.8, 'fixed' => false),
  206. 3 => array('name' => '除螨杀菌', 'percentage' => 0.8, 'fixed' => false),
  207. 4 => array('name' => '家电清洗', 'percentage' => 0.6, 'fixed' => false),
  208. 5 => array('name' => '民宿保洁', 'percentage' => 0.8, 'fixed' => false),
  209. 6 => array('name' => '新居开荒', 'percentage' => 0.8, 'fixed' => false),
  210. 7 => array('name' => '母婴房清洁', 'percentage' => 0.8, 'fixed' => false),
  211. 15 => array('name' => '租房清洁', 'percentage' => 0.8, 'fixed' => false),
  212. 8 => array('name' => '擦玻璃', 'percentage' => 0.8, 'fixed' => false),
  213. ),
  214. );
  215. }