Complain.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 山西牛酷信息科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com.cn
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace app\model\order;
  13. use app\model\member\MemberAccount;
  14. use app\model\shop\Shop;
  15. use app\model\system\Pay;
  16. use think\facade\Cache;
  17. use app\model\BaseModel;
  18. use app\model\message\Message;
  19. /**
  20. * 订单平台维权
  21. *
  22. * @author Administrator
  23. *
  24. */
  25. class Complain extends OrderRefund
  26. {
  27. /*********************************************************************************订单退款状态*****************************************************/
  28. //已申请退款
  29. const COMPLAIN_APPLY = 1;
  30. // 已通过
  31. const COMPLAIN_CONFIRM = 2;
  32. // 卖家拒绝退款
  33. const COMPLAIN_REFUND = -1;
  34. //撤销维权后
  35. const COMPLAIN_CANCEL = 0;
  36. /**
  37. * 订单退款状态
  38. * @var unknown
  39. */
  40. public $complain_status = [
  41. self::REFUND_APPLY => [
  42. 'status' => self::REFUND_APPLY,
  43. 'name' => '申请维权',
  44. 'action' => [
  45. [
  46. 'event' => 'complainAgree',
  47. 'title' => '同意',
  48. 'color' => ''
  49. ],
  50. [
  51. 'event' => 'complainRefuse',
  52. 'title' => '拒绝',
  53. 'color' => ''
  54. ],
  55. ],
  56. 'member_action' => [
  57. [
  58. 'event' => 'complainCancel',
  59. 'title' => '撤销维权',
  60. 'color' => ''
  61. ],
  62. ]
  63. ],
  64. self::COMPLAIN_CONFIRM => [
  65. 'status' => self::REFUND_COMPLETE,
  66. 'name' => '维权结束',
  67. 'action' => [
  68. ],
  69. 'member_action' => [
  70. ]
  71. ],
  72. self::COMPLAIN_REFUND => [
  73. 'status' => self::COMPLAIN_REFUND,
  74. 'name' => '平台拒绝',
  75. 'action' => [
  76. ],
  77. 'member_action' => [
  78. [
  79. 'event' => 'complainCancel',
  80. 'title' => '撤销维权',
  81. 'color' => ''
  82. ],
  83. [
  84. 'event' => 'complainApply',
  85. 'title' => '修改申请',
  86. 'color' => ''
  87. ],
  88. ]
  89. ],
  90. self::COMPLAIN_CANCEL => [
  91. 'status' => self::COMPLAIN_CANCEL,
  92. 'name' => '已撤销',
  93. 'action' => [
  94. ],
  95. 'member_action' => [
  96. [
  97. 'event' => 'complainApply',
  98. 'title' => '申请维权',
  99. 'color' => ''
  100. ],
  101. ]
  102. ],
  103. ];
  104. /****************************************************************************订单退款相关操作(开始)**********************************/
  105. /**
  106. * 会员申请平台维权
  107. * @param array $data
  108. * @param array $member_info
  109. * @return multitype:string mixed
  110. */
  111. public function complainApply($data, $member_info)
  112. {
  113. $order_goods_info = model('order_goods')->getInfo(['order_goods_id' => $data['order_goods_id']]);
  114. if (empty($order_goods_info))
  115. return $this->error([], 'ORDER_GOODS_EMPTY');
  116. if ($order_goods_info['refund_status'] == 3)
  117. return $this->error();
  118. //查询是否存在正在进行的平台维权
  119. $complain_info_result = $this->getComplainInfo([["order_goods_id", "=", $data['order_goods_id']]], "*");
  120. $complain_info = $complain_info_result["data"];
  121. if(!empty($complain_info) && in_array($complain_info["complain_status"], [1,2]))
  122. return $this->error();
  123. //订单不能已关闭或已完成
  124. $order_info = model('order')->getInfo(['order_id' => $order_goods_info['order_id']]);
  125. if(in_array($order_info["order_status"], [-1, 10]))
  126. return $this->error();
  127. model('order_complain')->startTrans();
  128. try {
  129. $data = array(
  130. 'order_id' => $order_goods_info["order_id"],
  131. 'order_goods_id' => $data['order_goods_id'],
  132. 'site_id' => $order_goods_info['site_id'],
  133. 'site_name' => $order_goods_info['site_name'],
  134. 'order_no' => $order_goods_info["order_no"],
  135. 'member_id' => $order_goods_info['member_id'],
  136. 'member_name' => $member_info['nickname'],
  137. 'sku_id' => $order_goods_info['sku_id'],
  138. 'sku_name' => $order_goods_info['sku_name'],
  139. 'sku_image' => $order_goods_info['sku_image'],
  140. 'sku_no' => $order_goods_info['sku_no'],
  141. 'is_virtual' => $order_goods_info['is_virtual'],
  142. 'sku_id' => $order_goods_info['sku_id'],
  143. // 'goods_class' => $order_goods_info['goods_class'],
  144. // 'goods_class_name' => $order_goods_info['goods_class_name'],
  145. 'price' => $order_goods_info['price'],
  146. 'num' => $order_goods_info['num'],
  147. 'goods_money' => $order_goods_info['goods_money'],
  148. 'goods_id' => $order_goods_info['goods_id'],
  149. 'complain_reason' => $data["complain_reason"],
  150. 'complain_remark' => $data["complain_remark"],
  151. 'real_goods_money' => $order_goods_info['real_goods_money'],
  152. );
  153. $data['complain_status'] = self::COMPLAIN_APPLY;
  154. $data['complain_status_name'] = $this->complain_status[self::COMPLAIN_APPLY]["name"];
  155. $data['complain_status_action'] = json_encode($this->complain_status[self::COMPLAIN_APPLY], JSON_UNESCAPED_UNICODE);
  156. $data['complain_remark'] = $data["complain_remark"];
  157. $data["complain_apply_time"] = time();
  158. $pay_model = new Pay();
  159. $data['complain_no'] = $pay_model->createRefundNo();
  160. $complain_apply_money = $this->getOrderRefundMoney($data['order_goods_id']);//可退款金额 通过计算获得
  161. $data['complain_apply_money'] = $complain_apply_money;
  162. if(empty($complain_info)){
  163. $res = model('order_complain')->add($data);
  164. }else{
  165. $res = model('order_complain')->update($data, ['order_goods_id' => $data['order_goods_id']]);
  166. }
  167. //日志
  168. $this->addOrderRefundLog($data['order_goods_id'], $order_goods_info["refund_status"], '买家申请平台维权', 1, $member_info['member_id'], $member_info['nickname']);
  169. model('order_complain')->commit();
  170. return $this->success($res);
  171. } catch (\Exception $e) {
  172. model('order_complain')->rollback();
  173. return $this->error('', $e->getMessage().$e->getFile().$e->getLine());
  174. }
  175. }
  176. /**
  177. * 用户撤销平台申请
  178. * @param array $data
  179. * @param array $member_info
  180. * @return string[]|mixed[]
  181. */
  182. public function cancelComplain($data, $member_info)
  183. {
  184. $order_goods_info = model('order_goods')->getInfo(['order_goods_id' => $data['order_goods_id']], 'order_id,refund_status,delivery_status,is_virtual,site_id');
  185. if (empty($order_goods_info))
  186. return $this->error([], 'ORDER_GOODS_EMPTY');
  187. model('order_complain')->startTrans();
  188. try {
  189. $data['complain_status'] = self::COMPLAIN_CANCEL;
  190. $data['complain_status_name'] = $this->complain_status[self::COMPLAIN_CANCEL]["name"];
  191. $data['complain_status_action'] = json_encode($this->complain_status[self::COMPLAIN_CANCEL], JSON_UNESCAPED_UNICODE);
  192. $res = model('order_complain')->update($data, ['order_goods_id' => $data['order_goods_id']]);
  193. //添加维权日志
  194. $this->addOrderRefundLog($data['order_goods_id'], $order_goods_info["refund_status"], '买家撤销平台维权退款申请', 1, $member_info['member_id'], $member_info['nickname']);
  195. model('order_complain')->commit();
  196. return $this->success();
  197. } catch (\Exception $e) {
  198. model('order_complain')->rollback();
  199. return $this->error('', $e->getMessage());
  200. }
  201. }
  202. /**
  203. * 平台同意维权申请
  204. * @param array $data
  205. * @param array $user_info
  206. */
  207. public function complainAgree($data, $user_info)
  208. {
  209. $order_goods_info = model('order_goods')->getInfo(['order_goods_id' => $data['order_goods_id']], 'order_id,order_goods_id,refund_status');
  210. if (empty($order_goods_info)) {
  211. return $this->error([], 'ORDER_GOODS_EMPTY');
  212. }
  213. //已完成的订单项不可维权
  214. if ($order_goods_info['refund_status'] == 3){
  215. $result = $this->complainRefuse($data, $user_info);
  216. return $result;
  217. }
  218. $order_complain_info = model('order_complain')->getInfo(['order_goods_id' => $data['order_goods_id']], '*');
  219. if (empty($order_complain_info)) {
  220. return $this->error([]);
  221. }
  222. //已完成的订单项不可维权
  223. if ($order_complain_info['complain_status'] != 1){
  224. return $this->error([]);
  225. }
  226. model('order_complain')->startTrans();
  227. try {
  228. $data['complain_status'] = self::COMPLAIN_CONFIRM;
  229. $data['complain_status_name'] = $this->complain_status[self::COMPLAIN_CONFIRM]["name"];
  230. $data['complain_status_action'] = json_encode($this->complain_status[self::COMPLAIN_CONFIRM], JSON_UNESCAPED_UNICODE);
  231. $data['complain_real_money'] = $order_complain_info["complain_apply_money"];
  232. $data["complain_time"] = time();
  233. $res = model('order_complain')->update($data, ['order_goods_id' => $data['order_goods_id']]);
  234. $this->addOrderRefundLog($data['order_goods_id'], $order_goods_info['refund_status'], '平台同意维权申请', 3, $user_info['uid'], $user_info['username']);
  235. //触发主动退款
  236. $refund_result= $this->activeOrderGoodsRefund($order_complain_info['order_goods_id'], $order_complain_info["complain_apply_money"], '平台同意维权申请', $order_complain_info["complain_reason"]);
  237. if($refund_result["code"] < 0){
  238. model('order_complain')->rollback();
  239. return $refund_result;
  240. }
  241. model('order_complain')->commit();
  242. return $this->success($res);
  243. } catch (\Exception $e) {
  244. model('order_complain')->rollback();
  245. return $this->error('', $e->getMessage());
  246. }
  247. }
  248. /**
  249. * 平台拒绝维权申请
  250. * @param array $data
  251. * @param array $user_info
  252. */
  253. public function complainRefuse($data, $user_info, $refund_refuse_reason = '')
  254. {
  255. $order_goods_info = model('order_goods')->getInfo(['order_goods_id' => $data['order_goods_id']]);
  256. if (empty($order_goods_info)) {
  257. return $this->error();
  258. }
  259. model('order_complain')->startTrans();
  260. try {
  261. $data['complain_status'] = self::COMPLAIN_REFUND;
  262. $data['complain_status_name'] = $this->complain_status[self::COMPLAIN_REFUND]["name"];
  263. $data['complain_status_action'] = json_encode($this->complain_status[self::COMPLAIN_REFUND], JSON_UNESCAPED_UNICODE);
  264. $data['complain_refuse_reason'] = $refund_refuse_reason;
  265. $res = model('order_complain')->update($data, ['order_goods_id' => $data['order_goods_id']]);
  266. $this->addOrderRefundLog($data['order_goods_id'], $order_goods_info['refund_status'], '平台拒绝维权申请', 3, $user_info['uid'], $user_info['username']);
  267. model('order_complain')->commit();
  268. return $this->success();
  269. } catch (\Exception $e) {
  270. model('order_complain')->rollback();
  271. return $this->error('', $e->getMessage());
  272. }
  273. }
  274. /**
  275. * 获取平台维权订单列表
  276. * @param array $condition
  277. * @param number $page
  278. * @param string $page_size
  279. * @param string $order
  280. * @param string $field
  281. */
  282. public function getOrderComplainPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  283. {
  284. $list = model('order_complain')->pageList($condition, $field, $order, $page, $page_size);
  285. if(!empty($list["list"])){
  286. foreach($list["list"] as $k => $v){
  287. $complain_action = empty($v["complain_status_action"]) ? [] : json_decode($v["complain_status_action"], true);
  288. $complain_member_action = $complain_action["member_action"] ?? [];
  289. $list['list'][ $k ]['complain_action'] = $complain_member_action;
  290. }
  291. }
  292. return $this->success($list);
  293. }
  294. /**
  295. * 会员维权详情
  296. * @param $order_goods_id
  297. */
  298. public function getMemberComplainDetail($order_goods_id, $member_id){
  299. $condition = array(
  300. ["order_goods_id", "=", $order_goods_id]
  301. );
  302. $condition[] = ["member_id", "=", $member_id];
  303. $info = model("order_complain")->getInfo($condition);
  304. if(!empty($info)){
  305. $complain_action = empty($info["complain_status_action"]) ? [] : json_decode($info["complain_status_action"], true);
  306. $complain_member_action = $complain_action["member_action"] ?? [];
  307. $info['complain_action'] = $complain_member_action;
  308. //将售后日志引入
  309. $refund_log_list = model("order_refund_log")->getList([["order_goods_id", "=", $info["order_goods_id"]]], "*", "action_time desc");
  310. $info['refund_log_list'] = $refund_log_list;
  311. }
  312. return $this->success($info);
  313. }
  314. /**
  315. * 获取平台维权详情
  316. * @param $condition
  317. * @param string $field
  318. */
  319. public function getComplainInfo($condition, $field = "*"){
  320. $info = model("order_complain")->getInfo($condition, $field);
  321. return $this->success($info);
  322. }
  323. /**
  324. * 维权详情
  325. * @param $order_goods_id
  326. */
  327. public function getComplainDetail($order_goods_id){
  328. $condition = array(
  329. ["order_goods_id", "=", $order_goods_id]
  330. );
  331. $info = model("order_complain")->getInfo($condition);
  332. $complain_action = empty($info["complain_status_action"]) ? [] : json_decode($info["complain_status_action"], true);
  333. $complain_member_action = $complain_action["action"] ?? [];
  334. $info['complain_action'] = $complain_member_action;
  335. //将售后日志引入
  336. $refund_log_list = model("order_refund_log")->getList([["order_goods_id", "=", $info["order_goods_id"]]], "*", "action_time desc");
  337. $info['refund_log_list'] = $refund_log_list;
  338. return $this->success($info);
  339. }
  340. /**
  341. * 获取平台维权数量
  342. * @param $condition
  343. * @param string $field
  344. */
  345. public function getComplainCount($condition){
  346. $info = model("order_complain")->getCount($condition);
  347. return $this->success($info);
  348. }
  349. /****************************************************************************订单退款相关操作(结束)**********************************/
  350. }