complain.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <?php
  2. /**
  3. * 投诉管理
  4. *
  5. *
  6. *
  7. ***/
  8. defined('InShopNC') or exit('Access Invalid!');
  9. class complainControl extends SystemControl {
  10. //定义投诉状态常量
  11. const STATE_NEW = 10;
  12. const STATE_APPEAL = 20;
  13. const STATE_TALK = 30;
  14. const STATE_HANDLE = 40;
  15. const STATE_FINISH = 99;
  16. const STATE_ACTIVE = 2;
  17. const STATE_UNACTIVE = 1;
  18. public function __construct() {
  19. parent::__construct();
  20. Language::read('complain');
  21. }
  22. /*
  23. * 默认操作列出新投诉
  24. */
  25. public function indexOp() {
  26. $this->complain_new_listOp();
  27. }
  28. /*
  29. * 未处理的投诉列表
  30. */
  31. public function complain_new_listOp() {
  32. $this->get_complain_list(self::STATE_NEW,'complain_new_list');
  33. }
  34. /*
  35. * 待申诉的投诉列表
  36. */
  37. public function complain_appeal_listOp() {
  38. $this->get_complain_list(self::STATE_APPEAL,'complain_appeal_list');
  39. }
  40. /*
  41. * 对话的投诉列表
  42. */
  43. public function complain_talk_listOp() {
  44. $this->get_complain_list(self::STATE_TALK,'complain_talk_list');
  45. }
  46. /*
  47. * 待仲裁的投诉列表
  48. */
  49. public function complain_handle_listOp() {
  50. $this->get_complain_list(self::STATE_HANDLE,'complain_handle_list');
  51. }
  52. /*
  53. * 已关闭的投诉列表
  54. */
  55. public function complain_finish_listOp() {
  56. $this->get_complain_list(self::STATE_FINISH,'complain_finish_list');
  57. }
  58. /*
  59. * 获取投诉列表
  60. */
  61. private function get_complain_list($complain_state,$op) {
  62. $page = new Page();
  63. $page->setEachNum(10) ;
  64. $page->setStyle('admin') ;
  65. $model_complain = Model('complain') ;
  66. //搜索条件
  67. $condition = array();
  68. $condition['complain_accuser'] = trim($_GET['input_complain_accuser']);
  69. $condition['complain_accused'] = trim($_GET['input_complain_accused']);
  70. $condition['complain_subject_content'] = trim($_GET['input_complain_subject_content']);
  71. $condition['complain_datetime_start'] = strtotime($_GET['input_complain_datetime_start']);
  72. $condition['complain_datetime_end'] = strtotime($_GET['input_complain_datetime_end']);
  73. if($op === 'complain_finish_list') {
  74. $condition['order'] = 'complain_id desc';
  75. } else {
  76. $condition['order'] = 'complain_id asc';
  77. }
  78. $condition['complain_state'] = $complain_state;
  79. $complain_list = $model_complain->getComplain($condition,$page) ;
  80. $this->show_menu($op);
  81. Tpl::output('op',$op);
  82. Tpl::output('list', $complain_list) ;
  83. Tpl::output('show_page',$page->show()) ;
  84. Tpl::showpage('complain.list') ;
  85. }
  86. /*
  87. * 进行中的投诉
  88. */
  89. public function complain_progressOp() {
  90. $complain_id = intval($_GET['complain_id']);
  91. //获取投诉详细信息
  92. $complain_info = $this->get_complain_info($complain_id);
  93. //获取订单详细信息
  94. $order_info = $this->get_order_info($complain_info['order_id']);
  95. //获取投诉的商品列表
  96. $complain_goods_list = $this->get_complain_goods_list($complain_info['order_goods_id']);
  97. Tpl::output('complain_goods_list',$complain_goods_list);
  98. if(intval($complain_info['complain_subject_id']) == 1) {//退款信息
  99. $model_refund = Model('refund_return');
  100. $model_refund->getRefundStateArray();//向模板页面输出退款退货状态
  101. $list = $model_refund->getComplainRefundList($order_info, $complain_info['order_goods_id']);
  102. Tpl::output('refund_list',$list['refund']);//已退或处理中商品
  103. Tpl::output('refund_goods',$list['goods']);//可退商品
  104. }
  105. $this->show_menu('complain_progress');
  106. Tpl::output('order_info',$order_info);
  107. Tpl::output('complain_info',$complain_info);
  108. Tpl::showpage('complain.info');
  109. }
  110. /*
  111. * 审核提交的投诉
  112. */
  113. public function complain_verifyOp() {
  114. $complain_id = intval($_POST['complain_id']);
  115. $complain_info = $this->get_complain_info($complain_id);
  116. if(intval($complain_info['complain_state']) === self::STATE_NEW) {
  117. $model_complain = Model('complain');
  118. $update_array = array();
  119. $update_array['complain_state'] = self::STATE_APPEAL;
  120. $update_array['complain_handle_datetime'] = time();
  121. $update_array['complain_handle_member_id'] = $this->get_admin_id();
  122. $update_array['complain_active'] = self::STATE_ACTIVE;
  123. $where_array = array();
  124. $where_array['complain_id'] = $complain_id;
  125. if($model_complain->updateComplain($update_array,$where_array)) {
  126. $this->log(L('complain_verify_success').'['.$complain_id.']',1);
  127. // 发送商家消息
  128. $param = array();
  129. $param['code'] = 'complain';
  130. $param['store_id'] = $complain_info['accused_id'];
  131. $param['param'] = array(
  132. 'complain_id' => $complain_id
  133. );
  134. QueueClient::push('sendStoreMsg', $param);
  135. showMessage(Language::get('complain_verify_success'),'index.php?act=complain&op=complain_new_list');
  136. } else {
  137. showMessage(Language::get('complain_verify_fail'),'index.php?act=complain&op=complain_new_list');
  138. }
  139. } else {
  140. showMessage(Language::get('param_error'),'');
  141. }
  142. }
  143. /*
  144. * 关闭投诉
  145. */
  146. public function complain_closeOp() {
  147. //获取输入的数据
  148. $complain_id = intval($_POST['complain_id']);
  149. $final_handle_message = trim($_POST['final_handle_message']);
  150. //验证输入的数据
  151. $obj_validate = new Validator();
  152. $obj_validate->validateparam = array(
  153. array("input"=>$final_handle_message, "require"=>"true","validator"=>"Length","min"=>"1","max"=>"255","message"=>Language::get('final_handle_message_error')),
  154. );
  155. $error = $obj_validate->validate();
  156. if ($error != '') {
  157. showMessage($error);
  158. }
  159. $complain_info = $this->get_complain_info($complain_id);
  160. $current_state = intval($complain_info['complain_state']);
  161. if($current_state !== self::STATE_FINISH) {
  162. $model_complain = Model('complain');
  163. $update_array = array();
  164. $update_array['complain_state'] = self::STATE_FINISH;
  165. $update_array['final_handle_message'] = $final_handle_message;
  166. $update_array['final_handle_datetime'] = time();
  167. $update_array['final_handle_member_id'] = $this->get_admin_id();
  168. $where_array = array();
  169. $where_array['complain_id'] = $complain_id;
  170. if($model_complain->updateComplain($update_array,$where_array)) {
  171. if(intval($complain_info['complain_subject_id']) == 1) {//退款信息
  172. $order = $this->get_order_info($complain_info['order_id']);
  173. $model_refund = Model('refund_return');
  174. $list = $model_refund->getComplainRefundList($order, $complain_info['order_goods_id']);
  175. $refund_goods = $list['goods'];//可退商品
  176. if (!empty($refund_goods) && is_array($refund_goods)) {
  177. $checked_goods = $_POST['checked_goods'];
  178. foreach ($refund_goods as $key => $value) {
  179. $goods_id = $value['rec_id'];//订单商品表编号
  180. if (!empty($checked_goods) && array_key_exists($goods_id,$checked_goods)) {//验证提交的商品属于订单
  181. $refund_array = array();
  182. $refund_array['refund_type'] = '1';//类型:1为退款,2为退货
  183. $refund_array['seller_state'] = '2';//卖家处理状态:1为待审核,2为同意,3为不同意
  184. $refund_array['refund_state'] = '2';//状态:1为处理中,2为待管理员处理,3为已完成
  185. $refund_array['order_lock'] = '1';//锁定类型:1为不用锁定,2为需要锁定
  186. $refund_array['refund_amount'] = ncPriceFormat($value['goods_refund']);
  187. $refund_array['reason_id'] = '0';
  188. $refund_array['reason_info'] = '投诉成功';
  189. $refund_array['buyer_message'] = '投诉成功,待管理员确认退款';
  190. $refund_array['seller_message'] = '投诉成功,待管理员确认退款';
  191. $refund_array['add_time'] = time();
  192. $refund_array['seller_time'] = time();
  193. $model_refund->addRefundReturn($refund_array,$order,$value);
  194. }
  195. }
  196. }
  197. }
  198. $this->log(L('complain_close_success').'['.$complain_id.']',1);
  199. showMessage(Language::get('complain_close_success'),$this->get_complain_state_link($current_state));
  200. } else {
  201. showMessage(Language::get('complain_close_fail'),$this->get_complain_state_link($current_state));
  202. }
  203. } else {
  204. showMessage(Language::get('param_error'),'');
  205. }
  206. }
  207. /*
  208. * 投诉主题列表
  209. */
  210. public function complain_subject_listOp() {
  211. /*
  212. * 实例化分页
  213. */
  214. $page = new Page();
  215. $page->setEachNum(10) ;
  216. $page->setStyle('admin') ;
  217. /*
  218. * 获得举报主题列表
  219. */
  220. $model_complain_subject = Model('complain_subject') ;
  221. //搜索条件
  222. $condition = array();
  223. $condition['order'] = 'complain_subject_id asc';
  224. $condition['complain_subject_state'] = 1;
  225. $complain_subject_list = $model_complain_subject->getComplainSubject($condition,$page) ;
  226. $this->show_menu('complain_subject_list');
  227. Tpl::output('list', $complain_subject_list) ;
  228. Tpl::output('show_page',$page->show()) ;
  229. Tpl::showpage('complain_subject.list') ;
  230. }
  231. /*
  232. * 添加投诉主题页面
  233. */
  234. public function complain_subject_addOp() {
  235. $this->show_menu('complain_subject_add');
  236. Tpl::showpage('complain_subject.add') ;
  237. }
  238. /*
  239. * 保存添加的投诉主题
  240. */
  241. public function complain_subject_saveOp() {
  242. //获取提交的内容
  243. $input['complain_subject_content'] = trim($_POST['complain_subject_content']);
  244. $input['complain_subject_desc'] = trim($_POST['complain_subject_desc']);
  245. //验证提交的内容
  246. $obj_validate = new Validator();
  247. $obj_validate->validateparam = array(
  248. array("input"=>$input['complain_subject_content'], "require"=>"true","validator"=>"Length","min"=>"1","max"=>"50","message"=>Language::get('complain_subject_content_error')),
  249. array("input"=>$input['complain_subject_desc'], "require"=>"true","validator"=>"Length","min"=>"1","max"=>"100","message"=>Language::get('complain_subject_desc_error')),
  250. );
  251. $error = $obj_validate->validate();
  252. if ($error != '') {
  253. showMessage($error);
  254. } else {
  255. //验证成功保存
  256. $input['complain_subject_state'] = 1;
  257. $model_complain_subject = Model('complain_subject');
  258. $model_complain_subject->saveComplainSubject($input);
  259. $this->log(L('complain_subject_add_success').'['.$_POST['complain_subject_content'].']',1);
  260. showMessage(Language::get('complain_subject_add_success'),'index.php?act=complain&op=complain_subject_list');
  261. }
  262. }
  263. /*
  264. * 删除投诉主题,伪删除只是修改标记
  265. */
  266. public function complain_subject_dropOp() {
  267. $complain_subject_id = trim($_POST['complain_subject_id']);
  268. if(empty($complain_subject_id)) {
  269. showMessage(Language::get('param_error'),'index.php?act=complain');
  270. }
  271. $model_complain_subject= Model('complain_subject');
  272. $update_array = array();
  273. $update_array['complain_subject_state'] = 2;
  274. $where_array = array();
  275. $where_array['in_complain_subject_id'] = "'".implode("','", explode(',', $complain_subject_id))."'";
  276. if($model_complain_subject->updateComplainSubject($update_array,$where_array)) {
  277. $this->log(L('complain_subject_delete_success').'[ID:'.$_POST['complain_subject_id'].']',1);
  278. showMessage(Language::get('complain_subject_delete_success'),'index.php?act=complain&op=complain_subject_list');
  279. } else {
  280. showMessage(Language::get('complain_subject_delete_fail'),'index.php?act=complain&op=complain_subject_list');
  281. }
  282. }
  283. /*
  284. * 根据投诉id获取投诉对话列表
  285. */
  286. public function get_complain_talkOp() {
  287. $complain_id = intval($_POST['complain_id']);
  288. $complain_info = $this->get_complain_info($complain_id);
  289. $complain_talk_list = $this->get_talk_list($complain_id);
  290. $talk_list = array();
  291. $i=0;
  292. foreach($complain_talk_list as $talk) {
  293. $talk_list[$i]['css'] = $talk['talk_member_type'];
  294. $talk_list[$i]['talk'] = date("Y-m-d",$talk['talk_datetime']);
  295. switch($talk['talk_member_type']) {
  296. case 'accuser':
  297. $talk_list[$i]['talk'] .= Language::get('complain_accuser');
  298. break;
  299. case 'accused':
  300. $talk_list[$i]['talk'] .= Language::get('complain_accused');
  301. break;
  302. case 'admin':
  303. $talk_list[$i]['talk'] .= Language::get('complain_admin');
  304. break;
  305. default:
  306. $talk_list[$i]['talk'] .= Language::get('complain_unknow');
  307. }
  308. if(intval($talk['talk_state']) === 2) {
  309. $talk['talk_content'] = Language::get('talk_forbit_message');
  310. $forbit_link = '';
  311. } else {
  312. $forbit_link = "&nbsp;&nbsp;<a href='#' onclick=forbit_talk(".$talk['talk_id'].")>".Language::get('complain_text_forbit')."</a>";
  313. }
  314. $talk_list[$i]['talk'].= '('.$talk['talk_member_name'].')'.Language::get('complain_text_say').':'.$talk['talk_content'].$forbit_link;
  315. $i++;
  316. }
  317. if (strtoupper(CHARSET) == 'GBK') {
  318. $talk_list = Language::getUTF8($talk_list);
  319. }
  320. echo json_encode($talk_list);
  321. }
  322. /*
  323. * 发布投诉对话
  324. */
  325. public function publish_complain_talkOp() {
  326. $complain_id = intval($_POST['complain_id']);
  327. $complain_talk = trim($_POST['complain_talk']);
  328. $talk_len = strlen($complain_talk);
  329. if($talk_len > 0 && $talk_len < 255) {
  330. $complain_info = $this->get_complain_info($complain_id);
  331. $model_complain_talk = Model('complain_talk');
  332. $param = array();
  333. $param['complain_id'] = $complain_id;
  334. $param['talk_member_id'] = $this->get_admin_id();
  335. $param['talk_member_name'] = $this->get_admin_name();
  336. $param['talk_member_type'] = 'admin';
  337. if (strtoupper(CHARSET) == 'GBK') {
  338. $complain_talk = Language::getGBK($complain_talk);
  339. }
  340. $param['talk_content'] = $complain_talk;
  341. $param['talk_state'] =1;
  342. $param['talk_admin'] = 0;
  343. $param['talk_datetime'] = time();
  344. if($model_complain_talk->saveComplainTalk($param)) {
  345. echo json_encode('success');
  346. } else {
  347. echo json_encode('error2');
  348. }
  349. } else {
  350. echo json_encode('error1');
  351. }
  352. }
  353. /*
  354. * 屏蔽对话
  355. */
  356. public function forbit_talkOp() {
  357. $talk_id = intval($_POST['talk_id']);
  358. if(!empty($talk_id)&&is_integer($talk_id)) {
  359. $model_complain_talk = Model('complain_talk');
  360. $update_array = array();
  361. $update_array['talk_state'] = 2;
  362. $update_array['talk_admin'] = $this->get_admin_id();
  363. $where_array = array();
  364. $where_array['talk_id'] = $talk_id;
  365. if($model_complain_talk->updateComplainTalk($update_array,$where_array)) {
  366. echo json_encode('success');
  367. } else {
  368. echo json_encode('error2');
  369. }
  370. } else {
  371. echo json_encode('error1');
  372. }
  373. }
  374. /**
  375. * 投诉设置
  376. **/
  377. public function complain_settingOp() {
  378. //读取设置内容 $list_setting
  379. $model_setting = Model('setting');
  380. $list_setting = $model_setting->getListSetting();
  381. Tpl::output('list_setting',$list_setting);
  382. $this->show_menu('complain_setting');
  383. Tpl::showpage('complain.setting') ;
  384. }
  385. /**
  386. * 投诉设置保存
  387. **/
  388. public function complain_setting_saveOp() {
  389. $model_setting = Model('setting');
  390. $complain_time_limit = intval($_POST['complain_time_limit']);
  391. if(empty($complain_time_limit)) {
  392. //如果输入不合法默认30天
  393. $complain_time_limit = 2592000;
  394. } else {
  395. $complain_time_limit = $complain_time_limit*86400;
  396. }
  397. $update_array['complain_time_limit'] = $complain_time_limit;
  398. if($model_setting->updateSetting($update_array)) {
  399. $this->log(L('complain_setting_save_success'),1);
  400. showMessage(Language::get('complain_setting_save_success'),'');
  401. } else {
  402. showMessage(Language::get('complain_setting_save_fail'),'');
  403. }
  404. }
  405. /*
  406. * 获取订单信息
  407. */
  408. private function get_order_info($order_id) {
  409. $model_order = Model('order');
  410. $order_info = $model_order->getOrderInfo(array('order_id' => $order_id),array('order_goods'));
  411. if(empty($order_info)) {
  412. showMessage(Language::get('param_error'));
  413. }
  414. $order_info['order_state_text'] = orderState($order_info);
  415. return $order_info;
  416. }
  417. /*
  418. * 获取投诉信息
  419. */
  420. private function get_complain_info($complain_id) {
  421. $model_complain = Model('complain');
  422. $complain_info = $model_complain->getoneComplain($complain_id);
  423. if(empty($complain_info)) {
  424. showMessage(Language::get('param_error'));
  425. }
  426. $complain_info['complain_state_text'] = $this->get_complain_state_text($complain_info['complain_state']);
  427. return $complain_info;
  428. }
  429. /*
  430. * 获取投诉商品列表
  431. */
  432. private function get_complain_goods_list($order_goods_id) {
  433. $model_order = Model('order');
  434. $param = array();
  435. $param['rec_id'] = $order_goods_id;
  436. $complain_goods_list = $model_order->getOrderGoodsList($param);
  437. return $complain_goods_list;
  438. }
  439. /*
  440. * 获取对话列表
  441. */
  442. private function get_talk_list($complain_id) {
  443. $model_complain_talk = Model('complain_talk');
  444. $param = array();
  445. $param['complain_id'] = $complain_id;
  446. $talk_list = $model_complain_talk->getComplainTalk($param);
  447. return $talk_list;
  448. }
  449. /*
  450. * 获得投诉状态文本
  451. */
  452. private function get_complain_state_text($complain_state) {
  453. switch(intval($complain_state)) {
  454. case self::STATE_NEW:
  455. return Language::get('complain_state_new');
  456. break;
  457. case self::STATE_APPEAL:
  458. return Language::get('complain_state_appeal');
  459. break;
  460. case self::STATE_TALK:
  461. return Language::get('complain_state_talk');
  462. break;
  463. case self::STATE_HANDLE:
  464. return Language::get('complain_state_handle');
  465. break;
  466. case self::STATE_FINISH:
  467. return Language::get('complain_state_finish');
  468. break;
  469. default:
  470. showMessage(Language::get('param_error'),'');
  471. }
  472. }
  473. /*
  474. * 获得投诉状态文本
  475. */
  476. private function get_complain_state_link($complain_state) {
  477. switch(intval($complain_state)) {
  478. case self::STATE_NEW:
  479. return 'index.php?act=complain&op=complain_new_list';
  480. break;
  481. case self::STATE_APPEAL:
  482. return 'index.php?act=complain&op=complain_appeal_list';
  483. break;
  484. case self::STATE_TALK:
  485. return 'index.php?act=complain&op=complain_talk_list';
  486. break;
  487. case self::STATE_HANDLE:
  488. return 'index.php?act=complain&op=complain_handle_list';
  489. break;
  490. case self::STATE_FINISH:
  491. return 'index.php?act=complain&op=complain_finish_list';
  492. break;
  493. default:
  494. showMessage(Language::get('param_error'));
  495. }
  496. }
  497. /*
  498. * 获得管理员id
  499. */
  500. private function get_admin_id() {
  501. $admin_info = $this->getAdminInfo();
  502. return $admin_info['id'];
  503. }
  504. /*
  505. * 获得管理员name
  506. */
  507. private function get_admin_name() {
  508. $admin_info = $this->getAdminInfo();
  509. return $admin_info['name'];
  510. }
  511. /**
  512. * 用户中心右边,小导航
  513. *
  514. * @param string $menu_type 导航类型
  515. * @param string $menu_key 当前导航的menu_key
  516. * @param array $array 附加菜单
  517. * @return
  518. */
  519. private function show_menu($menu_key) {
  520. $menu_array = array(
  521. 'complain_new_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_new_list'),'menu_url'=>'index.php?act=complain&op=complain_new_list'),
  522. 'complain_appeal_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_appeal_list'),'menu_url'=>'index.php?act=complain&op=complain_appeal_list'),
  523. 'complain_talk_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_talk_list'),'menu_url'=>'index.php?act=complain&op=complain_talk_list'),
  524. 'complain_handle_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_handle_list'),'menu_url'=>'index.php?act=complain&op=complain_handle_list'),
  525. 'complain_finish_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_finish_list'),'menu_url'=>'index.php?act=complain&op=complain_finish_list'),
  526. 'complain_subject_list'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_subject_list'),'menu_url'=>'index.php?act=complain&op=complain_subject_list'),
  527. 'complain_subject_add'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_subject_add'),'menu_url'=>'index.php?act=complain&op=complain_subject_add'),
  528. 'complain_setting'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_setting'),'menu_url'=>'index.php?act=complain&op=complain_setting'),
  529. 'complain_progress'=>array('menu_type'=>'link','menu_name'=>Language::get('complain_progress'),'menu_url'=>'###'),
  530. );
  531. if($menu_key !== 'complain_progress') {
  532. unset($menu_array['complain_progress']);
  533. }
  534. $menu_array[$menu_key]['menu_type'] = 'text';
  535. Tpl::output('menu',$menu_array);
  536. }
  537. }