GiftCardOrderCreate.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. namespace addon\giftcard\model\order;
  3. use addon\giftcard\model\giftcard\Media;
  4. use app\model\BaseModel;
  5. use addon\giftcard\model\giftcard\GiftCard as GiftCardModel;
  6. use app\model\system\Pay;
  7. use app\model\system\Site;
  8. use think\facade\Cache;
  9. /**
  10. * 礼品卡订单创建
  11. * Class GiftCardOrderCreate
  12. * @package addon\giftcard\model\order
  13. */
  14. class GiftCardOrderCreate extends BaseModel
  15. {
  16. public function create($params)
  17. {
  18. $calculate_result = $this->calculate($params);
  19. if ($calculate_result[ 'code' ] < 0)
  20. return $calculate_result;
  21. $calculate_data = $calculate_result[ 'data' ];
  22. $member_id = $calculate_data[ 'member_id' ];
  23. $site_id = $calculate_data[ 'site_id' ];
  24. $pay = new Pay();
  25. $out_trade_no = $pay->createOutTradeNo($member_id);
  26. $order_no = $this->createOrderNo($site_id, $member_id);
  27. $site_info = $calculate_data[ 'site_info' ];
  28. $site_name = $site_info[ 'site_name' ];
  29. $card_right_type = $calculate_data[ 'card_right_type' ];
  30. $giftcard_info = $calculate_data[ 'giftcard_info' ];
  31. $validity_type = $giftcard_info[ 'validity_type' ];
  32. $validity_time = $giftcard_info[ 'validity_time' ];
  33. $validity_day = $giftcard_info[ 'validity_day' ];
  34. $common_data = array (
  35. 'order_no' => $order_no,
  36. 'site_id' => $site_id,
  37. 'site_name' => $site_name,
  38. 'member_id' => $member_id,
  39. );
  40. $pay_money = $calculate_data[ 'pay_money' ];
  41. $order_name = $calculate_data[ 'order_name' ];
  42. $order_data = [
  43. 'out_trade_no' => $out_trade_no,
  44. 'order_from' => $calculate_data[ 'order_from' ],
  45. 'order_from_name' => $calculate_data[ 'order_from_name' ],
  46. 'order_status' => 'topay',
  47. 'buyer_ip' => request()->ip(),
  48. 'goods_money' => $calculate_data[ 'goods_money' ],
  49. 'order_money' => $calculate_data[ 'order_money' ],
  50. 'pay_money' => $calculate_data[ 'pay_money' ],
  51. 'create_time' => time(),
  52. 'order_name' => $order_name,
  53. // 'buyer_message' => $calculate_data['buyer_message'],
  54. 'giftcard_id' => $calculate_data[ 'giftcard_id' ],
  55. 'card_right_type' => $card_right_type,
  56. 'card_cover' => $calculate_data[ 'card_cover' ],
  57. 'is_allow_transfer' => $calculate_data[ 'is_allow_transfer' ],
  58. 'media_id' => $calculate_data[ 'media_id' ],
  59. 'card_price' => $calculate_data[ 'item_money' ],
  60. 'validity_type' => $validity_type,
  61. 'validity_time' => $validity_time,
  62. 'validity_day' => $validity_day,
  63. 'num' => $calculate_data[ 'num' ],
  64. 'card_right_goods_type' => $giftcard_info[ 'card_right_goods_type' ],
  65. 'card_right_goods_count' => $giftcard_info[ 'card_right_goods_count' ],
  66. ];
  67. model('giftcard_order')->startTrans();
  68. //循环生成多个订单
  69. try {
  70. $order_id = model('giftcard_order')->add(array_merge($common_data, $order_data));
  71. $order_goods_list = $calculate_data[ 'order_goods_list' ];
  72. $order_goods_data_list = [];
  73. foreach ($order_goods_list as $k => $v) {
  74. $order_goods_data_list[] = array_merge($common_data, [
  75. 'order_id' => $order_id,
  76. 'sku_id' => $v[ 'sku_id' ],
  77. 'sku_name' => $v[ 'sku_name' ],
  78. 'sku_image' => $v[ 'sku_image' ],
  79. 'sku_no' => $v[ 'sku_no' ] ?? '',
  80. 'goods_id' => $v[ 'goods_id' ] ?? 0,
  81. 'goods_name' => $v[ 'goods_name' ] ?? '',
  82. 'goods_class' => $v[ 'goods_class' ] ?? '',
  83. 'goods_class_name' => $v[ 'goods_class_name' ] ?? '',
  84. 'price' => $v[ 'price' ],
  85. 'num' => $v[ 'num' ],
  86. 'card_right_type' => $card_right_type,
  87. 'goods_money' => $v[ 'goods_money' ],
  88. 'balance' => $v[ 'balance' ] ?? 0,
  89. 'total_balance' => $v[ 'total_balance' ] ?? 0,
  90. ]);
  91. }
  92. model('giftcard_order_goods')->addList($order_goods_data_list);
  93. //生成整体付费支付单据
  94. $pay_model = new Pay();
  95. $pay_model->addPay($site_id, $out_trade_no, 'ONLINE_PAY', $order_name, $order_name, $pay_money, '', 'GiftCardOrderPayNotify', '/pages_promotion/giftcard/order_detail?order_id=' . $order_id);
  96. model('giftcard_order')->commit();
  97. return $this->success($out_trade_no);
  98. } catch (\Exception $e) {
  99. model('giftcard_order')->rollback();
  100. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  101. }
  102. }
  103. public function calculate($params)
  104. {
  105. $giftcard_id = $params[ 'giftcard_id' ] ?? 0;
  106. $site_id = $params[ 'site_id' ];
  107. $site_result = $this->initSite($params);
  108. if ($site_result[ 'code' ] < 0)
  109. return $site_result;
  110. $params = $site_result[ 'data' ];
  111. $num = $params[ 'num' ] ?? 1;
  112. $item_result = $this->itemCalculate($params);
  113. if ($item_result[ 'code' ] < 0)
  114. return $item_result;
  115. $params = $item_result[ 'data' ];
  116. $goods_money = $params[ 'goods_money' ];
  117. $total_money = $params[ 'giftcard_info' ][ 'card_price' ] * $num;
  118. $order_money = $total_money;
  119. $pay_money = $order_money;
  120. $params[ 'goods_money' ] = $total_money;
  121. $params[ 'order_money' ] = $order_money;
  122. $params[ 'pay_money' ] = $pay_money;
  123. $params[ 'item_money' ] = $params[ 'giftcard_info' ][ 'card_price' ];
  124. return $this->success($params);
  125. }
  126. /**
  127. * 单项计算
  128. * @param $params
  129. */
  130. public function itemCalculate($params)
  131. {
  132. $giftcard_id = $params[ 'giftcard_id' ];
  133. $media_id = $params[ 'media_id' ];
  134. $site_id = $params[ 'site_id' ];
  135. $giftcard_model = new GiftCardModel();
  136. $info = $giftcard_model->getGiftcardDetail([ 'site_id' => $site_id, 'giftcard_id' => $giftcard_id ])[ 'data' ] ?? [];
  137. if (empty($info))
  138. return $this->error([], '当前礼品卡活动不存在');
  139. if ($info[ 'status' ] != 1)
  140. return $this->error([], '当前礼品卡活动已下架');
  141. $params[ 'giftcard_info' ] = $info;
  142. $media_model = new Media();
  143. $media_condition = array (
  144. [ 'media_id', '=', $media_id ],
  145. );
  146. $media_info = $media_model->getInfo($media_condition)[ 'data' ] ?? [];
  147. if (empty($media_info))
  148. return $this->error([], '封面图不存在');
  149. $card_cover = $media_info[ 'media_path' ];
  150. $params[ 'card_cover' ] = $card_cover;
  151. $card_name = $info[ 'card_name' ];
  152. $params[ 'order_name' ] = $card_name;
  153. $goods_money = 0;
  154. $card_right_type = $info[ 'card_right_type' ];//卡券类型
  155. $params[ 'card_right_type' ] = $card_right_type;
  156. $params[ 'is_allow_transfer' ] = $info[ 'is_allow_transfer' ];
  157. $goods_item_list = [];
  158. switch ( $card_right_type ) {
  159. case 'goods'://商品
  160. $goods_list = $info[ 'goods_list' ];
  161. foreach ($goods_list as $v) {
  162. $item_sku_id = $v[ 'sku_id' ];
  163. $item_num = $v[ 'goods_num' ];
  164. $goods_id = $v[ 'goods_id' ];
  165. $item_goods_price = $v[ 'goods_price' ];
  166. $item_goods_money = $item_goods_price * $item_num;
  167. $goods_item_list[] = [
  168. 'sku_id' => $item_sku_id,
  169. 'goods_id' => $goods_id,
  170. 'price' => $item_goods_price,
  171. 'goods_money' => $item_goods_money,
  172. 'num' => $item_num,
  173. 'sku_name' => $v[ 'sku_info' ][ 'sku_name' ],
  174. 'sku_image' => $v[ 'sku_info' ][ 'sku_image' ],
  175. 'sku_no' => $v[ 'sku_info' ][ 'sku_no' ],
  176. 'goods_class' => $v[ 'sku_info' ][ 'goods_class' ],
  177. 'goods_class_name' => $v[ 'sku_info' ][ 'goods_class_name' ],
  178. 'goods_name' => $v[ 'sku_info' ][ 'goods_name' ],
  179. ];
  180. $goods_money = $info[ 'card_price' ];
  181. }
  182. break;
  183. case 'balance'://储值
  184. $num = 1;
  185. $item_goods_price = $info[ 'card_price' ];
  186. $item_goods_money = $item_goods_price * $num;
  187. $item_sku_name = $info[ 'balance' ] . '元储值卡';
  188. $item_sku_image = $card_cover;
  189. $balance = $info[ 'balance' ];
  190. $total_balance = $balance * $num;
  191. $goods_item_list[] = [
  192. 'sku_id' => $giftcard_id,
  193. 'price' => $item_goods_price,
  194. 'goods_money' => $item_goods_money,
  195. 'num' => $num,
  196. 'sku_name' => $item_sku_name,
  197. 'sku_image' => $item_sku_image,
  198. 'goods_name' => $card_name,
  199. 'balance' => $balance,
  200. 'total_balance' => $total_balance
  201. ];
  202. $goods_money += $item_goods_money;
  203. break;
  204. }
  205. $params[ 'order_goods_list' ] = $goods_item_list;
  206. $params[ 'goods_money' ] = $goods_money;
  207. return $this->success($params);
  208. }
  209. public function initSite($params)
  210. {
  211. $site_id = $params[ 'site_id' ];
  212. $site_model = new Site();
  213. $condition = array (
  214. [ 'site_id', '=', $site_id ]
  215. );
  216. $site_info = $site_model->getSiteInfo($condition)[ 'data' ] ?? [];
  217. if (empty($site_info))
  218. return $this->error();
  219. $params[ 'site_info' ] = $site_info;
  220. return $this->success($params);
  221. }
  222. /**
  223. * 生成订单编号
  224. *
  225. * @param array $site_id
  226. */
  227. public function createOrderNo($site_id, $member_id = 0)
  228. {
  229. $time_str = date('YmdHi');
  230. $max_no = Cache::get($site_id . '_' . $member_id . '_' . $time_str);
  231. if (!isset($max_no) || empty($max_no)) {
  232. $max_no = 1;
  233. } else {
  234. $max_no = $max_no + 1;
  235. }
  236. $order_no = $time_str . sprintf('%05d', $member_id) . sprintf('%03d', $max_no);
  237. Cache::set($site_id . '_' . $member_id . '_' . $time_str, $max_no);
  238. return $order_no;
  239. }
  240. }