Cang.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: qisse
  5. * Date: 2017/6/27
  6. * Time: 20:02
  7. */
  8. namespace app\master\logic;
  9. use app\core\exception\AppException;
  10. use app\core\model\Cang as Model;
  11. use app\core\model\CangRepay;
  12. use app\core\model\User;
  13. use app\core\model\Subject;
  14. use app\core\model\UserAccount;
  15. use app\core\service\Finance as FinanceService;
  16. use app\core\model\Sms;
  17. use think\Db;
  18. use think\Exception;
  19. use think\Log;
  20. use tool\Common;
  21. class Cang extends Base
  22. {
  23. /**
  24. * @api {post} cang/getCangList 得到我的投资列表
  25. * @apiVersion 1.0.0
  26. * @apiName getCangList
  27. * @apiDescription 得到我的投资列表
  28. * @apiGroup Cang
  29. *
  30. * @apiParam {Number=[0,1,2,3,4,5]} [status] 0-全部,1-持有中,2-未支付,3-利息中,4-待回款,5-已回款
  31. * @apiParam {Number} [subjectID] 标的ID
  32. * @apiParam {Number=[0,1,2,3]} [timeType] 时间类型,0-全部,1-今日,2-一周内,3-一月内
  33. * @apiParamExample {json} 发送报文:
  34. {
  35. "status": 1,
  36. "subjectID": 0,
  37. "timeType":1
  38. }
  39. *
  40. * @apiSuccess {Object[]} cangList 我的投资列表
  41. * @apiSuccess {Number} cangList.cangID ID
  42. * @apiSuccess {Number} cangList.moneySubject 投资份额(非本金,非实际支付金额)
  43. * @apiSuccess {Number} cangList.status 状态,1-已持有,4-已计息,5-已回款
  44. * @apiSuccess {String} cangList.statusText 状态描述,参考状态
  45. * @apiSuccess {String} cangList.payTime 交易时间
  46. * @apiSuccess {String} cangList.interestBeginTime 起息日期
  47. * @apiSuccess {String} cangList.year 年化
  48. * @apiSuccess {String} cangList.ben 实际投入本金
  49. * @apiSuccess {String} cangList.interest 利息
  50. * @apiSuccess {Number} cangList.investDay 投资天数
  51. * @apiSuccess {Object} cangList.subject 相关标的
  52. * @apiSuccess {String} cangList.subject.title 标的标题
  53. * @apiSuccess {Number} cangList.subject.subjectTypeID 标的类型
  54. * @apiSuccess {Number} cangList.subject.interestTypeID 计息类型
  55. * @apiSuccess {Number} cangList.subject.interestTimeTypeID 计息时间类型
  56. * @apiSuccess {String} cangList.subject.reachTime 标的标题
  57. * @apiSuccess {String} cangList.subject.title 标的标题
  58. * @apiSuccess {Object[]} cangList.cangRepay 预回款清单
  59. * @apiSuccess {String} cangList.cangRepay.money 回款金额
  60. * @apiSuccess {String} cangList.cangRepay.repayTime 回款类型
  61. * @apiSuccess {String} cangList.cangRepay.resultTime 实际到款时间
  62. * @apiSuccess {String} cangList.cangRepay.reachTime 到款时间
  63. * @apiSuccess {Number} cangList.cangRepay.status 清单状态,1-未回款,2-已回款,3-已到账(该状态可隐藏)
  64. * @apiSuccess {Number} cangList.cangRepay.repayTypeID 清单类型,1-本金,2-利息
  65. * @apiSuccess {Number} count 查询到条目总数
  66. * @apiSuccess {Number} pageItemCount 每页条数
  67. * @apiSuccessExample {json} 返回json数据(举例):
  68. {
  69. "code": 1,
  70. "msg": "操作成功",
  71. "content": {
  72. "cangList": [
  73. {
  74. "cangID": 33,
  75. "moneySubject": "2000.00",
  76. "status": 4,
  77. "payTime": "2017-12-12 20:53:50",
  78. "interestBeginTime": "2017-12-12",
  79. "year": "12.80",
  80. "ben": "2000.00",
  81. "interest": "7.01",
  82. "investDay": 10,
  83. "subject": {
  84. "subjectTypeID": 2,
  85. "interestTypeID": 1,
  86. "interestTimeTypeID": 1,
  87. "title": "普通标11111"
  88. },
  89. "cangRepay": [
  90. {
  91. "money": "2000.00",
  92. "repayTime": "2017-12-22",
  93. "reachTime": "2017-12-23",
  94. "resultTime": "2017-12-12",
  95. "status": 1,
  96. "repayTypeID": 1
  97. },
  98. {
  99. "money": "7.01",
  100. "repayTime": "2017-12-22",
  101. "reachTime": "2017-12-23",
  102. "resultTime": "2017-12-12",
  103. "status": 1,
  104. "repayTypeID": 2
  105. }
  106. ],
  107. "statusText": "计息中"
  108. },
  109. {
  110. "cangID": 30,
  111. "moneySubject": "98000.00",
  112. "status": 4,
  113. "payTime": "2017-12-12 18:28:27",
  114. "interestBeginTime": "2017-12-12",
  115. "year": "12.80",
  116. "ben": "98000.00",
  117. "interest": "343.67",
  118. "investDay": 10,
  119. "subject": {
  120. "subjectTypeID": 2,
  121. "interestTypeID": 1,
  122. "interestTimeTypeID": 1,
  123. "title": "普通标11111"
  124. },
  125. "cangRepay": [
  126. {
  127. "money": "98000.00",
  128. "repayTime": "2017-12-22",
  129. "reachTime": "2017-12-23",
  130. "resultTime": "2017-12-12",
  131. "status": 1,
  132. "repayTypeID": 1
  133. },
  134. {
  135. "money": "343.67",
  136. "repayTime": "2017-12-22",
  137. "reachTime": "2017-12-23",
  138. "resultTime": "2017-12-12",
  139. "status": 1,
  140. "repayTypeID": 2
  141. }
  142. ],
  143. "statusText": "计息中"
  144. }
  145. ]
  146. },
  147. "sign": "4297f44b13955235245b2497399d7a93"
  148. }
  149. * @apiUse CreateUserError
  150. */
  151. public function getCangList() {
  152. $app = $this->app;
  153. $query = Model::with(['subject','cangRepay','user'=>function($query) use($app) {
  154. if(isset($app['keyword']) && $app['keyword']) {
  155. $query->where('mobile','like' ,'%'.$app['keyword'].'%');
  156. }
  157. }]);
  158. if(isset($this->app['subjectID']) && $this->app['subjectID']) {
  159. $query = $query->where('subjectID', $this->app['subjectID']);
  160. }
  161. if(isset($this->app['timeType']) && $this->app['timeType']) {
  162. if($this->app['timeType'] == 1) {
  163. $query = $query->whereTime('addTime', 'd');
  164. }
  165. else if($this->app['timeType'] == 2){
  166. $query = $query->whereTime('addTime', 'w');
  167. }
  168. else if($this->app['timeType'] == 3){
  169. $query = $query->whereTime('addTime', 'm');
  170. }
  171. }
  172. if(isset($this->app['status']) && $this->app['status']) {
  173. $query = $query->where('status', $this->app['status']);
  174. }
  175. if(isset($this->app['isForged'])) {
  176. $query = $query->where('isForged', $this->app['isForged']);
  177. }
  178. if(!isset($this->app['pageItemCount']) || !$this->app['pageItemCount']) {
  179. $this->app['pageItemCount'] = 10;
  180. }
  181. //$count = $query->count();
  182. $query1 = $query;
  183. $query2 = $query;
  184. $list = $query1->order('addTime desc')->limit(($this->app['pageIndex'] - 1) * $this->app['pageItemCount'], $this->app['pageItemCount'])->select();
  185. $count = $query2->count();
  186. if($list->isEmpty()) {
  187. return Common::rm(-2, '数据为空');
  188. }
  189. $list->append(['isForgedText','statusText','user'=>['mobileAsterisk']])->visible(['cangID','isForged','addTime','moneySubject','payTime','status','investDay','interestBeginTime','year','interest','ben','money','subject'=>[
  190. 'title','interestTimeTypeID','interestTypeID','subjectTypeID'
  191. ],'cangRepay'=>[
  192. 'money','repayTime','reachTime','resultTime','status','repayTypeID'
  193. ], 'user'=>[
  194. 'trueName','mobile'
  195. ]]);
  196. return Common::rm(1, '操作成功', [
  197. 'cangList'=>$list,
  198. 'count'=>$count,
  199. 'pageItemCount'=>$this->app['pageItemCount']
  200. ]);
  201. }
  202. public function exportCangList()
  203. {
  204. $query = Model::with(['subject', 'cangRepay', 'user']);
  205. if (isset($this->app['subjectID']) && $this->app['subjectID']) {
  206. $query = $query->where('subjectID', $this->app['subjectID']);
  207. }
  208. if (isset($this->app['timeType']) && $this->app['timeType']) {
  209. if ($this->app['timeType'] == 1) {
  210. $query = $query->whereTime('addTime', 'd');
  211. } else if ($this->app['timeType'] == 2) {
  212. $query = $query->whereTime('addTime', 'w');
  213. } else if ($this->app['timeType'] == 3) {
  214. $query = $query->whereTime('addTime', 'm');
  215. }
  216. }
  217. if (isset($this->app['status']) && $this->app['status']) {
  218. $query = $query->where('status', $this->app['status']);
  219. }
  220. if (isset($this->app['keyword']) && $this->app['keyword']) {
  221. $query = $query->where('status', 'like', '%' . $this->app['keyword'] . '%')->where('status', 'like', '%' . $this->app['keyword'] . '%');
  222. }
  223. if (isset($this->app['isForged'])) {
  224. $query = $query->where('isForged', $this->app['isForged']);
  225. }
  226. if (!isset($this->app['pageItemCount']) || !$this->app['pageItemCount']) {
  227. $this->app['pageItemCount'] = 10;
  228. }
  229. //$count = $query->count();
  230. $query1 = $query;
  231. $query2 = $query;
  232. $list = $query1->order('addTime desc')->select();
  233. $count = $query2->count();
  234. if ($list->isEmpty()) {
  235. return Common::rm(-2, '数据为空');
  236. }
  237. $list->append(['isForgedText', 'statusText', 'user' => ['mobileAsterisk']])->visible(['cangID', 'isForged', 'addTime', 'moneySubject', 'payTime', 'status', 'investDay', 'interestBeginTime', 'year', 'interest', 'ben', 'money', 'subject' => [
  238. 'title', 'interestTimeTypeID', 'interestTypeID', 'subjectTypeID'
  239. ], 'cangRepay' => [
  240. 'money', 'repayTime', 'reachTime', 'resultTime', 'status', 'repayTypeID'
  241. ], 'user' => [
  242. 'trueName', 'mobile'
  243. ]]);
  244. vendor('excel.PHPExcel');
  245. vendor('excel.PHPExcel_IOFactory');
  246. $objPHPExcel = new \PHPExcel();
  247. $objPHPExcel->getProperties()->setCreator("石头理财")->setLastModifiedBy("石头理财")->setTitle("title")->setSubject("subject")->setDescription("description")->setKeywords("keywords")->setCategory("Category");
  248. $objPHPExcel->setActiveSheetIndex(0)->setTitle('产品名称')->setCellValue("A1", "日期")->setCellValue("B1", "产品名称")->setCellValue("C1", "利率(%)")->setCellValue("D1", "还款手续费(元)")->setCellValue("E1", "合同利率(%)")->setCellValue("F1", "合同手续费(%)")->setCellValue("G1", "募集款数(元)")->setCellValue("H1", "易宝购买(元)")->setCellValue("I1", "钱包购买(元)")->setCellValue("J1", "超过部分(元)")->setCellValue("K1", "幽灵账户(元)")->setCellValue("M1", "期限")->setCellValue("N1", "融资人")->setCellValue("O1", "备注");
  249. $objPHPExcel->getActiveSheet()->getStyle('A1:O1')->getFont()->setName('宋体')->setSize(11);
  250. $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(30);
  251. $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
  252. $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
  253. $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
  254. $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
  255. $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);
  256. $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
  257. $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(30);
  258. $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(30);
  259. $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(30);
  260. $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(30);
  261. $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(30);
  262. $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(30);
  263. $objPHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(30);
  264. // 设置列表值
  265. $pos = 2;
  266. /*foreach ($list as $k => $item) {
  267. $objPHPExcel->getActiveSheet()->setCellValue("A".$pos, $item['addTime']);
  268. $objPHPExcel->getActiveSheet()->setCellValue("B".$pos, $item['subject']['title']);
  269. $objPHPExcel->getActiveSheet()->setCellValue("C".$pos, $item['subject']['title']);
  270. $objPHPExcel->getActiveSheet()->setCellValue("D".$pos, number_format($val['fee_info']['fee']));
  271. $objPHPExcel->getActiveSheet()->setCellValue("E".$pos, $val['contract_info']['interest']);
  272. $objPHPExcel->getActiveSheet()->setCellValue("F".$pos, $val['contract_info']['fee']);
  273. $objPHPExcel->getActiveSheet()->setCellValue("G".$pos, number_format($val['totlecapital'], 2));
  274. $objPHPExcel->getActiveSheet()->setCellValue("H".$pos, number_format($val['yibao_money'], 2));
  275. $objPHPExcel->getActiveSheet()->setCellValue("I".$pos, number_format($val['wallet_money'], 2));
  276. $objPHPExcel->getActiveSheet()->setCellValue("J".$pos, number_format($val['money_more'], 2));
  277. $objPHPExcel->getActiveSheet()->setCellValue("K".$pos, number_format($val['ghost_money'], 2));
  278. $objPHPExcel->getActiveSheet()->setCellValue("M".$pos, $val['project']['days']);
  279. $objPHPExcel->getActiveSheet()->setCellValue("N".$pos, $val['project']['financing']);
  280. $objPHPExcel->getActiveSheet()->setCellValue("O".$pos, $val['project']['remark']);
  281. $pos += 1;
  282. }
  283. header("Content-Type: application/vnd.ms-excel");
  284. header('Content-Disposition: attachment;filename="日销售额('.$file_datetime.').xls"');
  285. header('Cache-Control: max-age=0');
  286. $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
  287. $objWriter->save('php://output');
  288. exit;*/
  289. }
  290. /**
  291. * @api {post} cang/actionRepay 还款
  292. * @apiVersion 1.0.0
  293. * @apiName actionRepay
  294. * @apiDescription 虚拟认购
  295. * @apiGroup Cang
  296. *
  297. * @apiParam {Number} subjectID 产品ID
  298. * @apiParam {String} moneySubject 投资金额
  299. * @apiParamExample {json} 发送报文:
  300. {
  301. "subjectID": 12,
  302. "moneySubject":"100000.00"
  303. }
  304. *
  305. * @apiSuccessExample {json} 返回json数据(举例):
  306. {
  307. "code": 1,
  308. "msg": "操作成功"
  309. }
  310. * @apiUse CreateUserError
  311. */
  312. public function actionRepay() {
  313. //第一步,得到subject
  314. $cang = Model::get($this->app['cangID']);
  315. if(!$cang || $cang['status'] != Model::STATUS_REPAY) {
  316. return Common::rm(-2, '不存在符合的订单');
  317. }
  318. //第二步,得到用户
  319. $user = User::get($cang['userID']);
  320. if(!$user) {
  321. return Common::rm(-3, '不存在该用户');
  322. }
  323. //第三步,得到用户
  324. $cangRepayList = CangRepay::where([
  325. 'cangID'=>$this->app['cangID']
  326. ])->select();
  327. if($cangRepayList->isEmpty()) {
  328. return Common::rm(-4, '不存在符合的还款项');
  329. }
  330. //第四步,得到
  331. $subject = Subject::get([
  332. 'subjectID'=>$cang['subjectID']
  333. ]);
  334. //第二步,还款
  335. Db::startTrans();
  336. try {
  337. //同步金账户
  338. vendor('payModel.Trade');
  339. foreach ($cangRepayList as $k=>$item) {
  340. if($item['status'] == CangRepay::STATUS_UNREPAY) {
  341. $finance = new FinanceService();
  342. $trade = new \Trade();
  343. $trade->setPayment('15825631526');
  344. $trade->setReceive($user['mobile']);
  345. $trade->setMoney($item['money']);
  346. if($item['repayTypeID'] == 1) {
  347. $trade->setRem('本金');
  348. }
  349. else {
  350. $trade->setRem('利息');
  351. }
  352. $result = $finance->order($msg, $trade);
  353. if(!$result) {
  354. Db::rollback();
  355. return Common::rm(-10, $msg);
  356. }
  357. $item['status'] = CangRepay::STATUS_REPAY;
  358. $item['reachTime'] = THINK_START_TIME;
  359. $item['outerNumber'] = $result;
  360. $item['outerName'] = $this->platform;
  361. $item['outerUserFrom'] = '15825631526';
  362. $item->save();
  363. //同步账户余额
  364. if($item['repayTypeID'] == 1) {
  365. $user->userAccount = $user->userAccount->MODE_repayBen_addMoney($item, $user);
  366. }
  367. else {
  368. $user->userAccount = $user->userAccount->MODE_repayInterest_addMoney($item, $user);
  369. }
  370. }
  371. }
  372. $cang['status'] = Model::STATUS_FINISH;
  373. $cang->save();
  374. //判断是否全部还款了
  375. $cangRepayList = CangRepay::where([
  376. 'subjectID'=>$cang['subjectID'],
  377. 'status'=>CangRepay::STATUS_UNREPAY
  378. ])->select();
  379. if($cangRepayList->isEmpty()) {
  380. $subject->status = Subject::STATUS_REPAY;
  381. $subject->save();
  382. }
  383. Db::commit();
  384. //发送一个短信
  385. Sms::create([
  386. 'mobile'=>$user['mobile'],
  387. 'message'=>\app\core\service\SMS::message_setCodeRepay($user['trueName'], $subject['title'], 'http://t.cn/RQC0dnv'),
  388. 'note'=>'还款',
  389. 'sendTime'=>THINK_START_TIME
  390. ]);
  391. //(new SMS())->setCodeRepay($user['mobile'], );
  392. return Common::rm(1, '操作成功', [
  393. 'detail'=>$cang->append(['statusText'])->visible(['status'])
  394. ]);
  395. }
  396. catch (Exception $e) {
  397. // 回滚事务
  398. Log::error($e->getMessage().'|'.$e->getLine().'|'.$e->getFile());
  399. Db::rollback();
  400. throw new AppException(-9, $e->getMessage());
  401. }
  402. }
  403. }