RechargeForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <?php
  2. namespace common\models\forms;
  3. use common\components\Model;
  4. use common\helpers\Cache;
  5. use common\helpers\Date;
  6. use common\helpers\Form;
  7. use common\helpers\Tool;
  8. use common\helpers\user\Cash;
  9. use common\helpers\user\Info;
  10. use common\models\Recharge;
  11. use common\models\RechargeLog;
  12. use common\models\UserInfo;
  13. use yii\base\Exception;
  14. /**
  15. * Login form
  16. */
  17. class RechargeForm extends Model {
  18. public $selectedIds;
  19. public $auditStatus;
  20. public $createRemark;
  21. public $userName;
  22. public $applyAmount;
  23. public $openBank;
  24. public $bankAddress;
  25. public $bankNo;
  26. // public $bankProvince;
  27. // public $bankCity;
  28. // public $bankCounty;
  29. public $sn;
  30. public $amount;
  31. public $bankRealName;
  32. private $_userId;
  33. public $id;
  34. public $rechargeType;
  35. public $payDate;
  36. public $rechargeRemark;
  37. /**
  38. * @inheritdoc
  39. */
  40. public function rules() {
  41. return [
  42. [['userName', 'idCard', 'applyAmount', 'auditStatus', 'remark', 'selectedIds', 'sn','amount', 'bankRealName', 'bankNo','rechargeType','payDate','rechargeRemark'], 'trim'],
  43. [['selectedIds', 'auditStatus', 'userName','applyAmount','payDate','rechargeRemark',/*'openBank','bankNo'*//*,'bankAddress'*/], 'required'],
  44. [['selectedIds'], 'exist', 'targetClass' => Recharge::class, 'targetAttribute' => 'ID', 'message' => 'Recharge does not exist'], // 充值申请不存在
  45. [['userName'], 'exist', 'targetClass' => UserInfo::class, 'targetAttribute' => 'USER_NAME', 'message' => 'Member does not exist'],// 会员不存在
  46. [['applyAmount'], 'price'],
  47. [['applyAmount'], 'isApplyAmount'],
  48. [['applyAmount'], 'number', 'max' => 10000000000, 'min' => 1],
  49. [['selectedIds'], 'isSelected'],
  50. [['id'], 'number'],
  51. ['rechargeType', 'string', 'max' => 50], // 限制长度
  52. ['rechargeType', 'in', 'range' => ['Cash', 'Credit Card', 'Direct Banking']],
  53. //[['sn'], 'isSn'],
  54. ];
  55. }
  56. /**
  57. * 指定场景
  58. * @return array
  59. */
  60. public function scenarios() {
  61. $parentScenarios = parent::scenarios();
  62. $customScenarios = [
  63. 'addByAdmin' => ['userName', 'applyAmount'],
  64. 'addByUser' => ['applyAmount','openBank','bankNo','bankAddress','rechargeType','payDate','rechargeRemark'/*,'currency'*/],
  65. 'updateByUser' => ['id','applyAmount','openBank','bankNo','bankAddress','rechargeType','payDate','rechargeRemark'/*,'currency'*/],
  66. 'statusByAdmin' => ['selectedIds', 'auditStatus', 'createRemark'],
  67. 'updateByAdmin' => ['id', 'rechargeType'],
  68. ];
  69. return array_merge($parentScenarios, $customScenarios);
  70. }
  71. /**
  72. * @return array
  73. */
  74. public function attributeLabels() {
  75. return [
  76. 'selectedIds' => 'RechargeID',// 充值申请ID
  77. 'userName' => 'Member code',// 会员编号
  78. 'applyAmount' => 'Apply Amount', // 申请充值的金额
  79. 'openBank' => 'Bank name',// 汇款银行
  80. 'bankNo' => 'Payment Reference', // 汇款账号
  81. // 'bankAddress' => '银行支行',
  82. // 'bankProvince' => '银行省',
  83. // 'bankCity' => '银行市',
  84. // 'bankCounty' => '银行县',
  85. ];
  86. }
  87. /**
  88. * 校验申请金额是否小于当前余额并符合配置中的设置
  89. * @param $attribute
  90. * @return bool
  91. */
  92. public function isApplyAmount($attribute) {
  93. if ($this->applyAmount <= 0) {
  94. $this->addError('scenario', 'The recharge amount must be greater than 0'); // 充值金额必须大于0
  95. }
  96. if ((int)($this->applyAmount)!=$this->applyAmount) {
  97. $this->addError('scenario', 'The recharge amount must be an integer');// 充值金额必须是整数
  98. }
  99. if ($this->scenario == 'addByUser') {
  100. $this->_userId = \Yii::$app->user->id;
  101. } elseif ($this->scenario == 'addByAdmin') {
  102. $userInfo = UserInfo::findOneAsArray(['USER_NAME' => $this->userName]);
  103. if (!$userInfo) {
  104. $this->addError('scenario', $this->userName . 'Member does not exist');// 会员不存在
  105. }else{
  106. $this->_userId = $userInfo['USER_ID'];
  107. }
  108. } elseif ($this->scenario == 'updateByUser') {
  109. $this->_userId = \Yii::$app->user->id;
  110. } else {
  111. $this->addError($attribute, 'Scenes does not exist'); // 场景不存在
  112. return false;
  113. }
  114. }
  115. /**
  116. * 批量数据
  117. * @param $attributes
  118. */
  119. public function isSelected($attributes) {
  120. if (!$this->selectedIds) {
  121. $this->addError($attributes, 'A piece of data must be selected'); // 必须选择一条数据
  122. }
  123. // if (!is_array($this->selectedIds)) {
  124. // $this->selectedIds = [$this->selectedIds];
  125. // }
  126. }
  127. /**
  128. * 判断信息是否一致
  129. * @param $attribute
  130. * @throws Exception
  131. */
  132. public function isSn($attribute) {
  133. $sn = $this->sn;
  134. if (!$oneWithdraw = Recharge::findOneAsArray('SN=:SN AND AUDIT_STATUS=:AUDIT_STATUS', [':SN' => $sn, ':AUDIT_STATUS' => Recharge::STATUS_AUDITED])) {
  135. $this->addError($attribute, '不存在充值流水号为' . $sn . '的已审核记录');
  136. }
  137. if ($oneWithdraw) {
  138. $info = Info::baseInfo($oneWithdraw['USER_ID']);
  139. if ($this->userName != $info['USER_NAME']) {
  140. $this->addError($attribute, 'Excel中充值流水号' . $sn . '的用户名' . $this->userName . '与系统中的信息【' . $info['USER_NAME'] . '】不一致');
  141. }
  142. if ($this->amount != $oneWithdraw['AMOUNT']) {
  143. $this->addError($attribute, 'Excel中充值流水号' . $sn . '的充值金额' . $this->amount . '与系统中的信息【' . $oneWithdraw['AMOUNT'] . '】不一致');
  144. }
  145. if ($this->bankRealName != $oneWithdraw['REAL_NAME']) {
  146. $this->addError($attribute, 'Excel中充值流水号' . $sn . '的实时开户名' . $this->bankRealName . '与系统中的信息【' . $oneWithdraw['REAL_NAME'] . '】不一致');
  147. }
  148. if ($this->bankNo != $oneWithdraw['BANK_NO']) {
  149. $this->addError($attribute, 'Excel中充值流水号' . $sn . '的实时银行账户' . $this->bankNo . '与系统中的信息【' . $oneWithdraw['BANK_NO'] . '】不一致');
  150. }
  151. }
  152. }
  153. /**
  154. * 管理员充值
  155. * @return null|string
  156. * @throws \yii\db\Exception
  157. */
  158. public function recharge() {
  159. if (!$this->validate()) {
  160. return false;
  161. }
  162. $db = \Yii::$app->db;
  163. $transaction = $db->beginTransaction();
  164. try {
  165. Cash::changeUserCash($this->_userId, 'CASH', $this->applyAmount, ['REMARK' => 'Background administrator recharge']);
  166. $transaction->commit();
  167. } catch (Exception $e) {
  168. $transaction->rollBack();
  169. $this->addError('add', $e->getMessage());
  170. return false;
  171. }
  172. return true;
  173. }
  174. /**
  175. * 添加充值申请
  176. * @return null|string
  177. * @throws \yii\db\Exception
  178. */
  179. public function add() {
  180. if (!$this->validate()) {
  181. return false;
  182. }
  183. $db = \Yii::$app->db;
  184. $transaction = $db->beginTransaction();
  185. try {
  186. $nowTime = Date::nowTime();
  187. $period = Recharge::getPeriod($nowTime);
  188. //增加记录
  189. $userInfo = Info::baseInfo($this->_userId);
  190. $rechargeModel = new Recharge();
  191. $rechargeModel->SN = $this->_generateSn();
  192. $rechargeModel->USER_ID = $this->_userId;
  193. $rechargeModel->REAL_NAME = Info::getUserRealNameByUserId($this->_userId);
  194. $rechargeModel->ID_CARD = $userInfo['ID_CARD'];
  195. $rechargeModel->RECHARGE_PERIOD_NUM = $period['nowPeriodNum'];
  196. $rechargeModel->RECHARGE_YEAR = $period['nowYear'];
  197. $rechargeModel->RECHARGE_MONTH = $period['nowMonth'];
  198. $rechargeModel->AMOUNT = $this->applyAmount;
  199. $rechargeModel->OPEN_BANK = $this->openBank;
  200. $rechargeModel->BANK_ADDRESS = $this->bankAddress;
  201. $rechargeModel->BANK_NO = $this->bankNo;
  202. $rechargeModel->TYPE = $this->rechargeType;
  203. // $rechargeModel->BANK_PROVINCE = $this->bankProvince ?? 0;
  204. // $rechargeModel->BANK_CITY = $this->bankCity ?? 0;
  205. // $rechargeModel->BANK_COUNTY = $this->bankCounty ?? 0;
  206. $rechargeModel->P_MONTH = Date::ociToDate($period['yearMonth'], Date::OCI_TIME_FORMAT_SHORT_MONTH);
  207. $rechargeModel->AUDIT_STATUS = Recharge::STATUS_APPLIED;
  208. $rechargeModel->CREATED_AT = $nowTime;
  209. $rechargeModel->PAY_DATE = strtotime($this->payDate);
  210. $rechargeModel->RECHARGE_REMARK = $this->rechargeRemark;
  211. if (!$rechargeModel->save()) {
  212. throw new Exception(Form::formatErrorsForApi($rechargeModel->getErrors()));
  213. }
  214. $transaction->commit();
  215. } catch (Exception $e) {
  216. $transaction->rollBack();
  217. $this->addError('add', $e->getMessage());
  218. return false;
  219. }
  220. return $rechargeModel;
  221. }
  222. /**
  223. * 更新充值申请
  224. * @return null|string
  225. * @throws \yii\db\Exception
  226. */
  227. public function update() {
  228. if (!$this->validate()) {
  229. return false;
  230. }
  231. if(!$this->id){
  232. return false;
  233. }
  234. $rechargeModel = Recharge::findOne(['ID' => $this->id]);
  235. if(in_array($rechargeModel->AUDIT_STATUS,[Recharge::STATUS_PROCESSING,Recharge::STATUS_SUCCESS,Recharge::STATUS_REJECT])){
  236. $this->addError('scenario', 'This status cannot be modified');
  237. return false;
  238. }
  239. $db = \Yii::$app->db;
  240. $transaction = $db->beginTransaction();
  241. try {
  242. $nowTime = Date::nowTime();
  243. $rechargeLogModel = new RechargeLog();
  244. $rechargeLogModel->SN = $this->_generateSn();
  245. $rechargeLogModel->USER_ID = $rechargeModel->USER_ID;
  246. $rechargeLogModel->REAL_NAME = $rechargeModel->REAL_NAME;
  247. $rechargeLogModel->ID_CARD = $rechargeModel->ID_CARD;
  248. $rechargeLogModel->RECHARGE_PERIOD_NUM = $rechargeModel->RECHARGE_PERIOD_NUM;
  249. $rechargeLogModel->RECHARGE_YEAR = $rechargeModel->RECHARGE_YEAR;
  250. $rechargeLogModel->RECHARGE_MONTH =$rechargeModel->RECHARGE_MONTH;
  251. $rechargeLogModel->AMOUNT = $rechargeModel->AMOUNT;
  252. $rechargeLogModel->UPDATE_AMOUNT = $this->applyAmount;
  253. $rechargeLogModel->OPEN_BANK = $rechargeModel->OPEN_BANK;
  254. $rechargeLogModel->UPDATE_OPEN_BANK = $this->openBank;
  255. $rechargeLogModel->BANK_ADDRESS = $rechargeModel->BANK_ADDRESS;
  256. $rechargeLogModel->UPDATE_BANK_ADDRESS = $this->bankAddress;
  257. $rechargeLogModel->BANK_NO = $rechargeModel->BANK_NO;
  258. $rechargeLogModel->UPDATE_BANK_NO = $this->bankNo;
  259. $rechargeLogModel->P_MONTH = $rechargeModel->P_MONTH;
  260. $rechargeLogModel->AUDIT_STATUS = $rechargeModel->AUDIT_STATUS;
  261. $rechargeLogModel->TYPE = $rechargeModel->TYPE;
  262. $rechargeLogModel->CREATED_AT = $nowTime;
  263. $rechargeLogModel->PAY_DATE = strtotime($rechargeModel->PAY_DATE);
  264. $rechargeLogModel->RECHARGE_REMARK = $rechargeModel->RECHARGE_REMARK;
  265. if (!$rechargeLogModel->save()) {
  266. throw new Exception(Form::formatErrorsForApi($rechargeLogModel->getErrors()));
  267. }
  268. $rechargeModel->AMOUNT = $this->applyAmount;
  269. $rechargeModel->OPEN_BANK = $this->openBank;
  270. $rechargeModel->BANK_ADDRESS = $this->bankAddress;
  271. $rechargeModel->BANK_NO = $this->bankNo;
  272. // $rechargeModel->UPDATED_AT = $nowTime;
  273. $rechargeModel->TYPE = $this->rechargeType;
  274. $rechargeModel->PAY_DATE = strtotime($this->payDate);
  275. $rechargeModel->RECHARGE_REMARK = $this->rechargeRemark;
  276. if (!$rechargeModel->save()) {
  277. throw new Exception(Form::formatErrorsForApi($rechargeModel->getErrors()));
  278. }
  279. $transaction->commit();
  280. } catch (Exception $e) {
  281. $transaction->rollBack();
  282. $this->addError('update', $e->getMessage());
  283. return false;
  284. }
  285. return $rechargeModel;
  286. }
  287. /**
  288. * 更新充值申请
  289. * @return null|string
  290. * @throws \yii\db\Exception
  291. */
  292. public function updateType() {
  293. if (!$this->validate(['id', 'rechargeType'])) {
  294. return false;
  295. }
  296. if(!$this->id){
  297. return false;
  298. }
  299. $rechargeModel = Recharge::findOne(['ID' => $this->id]);
  300. // if(in_array($rechargeModel->AUDIT_STATUS,[Recharge::STATUS_PROCESSING,Recharge::STATUS_SUCCESS,Recharge::STATUS_REJECT])){
  301. // $this->addError('scenario', 'This status cannot be modified');
  302. // return false;
  303. // }
  304. $db = \Yii::$app->db;
  305. $transaction = $db->beginTransaction();
  306. try {
  307. $nowTime = Date::nowTime();
  308. $rechargeLogModel = new RechargeLog();
  309. $rechargeLogModel->SN = $this->_generateSn();
  310. $rechargeLogModel->USER_ID = $rechargeModel->USER_ID;
  311. $rechargeLogModel->REAL_NAME = $rechargeModel->REAL_NAME;
  312. $rechargeLogModel->ID_CARD = $rechargeModel->ID_CARD;
  313. $rechargeLogModel->RECHARGE_PERIOD_NUM = $rechargeModel->RECHARGE_PERIOD_NUM;
  314. $rechargeLogModel->RECHARGE_YEAR = $rechargeModel->RECHARGE_YEAR;
  315. $rechargeLogModel->RECHARGE_MONTH =$rechargeModel->RECHARGE_MONTH;
  316. $rechargeLogModel->AMOUNT = $rechargeModel->AMOUNT;
  317. $rechargeLogModel->UPDATE_AMOUNT = $rechargeModel->AMOUNT;
  318. $rechargeLogModel->OPEN_BANK = $rechargeModel->OPEN_BANK;
  319. $rechargeLogModel->UPDATE_OPEN_BANK = $rechargeModel->OPEN_BANK;
  320. $rechargeLogModel->BANK_ADDRESS = $rechargeModel->BANK_ADDRESS;
  321. $rechargeLogModel->UPDATE_BANK_ADDRESS = $rechargeModel->BANK_ADDRESS;
  322. $rechargeLogModel->BANK_NO = $rechargeModel->BANK_NO;
  323. $rechargeLogModel->UPDATE_BANK_NO = $rechargeModel->BANK_NO;
  324. $rechargeLogModel->P_MONTH = $rechargeModel->P_MONTH;
  325. $rechargeLogModel->AUDIT_STATUS = $rechargeModel->AUDIT_STATUS;
  326. $rechargeLogModel->TYPE = $rechargeModel->TYPE;
  327. $rechargeLogModel->CREATED_AT = $nowTime;
  328. $rechargeLogModel->PAY_DATE = strtotime($rechargeModel->PAY_DATE);
  329. $rechargeLogModel->RECHARGE_REMARK = $rechargeModel->RECHARGE_REMARK;
  330. if (!$rechargeLogModel->save()) {
  331. throw new Exception(Form::formatErrorsForApi($rechargeLogModel->getErrors()));
  332. }
  333. $rechargeModel->TYPE = $this->rechargeType;
  334. if (!$rechargeModel->save()) {
  335. throw new Exception(Form::formatErrorsForApi($rechargeModel->getErrors()));
  336. }
  337. $transaction->commit();
  338. } catch (Exception $e) {
  339. $transaction->rollBack();
  340. $this->addError('updateType', $e->getMessage());
  341. return false;
  342. }
  343. return $rechargeModel;
  344. }
  345. /**
  346. * 生成流水号
  347. * @return string
  348. */
  349. private function _generateSn() {
  350. return 'CZ' . Date::today('Ymd') . $this->_random(10, 1);
  351. }
  352. /**
  353. * 生成随机数
  354. *
  355. * @param $length
  356. * @param int $numeric
  357. * @return string
  358. */
  359. private function _random($length, $numeric = 0) {
  360. $seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
  361. $seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
  362. $hash = '';
  363. $max = strlen($seed) - 1;
  364. for ($i = 0; $i < $length; $i++) {
  365. $hash .= $seed[mt_rand(0, $max)];
  366. }
  367. return $hash;
  368. }
  369. /**
  370. * 设置充值订单的状态
  371. * @return null|static
  372. * @throws \yii\db\Exception
  373. */
  374. public function changeStatus() {
  375. if (!$this->validate()) {
  376. return null;
  377. }
  378. $logs = [];
  379. $db = \Yii::$app->db;
  380. $transaction = $db->beginTransaction();
  381. try {
  382. $oneRecharge = Recharge::findOne(['ID' => $this->selectedIds]);
  383. //判断状态
  384. if (($msg = Recharge::chkAuditStatus($oneRecharge->SN, $oneRecharge->AUDIT_STATUS, $this->auditStatus)) != '') {
  385. throw new Exception($msg);
  386. }
  387. //待审核->已审核 修改会员现金钱包
  388. if ($this->auditStatus == Recharge::STATUS_AUDITED) {
  389. Cash::changeUserCash($oneRecharge->USER_ID, 'CASH', abs($oneRecharge->AMOUNT), ['REMARK' => 'Review member recharge application']);
  390. }
  391. $oneRecharge->REMARK = $this->createRemark ?? '';
  392. $oneRecharge->AUDIT_ADMIN = \Yii::$app->user->id;
  393. $oneRecharge->AUDIT_STATUS = $this->auditStatus;
  394. $oneRecharge->AUDITED_AT = Date::nowTime();
  395. if (!$oneRecharge->save()) {
  396. throw new Exception(Form::formatErrorsForApi($oneRecharge->getErrors()));
  397. }
  398. $logs[$this->selectedIds] = $oneRecharge->SN;
  399. $transaction->commit();
  400. } catch (Exception $e) {
  401. $transaction->rollBack();
  402. $this->addError('auditStatus', $e->getMessage());
  403. return null;
  404. }
  405. return ['logs' => $logs, 'status' => $this->auditStatus];
  406. }
  407. }