OrderClass.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. namespace bizHd\order\classes;
  3. use biz\goods\classes\GoodsClass;
  4. use biz\goods\models\Goods;
  5. use biz\shop\classes\ShopAdminClass;
  6. use biz\shop\classes\ShopCapitalClass;
  7. use biz\shop\classes\ShopClass;
  8. use biz\shop\models\Shop;
  9. use biz\stat\classes\StatOrderCountClass;
  10. use biz\wx\classes\WxMessageClass;
  11. use bizGhs\stat\classes\StatYjClass;
  12. use bizGhs\ws\services\WsService;
  13. use bizHd\stat\classes\StatIncomeClass;
  14. use bizHd\stat\classes\StatOrderClass;
  15. use bizHd\user\classes\UserClass;
  16. use common\components\dict;
  17. use common\components\miniUtil;
  18. use common\components\orderSn;
  19. use common\components\util;
  20. use Yii;
  21. use bizHd\base\classes\BaseClass;
  22. class OrderClass extends BaseClass
  23. {
  24. public static $baseFile = '\bizHd\order\models\Order';
  25. //已退款
  26. const ORDER_STATUS_REFUND = 6;
  27. //已取消
  28. const ORDER_STATUS_CANCEL = 5;
  29. //完成
  30. const ORDER_STATUS_COMPLETE = 4;
  31. //配送中
  32. const ORDER_STATUS_SENDING = 3;
  33. //待配送
  34. const ORDER_STATUS_UN_SEND = 2;
  35. //待付款
  36. const ORDER_STATUS_UN_PAY = 1;
  37. //订单总流程数
  38. const ORDER_TOTAL_FLOW = 4;
  39. //未确认配送方式
  40. const SEND_TYPE_UNKNOWN = 0;
  41. //自取
  42. const SEND_TYPE_NO = 1;
  43. //自己送
  44. const SEND_TYPE_MYSELF = 2;
  45. //快递送
  46. const SEND_TYPE_THIRD = 3;
  47. //送达时间段
  48. public static $reachPeriod = [0 => '上午', 1 => '下午', 2 => '晚上'];
  49. //优惠金额
  50. public static $randDiscount = [
  51. 50 => [1, 3],
  52. 100 => [5, 9],
  53. 300 => [10, 15],
  54. 500 => [16, 18],
  55. 1000 => [18, 30],
  56. 20000 => [90, 100],
  57. ];
  58. //添加订单 ssh 2019.12.5
  59. public static function addOrder($data)
  60. {
  61. $data['orderSn'] = orderSn::getOrderSn();
  62. $data['payStatus'] = 0;
  63. $shopId = $data['shopId'] ?? 0;
  64. //累计订单增加
  65. $shop = ShopClass::getLockById($shopId);
  66. $shop->unPayOrder += 1;
  67. $shop->totalOrder += 1;
  68. $shop->save();
  69. //将花店每月的总订单数作为编号
  70. $riseNum = StatOrderCountClass::addOrder($shop);
  71. $data['sendNum'] = date("d") . $riseNum;
  72. $data['totalFlow'] = OrderClass::ORDER_TOTAL_FLOW;
  73. $return = self::add($data);
  74. return $return;
  75. }
  76. public static function getByOrderSn($orderSn)
  77. {
  78. return self::getByCondition(['orderSn' => $orderSn]);
  79. }
  80. //评价 ssh 2019.12.16
  81. public static function comment($data)
  82. {
  83. $id = $data['id'];
  84. unset($data['id']);
  85. return self::updateById($id, $data);
  86. }
  87. //订单
  88. public static function getOrderById($id)
  89. {
  90. $order = self::getById($id);
  91. if (empty($order)) {
  92. return [];
  93. }
  94. $order['goodsInfoList'] = OrderGoodsClass::getGoodsListById($id);
  95. return $order;
  96. }
  97. //根据订单查询 ssh 2020.1.4
  98. public static function getOrderBySn($orderSn)
  99. {
  100. $order = self::getByCondition(['orderSn' => $orderSn]);
  101. if (empty($order)) {
  102. return [];
  103. }
  104. $id = $order['id'];
  105. $order['goodsInfoList'] = OrderGoodsClass::getGoodsListById($id);
  106. return $order;
  107. }
  108. //返回随机优惠金额 ssh 2019.9.12
  109. public static function getRandDiscount($amount)
  110. {
  111. if ($amount <= 0) {
  112. return 0;
  113. }
  114. $randDiscount = self::$randDiscount;
  115. krsort($randDiscount);
  116. $rand = 0;
  117. foreach ($randDiscount as $currentAmount => $val) {
  118. if ($amount >= $currentAmount) {
  119. $rand = rand($val[0], $val[1]);
  120. break;
  121. }
  122. }
  123. return $rand / 10;
  124. }
  125. //第三方支付后回调处理流程 shish 2021.4.30
  126. public static function thirdPay($payWay, $orderSn, $totalFee, $attach, $transactionId)
  127. {
  128. $order = self::getByCondition(['orderSn' => $orderSn], true);
  129. if (empty($order)) {
  130. $msg = "没有找到零售订单 orderSn:{$orderSn}";
  131. Yii::info($msg);
  132. util::fail($msg);
  133. }
  134. if ($order->realPrice != $totalFee) {
  135. $msg = "零售订单金额与回调通知金额不一致 orderSn:{$orderSn} {$order->realPrice} {$totalFee}";
  136. Yii::info($msg);
  137. util::fail($msg);
  138. }
  139. $id = $order->id;
  140. $order = self::getLockById($id);
  141. $date = date("Y-m-d H:i:s");
  142. $order->payTime = $date;
  143. $order->thirdNo = $transactionId;
  144. $order->onlinePay = dict::getDict('onlinePay', 'yes');
  145. $order->save();
  146. self::payAfter($order, $payWay);
  147. }
  148. //订单完成 shish 2021.4.20
  149. public static function payAfter($order, $payWay)
  150. {
  151. if (empty($order)) {
  152. util::fail('没有找到订单');
  153. }
  154. if (isset($order->status) == false || $order->status != self::ORDER_STATUS_UN_PAY) {
  155. util::fail('订单不是待付款状态');
  156. }
  157. $orderId = $order->id ?? 0;
  158. $order->status = self::ORDER_STATUS_UN_SEND;
  159. $order->currentFlow = 2;
  160. $order->payWay = $payWay;
  161. $order->save();
  162. $realPrice = $order->realPrice ?? 0;
  163. $shopId = $order->shopId;
  164. $shop = ShopClass::getLockById($shopId);
  165. if (empty($shop)) {
  166. util::fail('没有找到门店');
  167. }
  168. $shop->unSendOrder += 1;
  169. $shop->unPayOrder -= 1;
  170. $currentTotalIncome = bcadd($shop->totalIncome, $realPrice, 2);
  171. $shop->totalIncome = $currentTotalIncome;
  172. $shop->save();
  173. $capitalType = dict::getDict('capitalType', 'xhOrder', 'id');
  174. $shopAdminId = $order->shopAdminId ?? 0;
  175. $shopAdminName = $order->shopAdminName ?? '';
  176. $sjId = $order->sjId;
  177. $event = !empty($shopAdminId) ? '员工开单' : '客户下单';
  178. $capital = [
  179. 'capitalType' => $capitalType,
  180. 'relateId' => $orderId,
  181. 'io' => 1,
  182. 'totalIncome' => $currentTotalIncome,
  183. 'payWay' => $payWay,
  184. 'event' => $event,
  185. 'sjId' => $sjId,
  186. 'shopId' => $shopId,
  187. 'shopAdminId' => $shopAdminId,
  188. 'shopAdminName' => $shopAdminName,
  189. 'amount' => $realPrice,
  190. ];
  191. ShopCapitalClass::addCapital($capital);
  192. //每天和每月收入增加
  193. StatIncomeClass::updateOrInsert($shop, $realPrice);
  194. //今日订单+1
  195. StatOrderClass::updateOrInsert($shop);
  196. //客户在线支付下单增加商家可提现余额
  197. if (isset($order->onlinePay) && $order->onlinePay == dict::getDict('onlinePay', 'yes')) {
  198. $amount = $order->actPrice;
  199. ShopClass::customKdAddBalance($shop, $amount, $order, $capitalType);
  200. }
  201. if (in_array($order->fromType, [dict::getDict("fromType", "shop"), dict::getDict("fromType", "friend")])) {
  202. //您有新的收入提醒
  203. WxMessageClass::gatheringIncomeInform($shop, $order);
  204. }
  205. if ($order->fromType == dict::getDict("fromType", "mall")) {
  206. //来自商城的新订单微信通知
  207. WxMessageClass::hdNewOrderInform($shop, $order);
  208. }
  209. }
  210. //转化出送到时间 ssh 2020.3.15
  211. public static function getReachTime($order)
  212. {
  213. $reachTime = '';
  214. if (isset($order['reachDate']) && !empty($order['reachDate'])) {
  215. $prev = date("n-j", strtotime($order['reachDate']));
  216. $periodData = self::$reachPeriod;
  217. $periodKey = $order['reachPeriod'];
  218. $period = isset($periodData[$periodKey]) ? $periodData[$periodKey] : '上午';
  219. $reachTime = $prev . ' ' . $period;
  220. }
  221. return $reachTime;
  222. }
  223. //支付成功获取unionId ssh 2020.5.12
  224. public static function payToUpdateUnionId($merchant, $merchantExtend, $orderSn, $user)
  225. {
  226. $mcId = $merchantExtend['wxPayMerchantId'];
  227. $miniOpenId = isset($user['miniOpenId']) ? $user['miniOpenId'] : '';
  228. $unionId = isset($user['unionId']) ? $user['unionId'] : '';
  229. $userId = $user['id'];
  230. if (empty($unionId)) {
  231. $unionId = miniUtil::getPaidUnionId($merchant, $miniOpenId, $mcId, (string)$orderSn, 0);
  232. if (!empty($unionId)) {
  233. $findUser = UserClass::getByUnionId($unionId);
  234. if (empty($findUser)) {
  235. UserClass::updateByCondition(['id' => $userId], ['unionId' => $unionId]);
  236. } else {
  237. UserClass::mergeUser($findUser, $user);
  238. }
  239. }
  240. }
  241. }
  242. //订单到期未付款的订单置成取消状态 ssh 2020.5.25
  243. public static function setExpire($order)
  244. {
  245. $now = time();
  246. if (!empty($order['deadline']) && $now > $order['deadline']) {
  247. if ($order['status'] == 0) {
  248. $id = $order['id'];
  249. OrderClass::updateById($id, ['status' => 4]);
  250. }
  251. }
  252. }
  253. // 扣库存
  254. protected static function decGoodsStock($orderGoods)
  255. {
  256. foreach ($orderGoods as $goods) {
  257. GoodsClass::counters([
  258. 'stock' => -$goods['num']
  259. ], [
  260. 'and',
  261. ['id' => $goods['goodsId']],
  262. ['<>', 'stock', Goods::FULL_STOCK]
  263. ]);
  264. }
  265. }
  266. // 更新商品销量
  267. protected static function updateGoodsActualSold($orderGoods)
  268. {
  269. foreach ($orderGoods as $goods) {
  270. GoodsClass::counters([
  271. 'actualSold' => $goods['num']
  272. ], [
  273. 'id' => $goods['goodsId']
  274. ]);
  275. }
  276. }
  277. }