Finance.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: qisse
  5. * Date: 2017/6/27
  6. * Time: 20:02
  7. */
  8. namespace app\core\service;
  9. use app\core\model\Cang;
  10. use app\core\model\CangRepay;
  11. use app\core\model\Subject;
  12. use app\core\model\SubjectStat;
  13. use app\core\model\UserAccount;
  14. use app\core\model\UserDrawcash;
  15. use app\core\model\UserHongbao;
  16. use app\core\model\UserRecharge;
  17. use app\core\model\User as UserModel;
  18. use think\Config;
  19. use think\Db;
  20. use think\Exception;
  21. use think\Log;
  22. use tool\Common;
  23. class Finance
  24. {
  25. private $platform;
  26. public function __construct()
  27. {
  28. vendor('fuyou.Gold');
  29. $this->platform = new \Gold();
  30. }
  31. //添加新用户
  32. public function userAdd(&$msg, \User $user) {
  33. vendor('payModel.User');
  34. return $this->platform->add($msg, $user);
  35. }
  36. //充值
  37. public function userRecharge(&$msg, \Recharge $recharge) {
  38. vendor('payModel.Recharge');
  39. return $this->platform->recharge($msg, $recharge);
  40. }
  41. //充值回调
  42. public function userRecharge_notify(&$msg, $outerNumber, $money, $mobile) {
  43. $userRecharge = UserRecharge::get([
  44. 'outerNumber'=>$outerNumber,
  45. 'status'=>UserRecharge::STATUS_UNPAY
  46. ]);
  47. if(!$userRecharge) {
  48. $msg = '该记录已失效';
  49. return false;
  50. }
  51. if($userRecharge->getData('money') != $money) {
  52. $msg = '金额不对';
  53. return false;
  54. }
  55. $user = UserModel::get($userRecharge['userID']);
  56. if(!$user) {
  57. $msg = '该充值用户已经丢失';
  58. return false;
  59. }
  60. $userAccount = new UserAccount();
  61. //到账时间有点问题
  62. $userAccount->MODE_recharge_addMoney($userRecharge, $user, THINK_START_TIME);
  63. $msg = '充值成功';
  64. return true;
  65. }
  66. //提现
  67. public function userDrawcash(&$msg, \Drawcash $drawcash) {
  68. vendor('payModel.Drawcash');
  69. return $this->platform->drawcash($msg, $drawcash);
  70. }
  71. //提现回调
  72. public function userDrawcash_notify(&$msg, $outerNumber, $money, $mobile) {
  73. $userDrawcash = UserDrawcash::get([
  74. 'outerNumber'=>$outerNumber,
  75. 'status'=>UserDrawcash::STATUS_SUBMIT
  76. ]);
  77. if(!$userDrawcash) {
  78. $msg = '不存在该提现记录';
  79. return false;
  80. }
  81. if($userDrawcash->getData('money') != $money) {
  82. $msg = '金额不对';
  83. return false;
  84. }
  85. $user = UserModel::get($userDrawcash['userID']);
  86. if(!$user) {
  87. $msg = '该提现用户已经丢失';
  88. return false;
  89. }
  90. $userAccount = new UserAccount();
  91. //到账时间有点问题
  92. $userAccount->MODE_drawcash_decMoney_submit($msg, $userDrawcash, $user, THINK_START_TIME);
  93. $msg = '操作成功';
  94. return true;
  95. }
  96. //注销用户
  97. public function userCancel(&$msg, $mobile, $pageUrl) {
  98. return $this->platform->userCancel($msg, $mobile, $pageUrl);
  99. }
  100. //下单
  101. public function order(&$msg, \Trade $trade) {
  102. vendor('payModel.Trade');
  103. return $this->platform->order($msg, $trade);
  104. }
  105. public function order_notify(&$msg, $outerNumber) {
  106. //第一步,得到cang
  107. $cang = Cang::get([
  108. 'outerNumber'=>$outerNumber,
  109. 'status'=>UserRecharge::STATUS_UNPAY
  110. ]);
  111. if($cang) {
  112. $msg = '不存在订单';
  113. return true;
  114. }
  115. //第二步,得到红包相关
  116. $hongbaoMoney = 0;//现金券
  117. $hongbaoYear = 0;//加息年化
  118. $hongbaoIDS = explode(',', $cang['hongbao']);
  119. foreach ($hongbaoIDS as $k => $hongbaoID) {
  120. $userHongbao = UserHongbao::with(['hongbao'])->where([
  121. 'userHongbaoID'=>$hongbaoID,
  122. 'status'=>UserHongbao::STATUS_UNUSED,
  123. 'userID'=>$cang['userID']
  124. ])->find();
  125. if(!$userHongbao) {
  126. continue;
  127. }
  128. if($userHongbao->hongbao['typeID'] == 1) {
  129. $hongbaoMoney += $userHongbao->hongbao['money'];
  130. }
  131. else if($userHongbao->hongbao['typeID'] == 2) {
  132. $hongbaoYear += $userHongbao->hongbao['year'];
  133. }
  134. }
  135. Db::startTrans();
  136. try{
  137. //第三步,更新支付状态
  138. $cang['payTime'] = THINK_START_TIME;
  139. $cang['status'] = Cang::STATUS_PAY;
  140. $cang->save();
  141. //第四步,计算总年化,更新支付状态
  142. $year = $cang-['year'] + $cang-['yearExt'] + $cang['yearSystem'];//总的年化
  143. $interest = 0;
  144. if($cang['interestTimeTypeID'] == 2 || $cang['interestTimeTypeID'] == 3) {
  145. $interest = round($cang->subject['moneySubject'] * $year / 100 / 365 * $cang->subject['investDay'], 2);//预付利息
  146. }
  147. //第五步,更新回款清单
  148. //更新本金回款清单
  149. $cangRepaySave = [
  150. 'money'=>$cang['ben'],
  151. 'repayTime'=>Common::datetotime($cang->subject['repayTime']),
  152. 'reachTime'=>Common::datetotime($cang->subject['reachTime']),
  153. 'userID' => $cang['userID'],
  154. 'subjectID' => $cang['subjectID'],
  155. 'cangID'=>$cang['cangID'],
  156. 'status'=>CangRepay::STATUS_UNREPAY,
  157. 'repayTypeID'=>1
  158. ];
  159. CangRepay::create($cangRepaySave);
  160. //更新利息回款清单
  161. $cangRepaySave['repayTypeID'] = 2;
  162. $cangRepaySave['money'] = $interest;
  163. CangRepay::create($cangRepaySave);
  164. //第六步,更新账户金额及流水
  165. $user = User::get($cang['userID']);
  166. $user->userAccount = $user->userAccount->MODE_cang_decMoney($cang, $user);
  167. //第十一步,更新标的统计
  168. SubjectStat::where([
  169. 'subjectID'=>$cang['subjectID']
  170. ])->setInc('moneyTotalInvest', $cang['moneySubject'] * 100);
  171. SubjectStat::where([
  172. 'subjectID'=>$this->app['subjectID']
  173. ])->setInc('timesInvest');
  174. }
  175. catch (Exception $e) {
  176. // 回滚事务
  177. Log::error($e->getMessage().'|'.$e->getLine().'|'.$e->getFile());
  178. Db::rollback();
  179. throw new AppException(-9, $e->getMessage());
  180. }
  181. //第十二步,判断是否满标
  182. if($cang->subject->subjectStat['moneyTotalInvest'] == $cang->subject['price']) {
  183. //如果满标了,设置满标
  184. Subject::setSubjectFull($cang->subject);
  185. }
  186. $msg = '操作成功';
  187. return true;
  188. }
  189. //放款
  190. public function fang(&$msg, \Trade $trade) {
  191. vendor('payModel.Trade');
  192. return $this->platform->order($msg, $trade);
  193. }
  194. public function fang_notify(&$msg, $outerNumber) {}
  195. //还款
  196. public function userRepay(&$msg, \Trade $trade) {
  197. vendor('payModel.Trade');
  198. return $this->platform->repay($msg, $trade);
  199. }
  200. //查询用户
  201. public function queryUser(&$msg, $userList) {
  202. return $this->platform->queryUser($msg, $userList);
  203. }
  204. //查询余额
  205. public function balance(&$msg, $mobile) {
  206. return $this->platform->balance($msg, $mobile);
  207. }
  208. }