wincan2ctrl.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. '''
  2. Met à jour la base controle avec les données d'un chantier Wincan
  3. olivier.massot, mai 2018
  4. '''
  5. import logging
  6. from path import Path
  7. from core import logconf
  8. from core.db import AccessSqlHelper
  9. from core.pde import ControlesDb, WincanDb, CommunDb, InspectionTronconWincan
  10. from core.sqlformatter import SqlFormatter
  11. logger = logging.getLogger("wincan2ctrl")
  12. logconf.start("wincan2ctrl", logging.DEBUG)
  13. # # POUR TESTER, décommenter les lignes suivantes
  14. # > Lancer le script /resources/test_wincan2ctrl.py pour reinitialiser les données de la base de test
  15. ##-----------------------------------------------
  16. ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
  17. WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.mdb")
  18. CommunDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Commun_Data.mdb")
  19. logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  20. logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
  21. ##-----------------------------------------------
  22. logger.info("Initialisation...")
  23. Sql = SqlFormatter()
  24. sqlHelper = AccessSqlHelper
  25. chantier = 185000
  26. interv = 1
  27. commande_id = 1
  28. # Connexion à Controles
  29. controles_db = ControlesDb(autocommit=False)
  30. # Connexion à Wincan
  31. wincan_db = WincanDb(autocommit=False)
  32. # Connexion à CommunDb
  33. commun_db = CommunDb(autocommit=False)
  34. def get_lib(tbl_id, lib_id):
  35. return wincan_db.first(Sql.format("""SELECT LIB_ID, LIB_LIB, TLB_ID
  36. FROM LISTE_LIBELLE_WINCAN
  37. WHERE TLB_ID='{}' AND LIB_ID={}""", tbl_id, lib_id)).LIB_LIB
  38. def get_materiau(wincan_id):
  39. return controles_db.first(Sql.format("""SELECT strMateriauCourt
  40. FROM tblMateriaux
  41. WHERE strWincanId='{}'""", wincan_id)).strMateriauCourt
  42. logger.info("# Traitement du chantier %s, intervention %s", chantier, interv)
  43. sql = """SELECT SI_InspName, Max(SI_Date) AS DateMax, SI_Spare1, SI_Spare2
  44. FROM SI_T
  45. GROUP BY SI_InspName, SI_Spare1, SI_Spare2
  46. HAVING SI_spare1 Is Null OR Len([SI_spare1])=0
  47. ORDER BY Max(SI_T.SI_Date) DESC
  48. """
  49. for nontraite in wincan_db.read(sql):
  50. # Liste les inspections pas encore traitées
  51. sql = """SELECT SI_T.SI_InspName, Sum(S_T.S_Sectionlength) AS Long_insp, Min(SI_T.SI_Date) AS mindate, Max(SI_T.SI_Date) AS maxdate, Max(SI_T.SI_Operator) AS Equipe, Max(SI_T.SI_Vehicle) AS Mat, Max(SI_T.SI_InspMethod) AS InspMethod, Max(SI_T.SI_ReasonOfInspection) AS MaxDeSI_ReasonOfInspection, Min(S_T.S_SectionPurpose) AS nature, Min(S_T.S_SectionUse) AS Fonction, Min(S_T.S_SectionType) AS Type
  52. FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
  53. GROUP BY SI_T.SI_InspName
  54. HAVING Sum(S_T.S_Sectionlength) Is Not Null AND Max(SI_T.SI_Operator) Is Not Null AND Max(SI_T.SI_Vehicle) Is Not Null AND Max(SI_T.SI_InspMethod) Is Not Null AND SI_InspName='{}'
  55. """.format(nontraite.SI_InspName)
  56. for inspection in wincan_db.read(sql):
  57. reason_lib = get_lib("SI_REASONOfINSPECTION", inspection.SI_ReasonOfInspection)
  58. # insère les inspections dans la table tblVideoIntervs de Controles
  59. logger.info("Mise à jour de tblVideoIntervs")
  60. sql = """INSERT INTO tblVideoIntervs ( lngChantierId, bytIntervId, dtmIntervDu, dtmIntervAu, strEquipeId, intlMaterielID, bytCommandeId, lngTroncon, SI_InspMethod, SI_ReasonOfInspection )
  61. SELECT {} AS chantier, {} AS interv, {} AS mindate, {} AS maxdate, {} AS equipe, {} AS mat, {} AS commande, {} AS long_insp, {} AS methode, {} AS reason
  62. """.format(chantier, interv, inspection.mindate, inspection.maxdate, inspection.Equipe, inspection.Mat, commande_id, inspection.long_insp, inspection.InspMethod, reason_lib)
  63. controles_db.execute(sql)
  64. # Met a jour les champs SI_Spare1 et SI_Spare2 de la table Wincan pour marquer les lignes comme importées
  65. logger.info("Mise à jour en retour de SI_T")
  66. sql = "update SI_T set SI_Spare1={}, SI_Spare2={} where SI_InspName='{}'".format(chantier, interv, inspection.SI_InspName)
  67. wincan_db.execute(sql)
  68. # Met a jour la table tbl_so_rate de Controles
  69. logger.info("Traitement des inspections de tronçons")
  70. # Extrait les données des tronçons
  71. sql = """SELECT SI_T.SI_ID, S_T.S_ID, SI_T.SI_InspName, SI_T.SI_Spare1, SI_T.SI_Spare2, SI_T.SI_AutoNumber, SI_T.SI_MediaNumber1, S_T.S_SectionFlow,
  72. S_T.S_StartNode, S_T.S_EndNode, S_T.S_StartNodeType, S_T.S_EndNodeType, S_T.S_StartNodeCoord_Z, S_T.S_EndNodeCoord_Z,
  73. S_T.S_Sectionlength, S_T.S_SectionPurpose, S_T.S_SectionUse, S_T.S_SectionType, S_T.S_PipeMaterial, S_T.S_YearLayed,
  74. S_T.S_PipeDia, S_T.S_Situation, S_T.S_Spare1, S_T.S_PipeShape, S_T.S_Pipelength, S_T.S_Spare3,
  75. SI_T.SI_Spare0 AS Test_ecoulement, SI_T.SI_Date
  76. FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
  77. """
  78. for data in wincan_db.read(sql):
  79. logger.info("* Traitement de %s (S_ID: %s)", data.SI_InspName, data.S_ID)
  80. inspection = InspectionTronconWincan()
  81. inspection.s_guid = data.S_ID
  82. inspection.si_guid = data.SI_ID
  83. inspection.nom_chantier = data.SI_InspName
  84. inspection.lng_chantier_id = data.SI_Spare1
  85. inspection.byt_interv_id = data.SI_Spare2
  86. inspection.si_autonumber = data.SI_AutoNumber
  87. inspection.classement_troncons = data.SI_MediaNumber1
  88. inspection.nom_troncon = ("{0}-{1}" if data.S_SectionFlow == 2 else "{1}-{0}").format(data.S_StartNode, data.S_EndNode)
  89. inspection.startnode_type = get_lib(data.S_T.S_StartNodeType, "S_StartNodeType")
  90. inspection.endnode_type = get_lib(data.S_T.S_StartNodeType, "S_EndNodeType")
  91. inspection.sens_ecoul = ">>" if data.S_SectionFlow == '1' else ('<<' if data.S_SectionFlow == '2' else '')
  92. inspection.startnode_z = data.S_StartNodeCoord_Z
  93. inspection.endnode_z = data.S_EndNodeCoord_Z
  94. inspection.section_length = data.S_Sectionlength
  95. inspection.section_purpose = data.S_SectionPurpose
  96. inspection.section_use = data.S_SectionUse
  97. inspection.section_type = data.S_SectionType
  98. inspection.materiau = get_materiau(data.S_PipeMaterial)
  99. inspection.annee_pose = data.S_YearLayed
  100. inspection.diametre = get_lib(data.S_PipeDia, "S_PipeDia")
  101. inspection.route = get_lib(data.S_Situation, "S_Situation")
  102. inspection.n_route = data.S_Spare1
  103. inspection.pipe_shape = data.S_PipeShape
  104. inspection.pipe_length = data.S_Pipelength
  105. inspection.arbres = get_lib(data.S_Spare3, "S_Spare3")
  106. inspection.test_ecoulement = data.SI_Spare0
  107. inspection.si_date = data.SI_Date
  108. sql = """ SELECT SO_T.SO_ID, SO_T.SO_Rate, SO_T.SO_Photonumber1, SO_T.SO_Photonumber2
  109. FROM SO_T
  110. WHERE SO_T.SO_Inspecs_ID='{}'
  111. """.format(data.SI_ID)
  112. # Parcours les opérations réalisées au cours de l'inspection du tronçon
  113. for opdata in wincan_db.read(sql):
  114. inspection.nb_ops += 1
  115. if opdata.SO_Rate == 1:
  116. inspection.rate_1 += 1
  117. elif opdata.SO_Rate == 2:
  118. inspection.rate_2 += 1
  119. elif opdata.SO_Rate == 3:
  120. inspection.rate_3 += 1
  121. elif opdata.SO_Rate == 4:
  122. inspection.rate_4 += 1
  123. elif opdata.SO_Rate == 5:
  124. inspection.rate_5 += 1
  125. elif opdata.SO_Rate >= 6:
  126. logger.error("Attention: une valeur de [SO_Rate] supérieure à 5 a été enregistrée (SO_ID: %s)", opdata.SO_ID)
  127. if opdata.SO_Photonumber1:
  128. inspection.cpt_photos += 1
  129. if opdata.SO_Photonumber2:
  130. inspection.cpt_photos += 1
  131. logger.info("\t- Mise à jour de tblso_Rate_Analyse")
  132. sql = """INSERT INTO tblso_Rate_Analyse (
  133. lngChantierId, bytIntervId, SI_InspName, SI_AutoNumber,
  134. [Classement tronons], Nom_troncon, S_StartNodeType, Sens_ecoul, S_EndNodeType,
  135. S_PipeShape, MateriauCourt, SI_Date, nb_Arbres, ANNEE_POSE,
  136. Route, NRoute, Test_ecoulement, MaxDeS_StartNodeCoord_Z, MaxDeS_EndNodeCoord_Z,
  137. MaxDeS_Sectionlength, MaxDeS_Pipelength, MaxDeDiametre, cpt_Photos, [Total de SO_ID],
  138. 1, 2, 3, 4, 5
  139. )
  140. VALUES ({inspection.lng_chantier_id}, {inspection.byt_interv_id}, {inspection.nom_chantier}, {inspection.si_autonumber},
  141. {inspection.classement_troncons}, {inspection.nom_troncon}, {inspection.startnode_type}, {inspection.sens_ecoul}, {inspection.endnode_type},
  142. {inspection.pipe_shape}, {inspection.materiau}, {inspection.si_date}, {inspection.arbres}, {inspection.annee_pose},
  143. {inspection.route}, {inspection.n_route}, {inspection.test_ecoulement}, {inspection.startnode_z}, {inspection.endnode_z},
  144. {inspection.section_length}, {inspection.pipe_length}, {inspection.diametre}, {inspection.nb_photos}, {inspection.nb_ops},
  145. {inspection.rate_1}, {inspection.rate_2}, {inspection.rate_3}, {inspection.rate_4}, {inspection.rate_5}
  146. )
  147. """.format(inspection)
  148. controles_db.execute(sql)
  149. # Met à jour tblvideointervs.strResGlobal avec le resultat global
  150. # le resultat global vaut '-' si un de ces trois champs n'est pas nul: tbl_so_rate.1, tbl_so_rate.2, tbl_so_rate.3
  151. logger.info("\t- Mise à jour du resultat global dans tblvideointervs")
  152. sql = """UPDATE tblvideointervs
  153. SET strResGlobal='{}'
  154. WHERE lngChantierId= {} AND bytIntervId= {}
  155. """.format('-' if (inspection.rate_1 or inspection.rate_2 or inspection.rate_3) else '+',
  156. inspection.lng_chantier_id,
  157. inspection.byt_interv_id)
  158. controles_db.execute(sql)
  159. # Met à jour la table tblVideoBases pour marquer le chantier comme traité
  160. logger.info("\t- Mise à jour de tblVideoBases")
  161. sql = """UPDATE tblVideoBases
  162. SET blnWincan=-1,bytNbInterv={}
  163. WHERE lngChantierId={}
  164. """.format(inspection.byt_interv_id,
  165. inspection.lng_chantier_id)
  166. controles_db.execute(sql)
  167. # Met à jour les données du réseau dans tblChantiers
  168. logger.info("\t- Mise à jour des données du réseau dans tblChantiers")
  169. sql = """UPDATE tblChantiers
  170. SET bytFoncReseauId ={} , bytNatureReseauId={}, bytTypeReseauId={}
  171. WHERE lngChantierId={}
  172. """.format(inspection.section_use,
  173. inspection.section_purpose,
  174. inspection.section_type,
  175. inspection.inspection.lng_chantier_id)
  176. controles_db.execute(sql)
  177. logger.info("Commit des modifications")
  178. controles_db.commit()
  179. wincan_db.commit()