ExternalPlatformLogic.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace app\common\logic;
  3. use app\api\logic\PerformanceLogic;
  4. use app\common\model\external\ExternalPlatform;
  5. use app\common\model\master_commission\MasterWorkerCommissionConfig;
  6. use app\common\model\master_commission\MasterWorkerCommissionRatio;
  7. use app\common\model\performance\PerformanceRules;
  8. use app\common\model\recharge\OrderGoods;
  9. use app\common\model\recharge\RechargeOrder;
  10. use app\common\model\works\ServiceWork;
  11. use app\common\model\works\ServiceWorkSpare;
  12. use think\facade\Log;
  13. class ExternalPlatformLogic extends BaseLogic
  14. {
  15. /**
  16. * @notes 根据场景执行任务
  17. */
  18. public static function handleByScene($params)
  19. {
  20. try {
  21. switch ($params['send_code']){
  22. case 1001:
  23. case 1002:
  24. case 1003:
  25. case 1005:
  26. case 1006:
  27. self::generalServiceWork($params['send_code'],$params['params']);
  28. break;
  29. case 1009:
  30. self::separateAccounts($params['send_code'],$params['params']);
  31. break;
  32. default:
  33. throw new \Exception('场景不存在');
  34. }
  35. return true;
  36. } catch (\Exception $e) {
  37. Log::info('ExternalPlatform-error:'.$e->getMessage());
  38. self::setError($e->getMessage());
  39. return false;
  40. }
  41. }
  42. /**
  43. * 工单统一处理
  44. * @param $send_code
  45. * @param $params
  46. * @return bool
  47. * @author liugc <466014217@qq.com>
  48. * @date 2025/4/17 14:12
  49. */
  50. public static function generalServiceWork($send_code,$params)
  51. {
  52. try {
  53. $work = ServiceWork::where(['id'=>$params['work_id']])->findOrEmpty();
  54. if($work->isEmpty()){
  55. throw new \Exception('工单不存在');
  56. }
  57. if($work->external_platform_id > 0){
  58. $send_url = env('internal_api.api_url_host').'platf/performanceNotice';
  59. $data = [
  60. 'external_platform_id'=> $work->external_platform_id,
  61. 'send_code'=> $send_code,
  62. 'work_sn'=> $work->work_sn
  63. ];
  64. // 通过内部SDK服务 对外通知
  65. $res = http_request($send_url,http_build_query($data));
  66. Log::info('generalServiceWork:'
  67. .'url:'.$send_url
  68. .'|data:'.json_encode($data,JSON_UNESCAPED_UNICODE)
  69. .'|res:'.json_encode([$res],JSON_UNESCAPED_UNICODE)
  70. );
  71. }
  72. return true;
  73. } catch (\Exception $e) {
  74. Log::info('generalServiceWork-error:'.$e->getMessage());
  75. return false;
  76. }
  77. }
  78. /**
  79. * 工单分账
  80. * @param $send_code
  81. * @param $params
  82. * @return bool
  83. * @author liugc <466014217@qq.com>
  84. * @date 2025/4/17 14:12
  85. */
  86. public static function separateAccounts($send_code,$params)
  87. {
  88. try {
  89. $model = ServiceWork::where(['id'=>$params['work_id']])->findOrEmpty();
  90. if($model->isEmpty()){
  91. throw new \Exception('工单不存在');
  92. }
  93. if($model->external_platform_id > 0){
  94. $order_sns = \app\common\model\orders\RechargeOrder::where('work_id',$model->id)->column('sn');
  95. $goods_payment_type = OrderGoods::whereIn('sn',$order_sns)->value('goods_payment_type');
  96. if(in_array($goods_payment_type,['2','3'])) throw new \Exception('固定价无需分账处理');
  97. $laborRatio = 0;
  98. $ratio = 0;
  99. $commissionConfig = MasterWorkerCommissionConfig::where('master_worker_id',$model->master_worker_id)->where('voucher_status',2)->findOrEmpty();
  100. !$commissionConfig->isEmpty() && $ratio = MasterWorkerCommissionRatio::where('commission_config_id',$commissionConfig['id'])->where('goods_category_id',$model->goods_category_id)->value('ratio')?:0;
  101. if($commissionConfig->isEmpty() || empty($ratio)){
  102. $order_sns = \app\common\model\orders\RechargeOrder::where('work_id',$model->id)->column('sn');
  103. $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id');
  104. $rule = PerformanceRules::whereFindInSet('goods_id',$goods_id)->findOrEmpty();
  105. if(!$rule->isEmpty() && in_array($rule['type'],[0,1,2])){
  106. $laborRatio = $rule['rate'];
  107. }
  108. }else{
  109. $commissionConfig = $commissionConfig->toArray();
  110. $laborRatio = MasterWorkerCommissionRatio::where('commission_config_id',$commissionConfig['id'])->where('goods_category_id',$model->goods_category_id)->value('ratio');
  111. }
  112. $workSpares = ServiceWorkSpare::where([
  113. ['service_work_id','=',$model->id],
  114. ['spare_number','>',0],
  115. //['status','=',1],
  116. ])->select()->toArray();
  117. $finalCompanyPartCost = 0;
  118. $finalSelfPartCost = 0;
  119. foreach ($workSpares as $workSpare) {
  120. if($workSpare['spare_part_id'] > 0) {
  121. $finalCompanyPartCost += ($workSpare['original_price'] * $workSpare['spare_number']);
  122. }else{
  123. $finalSelfPartCost += $workSpare['offering_price'];
  124. }
  125. }
  126. $send_url = env('internal_api.api_url_host').'platf/performanceNotice';
  127. $data = [
  128. 'external_platform_id'=> $model->external_platform_id,
  129. 'send_code'=> $send_code,
  130. 'work_sn'=> $model->work_sn,
  131. "finalSelfPartCost" => $finalSelfPartCost,//尾款自配件成本
  132. "finalCompanyPartCost" => $finalCompanyPartCost,//尾款公司配件成本
  133. "totalPayment" => $model->work_total,//总支付金额
  134. "laborRatio" => $laborRatio,//人工比例
  135. ];
  136. // 通过内部SDK服务 对外通知
  137. $res = http_request($send_url,http_build_query($data));
  138. Log::info('separateAccounts:'
  139. .'url:'.$send_url
  140. .'|data:'.json_encode($data,JSON_UNESCAPED_UNICODE)
  141. .'|res:'.json_encode([$res],JSON_UNESCAPED_UNICODE)
  142. );
  143. }
  144. return true;
  145. } catch (\Exception $e) {
  146. Log::info('separateAccounts-error:'.$e->getMessage());
  147. return false;
  148. }
  149. }
  150. }