CompanyTplService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. namespace App\Services\Company;
  3. use Aix\Pay\Data\PayOrder;
  4. use App\Exceptions\ResponseException;
  5. use App\Models\CompanyTpl;
  6. use App\Models\MembersHandsel;
  7. use App\Models\MembersPoint;
  8. use App\Models\Order;
  9. use App\Models\Tpl;
  10. use App\Repositories\CompanyRepository;
  11. use App\Repositories\CompanyTplRepository;
  12. use App\Repositories\MemberHandselRepository;
  13. use App\Repositories\MemberLogRepository;
  14. use App\Repositories\MemberSetmealRepository;
  15. use App\Repositories\TplRepository;
  16. use App\Services\Common\PaymentService;
  17. use App\Services\Common\PayService;
  18. use App\Services\Person\MemberPointService;
  19. use Illuminate\Support\Facades\DB;
  20. use SimpleSoftwareIO\QrCode\Facades\QrCode;
  21. class CompanyTplService
  22. {
  23. protected $companyTplRepository;
  24. protected $companyRepository;
  25. protected $memberPointService;
  26. protected $tplRepository;
  27. protected $memberHandselRepository;
  28. protected $paymentService;
  29. protected $payService;
  30. protected $memberSetmealRepository;
  31. protected $memberLogRepository;
  32. /**
  33. * CompanyTplService constructor.
  34. * @param CompanyTplRepository $companyTplRepository
  35. */
  36. public function __construct(
  37. CompanyTplRepository $companyTplRepository,
  38. CompanyRepository $companyRepository,
  39. MemberPointService $memberPointService,
  40. TplRepository $tplRepository,
  41. MemberHandselRepository $memberHandselRepository,
  42. PaymentService $paymentService,
  43. PayService $payService,
  44. MemberSetmealRepository $memberSetmealRepository,
  45. MemberLogRepository $memberLogRepository
  46. )
  47. {
  48. $this->companyTplRepository = $companyTplRepository;
  49. $this->companyRepository = $companyRepository;
  50. $this->memberPointService = $memberPointService;
  51. $this->tplRepository = $tplRepository;
  52. $this->memberHandselRepository = $memberHandselRepository;
  53. $this->paymentService = $paymentService;
  54. $this->payService = $payService;
  55. $this->memberSetmealRepository = $memberSetmealRepository;
  56. $this->memberLogRepository=$memberLogRepository;
  57. }
  58. public function templateList($user)
  59. {
  60. $tplFalse = collect([]);
  61. $tplTrue = $this->companyTplRepository->getTplByUid(['uid'=>$user->id]);
  62. if($tplTrue->isEmpty()){
  63. $tplFalse = $GLOBALS['template'];
  64. }else{
  65. foreach ($tplTrue as $key1=>$val1) {
  66. $tplTrue[$key1]->default_tpl = false;
  67. if($user->tpl == $val1->tpls->blade_name){
  68. $tplTrue[$key1]->default_tpl = true;
  69. }
  70. }
  71. $tplid = array_unique(array_column($tplTrue->toArray(),'tplid'));
  72. if(!$GLOBALS['template']->isEmpty()){
  73. foreach ($GLOBALS['template'] as $key=>$val){
  74. if(in_array($val->id,$tplid)){
  75. unset($GLOBALS['template'][$key]);
  76. }
  77. }
  78. $tplFalse = $GLOBALS['template'];
  79. }
  80. }
  81. return ['tplTrue'=>$tplTrue,'tplFalse'=>$tplFalse];
  82. }
  83. public function companyUpdate($user, $tpl)
  84. {
  85. if (empty($tpl)) {
  86. throw new ResponseException('模板文件丢失!');
  87. }
  88. $this->memberLogRepository->createLog($user,1031,request('name'));
  89. return $this->companyRepository->companySave(['tpl'=>$tpl], $user->id);
  90. }
  91. public function incrementTpl($user, $input, $route)
  92. {
  93. $project_id = intval($input['project_id']);
  94. if (empty($project_id)) {
  95. throw new ResponseException('模板文件丢失!');
  96. }
  97. $tpl = $this->tplRepository->find($project_id);
  98. if (!$tpl) {
  99. throw new ResponseException('模板文件丢失!');
  100. }
  101. $companyTpl = $this->companyTplRepository->getTpl(['uid'=>$user->id,'tplid'=>$project_id]);
  102. if ($companyTpl) {
  103. throw new ResponseException('该模板已购买过!');
  104. }
  105. if ($input['pay_type']=='points') {
  106. $memberPoint = $this->memberPointService->getPoints($user->id, 1);
  107. if (!$memberPoint) {
  108. throw new ResponseException('积分不足,请使用其他方式支付!');
  109. }
  110. $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
  111. if($mysetmeal){
  112. if($mysetmeal->discount_tpl){
  113. $tpl->price = intval(round($tpl->price*$mysetmeal->discount_tpl/10));
  114. }
  115. }
  116. if ($memberPoint->points < $tpl->price) {
  117. throw new ResponseException('积分不足,请使用其他方式支付!');
  118. }
  119. //操作事务开始
  120. DB::beginTransaction();
  121. try {
  122. $this->companyTplRepository->createTpl(['uid'=>$user->id,'tplid'=>$project_id]);
  123. $order = new Order();
  124. $order->uid = $user->id;
  125. $order->utype = $user->utype;
  126. $order->order_type = 10;
  127. $order->pay_type = 1;
  128. $order->is_pay = 2;
  129. $order->amount = $tpl->price/config('aix.companyset.points.points_set.payment_rate');
  130. $order->pay_points = $tpl->price;
  131. $order->payment = 'points';
  132. $order->payment_cn = '积分';
  133. $order->payment_time = time();
  134. $order->service_name = '企业模板';
  135. $order->discount = '企业模板';
  136. $order->description = '购买服务:企业模板('.$tpl->name.')';
  137. $order->setmeal = $project_id; //购买模板的套餐ID 就显示模板ID
  138. $order->charge = json_encode($input);
  139. $order->save();
  140. $PayService = new PayService();
  141. $order->oid = $PayService->getTradeNo($order->id);
  142. $order->save();
  143. $this->memberHandselRepository->addNew(
  144. ['uid'=>$user->id,
  145. 'utype'=>$user->utype,
  146. 'htype'=>'increment_tpl',
  147. 'htype_cn'=>'购买企业模板:'.$tpl->name,
  148. 'operate'=>2,
  149. 'points'=>$tpl->price
  150. ]
  151. );
  152. MembersPoint::where(
  153. ['uid'=>$user->id,'utype'=>$user->utype]
  154. )->decrement('points', $tpl->price);
  155. DB::commit();
  156. return ['code'=>'points','status'=>1,'info'=>$order->oid];
  157. } catch (\Exception $e) {
  158. DB::rollback();
  159. return ['code'=>'points','status'=>0,'info'=>$e->getMessage()];
  160. }
  161. } else {
  162. $paymenttpye = $this->paymentService->returnPayment($input['payment_name']);
  163. if (!$paymenttpye) {
  164. throw new ResponseException('支付方式错误!');
  165. }
  166. if (is_weixin()) {
  167. if ($input['payment_name'] == 'offline') {
  168. $type='pay';
  169. } else {
  170. $type = 'wap';
  171. }
  172. } else {
  173. if (strpos($route->uri, 'mobile')!== false) {
  174. if ($input['payment_name'] == 'offline') {
  175. $type='pay';
  176. } else {
  177. $type = 'wap';
  178. }
  179. } else {
  180. if ($input['payment_name']=='wechat') {
  181. $type = 'scan';
  182. } elseif ($input['payment_name'] == 'offline') {
  183. $type='pay';
  184. } else {
  185. $type = 'web';
  186. }
  187. }
  188. }
  189. $order = new Order();
  190. if ($input['is_deductible']) {
  191. $order->pay_type = 3;
  192. $order->amount = $input['amount'] + ($input['deductible']/config('aix.companyset.points.points_set.payment_rate'));
  193. $order->pay_points = $input['deductible'];
  194. $is_deductible = '使用积分抵现(抵扣积分:)'.$input['deductible'].'积分!支付金额:'.$input['amount'].'元';
  195. $order->description = '购买服务:企业模板('.$tpl->name.')'.$is_deductible;
  196. } else {
  197. $order->pay_type = 2;
  198. $order->amount = $input['amount'];
  199. $order->pay_points = 0;
  200. $is_deductible = '未使用积分抵现!支付金额:'.$input['amount'].'元';
  201. $order->description = '购买服务:企业模板('.$tpl->name.')'.$is_deductible;
  202. }
  203. $order->discount = '企业模板';
  204. $order->service_name = '企业模板';
  205. $order->order_type = 10;
  206. $order->pay_amount = $input['amount'];
  207. $order->payment = $input['payment_name'];
  208. if ($input['payment_name']=='alipay') {
  209. $order->payment_cn = '支付宝';
  210. } elseif ($input['payment_name']=='wechat') {
  211. $order->payment_cn = '微信';
  212. } else {
  213. $order->payment_cn = '线下转账';
  214. }
  215. $input['uid'] = $user->id;
  216. $input['utype'] = $user->utype;
  217. $order->charge = json_encode($input);
  218. $order->uid = $user->id;
  219. $order->utype = $user->utype;
  220. $order->save();
  221. $tradeNo = $this->payService->getTradeNo($order->id);
  222. $payOrder = new PayOrder();
  223. $payOrder->trade_no = $tradeNo;
  224. $payOrder->subject = '企业模板';
  225. $payOrder->detail = $order->description;
  226. $payOrder->price = $input['amount'];
  227. $payOrder->callback = "App\Services\Common\OrderService.incrementTplUpdate";
  228. if ($type == 'web') {
  229. $payOrder->return_url=route('service.template.index');
  230. }
  231. if ($type=='wap') {
  232. if ($input['payment_name']=='wechat') {
  233. $payOrder->return_url=route('mobile.common.orderWechat', ['oid'=>$payOrder->trade_no]);
  234. } else {
  235. $payOrder->return_url=route('mobile.firm.service.order.index');
  236. }
  237. }
  238. $result = $this->payService->pay($input['payment_name'], $type, $payOrder);
  239. $order->oid = $payOrder->trade_no;
  240. $order->save();
  241. if ($input['payment_name']=='wechat') {
  242. if ($type=='wap') {
  243. return [
  244. 'code'=>'wechat',
  245. 'tradeCode'=>$result,
  246. 'type'=>$type
  247. ];
  248. } else {
  249. return [
  250. 'code'=>'wechat',
  251. 'tradeCode'=>get_qrcode_html($result->code_url),
  252. 'tradeNo'=>[
  253. 'number'=>$payOrder->trade_no,
  254. ],
  255. 'type'=>$type
  256. ];
  257. }
  258. } elseif ($input['payment_name']=='alipay') {
  259. return [
  260. 'code'=>'alipay',
  261. 'tradeCode'=>$result,
  262. ];
  263. } else {
  264. return [
  265. 'code'=>'offline',
  266. 'tradeNo'=>$tradeNo
  267. ];
  268. }
  269. }
  270. }
  271. }