order.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. /**
  3. * 任务计划 - 生成结算单
  4. *
  5. *
  6. *
  7. *
  8. */
  9. defined('InShopNC') or exit('Access Invalid!');
  10. class orderControl {
  11. /**
  12. * 初始化对象
  13. */
  14. public function __construct(){
  15. register_shutdown_function(array($this,"shutdown"));
  16. }
  17. /**
  18. * 生成结算单
  19. */
  20. public function create_billOp() {
  21. $this->_create_order_statis();
  22. }
  23. /**
  24. * 生成上月账单
  25. */
  26. public function _create_order_statis() {
  27. $model_order = Model('order');
  28. $model_bill = Model('bill');
  29. $order_statis_max_info = $model_bill->getOrderStatisInfo(array(),'os_end_date','os_month desc');
  30. //计算起始时间点,自动生成以月份为单位的空结算记录
  31. if (!$order_statis_max_info){
  32. $order_min_info = $model_order->getOrderInfo(array(),array(),'min(add_time) as add_time');
  33. $start_unixtime = is_numeric($order_min_info['add_time']) ? $order_min_info['add_time'] : time();
  34. } else {
  35. $start_unixtime = $order_statis_max_info['os_end_date'];
  36. }
  37. $data = array();
  38. $i = 1;
  39. $start_unixtime = strtotime(date('Y-m-01 00:00:00', $start_unixtime));
  40. $current_time = strtotime(date('Y-m-01 00:00:01',time()));
  41. while (($time = strtotime('-'.$i.' month',$current_time)) >= $start_unixtime) {
  42. if (date('Ym',$start_unixtime) == date('Ym',$time)) {
  43. //如果两个月份相等检查库是里否存在
  44. $order_statis = $model_bill->getOrderStatisInfo(array('os_month'=>date('Ym',$start_unixtime)));
  45. if ($order_statis) {
  46. break;
  47. }
  48. }
  49. $first_day_unixtime = strtotime(date('Y-m-01 00:00:00', $time)); //该月第一天0时unix时间戳
  50. $last_day_unixtime = strtotime(date('Y-m-01 23:59:59', $time)." +1 month -1 day"); //该月最后一天最后一秒时unix时间戳
  51. $key = count($data);
  52. $os_month = date('Ym',$first_day_unixtime);
  53. $data[$key]['os_month'] = $os_month;
  54. $data[$key]['os_year'] = date('Y',$first_day_unixtime);
  55. $data[$key]['os_start_date'] = $first_day_unixtime;
  56. $data[$key]['os_end_date'] = $last_day_unixtime;
  57. //生成所有店铺月订单出账单
  58. $this->_create_order_bill($data[$key]);
  59. $fileds = 'sum(ob_order_totals) as ob_order_totals,sum(ob_shipping_totals) as ob_shipping_totals,
  60. sum(ob_order_return_totals) as ob_order_return_totals,
  61. sum(ob_commis_totals) as ob_commis_totals,sum(ob_commis_return_totals) as ob_commis_return_totals,
  62. sum(ob_store_cost_totals) as ob_store_cost_totals,sum(ob_result_totals) as ob_result_totals';
  63. $order_bill_info = $model_bill->getOrderBillInfo(array('os_month'=>$os_month),$fileds);
  64. $data[$key]['os_order_totals'] = floatval($order_bill_info['ob_order_totals']);
  65. $data[$key]['os_shipping_totals'] = floatval($order_bill_info['ob_shipping_totals']);
  66. $data[$key]['os_order_return_totals'] = floatval($order_bill_info['ob_order_return_totals']);
  67. $data[$key]['os_commis_totals'] = floatval($order_bill_info['ob_commis_totals']);
  68. $data[$key]['os_commis_return_totals'] = floatval($order_bill_info['ob_commis_return_totals']);
  69. $data[$key]['os_store_cost_totals'] = floatval($order_bill_info['ob_store_cost_totals']);
  70. $data[$key]['os_result_totals'] = floatval($order_bill_info['ob_result_totals']);
  71. $i++;
  72. }
  73. krsort($data);
  74. $model_bill->addOrderStatis($data);
  75. }
  76. /**
  77. * 生成所有店铺月订单出账单
  78. *
  79. * @param int $data
  80. */
  81. private function _create_order_bill($data){
  82. $model_order = Model('order');
  83. $model_bill = Model('bill');
  84. $model_store = Model('store');
  85. //批量插件order_bill表
  86. // $condition = array();
  87. // $condition['order_state'] = ORDER_STATE_SUCCESS;
  88. // $condition['finnshed_time'] = array(array('egt',$data['os_start_date']),array('elt',$data['os_end_date']),'and');
  89. // 取出有最终成交订单的店铺ID数量(ID不重复)
  90. // $store_count = $model_order->getOrderInfo($condition,array(),'count(DISTINCT store_id) as c');
  91. // $store_count = $store_count['c'];
  92. //取店铺表数量(因为可能存在无订单,但有店铺活动费用,所以不再从订单表取店铺数量)
  93. $store_count = $model_store->getStoreCount(array());
  94. //分批生成该月份的店铺空结算表,每批生成300个店铺
  95. $insert = false;
  96. for ($i=0;$i<=$store_count;$i=$i+300){
  97. // $store_list = $model_order->getOrderList($condition,'','DISTINCT store_id','',"{$i},300");
  98. $store_list = $model_store->getStoreList(array(),null,'','store_id',"{$i},300");
  99. if ($store_list){
  100. //自动生成以月份为单位的空结算记录
  101. $data_bill = array();
  102. foreach($store_list as $store_info){
  103. $data_bill['ob_no'] = $data['os_month'].$store_info['store_id'];
  104. $data_bill['ob_start_date'] = $data['os_start_date'];
  105. $data_bill['ob_end_date'] = $data['os_end_date'];
  106. $data_bill['os_month'] = $data['os_month'];
  107. $data_bill['ob_state'] = 0;
  108. $data_bill['ob_store_id'] = $store_info['store_id'];
  109. if (!$model_bill->getOrderBillInfo(array('ob_no'=>$data_bill['ob_no']))) {
  110. $insert = $model_bill->addOrderBill($data_bill);
  111. //对已生成空账单进行销量、退单、佣金统计
  112. if ($insert){
  113. $update = $this->_calc_order_bill($data_bill);
  114. if (!$update){
  115. showMessage('生成账单['.$data['os_month'].']失败','','html','error');
  116. }
  117. // 发送店铺消息
  118. $param = array();
  119. $param['code'] = 'store_bill_affirm';
  120. $param['store_id'] = $store_info['store_id'];
  121. $param['param'] = array(
  122. 'state_time' => date('Y-m-d H:i:s', $data_bill['ob_start_date']),
  123. 'end_time' => date('Y-m-d H:i:s', $data_bill['ob_end_date']),
  124. 'bill_no' => $data_bill['ob_no']
  125. );
  126. QueueClient::push('sendStoreMsg', $param);
  127. }else{
  128. showMessage('生成账单['.$data['os_month'].']失败','','html','error');
  129. }
  130. }
  131. }
  132. }
  133. }
  134. }
  135. /**
  136. * 计算某月内,某店铺的销量,退单量,佣金
  137. *
  138. * @param array $data_bill
  139. */
  140. private function _calc_order_bill($data_bill){
  141. $model_order = Model('order');
  142. $model_bill = Model('bill');
  143. $model_store = Model('store');
  144. $order_condition = array();
  145. $order_condition['order_state'] = ORDER_STATE_SUCCESS;
  146. $order_condition['store_id'] = $data_bill['ob_store_id'];
  147. $order_condition['finnshed_time'] = array('time',array($data_bill['ob_start_date'],$data_bill['ob_end_date']));
  148. $update = array();
  149. //订单金额
  150. $fields = 'sum(order_amount) as order_amount,sum(shipping_fee) as shipping_amount,store_name';
  151. $order_info = $model_order->getOrderInfo($order_condition,array(),$fields);
  152. $update['ob_order_totals'] = floatval($order_info['order_amount']);
  153. //运费
  154. $update['ob_shipping_totals'] = floatval($order_info['shipping_amount']);
  155. //店铺名字
  156. $store_info = $model_store->getStoreInfoByID($data_bill['ob_store_id']);
  157. $update['ob_store_name'] = $store_info['store_name'];
  158. //佣金金额
  159. $order_info = $model_order->getOrderInfo($order_condition,array(),'count(DISTINCT order_id) as count');
  160. $order_count = $order_info['count'];
  161. $commis_rate_totals_array = array();
  162. //分批计算佣金,最后取总和
  163. for ($i = 0; $i <= $order_count; $i = $i + 300){
  164. $order_list = $model_order->getOrderList($order_condition,'','order_id','',"{$i},300");
  165. $order_id_array = array();
  166. foreach ($order_list as $order_info) {
  167. $order_id_array[] = $order_info['order_id'];
  168. }
  169. if (!empty($order_id_array)){
  170. $order_goods_condition = array();
  171. $order_goods_condition['order_id'] = array('in',$order_id_array);
  172. $field = 'SUM(goods_pay_price*commis_rate/100) as commis_amount';
  173. $order_goods_info = $model_order->getOrderGoodsInfo($order_goods_condition,$field);
  174. $commis_rate_totals_array[] = $order_goods_info['commis_amount'];
  175. }else{
  176. $commis_rate_totals_array[] = 0;
  177. }
  178. }
  179. $update['ob_commis_totals'] = floatval(array_sum($commis_rate_totals_array));
  180. //退款总额
  181. $model_refund = Model('refund_return');
  182. $refund_condition = array();
  183. $refund_condition['seller_state'] = 2;
  184. $refund_condition['store_id'] = $data_bill['ob_store_id'];
  185. $refund_condition['goods_id'] = array('gt',0);
  186. $refund_condition['admin_time'] = array(array('egt',$data_bill['ob_start_date']),array('elt',$data_bill['ob_end_date']),'and');
  187. $refund_info = $model_refund->getRefundReturnInfo($refund_condition,'sum(refund_amount) as amount');
  188. $update['ob_order_return_totals'] = floatval($refund_info['amount']);
  189. //退款佣金
  190. $refund = $model_refund->getRefundReturnInfo($refund_condition,'sum(refund_amount*commis_rate/100) as amount');
  191. if ($refund) {
  192. $update['ob_commis_return_totals'] = floatval($refund['amount']);
  193. } else {
  194. $update['ob_commis_return_totals'] = 0;
  195. }
  196. //店铺活动费用
  197. $model_store_cost = Model('store_cost');
  198. $cost_condition = array();
  199. $cost_condition['cost_store_id'] = $data_bill['ob_store_id'];
  200. $cost_condition['cost_state'] = 0;
  201. $cost_condition['cost_time'] = array(array('egt',$data_bill['ob_start_date']),array('elt',$data_bill['ob_end_date']),'and');
  202. $cost_info = $model_store_cost->getStoreCostInfo($cost_condition,'sum(cost_price) as cost_amount');
  203. $update['ob_store_cost_totals'] = floatval($cost_info['cost_amount']);
  204. //本期应结
  205. $update['ob_result_totals'] = $update['ob_order_totals'] - $update['ob_order_return_totals'] -
  206. $update['ob_commis_totals'] + $update['ob_commis_return_totals']-
  207. $update['ob_store_cost_totals'];
  208. $update['ob_create_date'] = time();
  209. $update['ob_state'] = 1;
  210. $result = $model_bill->editOrderBill($update,array('ob_no'=>$data_bill['ob_no']));
  211. return $result;
  212. }
  213. /**
  214. * 执行完成提示信息
  215. *
  216. */
  217. public function shutdown(){
  218. exit("success at ".date('Y-m-d H:i:s',time())."\n");
  219. }
  220. }