MoveService.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <?php
  2. namespace addons\Happiness\common\service;
  3. use addons\Happiness\common\enums\HappinessEnum;
  4. use addons\Happiness\common\enums\HappinessVoucherEnum;
  5. use addons\Happiness\common\logic\voucher\WalletLogic;
  6. use addons\Happiness\common\models\HappinessGoods;
  7. use addons\Happiness\common\models\HappinessMoveGoods;
  8. use addons\Happiness\common\models\HappinessMoveItem;
  9. use addons\Happiness\common\models\HappinessStoreGoods;
  10. use addons\Happiness\common\models\HappinessStoreGoodsAttr;
  11. use addons\Happiness\common\models\HappinessVoucherWallet;
  12. use common\models\common\CapitalLog;
  13. use common\models\user\User;
  14. use common\models\goods\Goods;
  15. use common\models\goods\GoodsAttr;
  16. use common\enums\StatusEnum;
  17. use common\helpers\ApiCode;
  18. use common\enums\AddonsEnum;
  19. use common\enums\WhetherEnum;
  20. use common\models\cart\Cart;
  21. use common\models\goods\GoodsCate;
  22. use common\models\goods\GoodsCateRelate;
  23. use yii\helpers\Json;
  24. use Exception;
  25. use Money\Exchange;
  26. use Swoole\Http\Status;
  27. use Yii;
  28. class MoveService extends BaseService
  29. {
  30. /**
  31. * 添加调货申请
  32. * @param $params
  33. * @return void
  34. */
  35. public function addMove($params)
  36. {
  37. $goods_id = $params['goods_id'];
  38. $attr = $params['attr'];
  39. if (empty($attr)) {
  40. $this->error = '请选择商品属性';
  41. return false;
  42. }
  43. $saveData = [];
  44. $goods = HappinessStoreGoods::findOne(['mall_id' => $this->mall_id, 'store_id' => $this->store_id, 'goods_id'
  45. => $goods_id, 'status' => StatusEnum::ENABLED]);
  46. if (!$goods) {
  47. $this->error = '商品不存在';
  48. return false;
  49. }
  50. //平台商品还存在不
  51. $happiness_goods = HappinessGoods::findOne(['mall_id' => $this->mall_id, 'goods_id' => $goods['goods_id'],
  52. 'status' => StatusEnum::ENABLED, 'is_on_sale' => StatusEnum::ENABLED]);
  53. if (!$happiness_goods) {
  54. $this->error = '选品库商品不存在或者已下架';
  55. return false;
  56. }
  57. $attr_ids = array_column($attr, 'attr_id');
  58. $mall_attr = GoodsAttr::find()->where(['id' => $attr_ids, 'status' => StatusEnum::ENABLED])->asArray()->indexBy('id')->all();
  59. $total_price = 0;
  60. $total_num = 0;
  61. foreach ($attr as $key => $value) {
  62. if ($value['move_num'] <= 0) {
  63. continue;
  64. }
  65. if (!isset($mall_attr[$value['attr_id']])) {
  66. $this->error = '商品属性在平台商品库已经删除,无法调货';
  67. return false;
  68. }
  69. $goods_price = bcmul($mall_attr[$value['attr_id']]['price'], $value['move_num'], 2);
  70. $saveData[] = [
  71. 'goods_id' => $goods_id,
  72. 'attr_id' => $value['attr_id'],
  73. 'num' => $value['move_num'],
  74. 'mall_id' => $this->mall_id,
  75. 'total_price' => $goods_price,
  76. ];
  77. $total_price = bcadd($total_price, $goods_price, 2);
  78. $total_num += $value['move_num'];
  79. }
  80. if ($total_num <= 0) {
  81. $this->error = '请填写调货数量';
  82. return false;
  83. }
  84. $transaction = Yii::$app->db->beginTransaction();
  85. try {
  86. $moveItem = HappinessMoveItem::setData([
  87. 'goods_id' => $goods_id,
  88. 'total_price' => $total_price,
  89. 'total_num' => $total_num,
  90. 'mall_id' => $this->mall_id,
  91. 'label_id' => $happiness_goods['label_id'],
  92. 'store_id' => $this->store_id,
  93. 'order_status' => HappinessEnum::MOVE_NO_AUDIT,
  94. ]);
  95. if (!$moveItem) {
  96. throw new Exception(HappinessMoveItem::getStaticError());
  97. }
  98. foreach ($saveData as $key => $value) {
  99. $value['move_id'] = $moveItem->id;
  100. $res = HappinessMoveGoods::setData($value);
  101. if (!$res) {
  102. throw new Exception(HappinessMoveGoods::getStaticError());
  103. }
  104. }
  105. $transaction->commit();
  106. return true;
  107. } catch (Exception $e) {
  108. $transaction->rollBack();
  109. $this->error = $e->getMessage();
  110. return false;
  111. }
  112. }
  113. //同意调货
  114. public function auditMove($params)
  115. {
  116. $id = $params['id'];
  117. $give_store_id = $params['store_id'];
  118. $remark = $params['remark'];
  119. $status=$params['audit_status'];
  120. if($status==0)
  121. {
  122. //拒绝调货
  123. $res = HappinessMoveItem::setData([
  124. 'id' => $id,
  125. 'order_status' => HappinessEnum::MOVE_AUDIT_FAILED,
  126. 'remark' => $remark,
  127. 'agent_user'=>$this->user_id
  128. ]);
  129. if (!$res) {
  130. $this->error=HappinessMoveItem::getStaticError();
  131. return false;
  132. }
  133. return true;
  134. }
  135. if (empty($id)) {
  136. $this->error = '请选择调货单';
  137. return false;
  138. }
  139. if (empty($give_store_id)) {
  140. $this->error = '请选择调货小店';
  141. return false;
  142. }
  143. $moveItem = HappinessMoveItem::find()->with(['goods'])->where(['id' => $id, 'mall_id' => $this->mall_id,
  144. 'status' => StatusEnum::ENABLED])->asArray()->one();
  145. if (!$moveItem) {
  146. $this->error = '调货单不存在';
  147. return false;
  148. }
  149. if($moveItem['store_id'] == $give_store_id)
  150. {
  151. $this->error = '调货小店不能是自己';
  152. return false;
  153. }
  154. //判断目标小店是否有库存
  155. $attr_ids = array_column($moveItem['goods'], 'attr_id');
  156. $goods_attr = HappinessStoreGoodsAttr::find()->where(['mall_id' => $this->mall_id, 'store_id' => $give_store_id,
  157. 'status' => StatusEnum::ENABLED, 'attr_id' => $attr_ids, 'goods_id' => $moveItem['goods_id']])->indexBy('attr_id')->asArray()
  158. ->all();
  159. if (empty($goods_attr)) {
  160. $this->error = '调货小店商品库存不足';
  161. return false;
  162. }
  163. $get_goods_attr = HappinessStoreGoodsAttr::find()->where(['mall_id' => $this->mall_id, 'store_id' => $moveItem['store_id'],
  164. 'status' => StatusEnum::ENABLED, 'attr_id' => $attr_ids, 'goods_id' => $moveItem['goods_id']])->indexBy('attr_id')->asArray()
  165. ->all();
  166. if (empty($get_goods_attr)) {
  167. $this->error = '申请小店商品规格不存在';
  168. return false;
  169. }
  170. $getGoods = HappinessStoreGoods::find()->where(['goods_id' => $moveItem['goods_id'], 'mall_id' =>
  171. $this->mall_id, 'store_id' => $moveItem['store_id'],
  172. 'status' => StatusEnum::ENABLED])->asArray()->one();
  173. if (empty($getGoods)) {
  174. $this->error = '申请小店商品不存在';
  175. return false;
  176. }
  177. $giveStoreAttr = [];
  178. $giveGoodsTotalNum = 0;
  179. $getStoreAttr = [];
  180. $getGoodsTotalNum = 0;
  181. foreach ($moveItem['goods'] as $key => $value) {
  182. if (!isset($goods_attr[$value['attr_id']])) {
  183. $this->error = '调货小店商品库存不足,规格:' . $value['attr_id'];
  184. return false;
  185. }
  186. if ($value['num'] > $goods_attr[$value['attr_id']]['stock']) {
  187. $this->error = '调货小店商品库存不足,规格:' . $value['attr_id'];
  188. return false;
  189. }
  190. if (!isset($get_goods_attr[$value['attr_id']])) {
  191. $this->error = '申请小店商品规格不存在,规格:' . $value['attr_id'];
  192. return false;
  193. }
  194. $giveStoreAttr[] = [
  195. 'id' => $goods_attr[$value['attr_id']]['id'],
  196. 'stock' => -$value['num'],
  197. 'mall_id' => $this->mall_id,
  198. 'store_id' => $give_store_id,
  199. ];
  200. $getStoreAttr[] = [
  201. 'id' => $get_goods_attr[$value['attr_id']]['id'],
  202. 'stock' => $value['num'],
  203. 'mall_id' => $this->mall_id,
  204. 'store_id' => $moveItem['store_id'],
  205. ];
  206. $giveGoodsTotalNum += $value['num'];
  207. $getGoodsTotalNum += $value['num'];
  208. }
  209. $giveGoods = HappinessStoreGoods::find()->where(['goods_id' => $moveItem['goods_id'], 'mall_id' =>
  210. $this->mall_id, 'store_id' => $give_store_id,
  211. 'status' => StatusEnum::ENABLED])->asArray()->one();
  212. if (!$giveGoods) {
  213. $this->error = '调货商品不存在';
  214. return false;
  215. }
  216. $giveGoodsSaveData = [
  217. 'id' => $giveGoods['id'],
  218. 'stock' => -$giveGoodsTotalNum,
  219. 'mall_id' => $this->mall_id,
  220. 'store_id' => $give_store_id,
  221. 'goods_id' => $moveItem['goods_id'],
  222. ];
  223. $getGoodsSaveData = [
  224. 'id' => $getGoods['id'],
  225. 'stock' => $getGoodsTotalNum,
  226. 'mall_id' => $this->mall_id,
  227. 'store_id' => $moveItem['store_id'],
  228. 'goods_id' => $moveItem['goods_id'],
  229. ];
  230. $transaction = Yii::$app->db->beginTransaction();
  231. try {
  232. $res = HappinessMoveItem::setData([
  233. 'id' => $id,
  234. 'order_status' => HappinessEnum::MOVE_AUDIT_SUCCESS,
  235. 'give_store_id' => $give_store_id,
  236. 'remark' => $remark,
  237. 'agent_user' => $this->user_id
  238. ]);
  239. if (!$res) {
  240. throw new Exception(HappinessMoveItem::getStaticError());
  241. }
  242. //减少库存
  243. $res = HappinessStoreGoods::setData($giveGoodsSaveData);
  244. if (!$res) {
  245. throw new Exception(HappinessStoreGoods::getStaticError());
  246. }
  247. foreach ($giveStoreAttr as $key => $value) {
  248. $res = HappinessStoreGoodsAttr::setData($value);
  249. if (!$res) {
  250. throw new Exception(HappinessStoreGoodsAttr::getStaticError());
  251. }
  252. }
  253. //增加库存
  254. $res = HappinessStoreGoods::setData($getGoodsSaveData);
  255. if (!$res) {
  256. throw new Exception(HappinessStoreGoods::getStaticError());
  257. }
  258. foreach ($getStoreAttr as $key => $value) {
  259. $res = HappinessStoreGoodsAttr::setData($value);
  260. if (!$res) {
  261. throw new Exception(HappinessStoreGoodsAttr::getStaticError());
  262. }
  263. }
  264. //减少提货券和增加提货券
  265. $wallet=HappinessVoucherWallet::find()->where(['mall_id' => $this->mall_id, 'store_id' => [$give_store_id,
  266. $moveItem['store_id']],
  267. 'status' => StatusEnum::ENABLED, 'level' => $moveItem['label_id']])->asArray()->indexBy('store_id')
  268. ->all();
  269. if(!isset($wallet[$moveItem['store_id']]) || $wallet[$moveItem['store_id']]['balance']<=$moveItem['total_price'])
  270. {
  271. $this->error = '申请小店提货券余额不足';
  272. return false;
  273. }
  274. $wallet_log[] = [
  275. 'mall_id' => $this->mall_id,
  276. 'store_id' =>$moveItem['store_id'],
  277. 'level' => $moveItem['label_id'],
  278. 'change_type' => CapitalLog::CHANGE_TYPE_SUB,
  279. 'change_num' => -$moveItem['total_price'],
  280. 'desc' => '小店调货扣除提货券',
  281. 'source_table' => HappinessVoucherWallet::tableName(),
  282. 'source_table_id' => $moveItem['store_id'],
  283. 'from_type' => HappinessVoucherEnum::FROM_STORE_MOVE_SUB,
  284. 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
  285. 'status' => 1,
  286. 'order_no' => ''
  287. ];
  288. $wallet_log[] = [
  289. 'mall_id' => $this->mall_id,
  290. 'store_id' =>$give_store_id,
  291. 'level' => $moveItem['label_id'],
  292. 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
  293. 'change_num' => $moveItem['total_price'],
  294. 'desc' => '小店调货增加提货券',
  295. 'source_table' => HappinessVoucherWallet::tableName(),
  296. 'source_table_id' => $give_store_id,
  297. 'from_type' => HappinessVoucherEnum::FROM_STORE_MOVE_ADD,
  298. 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
  299. 'status' => 1,
  300. 'order_no' => ''
  301. ];
  302. foreach ($wallet_log as $item)
  303. {
  304. if(abs($item['change_num'])>0)
  305. {
  306. $res=WalletLogic::handle($item);
  307. if (!$res)
  308. {
  309. throw new \Exception(WalletLogic::getStaticError());
  310. }
  311. }
  312. }
  313. $transaction->commit();
  314. return true;
  315. } catch (Exception $e) {
  316. $transaction->rollBack();
  317. $this->error = $e->getMessage();
  318. return false;
  319. }
  320. }
  321. }