PushBaseDataToCalc.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: leo
  5. * Date: 2018/8/2
  6. * Time: 上午10:38
  7. */
  8. namespace common\helpers\bonus\Calc;
  9. use common\components\ActiveRecord;
  10. use common\helpers\LoggerTool;
  11. use common\models\CalcBonus;
  12. use common\models\CalcBonusBS;
  13. use common\models\CalcBonusQY;
  14. use common\models\CalcRecord;
  15. use common\models\EmployLevel;
  16. use common\models\forms\DeclarationForm;
  17. use common\models\Order;
  18. use common\models\PerfMonth;
  19. use common\models\PerfOrder;
  20. use common\models\PerfPeriod;
  21. use common\models\PerfStandard;
  22. use common\models\Period;
  23. /**
  24. * 推送基础数据供计算服务使用
  25. */
  26. class PushBaseDataToCalc extends BaseBusiness
  27. {
  28. const BASE_INFO_METHODS = [
  29. //--- 用户表
  30. 'user' => ['table' => 'AR_USER', 'field' => [
  31. 'ID',
  32. 'USER_NAME',
  33. 'REAL_NAME',
  34. 'CREATED_AT',
  35. 'STATUS',
  36. 'DEC_LV',
  37. 'EMP_LV',
  38. 'CROWN_LV',
  39. 'IS_DEC',
  40. 'DEC_ID',
  41. 'DEC_ROLE_ID',
  42. 'LAST_DEC_LV',
  43. 'LAST_EMP_LV',
  44. 'IS_STUDIO',
  45. 'LAST_CROWN_LV',
  46. 'DELETED',
  47. ]],
  48. //--- 用户信息表
  49. 'userInfo' => ['table' => 'AR_USER_INFO', 'field' => [
  50. 'ID',
  51. 'USER_ID',
  52. 'USER_NAME',
  53. 'CON_UID',
  54. 'REC_UID',
  55. 'CREATED_AT',
  56. ]],
  57. //---配置表初始化数据见数据库是否开启管理奖,使用的是openbs进行控制
  58. 'config' => ['table' => 'AR_CONFIG', 'field' => [
  59. 'CONFIG_NAME',
  60. 'TITLE',
  61. 'UNIT',
  62. 'INPUT_TYPE',
  63. 'OPTIONS',
  64. 'VALUE',
  65. 'TYPE',
  66. 'SORT',
  67. 'CREATED_AT',
  68. 'UPDATED_AT',
  69. ]],
  70. //--- 报单级别配置表
  71. 'declarationLevel' => ['table' => 'AR_DECLARATION_LEVEL', 'field' => [
  72. 'ID',
  73. 'LEVEL_NAME',
  74. 'PERF',
  75. 'QY_PERCENT',
  76. 'QY_TOUCH_CAP',
  77. 'QY_BIG_CAP',
  78. 'SORT',
  79. 'CREATED_AT',
  80. 'INCOME_CAP',
  81. ]],
  82. //--- 级别配置表
  83. 'employLevel' => ['table' => 'AR_EMPLOY_LEVEL', 'field' => [
  84. 'ID',
  85. 'LEVEL_NAME',
  86. 'CREATED_AT',
  87. 'BS_PERCENT',
  88. 'LEVEL_SORT',
  89. 'TOURISM_PERCENT',
  90. 'GARAGE_PERCENT',
  91. 'ACHIEVE_PV',
  92. 'ACHIEVE_MEMBER_NUM',
  93. 'ACHIEVE_PERF_PV',
  94. ], 'alias' => [
  95. 'LEVEL_SORT' => 'SORT',
  96. ]],
  97. //--- 报单中心级别配置表
  98. 'decRole' => ['table' => 'AR_DEC_ROLE', 'field' => [
  99. 'ID',
  100. 'ROLE_NAME',
  101. 'FW_BONUS_PERCENT',
  102. 'SORT',
  103. 'CREATED_AT',
  104. ]],
  105. //--- 安置网络表
  106. 'userNetwork' => ['table' => 'AR_USER_NETWORK_NEW', 'field' => [
  107. 'ID',
  108. 'USER_ID',
  109. 'PARENT_UID',
  110. // 'LOCATION_TAG',
  111. 'RELATIVE_LOCATION',
  112. // 'TOP_UID',
  113. // 'TOP_DEEP',
  114. // 'PARENT_UIDS',
  115. 'CREATED_AT',
  116. // 'UPDATED_AT',
  117. ]],
  118. //--- 星级配置表
  119. 'starCrownLevel' => ['table' => 'AR_CROWN_LEVEL', 'field' => [
  120. 'ID',
  121. 'LEVEL_NAME',
  122. 'MIN_LEVEL_ID',
  123. 'LEVEL_SCORE',
  124. 'UPGRADE_SCORE',
  125. 'SORT',
  126. 'TOURISM_PERCENT',
  127. 'VILLA_PERCENT',
  128. 'GARAGE_PERCENT',
  129. 'CREATED_AT',
  130. ]],
  131. //--- 业绩单表
  132. 'perfOrder' => ['separately' => true, 'table' => 'AR_PERF_ORDER', 'field' => [
  133. 'ID',
  134. 'SN',
  135. // 'PERF_TYPE',
  136. 'DEC_TYPE',
  137. 'USER_ID',
  138. 'PV',
  139. 'PERIOD_NUM',
  140. 'CALC_MONTH',
  141. 'DEC_USER_ID',
  142. 'CREATED_AT',
  143. 'ORDER_AMOUNT',
  144. 'PAY_TYPE',
  145. 'FROM_TABLES',
  146. 'PAY_TYPE'
  147. ]],
  148. //--- 用户结余业绩表
  149. 'userPerf' => ['table' => 'AR_USER_PERF', 'field' => [
  150. 'ID',
  151. 'USER_ID',
  152. 'PV_PCS_ZC',
  153. 'PV_PCS_FX',
  154. 'PV_1L',
  155. 'PV_2L',
  156. 'PV_3L',
  157. 'PV_4L',
  158. 'PV_5L',
  159. 'CREATED_AT',
  160. 'PV_PSS',
  161. 'SURPLUS_1L',
  162. 'SURPLUS_1L_ZC',
  163. 'SURPLUS_1L_FX',
  164. 'SURPLUS_2L',
  165. 'SURPLUS_2L_ZC',
  166. 'SURPLUS_2L_FX',
  167. 'SURPLUS_3L',
  168. 'SURPLUS_3L_ZC',
  169. 'SURPLUS_3L_FX',
  170. 'SURPLUS_4L',
  171. 'SURPLUS_4L_ZC',
  172. 'SURPLUS_4L_FX',
  173. 'SURPLUS_5L',
  174. 'SURPLUS_5L_ZC',
  175. 'SURPLUS_5L_FX',
  176. 'PV_PSS_TOTAL',
  177. ]],
  178. // --- 报单订单表
  179. 'decOrder' => ['table' => 'AR_DEC_ORDER', 'field' => [
  180. 'ID',
  181. 'DEC_SN',
  182. 'ORDER_SN',
  183. 'USER_ID',
  184. 'TO_USER_ID',
  185. 'TYPE',
  186. 'IS_ADMIN',
  187. 'DEC_AMOUNT',
  188. 'PAID_WALLET',
  189. 'IS_BATCH',
  190. 'REMARK',
  191. 'REC_USER_ID',
  192. 'CON_USER_ID',
  193. 'PERIOD_NUM',
  194. 'P_CALC_MONTH',
  195. 'CALC_MONTH',
  196. 'CREATED_AT',
  197. 'UPDATER',
  198. 'UPDATED_AT',
  199. 'IS_DEL',
  200. 'DELETED_AT',
  201. 'DEC_ID',
  202. 'DETAIL_TYPE',
  203. 'UPGRADE_TYPE',
  204. 'ORI_LV',
  205. 'UPGRADE_LV',
  206. ]],
  207. //--- 团队奖明细表, 月节点的时候,需要将这个结算月的所有数据都同步过来
  208. 'calcBonusQy' => ['separately' => true, 'table' => 'AR_CALC_BONUS_QY', 'field' => [
  209. 'ID',
  210. 'USER_ID',
  211. 'LAST_DEC_LV',
  212. 'LAST_EMP_LV',
  213. 'LAST_CROWN_LV',
  214. 'LAST_STATUS',
  215. 'AMOUNT',
  216. 'PERIOD_NUM',
  217. 'CALC_YEAR',
  218. 'CALC_MONTH',
  219. 'LOGS',
  220. 'CREATED_AT',
  221. 'ORI_BONUS',
  222. 'RECONSUME_POINTS',
  223. 'MANAGE_TAX',
  224. 'ORI_CAPPED_BONUS_QY',
  225. 'IS_ACTIVE',
  226. 'HOPE_CROWN_LV',
  227. 'HOPE_BONUS',
  228. ]],
  229. //--- 用户结算月累计复消积分表,此表为新表,不传数据即代表没有扣除复消积分。 统计此结算月扣除的复消费积分总数,根据calc_bonus表 sum 一下复消积分字段即可。
  230. 'deductReconsume' => ['separately' => true, 'table' => 'AR_DEDUCT_RECONSUME', 'field' => [
  231. 'ID',
  232. 'USER_ID',
  233. 'CALC_MONTH',
  234. 'RECONSUME_POINTS_SUM',
  235. 'CREATED_AT',
  236. ]],
  237. //--- 期业绩表数据. 月节点的时候,计算月业绩,需要业务系统将ar_perf_period表此结算月的所有数据同步过来。
  238. 'perfPeriod' => ['separately' => true, 'table' => 'AR_PERF_PERIOD', 'field' => [
  239. 'ID',
  240. 'USER_ID',
  241. 'FX_AMOUNT_CASH',
  242. 'PV_PCS',
  243. 'PV_PCS_ZC',
  244. 'PV_PCS_FX',
  245. 'PV_PCS_FX_CASH',
  246. 'PV_PCS_FX_POINT',
  247. 'PV_1L',
  248. 'PV_1L_TOUCH',
  249. 'PV_1L_ZC',
  250. 'PV_1L_FX',
  251. 'PV_2L',
  252. 'PV_2L_TOUCH',
  253. 'PV_2L_ZC',
  254. 'PV_2L_FX',
  255. 'PV_3L',
  256. 'PV_3L_TOUCH',
  257. 'PV_3L_ZC',
  258. 'PV_3L_FX',
  259. 'PV_4L',
  260. 'PV_4L_TOUCH',
  261. 'PV_4L_ZC',
  262. 'PV_4L_FX',
  263. 'PV_5L',
  264. 'PV_5L_TOUCH',
  265. 'PV_5L_ZC',
  266. 'PV_5L_FX',
  267. 'SURPLUS_1L',
  268. 'SURPLUS_1L_ZC',
  269. 'SURPLUS_1L_FX',
  270. 'SURPLUS_2L',
  271. 'SURPLUS_2L_ZC',
  272. 'SURPLUS_2L_FX',
  273. 'SURPLUS_3L',
  274. 'SURPLUS_3L_ZC',
  275. 'SURPLUS_3L_FX',
  276. 'SURPLUS_4L',
  277. 'SURPLUS_4L_ZC',
  278. 'SURPLUS_4L_FX',
  279. 'SURPLUS_5L',
  280. 'SURPLUS_5L_ZC',
  281. 'SURPLUS_5L_FX',
  282. 'PERIOD_NUM',
  283. 'CALC_MONTH',
  284. 'CREATED_AT',
  285. 'PV_PSS',
  286. ]],
  287. //--- 期数配置表
  288. 'period' => ['separately' => true, 'table' => 'AR_PERIOD', 'field' => [
  289. 'ID',
  290. 'PERIOD_NUM',
  291. 'CALC_YEAR',
  292. 'CALC_MONTH',
  293. 'IS_MONTH',
  294. 'IS_PERFED',
  295. 'IS_CALCULATED',
  296. 'IS_PERFING',
  297. 'IS_CALCING',
  298. 'PERF_PERCENT',
  299. 'CALC_PERCENT',
  300. 'PERF_STARTED_AT',
  301. 'PERFED_AT',
  302. 'CALCULATE_STARTED_AT',
  303. 'CALCULATED_AT',
  304. 'CREATED_AT',
  305. 'CALC_ID',
  306. ]],
  307. //--- 月业绩表 只有当前结算月为季度最终月时才推
  308. 'perfMonth' => ['separately' => true, 'table' => 'AR_PERF_MONTH', 'field' => [
  309. 'ID',
  310. 'USER_ID',
  311. 'FX_AMOUNT_CASH',
  312. 'PV_PCS',
  313. 'PV_PCS_FX',
  314. 'PV_1L',
  315. 'PV_2L',
  316. 'PV_3L',
  317. 'PV_4L',
  318. 'PV_5L',
  319. 'PV_1L_TOTAL',
  320. 'PV_2L_TOTAL',
  321. 'PV_3L_TOTAL',
  322. 'PV_4L_TOTAL',
  323. 'PV_5L_TOTAL',
  324. 'CALC_MONTH',
  325. 'CREATED_AT',
  326. 'PV_PSS',
  327. 'PV_PSS_TOTAL',
  328. ]],
  329. //--- 推荐网络表
  330. 'userRelation' => ['table' => 'AR_USER_RELATION_NEW', 'field' => [
  331. 'ID',
  332. 'USER_ID',
  333. 'PARENT_UID',
  334. 'TOP_DEEP',
  335. 'CREATED_AT',
  336. ]],
  337. // --- 订单表
  338. 'order' => ['table' => 'AR_ORDER', 'field' => [
  339. 'ID',
  340. 'SN',
  341. 'DEC_SN',
  342. 'USER_ID',
  343. 'USER_NAME',
  344. 'ORDER_TYPE',
  345. 'ORDER_AMOUNT',
  346. 'PV',
  347. 'PAY_AMOUNT',
  348. 'PAY_PV',
  349. 'ORDER_AMOUNT_STANDARD',
  350. 'PAY_AMOUNT_STANDARD',
  351. 'EXCHANGE_RATE',
  352. 'PAY_AT',
  353. 'FREIGHT',
  354. 'PAY_FREIGHT',
  355. 'DELIVERY_STATUS',
  356. 'DELIVERY_PERIOD',
  357. 'DELIVERY_AT',
  358. 'EXPRESS_COMPANY',
  359. 'ORDER_TRACK_NO',
  360. 'EXPRESS_TYPE',
  361. 'FRONT_REMARK',
  362. 'REMARK',
  363. 'NOTE',
  364. 'PERIOD_NUM',
  365. 'STATUS',
  366. 'CONSIGNEE',
  367. 'MOBILE',
  368. 'TEL',
  369. 'PROVINCE',
  370. 'CITY',
  371. 'COUNTY',
  372. 'CITY_NAME',
  373. 'LGA_NAME',
  374. 'ADDRESS',
  375. 'P_CALC_MONTH',
  376. 'CREATED_AT',
  377. 'CREATE_USER',
  378. 'UPDATED_AT',
  379. 'UPDATER',
  380. 'IS_DELETE',
  381. 'DELETED_AT',
  382. 'PAY_TYPE',
  383. 'WAREHOUSE',
  384. 'EMAIL',
  385. 'REMAIN_PV',
  386. 'IS_AUTO',
  387. 'ORDER_CATEGORY',
  388. 'DEC_USER_ID',
  389. ]],
  390. // --- 订单商品表
  391. 'orderGoods' => ['table' => 'AR_ORDER_GOODS', 'field' => [
  392. 'ID',
  393. 'ORDER_SN',
  394. 'GOODS_ID',
  395. 'GOODS_TITLE',
  396. 'PRICE',
  397. 'REAL_PRICE',
  398. 'PV',
  399. 'REAL_PV',
  400. 'STANDARD_PRICE',
  401. 'EXCHANGE_RATE',
  402. 'TAX_RATE',
  403. 'REAL_STANDARD_PRICE',
  404. 'SKU_CODE',
  405. 'BUY_NUMS',
  406. 'P_CALC_MONTH',
  407. 'POINT',
  408. 'EMAIL',
  409. 'CATEGORY_TYPE',
  410. 'PAY_TYPE',
  411. 'REMAIN_PV',
  412. ]],
  413. // --- 商品表
  414. 'shopGoods' => ['table' => 'AR_SHOP_GOODS', 'field' => [
  415. 'ID',
  416. 'GOODS_NAME',
  417. 'CATE_ID',
  418. 'TYPE',
  419. 'GOODS_NO',
  420. 'UNIT',
  421. 'COVER',
  422. 'IMAGES',
  423. 'CONTENT',
  424. 'SELL_PRICE_STANDARD',
  425. 'PRICE_PV',
  426. 'STORE_NUMS',
  427. 'STATUS',
  428. 'CREATED_AT',
  429. 'UPDATED_AT',
  430. 'SORT',
  431. 'IS_DEL',
  432. 'DELETED_AT',
  433. 'POINT',
  434. 'SELL_TYPE',
  435. 'GIFT_TYPE',
  436. 'SELL_DISCOUNT',
  437. 'CATEGORY_TYPE',
  438. 'STATUS_DATE',
  439. 'GOODS_DATE',
  440. 'GOODS_STATUS_DATE',
  441. 'PV_SPLIT',
  442. 'INSTALMENT',
  443. ]],
  444. ];
  445. public function __construct($periodNum)
  446. {
  447. parent::__construct($periodNum);
  448. }
  449. public function start(): array
  450. {
  451. try {
  452. //清除业务系统本地数据(业绩相关)
  453. $this->clearBusinessData();
  454. //清理计算服务系统的基本数据表
  455. $this->clearSyncCalcTableData();
  456. //从业务系统推送数据到计算服务系统
  457. $this->initializeBaseInfo();
  458. // $db = $this->_calc_db_name;
  459. //todo 更新进度
  460. // \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['IS_PREPARE' => 1], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $this->_periodNum])->execute();
  461. } catch (\Exception $e) {
  462. return $this->fail('msg:' . $e->getMessage() . 'line:' . $e->getLine());
  463. }
  464. return $this->success();
  465. }
  466. public function clearBusinessData()
  467. {
  468. // 周业绩
  469. PerfPeriod::pageDeleteAll('PERIOD_NUM=' . $this->_periodNum);
  470. CalcRecord::record($this->_periodNum, "【基础数据】业务系统,AR_PERF_PERIOD表,已清除当期所有记录");
  471. // 业绩单
  472. // PerfOrder::pageDeleteAll('PERIOD_NUM=' . $this->_periodNum);
  473. // 删除活跃用户
  474. // PerfActiveUser::pageDeleteAll('PERIOD_NUM='.$this->_periodNum.' AND IS_SENT=0 ');
  475. // 月结时要清空的数据
  476. if ($this->_isCalcMonth) {
  477. // 月业绩表
  478. PerfMonth::pageDeleteAll("CALC_MONTH='{$this->_calcYearMonth}'");
  479. CalcRecord::record($this->_periodNum, "【基础数据】业务系统,是月结点,AR_PERF_MONTH表,已清除当月所有记录");
  480. //达标业绩表
  481. PerfStandard::pageDeleteAll("CALC_MONTH='{$this->_calcYearMonth}'");
  482. CalcRecord::record($this->_periodNum, "【基础数据】业务系统,是月结点,AR_PERF_STANDARD表,已清除当月所有记录");
  483. }
  484. }
  485. /**
  486. * 清理配置中的数据表数据
  487. * @return array
  488. */
  489. public function clearSyncCalcTableData(): array
  490. {
  491. $db = $this->_calc_db_name;
  492. $res = [];
  493. foreach (self::BASE_INFO_METHODS as $method => $val) {
  494. if (\Yii::$app->$db->createCommand("TRUNCATE TABLE {$val['table']}")->execute() !== false) {
  495. $res[] = $val['table'];
  496. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$val['table']."表,已清空");
  497. }
  498. }
  499. return $res;
  500. }
  501. public function initializeBaseInfo()
  502. {
  503. $db = $this->_calc_db_name;
  504. foreach (self::BASE_INFO_METHODS as $method => $val) {
  505. $table = self::BASE_INFO_METHODS[$method]['table'] ?? '';
  506. $fieldArray = self::BASE_INFO_METHODS[$method]['field'] ?? [];
  507. if (!empty($table) && !empty($fieldArray)) {
  508. if (!isset($val['separately'])) {
  509. $_offset = 0;
  510. A:
  511. if (isset($val['alias'])) {
  512. //如果业务表字段和计算服务表不同,则配置alias
  513. foreach ($val['alias'] as $org => $v) {
  514. $index = array_search($org, $fieldArray);
  515. $fieldArray[$index] = $v;
  516. }
  517. }
  518. $field = implode(',', $fieldArray);
  519. $model = 'common\models\\' . ucfirst($method);
  520. $where = '1=1';
  521. if ($table == 'AR_ORDER') {
  522. $periodObj = Period::instance();
  523. $calcYear = $periodObj->getYear($this->_periodNum);
  524. $calcMonth = $periodObj->getMonth($this->_periodNum);
  525. $periodList = $periodObj->getYearMonthAllPeriod($calcYear, $calcMonth);
  526. $periodList = implode("','", $periodList);
  527. $where = "IS_DELETE = 0 AND PERIOD_NUM IN ('{$periodList}')";
  528. }
  529. if ($table == 'AR_ORDER_GOODS') {
  530. $periodObj = Period::instance();
  531. $calcYear = $periodObj->getYear($this->_periodNum);
  532. $calcMonth = $periodObj->getMonth($this->_periodNum);
  533. $periodList = $periodObj->getYearMonthAllPeriod($calcYear, $calcMonth);
  534. $periodList = implode("','", $periodList);
  535. $orderSn = Order::find()->select('SN')->where("IS_DELETE = 0 AND PERIOD_NUM IN ('{$periodList}')")->column();
  536. $orderSn = implode("','", $orderSn);
  537. $where = "ORDER_SN IN ('{$orderSn}')";
  538. }
  539. $sql = $model::find()->select($field)->where($where)->limit($this->_limit)->offset($_offset * $this->_limit)->createCommand()->getRawSql();;
  540. if ($table == 'order' || $table == 'orderGoods') {
  541. echo 'runLog: ' . $sql;
  542. }
  543. $data = $model::find()->select($field)->where($where)->limit($this->_limit)->offset($_offset * $this->_limit)->asArray()->all();
  544. if (!empty($data)) {
  545. $_offset += 1;
  546. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  547. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入".count($data)."条记录");
  548. $data = null;
  549. goto A;
  550. }
  551. $data = null;
  552. } elseif (method_exists($this, $method) && $val['separately']) {
  553. $this->$method($table, $fieldArray, $db);
  554. }
  555. }
  556. }
  557. return true;
  558. }
  559. public function period($table, $fieldArray, $db)
  560. {
  561. $field = implode(',', $fieldArray);
  562. $where = ['PERIOD_NUM' => $this->_periodNum];
  563. if ($this->_isCalcMonth) {
  564. $where = ['CALC_YEAR' => $this->_calcYear, 'CALC_MONTH' => $this->_calcMonth];
  565. if (in_array($this->_calcMonth, [3, 6, 9, 12])) {
  566. $where['CALC_MONTH'] = [$this->_calcMonth, $this->_calcMonth - 1, $this->_calcMonth - 2];
  567. }
  568. }
  569. $data = Period::find()->select($field)
  570. ->where($where)
  571. ->asArray()->all();
  572. if (!empty($data)) {
  573. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  574. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".count($data)."条记录");
  575. }
  576. return true;
  577. }
  578. // public function user($table, $fieldArray, $db)
  579. // {
  580. // $field = '`' . implode('`, `', $fieldArray) . '`,null as LAST_EMP_LV';
  581. // $fieldArray[] = 'LAST_EMP_LV';
  582. // $_offset = 0;
  583. //
  584. // $forwardMonthPeriod = Period::find()
  585. // ->where('IS_MONTH=1 AND PERIOD_NUM<:PERIOD_NUM', [':PERIOD_NUM' => $this->_periodNum])
  586. // ->orderBy('PERIOD_NUM DESC')->asArray()->one();
  587. //
  588. // $forwardPeriodNum = $forwardMonthPeriod['PERIOD_NUM'];
  589. //
  590. //// $employeeLevelIds = CalcBonusBS::findAllAsArray(
  591. //// 'PERIOD_NUM=:PERIOD_NUM ', [':PERIOD_NUM' => $forwardPeriodNum]
  592. //// );
  593. //
  594. // $employeeLevelIds = CalcBonusBS::find()->where(
  595. // 'PERIOD_NUM=:PERIOD_NUM ', [':PERIOD_NUM' => $forwardPeriodNum]
  596. // )->select('USER_ID,LEVEL_ID')->asArray()->all();
  597. //
  598. // if (!empty($employeeLevelIds)) {
  599. // $employeeLevelIds = array_column($employeeLevelIds, null, 'USER_ID'); // 当前蓝星奖计算(即管理奖) 的等级
  600. // }
  601. //
  602. // $noLevelId = EmployLevel::NO_LEVEL_ID;
  603. //
  604. // user:
  605. // $offset = $_offset * $this->_limit;
  606. // $data = ActiveRecord::findBySql("SELECT $field from AR_USER limit $this->_limit offset $offset;")->asArray()->all();
  607. //
  608. // if (!empty($data)) {
  609. // foreach ($data as $k => $v) {
  610. // $data[$k]['LAST_EMP_LV'] = $noLevelId;
  611. // if (isset($employeeLevelIds[$v['ID']])) {
  612. // $data[$k]['LAST_EMP_LV'] = $employeeLevelIds[$v['ID']]['LEVEL_ID'] ?? 0;
  613. // }
  614. // }
  615. // $_offset += 1;
  616. // \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  617. //
  618. // $data = null;
  619. // goto user;
  620. // }
  621. // $data = null;
  622. // $employeeLevelIds = null;
  623. //
  624. // return true;
  625. // }
  626. public function calcBonusQy($table, $fieldArray, $db): bool
  627. {
  628. if (!$this->_isCalcMonth) {
  629. return true;
  630. }
  631. $periodNum = $this->_periodNum;
  632. $currentPeriod = Period::getInfoByPeriodNum($periodNum);
  633. //判断是否月节点
  634. if ($currentPeriod['IS_MONTH']) {
  635. if (in_array($currentPeriod['CALC_MONTH'], [3,6,9,12])){ // 如果是季度尾
  636. $periodNum = Period::getCurrentQuarterPeriodByPeriodNum($periodNum);
  637. }else{
  638. $periodNum = Period::getCurrentMonthPeriodByPeriodNum($periodNum);
  639. }
  640. }
  641. $field = implode(',', $fieldArray);
  642. $data = CalcBonusQY::find()->select($field)->where(['PERIOD_NUM' => $periodNum])->asArray()->all();
  643. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  644. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".count($data)."条记录");
  645. $data = null;
  646. return true;
  647. }
  648. public function deductReconsume($table, $fieldArray, $db): bool
  649. {
  650. $data = CalcBonus::find()
  651. ->where('CALC_MONTH=:CALC_MONTH', [':CALC_MONTH' => $this->_calcYearMonth])
  652. ->select(['ID', 'USER_ID', 'CALC_MONTH', 'SUM(RECONSUME_POINTS)', 'CREATED_AT'])
  653. ->groupBy(['USER_ID'])->having(['>', 'SUM(RECONSUME_POINTS)', 0])
  654. ->asArray()
  655. ->all();
  656. if (!empty($data)) {
  657. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  658. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".count($data)."条记录");
  659. }
  660. $data = null;
  661. return true;
  662. }
  663. public function perfPeriod($table, $fieldArray, $db): bool
  664. {
  665. if (!$this->_isCalcMonth) {
  666. return true;
  667. }
  668. $field = implode(',', $fieldArray);
  669. $data = PerfPeriod::find()
  670. ->where('CALC_MONTH=:CALC_MONTH', [':CALC_MONTH' => $this->_calcYearMonth])
  671. ->select($field)
  672. ->asArray()
  673. ->all();
  674. if (!empty($data)) {
  675. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  676. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".count($data)."条记录");
  677. }
  678. $data = null;
  679. return true;
  680. }
  681. public function perfOrder($table, $fieldArray, $db): bool
  682. {
  683. $_offset = 0;
  684. $countPerfOrder = 0;
  685. $field = "ID,SN,DEC_TYPE, USER_ID,PV,
  686. PERIOD_NUM, CALC_MONTH,DEC_USER_ID,
  687. CREATED_AT,DEC_AMOUNT as ORDER_AMOUNT,PAY_TYPE,FROM_TABLES,PAY_TYPE";
  688. $periodNum = $this->_periodNum;
  689. $currentPeriod = Period::getInfoByPeriodNum($periodNum);
  690. //判断是否月节点
  691. if ($currentPeriod['IS_MONTH']) {
  692. $periodNum = Period::getCurrentMonthPeriodByPeriodNum($periodNum);
  693. }
  694. //结算月
  695. perfOrder:
  696. $offset = $_offset * $this->_limit;
  697. $data = PerfOrder::find()->select($field)->where(['PERIOD_NUM' => $periodNum])
  698. ->offset($offset)->limit($this->_limit)->asArray()->all();
  699. if (!empty($data)) {
  700. $_offset += 1;
  701. $countPerfOrder += count($data);
  702. $fieldArray = array_keys(current($data));
  703. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  704. $data = null;
  705. goto perfOrder;
  706. }
  707. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".$countPerfOrder."条记录");
  708. $data = null;
  709. return true;
  710. }
  711. protected function decOrder($calcMonth, $offset = 0): bool
  712. {
  713. $field = "ID,ORDER_SN as SN,'ZC' as PERF_TYPE, TO_USER_ID as USER_ID,DEC_PV as PV,
  714. PERIOD_NUM, '$calcMonth' as CALC_MONTH,USER_ID as DEC_USER_ID,
  715. CREATED_AT,DEC_AMOUNT as ORDER_AMOUNT, PAID_WALLET as PAY_TYPE,'AR_DEC_ORDER'";
  716. $data = ActiveRecord::findBySql("SELECT $field from AR_DEC_ORDER;")
  717. ->where("PERIOD_NUM=:PERIOD_NUM AND IS_DEL=0 AND TYPE='ZC'", [':PERIOD_NUM' => $this->_periodNum])->asArray()->all();
  718. $this->perfOrderInsert($data);
  719. $data = null;
  720. return true;
  721. }
  722. protected function orderDec($calcMonth, $offset = 0): bool
  723. {
  724. $field = "od.ID,od.SN,'ZC' as TYPE,od.USER_ID,od.PAY_PV,
  725. od.PERIOD_NUM, '$calcMonth' as CALC_MONTH,
  726. u.DEC_ID as DEC_USER_ID,
  727. od.CREATED_AT,od.PAY_AMOUNT as ORDER_AMOUNT, od.PAY_TYPE,'AR_ORDER_DEC'";
  728. $data = ActiveRecord::findBySql("SELECT $field from AR_ORDER_DEC as od left join AR_USER as u on od.USER_ID=u.ID;")
  729. ->where("PERIOD_NUM=:PERIOD_NUM AND IS_DEL=0 AND TYPE='ZC'", [':PERIOD_NUM' => $this->_periodNum])->asArray()->all();
  730. $this->perfOrderInsert($data);
  731. $data = null;
  732. return true;
  733. }
  734. protected function order($calcMonth, $offset = 0): bool
  735. {
  736. $field = "od.ID,od.SN,'FX' as TYPE,od.USER_ID,od.PAY_PV,
  737. od.PERIOD_NUM, '$calcMonth' as CALC_MONTH,
  738. '' as DEC_USER_ID,
  739. od.CREATED_AT,od.PAY_AMOUNT as ORDER_AMOUNT, od.PAY_TYPE,'AR_ORDER'";
  740. $data = ActiveRecord::findBySql("SELECT $field from AR_ORDER as od;")
  741. ->where("PERIOD_NUM=:PERIOD_NUM AND IS_DELETE=0 AND ORDER_TYPE=:ORDER_TYPE",
  742. [':PERIOD_NUM' => $this->_periodNum, ':ORDER_TYPE' => DeclarationForm::TYPE_FX])
  743. ->asArray()->all();
  744. $this->perfOrderInsert($data);
  745. $data = null;
  746. return true;
  747. }
  748. protected function orderShop($calcMonth, $offset = 0): bool
  749. {
  750. $field = "od.ID,od.SN,'FX' as TYPE,od.USER_ID,od.PAY_PV,
  751. od.PERIOD_NUM, '$calcMonth' as CALC_MONTH,
  752. '' as DEC_USER_ID,
  753. od.CREATED_AT,od.PAY_AMOUNT as ORDER_AMOUNT, od.PAY_TYPE,'AR_ORDER_SHOP'";
  754. $data = ActiveRecord::findBySql("SELECT $field from AR_ORDER_SHOP as od;")
  755. ->where("PERIOD_NUM=:PERIOD_NUM AND IS_DELETE=0 AND ORDER_TYPE=:ORDER_TYPE",
  756. [':PERIOD_NUM' => $this->_periodNum, ':ORDER_TYPE' => DeclarationForm::TYPE_FX])
  757. ->asArray()->all();
  758. $this->perfOrderInsert($data);
  759. $data = null;
  760. return true;
  761. }
  762. /**
  763. * @param $data
  764. * @return void
  765. */
  766. private function perfOrderInsert($data): void
  767. {
  768. $db = $this->_calc_db_name;
  769. $table = self::BASE_INFO_METHODS['perfOrder']['table'] ?? '';
  770. $fieldArray = self::BASE_INFO_METHODS['perfOrder']['field'] ?? [];
  771. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  772. }
  773. public function perfMonth($table, $fieldArray, $db)
  774. {
  775. if (!$this->_isCalcMonth && !in_array($this->_calcMonth, [3, 6, 9, 12])) {
  776. return true;
  777. }
  778. $_offset = 0;
  779. $countPerfMonth = 0;
  780. $field = implode(',', $fieldArray);
  781. $months = $this->getMonthsByPeriodNum($this->_periodNum);
  782. //结算月
  783. perfMonth:
  784. $offset = $_offset * $this->_limit;
  785. $data = PerfMonth::find()->where(['CALC_MONTH' => $months])
  786. ->offset($offset)->limit($this->_limit)->select($field)->asArray()->all();
  787. if (!empty($data)) {
  788. $_offset += 1;
  789. $countPerfMonth += count($data);
  790. $fieldArray = array_keys(current($data));
  791. \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
  792. $data = null;
  793. goto perfMonth;
  794. }
  795. CalcRecord::record($this->_periodNum, "【基础数据】计算服务系统,".$table."表,插入 ".$countPerfMonth."条记录");
  796. $data = null;
  797. return true;
  798. }
  799. }