RefundOrderService.php 9.3 KB

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