CalcController.php 15 KB

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