CalcController.php 13 KB

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