ResendQYForm.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <?php
  2. namespace common\models\forms;
  3. use common\helpers\Date;
  4. use common\components\Model;
  5. use common\helpers\Form;
  6. use common\helpers\Tool;
  7. use common\helpers\user\Balance;
  8. use common\helpers\user\Reconsume;
  9. use common\helpers\user\Info;
  10. use common\helpers\user\Status;
  11. use common\libs\logging\operate\AdminOperate;
  12. use common\models\Ad;
  13. use common\models\CalcBonus;
  14. use common\models\DealType;
  15. use common\models\PerfMonth;
  16. use common\models\Period;
  17. use common\models\ReconsumePool;
  18. use common\models\ReconsumePoolFlow;
  19. use common\models\ResendQY;
  20. use common\models\ResendQYAudit;
  21. use common\models\UserBonus;
  22. use common\models\UserInfo;
  23. use common\models\UserTeamwork;
  24. use yii\base\Exception;
  25. /**
  26. * Login form
  27. */
  28. class ResendQYForm extends Model {
  29. public $id;
  30. public $selectedIds;
  31. public $userName;
  32. public $periodNum;
  33. public $remark;
  34. public $auditStatus;
  35. private $_model;
  36. private $_userId;
  37. private $_calcBonus;
  38. public function init() {
  39. parent::init();
  40. $this->adminOperateLogger = new AdminOperate([
  41. 'fetchClass' => ResendQY::class,
  42. ]);
  43. }
  44. /**
  45. * @inheritdoc
  46. */
  47. public function rules() {
  48. return [
  49. [['id', 'userName', 'periodNum', 'remark', 'auditStatus', 'selectedIds'], 'trim'],
  50. [['id', 'userName', 'periodNum', 'auditStatus'], 'required'],
  51. ['id', 'initModel'],
  52. ['userName', 'isUser'],
  53. ['periodNum', 'isCanResend'],
  54. ['auditStatus', 'isAuditStatus'],
  55. [['selectedIds'], 'isSelected'],
  56. ];
  57. }
  58. public function attributeLabels() {
  59. return [
  60. 'userName' => '用户名',
  61. 'periodNum' => '期数',
  62. 'remark' => '备注',
  63. 'auditStatus' => '审核状态',
  64. ];
  65. }
  66. /**
  67. * 指定校验场景
  68. * @return array
  69. */
  70. public function scenarios() {
  71. $parentScenarios = parent::scenarios();
  72. $customScenarios = [
  73. 'apply' => ['selectedIds', 'remark'],
  74. 'audit' => ['selectedIds', 'remark', 'auditStatus'],
  75. ];
  76. return array_merge($parentScenarios, $customScenarios);
  77. }
  78. /**
  79. * 检查记录是否存在并初始化model
  80. * @param $attribute
  81. * @throws \yii\db\Exception
  82. */
  83. public function initModel($attribute) {
  84. $model = ResendQY::findOne(['ID' => $this->id]);
  85. if ($model) {
  86. $this->_model = $model;
  87. $period = Period::instance();
  88. $yearMonth = $period->getYearMonth($model->PERIOD_NUM);
  89. if (!$this->_calcBonus = CalcBonus::find()->yearMonth($yearMonth)->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM AND BONUS_QY<=0 AND SHOULD_QY>0 AND IS_SENT=1', [':USER_ID' => $model->USER_ID, ':PERIOD_NUM' => $model->PERIOD_NUM])->one()) {
  90. $this->addError($attribute, '该会员暂无可补发区域津贴');
  91. }
  92. } else {
  93. $this->addError($attribute, '该数据不存在');
  94. }
  95. }
  96. /**
  97. * 会员是否存在
  98. * @param $attribute
  99. */
  100. public function isUser($attribute) {
  101. if (!$this->_userId = Info::getUserIdByUserName($this->userName)) {
  102. $this->addError($attribute, 'Member does not exist'); // 会员不存在
  103. }
  104. }
  105. /**
  106. * 是否能补发
  107. * @param $attribute
  108. * @throws \yii\db\Exception
  109. */
  110. public function isCanResend($attribute) {
  111. $period = Period::instance();
  112. $yearMonth = $period->getYearMonth($this->periodNum);
  113. // 查看会员对应的期数奖金结算表中是否有应发金额>0和实发金额=0
  114. $this->_calcBonus = CalcBonus::find()->yearMonth($yearMonth)->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM AND BONUS_QY<=0 AND SHOULD_QY>0 AND IS_SENT=1', [':USER_ID' => $this->_userId, ':PERIOD_NUM' => $this->periodNum])->asArray()->one();
  115. if (!$this->_calcBonus) {
  116. $this->addError($attribute, '该会员暂无可补发区域津贴');
  117. }
  118. // 如果有的话,再看看有没有补发记录,如果有补发记录则也不能补发
  119. if (ResendQY::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM AND (AUDIT_STATUS=:AUDIT_STATUS_UN OR AUDIT_STATUS=:AUDIT_STATUS_TRUE)', [':USER_ID' => $this->_userId, ':PERIOD_NUM' => $this->periodNum,':AUDIT_STATUS_UN'=>\Yii::$app->params['auditStatus']['un']['value'], ':AUDIT_STATUS_TRUE'=>\Yii::$app->params['auditStatus']['true']['value']])->exists()) {
  120. $this->addError($attribute, '该会员已经补发或申请补发指定期数的区域津贴');
  121. }
  122. }
  123. /**
  124. * 校验审核状态
  125. * @param $attributes
  126. */
  127. public function isAuditStatus($attributes) {
  128. if (!array_key_exists($this->auditStatus, \Yii::$app->params['auditStatus'])) {
  129. $this->addError($attributes, '无效的审核状态');
  130. }
  131. }
  132. /**
  133. * 批量数据
  134. * @param $attributes
  135. */
  136. public function isSelected($attributes) {
  137. if (!$this->selectedIds) {
  138. $this->addError($attributes, 'A piece of data must be selected'); // 必须选择一条数据
  139. }
  140. if (!is_array($this->selectedIds)) {
  141. $this->selectedIds = [$this->selectedIds];
  142. }
  143. if($this->scenario == 'apply') {
  144. $this->selectedIds = array_unique($this->selectedIds);
  145. //根据会员状态及审核状态筛选
  146. foreach ($this->selectedIds as $key => $value) {
  147. //有了复销活跃资格才能补发
  148. if($resendQY = ResendQY::findOneAsArray('ID=:ID',[':ID'=>$value],'USER_ID,CALC_MONTH')){
  149. if(!ReconsumePoolFlow::find()->yearMonth($resendQY['CALC_MONTH'])->select('USER_ID')->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH AND IS_FX_DEDUCT=1', [':USER_ID' => $resendQY['USER_ID'], ':CALC_MONTH' => $resendQY['CALC_MONTH']])->exists()){
  150. unset($this->selectedIds[$key]);
  151. }
  152. }else{
  153. unset($this->selectedIds[$key]);
  154. }
  155. //去掉已存在的待审核申请
  156. if (ResendQYAudit::find()->where('RESEND_ID=:RESEND_ID AND AUDIT_STATUS =:AUDIT_STATUS', [':RESEND_ID' => $value, ':AUDIT_STATUS' => \Yii::$app->params['auditStatus']['un']['value']])->exists()) {
  157. unset($this->selectedIds[$key]);
  158. }
  159. //实发为0,应发大于0
  160. if (!ResendQY::find()->where('ID=:ID AND BONUS_QY=0 AND SHOULD_QY>0', [':ID' => $value])->exists()) {
  161. unset($this->selectedIds[$key]);
  162. }
  163. }
  164. $this->selectedIds = array_values($this->selectedIds);
  165. }
  166. }
  167. /**
  168. * 添加
  169. * @return array|null
  170. * @throws \yii\db\Exception
  171. */
  172. public function apply() {
  173. if (!$this->validate()) {
  174. return null;
  175. }
  176. $logs = [];
  177. $db = \Yii::$app->db;
  178. $transaction = $db->beginTransaction();
  179. try {
  180. if ($this->selectedIds) {
  181. foreach ($this->selectedIds as $select) {
  182. $resend = ResendQY::findOneAsArray('ID=:ID', [':ID' => $select], 'USER_ID,SHOULD_QY,PERIOD_NUM');
  183. //是否已挂网
  184. $period = Period::instance();
  185. //if (!$period->isSent($resend['PERIOD_NUM'])) continue;
  186. //会员本月是否复销
  187. //if (!Status::fxGetBonusStatusByPeriodNum($resend['USER_ID'], $resend['PERIOD_NUM'])) continue;
  188. $resendAudit = new ResendQYAudit();
  189. $resendAudit->USER_ID = $resend['USER_ID'];
  190. $resendAudit->RESEND_ID = $select;
  191. $resendAudit->SHOULD_BONUS = $resend['SHOULD_QY'];
  192. $resendAudit->RESEND_BONUS = 0;
  193. $resendAudit->PERIOD_NUM = $resend['PERIOD_NUM'];
  194. $resendAudit->AUDIT_STATUS = \Yii::$app->params['auditStatus']['un']['value'];
  195. $resendAudit->RESEND_ADMIN_ID = \Yii::$app->user->id;
  196. $resendAudit->RESEND_REMARK = $this->remark;
  197. $resendAudit->CREATED_AT = Date::nowTime();
  198. if (!$resendAudit->save()) {
  199. throw new Exception(Form::formatErrorsForApi($resendAudit->getErrors()));
  200. }
  201. if (!ResendQY::updateAll(['RESEND_AUDIT_ID' => $resendAudit->ID, 'RESEND_AUDIT_STATUS' => \Yii::$app->params['auditStatus']['un']['value'], 'RESEND_STATUS' => ResendQY::STATUS_HAS], 'ID=:ID', [':ID' => $select])) {
  202. throw new Exception('更新申请状态失败');
  203. }
  204. $logs[] = $resend['USER_ID'];
  205. }
  206. }
  207. $transaction->commit();
  208. } catch (Exception $e) {
  209. $transaction->rollBack();
  210. $this->addError('apply', $e->getMessage());
  211. return null;
  212. }
  213. if ($this->selectedIds) {
  214. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($this->selectedIds, 'ID')->setOptObjField('USER_ID')->clean()->save([
  215. 'optType' => '申请补发区域津贴',
  216. 'remark' => $this->remark,
  217. ]);
  218. }
  219. return ['logs' => $logs];
  220. }
  221. /**
  222. * 审核补发区域津贴
  223. * @return null
  224. * @throws \yii\db\Exception
  225. */
  226. public function audit() {
  227. if (!$this->validate()) {
  228. return null;
  229. }
  230. $logs = [];
  231. $ids = [];
  232. foreach ($this->selectedIds as $key => $select) {
  233. $resendId = ResendQYAudit::findOneAsArray('ID=:ID', [':ID' => $select], 'RESEND_ID');
  234. $ids[] = $resendId['RESEND_ID'];
  235. }
  236. if($ids) {
  237. $this->adminOperateLogger->setIsBatch(true)->beforeUpdate($ids, 'ID');
  238. }
  239. $db = \Yii::$app->db;
  240. $transaction = $db->beginTransaction();
  241. try {
  242. foreach ($this->selectedIds as $key=>$select) {
  243. $model=ResendQYAudit::findOne(['ID'=>$select]);
  244. $model->AUDIT_STATUS = \Yii::$app->params['auditStatus'][$this->auditStatus]['value'];
  245. $model->RESEND_REMARK = $this->remark?$this->remark:$model->RESEND_REMARK;
  246. $model->AUDIT_ADMIN_ID = \Yii::$app->user->id;
  247. $model->AUDITED_AT = Date::nowTime();
  248. if ($this->auditStatus == 'true') {
  249. Balance::changeUserBonus($model->USER_ID, 'bonus', $model->SHOULD_BONUS, [
  250. 'REMARK' => '补发' . $model->PERIOD_NUM . '期薪资',
  251. 'PERIOD_NUM' => $model->PERIOD_NUM,
  252. 'QY' => $model->SHOULD_BONUS,
  253. 'DEAL_TYPE_ID' => DealType::RESEND,
  254. 'SORT' => $key * 10
  255. ]);
  256. //更新计算奖金
  257. $period = Period::instance();
  258. $yearMonth = $period->getYearMonth($model->PERIOD_NUM);
  259. if($calcBonusModel = CalcBonus::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM AND BONUS_QY<=0 AND SHOULD_QY>0 AND IS_SENT=1', [':USER_ID' => $model->USER_ID, ':PERIOD_NUM' => $model->PERIOD_NUM])->yearMonth($yearMonth)->one()){
  260. $calcBonusModel->BONUS_QY = $model->SHOULD_BONUS;
  261. $calcBonusModel->BONUS_TOTAL = $calcBonusModel->BONUS_TOTAL + $model->SHOULD_BONUS;
  262. $calcBonusModel->BONUS_INCOME = $calcBonusModel->BONUS_INCOME + $model->SHOULD_BONUS;
  263. $calcBonusModel->P_CALC_MONTH = Date::ociToDate($yearMonth, Date::OCI_TIME_FORMAT_SHORT_MONTH);
  264. if (!$calcBonusModel->save()) {
  265. throw new Exception(Form::formatErrorsForApi($calcBonusModel->getErrors()));
  266. }
  267. }
  268. //更新对应补发列表状态
  269. if (!ResendQY::updateAll(['BONUS_QY'=>$model->SHOULD_BONUS,'RESEND_AUDIT_STATUS' => \Yii::$app->params['auditStatus'][$this->auditStatus]['value']], 'ID=:ID', [':ID' => $model->RESEND_ID])) {
  270. throw new Exception('更新申请审核状态失败');
  271. }
  272. $this->_teamworkBonus($model->USER_ID,$model->SHOULD_BONUS,$key);
  273. }elseif($this->auditStatus == 'reject'){
  274. //更新对应补发列表状态
  275. if (!ResendQY::updateAll(['RESEND_AUDIT_STATUS' => \Yii::$app->params['auditStatus'][$this->auditStatus]['value'], 'RESEND_STATUS' => ResendQY::STATUS_WAIT], 'ID=:ID', [':ID' => $model->RESEND_ID])) {
  276. throw new Exception('更新申请状态失败');
  277. }
  278. }
  279. if (!$model->save()) {
  280. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  281. }
  282. $logs[] = $model->USER_ID;
  283. }
  284. $transaction->commit();
  285. } catch (Exception $e) {
  286. $transaction->rollBack();
  287. $this->addError('audit', $e->getMessage());
  288. return null;
  289. }
  290. if($ids) {
  291. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($ids, 'ID')->setOptObjField('USER_ID')->clean()->save([
  292. 'optType' => '审核补发区域津贴',
  293. 'remark' => $this->remark,
  294. ]);
  295. }
  296. return ['logs' => $logs];
  297. }
  298. /**
  299. * 删除前
  300. * @param $selected
  301. * @throws Exception
  302. */
  303. public function beforeDelete($selected) {
  304. //恢复
  305. foreach ($selected as $value){
  306. if($resendAudit = ResendQYAudit::findOneAsArray('ID=:ID',[':ID'=>$value],'RESEND_ID')){
  307. if (!ResendQY::updateAll(['RESEND_AUDIT_ID' => null,'RESEND_AUDIT_STATUS' => null, 'RESEND_STATUS' => ResendQY::STATUS_WAIT], 'ID=:ID', [':ID' => $resendAudit['RESEND_ID']])) {
  308. throw new Exception('更新申请状态失败');
  309. }
  310. }
  311. }
  312. $this->adminOperateLogger->fetchClass = ResendQYAudit::class;
  313. $this->adminOperateLogger->setIsBatch(true)->beforeDelete($selected, 'ID');
  314. }
  315. /**
  316. * 删除
  317. * @param $selected
  318. * @throws Exception
  319. */
  320. public function delete($selected) {
  321. $this->adminOperateLogger->clean()->save([
  322. 'optType' => '删除补发区域津贴待审核数据',
  323. ]);
  324. }
  325. /**
  326. * 点位合作发放
  327. * @param $userId
  328. * @param $amount
  329. * @return bool
  330. * @throws Exception
  331. * @throws \yii\db\Exception
  332. */
  333. private function _teamworkBonus($userId, $amount, $key) {
  334. if (!$teamwork = UserTeamwork::findAllAsArray('USER_ID!=:MAIN_UID AND MAIN_UID=:MAIN_UID AND IS_DEL=0', [':MAIN_UID' => $userId], 'USER_ID,DIVIDE_PERCENT')) return false;
  335. $fromUserName = Info::getUserNameByUserId($userId);
  336. foreach ($teamwork as $value) {
  337. $bonus = Tool::formatPrice($amount * $value['DIVIDE_PERCENT'] * 0.01);
  338. if ($bonus <= 0) continue;
  339. $toUserName = Info::getUserNameByUserId($value['USER_ID']);
  340. Balance::changeUserBonus($userId, 'bonus', -abs($bonus), ['SORT' => $key*10+1, 'DEAL_TYPE_ID' => DealType::TEAMWORK_TRANSFER_OUT, 'REMARK' => 'To:' . $toUserName . ' Per:' . $value['DIVIDE_PERCENT'] . '%']);
  341. Balance::changeUserBonus($value['USER_ID'], 'bonus', abs($bonus), ['SORT' => $key*10+2, 'DEAL_TYPE_ID' => DealType::TEAMWORK_TRANSFER_IN, 'REMARK' => 'From: ' . $fromUserName . ' Per:' . $value['DIVIDE_PERCENT'] . '%']);
  342. }
  343. }
  344. }