PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/braldahim/library/Bral/Batchs/CreationMinerais.php

https://github.com/Canop/braldahim
PHP | 340 lines | 268 code | 62 blank | 10 comment | 54 complexity | e2fcea2d234de2463b3ac089c603b868 MD5 | raw file
  1. <?php
  2. /**
  3. * This file is part of Braldahim, under Gnu Public Licence v3.
  4. * See licence.txt or http://www.gnu.org/licenses/gpl-3.0.html
  5. * Copyright: see http://www.braldahim.com/sources
  6. */
  7. class Bral_Batchs_CreationMinerais extends Bral_Batchs_Batch {
  8. const MIN_SOL = 10;
  9. const MAX_SOL = 20;
  10. const MIN_SOUS_SOL = 40;
  11. const MAX_SOUS_SOL = 160;
  12. const COEF_QUANTITE_SOUS_SOL = 1;
  13. public function calculBatchImpl() {
  14. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - calculBatchImpl - enter -");
  15. Zend_Loader::loadClass('CreationMinerais');
  16. Zend_Loader::loadClass('Filon');
  17. Zend_Loader::loadClass('TypeMinerai');
  18. Zend_Loader::loadClass('Zone');
  19. $retour = null;
  20. $retour .= $this->calculCreation(0);
  21. $retour .= $this->calculCreation(-10);
  22. $retour .= $this->calculCreation(-11);
  23. $retour .= $this->calculCreation(-12);
  24. $retour .= $this->calculCreation(-13);
  25. $retour .= $this->suppressionSurEau();
  26. $retour .= $this->suppressionSurLieux();
  27. $retour .= $this->suppressionSurPalissades();
  28. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - calculBatchImpl - exit -");
  29. return $retour;
  30. }
  31. private function suppressionSurEau() {
  32. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurEau - enter -");
  33. $retour = "";
  34. // Suppression des filons partout où il y a une eau
  35. Zend_Loader::loadClass("Eau");
  36. $eauTable = new Eau();
  37. $filonTable = new Filon();
  38. $nbEaux = $eauTable->countAll();
  39. $limit = 1000;
  40. $where = "";
  41. for ($offset = 0; $offset <= $nbEaux + $limit; $offset = $offset + $limit) {
  42. $eaux = $eauTable->fetchall(null, null, $limit, $offset);
  43. $nb = 0;
  44. $where = "";
  45. foreach($eaux as $r) {
  46. $or = "";
  47. if ($where != "") {
  48. $or = " OR ";
  49. }
  50. $where .= $or." (x_filon = ".$r["x_eau"]. " AND y_filon = ".$r["y_eau"]." AND z_filon = ".$r["z_eau"].") ";
  51. $nb++;
  52. if ($nb == $limit) {
  53. $filonTable->delete($where);
  54. $nb = 0;
  55. $where = "";
  56. }
  57. }
  58. if ($where != "") {
  59. $filonTable->delete($where);
  60. }
  61. }
  62. if ($where != "") {
  63. $filonTable->delete($where);
  64. }
  65. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurEau - exit -");
  66. return $retour;
  67. }
  68. private function suppressionSurLieux() {
  69. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurLieux - enter -");
  70. $retour = "";
  71. // Suppression des filons partout où il y a une eau
  72. Zend_Loader::loadClass("Lieu");
  73. $lieuTable = new Lieu();
  74. $filonTable = new Filon();
  75. $nblieux = $lieuTable->countAll();
  76. $limit = 1000;
  77. $where = "";
  78. for ($offset = 0; $offset <= $nblieux + $limit; $offset = $offset + $limit) {
  79. $lieux = $lieuTable->fetchall(null, null, $limit, $offset);
  80. $nb = 0;
  81. $where = "";
  82. foreach($lieux as $r) {
  83. $or = "";
  84. if ($where != "") {
  85. $or = " OR ";
  86. }
  87. $where .= $or." (x_filon = ".$r["x_lieu"]. " AND y_filon = ".$r["y_lieu"]." AND z_filon = ".$r["z_lieu"].") ";
  88. $nb++;
  89. if ($nb == $limit) {
  90. $filonTable->delete($where);
  91. $nb = 0;
  92. $where = "";
  93. }
  94. }
  95. if ($where != "") {
  96. $filonTable->delete($where);
  97. }
  98. }
  99. if ($where != "") {
  100. $filonTable->delete($where);
  101. }
  102. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurLieux - exit -");
  103. return $retour;
  104. }
  105. private function suppressionSurPalissades() {
  106. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurPalissades - enter -");
  107. $retour = "";
  108. // Suppression des filons partout où il y a une eau
  109. Zend_Loader::loadClass("Palissade");
  110. $palissadeTable = new Palissade();
  111. $filonTable = new Filon();
  112. $nbPalissades = $palissadeTable->countAll();
  113. $limit = 1000;
  114. $where = "";
  115. for ($offset = 0; $offset <= $nbPalissades + $limit; $offset = $offset + $limit) {
  116. $palissades = $palissadeTable->fetchall(null, null, $limit, $offset);
  117. $nb = 0;
  118. $where = "";
  119. foreach($palissades as $r) {
  120. $or = "";
  121. if ($where != "") {
  122. $or = " OR ";
  123. }
  124. $where .= $or." (x_filon = ".$r["x_palissade"]. " AND y_filon = ".$r["y_palissade"]." AND z_filon = ".$r["z_palissade"].") ";
  125. $nb++;
  126. if ($nb == $limit) {
  127. $filonTable->delete($where);
  128. $nb = 0;
  129. $where = "";
  130. }
  131. }
  132. if ($where != "") {
  133. $filonTable->delete($where);
  134. }
  135. }
  136. if ($where != "") {
  137. $filonTable->delete($where);
  138. }
  139. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - suppressionSurPalissades - exit -");
  140. return $retour;
  141. }
  142. private function calculCreation($zposition) {
  143. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - calculCreation - enter -");
  144. $retour = "";
  145. $zoneTable = new Zone();
  146. $creationMineraisTable = new CreationMinerais();
  147. $creationMinerais = $creationMineraisTable->fetchAll(null, "id_fk_type_minerai_creation_minerais");
  148. $nbCreationMinerais = count($creationMinerais);
  149. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - nbCreationMinerais=" .$nbCreationMinerais);
  150. $typeMineraiTable = new TypeMinerai();
  151. $typeMinerais = $typeMineraiTable->fetchAll();
  152. $nbTypeMinerais = count($typeMinerais);
  153. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - nbTypeMinerais=" .$nbTypeMinerais);
  154. // selection des environnements / zones concernes
  155. $environnementIds = $this->getEnvironnementsConcernes($creationMinerais);
  156. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - nb environnement concernes=" .count($environnementIds));
  157. $zones = $zoneTable->findByIdEnvironnementList($environnementIds, false);
  158. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - nb zones concernees=" .count($zones));
  159. $filonTable = new Filon();
  160. $tmp = "";
  161. $superficieZones = array();
  162. $superficieTotale = array();
  163. foreach($creationMinerais as $c) {
  164. // on recupere la supercifie totale de toutes les zones concernees par ce type
  165. foreach($zones as $z) {
  166. if ($z["id_fk_environnement_zone"] == $c["id_fk_environnement_creation_minerais"]) {
  167. $superficieZones[$z["id_zone"]] = ($z["x_max_zone"] - $z["x_min_zone"]) * ($z["y_max_zone"] - $z["y_min_zone"]);
  168. if (array_key_exists($c["id_fk_type_minerai_creation_minerais"], $superficieTotale)) {
  169. $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]] = $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]] + ( $superficieZones[$z["id_zone"]] );
  170. } else {
  171. $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]] = $superficieZones[$z["id_zone"]];
  172. }
  173. }
  174. }
  175. }
  176. foreach($creationMinerais as $c) {
  177. $t = null;
  178. foreach($typeMinerais as $type) {
  179. if ($c["id_fk_type_minerai_creation_minerais"] == $type["id_type_minerai"]) {
  180. $t = $type;
  181. break;
  182. }
  183. }
  184. if ($t != null) {
  185. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - traitement du minerai ".$t["id_type_minerai"]. " nbMaxMonde(".$t["nb_creation_type_minerai"].") environnement(".$c["id_fk_environnement_creation_minerais"].") suptotal(". $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]].")");
  186. foreach($zones as $z) {
  187. if ($z["id_fk_environnement_zone"] == $c["id_fk_environnement_creation_minerais"]) {
  188. $tmp = "";
  189. $nbCreation = ceil($t["nb_creation_type_minerai"] * ($superficieZones[$z["id_zone"]] / $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]]));
  190. $nbActuel = $filonTable->countVue($z["x_min_zone"], $z["y_min_zone"], $z["x_max_zone"], $z["y_max_zone"], $zposition, $t["id_type_minerai"]);
  191. if ($zposition != 0) {
  192. $nbCreation = intval($nbCreation * self::COEF_QUANTITE_SOUS_SOL);
  193. }
  194. $aCreer = $nbCreation - $nbActuel;
  195. if ($aCreer <= 0) {
  196. $tmp = " deja pleine";
  197. }
  198. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - zone(".$z["id_zone"].") nbActuel:".$nbActuel. " max:".$nbCreation.$tmp. " supzone(".$superficieZones[$z["id_zone"]].") suptotal(". $superficieTotale[$c["id_fk_type_minerai_creation_minerais"]].")");
  199. if ($aCreer > 0) {
  200. $retour .= $this->insert($t["id_type_minerai"], $z, $aCreer, $filonTable, $zposition);
  201. } else {
  202. $retour .= "zone(".$z["id_zone"].") pleine de minerai(".$t["id_type_minerai"].") nbActuel(".$nbActuel.") max(".$nbCreation."). ";
  203. $retour .= $this->supprime($t["id_type_minerai"], $z, $nbActuel, 0 - $aCreer, $filonTable, $zposition);
  204. }
  205. }
  206. }
  207. }
  208. }
  209. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - calculCreation - exit -");
  210. return $retour;
  211. }
  212. private function getEnvironnementsConcernes($creationMinerais) {
  213. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - getEnvironnementsConcernes - enter -");
  214. $environnementIds = null;
  215. foreach($creationMinerais as $n) {
  216. $environnementIds[$n["id_fk_environnement_creation_minerais"]] = $n["id_fk_environnement_creation_minerais"];
  217. }
  218. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - getEnvironnementsConcernes - exit -");
  219. return $environnementIds;
  220. }
  221. private function supprime($idTypeMinerai, $zone, $nbActuel, $aSupprimer, $filonTable, $zposition) {
  222. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - supprime - enter - idtype(".$idTypeMinerai.") idzone(".$zone['id_zone'].") aSupprimer(".$aSupprimer.")");
  223. $retour = "minerai(".$idTypeMinerai.") idzone(".$zone['id_zone'].") aSupprimer(".$aSupprimer."). ";
  224. if ($aSupprimer <= 0) {
  225. return $retour;
  226. }
  227. $filons = $filonTable->selectVue($zone["x_min_zone"], $zone["y_min_zone"], $zone["x_max_zone"], $zone["y_max_zone"], $zposition, $idTypeMinerai);
  228. shuffle($filons);
  229. $total = count($filons);
  230. $nb = 0;
  231. $where = "";
  232. for($i = 1; $i <= $aSupprimer; $i++) {
  233. $or = "";
  234. if ($where != "") {
  235. $or = " OR ";
  236. }
  237. $filon = array_pop($filons);
  238. $where .= $or."id_filon=".$filon["id_filon"];
  239. $nb++;
  240. if ($nb == 1000) {
  241. $filonTable->delete($where);
  242. $nb = 0;
  243. $where = "";
  244. }
  245. }
  246. if ($where != "") {
  247. $filonTable->delete($where);
  248. }
  249. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - supprime - exit -");
  250. return $retour;
  251. }
  252. private function insert($idTypeMinerai, $zone, $aCreer, $filonTable, $zposition) {
  253. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - insert - enter - idtype(".$idTypeMinerai.") idzone(".$zone['id_zone'].") nbACreer(".$aCreer.")");
  254. $retour = "minerai(".$idTypeMinerai.") idzone(".$zone['id_zone'].") aCreer(".$aCreer."). ";
  255. for($i = 1; $i <= $aCreer; $i++) {
  256. usleep(Bral_Util_De::get_de_specifique(2000, 700000));
  257. $x = Bral_Util_De::get_de_specifique($zone["x_min_zone"], $zone["x_max_zone"]);
  258. usleep(Bral_Util_De::get_de_specifique(5000, 700000));
  259. $y = Bral_Util_De::get_de_specifique($zone["y_min_zone"], $zone["y_max_zone"]);
  260. if ($zposition == 0) {
  261. $quantite = Bral_Util_De::get_de_specifique(self::MIN_SOL, self::MAX_SOL);
  262. } else {
  263. $quantite = Bral_Util_De::get_de_specifique(self::MIN_SOUS_SOL, self::MAX_SOUS_SOL);
  264. }
  265. $data = array(
  266. 'id_fk_type_minerai_filon' => $idTypeMinerai,
  267. 'x_filon' => $x,
  268. 'y_filon' => $y,
  269. 'z_filon' => $zposition,
  270. 'quantite_restante_filon' => $quantite,
  271. 'quantite_max_filon' => $quantite
  272. );
  273. $filonTable->insert($data);
  274. }
  275. Bral_Util_Log::batchs()->trace("Bral_Batchs_CreationMinerais - insert - exit -");
  276. return $retour;
  277. }
  278. }