CalcController.php 13 KB

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