Bargain.php 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\bargain\model;
  11. use addon\weapp\model\Message as WeappMessage;
  12. use addon\wechat\model\Message as WechatMessage;
  13. use app\model\BaseModel;
  14. use app\model\goods\Goods;
  15. use app\model\member\Member;
  16. use app\model\message\Message;
  17. use app\model\message\Sms;
  18. use app\model\system\Cron;
  19. use app\model\order\Order;
  20. use think\facade\Cache;
  21. use think\facade\Db;
  22. use think\facade\Log;
  23. /**
  24. * 砍价活动
  25. */
  26. class Bargain extends BaseModel
  27. {
  28. private $status = [
  29. 0 => '未开始',
  30. 1 => '进行中',
  31. 2 => '已结束',
  32. 3 => '已关闭'
  33. ];
  34. /**
  35. * 获取砍价活动状态
  36. * @return array
  37. */
  38. public function getBargainStatus()
  39. {
  40. return $this->success($this->status);
  41. }
  42. /**
  43. * 添加砍价
  44. * @param $common_data
  45. * @param $goods
  46. * @param $sku_list
  47. * @return array
  48. */
  49. public function addBargain($common_data, $goods, $sku_list)
  50. {
  51. if (empty($goods[ 'sku_ids' ])) {
  52. return $this->error('', '该活动至少需要一个商品参与');
  53. }
  54. //时间段检测
  55. $bargain_count = model('promotion_bargain_goods')->getCount([
  56. [ 'goods_id', 'in', $goods[ 'goods_ids' ] ],
  57. [ 'status', 'in', '0,1,3,4' ],
  58. [ 'site_id', '=', $common_data[ 'site_id' ] ],
  59. [ '', 'exp', Db::raw('not ( (`start_time` > ' . $common_data[ 'end_time' ] . ' and `start_time` > ' . $common_data[ 'start_time' ] . ' ) or (`end_time` < ' . $common_data[ 'start_time' ] . ' and `end_time` < ' . $common_data[ 'end_time' ] . '))') ]//todo 修正 所有的优惠都要一样
  60. ]);
  61. if ($bargain_count > 0) {
  62. return $this->error('', '有商品已设置砍价活动,请不要重复设置');
  63. }
  64. $time = time();
  65. // 当前时间
  66. if ($time > $common_data[ 'end_time' ]) {
  67. return $this->error('', '当前时间不能大于结束时间');
  68. }
  69. if ($time > $common_data[ 'start_time' ] && $time < $common_data[ 'end_time' ]) {
  70. $common_data[ 'status' ] = 1;
  71. $common_data[ 'status_name' ] = $this->status[ 1 ];
  72. } else {
  73. $common_data[ 'status' ] = 0;
  74. $common_data[ 'status_name' ] = $this->status[ 0 ];
  75. }
  76. model('promotion_bargain')->startTrans();
  77. try {
  78. foreach ($goods[ 'goods_ids' ] as $goods_id) {
  79. //添加砍价活动
  80. $bargain_data = [
  81. 'goods_id' => $goods_id,
  82. 'create_time' => $time
  83. ];
  84. $bargain_id = model('promotion_bargain')->add(array_merge($bargain_data, $common_data));
  85. $bargain_goods_list = [];
  86. $bargain_stock = 0;
  87. //添加砍价活动商品
  88. foreach ($sku_list as $sku) {
  89. if ($sku[ 'goods_id' ] == $goods_id) {
  90. $bargain_stock += $sku[ 'bargain_stock' ];
  91. $sku[ 'bargain_id' ] = $bargain_id;
  92. $bargain_goods_list[] = array_merge($sku, $common_data);
  93. }
  94. }
  95. array_multisort(array_column($bargain_goods_list, 'floor_price'), SORT_ASC, $bargain_goods_list);
  96. model('promotion_bargain')->update(
  97. [
  98. 'sku_id' => $bargain_goods_list[ 0 ][ 'sku_id' ],
  99. 'floor_price' => $bargain_goods_list[ 0 ][ 'floor_price' ],
  100. 'bargain_stock' => $bargain_stock
  101. ],
  102. [ [ 'bargain_id', '=', $bargain_id ] ]
  103. );
  104. model('promotion_bargain_goods')->addList($bargain_goods_list);
  105. $cron = new Cron();
  106. if ($common_data[ 'status' ] == 1) {
  107. $this->modifyPromotionAddon($bargain_id);
  108. $cron->addCron(1, 0, "砍价活动关闭", "CloseBargain", $common_data[ 'end_time' ], $bargain_id);
  109. } else {
  110. $cron->addCron(1, 0, "砍价活动开启", "OpenBargain", $common_data[ 'start_time' ], $bargain_id);
  111. $cron->addCron(1, 0, "砍价活动关闭", "CloseBargain", $common_data[ 'end_time' ], $bargain_id);
  112. }
  113. }
  114. model('promotion_bargain')->commit();
  115. return $this->success();
  116. } catch (\Exception $e) {
  117. model('promotion_bargain')->rollback();
  118. return $this->error('', $e->getMessage());
  119. }
  120. }
  121. /**
  122. * 编辑砍价
  123. * @param $common_data
  124. * @param $goods
  125. * @param $sku_list
  126. * @return array
  127. */
  128. public function editBargain($common_data, $goods, $sku_list)
  129. {
  130. if (empty($goods[ 'sku_ids' ])) {
  131. return $this->error('', '该活动至少需要一个商品参与');
  132. }
  133. $bargain_count = model('promotion_bargain')->getCount(
  134. [ [ 'bargain_id', '=', $common_data[ 'bargain_id' ] ], [ 'site_id', '=', $common_data[ 'site_id' ] ] ]
  135. );
  136. if ($bargain_count == 0) {
  137. return $this->error('', '数据有误');
  138. }
  139. //时间段检测
  140. $count = model('promotion_bargain_goods')->getCount([
  141. [ 'sku_id', 'in', $goods[ 'sku_ids' ] ],
  142. [ 'status', 'in', '0,1,3,4' ],
  143. [ 'bargain_id', '<>', $common_data[ 'bargain_id' ] ],
  144. [ 'site_id', '=', $common_data[ 'site_id' ] ],
  145. [ '', 'exp', Db::raw('not ( (`start_time` > ' . $common_data[ 'end_time' ] . ' and `start_time` > ' . $common_data[ 'start_time' ] . ' ) or (`end_time` < ' . $common_data[ 'start_time' ] . ' and `end_time` < ' . $common_data[ 'end_time' ] . '))') ]//todo 修正 所有的优惠都要一样
  146. ]);
  147. if ($count > 0) {
  148. return $this->error('', '有商品已设置砍价活动,请不要重复设置');
  149. }
  150. $time = time();
  151. if ($time > $common_data[ 'end_time' ]) {
  152. return $this->error('', '当前时间不能大于结束时间');
  153. }
  154. // 当前时间
  155. if ($time > $common_data[ 'start_time' ] && $time < $common_data[ 'end_time' ]) {
  156. $common_data[ 'status' ] = 1;
  157. $common_data[ 'status_name' ] = $this->status[ 1 ];
  158. } else {
  159. $common_data[ 'status' ] = 0;
  160. $common_data[ 'status_name' ] = $this->status[ 0 ];
  161. }
  162. model('promotion_bargain')->startTrans();
  163. try {
  164. $bargain_goods_list = [];
  165. $bargain_stock = 0;
  166. //添加砍价活动商品
  167. foreach ($sku_list as $v) {
  168. $count = model('promotion_bargain_goods')->getCount([ [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'bargain_id', '=', $common_data[ 'bargain_id' ] ] ]);
  169. $is_delete = $v[ 'is_delete' ];
  170. unset($v[ 'is_delete' ]);
  171. if ($is_delete == 2) {//是否参与 1参与 2不参与
  172. if ($count > 0) {
  173. model('promotion_bargain_goods')->delete([ [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'bargain_id', '=', $common_data[ 'bargain_id' ] ] ]);
  174. }
  175. } else {
  176. $bargain_stock += $v[ 'bargain_stock' ];
  177. $bargain_data = array_merge($v, $common_data);
  178. if ($count > 0) {
  179. model('promotion_bargain_goods')->update(
  180. $bargain_data,
  181. [ [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'bargain_id', '=', $common_data[ 'bargain_id' ] ] ]
  182. );
  183. } else {
  184. model('promotion_bargain_goods')->add($bargain_data);
  185. }
  186. $bargain_goods_list[] = $bargain_data;
  187. }
  188. }
  189. array_multisort(array_column($bargain_goods_list, 'floor_price'), SORT_ASC, $bargain_goods_list);
  190. //修改砍价活动
  191. model('promotion_bargain')->update(
  192. array_merge([
  193. 'sku_id' => $bargain_goods_list[ 0 ][ 'sku_id' ],
  194. 'floor_price' => $bargain_goods_list[ 0 ][ 'floor_price' ],
  195. 'bargain_stock' => $bargain_stock,
  196. 'modify_time' => $time
  197. ], $common_data),
  198. [ [ 'bargain_id', '=', $common_data[ 'bargain_id' ] ] ]
  199. );
  200. $cron = new Cron();
  201. if ($common_data[ 'status' ] == 1) {
  202. $this->modifyPromotionAddon($common_data[ 'bargain_id' ]);
  203. $cron->deleteCron([ [ 'event', '=', 'OpenBargain' ], [ 'relate_id', '=', $common_data[ 'bargain_id' ] ] ]);
  204. $cron->deleteCron([ [ 'event', '=', 'CloseBargain' ], [ 'relate_id', '=', $common_data[ 'bargain_id' ] ] ]);
  205. $cron->addCron(1, 0, "砍价活动关闭", "CloseBargain", $common_data[ 'end_time' ], $common_data[ 'bargain_id' ]);
  206. } else {
  207. $cron->deleteCron([ [ 'event', '=', 'OpenBargain' ], [ 'relate_id', '=', $common_data[ 'bargain_id' ] ] ]);
  208. $cron->deleteCron([ [ 'event', '=', 'CloseBargain' ], [ 'relate_id', '=', $common_data[ 'bargain_id' ] ] ]);
  209. $cron->addCron(1, 0, "砍价活动开启", "OpenBargain", $common_data[ 'start_time' ], $common_data[ 'bargain_id' ]);
  210. $cron->addCron(1, 0, "砍价活动关闭", "CloseBargain", $common_data[ 'end_time' ], $common_data[ 'bargain_id' ]);
  211. }
  212. // 清除活动分享图片
  213. ( new Poster() )->clearShareImg($common_data[ 'bargain_id' ]);
  214. model('promotion_bargain')->commit();
  215. return $this->success();
  216. } catch (\Exception $e) {
  217. model('promotion_bargain')->rollback();
  218. return $this->error('', $e->getMessage());
  219. }
  220. }
  221. /**
  222. * 删除砍价活动
  223. * @param $bargain_id
  224. * @param $site_id
  225. * @return array|\multitype
  226. */
  227. public function deleteBargain($bargain_id, $site_id)
  228. {
  229. //砍价信息
  230. $bargain_info = model('promotion_bargain')->getInfo([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ], 'status');
  231. if ($bargain_info) {
  232. if ($bargain_info[ 'status' ] != 1) {
  233. $res = model('promotion_bargain')->delete([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ]);
  234. if ($res) {
  235. //删除商品
  236. model('promotion_bargain_goods')->delete([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ]);
  237. //删除砍价记录
  238. model('promotion_bargain_launch')->delete([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ]);
  239. $cron = new Cron();
  240. $cron->deleteCron([ [ 'event', '=', 'OpenBargain' ], [ 'relate_id', '=', $bargain_id ] ]);
  241. $cron->deleteCron([ [ 'event', '=', 'CloseBargain' ], [ 'relate_id', '=', $bargain_id ] ]);
  242. }
  243. return $this->success($res);
  244. } else {
  245. return $this->error('', '砍价活动进行中,请先关闭该活动');
  246. }
  247. } else {
  248. return $this->error('', '砍价活动不存在');
  249. }
  250. }
  251. /**
  252. * 关闭砍价活动
  253. * @param $bargain_id
  254. * @param $site_id
  255. * @return array
  256. */
  257. public function finishBargain($bargain_id, $site_id)
  258. {
  259. //砍价信息
  260. $bargain_info = model('promotion_bargain')->getInfo([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ], 'status');
  261. if (!empty($bargain_info)) {
  262. if ($bargain_info[ 'status' ] != 3) {
  263. $res = model('promotion_bargain')->update([ 'status' => 3, 'status_name' => $this->status[ 3 ] ], [ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ]);
  264. if ($res) {
  265. model('promotion_bargain_goods')->update(
  266. [ 'status' => 3, 'status_name' => $this->status[ 3 ] ],
  267. [ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ]
  268. );
  269. model('promotion_bargain_launch')->update([ 'status' => 2 ], [ [ 'bargain_id', '=', $bargain_id ], [ 'status', '=', 0 ] ]);
  270. $cron = new Cron();
  271. $cron->deleteCron([ [ 'event', '=', 'OpenBargain' ], [ 'relate_id', '=', $bargain_id ] ]);
  272. $cron->deleteCron([ [ 'event', '=', 'CloseBargain' ], [ 'relate_id', '=', $bargain_id ] ]);
  273. $this->modifyPromotionAddon($bargain_id, true);
  274. }
  275. return $this->success($res);
  276. } else {
  277. $this->error('', '该砍价活动已关闭');
  278. }
  279. } else {
  280. $this->error('', '该砍价活动不存在');
  281. }
  282. }
  283. /**
  284. * 获取砍价信息
  285. * @param array $condition
  286. * @param string $field
  287. * @return array
  288. */
  289. public function getBargainInfo($condition = [])
  290. {
  291. $field = 'pb.*,g.goods_name,g.goods_image';
  292. $alias = 'pb';
  293. $join = [
  294. [
  295. 'goods g',
  296. 'g.goods_id = pb.goods_id',
  297. 'inner'
  298. ]
  299. ];
  300. $bargain_info = model("promotion_bargain")->getInfo($condition, $field, $alias, $join);
  301. if (!empty($bargain_info)) {
  302. $goods_list = model('goods_sku')->getList(
  303. [ [ 'goods_id', '=', $bargain_info[ 'goods_id' ] ] ],
  304. 'goods_id,sku_id,sku_name,price,sku_image,stock'
  305. );
  306. foreach ($goods_list as $k => $v) {
  307. $v[ 'stock' ] = numberFormat($v[ 'stock' ]);
  308. $bargain_goods = model('promotion_bargain_goods')->getInfo(
  309. [ [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ] ],
  310. 'first_bargain_price,bargain_stock,floor_price'
  311. );
  312. if (empty($bargain_goods)) {
  313. $bargain_goods = [
  314. 'first_bargain_price' => 0,
  315. 'bargain_stock' => 0,
  316. 'floor_price' => 0
  317. ];
  318. }
  319. $goods_list[ $k ] = array_merge($v, $bargain_goods);
  320. }
  321. array_multisort(array_column($goods_list, 'bargain_stock'), SORT_DESC, $goods_list);
  322. $bargain_info[ 'goods_list' ] = $goods_list;
  323. }
  324. return $this->success($bargain_info);
  325. }
  326. /**
  327. * 获取砍价信息
  328. * @param array $condition
  329. * @param string $field
  330. * @return array
  331. */
  332. public function getBargainJoinGoodsList($condition = [])
  333. {
  334. $field = 'pb.*,g.goods_name,g.goods_image';
  335. $alias = 'pb';
  336. $join = [
  337. [
  338. 'goods g',
  339. 'g.goods_id = pb.goods_id',
  340. 'inner'
  341. ]
  342. ];
  343. $bargain_info = model("promotion_bargain")->getInfo($condition, $field, $alias, $join);
  344. if (!empty($bargain_info)) {
  345. $goods_list = model('promotion_bargain_goods')->getList(
  346. [ [ 'pbg.bargain_id', '=', $bargain_info[ 'bargain_id' ] ] ],
  347. 'pbg.first_bargain_price,pbg.bargain_stock,pbg.floor_price,sku.goods_id,sku.sku_id,sku.sku_name,sku.price,sku.sku_image,sku.stock',
  348. '', 'pbg', [ [ 'goods_sku sku', 'sku.sku_id = pbg.sku_id', 'inner' ] ]
  349. );
  350. foreach ($goods_list as $k => $v) {
  351. $goods_list[ $k ][ 'stock' ] = numberFormat($goods_list[ $k ][ 'stock' ]);
  352. }
  353. $bargain_info[ 'goods_list' ] = $goods_list;
  354. }
  355. return $this->success($bargain_info);
  356. }
  357. /**
  358. * 获取砍价商品信息
  359. * @param array $condition
  360. * @param string $field
  361. * @return array
  362. */
  363. public function getBargainGoodsDetail($condition = [], $field = '')
  364. {
  365. if (empty($field)) $field = 'pb.join_num,pb.browse_num,pb.share_num,pbg.id,pbg.bargain_id,pbg.goods_id,pbg.sku_id,pbg.floor_price,pbg.bargain_stock,pbg.bargain_name,pbg.start_time,pbg.end_time,pbg.buy_type,pbg.remark,sku.site_id,sku.sku_name,sku.sku_spec_format,sku.price,sku.promotion_type,sku.stock,sku.click_num,
  366. (pb.sale_num + g.virtual_sale) as sale_num,sku.collect_num,sku.sku_image,sku.sku_images,sku.goods_content,sku.goods_state,sku.is_virtual,sku.is_free_shipping,sku.goods_spec_format,sku.goods_attr_format,sku.introduction,sku.unit,sku.video_url,g.evaluate,sku.goods_service_ids, g.goods_image,g.goods_stock,g.goods_name,sku.qr_id,g.stock_show,g.sale_show,g.label_name,pb.status as bargain_status,pb.is_own';
  367. $join = [
  368. [ 'goods_sku sku', 'pbg.sku_id = sku.sku_id', 'inner' ],
  369. [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ],
  370. [ 'promotion_bargain pb', 'pb.bargain_id = pbg.bargain_id', 'inner' ],
  371. ];
  372. $bargain_goods_info = model('promotion_bargain_goods')->getInfo($condition, $field, 'pbg', $join);
  373. if (!empty($bargain_goods_info)) {
  374. if (isset($bargain_goods_info[ 'stock' ])) {
  375. $bargain_goods_info[ 'stock' ] = numberFormat($bargain_goods_info[ 'stock' ]);
  376. }
  377. if (isset($bargain_goods_info[ 'goods_stock' ])) {
  378. $bargain_goods_info[ 'goods_stock' ] = numberFormat($bargain_goods_info[ 'goods_stock' ]);
  379. }
  380. }
  381. return $this->success($bargain_goods_info);
  382. }
  383. /**
  384. * 获取砍价商品信息
  385. * @param array $condition
  386. * @param string $field
  387. * @return array
  388. */
  389. public function getBargainGoodsSkuList($condition = [])
  390. {
  391. $field = 'pb.join_num,pb.browse_num,pb.share_num,pbg.id,pbg.bargain_id,pbg.goods_id,pbg.sku_id,pbg.floor_price
  392. ,pbg.bargain_stock,pbg.bargain_name,pbg.start_time,pbg.end_time,pbg.buy_type,sku.sku_name
  393. ,sku.sku_spec_format,sku.price,sku.stock,sku.sku_image
  394. ,sku.sku_images,g.goods_spec_format,g.goods_image,pb.status as bargain_status,pb.is_own';
  395. $join = [
  396. [ 'goods_sku sku', 'pbg.sku_id = sku.sku_id', 'inner' ],
  397. [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ],
  398. [ 'promotion_bargain pb', 'pb.bargain_id = pbg.bargain_id', 'inner' ],
  399. ];
  400. $list = model('promotion_bargain_goods')->getList($condition, $field, 'pbg.id asc', 'pbg', $join);
  401. foreach ($list as $k => $v) {
  402. if (isset($v[ 'stock' ])) {
  403. $list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
  404. }
  405. }
  406. return $this->success($list);
  407. }
  408. /**
  409. * 获取砍价列表
  410. * @param array $condition
  411. * @param string $field
  412. * @param string $order
  413. * @param null $limit
  414. * @return array
  415. */
  416. public function getBargainList($condition = [], $field = '*', $order = '', $limit = null)
  417. {
  418. $alias = 'pb';
  419. if (empty($field)) {
  420. $field = 'pb.*,g.goods_name,g.goods_image,g.price,g.recommend_way,sku.sku_id,sku.price,sku.sku_name,sku.sku_image,sku.stock as goods_stock,g.label_name,g.goods_class_name,g.stock_show,g.sale_show';
  421. }
  422. $join = [
  423. [ 'goods g', 'g.goods_id = pb.goods_id', 'inner' ],
  424. [ 'goods_sku sku', 'g.sku_id = sku.sku_id', 'inner' ],
  425. ];
  426. $list = model('promotion_bargain')->getList($condition, $field, $order, $alias, $join, '', $limit);
  427. foreach ($list as $k => $v) {
  428. if (isset($v[ 'stock' ])) {
  429. $list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
  430. }
  431. if (isset($v[ 'goods_stock' ])) {
  432. $list[ $k ][ 'goods_stock' ] = numberFormat($list[ $k ][ 'goods_stock' ]);
  433. }
  434. }
  435. return $this->success($list);
  436. }
  437. /**
  438. * 获取砍价分页列表
  439. * @param array $condition
  440. * @param int $page
  441. * @param int $page_size
  442. * @param string $order
  443. * @return array
  444. */
  445. public function getBargainPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'pb.bargain_id desc', $field = '')
  446. {
  447. $alias = 'pb';
  448. if (empty($field)) {
  449. $field = 'pb.*,g.goods_name,g.goods_image,g.price,g.recommend_way,sku.sku_id,sku.price,sku.sku_name,sku.sku_image,sku.stock as goods_stock,g.label_name,g.goods_class_name,g.stock_show,g.sale_show';
  450. }
  451. $join = [
  452. [ 'goods g', 'g.goods_id = pb.goods_id', 'inner' ],
  453. [ 'goods_sku sku', 'g.sku_id = sku.sku_id', 'inner' ],
  454. ];
  455. $res = model('promotion_bargain')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  456. foreach ($res[ 'list' ] as $k => $v) {
  457. if (isset($v[ 'stock' ])) {
  458. $res[ 'list' ][ $k ][ 'stock' ] = numberFormat($res[ 'list' ][ $k ][ 'stock' ]);
  459. }
  460. if (isset($v[ 'goods_stock' ])) {
  461. $res[ 'list' ][ $k ][ 'goods_stock' ] = numberFormat($res[ 'list' ][ $k ][ 'goods_stock' ]);
  462. }
  463. }
  464. return $this->success($res);
  465. }
  466. /**
  467. * 获取砍价商品列表
  468. * @param $bargain_id
  469. * @param $site_id
  470. * @return array
  471. */
  472. public function getBargainGoodsList($bargain_id, $site_id)
  473. {
  474. $field = 'pbg.*,sku.sku_name,sku.price,sku.sku_image,sku.stock';
  475. $alias = 'pbg';
  476. $join = [
  477. [
  478. 'goods g',
  479. 'g.goods_id = pbg.goods_id',
  480. 'inner'
  481. ],
  482. [
  483. 'goods_sku sku',
  484. 'sku.sku_id = pbg.sku_id',
  485. 'inner'
  486. ]
  487. ];
  488. $condition = [
  489. [ 'pbg.bargain_id', '=', $bargain_id ], [ 'pbg.site_id', '=', $site_id ],
  490. [ 'g.is_delete', '=', 0 ], [ 'g.goods_state', '=', 1 ]
  491. ];
  492. $list = model('promotion_bargain_goods')->getList($condition, $field, '', $alias, $join);
  493. foreach ($list as $k => $v) {
  494. if (isset($v[ 'stock' ])) {
  495. $list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
  496. }
  497. }
  498. return $this->success($list);
  499. }
  500. /**
  501. * 获取砍价商品分页列表
  502. * @param array $condition
  503. * @param bool $field
  504. * @param string $order
  505. * @param int $page
  506. * @param int $list_rows
  507. * @param string $alias
  508. * @param array $join
  509. * @return array
  510. */
  511. public function getBargainGoodsPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  512. {
  513. $list = model('promotion_bargain_goods')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  514. return $this->success($list);
  515. }
  516. /**
  517. * 开启砍价活动
  518. * @param $bargain_id
  519. * @return array
  520. */
  521. public function cronOpenBargain($bargain_id)
  522. {
  523. $bargain_info = model('promotion_bargain')->getInfo([ [ 'bargain_id', '=', $bargain_id ] ], 'status');
  524. if (!empty($bargain_info)) {
  525. if ($bargain_info[ 'status' ] == 0) {
  526. $res = model('promotion_bargain')->update([ 'status' => 1, 'status_name' => $this->status[ 1 ] ], [ [ 'bargain_id', '=', $bargain_id ] ]);
  527. if ($res) {
  528. model('promotion_bargain_goods')->update(
  529. [ 'status' => 1, 'status_name' => $this->status[ 1 ] ],
  530. [ [ 'bargain_id', '=', $bargain_id ] ]
  531. );
  532. $this->modifyPromotionAddon($bargain_id);
  533. }
  534. return $this->success($res);
  535. } else {
  536. return $this->error("", "砍价活动已开启或者关闭");
  537. }
  538. } else {
  539. return $this->error("", "砍价活动不存在");
  540. }
  541. }
  542. /**
  543. * 关闭砍价活动
  544. * @param $bargain_id
  545. * @return array|\multitype
  546. */
  547. public function cronCloseBargain($bargain_id)
  548. {
  549. $bargain_info = model('promotion_bargain')->getInfo([ [ 'bargain_id', '=', $bargain_id ] ], 'status');
  550. if (!empty($bargain_info)) {
  551. if ($bargain_info[ 'status' ] != 2) {
  552. $res = model('promotion_bargain')->update([ 'status' => 2, 'status_name' => $this->status[ 2 ] ], [ [ 'bargain_id', '=', $bargain_id ] ]);
  553. if ($res) {
  554. model('promotion_bargain_goods')->update(
  555. [ 'status' => 2, 'status_name' => $this->status[ 2 ] ],
  556. [ [ 'bargain_id', '=', $bargain_id ] ]
  557. );
  558. $data = [ 'status' => 2 ];
  559. model('promotion_bargain_launch')->update($data, [ [ 'bargain_id', '=', $bargain_id ], [ 'status', '=', 0 ] ]);
  560. $this->modifyPromotionAddon($bargain_id, true);
  561. }
  562. return $this->success($res);
  563. } else {
  564. return $this->error("", "该活动已结束");
  565. }
  566. } else {
  567. return $this->error("", "砍价活动不存在");
  568. }
  569. }
  570. /**
  571. * 获取砍价发起信息
  572. * @param array $condition
  573. * @param string $field
  574. */
  575. public function getBargainLaunchDetail($condition = [], $field = '*', $alias = '', $join = '')
  576. {
  577. $data = model('promotion_bargain_launch')->getInfo($condition, $field, $alias, $join);
  578. if (!empty($data)) {
  579. return $this->success($data);
  580. } else {
  581. return $this->error();
  582. }
  583. }
  584. /**
  585. * 获取砍价发起分页列表
  586. * @param array $condition
  587. * @param bool $field
  588. * @param string $order
  589. * @param int $page
  590. * @param int $list_rows
  591. * @param string $alias
  592. * @param array $join
  593. * @return array
  594. */
  595. public function getBargainLaunchPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  596. {
  597. $data = model('promotion_bargain_launch')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  598. if (!empty($data[ 'list' ])) {
  599. foreach ($data[ 'list' ] as $k => $item) {
  600. $record_data = model('promotion_bargain_record')->pageList([ [ 'launch_id', '=', $item[ 'launch_id' ] ] ], 'headimg', 'id asc', 1, 6);
  601. $data[ 'list' ][ $k ][ 'bargain_record' ] = $record_data[ 'list' ];
  602. }
  603. }
  604. return $this->success($data);
  605. }
  606. /**
  607. * 获取砍价发起列表
  608. * @param array $condition
  609. * @param bool $field
  610. * @param string $order
  611. * @param string $alias
  612. * @param array $join
  613. * @param string $group
  614. * @param null $limit
  615. * @return mixed
  616. */
  617. public function getBargainLaunchList($condition = [], $field = true, $order = '', $alias = 'a', $join = [], $group = '', $limit = null)
  618. {
  619. $list = model('promotion_bargain_launch')->getList($condition, $field, $order, $alias, $join, $group, $limit);
  620. return $list;
  621. }
  622. /**
  623. * 查询数据
  624. * @param array $condition
  625. */
  626. public function getBargainLaunchCount($condition = [])
  627. {
  628. $count = model('promotion_bargain_launch')->getCount($condition, 'launch_id');
  629. return $this->success($count);
  630. }
  631. /**
  632. * 获取砍价记录
  633. * @param array $condition
  634. * @param bool $field
  635. * @param string $order
  636. * @param int $page
  637. * @param int $list_rows
  638. * @param string $alias
  639. * @param array $join
  640. * @return array
  641. */
  642. public function getBargainRecordPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  643. {
  644. $data = model('promotion_bargain_record')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  645. return $this->success($data);
  646. }
  647. /**
  648. * 获取砍价记录信息
  649. * @param array $condition
  650. * @param string $field
  651. */
  652. public function getBargainRecordInfo($condition = [], $field = '*')
  653. {
  654. $data = model('promotion_bargain_record')->getInfo($condition, $field);
  655. return $this->success($data);
  656. }
  657. /**
  658. * 发起砍价
  659. * @param $id
  660. * @param $member_id
  661. */
  662. public function launch($id, $member_id, $site_id, $store_id)
  663. {
  664. $condition = [
  665. [ 'pbg.id', '=', $id ],
  666. [ 'pbg.site_id', '=', $site_id ],
  667. [ 'pbg.status', '=', 1 ],
  668. [ 'g.goods_state', '=', 1 ],
  669. [ 'g.is_delete', '=', 0 ]
  670. ];
  671. $field = 'pbg.*, sku.sku_image,sku.sku_name,sku.price,sku.stock';
  672. $join = [
  673. [ 'goods_sku sku', 'pbg.sku_id = sku.sku_id', 'inner' ],
  674. [ 'goods g', 'g.goods_id = pbg.goods_id', 'inner' ]
  675. ];
  676. $bargain_info = model('promotion_bargain_goods')->getInfo($condition, $field, 'pbg', $join);
  677. if (empty($bargain_info)) return $this->error('', '砍价活动已结束');
  678. if ($bargain_info[ 'bargain_stock' ] <= 0) return $this->error('', '库存不足');
  679. if ($bargain_info[ 'stock' ] <= 0) return $this->error('', '库存不足');
  680. $bargain_info[ 'stock' ] = numberFormat($bargain_info[ 'stock' ]);
  681. $launch_info = model('promotion_bargain_launch')->getInfo([ [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ], [ 'member_id', '=', $member_id ] ]);
  682. if ($launch_info && empty($launch_info[ 'status' ])) return $this->error('', '该商品正在砍价中');
  683. if ($launch_info && $launch_info[ 'status' ] == 1) return $this->error('', '该商品已砍价成功,不能再次发起');
  684. $launch_info = model('promotion_bargain_launch')->getInfo([ [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ], [ 'member_id', '=', $member_id ], [ 'order_id', '>', 0 ] ]);
  685. if ($launch_info && !empty($launch_info[ 'order_id' ])) return $this->error('', '您已发起过砍价,不能再次发起');
  686. $member_info = model('member')->getInfo([ [ 'site_id', '=', $site_id ], [ 'member_id', '=', $member_id ] ], 'nickname,headimg');
  687. if (empty($member_info)) return $this->error('', '未获取到会员信息');
  688. try {
  689. $data = [
  690. 'bargain_id' => $bargain_info[ 'bargain_id' ],
  691. 'sku_id' => $bargain_info[ 'sku_id' ],
  692. 'goods_id' => $bargain_info[ 'goods_id' ],
  693. 'site_id' => $bargain_info[ 'site_id' ],
  694. 'sku_name' => $bargain_info[ 'sku_name' ],
  695. 'sku_image' => $bargain_info[ 'sku_image' ],
  696. 'price' => $bargain_info[ 'price' ],
  697. 'floor_price' => $bargain_info[ 'floor_price' ],
  698. 'buy_type' => $bargain_info[ 'buy_type' ],
  699. 'bargain_type' => $bargain_info[ 'bargain_type' ],
  700. 'need_num' => $bargain_info[ 'bargain_num' ],
  701. 'start_time' => time(),
  702. 'end_time' => ( time() + ( $bargain_info[ 'bargain_time' ] * 3600 ) ),
  703. 'member_id' => $member_id,
  704. 'nickname' => $member_info[ 'nickname' ],
  705. 'headimg' => $member_info[ 'headimg' ],
  706. 'is_fenxiao' => $bargain_info[ 'is_fenxiao' ],
  707. 'first_bargain_price' => $bargain_info[ 'first_bargain_price' ],
  708. 'curr_price' => $bargain_info[ 'price' ],
  709. 'is_own' => $bargain_info[ 'is_own' ],
  710. 'is_differ_new_user' => $bargain_info[ 'is_differ_new_user' ],
  711. 'distinguish' => $bargain_info[ 'distinguish' ],
  712. 'new_low' => $bargain_info[ 'new_low' ],
  713. 'aged_tall' => $bargain_info[ 'aged_tall' ],
  714. 'aged_fixation' => $bargain_info[ 'aged_fixation' ],
  715. 'store_id' => $store_id
  716. ];
  717. $launch_id = model('promotion_bargain_launch')->add($data);
  718. if ($launch_id) {
  719. //修改砍价商品信息
  720. // model('promotion_bargain_goods')->update(
  721. // [
  722. // 'bargain_stock' => $bargain_info[ 'bargain_stock' ] - 1,
  723. // 'join_num' => $bargain_info[ 'join_num' ] + 1,
  724. // ]
  725. // , [ [ 'id', '=', $id ] ]
  726. // );
  727. //增加参与人数
  728. model('promotion_bargain')->setInc([ [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ] ], 'join_num');
  729. if ($bargain_info[ 'is_own' ]) {
  730. $this->bargain($launch_id, $member_id, $site_id);
  731. }
  732. $cron = new Cron();
  733. $cron->addCron(1, 0, '砍价发起自动关闭', 'BargainLaunchClose', $data[ 'end_time' ], $launch_id);
  734. return $this->success($launch_id);
  735. } else {
  736. return $this->error();
  737. }
  738. } catch (\Exception $e) {
  739. return $this->error($e->getMessage());
  740. }
  741. }
  742. /**
  743. * 砍价
  744. * @param $launch_id
  745. * @param $member_id
  746. * @param $site_id
  747. */
  748. public function bargain($launch_id, $member_id, $site_id)
  749. {
  750. model('promotion_bargain_launch')->startTrans();
  751. try {
  752. $launch_info = Db::name('promotion_bargain_launch')->where([ [ 'launch_id', '=', $launch_id ], [ 'site_id', '=', $site_id ] ])->lock(true)->find();
  753. if (empty($launch_info)) {
  754. model('promotion_bargain_launch')->rollback();
  755. return $this->error('', '未获取到砍价信息');
  756. }
  757. if ($launch_info[ 'status' ] != 0) {
  758. model('promotion_bargain_launch')->rollback();
  759. return $this->error('', '砍价已结束');
  760. }
  761. if ($launch_info[ 'is_own' ] == 0 && $launch_info[ 'member_id' ] == $member_id) {
  762. model('promotion_bargain_launch')->rollback();
  763. return $this->error('', '不支持给自己砍价');
  764. }
  765. $member_bargain_count = model('promotion_bargain_record')->getCount([
  766. [ 'bl.bargain_id', '=', $launch_info[ 'bargain_id' ] ],
  767. [ 'br.member_id', '=', $member_id ],
  768. ], 'br.id', 'br', [
  769. [ 'promotion_bargain_launch bl', 'bl.launch_id = br.launch_id', 'left' ]
  770. ]);
  771. $bargain_info = model('promotion_bargain')->getInfo([ [ 'bargain_id', '=', $launch_info[ 'bargain_id' ] ] ], 'help_bargain_num,bargain_max_num');
  772. if ($bargain_info && !empty($bargain_info[ 'help_bargain_num' ]) && $member_bargain_count >= $bargain_info[ 'help_bargain_num' ]) {
  773. return $this->error('', '您的帮砍次数已达上限');
  774. }
  775. $launch_info = array_merge($launch_info, $bargain_info);
  776. //判断商品库存
  777. $goods_model = new Goods();
  778. $goods_sku_stock = $goods_model->getGoodsSkuInfo([ [ 'sku_id', '=', $launch_info[ 'sku_id' ] ] ], 'stock');
  779. $stock = $goods_sku_stock[ 'data' ][ 'stock' ];
  780. if ($stock <= 0) {
  781. model('promotion_bargain_launch')->rollback();
  782. return $this->error('', '库存不足');
  783. }
  784. $member_info = model('member')->getInfo([ [ 'site_id', '=', $site_id ], [ 'member_id', '=', $member_id ] ], 'nickname,headimg');
  785. if (empty($member_info)) {
  786. model('promotion_bargain_launch')->rollback();
  787. return $this->error('', '未获取到会员信息');
  788. }
  789. //区分新老用户
  790. $start_time = time();
  791. $end_time = date('Y-m-d H:i:s', strtotime('-' . $launch_info[ 'distinguish' ] . ' day'));
  792. $member_info_data = model('member')->getInfo([ [ 'site_id', '=', $launch_info[ 'site_id' ] ], [ 'member_id', '=', $member_id ], [ 'reg_time', 'between', [ date_to_time($end_time), $start_time ] ] ], 'member_id');
  793. $is_first = model('promotion_bargain_record')->getCount([ [ 'launch_id', '=', $launch_id ] ], 'id');
  794. $is_first_member = model('promotion_bargain_record')->getCount([ [ 'member_id', '=', $member_id ] ], 'id');
  795. if (!$is_first) {
  796. // 如果是首刀
  797. $bargain_money = $launch_info[ 'first_bargain_price' ] > 0 ? $launch_info[ 'first_bargain_price' ] : $this->bargainMoneyCalculate($launch_info, $member_info_data, $is_first_member);
  798. } else {
  799. $is_exist = model('promotion_bargain_record')->getCount([ [ 'launch_id', '=', $launch_id ], [ 'member_id', '=', $member_id ] ], 'id');
  800. if ($is_exist) {
  801. model('promotion_bargain_launch')->rollback();
  802. return $this->error('', '您已帮好友砍过价了!');
  803. }
  804. $bargain_money = $this->bargainMoneyCalculate($launch_info, $member_info_data, $is_first_member);
  805. }
  806. if (( $launch_info[ 'curr_price' ] - $bargain_money ) < $launch_info[ 'floor_price' ]) {
  807. $bargain_money = $launch_info[ 'curr_price' ] - $launch_info[ 'floor_price' ];
  808. }
  809. if ($bargain_money <= 0) {
  810. model('promotion_bargain_launch')->rollback();
  811. return $this->error();
  812. }
  813. $data = [
  814. 'launch_id' => $launch_id,
  815. 'member_id' => $member_id,
  816. 'nickname' => $member_info[ 'nickname' ],
  817. 'headimg' => $member_info[ 'headimg' ],
  818. 'money' => $bargain_money,
  819. 'bargain_time' => time()
  820. ];
  821. model('promotion_bargain_record')->add($data);
  822. // 砍价人数自增
  823. model('promotion_bargain_launch')->setInc([ [ 'launch_id', '=', $launch_id ] ], 'curr_num');
  824. // 当前砍价金额自减
  825. model('promotion_bargain_launch')->setDec([ [ 'launch_id', '=', $launch_id ] ], 'curr_price', $bargain_money);
  826. // 砍价状态
  827. $status = 0;
  828. if (( (float) $launch_info[ 'curr_price' ] - (float) $bargain_money ) <= ( (float) $launch_info[ 'floor_price' ] )) {
  829. model('promotion_bargain_launch')->update([ 'status' => 1, 'end_time' => time() ], [ [ 'launch_id', '=', $launch_id ] ]);
  830. $status = 1;
  831. $message_model = new Message();
  832. // 发送消息
  833. $param = [ 'keywords' => 'BARGAIN_COMPLETE', 'launch_id' => $launch_id, 'site_id' => $launch_info[ 'site_id' ] ];
  834. $message_model->sendMessage($param);
  835. }
  836. model('promotion_bargain_launch')->commit();
  837. return $this->success([ 'bargain_money' => sprintf("%.2f", $bargain_money), 'status' => $status ]);
  838. } catch (\Exception $e) {
  839. model('promotion_bargain_launch')->rollback();
  840. return $this->error('', $e->getMessage());
  841. }
  842. }
  843. /**
  844. * 砍价金额计算
  845. * @param $data
  846. */
  847. private function bargainMoneyCalculate($data, $member_info, $is_first_member)
  848. {
  849. $bargain_money = 0;
  850. $bargain_num = $data[ 'first_bargain_price' ] > 0 ? $data[ 'need_num' ] - 1 : $data[ 'need_num' ];
  851. $bargain_max_num = $data[ 'bargain_max_num' ] ? ( $data[ 'first_bargain_price' ] > 0 ? $data[ 'bargain_max_num' ] - 1 : $data[ 'bargain_max_num' ] ) : 0;
  852. //平均砍价金额
  853. $average_bargain_money = ( $data[ 'price' ] - $data[ 'floor_price' ] - $data[ 'first_bargain_price' ] ) / $bargain_num;
  854. $need_money = $data[ 'curr_price' ] - $data[ 'floor_price' ]; // 剩余需砍金额
  855. if ($need_money <= 0.01) return 0.01;
  856. $rate = 0.5;
  857. if (!empty($bargain_max_num)) $rate = ( $bargain_max_num - $bargain_num ) / $bargain_max_num;
  858. if (!$data[ 'buy_type' ] && $data[ 'bargain_type' ] == 1) {
  859. if ($bargain_max_num && ( $data[ 'curr_num' ] + 1 ) >= $data[ 'bargain_max_num' ]) return $need_money;
  860. //帮砍随机金额,任意金额可购买
  861. $bargain_money = round(mt_rand(( $average_bargain_money * 100 ) - ( $average_bargain_money * $rate * 100 ), $average_bargain_money * 100), 2);
  862. $bargain_money /= 100;
  863. } else if ($data[ 'buy_type' ] && $data[ 'bargain_type' ] == 1) {
  864. //随机绑砍,指定金额购买
  865. $need_num = $data[ 'need_num' ] - $data[ 'curr_num' ]; // 剩余需帮砍人数
  866. if ($need_num > 0) {
  867. if ($data[ 'is_differ_new_user' ] && $member_info && empty($is_first_member)) {
  868. $bargain_money = mt_rand($data[ 'new_low' ], ( round(( $need_money / $need_num ), 2) * 100 ));
  869. } else {
  870. if ($data[ 'is_differ_new_user' ]) {
  871. $bargain_money = mt_rand(1, ( $data[ 'aged_tall' ] * 100 ));
  872. } else {
  873. $bargain_money = mt_rand(1, ( round(( $need_money / $need_num ), 2) * 100 ));
  874. }
  875. }
  876. } else {
  877. if ($bargain_max_num && ( $data[ 'curr_num' ] + 1 ) >= $data[ 'bargain_max_num' ]) {
  878. $bargain_money = $need_money * 100;
  879. } else {
  880. if ($data[ 'is_differ_new_user' ] && $member_info && empty($is_first_member)) {
  881. $bargain_money = mt_rand(1, ( $data[ 'aged_tall' ] * 100 ));
  882. } else {
  883. $bargain_money = mt_rand(1, ( $need_money * 100 ));
  884. }
  885. }
  886. }
  887. $bargain_money = $bargain_money / 100;
  888. } else {
  889. if (( $data[ 'curr_num' ] + 1 ) >= $data[ 'need_num' ]) return $need_money;
  890. $bargain_money = round(mt_rand(( $average_bargain_money - $average_bargain_money * ( 1 - $rate ) ) * 100, ( $average_bargain_money + $average_bargain_money * ( 1 - $rate ) ) * 100), 2);
  891. $bargain_money /= 100;
  892. }
  893. return $bargain_money;
  894. }
  895. /**
  896. * 关闭到了时间的砍价
  897. * @param $launch_id
  898. */
  899. public function cronCloseBargainLaunch($launch_id)
  900. {
  901. $launch_info = model('promotion_bargain_launch')->getInfo([ [ 'launch_id', '=', $launch_id ], [ 'status', '=', 0 ] ]);
  902. if (!empty($launch_info)) {
  903. if ($launch_info[ 'curr_price' ] == $launch_info[ 'floor_price' ]) {
  904. $data = [ 'status' => 1 ];
  905. } else {
  906. // 未砍到低价都算失败
  907. $data = [ 'status' => 2 ];
  908. }
  909. model('promotion_bargain_launch')->update($data, [ [ 'launch_id', '=', $launch_id ], [ 'status', '=', 0 ] ]);
  910. }
  911. }
  912. /**
  913. * 商品营销活动标识
  914. * @param $discount_id
  915. * @param int $sku_id
  916. */
  917. private function modifyPromotionAddon($bargain_id, $is_delete = false)
  918. {
  919. $goods = new Goods();
  920. $condition = [
  921. [ 'bargain_id', '=', $bargain_id ]
  922. ];
  923. $goods_id = model('promotion_bargain')->getValue($condition, 'goods_id');
  924. $goods->modifyPromotionAddon($goods_id, [ 'bargain' => $bargain_id ], $is_delete);
  925. }
  926. /**
  927. * 判断规格值是否禁用
  928. * @param $bargain_id
  929. * @param $site_id
  930. * @param $goods
  931. * @return false|string
  932. */
  933. public function getGoodsSpecFormat($bargain_id, $site_id, $goods_spec_format = '', $sku_id = 0)
  934. {
  935. //获取活动参与的商品sku_ids
  936. $sku_ids = model('promotion_bargain_goods')->getColumn([ [ 'bargain_id', '=', $bargain_id ], [ 'site_id', '=', $site_id ] ], 'sku_id');
  937. $goods_model = new Goods();
  938. if ($sku_id == 0) {
  939. $res = $goods_model->getGoodsSpecFormat($sku_ids, $goods_spec_format);
  940. } else {
  941. $res = $goods_model->getEmptyGoodsSpecFormat($sku_ids, $sku_id);
  942. }
  943. return $res;
  944. }
  945. public function orderPay($param)
  946. {
  947. //获取砍价id
  948. $bargain_id = model('promotion_bargain_launch')->getValue([ [ 'order_id', '=', $param[ 'order_id' ] ] ], 'bargain_id');
  949. if ($bargain_id != 0) {
  950. //更新砍价销量
  951. model('promotion_bargain')->setInc([ [ 'bargain_id', '=', $bargain_id ] ], 'sale_num');
  952. //获取sku_id
  953. $sku_id = model('order_goods')->getValue([ [ 'order_id', '=', $param[ 'order_id' ] ] ], 'sku_id');
  954. if ($sku_id != 0) {
  955. model('promotion_bargain_goods')->setInc([ [ 'bargain_id', '=', $bargain_id ], [ 'sku_id', '=', $sku_id ] ], 'sale_num');
  956. }
  957. }
  958. return $this->success();
  959. }
  960. /**
  961. * 订单关闭
  962. * @param $param
  963. * @return array
  964. */
  965. public function orderClose($param)
  966. {
  967. //获取砍价id
  968. $bargain_info = model('promotion_bargain_launch')->getInfo([ [ 'order_id', '=', $param[ 'order_id' ] ] ], 'bargain_id,sku_id');
  969. if (!empty($bargain_info)) {
  970. $num = model('order_goods')->getValue([ [ 'order_id', '=', $param[ 'order_id' ] ], [ 'sku_id', '=', $bargain_info[ 'sku_id' ] ] ], 'num');
  971. $param = [
  972. 'bargain_id' => $bargain_info[ 'bargain_id' ],
  973. 'sku_id' => $bargain_info[ 'sku_id' ],
  974. 'num' => $num
  975. ];
  976. $this->incStock($param);
  977. }
  978. return $this->success();
  979. }
  980. /**
  981. * 订单退款
  982. * @param $param
  983. * @return array
  984. */
  985. public function orderGoodsRefund($param)
  986. {
  987. if ($param[ 'delivery_status' ] == Order::DELIVERY_WAIT) {
  988. $order_info = model('order')->getInfo([ [ 'order_id', '=', $param[ 'order_id' ] ] ], 'promotion_type');
  989. if (!empty($order_info) && $order_info[ 'promotion_type' ] == 'bargain') {
  990. $bargain_info = model('promotion_bargain_launch')->getInfo([ [ 'order_id', '=', $param[ 'order_id' ] ] ], 'bargain_id,sku_id');
  991. if (!empty($bargain_info)) {
  992. $param = [
  993. 'bargain_id' => $bargain_info[ 'bargain_id' ],
  994. 'sku_id' => $bargain_info[ 'sku_id' ],
  995. 'num' => $param[ "num" ]
  996. ];
  997. $this->incStock($param);
  998. model('promotion_bargain')->setDec([ [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ] ], 'sale_num');
  999. model('promotion_bargain_goods')->setDec([ [ 'bargain_id', '=', $bargain_info[ 'bargain_id' ] ], [ 'sku_id', '=', $bargain_info[ 'sku_id' ] ] ], 'sale_num');
  1000. }
  1001. }
  1002. }
  1003. return $this->success();
  1004. }
  1005. /**
  1006. * 获取用户正在砍价中的商品
  1007. * @param $member_id
  1008. * @return array
  1009. */
  1010. public function getBargainingGoodsId($member_id)
  1011. {
  1012. $list = model('promotion_bargain_launch')->getList([ [ 'member_id', '=', $member_id ], [ 'status', '=', 0 ] ], 'goods_id', '', 'a', [], 'goods_id');
  1013. $goods_id = [];
  1014. if (!empty($list)) $goods_id = array_column($list, 'goods_id');
  1015. return $goods_id;
  1016. }
  1017. /**
  1018. * 增加库存
  1019. * @param $param
  1020. */
  1021. public function incStock($param)
  1022. {
  1023. $condition = array (
  1024. [ "sku_id", "=", $param[ "sku_id" ] ],
  1025. [ "bargain_id", "=", $param[ "bargain_id" ] ],
  1026. );
  1027. $num = $param[ "num" ];
  1028. $sku_info = model("promotion_bargain_goods")->getInfo($condition, "goods_id,bargain_stock");
  1029. if (empty($sku_info))
  1030. return $this->error(-1, "");
  1031. //编辑sku库存
  1032. $result = model("promotion_bargain_goods")->setInc($condition, "bargain_stock", $num);
  1033. return $this->success($result);
  1034. }
  1035. /**
  1036. * 减少库存
  1037. * @param $param
  1038. */
  1039. public function decStock($param)
  1040. {
  1041. $num = $param[ "num" ];
  1042. $condition = array (
  1043. [ "sku_id", "=", $param[ "sku_id" ] ],
  1044. [ "bargain_id", "=", $param[ "bargain_id" ] ],
  1045. );
  1046. $sku_info = Db::name("promotion_bargain_goods")->where($condition)->field("goods_id,bargain_stock,bargain_name")->lock(true)->find();
  1047. if (empty($sku_info)) {
  1048. return $this->error();
  1049. }
  1050. if ($sku_info[ "bargain_stock" ] < $num) {
  1051. return $this->error('', $sku_info[ "bargain_name" ] . "库存不足!");
  1052. }
  1053. //编辑sku库存
  1054. $result = model("promotion_bargain_goods")->setDec($condition, "bargain_stock", $num);
  1055. if ($result === false) {
  1056. return $this->error();
  1057. }
  1058. return $this->success($result);
  1059. }
  1060. /**
  1061. * 商品用到的分类
  1062. * @param $condition
  1063. * @return array
  1064. */
  1065. public function getGoodsCategoryIds($condition)
  1066. {
  1067. $cache_name = "shop_bargain_goods_category_" . md5(json_encode($condition));
  1068. $cache_time = 60;
  1069. $cache_res = Cache::get($cache_name);
  1070. if (empty($cache_res) || time() - $cache_res[ 'time' ] > $cache_time) {
  1071. $list = Db::name('promotion_bargain')
  1072. ->alias('pb')
  1073. ->join('goods g', 'pb.goods_id = g.goods_id', 'inner')
  1074. ->where($condition)
  1075. ->group('g.category_id')
  1076. ->column('g.category_id');
  1077. $category_ids = trim(join('0', $list), ',');
  1078. $category_id_arr = array_unique(explode(',', $category_ids));
  1079. Cache::set($cache_name, [ 'time' => time(), 'data' => $category_id_arr ]);
  1080. } else {
  1081. $category_id_arr = $cache_res[ 'data' ];
  1082. }
  1083. return $this->success($category_id_arr);
  1084. }
  1085. public function urlQrcode($page, $qrcode_param, $promotion_type, $site_id)
  1086. {
  1087. $params = [
  1088. 'site_id' => $site_id,
  1089. 'data' => $qrcode_param,
  1090. 'page' => $page,
  1091. 'promotion_type' => $promotion_type,
  1092. 'h5_path' => $page . '?b_id=' . $qrcode_param[ 'b_id' ],
  1093. 'qrcode_path' => 'upload/qrcode/bargain',
  1094. 'qrcode_name' => 'bargain_qrcode_' . $promotion_type . '_' . $qrcode_param[ 'b_id' ] . '_' . $site_id
  1095. ];
  1096. $solitaire = event('ExtensionInformation', $params, true);
  1097. return $this->success($solitaire);
  1098. }
  1099. /**
  1100. * 浏览量增加
  1101. * @param $condition
  1102. * @return array
  1103. * @throws \think\db\exception\DbException
  1104. */
  1105. public function bargainBrowseInc($condition)
  1106. {
  1107. $res = model('promotion_bargain')->setInc($condition, 'browse_num');
  1108. return $this->success($res);
  1109. }
  1110. /**
  1111. * 分享量增加
  1112. * @param $condition
  1113. * @return array
  1114. * @throws \think\db\exception\DbException
  1115. */
  1116. public function bargainShareInc($condition)
  1117. {
  1118. $res = model('promotion_bargain')->setInc($condition, 'share_num');
  1119. return $this->success($res);
  1120. }
  1121. /**
  1122. * 砍价成功
  1123. * @param $data
  1124. */
  1125. public function bargainCompleteMessage($data)
  1126. {
  1127. //发送短信
  1128. $sms_model = new Sms();
  1129. $launch_id = $data[ "launch_id" ];
  1130. $launch_info = model("promotion_bargain_launch")->getInfo([ [ "launch_id", "=", $launch_id ] ]);
  1131. $member_model = new Member();
  1132. $member_info_result = $member_model->getMemberInfo([ [ "member_id", "=", $launch_info[ "member_id" ] ] ]);
  1133. $member_info = $member_info_result[ "data" ];
  1134. $var_parse = array (
  1135. "sku_name" => $launch_info[ "sku_name" ],//商品名称
  1136. );
  1137. $data[ "sms_account" ] = $member_info[ "mobile" ];//手机号
  1138. $data[ "var_parse" ] = $var_parse;
  1139. // Log::write('bargainCompleteMessage-sms-' . json_encode($data));
  1140. $sms_model->sendMessage($data);
  1141. if (!empty($member_info) && !empty($member_info[ "wx_openid" ])) {
  1142. $wechat_model = new WechatMessage();
  1143. $data[ "openid" ] = $member_info[ "wx_openid" ];
  1144. $data[ "template_data" ] = [
  1145. 'keyword1' => str_sub($launch_info[ 'sku_name' ]),
  1146. 'keyword2' => $launch_info[ 'price' ],
  1147. 'keyword3' => $launch_info[ 'floor_price' ],
  1148. 'keyword4' => time_to_date($launch_info[ 'end_time' ]),
  1149. ];
  1150. $data[ "page" ] = 'pages_promotion/bargain/detail?l_id=' . $launch_info[ 'launch_id' ] . '&b_id=' . $launch_info[ 'bargain_id' ];
  1151. // Log::write('bargainCompleteMessage-wechat-' . json_encode($data));
  1152. $wechat_model->sendMessage($data);
  1153. }
  1154. //发送订阅消息
  1155. if (!empty($member_info) && !empty($member_info[ "weapp_openid" ])) {
  1156. $weapp_model = new WeappMessage();
  1157. $data[ "openid" ] = $member_info[ "weapp_openid" ];
  1158. $data[ "template_data" ] = [
  1159. 'thing1' => [
  1160. 'value' => str_sub($launch_info[ 'sku_name' ])
  1161. ],
  1162. 'amount2' => [
  1163. 'value' => $launch_info[ 'price' ]
  1164. ],
  1165. 'amount8' => [
  1166. 'value' => $launch_info[ 'floor_price' ]
  1167. ],
  1168. 'time3' => [
  1169. 'value' => time_to_date($launch_info[ 'end_time' ])
  1170. ],
  1171. ];
  1172. $data[ "page" ] = 'pages_promotion/bargain/detail?l_id=' . $launch_info[ 'launch_id' ] . '&b_id=' . $launch_info[ 'bargain_id' ];
  1173. // Log::write('bargainCompleteMessage-wechat-' . json_encode($data));
  1174. $weapp_model->sendMessage($data);
  1175. }
  1176. }
  1177. }