Order.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. <?php
  2. namespace app\common\logic;
  3. use app\common\model\jarc\User;
  4. use think\facade\Db;
  5. /**
  6. * ============================================================================
  7. * DSMall多用户商城
  8. * ============================================================================
  9. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  10. * 网站地址: http://www.csdeshang.com
  11. * ----------------------------------------------------------------------------
  12. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  13. * 不允许对程序代码以任何形式任何目的的再发布。
  14. * ============================================================================
  15. * 逻辑层模型
  16. */
  17. class Order
  18. {
  19. /**
  20. * 取消订单
  21. * @param array $order_info
  22. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  23. * @param string $user 操作人
  24. * @param string $msg 操作备注
  25. * @param boolean $if_update_account 是否变更账户金额
  26. * @param boolean $if_queue 是否使用队列
  27. * @param boolean $if_pay 是否已经支付,已经支付则全部退回支付金额
  28. * @return array
  29. */
  30. public function changeOrderStateCancel($order_info, $role, $user = '', $msg = '', $if_update_account = true, $if_quque = true, $if_pay = false)
  31. {
  32. $order_model = model('order');
  33. if ($order_info['order_state'] != ORDER_STATE_CANCEL && $order_info['order_state'] != ORDER_STATE_SUCCESS) {
  34. $order_id = $order_info['order_id'];
  35. //库存销量变更
  36. $goods_list = $order_model->getOrdergoodsList(['order_id' => $order_id]);
  37. $data = [];
  38. $pintuan_list = [];//需要后续处理的促销活动
  39. $ppintuanorder_model = model('ppintuanorder');
  40. foreach ($goods_list as $goods) {
  41. $data[$goods['goods_id']] = $goods['goods_num'];
  42. //如果是拼团
  43. if ($goods['goods_type'] == 6) {
  44. $pintuan_list[] = $goods;
  45. }
  46. $condition = [];
  47. $condition[] = ['order_id', '=', $order_info['order_id']];
  48. $condition[] = ['pintuanorder_type', '=', 0];
  49. $condition[] = ['pintuanorder_state', '=', 1];
  50. $ppintuanorder_model->editPpintuanorder($condition, ['pintuanorder_state' => 0]);
  51. }
  52. if ($if_quque) {
  53. \mall\queue\QueueClient::push('cancelOrderUpdateStorage', $data);
  54. } else {
  55. \model('queue', 'logic')->cancelOrderUpdateStorage($data);
  56. }
  57. if ($if_update_account) {
  58. $predeposit_model = model('predeposit');
  59. //注意:当用户全额使用预存款进行支付,并不会冻结, 当用户使用部分预存款进行支付,支付的预存款则会冻结.也就是支付成功之后不会有冻结资金,当未支付成功,使用的预付款变为冻结资金。
  60. if ($order_info['order_state'] == ORDER_STATE_NEW || $order_info['order_state'] == ORDER_STATE_DEPOSIT || $order_info['order_state'] == ORDER_STATE_REST) {
  61. //解冻充值卡
  62. $rcb_amount = floatval($order_info['rcb_amount']);
  63. if ($order_info['order_state'] == ORDER_STATE_REST && $role != 'admin' && $role != 'seller') {//非管理员和卖家取消订单不退定金
  64. $rcb_amount -= $order_info['presell_deposit_amount'];
  65. $data_pd = [];
  66. $data_pd['member_id'] = $order_info['buyer_id'];
  67. $data_pd['member_name'] = $order_info['buyer_name'];
  68. $data_pd['amount'] = $rcb_amount > 0 ? $order_info['presell_deposit_amount'] : $order_info['rcb_amount'];
  69. $data_pd['order_sn'] = $order_info['order_sn'];
  70. if ($data_pd['amount'] > 0) {
  71. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  72. }
  73. }
  74. if ($rcb_amount > 0) {
  75. $data_pd = [];
  76. $data_pd['member_id'] = $order_info['buyer_id'];
  77. $data_pd['member_name'] = $order_info['buyer_name'];
  78. $data_pd['amount'] = $rcb_amount;
  79. $data_pd['order_sn'] = $order_info['order_sn'];
  80. $predeposit_model->changeRcb('order_cancel', $data_pd);
  81. }
  82. //当是已下单,未支付(可能包含部分款项使用预存款,预存款在冻结资金),则退还预存款,取消订单
  83. $pd_amount = floatval($order_info['pd_amount']);
  84. if ($order_info['order_state'] == ORDER_STATE_REST && $role != 'admin' && $role != 'seller' && $rcb_amount < 0) {//非管理员取消订单不退定金
  85. $pd_amount += $rcb_amount;
  86. $data_pd = [];
  87. $data_pd['member_id'] = $order_info['buyer_id'];
  88. $data_pd['member_name'] = $order_info['buyer_name'];
  89. $data_pd['amount'] = -$rcb_amount;
  90. $data_pd['order_sn'] = $order_info['order_sn'];
  91. $predeposit_model->changePd('order_comb_pay', $data_pd);
  92. }
  93. if ($pd_amount > 0) {
  94. $data_pd = [];
  95. $data_pd['member_id'] = $order_info['buyer_id'];
  96. $data_pd['member_name'] = $order_info['buyer_name'];
  97. $data_pd['amount'] = $pd_amount;
  98. $data_pd['order_sn'] = $order_info['order_sn'];
  99. $predeposit_model->changePd('order_cancel', $data_pd);
  100. }
  101. }
  102. if ($order_info['order_state'] == ORDER_STATE_PAY && $order_info['payment_code'] != 'offline') {//offline为货到付款的订单,取消时不需要返回预存款
  103. //拼团退团
  104. if (!empty($pintuan_list)) {
  105. foreach ($pintuan_list as $goods) {
  106. $ppintuangroup_info = Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->lock(true)->find();
  107. if ($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state'] == 1) {
  108. if ($ppintuangroup_info['pintuangroup_joined'] > 0) {
  109. Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->dec('pintuangroup_joined')->update();
  110. if ($ppintuangroup_info['pintuangroup_joined'] == 1) {
  111. //拼团统计开团数量
  112. $condition = [];
  113. $condition[] = ['pintuan_id', '=', $ppintuangroup_info['pintuan_id']];
  114. $condition[] = ['pintuan_count', '>', 0];
  115. Db::name('ppintuan')->where($condition)->dec('pintuan_count')->update();
  116. }
  117. }
  118. }
  119. }
  120. }
  121. $refundreturn_model = model('refundreturn');
  122. $refundreturn_model->refundAmount($order_info, $order_info['order_amount']);
  123. }
  124. }
  125. //更新订单信息
  126. $update_order = ['order_state' => ORDER_STATE_CANCEL, 'pd_amount' => 0];
  127. $update = $order_model->editOrder($update_order, ['order_id' => $order_id]);
  128. if (!$update) {
  129. throw new \think\Exception('保存失败', 10006);
  130. }
  131. //自提点订单取消
  132. $chain_order_model = model('chain_order');
  133. $chain_order_model->editChainOrderCancel($order_id, 0, 1);
  134. //添加订单日志
  135. $data = [];
  136. $data['order_id'] = $order_id;
  137. $data['log_role'] = $role;
  138. $data['log_msg'] = '取消了订单';
  139. $data['log_user'] = $user;
  140. if ($msg) {
  141. $data['log_msg'] .= ' ( ' . $msg . ' )';
  142. }
  143. $data['log_orderstate'] = ORDER_STATE_CANCEL;
  144. $order_model->addOrderlog($data);
  145. }
  146. }
  147. /**
  148. * 返还金额
  149. */
  150. public function orderCancelBack($order_info, $member_info)
  151. {
  152. //返还卡券
  153. if (!empty($order_info['deduction_amount']) && $order_info['card_id'] != 0) {
  154. //这两个都满足的情况下,走退款 删除支付记录里的订单关联数据
  155. //1.回滚卡片余额
  156. $cardWhere = [];
  157. $cardWhere[] = ['id', '=', $order_info['card_id']];
  158. $cardWhere[] = ['member_id', '=', $member_info['member_id']];
  159. $cardInfo = Db::name('sub_card')->where($cardWhere)->find();
  160. if (($cardInfo['balance'] + $order_info['deduction_amount']) == $cardInfo['worth']) {
  161. $cardStatus = 1;
  162. } else {
  163. $cardStatus = 2;
  164. }
  165. $cardUpdate = [
  166. 'card_status' => $cardStatus,
  167. 'balance' => $cardInfo['balance'] + $order_info['deduction_amount'],
  168. 'freeze' => $cardInfo['freeze'] - $order_info['deduction_amount'],
  169. 'update_time' => time(),
  170. 'used_count' => $cardInfo['used_count'] - 1,
  171. ];
  172. $cardRes = Db::name('sub_card')->where($cardWhere)->update($cardUpdate);
  173. if ($cardRes) {
  174. //如果卡的数据恢复成功了 删除卡的消费记录
  175. Db::name('sub_card_expense')->where([
  176. ['card_id', '=', $cardInfo['id']],
  177. ['order_id', '=', $order_info['order_id']],
  178. ])->update(['expense_status' => 2]);
  179. }
  180. }
  181. //返还积分
  182. if ($order_info['point_amount'] > 0) {
  183. $userModel = new User();
  184. $point_ratio = config('app.point_ratio');
  185. $userModel->changeScore( $order_info['point_amount'] * $point_ratio, '取消订单', '', $member_info['union_id']);
  186. }
  187. }
  188. /**
  189. * 收货
  190. * @param array $order_info
  191. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  192. * @param string $user 操作人
  193. * @param string $msg 操作备注
  194. * @return array
  195. */
  196. public function changeOrderStateReceive($order_info, $role, $user = '', $msg = '')
  197. {
  198. try {
  199. $member_id = $order_info['buyer_id'];
  200. $order_id = $order_info['order_id'];
  201. $order_model = model('order');
  202. //更新订单状态
  203. $update_order = [];
  204. if (!$order_info['delay_time']) {
  205. $update_order['delay_time'] = TIMESTAMP;
  206. }
  207. $update_order['finnshed_time'] = TIMESTAMP;
  208. $update_order['order_state'] = ORDER_STATE_SUCCESS;
  209. $update = $order_model->editOrder($update_order, ['order_id' => $order_id]);
  210. if (!$update) {
  211. throw new \think\Exception('保存失败', 10006);
  212. }
  213. //如果是门店订单,则修改订单状态
  214. $chain_order_model = model('chain_order');
  215. $chain_order_info = $chain_order_model->getChainOrderInfo(['order_id' => $order_id, 'chain_order_type' => 1]);
  216. if ($chain_order_info) {
  217. $chain_order_model->editChainOrderPickup([], ['order_id' => $order_id, 'chain_order_type' => 1]);
  218. }
  219. //添加订单日志
  220. $data = [];
  221. $data['order_id'] = $order_id;
  222. $data['log_role'] = 'buyer';
  223. $data['log_msg'] = '签收了货物';
  224. $data['log_user'] = $user;
  225. if ($msg) {
  226. $data['log_msg'] .= ' ( ' . $msg . ' )';
  227. }
  228. $data['log_orderstate'] = ORDER_STATE_SUCCESS;
  229. $order_model->addOrderlog($data);
  230. //添加会员积分
  231. if (config('ds_config.points_isuse') == 1) {
  232. model('points')->savePointslog('order', [
  233. 'pl_memberid' => $order_info['buyer_id'], 'pl_membername' => $order_info['buyer_name'],
  234. 'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
  235. 'order_id' => $order_info['order_id'],
  236. ], true);
  237. }
  238. //添加会员经验值
  239. model('exppoints')->saveExppointslog('order', [
  240. 'explog_memberid' => $order_info['buyer_id'], 'explog_membername' => $order_info['buyer_name'],
  241. 'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
  242. 'order_id' => $order_info['order_id'],
  243. ], true);
  244. //邀请人获得返利积分
  245. $inviter_id = ds_getvalue_byname('member', 'member_id', $member_id, 'inviter_id');
  246. if (!empty($inviter_id)) {
  247. $inviter_name = ds_getvalue_byname('member', 'member_id', $inviter_id, 'member_name');
  248. $rebate_amount = ceil(0.01 * $order_info['order_amount'] * config('ds_config.points_rebate'));
  249. model('points')->savePointslog('rebate', [
  250. 'pl_memberid' => $inviter_id, 'pl_membername' => $inviter_name, 'pl_points' => $rebate_amount,
  251. ], true);
  252. }
  253. return ds_callback(true, '操作成功');
  254. } catch (Exception $e) {
  255. return ds_callback(false, '操作失败');
  256. }
  257. }
  258. /**
  259. * 更改运费
  260. * @param array $order_info
  261. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  262. * @param string $user 操作人
  263. * @param float $price 运费
  264. * @return array
  265. */
  266. public function changeOrderShipPrice($order_info, $role, $user = '', $price)
  267. {
  268. try {
  269. $order_id = $order_info['order_id'];
  270. $order_model = model('order');
  271. $data = [];
  272. $data['shipping_fee'] = abs(floatval($price));
  273. $data['order_amount'] = Db::raw('goods_amount+' . $data['shipping_fee']);
  274. if (($order_info['rcb_amount'] + $order_info['pd_amount']) > ($data['shipping_fee'] + $order_info['goods_amount'])) {
  275. throw new \think\Exception('订单金额必须大于用户已支付金额', 10006);
  276. }
  277. $update = $order_model->editOrder($data, ['order_id' => $order_id]);
  278. if (!$update) {
  279. throw new \think\Exception('保存失败', 10006);
  280. }
  281. //记录订单日志
  282. $data = [];
  283. $data['order_id'] = $order_id;
  284. $data['log_role'] = $role;
  285. $data['log_user'] = $user;
  286. $data['log_msg'] = '修改了运费' . '( ' . $price . ' )';;
  287. $data['log_orderstate'] = $order_info['payment_code'] == 'offline' ? ORDER_STATE_PAY : ORDER_STATE_NEW;
  288. $order_model->addOrderlog($data);
  289. return ds_callback(true, '操作成功');
  290. } catch (Exception $e) {
  291. return ds_callback(false, $e->getMessage());
  292. }
  293. }
  294. /**
  295. * 更改商品费用
  296. * @param array $order_info
  297. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  298. * @param string $user 操作人
  299. * @param float $price 运费
  300. * @return array
  301. */
  302. public function changeOrderSpayPrice($order_info, $role, $user = '', $price)
  303. {
  304. $order_model = model('order');
  305. Db::startTrans();
  306. try {
  307. $order_id = $order_info['order_id'];
  308. $data = [];
  309. $data['goods_amount'] = abs(floatval($price));
  310. $data['order_amount'] = Db::raw('shipping_fee+' . $data['goods_amount']);
  311. if (($order_info['rcb_amount'] + $order_info['pd_amount']) > ($order_info['shipping_fee'] + $data['goods_amount'])) {
  312. throw new \think\Exception('订单金额必须大于用户已支付金额', 10006);
  313. }
  314. $update = $order_model->editOrder($data, ['order_id' => $order_id]);
  315. if (!$update) {
  316. throw new \think\Exception('保存失败', 10006);
  317. }
  318. //修改商品费用
  319. if ($data['goods_amount'] > 0) {
  320. $ordergoods_list = $order_model->getOrdergoodsList(['order_id' => $order_id]);
  321. $diff_amount = $data['goods_amount'] - $order_info['goods_amount'];
  322. $i = 0;
  323. foreach ($ordergoods_list as $ordergoods) {
  324. if ($i != (count($ordergoods_list) - 1)) {
  325. if ($order_info['goods_amount'] > 0) {
  326. $temp = $ordergoods['goods_pay_price'] / $order_info['goods_amount'] * $diff_amount;
  327. $price = round($ordergoods['goods_pay_price'] + $temp, 2);
  328. } else {
  329. $price = round(1 / count($ordergoods_list) * $diff_amount, 2);
  330. $temp = $price;
  331. }
  332. $diff_amount -= $temp;
  333. } else {
  334. $price = $ordergoods['goods_pay_price'] + $diff_amount;
  335. }
  336. $order_model->editOrdergoods(['goods_pay_price' => $price], ['rec_id' => $ordergoods['rec_id']]);
  337. $i++;
  338. }
  339. } else {
  340. $order_model->editOrdergoods(['goods_pay_price' => 0], ['order_id' => $order_id]);
  341. }
  342. //记录订单日志
  343. $data = [];
  344. $data['order_id'] = $order_id;
  345. $data['log_role'] = $role;
  346. $data['log_user'] = $user;
  347. $data['log_msg'] = '修改了商品费用' . '( ' . $price . ' )';;
  348. $data['log_orderstate'] = $order_info['payment_code'] == 'offline' ? ORDER_STATE_PAY : ORDER_STATE_NEW;
  349. $order_model->addOrderlog($data);
  350. } catch (\Exception $e) {
  351. Db::rollback();
  352. return ds_callback(false, $e->getMessage());
  353. }
  354. Db::commit();
  355. return ds_callback(true, '操作成功');
  356. }
  357. /**
  358. * 回收站操作(放入回收站、还原、永久删除)
  359. * @param array $order_info
  360. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  361. * @param string $state_type 操作类型
  362. * @return array
  363. */
  364. public function changeOrderStateRecycle($order_info, $role, $state_type)
  365. {
  366. $order_id = $order_info['order_id'];
  367. $order_model = model('order');
  368. //更新订单删除状态
  369. $state = str_replace(['delete', 'drop', 'restore'], [
  370. ORDER_DEL_STATE_DELETE, ORDER_DEL_STATE_DROP, ORDER_DEL_STATE_DEFAULT,
  371. ], $state_type);
  372. $update = $order_model->editOrder(['delete_state' => $state], ['order_id' => $order_id]);
  373. if (!$update) {
  374. return ds_callback(false, '操作失败');
  375. } else {
  376. return ds_callback(true, '操作成功');
  377. }
  378. }
  379. /**
  380. * 发货
  381. * @param array $order_info
  382. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  383. * @param string $user 操作人
  384. * @return array
  385. */
  386. public function changeOrderSend($order_info, $role, $user = '', $post = [])
  387. {
  388. $order_id = $order_info['order_id'];
  389. $order_model = model('order');
  390. //查看是否为拼团订单
  391. $condition = [];
  392. $condition[] = ['order_id', '=', $order_id];
  393. $condition[] = ['pintuanorder_type', '=', 0];
  394. $pintuanorder = model('ppintuanorder')->getOnePpintuanorder($condition);
  395. if (!empty($pintuanorder) && $pintuanorder['pintuanorder_state'] != 2) {
  396. return ds_callback(FALSE, '拼团订单暂时不允许发货');
  397. }
  398. if (!isset($post['daddress_id'])) {
  399. return ds_callback(FALSE, '请先设置发货地址');
  400. }
  401. try {
  402. Db::startTrans();
  403. $data = [];
  404. $data['reciver_name'] = $post['reciver_name'];
  405. $data['reciver_info'] = $post['reciver_info'];
  406. $data['deliver_explain'] = $post['deliver_explain'];
  407. $data['daddress_id'] = intval($post['daddress_id']);
  408. $data['shipping_express_id'] = intval($post['shipping_express_id']);
  409. $data['shipping_time'] = TIMESTAMP;
  410. $condition = [];
  411. $condition[] = ['order_id', '=', $order_id];
  412. $condition[] = ['store_id', '=', $order_info['store_id']];
  413. $update = $order_model->editOrdercommon($data, $condition);
  414. if (!$update) {
  415. throw new \think\Exception('操作失败', 10006);
  416. }
  417. $data = [];
  418. $data['shipping_code'] = isset($post['shipping_code']) ? $post['shipping_code'] : '';
  419. $data['order_state'] = ORDER_STATE_SEND;
  420. $data['delay_time'] = TIMESTAMP;
  421. $update = $order_model->editOrder($data, $condition);
  422. if (!$update) {
  423. throw new \think\Exception('操作失败', 10006);
  424. }
  425. Db::commit();
  426. } catch (Exception $e) {
  427. Db::rollback();
  428. return ds_callback(false, $e->getMessage());
  429. }
  430. //更新表发货信息
  431. if ($post['shipping_express_id'] && isset($post['shipping_code'])) {
  432. $data = [];
  433. $data['shipping_code'] = $post['shipping_code'];
  434. $data['order_sn'] = $order_info['order_sn'];
  435. $express_info = model('express')->getExpressInfo(intval($post['shipping_express_id']));
  436. $data['express_code'] = $express_info['express_code'];
  437. $data['express_name'] = $express_info['express_name'];
  438. //如果是门店订单,则修改订单状态
  439. $chain_order_model = model('chain_order');
  440. $chain_order_info = $chain_order_model->getChainOrderInfo(['order_id' => $order_id, 'chain_order_type' => 1]);
  441. if ($chain_order_info) {
  442. $chain_order_model->editChainOrder([
  443. 'express_code' => $data['express_code'],
  444. 'express_name' => $data['express_name'],
  445. 'shipping_code' => $data['shipping_code'],
  446. 'chain_order_state' => ORDER_STATE_SEND,
  447. ], ['order_id' => $order_id, 'chain_order_type' => 1]);
  448. }
  449. }
  450. //添加订单日志
  451. $data = [];
  452. $data['order_id'] = intval($order_id);
  453. $data['log_role'] = 'seller';
  454. $data['log_user'] = $user;
  455. $data['log_msg'] = '发出了货物 ( 编辑了发货信息 )';
  456. $data['log_orderstate'] = ORDER_STATE_SEND;
  457. $order_model->addOrderlog($data);
  458. // 发送买家消息
  459. $param = [];
  460. $param['code'] = 'order_deliver_success';
  461. $param['member_id'] = $order_info['buyer_id'];
  462. //阿里短信参数
  463. $param['ali_param'] = [
  464. 'order_sn' => $order_info['order_sn'],
  465. ];
  466. $param['ten_param'] = [
  467. $order_info['order_sn'],
  468. ];
  469. $param['param'] = array_merge($param['ali_param'], [
  470. 'order_url' => HOME_SITE_URL . '/Memberorder/show_order?order_id=' . $order_id,
  471. ]);
  472. //微信模板消息
  473. $param['weixin_param'] = [
  474. 'url' => config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_id,
  475. 'data' => [
  476. "keyword1" => [
  477. "value" => isset($post['shipping_code']) ? $post['shipping_code'] : '无',
  478. "color" => "#333",
  479. ],
  480. "keyword2" => [
  481. "value" => isset($express_info['express_name']) ? $express_info['express_name'] : '无',
  482. "color" => "#333",
  483. ],
  484. "keyword3" => [
  485. "value" => date('Y-m-d H:i'),
  486. "color" => "#333",
  487. ],
  488. "keyword4" => [
  489. "value" => isset($order_info['extend_order_common']['reciver_name']) ? $order_info['extend_order_common']['reciver_name'] : '无',
  490. "color" => "#333",
  491. ],
  492. "keyword5" => [
  493. "value" => isset($order_info['extend_order_common']['address']) ? $order_info['extend_order_common']['reciver_info']['address'] : '无',
  494. "color" => "#333",
  495. ],
  496. ],
  497. ];
  498. \mall\queue\QueueClient::push('sendMemberMsg', $param);
  499. return ds_callback(true, '操作成功');
  500. }
  501. /**
  502. * 收到货款
  503. * @param array $order_info
  504. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  505. * @param string $user 操作人
  506. * @return array
  507. */
  508. public function changeOrderReceivePay($order_list, $role, $user = '', $post = [])
  509. {
  510. $order_model = model('order');
  511. $predeposit_model = model('predeposit');
  512. foreach ($order_list as $order_info) {
  513. $order_id = $order_info['order_id'];
  514. if ($order_info['order_state'] != ORDER_STATE_NEW && $order_info['order_state'] != ORDER_STATE_REST)
  515. continue;
  516. //下单,支付被冻结的充值卡
  517. $rcb_amount = floatval($order_info['rcb_amount']);
  518. if ($rcb_amount > 0) {
  519. $data_pd = [];
  520. $data_pd['member_id'] = $order_info['buyer_id'];
  521. $data_pd['member_name'] = $order_info['buyer_name'];
  522. $data_pd['amount'] = $rcb_amount;
  523. $data_pd['order_sn'] = $order_info['order_sn'];
  524. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  525. }
  526. //下单,支付被冻结的预存款
  527. $pd_amount = floatval($order_info['pd_amount']);
  528. if ($pd_amount > 0) {
  529. $data_pd = [];
  530. $data_pd['member_id'] = $order_info['buyer_id'];
  531. $data_pd['member_name'] = $order_info['buyer_name'];
  532. $data_pd['amount'] = $pd_amount;
  533. $data_pd['order_sn'] = $order_info['order_sn'];
  534. $predeposit_model->changePd('order_comb_pay', $data_pd);
  535. }
  536. }
  537. if ($order_info['order_state'] == ORDER_STATE_NEW || $order_info['order_state'] == ORDER_STATE_REST) {
  538. $order_state = ORDER_STATE_PAY;
  539. $data = [];
  540. $data['api_paystate'] = 1;
  541. $update = $order_model->editOrderpay($data, ['pay_sn' => $order_list[0]['pay_sn']]);
  542. if (!$update) {
  543. throw new \think\Exception('更新支付单状态失败', 10006);
  544. }
  545. } else if ($order_info['order_state'] == ORDER_STATE_DEPOSIT) {
  546. $order_state = ORDER_STATE_REST;
  547. }
  548. //更新订单状态
  549. $update_order = [];
  550. $update_order['order_state'] = $order_state;
  551. $update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
  552. $update_order['payment_code'] = isset($post['payment_code']) ? $post['payment_code'] : '';
  553. $update_order['trade_no'] = isset($post['trade_no']) ? $post['trade_no'] : '';
  554. $update = $order_model->editOrder($update_order, [
  555. 'pay_sn' => $order_info['pay_sn'], 'order_state' => $order_info['order_state'],
  556. ]);
  557. if ($order_state == ORDER_STATE_PAY) {
  558. //更改自提点的订单状态
  559. $chain_order_model = model('chain_order');
  560. $chain_order_model->editChainOrderPay($order_info['order_id']);
  561. }
  562. if (!$update) {
  563. throw new \think\Exception('操作失败', 10006);
  564. }
  565. $ppintuangroup_model = model('ppintuangroup');
  566. foreach ($order_list as $order_info) {
  567. //防止重复发送消息
  568. if ($order_info['order_state'] != ORDER_STATE_NEW && $order_info['order_state'] != ORDER_STATE_DEPOSIT && $order_info['order_state'] != ORDER_STATE_REST)
  569. continue;
  570. $order_id = $order_info['order_id'];
  571. $order_goods = $order_model->getOrdergoodsList(['order_id' => $order_info['order_id']]);
  572. foreach ($order_goods as $goods) {
  573. //如果是拼团
  574. if ($goods['goods_type'] == 6) {
  575. $ppintuangroup_info = Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->lock(true)->find();
  576. if ($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state'] == 1) {
  577. if ($ppintuangroup_info['pintuangroup_joined'] == 0) {
  578. //拼团统计开团数量
  579. $condition = [];
  580. $condition[] = ['pintuan_id', '=', $ppintuangroup_info['pintuan_id']];
  581. Db::name('ppintuan')->where($condition)->inc('pintuan_count')->update();
  582. }
  583. //开团统计新增人数
  584. Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->inc('pintuangroup_joined')->update();
  585. if (($ppintuangroup_info['pintuangroup_joined'] + 1) >= $ppintuangroup_info['pintuangroup_limit_number']) {
  586. $condition = [];
  587. $condition[] = ['pintuangroup_is_virtual', '=', 0];
  588. $condition[] = ['pintuangroup_id', '=', $goods['promotions_id']];
  589. $condition2 = [];
  590. $condition2[] = ['pintuangroup_id', '=', $goods['promotions_id']];
  591. $ppintuangroup_model->successPpintuangroup($condition, $condition2);
  592. $condition = [];
  593. $condition[] = ['pintuan_id', '=', $ppintuangroup_info['pintuan_id']];
  594. Db::name('ppintuan')->where($condition)->inc('pintuan_ok_count')->update();
  595. }
  596. }
  597. }
  598. }
  599. // 支付成功发送买家消息
  600. $param = [];
  601. $param['code'] = 'order_payment_success';
  602. $param['member_id'] = $order_info['buyer_id'];
  603. //阿里短信参数
  604. $param['ali_param'] = [
  605. 'order_sn' => $order_info['order_sn'],
  606. ];
  607. $param['ten_param'] = [
  608. $order_info['order_sn'],
  609. ];
  610. $param['param'] = array_merge($param['ali_param'], [
  611. 'order_url' => HOME_SITE_URL . '/Memberorder/show_order?order_id=' . $order_info['order_id'],
  612. ]);
  613. //微信模板消息
  614. $param['weixin_param'] = [
  615. 'url' => config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_info['order_id'],
  616. 'data' => [
  617. "keyword1" => [
  618. "value" => $order_info['order_sn'],
  619. "color" => "#333",
  620. ],
  621. "keyword2" => [
  622. "value" => $order_goods[0]['goods_name'] . (count($order_goods) > 1 ? sprintf(lang('order_goods_more_than_one'), count($order_goods)) : ''),
  623. "color" => "#333",
  624. ],
  625. "keyword3" => [
  626. "value" => $order_info['order_amount'],
  627. "color" => "#333",
  628. ],
  629. "keyword4" => [
  630. "value" => date('Y-m-d H:i', $order_info['add_time']),
  631. "color" => "#333",
  632. ],
  633. ],
  634. ];
  635. \mall\queue\QueueClient::push('sendMemberMsg', $param);
  636. if ($order_info['order_state'] == ORDER_STATE_NEW || $order_info['order_state'] == ORDER_STATE_DEPOSIT) {
  637. // 支付成功发送店铺消息
  638. $param = [];
  639. $param['code'] = 'new_order';
  640. $param['store_id'] = $order_info['store_id'];
  641. $param['ali_param'] = [
  642. 'order_sn' => $order_info['order_sn'],
  643. ];
  644. $param['ten_param'] = [
  645. $order_info['order_sn'],
  646. ];
  647. $param['param'] = $param['ali_param'];
  648. $param['weixin_param'] = [
  649. 'url' => config('ds_config.h5_site_url') . '/seller/order_detail?order_id=' . $order_info['order_id'],
  650. 'data' => [
  651. "keyword1" => [
  652. "value" => $order_info['order_sn'],
  653. "color" => "#333",
  654. ],
  655. "keyword2" => [
  656. "value" => $order_goods[0]['goods_name'] . (count($order_goods) > 1 ? sprintf(lang('order_goods_more_than_one'), count($order_goods)) : ''),
  657. "color" => "#333",
  658. ],
  659. "keyword3" => [
  660. "value" => $order_info['order_amount'],
  661. "color" => "#333",
  662. ],
  663. "keyword4" => [
  664. "value" => date('Y-m-d H:i', $order_info['add_time']),
  665. "color" => "#333",
  666. ],
  667. ],
  668. ];
  669. \mall\queue\QueueClient::push('sendStoremsg', $param);
  670. }
  671. if ($order_info['order_state'] == ORDER_STATE_NEW || $order_info['order_state'] == ORDER_STATE_REST) {
  672. $order_state = ORDER_STATE_PAY;
  673. } else if ($order_info['order_state'] == ORDER_STATE_DEPOSIT) {
  674. $order_state = ORDER_STATE_REST;
  675. }
  676. //添加订单日志
  677. $data = [];
  678. $data['order_id'] = $order_id;
  679. $data['log_role'] = $role;
  680. $data['log_user'] = $user;
  681. $data['log_msg'] = '收到了货款 ' . (isset($post['trade_no']) ? ('( 支付平台交易号 : ' . $post['trade_no'] . ' )') : '');
  682. $data['log_orderstate'] = $order_state;
  683. $order_model->addOrderlog($data);
  684. }
  685. }
  686. }