RechargeForm.php 12 KB

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