CalcController.php 12 KB

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