OrderClass.php 9.8 KB

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