CalcController.php 15 KB

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