CalcController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: leo
  5. * Date: 2018/2/24
  6. * Time: 下午12:48
  7. */
  8. namespace backendApi\modules\v1\controllers;
  9. use common\helpers\bonus\Calc\CalcConsole;
  10. use common\helpers\bonus\Calc\PullCalcBonusData;
  11. use common\helpers\Form;
  12. use common\models\CalcRecord;
  13. use common\models\FlowBonus;
  14. use common\models\forms\PeriodForm;
  15. use common\models\Period;
  16. use Yii;
  17. /**
  18. * 业务系统关于计算服务的控制器
  19. */
  20. class CalcController extends BaseController
  21. {
  22. public $modelClass = FlowBonus::class;
  23. public function behaviors()
  24. {
  25. $behaviors = parent::behaviors();
  26. return $behaviors;
  27. }
  28. public function actionAutoPerf() {
  29. $periodNum = \Yii::$app->request->get('periodNum');
  30. if (!$periodNum) {
  31. return static::notice('期数不存在', 400);
  32. }
  33. if (Period::isPreparing($periodNum)) {
  34. return static::notice('预计算正在进行中请稍后', 400);
  35. }
  36. //设置自动计算标识
  37. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  38. //记录开始计算的时间
  39. Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
  40. $formModel = new PeriodForm();
  41. $formModel->scenario = 'autoPerf';
  42. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->autoPerf()) {
  43. //设置预计算进行中标识
  44. Period::updatePeriodIsPreparing($periodNum, Period::IS_PREPARING);
  45. //设置redis开关
  46. Yii::$app->cache->set('isPreparing', 1, 3600);
  47. return static::notice('预计算已开始,请等待');
  48. } else {
  49. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  50. }
  51. }
  52. /**自动计算 对应界面按钮
  53. * @return mixed
  54. * @throws \yii\web\HttpException
  55. */
  56. public function actionAutoCalc()
  57. {
  58. $periodNum = \Yii::$app->request->get('periodNum');
  59. if (!$periodNum) {
  60. return static::notice('期数不存在', 400);
  61. }
  62. if (Period::isProcessing($periodNum)) {
  63. return static::notice('有操作正在进行中请稍后', 400);
  64. }
  65. if (!Period::checkClose($periodNum)) { // 如果未封期
  66. return static::notice('没有封期不能计算', 400);
  67. }
  68. //设置计算进行中标识
  69. Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  70. //设置自动计算标识
  71. Period::updatePeriodIsAutoExec($periodNum, Period::AUTO_EXEC_CALC);
  72. //记录开始计算的时间
  73. Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
  74. $formModel = new PeriodForm();
  75. $formModel->scenario = 'perf';
  76. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->autoExec()) {
  77. //设置redis开关
  78. Yii::$app->cache->set('isCalcing', 1, 3600);
  79. return static::notice('自动计算已开始,请等待');
  80. } else {
  81. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  82. }
  83. }
  84. /**
  85. * 生成业绩单
  86. * @return mixed
  87. * @throws \yii\web\HttpException
  88. */
  89. public function actionPerfOrder()
  90. {
  91. $periodNum = \Yii::$app->request->get('periodNum');
  92. if (!$periodNum) {
  93. return static::notice('期数不存在', 400);
  94. }
  95. if (Period::isProcessing($periodNum)) {
  96. return static::notice('有操作正在进行中请稍后', 400);
  97. }
  98. //设置手动计算标识
  99. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  100. //设置计算进行中标识
  101. Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  102. $formModel = new PeriodForm();
  103. $formModel->scenario = 'perf';
  104. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->generatePerfOrder()) {
  105. //设置redis开关
  106. Yii::$app->cache->set('isCalcing', 1, 3600);
  107. return static::notice('业绩单已开始生成,请等待');
  108. } else {
  109. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  110. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  111. }
  112. }
  113. /**
  114. * 推送基础数据
  115. * @return mixed
  116. * @throws \yii\web\HttpException
  117. */
  118. public function actionInitData()
  119. {
  120. $periodNum = \Yii::$app->request->get('periodNum');
  121. if (!$periodNum) {
  122. return static::notice('期数不存在', 400);
  123. }
  124. if (Period::isProcessing($periodNum)) {
  125. return static::notice('有操作正在进行中请稍后', 400);
  126. }
  127. //设置手动计算标识
  128. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  129. //设置计算进行中标识
  130. Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  131. $formModel = new PeriodForm();
  132. $formModel->scenario = 'perf';
  133. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->pushBaseData()) {
  134. return static::notice('基础数据已开始推送,请等待');
  135. } else {
  136. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  137. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  138. }
  139. }
  140. /**
  141. * 通知计算系统生成期业绩和月业绩单
  142. * @return mixed
  143. * @throws \yii\web\HttpException
  144. */
  145. public function actionCalcPerfPeriod()
  146. {
  147. $periodNum = \Yii::$app->request->get('periodNum');
  148. if (!$periodNum) {
  149. return static::notice('期数不存在', 400);
  150. }
  151. if (Period::isProcessing($periodNum)) {
  152. return static::notice('有操作正在进行中请稍后', 400);
  153. }
  154. //设置手动计算标识
  155. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  156. //设置计算进行中标识
  157. // Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  158. $db = CalcConsole::CALC_DB_NAME;
  159. $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
  160. ->bindValue(':PERIOD_NUM', $periodNum)
  161. ->queryOne();
  162. if (empty($period)) {
  163. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  164. return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');
  165. } else {
  166. CalcRecord::record($periodNum, '【期业绩】已通知计算系统生成本期的期业绩');
  167. \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['IS_PREPARE' => 1], 'PERIOD_NUM=' . $periodNum)->execute();
  168. return static::notice('期业绩已于计算系统中开始计算,请等待');
  169. }
  170. }
  171. /**
  172. * 拉取期业绩和月业绩到业务系统
  173. * @return mixed
  174. * @throws \yii\web\HttpException
  175. */
  176. public function actionPullPerfPeriod()
  177. {
  178. $periodNum = \Yii::$app->request->get('periodNum');
  179. if (!$periodNum) {
  180. return static::notice('期数不存在', 400);
  181. }
  182. if (Period::isProcessing($periodNum)) {
  183. return static::notice('有操作正在进行中请稍后', 400);
  184. }
  185. //设置手动计算标识
  186. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  187. $db = CalcConsole::CALC_DB_NAME;
  188. $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
  189. ->bindValue(':PERIOD_NUM', $periodNum)
  190. ->queryOne();
  191. if (empty($period)) {
  192. return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');
  193. }
  194. $formModel = new PeriodForm();
  195. $formModel->scenario = 'perf';
  196. //设置计算进行中标识
  197. Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  198. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->pullPeriod()) {
  199. return static::notice('开始拉取期业绩数据,请等待');
  200. } else {
  201. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  202. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  203. }
  204. }
  205. /**
  206. * 通知业务系统计算奖金
  207. * @return mixed|void
  208. * @throws \yii\web\HttpException
  209. */
  210. public function actionCalcBonus()
  211. {
  212. $periodNum = \Yii::$app->request->get('periodNum');
  213. if (!$periodNum) {
  214. return static::notice('期数不存在', 400);
  215. }
  216. if (Period::isProcessing($periodNum)) {
  217. return static::notice('有操作正在进行中请稍后', 400);
  218. }
  219. //设置手动计算标识
  220. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  221. //设置计算进行中标识
  222. // Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  223. $db = CalcConsole::CALC_DB_NAME;
  224. $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
  225. ->bindValue(':PERIOD_NUM', $periodNum)
  226. ->queryOne();
  227. $formModel = new PeriodForm();
  228. $formModel->scenario = 'calc';
  229. if (empty($period)) {
  230. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  231. return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');
  232. } else/* if (1 == $period['IS_PERFED'] && 2 == $period['IS_PREPARE']) */ {
  233. Period::updateAll(['IS_CALCULATED' => 0, 'IS_CALCING' => 1], ['PERIOD_NUM' => $period['PERIOD_NUM']]);
  234. //设置奖金开始计算时间
  235. Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
  236. CalcRecord::record($periodNum, '【奖金计算】开始计算第'.$periodNum.'期的奖金');
  237. \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['IS_PREPARE' => 3, 'IS_CALCULATED' => 0], 'PERIOD_NUM=' . $periodNum)->execute();
  238. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  239. return static::notice('本期奖金已于计算系统中开始计算,请等待');
  240. }
  241. }
  242. /**拉取奖金
  243. * @return mixed
  244. * @throws \yii\web\HttpException
  245. */
  246. public function actionPullBonus()
  247. {
  248. $periodNum = \Yii::$app->request->get('periodNum');
  249. if (!$periodNum) {
  250. return static::notice('期数不存在', 400);
  251. }
  252. if (Period::isProcessing($periodNum)) {
  253. return static::notice('有操作正在进行中请稍后', 400);
  254. }
  255. //设置手动计算标识
  256. Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
  257. $db = CalcConsole::CALC_DB_NAME;
  258. $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
  259. ->bindValue(':PERIOD_NUM', $periodNum)
  260. ->queryOne();
  261. if (empty($period)) {
  262. return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');
  263. }
  264. $formModel = new PeriodForm();
  265. $formModel->scenario = 'calc';
  266. if (4 == $period['IS_PREPARE'] && 1 == $period['IS_CALCULATED']) {
  267. //设置计算进行中标识
  268. Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
  269. if ($formModel->load(Yii::$app->request->get(), '') && $formModel->pullBonus()) {
  270. return static::notice('开始拉取奖金数据,请等待');
  271. } else {
  272. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  273. return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
  274. }
  275. } else {
  276. Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
  277. return static::notice('奖金数据还未全部生成,无法全部拉取,请稍后重试', 400);
  278. }
  279. }
  280. /**操作记录列表
  281. * @return mixed
  282. * @throws \yii\web\HttpException
  283. */
  284. public function actionRecordList()
  285. {
  286. $filter = $this->filterCondition([
  287. 'periodNum' => 'PERIOD_NUM',
  288. ]);
  289. $condition = $filter['condition'];
  290. $params = $filter['params'];
  291. $data = CalcRecord::lists($condition, $params, ['orderBy' => 'CREATED_AT DESC , ID DESC']);
  292. return static::notice($data);
  293. }
  294. /**
  295. * 更新奖金计算进度的日志
  296. * @return mixed
  297. * @throws \yii\web\HttpException
  298. */
  299. public function actionSyncCalcRecord()
  300. {
  301. $periodNum = \Yii::$app->request->get('periodNum');
  302. if (!$periodNum) {
  303. return static::notice('期数不存在', 400);
  304. }
  305. $businessPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])->asArray()->one();
  306. CalcConsole::syncCalcRecord($periodNum, CalcConsole::CALC_DB_NAME, $businessPeriod['START_EXEC_TIME'] ?? 0);
  307. return static::notice('已更新奖金计算的操作日志,请刷新');
  308. }
  309. }