Pinfan.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\pinfan\model;
  11. use addon\coupon\model\CouponType;
  12. use app\model\BaseModel;
  13. use app\model\goods\Goods;
  14. use app\model\system\Config as ConfigModel;
  15. use app\model\system\Cron;
  16. use think\facade\Cache;
  17. use think\facade\Db;
  18. /**
  19. * 拼团返现活动
  20. */
  21. class Pinfan extends BaseModel
  22. {
  23. /**
  24. * 添加拼团返现
  25. * @param $pintuan_data
  26. * @param $goods
  27. * @param $sku_list
  28. * @return array
  29. */
  30. public function addPinfan($pintuan_data, $goods, $sku_list)
  31. {
  32. if (empty($goods[ 'sku_ids' ])) {
  33. return $this->error('', '该活动至少需要一个商品参与');
  34. }
  35. $pintuan_data[ 'create_time' ] = time();
  36. if ($pintuan_data[ 'pintuan_time' ] == 0) {
  37. return $this->error('', "拼团返现有效期时长不能为0");
  38. }
  39. //查询该商品是否存在拼团返现
  40. $pintuan_info = model('promotion_pinfan_goods')->getInfo(
  41. [
  42. [ 'ppg.site_id', '=', $pintuan_data[ 'site_id' ] ],
  43. [ 'pp.status', 'in', '0,1' ],
  44. [ 'ppg.goods_id', 'in', $goods[ 'goods_ids' ] ],
  45. [ '', 'exp', Db::raw('not ( (`start_time` > ' . $pintuan_data[ 'end_time' ] . ' and `start_time` > ' . $pintuan_data[ 'start_time' ] . ' ) or (`end_time` < ' . $pintuan_data[ 'start_time' ] . ' and `end_time` < ' . $pintuan_data[ 'end_time' ] . '))') ]
  46. ], 'ppg.id', 'ppg', [ [ 'promotion_pinfan pp', 'pp.pintuan_id = ppg.pintuan_id', 'left' ] ]
  47. );
  48. if (!empty($pintuan_info)) {
  49. return $this->error('', "当前商品在当前时间段内已经存在拼团返现活动");
  50. }
  51. if (time() > $pintuan_data[ 'end_time' ]) {
  52. return $this->error('', '当前时间不能大于结束时间');
  53. }
  54. if ($pintuan_data[ 'start_time' ] <= time()) {
  55. $pintuan_data[ 'status' ] = 1;
  56. } else {
  57. $pintuan_data[ 'status' ] = 0;
  58. }
  59. model("promotion_pinfan")->startTrans();
  60. try {
  61. foreach ($goods[ 'goods_ids' ] as $goods_id) {
  62. //添加拼团返现活动
  63. $pintuan_data[ 'goods_id' ] = $goods_id;
  64. $pintuan_id = model("promotion_pinfan")->add($pintuan_data);
  65. $sku_list_data = [];
  66. foreach ($sku_list as $k => $sku) {
  67. if ($sku[ 'goods_id' ] == $goods_id) {
  68. $promotion_price = $sku[ 'pintuan_price' ];
  69. if (isset($pintuan_data[ 'is_promotion' ]) && $pintuan_data[ 'is_promotion' ] == 1) {
  70. $promotion_price = $sku[ 'promotion_price' ];
  71. }
  72. $sku_list_data[] = [
  73. 'site_id' => $pintuan_data[ 'site_id' ],
  74. 'pintuan_id' => $pintuan_id,
  75. 'goods_id' => $pintuan_data[ 'goods_id' ],
  76. 'sku_id' => $sku[ 'sku_id' ],
  77. 'pintuan_price' => $sku[ 'pintuan_price' ],
  78. 'promotion_price' => $promotion_price
  79. ];
  80. }
  81. }
  82. array_multisort(array_column($sku_list_data, 'pintuan_price'), SORT_ASC, $sku_list_data);
  83. model('promotion_pinfan_goods')->addList($sku_list_data);
  84. model('promotion_pinfan')->update([ 'pintuan_price' => $sku_list_data[ 0 ][ 'pintuan_price' ] ], [ [ 'pintuan_id', '=', $pintuan_id ] ]);
  85. $cron = new Cron();
  86. if ($pintuan_data[ 'status' ] == 1) {
  87. $goods = new Goods();
  88. $goods->modifyPromotionAddon($goods_id, [ 'pinfan' => $pintuan_id ]);
  89. $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePinfan", $pintuan_data[ 'end_time' ], $pintuan_id);
  90. } else {
  91. $cron->addCron(1, 0, "拼团返现活动开启", "OpenPinfan", $pintuan_data[ 'start_time' ], $pintuan_id);
  92. $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePinfan", $pintuan_data[ 'end_time' ], $pintuan_id);
  93. }
  94. }
  95. model('promotion_fan')->commit();
  96. return $this->success();
  97. } catch (\Exception $e) {
  98. model('promotion_pinfan')->rollback();
  99. return $this->error('', $e->getMessage());
  100. }
  101. }
  102. /**
  103. * 编辑拼团返现
  104. * @param $pintuan_data
  105. * @param $goods
  106. * @param $sku_list
  107. * @return array
  108. */
  109. public function editPinfan($pintuan_data, $goods, $sku_list)
  110. {
  111. if (empty($goods[ 'sku_ids' ])) {
  112. return $this->error('', '该活动至少需要一个商品参与');
  113. }
  114. //查询该商品是否存在拼团返现
  115. $pintuan_info = model('promotion_pinfan_goods')->getInfo(
  116. [
  117. [ 'ppg.site_id', '=', $pintuan_data[ 'site_id' ] ],
  118. [ 'pp.status', 'in', '0,1' ],
  119. [ 'pp.pintuan_id', '<>', $pintuan_data[ 'pintuan_id' ] ],
  120. [ 'ppg.sku_id', 'in', $goods[ 'sku_ids' ] ],
  121. [ '', 'exp', Db::raw('not ( (`start_time` > ' . $pintuan_data[ 'end_time' ] . ' and `start_time` > ' . $pintuan_data[ 'start_time' ] . ' ) or (`end_time` < ' . $pintuan_data[ 'start_time' ] . ' and `end_time` < ' . $pintuan_data[ 'end_time' ] . '))') ]
  122. ], 'ppg.id', 'ppg', [ [ 'promotion_pinfan pp', 'pp.pintuan_id = ppg.pintuan_id', 'left' ] ]
  123. );
  124. if (!empty($pintuan_info)) {
  125. return $this->error('', "当前商品在当前时间段内已经存在拼团返现返现活动");
  126. }
  127. $pintuan_count = model("promotion_pinfan")->getCount([ [ 'pintuan_id', '=', $pintuan_data[ 'pintuan_id' ] ], [ 'site_id', '=', $pintuan_data[ 'site_id' ] ] ]);
  128. if ($pintuan_count == 0) {
  129. return $this->error('', '该拼团返现返现活动不存在');
  130. }
  131. $cron = new Cron();
  132. if (time() > $pintuan_data[ 'end_time' ]) {
  133. return $this->error('', '当前时间不能大于结束时间');
  134. }
  135. if ($pintuan_data[ 'start_time' ] <= time()) {
  136. $pintuan_data[ 'status' ] = 1;
  137. } else {
  138. $pintuan_data[ 'status' ] = 0;
  139. }
  140. $pintuan_data[ 'modify_time' ] = time();
  141. model('promotion_pinfan')->startTrans();
  142. try {
  143. $sku_list_data = [];
  144. foreach ($sku_list as $k => $sku) {
  145. $count = model('promotion_pinfan_goods')->getCount([ [ 'sku_id', '=', $sku[ 'sku_id' ] ], [ 'pintuan_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  146. $is_delete = $sku[ 'is_delete' ];
  147. unset($sku[ 'is_delete' ]);
  148. if ($is_delete == 2) {//是否参与 1参与 2不参与
  149. if ($count) {
  150. model('promotion_pinfan_goods')->delete([ [ 'sku_id', '=', $sku[ 'sku_id' ] ], [ 'pintuan_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  151. }
  152. } else {
  153. $promotion_price = $sku[ 'pintuan_price' ];
  154. if (isset($pintuan_data[ 'is_promotion' ]) && $pintuan_data[ 'is_promotion' ] == 1) {
  155. $promotion_price = $sku[ 'promotion_price' ];
  156. }
  157. $sku_data = [
  158. 'site_id' => $pintuan_data[ 'site_id' ],
  159. 'pintuan_id' => $pintuan_data[ 'pintuan_id' ],
  160. 'goods_id' => $sku[ 'goods_id' ],
  161. 'sku_id' => $sku[ 'sku_id' ],
  162. 'pintuan_price' => $sku[ 'pintuan_price' ],
  163. 'promotion_price' => $promotion_price
  164. ];
  165. $sku_list_data[] = $sku_data;
  166. if ($count > 0) {
  167. model('promotion_pinfan_goods')->update($sku_data, [ [ 'sku_id', '=', $sku[ 'sku_id' ] ], [ 'pintuan_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  168. } else {
  169. model('promotion_pinfan_goods')->add($sku_data);
  170. }
  171. }
  172. }
  173. array_multisort(array_column($sku_list_data, 'pintuan_price'), SORT_ASC, $sku_list_data);
  174. model("promotion_pinfan")->update(
  175. array_merge($pintuan_data, [ 'pintuan_price' => $sku_list_data[ 0 ][ 'pintuan_price' ] ]),
  176. [ [ 'pintuan_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]
  177. );
  178. if ($pintuan_data[ 'start_time' ] <= time()) {
  179. $goods = new Goods();
  180. $goods->modifyPromotionAddon($pintuan_data[ 'goods_id' ], [ 'pinfan' => $pintuan_data[ 'pintuan_id' ] ]);
  181. //活动商品启动
  182. $this->cronOpenPinfan($pintuan_data[ 'pintuan_id' ]);
  183. $cron->deleteCron([ [ 'event', '=', 'OpenPinfan' ], [ 'relate_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  184. $cron->deleteCron([ [ 'event', '=', 'ClosePinfan' ], [ 'relate_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  185. $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePintuan", $pintuan_data[ 'end_time' ], $pintuan_data[ 'pintuan_id' ]);
  186. } else {
  187. $cron->deleteCron([ [ 'event', '=', 'OpenPinfan' ], [ 'relate_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  188. $cron->deleteCron([ [ 'event', '=', 'ClosePinfan' ], [ 'relate_id', '=', $pintuan_data[ 'pintuan_id' ] ] ]);
  189. $cron->addCron(1, 0, "拼团返现活动开启", "OpenPinfan", $pintuan_data[ 'start_time' ], $pintuan_data[ 'pintuan_id' ]);
  190. $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePinfan", $pintuan_data[ 'end_time' ], $pintuan_data[ 'pintuan_id' ]);
  191. }
  192. model('promotion_pinfan')->commit();
  193. return $this->success();
  194. } catch (\Exception $e) {
  195. model('promotion_pinfan')->rollback();
  196. return $this->error('', $e->getMessage());
  197. }
  198. }
  199. /**
  200. * 增加拼团返现组人数及购买人数
  201. * @param array $data
  202. * @param array $condition
  203. * @return array
  204. */
  205. public function editPinfanNum($data = [], $condition = [])
  206. {
  207. $res = model('promotion_pinfan')->update($data, $condition);
  208. return $this->success($res);
  209. }
  210. /**
  211. * 删除拼团返现
  212. * @param unknown $pintuan_id
  213. * @param unknown $site_id
  214. */
  215. public function deletePinfan($pintuan_id, $site_id)
  216. {
  217. $pintuan_info = model("promotion_pinfan")->getInfo([ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]);
  218. if ($pintuan_info[ 'status' ] == 1) {
  219. return $this->error('', "当前活动再进行中,不能删除");
  220. }
  221. $res = model("promotion_pinfan")->delete([ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]);
  222. if ($res) {
  223. //删除拼团返现商品
  224. model("promotion_pinfan_goods")->delete([ [ 'pintuan_id', '=', $pintuan_id ] ]);
  225. //删除拼团返现组
  226. model('promotion_pinfan_group')->delete([ [ 'pintuan_id', '=', $pintuan_id ] ]);
  227. $goods = new Goods();
  228. $goods->modifyPromotionAddon($pintuan_info[ 'goods_id' ], [ 'pintuan' => $pintuan_id ], true);
  229. $cron = new Cron();
  230. $cron->deleteCron([ [ 'event', '=', 'OpenPinfan' ], [ 'relate_id', '=', $pintuan_id ] ]);
  231. $cron->deleteCron([ [ 'event', '=', 'ClosePinfan' ], [ 'relate_id', '=', $pintuan_id ] ]);
  232. }
  233. return $this->success($res);
  234. }
  235. /**
  236. * 拼团返现失效
  237. * @param unknown $pintuan_id
  238. * @param unknown $site_id
  239. */
  240. public function invalidPinfan($pintuan_id, $site_id)
  241. {
  242. model('promotion_pinfan')->startTrans();
  243. try {
  244. $pintuan_info = model("promotion_pinfan")->getInfo([ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]);
  245. $res = model("promotion_pinfan")->update(
  246. [ 'status' => 3, 'modify_time' => time() ],
  247. [ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]
  248. );
  249. if ($pintuan_info[ 'group_num' ] > 0) {//有人拼团返现
  250. //查询所有拼团返现组
  251. $group_model = new PinfanGroup();
  252. //$group_info = $group_model->getPintuanGroupList([ [ 'pintuan_id', '=', $pintuan_id ] ], 'group_id');
  253. $group_list = model("promotion_pinfan_group")->pageList([ [ 'pintuan_id', '=', $pintuan_id, 'status', '<>', 1 ] ], 'group_id', "", 1, 50);
  254. if ((int) $group_list[ 'page_count' ] > 1) {
  255. //新增事件
  256. $cron = new Cron();
  257. $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePinfan", $pintuan_info[ 'end_time' ], $pintuan_id);
  258. }
  259. $group = $group_list[ 'list' ];
  260. if (!empty($group)) {
  261. foreach ($group as $v) {
  262. $result = $group_model->cronClosePinfanGroup($v[ 'group_id' ]);
  263. if ($result[ 'code' ] < 0) {
  264. model('promotion_pinfan')->rollback();
  265. return $result;
  266. }
  267. }
  268. }
  269. }
  270. $goods = new Goods();
  271. $goods->modifyPromotionAddon($pintuan_info[ 'goods_id' ], [ 'pintuan' => $pintuan_id ], true);
  272. model('promotion_pinfan')->commit();
  273. return $this->success($res);
  274. } catch (\Exception $e) {
  275. model('promotion_pinfan')->rollback();
  276. return $this->error($e->getMessage());
  277. }
  278. }
  279. /**
  280. * 获取拼团返现信息
  281. * @param array $condition
  282. * @param string $field
  283. * @return array
  284. */
  285. public function getPinfanInfo($condition = [], $field = '*')
  286. {
  287. $pintuan_info = model("promotion_pinfan")->getInfo($condition, $field);
  288. return $this->success($pintuan_info);
  289. }
  290. /**
  291. * 获取拼团返现详细信息
  292. * @param $pintuan_id
  293. * @param $site_id
  294. * @return array
  295. */
  296. public function getPinfanDetail($pintuan_id, $site_id)
  297. {
  298. //拼团返现信息
  299. $alias = 'p';
  300. $join = [
  301. [
  302. 'goods g',
  303. 'g.goods_id = p.goods_id',
  304. 'inner'
  305. ]
  306. ];
  307. $pintuan_info = model("promotion_pinfan")->getInfo(
  308. [
  309. [ 'p.pintuan_id', '=', $pintuan_id ], [ 'p.site_id', '=', $site_id ],
  310. [ 'g.goods_state', '=', 1 ], [ 'g.is_delete', '=', 0 ]
  311. ], 'p.*', $alias, $join
  312. );
  313. if (!empty($pintuan_info)) {
  314. //商品sku信息
  315. $goods_list = model('goods_sku')->getList(
  316. [ [ 'goods_id', '=', $pintuan_info[ 'goods_id' ] ] ],
  317. 'goods_id,sku_id,sku_name,price,sku_images,stock,sku_image'
  318. );
  319. foreach ($goods_list as $k => $v) {
  320. $v[ 'stock' ] = numberFormat($v[ 'stock' ]);
  321. $pintuan_goods = model('promotion_pinfan_goods')->getInfo(
  322. [ [ 'pintuan_id', '=', $pintuan_id ], [ 'sku_id', '=', $v[ 'sku_id' ] ] ],
  323. 'pintuan_price,promotion_price'
  324. );
  325. if (empty($pintuan_goods)) {
  326. $pintuan_goods = [
  327. 'pintuan_price' => 0,
  328. 'promotion_price' => 0
  329. ];
  330. }
  331. $goods_list[ $k ] = array_merge($v, $pintuan_goods);
  332. }
  333. array_multisort(array_column($goods_list, 'pintuan_price'), SORT_DESC, $goods_list);
  334. $pintuan_info[ 'sku_list' ] = $goods_list;
  335. }
  336. $coupon_list = [];
  337. if ($pintuan_info[ 'reward_type' ] == 3 && $pintuan_info[ 'reward_type_num' ] != '') {
  338. $coupon = new CouponType();
  339. $condition = [
  340. [ 'site_id', '=', $site_id ],
  341. [ 'status', '=', 1 ],
  342. [ 'coupon_type_id', 'in', $pintuan_info[ 'reward_type_num' ] ],
  343. [ '', "exp", Db::raw("(lead_count < count && count != -1) OR count = -1") ]
  344. ];
  345. $coupon_list = $coupon->getCouponTypeList($condition)[ 'data' ];
  346. }
  347. $pintuan_info[ 'coupon_list' ] = $coupon_list;
  348. return $this->success($pintuan_info);
  349. }
  350. /**
  351. * 获取拼团返现详细信息
  352. * @param $pintuan_id
  353. * @param $site_id
  354. * @return array
  355. */
  356. public function getPinfanJoinGoodsList($pintuan_id, $site_id)
  357. {
  358. //拼团返现信息
  359. $alias = 'p';
  360. $join = [
  361. [ 'goods g', 'g.goods_id = p.goods_id', 'inner' ]
  362. ];
  363. $pintuan_info = model("promotion_pinfan")->getInfo(
  364. [
  365. [ 'p.pintuan_id', '=', $pintuan_id ], [ 'p.site_id', '=', $site_id ],
  366. [ 'g.goods_state', '=', 1 ], [ 'g.is_delete', '=', 0 ]
  367. ], 'p.*', $alias, $join
  368. );
  369. if (!empty($pintuan_info)) {
  370. $goods_list = model('promotion_pinfan_goods')->getList(
  371. [ [ 'ppg.pintuan_id', '=', $pintuan_info[ 'pintuan_id' ] ] ],
  372. 'ppg.pintuan_price,ppg.promotion_price,sku.sku_id,sku.sku_name,sku.price,sku.sku_image,sku.stock',
  373. '', 'ppg', [ [ 'goods_sku sku', 'sku.sku_id = ppg.sku_id', 'inner' ] ]
  374. );
  375. foreach ($goods_list as $k => $v) {
  376. $goods_list[ $k ][ 'stock' ] = numberFormat($goods_list[ $k ][ 'stock' ]);
  377. }
  378. $pintuan_info[ 'sku_list' ] = $goods_list;
  379. $coupon_list = [];
  380. if ($pintuan_info[ 'reward_type' ] == 3 && $pintuan_info[ 'reward_type_num' ] != '') {
  381. $coupon = new CouponType();
  382. $condition = [
  383. [ 'site_id', '=', $site_id ],
  384. [ 'status', '=', 1 ],
  385. [ 'coupon_type_id', 'in', $pintuan_info[ 'reward_type_num' ] ],
  386. [ '', "exp", Db::raw("(lead_count < count && count != -1) OR count = -1") ]
  387. ];
  388. $coupon_list = $coupon->getCouponTypeList($condition)[ 'data' ];
  389. }
  390. $pintuan_info[ 'coupon_list' ] = $coupon_list;
  391. }
  392. return $this->success($pintuan_info);
  393. }
  394. /**
  395. * 拼团返现商品详情
  396. * @param array $condition
  397. * @param string $field
  398. * @return array
  399. */
  400. public function getPinfanGoodsDetail($condition = [], $field = '')
  401. {
  402. $alias = 'ppg';
  403. if (empty($field)) {
  404. $field = 'pp.order_num,ppg.id,ppg.pintuan_id,ppg.goods_id,ppg.sku_id,ppg.pintuan_price,ppg.promotion_price,pp.chengtuan_num,pp.reward_type,pp.reward_type_num,pp.pintuan_name,pp.pintuan_num,pp.start_time,pp.end_time,pp.buy_num,pp.is_single_buy,pp.is_promotion,pp.group_num,pp.order_num,sku.site_id,sku.sku_name,sku.sku_spec_format,sku.price,sku.promotion_type,sku.stock,sku.click_num,(g.sale_num + g.virtual_sale) as sale_num,sku.collect_num,sku.sku_image,sku.sku_images,sku.site_id,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,sku.support_trade_type,g.goods_image,g.goods_stock,g.goods_name,sku.qr_id,g.stock_show,g.sale_show,g.label_name,pp.remark';
  405. }
  406. $join = [
  407. [ 'goods_sku sku', 'ppg.sku_id = sku.sku_id', 'inner' ],
  408. [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ],
  409. [ 'promotion_pinfan pp', 'ppg.pintuan_id = pp.pintuan_id', 'inner' ],
  410. ];
  411. $pintuan_goods_info = model('promotion_pinfan_goods')->getInfo($condition, $field, $alias, $join);
  412. if (!empty($pintuan_goods_info)) {
  413. if (isset($pintuan_goods_info[ 'goods_stock' ])) {
  414. $pintuan_goods_info[ 'goods_stock' ] = numberFormat($pintuan_goods_info[ 'goods_stock' ]);
  415. }
  416. if (isset($pintuan_goods_info[ 'sale_num' ])) {
  417. $pintuan_goods_info[ 'sale_num' ] = numberFormat($pintuan_goods_info[ 'sale_num' ]);
  418. }
  419. if (isset($pintuan_goods_info[ 'virtual_sale' ])) {
  420. $pintuan_goods_info[ 'virtual_sale' ] = numberFormat($pintuan_goods_info[ 'virtual_sale' ]);
  421. }
  422. if (isset($pintuan_goods_info[ 'stock' ])) {
  423. $pintuan_goods_info[ 'stock' ] = numberFormat($pintuan_goods_info[ 'stock' ]);
  424. }
  425. if (isset($pintuan_goods_info[ 'real_stock' ])) {
  426. $pintuan_goods_info[ 'real_stock' ] = numberFormat($pintuan_goods_info[ 'real_stock' ]);
  427. }
  428. }
  429. return $this->success($pintuan_goods_info);
  430. }
  431. /**
  432. * 拼团返现商品详情
  433. * @param array $condition
  434. * @param string $field
  435. * @return array
  436. */
  437. public function getPinfanGoodsSkuList($condition = [])
  438. {
  439. $alias = 'ppg';
  440. $field = 'pp.order_num,ppg.id,ppg.pintuan_id,ppg.goods_id,ppg.sku_id,ppg.pintuan_price,ppg.promotion_price
  441. ,pp.chengtuan_num,pp.reward_type,pp.reward_type_num,pp.pintuan_name,pp.pintuan_num,pp.start_time,pp.end_time,pp.buy_num
  442. ,pp.is_single_buy,pp.is_promotion,pp.group_num,pp.order_num
  443. ,sku.sku_name,sku.sku_spec_format,sku.price
  444. ,sku.stock,sku.sku_image,sku.sku_images,sku.goods_spec_format,g.goods_image';
  445. $join = [
  446. [ 'goods_sku sku', 'ppg.sku_id = sku.sku_id', 'inner' ],
  447. [ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ],
  448. [ 'promotion_pinfan pp', 'ppg.pintuan_id = pp.pintuan_id', 'inner' ],
  449. ];
  450. $list = model('promotion_pinfan_goods')->getList($condition, $field, 'ppg.id asc', $alias, $join);
  451. foreach ($list as $k => $v) {
  452. $list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
  453. }
  454. return $this->success($list);
  455. }
  456. /**
  457. * 获取拼团返现列表
  458. * @param array $condition
  459. * @param string $field
  460. * @param string $order
  461. * @param string $limit
  462. */
  463. public function getPinfanList($condition = [], $field = '', $order = '', $limit = null)
  464. {
  465. $alias = 'pp';
  466. if (empty($field)) {
  467. $field = 'pp.order_num,pp.pintuan_id,pp.site_id,pp.pintuan_name,pp.is_virtual_goods,pp.pintuan_num,pp.chengtuan_num,pp.reward_type,pp.reward_type_num,pp.pintuan_price,pp.pintuan_time,pp.is_single_buy,pp.is_recommend,pp.group_num,pp.order_num,g.price,g.goods_id,g.goods_name,g.goods_image,(g.sale_num + g.virtual_sale) as sale_num,g.unit,g.goods_stock,g.recommend_way';
  468. }
  469. $join = [
  470. [ 'goods g', 'pp.goods_id = g.goods_id', 'inner' ]
  471. ];
  472. $list = model('promotion_pinfan')->getList($condition, $field, $order, $alias, $join, '', $limit);
  473. foreach ($list as $k => $v) {
  474. if (isset($v[ 'goods_stock' ])) {
  475. $list[ $k ][ 'goods_stock' ] = numberFormat($list[ $k ][ 'goods_stock' ]);
  476. }
  477. if (isset($v[ 'sale_num' ])) {
  478. $list[ $k ][ 'sale_num' ] = numberFormat($list[ $k ][ 'sale_num' ]);
  479. }
  480. }
  481. return $this->success($list);
  482. }
  483. /**
  484. * 获取拼团返现分页列表
  485. * @param array $condition
  486. * @param number $page
  487. * @param string $page_size
  488. * @param string $order
  489. * @param string $field
  490. */
  491. public function getPinfanPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
  492. {
  493. $field = 'p.*,g.goods_name,g.goods_image,g.price';
  494. $alias = 'p';
  495. $join = [
  496. [
  497. 'goods g',
  498. 'p.goods_id = g.goods_id',
  499. 'inner'
  500. ]
  501. ];
  502. $list = model('promotion_pinfan')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  503. return $this->success($list);
  504. }
  505. /**
  506. * 获取拼团返现商品列表
  507. * @param $bargain_id
  508. * @param $site_id
  509. * @return array
  510. */
  511. public function getPinfanGoodsList($pintuan_id, $site_id)
  512. {
  513. $field = 'pbg.*,sku.sku_name,sku.price,sku.sku_image,sku.stock';
  514. $alias = 'pbg';
  515. $join = [
  516. [
  517. 'goods g',
  518. 'g.goods_id = pbg.goods_id',
  519. 'inner'
  520. ],
  521. [
  522. 'goods_sku sku',
  523. 'sku.sku_id = pbg.sku_id',
  524. 'inner'
  525. ]
  526. ];
  527. $condition = [
  528. [ 'pbg.pintuan_id', '=', $pintuan_id ], [ 'pbg.site_id', '=', $site_id ],
  529. [ 'g.is_delete', '=', 0 ], [ 'g.goods_state', '=', 1 ]
  530. ];
  531. $list = model('promotion_pinfan_goods')->getList($condition, $field, '', $alias, $join);
  532. foreach ($list as $k => $v) {
  533. $list[ $k ][ 'stock' ] = numberFormat($list[ $k ][ 'stock' ]);
  534. }
  535. return $this->success($list);
  536. }
  537. /**
  538. * 获取拼团商品数量
  539. * @param array $where
  540. * @param string $field
  541. * @param string $alias
  542. * @param null $join
  543. * @return array
  544. */
  545. public function getPinfanGoodsCount($where = [], $field = '*', $alias = 'a', $join = null, $group = null)
  546. {
  547. $count = model('promotion_pinfan_goods')->getCount($where, $field, $alias, $join, $group);
  548. return $this->success($count);
  549. }
  550. /**
  551. * 获取拼团返现商品分页列表
  552. * @param array $condition
  553. * @param number $page
  554. * @param string $page_size
  555. * @param string $order
  556. * @param string $field
  557. */
  558. public function getPinfanGoodsPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '')
  559. {
  560. $alias = 'pp';
  561. if (empty($field)) {
  562. $field = 'pp.order_num,pp.pintuan_id,pp.site_id,pp.pintuan_name,pp.is_virtual_goods,pp.pintuan_num,pp.chengtuan_num,pp.reward_type,pp.reward_type_num,pp.pintuan_price,pp.pintuan_time,pp.is_single_buy,pp.is_recommend,pp.group_num,pp.order_num,g.price,g.goods_id,g.goods_name,g.goods_image,(g.sale_num + g.virtual_sale) as sale_num,g.unit,g.goods_stock,g.recommend_way';
  563. }
  564. $join = [
  565. [ 'goods g', 'pp.goods_id = g.goods_id', 'inner' ]
  566. ];
  567. $res = model('promotion_pinfan')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  568. foreach ($res[ 'list' ] as $k => $v) {
  569. if (isset($v[ 'goods_stock' ])) {
  570. $res[ 'list' ][ $k ][ 'goods_stock' ] = numberFormat($res[ 'list' ][ $k ][ 'goods_stock' ]);
  571. }
  572. if (isset($v[ 'sale_num' ])) {
  573. $res[ 'list' ][ $k ][ 'sale_num' ] = numberFormat($res[ 'list' ][ $k ][ 'sale_num' ]);
  574. }
  575. }
  576. return $this->success($res);
  577. }
  578. /**
  579. * 开启拼团返现活动
  580. * @param $pintuan_id
  581. * @return array|\multitype
  582. */
  583. public function cronOpenPinfan($pintuan_id)
  584. {
  585. $pintuan_info = model('promotion_pinfan')->getInfo([ [ 'pintuan_id', '=', $pintuan_id ] ], 'start_time,status,goods_id');
  586. if (!empty($pintuan_info)) {
  587. $goods = new Goods();
  588. $goods->modifyPromotionAddon($pintuan_info[ 'goods_id' ], [ 'pinfan' => $pintuan_id ]);
  589. if ($pintuan_info[ 'start_time' ] <= time() && $pintuan_info[ 'status' ] == 0) {
  590. $res = model('promotion_pinfan')->update([ 'status' => 1 ], [ [ 'pintuan_id', '=', $pintuan_id ] ]);
  591. return $this->success($res);
  592. } else {
  593. return $this->error("", "拼团返现活动已开启或者关闭");
  594. }
  595. } else {
  596. return $this->error("", "拼团返现活动不存在");
  597. }
  598. }
  599. /**
  600. * 关闭拼团返现活动
  601. * @param $pintuan_id
  602. * @return array|\multitype
  603. */
  604. public function cronClosePinfan($pintuan_id)
  605. {
  606. $pintuan_info = model('promotion_pinfan')->getInfo([ [ 'pintuan_id', '=', $pintuan_id ] ], 'site_id,start_time,status');
  607. if (!empty($pintuan_info)) {
  608. return $this->invalidPinfan($pintuan_id, $pintuan_info[ 'site_id' ]);
  609. } else {
  610. return $this->error("", "拼团返现活动不存在");
  611. }
  612. }
  613. /**
  614. * 判断规格值是否禁用
  615. * @param $bargain_id
  616. * @param $site_id
  617. * @param $goods
  618. * @return false|string
  619. */
  620. public function getGoodsSpecFormat($pintuan_id, $site_id, $goods_spec_format = '', $sku_id = 0)
  621. {
  622. //获取活动参与的商品sku_ids
  623. $sku_ids = model('promotion_pinfan_goods')->getColumn([ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ], 'sku_id');
  624. $goods_model = new Goods();
  625. if ($sku_id == 0) {
  626. $res = $goods_model->getGoodsSpecFormat($sku_ids, $goods_spec_format);
  627. } else {
  628. $res = $goods_model->getEmptyGoodsSpecFormat($sku_ids, $sku_id);
  629. }
  630. return $res;
  631. }
  632. /**
  633. * 拼团返现失效
  634. * @param unknown $pintuan_id
  635. * @param unknown $site_id
  636. */
  637. public function invalidPinfanTo($pintuan_id, $site_id)
  638. {
  639. model('promotion_pinfan')->startTrans();
  640. try {
  641. $pintuan_info = model("promotion_pinfan")->getInfo([ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]);
  642. $res = model("promotion_pinfan")->update(
  643. [ 'status' => 3, 'modify_time' => time() ],
  644. [ [ 'pintuan_id', '=', $pintuan_id ], [ 'site_id', '=', $site_id ] ]
  645. );
  646. if ($pintuan_info[ 'group_num' ] > 0) {//有人拼团返现
  647. //查询所有拼团返现组
  648. $group_model = new PinfanGroup();
  649. $group_info = $group_model->getPinfanGroupList([ [ 'pintuan_id', '=', $pintuan_id ] ], 'group_id');
  650. // $group_list = model("promotion_pinfan_group")->pageList([ [ 'pintuan_id', '=', $pintuan_id, 'status', '<>', 1 ] ], 'group_id', "",1, 50);
  651. // if($group_list['count'] > 1){
  652. // //新增事件
  653. // $cron = new Cron();
  654. // $cron->addCron(1, 0, "拼团返现活动关闭", "ClosePintuan", $pintuan_info[ 'end_time' ], $pintuan_id);
  655. // }
  656. $group = $group_info[ 'data' ];
  657. if (!empty($group)) {
  658. foreach ($group as $v) {
  659. $result = $group_model->cronClosePinfanGroup($v[ 'group_id' ]);
  660. if ($result[ 'code' ] < 0) {
  661. model('promotion_pinfan')->rollback();
  662. return $result;
  663. }
  664. }
  665. }
  666. }
  667. $goods = new Goods();
  668. $goods->modifyPromotionAddon($pintuan_info[ 'goods_id' ], [ 'pinfan' => $pintuan_id ], true);
  669. model('promotion_pinfan')->commit();
  670. return $this->success($res);
  671. } catch (\Exception $e) {
  672. model('promotion_pinfan')->rollback();
  673. return $this->error($e->getMessage());
  674. }
  675. }
  676. /**
  677. * @param $pintuan_id
  678. * @param $name
  679. * @param $site_id
  680. * @param string $type
  681. * @return array
  682. * shop端推广
  683. */
  684. public function qrcode($pintuan_id, $name, $site_id, $type = "create")
  685. {
  686. $data = [
  687. 'site_id' => $site_id,
  688. 'app_type' => "all", // all为全部
  689. 'type' => $type, // 类型 create创建 get获取
  690. 'data' => [
  691. 'pinfan_id' => $pintuan_id
  692. ],
  693. 'page' => '/pages_promotion/pinfan/detail',
  694. 'qrcode_path' => 'upload/qrcode/pinfan',
  695. 'qrcode_name' => 'pinfan_code_' . $pintuan_id . '_' . $site_id,
  696. ];
  697. event('Qrcode', $data, true);
  698. $app_type_list = config('app_type');
  699. $path = [];
  700. foreach ($app_type_list as $k => $v) {
  701. switch ( $k ) {
  702. case 'h5':
  703. $wap_domain = getH5Domain();
  704. $path[ $k ][ 'status' ] = 1;
  705. $path[ $k ][ 'url' ] = $wap_domain . $data[ 'page' ] . '?pinfan_id=' . $pintuan_id;
  706. $path[ $k ][ 'img' ] = "upload/qrcode/pinfan/pinfan_code_" . $pintuan_id . "_" . $site_id . "_" . $k . ".png";
  707. break;
  708. case 'weapp' :
  709. $config = new ConfigModel();
  710. $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'WEAPP_CONFIG' ] ]);
  711. if (!empty($res[ 'data' ])) {
  712. if (empty($res[ 'data' ][ 'value' ][ 'qrcode' ])) {
  713. $path[ $k ][ 'status' ] = 2;
  714. $path[ $k ][ 'message' ] = '未配置微信小程序';
  715. } else {
  716. $path[ $k ][ 'status' ] = 1;
  717. $path[ $k ][ 'img' ] = $res[ 'data' ][ 'value' ][ 'qrcode' ];
  718. }
  719. } else {
  720. $path[ $k ][ 'status' ] = 2;
  721. $path[ $k ][ 'message' ] = '未配置微信小程序';
  722. }
  723. break;
  724. case 'wechat' :
  725. $config = new ConfigModel();
  726. $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'WECHAT_CONFIG' ] ]);
  727. if (!empty($res[ 'data' ])) {
  728. if (empty($res[ 'data' ][ 'value' ][ 'qrcode' ])) {
  729. $path[ $k ][ 'status' ] = 2;
  730. $path[ $k ][ 'message' ] = '未配置微信公众号';
  731. } else {
  732. $path[ $k ][ 'status' ] = 1;
  733. $path[ $k ][ 'img' ] = $res[ 'data' ][ 'value' ][ 'qrcode' ];
  734. }
  735. } else {
  736. $path[ $k ][ 'status' ] = 2;
  737. $path[ $k ][ 'message' ] = '未配置微信公众号';
  738. }
  739. break;
  740. }
  741. }
  742. $return = [
  743. 'path' => $path,
  744. 'name' => $name,
  745. ];
  746. return $this->success($return);
  747. }
  748. /**
  749. * 商品用到的分类
  750. * @param $condition
  751. * @return array
  752. */
  753. public function getGoodsCategoryIds($condition)
  754. {
  755. $cache_name = "shop_pinfan_goods_category_" . md5(json_encode($condition));
  756. $cache_time = 60;
  757. $cache_res = Cache::get($cache_name);
  758. if (empty($cache_res) || time() - $cache_res[ 'time' ] > $cache_time) {
  759. $list = Db::name('promotion_pinfan')
  760. ->alias('pp')
  761. ->join('goods g', 'pp.goods_id = g.goods_id', 'inner')
  762. ->where($condition)
  763. ->group('g.category_id')
  764. ->column('g.category_id');
  765. $category_ids = trim(join('0', $list), ',');
  766. $category_id_arr = array_unique(explode(',', $category_ids));
  767. Cache::set($cache_name, [ 'time' => time(), 'data' => $category_id_arr ]);
  768. } else {
  769. $category_id_arr = $cache_res[ 'data' ];
  770. }
  771. return $this->success($category_id_arr);
  772. }
  773. public function urlQrcode($page, $qrcode_param, $promotion_type, $site_id)
  774. {
  775. $params = [
  776. 'site_id' => $site_id,
  777. 'data' => $qrcode_param,
  778. 'page' => $page,
  779. 'promotion_type' => $promotion_type,
  780. 'h5_path' => $page . '?id=' . $qrcode_param[ 'id' ],
  781. 'qrcode_path' => 'upload/qrcode/pinfan',
  782. 'qrcode_name' => [
  783. 'h5_name' => 'pinfan_code_' . $promotion_type . '_h5_' . $qrcode_param[ 'id' ] . '_' . $site_id,
  784. 'weapp_name' => 'pinfan_code_' . $promotion_type . '_weapp_' . $qrcode_param[ 'id' ] . '_' . $site_id
  785. ]
  786. ];
  787. $solitaire = event('ExtensionInformation', $params);
  788. return $this->success($solitaire[ 0 ]);
  789. }
  790. }