VoucherService.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <?php
  2. namespace addons\Happiness\common\service;
  3. use addons\Happiness\common\enums\HappinessVoucherEnum;
  4. use addons\Happiness\common\logic\voucher\WalletLogic;
  5. use addons\Happiness\common\models\HappinessCashierOrder;
  6. use addons\Happiness\common\models\HappinessGoods;
  7. use addons\Happiness\common\models\HappinessOrder;
  8. use addons\Happiness\common\models\HappinessStore;
  9. use addons\Happiness\common\models\HappinessStoreGoods;
  10. use addons\Happiness\common\models\HappinessStoreGoodsAttr;
  11. use addons\Happiness\common\models\HappinessVoucherExpress;
  12. use addons\Happiness\common\models\HappinessVoucherExpressGoods;
  13. use addons\Happiness\common\models\HappinessVoucherGoods;
  14. use addons\Happiness\common\models\HappinessVoucherOrder;
  15. use addons\Happiness\common\models\HappinessVoucherWallet;
  16. use addons\Happiness\common\service\BaseService;
  17. use common\enums\StatusEnum;
  18. use common\models\common\CapitalLog;
  19. use common\models\common\Region;
  20. use Yii;
  21. class VoucherService extends BaseService
  22. {
  23. //添加提货单
  24. public function addVoucher($attr_param,$mall_id,$store_id)
  25. {
  26. $order_no=$this->generateOrderNo();
  27. $total_num=0;
  28. $total_price=0;
  29. $goods_save_data=[];
  30. foreach ($attr_param as $goods_param)
  31. {
  32. $total_num+=$goods_param['buy_num'];
  33. $total_price=bcadd($goods_param['voucher'],$total_price,2);
  34. $goods_save_data[]=[
  35. 'goods_id'=>$goods_param['goods_id'],
  36. 'attr_id'=>$goods_param['attr_id'],
  37. 'num'=>$goods_param['buy_num'],
  38. 'leave_num'=>$goods_param['buy_num'],
  39. 'mall_id'=>$mall_id,
  40. 'voucher'=>$goods_param['voucher'],
  41. 'label_id'=>$goods_param['label_id'],
  42. ];
  43. }
  44. //获取商家的地址用户名手机号
  45. $one=HappinessStore::find()->where(['id'=>$store_id])->one();
  46. if(!$one)
  47. {
  48. $this->error='商家不存在';
  49. return false;
  50. }
  51. //拼接地址
  52. $region=Region::find()->where(['id'=>[$one['district_id'],$one['city_id'],$one['province_id']]])->asArray()
  53. ->indexBy('id')->all();
  54. $address=$region[$one['province_id']]['name'].$region[$one['city_id']]['name'].$region[$one['district_id']]['name'].$one['address'];
  55. $mobile=$one['shop_mobile'];
  56. $user_name=$one['shop_owner'];
  57. $orderData=[
  58. 'order_no'=>$order_no,
  59. 'status'=>StatusEnum::ENABLED,
  60. 'total_num'=>$total_num,
  61. 'leave_num'=>$total_num,
  62. 'price'=>$total_price,
  63. 'mall_id'=>$mall_id,
  64. 'store_id'=>$store_id,
  65. 'user_name'=>$user_name,
  66. 'mobile'=>$mobile,
  67. 'address'=>$address,
  68. 'order_status'=>HappinessVoucherEnum::ORDER_STATUS_NO_AUDIT,
  69. ];
  70. $res=HappinessVoucherOrder::setData($orderData);
  71. if($res===false)
  72. {
  73. $this->error=HappinessVoucherOrder::getStaticError();
  74. return false;
  75. }
  76. $order_id=$res->id;
  77. //添加商品
  78. foreach ($goods_save_data as $goods_param)
  79. {
  80. $goods_param['order_id']=$order_id;
  81. $res=HappinessVoucherGoods::setData($goods_param);
  82. if($res===false)
  83. {
  84. $this->error=HappinessVoucherGoods::getStaticError();
  85. return false;
  86. }
  87. }
  88. return true;
  89. }
  90. /**
  91. * 生成订单号 202001011400000011
  92. * @return string
  93. */
  94. private function generateOrderNo()
  95. {
  96. $date = date('Ymd'); // 当前日期 YYYYMMDD
  97. $key = 'happiness_voucher_order_no_' . $date; // Redis键名
  98. $serialNumber = Yii::$app->redis->incr($key);
  99. // 设置过期时间到明天
  100. Yii::$app->redis->expireat($key, strtotime(date('Y-m-d 23:59:59')) + 1);
  101. // 格式化为10位数字,不足补0
  102. $serial = str_pad($serialNumber, 10, '0', STR_PAD_LEFT);
  103. return $date . $serial;
  104. }
  105. public function returnVoucher($id)
  106. {
  107. //返还提货券
  108. $model=HappinessVoucherOrder::find()->with(['goods'])->where(['id'=>$id])->asArray()->one();
  109. if(!$model)
  110. {
  111. $this->error='数据不存在';
  112. return false;
  113. }
  114. $total_voucher=[];
  115. foreach ($model['goods'] as $goods_model)
  116. {
  117. if(isset($total_voucher[$goods_model['label_id']]))
  118. {
  119. $total_voucher[$goods_model['label_id']]=bcadd($total_voucher[$goods_model['label_id']],$goods_model['voucher'],2);
  120. }
  121. else
  122. {
  123. $total_voucher[$goods_model['label_id']]=$goods_model['voucher'];
  124. }
  125. }
  126. foreach ($total_voucher as $label_id=>$voucher)
  127. {
  128. $wallet_log[] = [
  129. 'mall_id' => $model['mall_id'],
  130. 'store_id' =>$model['store_id'],
  131. 'level' => $label_id,
  132. 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
  133. 'change_num' => $voucher,
  134. 'desc' => '平台拒绝小店提货',
  135. 'source_table' => HappinessVoucherWallet::tableName(),
  136. 'source_table_id' => $model['store_id'],
  137. 'from_type' => HappinessVoucherEnum::FROM_REFUSE_STORE_BUY,
  138. 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
  139. 'status' => 1,
  140. 'order_no' => ''
  141. ];
  142. }
  143. if(!empty($wallet_log))
  144. {
  145. $tran=Yii::$app->db->beginTransaction();
  146. try {
  147. foreach ($wallet_log as $item)
  148. {
  149. if($item['change_num']>0)
  150. {
  151. $res=WalletLogic::handle($item);
  152. if (!$res)
  153. {
  154. throw new \Exception(WalletLogic::getStaticError());
  155. }
  156. }
  157. }
  158. $tran->commit();
  159. return true;
  160. }catch (\Exception $e)
  161. {
  162. $tran->rollBack();
  163. $this->error=$e->getMessage();
  164. return false;
  165. }
  166. }
  167. return true;
  168. }
  169. //订单完成返还提货券
  170. public function returnOrderVoucher($order_id)
  171. {
  172. //返还提货券
  173. $model=HappinessOrder::find()->with(['orderDetail'])->where(['order_id'=>$order_id])->asArray()->one();
  174. if(!$model)
  175. {
  176. $this->error='数据不存在';
  177. return false;
  178. }
  179. $total_voucher=[];
  180. $goods_ids=array_column($model['orderDetail'],'goods_id');
  181. $happinessGoodsList=HappinessGoods::find()->where(['goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED,'mall_id'=>$model['mall_id']])
  182. ->asArray()->indexBy('goods_id')
  183. ->all();
  184. foreach ($model['orderDetail'] as $goods_model)
  185. {
  186. if(!isset($happinessGoodsList[$goods_model['goods_id']]))
  187. {
  188. continue;
  189. }
  190. $goods_label=$happinessGoodsList[$goods_model['goods_id']]['label_id'];
  191. if(isset($total_voucher[$goods_model['label_id']]))
  192. {
  193. $total_voucher[$goods_label]=bcadd($total_voucher[$goods_label],$goods_model['goods_price'],2);
  194. }
  195. else
  196. {
  197. $total_voucher[$goods_label]=$goods_model['goods_price'];
  198. }
  199. }
  200. foreach ($total_voucher as $label_id=>$voucher)
  201. {
  202. $wallet_log[] = [
  203. 'mall_id' => $model['mall_id'],
  204. 'store_id' =>$model['store_id'],
  205. 'level' => $label_id,
  206. 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
  207. 'change_num' => $voucher,
  208. 'desc' => '订单返还',
  209. 'source_table' => HappinessVoucherWallet::tableName(),
  210. 'source_table_id' => $model['store_id'],
  211. 'from_type' => HappinessVoucherEnum::FROM_SALE,
  212. 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
  213. 'status' => 1,
  214. 'order_no' => ''
  215. ];
  216. }
  217. if(!empty($wallet_log))
  218. {
  219. $tran=Yii::$app->db->beginTransaction();
  220. try {
  221. foreach ($wallet_log as $item)
  222. {
  223. if($item['change_num']>0)
  224. {
  225. $res=WalletLogic::handle($item);
  226. if (!$res)
  227. {
  228. throw new \Exception(WalletLogic::getStaticError());
  229. }
  230. }
  231. }
  232. $tran->commit();
  233. return true;
  234. }catch (\Exception $e)
  235. {
  236. $tran->rollBack();
  237. $this->error=$e->getMessage();
  238. return false;
  239. }
  240. }
  241. return true;
  242. }
  243. public function returnOrderVoucherCashier($order_id)
  244. {
  245. //返还提货券
  246. $model=HappinessCashierOrder::find()->with(['detail'])->where(['id'=>$order_id])->asArray()->one();
  247. if(!$model)
  248. {
  249. $this->error='数据不存在';
  250. return false;
  251. }
  252. $total_voucher=[];
  253. $goods_ids=array_column($model['detail'],'goods_id');
  254. $happinessGoodsList=HappinessGoods::find()->where(['goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED,'mall_id'=>$model['mall_id']])
  255. ->asArray()->indexBy('goods_id')
  256. ->all();
  257. foreach ($model['detail'] as $goods_model)
  258. {
  259. if(!isset($happinessGoodsList[$goods_model['goods_id']]))
  260. {
  261. continue;
  262. }
  263. $goods_label=$happinessGoodsList[$goods_model['goods_id']]['label_id'];
  264. if(isset($total_voucher[$goods_model['label_id']]))
  265. {
  266. $total_voucher[$goods_label]=bcadd($total_voucher[$goods_label],$goods_model['goods_price'],2);
  267. }
  268. else
  269. {
  270. $total_voucher[$goods_label]=$goods_model['goods_price'];
  271. }
  272. }
  273. foreach ($total_voucher as $label_id=>$voucher)
  274. {
  275. $wallet_log[] = [
  276. 'mall_id' => $model['mall_id'],
  277. 'store_id' =>$model['store_id'],
  278. 'level' => $label_id,
  279. 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
  280. 'change_num' => $voucher,
  281. 'desc' => '订单返还',
  282. 'source_table' => HappinessVoucherWallet::tableName(),
  283. 'source_table_id' => $model['store_id'],
  284. 'from_type' => HappinessVoucherEnum::FROM_SALE,
  285. 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
  286. 'status' => 1,
  287. 'order_no' => ''
  288. ];
  289. }
  290. if(!empty($wallet_log))
  291. {
  292. $tran=Yii::$app->db->beginTransaction();
  293. try {
  294. foreach ($wallet_log as $item)
  295. {
  296. if($item['change_num']>0)
  297. {
  298. $res=WalletLogic::handle($item);
  299. if (!$res)
  300. {
  301. throw new \Exception(WalletLogic::getStaticError());
  302. }
  303. }
  304. }
  305. $tran->commit();
  306. return true;
  307. }catch (\Exception $e)
  308. {
  309. $tran->rollBack();
  310. $this->error=$e->getMessage();
  311. return false;
  312. }
  313. }
  314. return true;
  315. }
  316. public function send($param)
  317. {
  318. $model = HappinessVoucherOrder::find()->where(['id' => $param['id'],'mall_id' =>
  319. $this->mall_id])->one();
  320. if (!$model) {
  321. $this->error='数据不存在';
  322. return false;
  323. }
  324. $goods=$param['goods'];
  325. $total_num=0;
  326. if(empty($param['express_no']))
  327. {
  328. $this->error='请填写快递单号';
  329. return false;
  330. }
  331. if(empty($param['express_company']))
  332. {
  333. $this->error='请填写快递公司';
  334. return false;
  335. }
  336. $voucherGoods=HappinessVoucherGoods::find()->where(['id' => array_column($goods,'id'),'mall_id' =>
  337. $this->mall_id])->asArray()->indexBy('id')->all();
  338. foreach ($goods as $goods_item)
  339. {
  340. if($voucherGoods[$goods_item['id']]['leave_num']<$goods_item['send_num'])
  341. {
  342. $this->error='发货数量不能大于剩余发货数量';
  343. return false;
  344. }
  345. if($goods_item['send_num']==0)
  346. {
  347. $this->error='请输入发货数量';
  348. return false;
  349. }
  350. if($goods_item['expire_date']=='')
  351. {
  352. $this->error='请输入过期时间';
  353. return false;
  354. }
  355. if($goods_item['save_day']=='')
  356. {
  357. $this->error='请输入保质时间';
  358. return false;
  359. }
  360. if($goods_item['create_date']=='')
  361. {
  362. $this->error='请输入生产日期';
  363. return false;
  364. }
  365. $total_num+=$goods_item['send_num'];
  366. }
  367. $tran=Yii::$app->db->beginTransaction();
  368. try {
  369. $leave_num=bcsub($model->leave_num,$total_num);
  370. $order_status=$leave_num==0?HappinessVoucherEnum::ORDER_STATUS_ALL_SHIPMENT:HappinessVoucherEnum::ORDER_STATUS_PART_SHIPMENT;
  371. $res=HappinessVoucherOrder::setData([
  372. 'id' => $model->id,
  373. 'leave_num' => bcsub($model->leave_num,$total_num),
  374. 'order_status' => $order_status
  375. ]);
  376. if($res===false)
  377. {
  378. return $this->error(HappinessVoucherOrder::getStaticError());
  379. }
  380. foreach ($goods as $goods_item)
  381. {
  382. $res=HappinessVoucherGoods::setData([
  383. 'id' => $goods_item['id'],
  384. 'leave_num' => bcsub($voucherGoods[$goods_item['id']]['leave_num'],$goods_item['send_num']),
  385. ]);
  386. if($res===false)
  387. {
  388. throw new \Exception(HappinessVoucherGoods::getStaticError());
  389. }
  390. }
  391. //保存物流单
  392. $express=HappinessVoucherExpress::setData([
  393. 'order_id' => $model->id,
  394. 'order_no' => $model->order_no,
  395. 'express_company' => $param['express_company'],
  396. 'express_no' => $param['express_no'],
  397. 'get_status' =>StatusEnum::DISABLED,
  398. 'mall_id' => $this->mall_id,
  399. ]);
  400. if($express===false)
  401. {
  402. throw new \Exception(HappinessVoucherExpress::getStaticError());
  403. }
  404. foreach ($goods as $goods_item)
  405. {
  406. $res=HappinessVoucherExpressGoods::setData([
  407. 'order_id' => $model->id,
  408. 'order_no' => $model->order_no,
  409. 'goods_id' => $goods_item['goods_id'],
  410. 'attr_id' => $goods_item['attr_id'],
  411. 'num' =>$goods_item['send_num'],
  412. 'create_date'=>strtotime($goods_item['create_date']),
  413. 'expire_date' => strtotime($goods_item['expire_date']),
  414. 'save_day'=> $goods_item['save_day'],
  415. 'express_id'=>$express->id,
  416. 'mall_id' => $this->mall_id,
  417. ]);
  418. if($res===false)
  419. {
  420. throw new \Exception(HappinessVoucherExpressGoods::getStaticError());
  421. }
  422. }
  423. $tran->commit();
  424. return true;
  425. }catch (\Exception $e)
  426. {
  427. $tran->rollBack();
  428. $this->error=$e->getMessage().$e->getFile();
  429. return false;
  430. }
  431. }
  432. public function confirm($model)
  433. {
  434. $express_list=HappinessVoucherExpress::find()->with(['goods'])->where(['order_id' => $model->id,'mall_id' =>
  435. $this->mall_id,'get_status' => StatusEnum::DISABLED])->asArray()->all();
  436. if(empty($express_list))
  437. {
  438. $this->error='没有未收货的发货单';
  439. return false;
  440. }
  441. $order_status=$model->leave_num==0?HappinessVoucherEnum::ORDER_STATUS_CONFIRM:$model->order_status;
  442. $tran=Yii::$app->db->beginTransaction();
  443. try {
  444. $res=HappinessVoucherOrder::setData([
  445. 'id' => $model->id,
  446. 'order_status' => $order_status,
  447. ]);
  448. if($res===false)
  449. {
  450. throw new \Exception(HappinessVoucherOrder::getStaticError());
  451. }
  452. foreach ($express_list as $express_item)
  453. {
  454. $goods_ids=array_column($express_item['goods'],'goods_id');
  455. $goods_list=HappinessGoods::find()->where(['goods_id' => $goods_ids,'mall_id' => $this->mall_id,'status'=>StatusEnum::ENABLED])
  456. ->asArray()->indexBy('goods_id')->all();
  457. $res=HappinessVoucherExpress::setData([
  458. 'id' => $express_item['id'],
  459. 'get_status' => StatusEnum::ENABLED,
  460. ]);
  461. if($res===false)
  462. {
  463. throw new \Exception(HappinessVoucherExpress::getStaticError());
  464. }
  465. foreach ($express_item['goods'] as $goods_item)
  466. {
  467. $storeGoods=HappinessStoreGoods::setData([
  468. 'goods_id' => $goods_item['goods_id'],
  469. 'stock' => $goods_item['num'],
  470. 'mall_id' => $this->mall_id,
  471. 'store_id' => $this->store_id
  472. ]);
  473. if($storeGoods===false)
  474. {
  475. throw new \Exception(HappinessStoreGoods::getStaticError());
  476. }
  477. $res=HappinessStoreGoodsAttr::setData( [
  478. 'attr_id' => $goods_item['attr_id'],
  479. 'stock' => $goods_item['num'],
  480. 'mall_id' => $this->mall_id,
  481. 'goods_id'=> $goods_item['goods_id'],
  482. 'store_id' => $this->store_id,
  483. 'yun_goods_id' => $storeGoods->id,
  484. ]);
  485. if($res===false)
  486. {
  487. throw new \Exception(HappinessStoreGoodsAttr::getStaticError());
  488. }
  489. }
  490. }
  491. $tran->commit();
  492. return true;
  493. }
  494. catch (\Exception $e)
  495. {
  496. $tran->rollBack();
  497. $this->error=$e->getMessage().$e->getFile();
  498. return false;
  499. }
  500. }
  501. }