IssueWorkLogic.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace app\api\logic;
  3. use app\common\enum\worker\WorkerAccountLogEnum;
  4. use app\common\logic\WorkerAccountLogLogic;
  5. use app\common\model\dict\DictData;
  6. use app\common\model\master_worker\MasterWorkerAccountLog;
  7. use app\common\model\master_worker\MasterWorkerFreezeAmountLog;
  8. use app\common\model\recharge\RechargeOrder;
  9. use app\common\model\user\User;
  10. use app\common\model\works\IssueWork;
  11. use app\common\logic\BaseLogic;
  12. use app\common\model\works\ReturnWork;
  13. use app\common\model\works\ServiceWork;
  14. use think\Exception;
  15. use think\facade\Db;
  16. /**
  17. * IssueWork逻辑
  18. * Class IssueWorkLogic
  19. * @package app\api\logic\works
  20. */
  21. class IssueWorkLogic extends BaseLogic
  22. {
  23. /**
  24. * @param $params
  25. * @return array
  26. * @throws \think\db\exception\DataNotFoundException
  27. * @throws \think\db\exception\DbException
  28. * @throws \think\db\exception\ModelNotFoundException
  29. */
  30. public static function lists($params)
  31. {
  32. return IssueWork::where('user_id',$params['user_id'])
  33. ->field(['id', 'sn','title', 'issue_approval','create_time','complaint_status','responsible'])
  34. ->append(['issue_approval_text'])
  35. ->order(['id' => 'desc'])
  36. ->select()
  37. ->toArray();
  38. }
  39. /**
  40. * 检查是否投诉
  41. * @param array $params
  42. * @return array|false|int|string
  43. */
  44. public static function checkComplaint($params)
  45. {
  46. try {
  47. $data['is_issue'] = 0;
  48. $data['is_return'] = 0;
  49. $issue = IssueWork::where(['user_id'=>$params['user_id'],'sn'=>$params['sn']])->findOrEmpty();
  50. if(!$issue->isEmpty()){
  51. $data['is_issue'] = 1;
  52. $data['issue_id'] = $issue['id'];
  53. $return = ReturnWork::where('service_work_id',$issue->service_work_id)->findOrEmpty();
  54. if(!$return->isEmpty()){
  55. $data['is_return'] = 1;
  56. $data['return_id'] = $return['id'];
  57. }
  58. }
  59. return $data;
  60. } catch (\Exception $e) {
  61. Db::rollback();
  62. self::setError($e->getMessage());
  63. return false;
  64. }
  65. }
  66. /**
  67. * 添加
  68. * @param array $params
  69. * @return false|int|string
  70. */
  71. public static function add(array $params)
  72. {
  73. Db::startTrans();
  74. try {
  75. $order = RechargeOrder::where(['sn'=>$params['sn'],'user_id'=>$params['user_id']])->findOrEmpty()->toArray();
  76. if(empty($order)){
  77. throw new Exception('订单错误');
  78. }
  79. $work = ServiceWork::findOrEmpty($order['work_id']);
  80. if($work['work_status']<7){
  81. throw new Exception('订单暂未结束,不允许投诉,请直接联系客服');
  82. }
  83. // 判断是否投诉时效过期
  84. // 设定固定的工单允许投诉
  85. $iss_work_ids = [160];
  86. if(strtotime($work['finished_time']) < (time()-86400*5) && !in_array($work['id'],$iss_work_ids)){
  87. throw new Exception('投诉时效已过');
  88. }
  89. $IssueWork = new IssueWork();
  90. $is_issue_work = $IssueWork->where(['user_id'=>$params['user_id'],'service_work_id'=>$work['id']])->findOrEmpty();
  91. if(!$is_issue_work->isEmpty()){
  92. throw new Exception('已提交投诉,不允许重复提交');
  93. }
  94. $id = $IssueWork->insertGetId([
  95. 'sn' => $params['sn'],
  96. 'work_sn' => $work['work_sn'],
  97. 'service_work_id' => $work['id'],
  98. 'title'=>$work['title'],
  99. 'master_worker_id' => $work['master_worker_id'],
  100. 'complaint_type' => !empty($params['complaint_type'])?json_encode($params['complaint_type']):'',
  101. 'complaint_details' => $params['complaint_details'],
  102. 'complaint_images' => !empty($params['complaint_images']) ? json_encode($params['complaint_images']):'',
  103. 'complaint_mobile'=>$params['complaint_mobile'],
  104. 'user_id'=>$params['user_id'],
  105. 'create_time' => time(),
  106. 'update_time' => time(),
  107. 'tenant_id' => $work['tenant_id']
  108. ]);
  109. Db::commit();
  110. $userInfo = User::where('id',$params['user_id'])->findOrEmpty();
  111. event('Notice', [
  112. 'scene_id' => 126,
  113. 'params' => [
  114. 'user_id' => 0,
  115. 'thing4' => $work['title'],
  116. 'thing5' => $userInfo['real_name']?:$userInfo['nickname'],
  117. 'phone_number2' => asteriskString($userInfo['mobile']),
  118. 'time6' => date('Y-m-d H:i:s'),
  119. ]
  120. ]);
  121. return $id;
  122. } catch (\Exception $e) {
  123. Db::rollback();
  124. self::setError($e->getMessage());
  125. return false;
  126. }
  127. }
  128. /**
  129. * @notes 获取详情
  130. * @param $params
  131. * @return array
  132. * @author likeadmin
  133. * @date 2024/07/10 15:06
  134. */
  135. public static function detail($params): array
  136. {
  137. $issue_work = IssueWork::where(['id'=>$params['id'],'user_id'=>$params['user_id']])
  138. ->field('sn,sn,title,issue_approval,complaint_type,complaint_details,complaint_images,complaint_mobile,approval_time,finished_time,create_time')
  139. ->append(['issue_approval_text'])
  140. ->findOrEmpty()->toArray();
  141. if(!empty($issue_work)){
  142. $issue_work['complaint_type'] = DictData::where(['type_value'=>'complaint_type','status'=>1])->whereIn('value',$issue_work['complaint_type'])->column('name');
  143. }
  144. return $issue_work;
  145. }
  146. /**
  147. * @notes 完结投诉
  148. * @param $params
  149. * @return array|false
  150. */
  151. public static function complaintComplete($params)
  152. {
  153. try {
  154. $issueWork = IssueWork::where(['user_id'=>$params['user_id'],'id'=>$params['id']])->findOrEmpty();
  155. if($issueWork->isEmpty()){
  156. throw new Exception('投诉不存在');
  157. }
  158. // 投诉完成-质保金可用金额 解冻
  159. if($issueWork->issue_approval != 4 && $issueWork->is_refunded_payment == 1){
  160. $serviceWork = ServiceWork::where('id',$issueWork->service_work_id)->findOrEmpty();
  161. if(!$serviceWork->isEmpty()){
  162. // 查询出该投诉的冻结金额 master_worker_freeze_amount_log issue_work_id master_worker_id
  163. $amount = MasterWorkerFreezeAmountLog::where([
  164. 'action'=>WorkerAccountLogEnum::INC,'source'=>1,
  165. 'issue_work_id'=>$issueWork->id,'master_worker_id'=>$issueWork->master_worker_id])->value('amount');
  166. // 是否存在返修工单?
  167. $work = ReturnWork::where('issue_work_id',$issueWork->id)->findOrEmpty();
  168. if(!$work->isEmpty()){
  169. $work->finished_time = time();
  170. $work->return_work_status = 4;
  171. $work->save();
  172. }
  173. // to_freeze source remark work_id amount worker_id issue_work_id
  174. // 对原工程师的 质保金解冻质保金 / 清零
  175. \app\common\logic\RetentionMoneyLogic::warrantyDepositRelease([
  176. 'to_freeze'=>2,
  177. 'source'=>1,
  178. 'remark'=>'对原工程师的质保金解冻质保金/清零',
  179. 'work_id'=>$issueWork->service_work_id??0,'worker_id'=>$issueWork->master_worker_id,
  180. 'issue_work_id'=>$issueWork->id,
  181. 'amount'=>$amount,
  182. ],false);
  183. }
  184. }
  185. $issueWork->issue_approval = 4;
  186. $issueWork->complaint_status = 2;
  187. $issueWork->responsible = 3;
  188. $issueWork->finished_time = time();
  189. $issueWork->save();
  190. return [];
  191. } catch (\Exception $e) {
  192. self::setError($e->getMessage());
  193. return false;
  194. }
  195. }
  196. }