CalcController.php 13 KB

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