RefundOrderService.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. namespace bizGhs\order\services;
  3. use biz\hb\classes\HbClass;
  4. use biz\shop\classes\ShopCapitalClass;
  5. use biz\shop\classes\ShopClass;
  6. use biz\stat\classes\StatItemClass;
  7. use biz\stat\classes\StatKhCgClass;
  8. use biz\stat\classes\StatOutClass;
  9. use biz\stat\classes\StatRefundClass;
  10. use bizGhs\base\services\BaseService;
  11. use bizGhs\custom\classes\CustomClass;
  12. use bizGhs\clear\classes\OrderCgClearClass;
  13. use bizGhs\order\classes\OrderClass;
  14. use bizGhs\order\classes\OrderItemClass;
  15. use bizGhs\order\classes\RefundOrderClass;
  16. use bizGhs\order\classes\RefundOrderItemClass;
  17. use bizGhs\shop\classes\MainClass;
  18. use bizGhs\shop\classes\ShopMoneyClass;
  19. use bizGhs\stock\classes\StockRecordClass;
  20. use bizHd\cg\classes\CgRefundClass;
  21. use bizHd\purchase\classes\PurchaseClass;
  22. use bizHd\purchase\classes\PurchaseClearClass;
  23. use common\components\dict;
  24. use common\components\noticeUtil;
  25. use common\components\orderSn;
  26. use common\components\util;
  27. use bizGhs\product\classes\ProductClass;
  28. use Yii;
  29. class RefundOrderService extends BaseService
  30. {
  31. public static $baseFile = '\bizGhs\order\classes\RefundOrderClass';
  32. //审核通过 ssh 20230811
  33. public static function passRefund($refund)
  34. {
  35. $relateOrderSn = $refund->relateOrderSn ?? '';
  36. $order = OrderClass::getByCondition(['orderSn' => $relateOrderSn], true);
  37. if (empty($order)) {
  38. util::fail('没有找到订单信息');
  39. }
  40. if ($order->status == OrderClass::ORDER_STATUS_UN_PAY) {
  41. util::fail("待付款订单,不能申请售后");
  42. }
  43. if ($order->status == OrderClass::ORDER_STATUS_UN_SEND) {
  44. util::fail("待配送订单,不能申请售后");
  45. }
  46. if ($order->status == OrderClass::ORDER_STATUS_SENDING) {
  47. util::fail("配送中订单,不能申请售后");
  48. }
  49. if ($order->status == OrderClass::ORDER_STATUS_CANCEL) {
  50. util::fail("已取消订单,不能申请售后");
  51. }
  52. if (isset($order->clearId) && !empty($order->clearId)) {
  53. util::fail('订单已结账,请驳回,并在线下完成售后');
  54. }
  55. $currentOrderId = $order->id;
  56. $addTime = $order->addTime ?? '';
  57. $current = time();
  58. if ($order->debt != 1 && (strtotime($addTime) + 3 * 30 * 24 * 60 * 60) < $current) {
  59. util::fail('历史订单,不能再发起退款');
  60. }
  61. if (strtotime($addTime) <= strtotime('2022-03-30 00:00:00')) {
  62. util::fail('历史订单,不能发起退款哦');
  63. }
  64. if (bccomp($refund->refundPrice, $order->realPrice, 2) == 1) {
  65. util::fail("退款金额超过订单金额");
  66. }
  67. $refund->passTime = date("Y-m-d H:i:s");
  68. $refund->save();
  69. $customId = $order->customId ?? 0;
  70. $clearList = PurchaseClearClass::getAllByCondition(['customId' => $customId, 'status' => 1], null, '*', null, true);
  71. if (!empty($clearList)) {
  72. $now = date("Y-m-d H:i:s");
  73. foreach ($clearList as $clear) {
  74. $deadline = $clear->deadline ?? '';
  75. if (!empty($deadline) && $deadline < $now) {
  76. $clear->status = 3;
  77. $clear->remark = "账单过期,已自动取消!!参数:{$deadline} {$now}";
  78. $clear->save();
  79. OrderCgClearClass::markExpireByClearId($clear->id);
  80. }
  81. }
  82. $currentClearId = OrderCgClearClass::getPendingClearIdByOrderId($currentOrderId, $customId);
  83. if ($currentClearId > 0) {
  84. //有结账单要取消才能售后
  85. util::success(['clearId' => $currentClearId, 'error' => 'hasUnClearOrder']);
  86. }
  87. }
  88. $relateOrderSn = $refund->relateOrderSn ?? '';
  89. if (empty($relateOrderSn)) {
  90. util::fail('没有订单信息');
  91. }
  92. $order = OrderClass::getByCondition(['orderSn' => $relateOrderSn], true);
  93. if (empty($order)) {
  94. util::fail('没有订单信息哦');
  95. }
  96. RefundOrderClass::passRefund($refund, $order);
  97. $cgRefundId = $refund->cgRefundId ?? 0;
  98. $cgRefund = CgRefundClass::getById($cgRefundId, true);
  99. if (empty($cgRefund)) {
  100. util::fail('信息缺失哦');
  101. }
  102. $cgId = $cgRefund->cgId ?? 0;
  103. $cg = PurchaseClass::getById($cgId, true);
  104. if (empty($cg)) {
  105. util::fail('采购信息缺失');
  106. }
  107. CgRefundClass::passRefund($cgRefund, $cg);
  108. }
  109. //新增退款
  110. public static function addRefund($post, $order)
  111. {
  112. $refundPrice = $post['price'] ?? 0;
  113. if ($refundPrice <= 0) {
  114. util::fail('请填写退款金额');
  115. }
  116. $cause = $post['cause'] ?? 0;
  117. $data = [];
  118. $data['status'] = RefundOrderClass::STATUS_UN_COMPLETE;
  119. $orderSn = orderSn::getGhsRefundSn();
  120. $data['orderSn'] = $orderSn;
  121. $data['relateOrderSn'] = $order->orderSn ?? '';
  122. $sjId = $post['sjId'] ?? 0;
  123. $refundType = $post['refundType'] ?? 0;
  124. $shopId = $post['shopId'] ?? 0;
  125. $mainId = $post['mainId'] ?? 0;
  126. $data['sjId'] = $sjId;
  127. $data['shopId'] = $shopId;
  128. $data['mainId'] = $mainId;
  129. $data['shopAdminId'] = $post['shopAdminId'] ?? 0;
  130. $data['shopAdminName'] = $post['shopAdminName'] ?? '';
  131. $data['cause'] = $cause;
  132. $refundSendCost = isset($post['refundSendCost']) && is_numeric($post['refundSendCost']) ? $post['refundSendCost'] : 0;
  133. $refundPackCost = isset($post['refundPackCost']) && is_numeric($post['refundPackCost']) ? $post['refundPackCost'] : 0;
  134. $data['refundSendCost'] = $refundSendCost;
  135. $data['refundPackCost'] = $refundPackCost;
  136. $order->refundSendCost = bcadd($refundSendCost, $order->refundSendCost, 2);
  137. $order->refundPackCost = bcadd($refundPackCost, $order->refundPackCost, 2);
  138. $order->refundLog = 1;
  139. $order->save();
  140. $postProduct = $post['product'] ?? '';
  141. if ($refundType == RefundOrderClass::REFUND_TYPE_MONEY_GOOD) {
  142. //花材列表结构
  143. // [{productId:0,num:1,unitType:0,unitPrice:12,unitName:'扎'}]
  144. if (empty($postProduct)) {
  145. util::fail('没有退款花材');
  146. }
  147. $saleOrderSn = $order->orderSn ?? '';
  148. $orderItemData = OrderItemClass::getAllByCondition(['orderSn' => $saleOrderSn], null, '*', 'productId', true);
  149. if (empty($orderItemData)) {
  150. util::fail('没有找到花材');
  151. }
  152. $originPrice = 0;
  153. foreach ($postProduct as $currentProduct) {
  154. $id = $currentProduct['productId'] ?? 0;
  155. if (isset($orderItemData[$id]) == false) {
  156. util::fail('没有找到退款的花材');
  157. }
  158. $currentInfo = $orderItemData[$id];
  159. $name = $currentInfo->name;
  160. $ptItemId = $currentInfo->itemId;
  161. $ratio = $currentInfo->ratio;
  162. $itemCost = $currentInfo->cost;
  163. $orderItemId = $currentInfo->id;
  164. $variety = $currentInfo->variety ?? 0;
  165. $num = $currentProduct['num'] ?? 0;
  166. $xhUnitName = $currentProduct['unitName'] ?? '';
  167. $xhUnitPrice = $currentProduct['unitPrice'] ?? '';
  168. $unitType = $currentProduct['unitType'] ?? 0;
  169. $xhPrice = bcmul($num, $xhUnitPrice, 2);
  170. $originPrice = bcadd($originPrice, $xhPrice, 2);
  171. $itemNum = $num;
  172. if ($unitType == dict::getDict('unitType', 'small')) {
  173. $itemNum = bcdiv($num, $ratio, 2);
  174. }
  175. $thisItemData = [
  176. 'sjId' => $sjId,
  177. 'shopId' => $shopId,
  178. 'orderSn' => $orderSn,
  179. 'productId' => $id,
  180. 'name' => $name,
  181. 'itemId' => $ptItemId,
  182. 'itemCost' => $itemCost,
  183. 'itemNum' => $itemNum,
  184. 'xhNum' => $num,
  185. 'xhUnitName' => $xhUnitName,
  186. 'xhUnitType' => $unitType,
  187. 'xhUnitPrice' => $xhUnitPrice,
  188. 'xhPrice' => $xhPrice,
  189. 'mainId' => $mainId,
  190. 'orderItemId' => $orderItemId,
  191. 'cause' => $cause,
  192. 'variety' => $variety,
  193. ];
  194. RefundOrderItemClass::addData($thisItemData, $order);
  195. }
  196. if ($refundPrice < $originPrice) {
  197. //util::fail('退款金额要等于或大于花材金额总合');
  198. }
  199. }
  200. $data['customId'] = $order->customId ?? 0;
  201. $data['imgList'] = $post['imgList'] ?? '';
  202. $data['remark'] = $post['remark'] ?? '';
  203. $data['refundPrice'] = $refundPrice;
  204. $data['refundType'] = $post['refundType'] ?? 0;
  205. $data['status'] = 0;
  206. $data['customName'] = $order->customName ?? '';
  207. $data['customNamePy'] = $order->customNamePy ?? '';
  208. $data['customMobile'] = $order->customMobile ?? '';
  209. $data['orderTime'] = $order->payTime ?? '';
  210. $refund = RefundOrderClass::add($data, true);
  211. return $refund;
  212. }
  213. }