Zimo hace 4 días
padre
commit
a9b62f3274

+ 1 - 1
package.json

@@ -57,7 +57,7 @@
     "driver.js": "^1.3.1",
     "echarts": "^5.6.0",
     "echarts-wordcloud": "^2.1.0",
-    "element-plus": "2.9.1",
+    "element-plus": "2.13.0",
     "fast-xml-parser": "^4.3.2",
     "highlight.js": "^11.9.0",
     "jsencrypt": "^3.3.2",

+ 102 - 122
pnpm-lock.yaml

@@ -105,8 +105,8 @@ importers:
         specifier: ^2.1.0
         version: 2.1.0(echarts@5.6.0)
       element-plus:
-        specifier: 2.9.1
-        version: 2.9.1(vue@3.5.12(typescript@5.3.3))
+        specifier: 2.13.0
+        version: 2.13.0(vue@3.5.12(typescript@5.3.3))
       fast-xml-parser:
         specifier: ^4.3.2
         version: 4.5.0
@@ -952,20 +952,20 @@ packages:
   '@codemirror/autocomplete@6.20.0':
     resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==}
 
-  '@codemirror/commands@6.10.0':
-    resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==}
+  '@codemirror/commands@6.10.1':
+    resolution: {integrity: sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==}
 
-  '@codemirror/language@6.11.3':
-    resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==}
+  '@codemirror/language@6.12.1':
+    resolution: {integrity: sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==}
 
   '@codemirror/lint@6.9.2':
     resolution: {integrity: sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==}
 
-  '@codemirror/state@6.5.2':
-    resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==}
+  '@codemirror/state@6.5.3':
+    resolution: {integrity: sha512-MerMzJzlXogk2fxWFU1nKp36bY5orBG59HnPiz0G9nLRebWa0zXuv2siH6PLIHBvv5TH8CkQRqjBs0MlxCZu+A==}
 
-  '@codemirror/view@6.38.8':
-    resolution: {integrity: sha512-XcE9fcnkHCbWkjeKyi0lllwXmBLtyYb5dt89dJyx23I9+LSh5vZDIuk7OLG4VM1lgrXZQcY6cxyZyk5WVPRv/A==}
+  '@codemirror/view@6.39.8':
+    resolution: {integrity: sha512-1rASYd9Z/mE3tkbC9wInRlCNyCkSn+nLsiQKZhEDUUJiUfs/5FHDpCUDaQpoTIaNGeDc6/bhaEAyLmeEucEFPw==}
 
   '@commitlint/cli@19.6.0':
     resolution: {integrity: sha512-v17BgGD9w5KnthaKxXnEg6KLq6DYiAxyiN44TpiRtqyW8NSq+Kx99mkEG8Qo6uu6cI5eMzMojW2muJxjmPnF8w==}
@@ -1071,6 +1071,11 @@ packages:
     peerDependencies:
       vue: ^3.2.0
 
+  '@element-plus/icons-vue@2.3.2':
+    resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==}
+    peerDependencies:
+      vue: ^3.2.0
+
   '@esbuild/aix-ppc64@0.19.12':
     resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
     engines: {node: '>=12'}
@@ -1409,17 +1414,17 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
-  '@lezer/common@1.3.0':
-    resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==}
+  '@lezer/common@1.5.0':
+    resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==}
 
   '@lezer/highlight@1.2.3':
     resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
 
-  '@lezer/lr@1.4.3':
-    resolution: {integrity: sha512-yenN5SqAxAPv/qMnpWW0AT7l+SxVrgG+u0tNsRQWqbrz66HIl8DnEbBObvy21J5K7+I1v7gsAnlE2VQ5yYVSeA==}
+  '@lezer/lr@1.4.6':
+    resolution: {integrity: sha512-u42yGuGBsHgodm86lwi0HAtUTNSs23yl9RoaI5em90B+OGm9/XuWkNiJ46sKkCgp8Tp4zgoBQbepcshfKLhFdw==}
 
-  '@lezer/markdown@1.6.0':
-    resolution: {integrity: sha512-AXb98u3M6BEzTnreBnGtQaF7xFTiMA92Dsy5tqEjpacbjRxDSFdN4bKJo9uvU4cEEOS7D2B9MT7kvDgOEIzJSw==}
+  '@lezer/markdown@1.6.2':
+    resolution: {integrity: sha512-iNSdKrIK0FfOjVPVpV0fu7OykdncYpEzf4vkG9szFf60ql/ObZShoVbM9u1tgkogDOmubms1CyoNS2/unOXWNw==}
 
   '@marijn/find-cluster-break@1.0.2':
     resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
@@ -1874,6 +1879,9 @@ packages:
   '@types/lodash@4.17.13':
     resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
 
+  '@types/lodash@4.17.21':
+    resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==}
+
   '@types/node@10.17.60':
     resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
 
@@ -1898,9 +1906,6 @@ packages:
   '@types/video.js@7.3.58':
     resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==}
 
-  '@types/web-bluetooth@0.0.16':
-    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
-
   '@types/web-bluetooth@0.0.20':
     resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
 
@@ -2284,21 +2289,12 @@ packages:
   '@vueuse/core@10.11.1':
     resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
 
-  '@vueuse/core@9.13.0':
-    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
-
   '@vueuse/metadata@10.11.1':
     resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==}
 
-  '@vueuse/metadata@9.13.0':
-    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
-
   '@vueuse/shared@10.11.1':
     resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==}
 
-  '@vueuse/shared@9.13.0':
-    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
-
   '@wangeditor/basic-modules@1.1.7':
     resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
     peerDependencies:
@@ -2971,6 +2967,9 @@ packages:
   dayjs@1.11.13:
     resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
 
+  dayjs@1.11.19:
+    resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
+
   de-indent@1.0.2:
     resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
 
@@ -3116,10 +3115,10 @@ packages:
   electron-to-chromium@1.5.67:
     resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==}
 
-  element-plus@2.9.1:
-    resolution: {integrity: sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==}
+  element-plus@2.13.0:
+    resolution: {integrity: sha512-qjxS+SBChvqCl6lU6ShiliLMN6WqFHiXQENYbAY3GKNflG+FS3jqn8JmQq0CBZq4koFqsi95NT1M6SL4whZfrA==}
     peerDependencies:
-      vue: ^3.2.0
+      vue: ^3.3.0
 
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -3176,9 +3175,6 @@ packages:
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
 
-  escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
   escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
@@ -3381,8 +3377,8 @@ packages:
   flatted@3.3.2:
     resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
 
-  focus-trap@7.6.6:
-    resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==}
+  focus-trap@7.7.1:
+    resolution: {integrity: sha512-Pkp8m55GjxBLnhBoT6OXdMvfRr4TjMAKLvFM566zlIryq5plbhaTmLAJWTGR0EkRwLjEte1lCOG9MxF1ipJrOg==}
 
   follow-redirects@1.15.9:
     resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
@@ -4043,8 +4039,8 @@ packages:
   min-dom@4.2.1:
     resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==}
 
-  min-dom@5.1.1:
-    resolution: {integrity: sha512-GaKUlguMAofd3OJsB0OkP17i5kucKqErgVCJxPawO9l5NwIPnr28SAr99zzlzMCWWljISBYrnZVWdE2Q92YGFQ==}
+  min-dom@5.1.2:
+    resolution: {integrity: sha512-IeKYafoWr5o/AYNZDPuaO5YnQtGNI+glqJiltxZy3pRTLenzBexseRmcZDk+uZYqDUpcIGmRZ6OVcFO1QIGpbA==}
 
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -4846,8 +4842,8 @@ packages:
   systemjs@6.15.1:
     resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
 
-  tabbable@6.3.0:
-    resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==}
+  tabbable@6.4.0:
+    resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
 
   table@6.8.2:
     resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
@@ -6045,8 +6041,8 @@ snapshots:
 
   '@bpmn-io/cm-theme@0.1.0-alpha.2':
     dependencies:
-      '@codemirror/language': 6.11.3
-      '@codemirror/view': 6.38.8
+      '@codemirror/language': 6.12.1
+      '@codemirror/view': 6.39.8
       '@lezer/highlight': 1.2.3
 
   '@bpmn-io/diagram-js-ui@0.2.3':
@@ -6064,44 +6060,44 @@ snapshots:
       '@bpmn-io/lang-feel': 2.4.0
       '@camunda/feel-builtins': 0.2.0
       '@codemirror/autocomplete': 6.20.0
-      '@codemirror/commands': 6.10.0
-      '@codemirror/language': 6.11.3
+      '@codemirror/commands': 6.10.1
+      '@codemirror/language': 6.12.1
       '@codemirror/lint': 6.9.2
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
       '@lezer/highlight': 1.2.3
       min-dom: 4.2.1
 
   '@bpmn-io/feel-lint@1.4.0':
     dependencies:
-      '@codemirror/language': 6.11.3
+      '@codemirror/language': 6.12.1
       lezer-feel: 1.9.0
 
   '@bpmn-io/feel-lint@2.1.0':
     dependencies:
       '@bpmn-io/lezer-feel': 1.9.0
-      '@codemirror/language': 6.11.3
+      '@codemirror/language': 6.12.1
 
   '@bpmn-io/lang-feel@2.4.0':
     dependencies:
       '@bpmn-io/lezer-feel': 1.9.0
       '@codemirror/autocomplete': 6.20.0
-      '@codemirror/language': 6.11.3
-      '@lezer/common': 1.3.0
+      '@codemirror/language': 6.12.1
+      '@lezer/common': 1.5.0
 
   '@bpmn-io/lezer-feel@1.9.0':
     dependencies:
       '@lezer/highlight': 1.2.3
-      '@lezer/lr': 1.4.3
+      '@lezer/lr': 1.4.6
       min-dash: 4.2.3
 
   '@bpmn-io/properties-panel@3.25.0':
     dependencies:
       '@bpmn-io/feel-editor': 1.12.1
-      '@codemirror/view': 6.38.8
+      '@codemirror/view': 6.39.8
       classnames: 2.5.1
       feelers: 1.4.0
-      focus-trap: 7.6.6
+      focus-trap: 7.7.1
       min-dash: 4.2.3
       min-dom: 4.2.1
 
@@ -6109,40 +6105,40 @@ snapshots:
 
   '@codemirror/autocomplete@6.20.0':
     dependencies:
-      '@codemirror/language': 6.11.3
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
-      '@lezer/common': 1.3.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
+      '@lezer/common': 1.5.0
 
-  '@codemirror/commands@6.10.0':
+  '@codemirror/commands@6.10.1':
     dependencies:
-      '@codemirror/language': 6.11.3
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
-      '@lezer/common': 1.3.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
+      '@lezer/common': 1.5.0
 
-  '@codemirror/language@6.11.3':
+  '@codemirror/language@6.12.1':
     dependencies:
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
-      '@lezer/common': 1.3.0
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
+      '@lezer/common': 1.5.0
       '@lezer/highlight': 1.2.3
-      '@lezer/lr': 1.4.3
+      '@lezer/lr': 1.4.6
       style-mod: 4.1.3
 
   '@codemirror/lint@6.9.2':
     dependencies:
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
       crelt: 1.0.6
 
-  '@codemirror/state@6.5.2':
+  '@codemirror/state@6.5.3':
     dependencies:
       '@marijn/find-cluster-break': 1.0.2
 
-  '@codemirror/view@6.38.8':
+  '@codemirror/view@6.39.8':
     dependencies:
-      '@codemirror/state': 6.5.2
+      '@codemirror/state': 6.5.3
       crelt: 1.0.6
       style-mod: 4.1.3
       w3c-keyname: 2.2.8
@@ -6280,6 +6276,10 @@ snapshots:
     dependencies:
       vue: 3.5.12(typescript@5.3.3)
 
+  '@element-plus/icons-vue@2.3.2(vue@3.5.12(typescript@5.3.3))':
+    dependencies:
+      vue: 3.5.12(typescript@5.3.3)
+
   '@esbuild/aix-ppc64@0.19.12':
     optional: true
 
@@ -6428,7 +6428,7 @@ snapshots:
       '@form-create/element-ui': 3.2.14(vue@3.5.12(typescript@5.3.3))
       '@form-create/utils': 3.2.14
       codemirror: 6.65.7
-      element-plus: 2.9.1(vue@3.5.12(typescript@5.3.3))
+      element-plus: 2.13.0(vue@3.5.12(typescript@5.3.3))
       vue: 3.5.12(typescript@5.3.3)
       vuedraggable: 4.1.0(vue@3.5.12(typescript@5.3.3))
     transitivePeerDependencies:
@@ -6601,19 +6601,19 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  '@lezer/common@1.3.0': {}
+  '@lezer/common@1.5.0': {}
 
   '@lezer/highlight@1.2.3':
     dependencies:
-      '@lezer/common': 1.3.0
+      '@lezer/common': 1.5.0
 
-  '@lezer/lr@1.4.3':
+  '@lezer/lr@1.4.6':
     dependencies:
-      '@lezer/common': 1.3.0
+      '@lezer/common': 1.5.0
 
-  '@lezer/markdown@1.6.0':
+  '@lezer/markdown@1.6.2':
     dependencies:
-      '@lezer/common': 1.3.0
+      '@lezer/common': 1.5.0
       '@lezer/highlight': 1.2.3
 
   '@marijn/find-cluster-break@1.0.2': {}
@@ -7006,6 +7006,8 @@ snapshots:
 
   '@types/lodash@4.17.13': {}
 
+  '@types/lodash@4.17.21': {}
+
   '@types/node@10.17.60': {}
 
   '@types/node@20.17.9':
@@ -7027,8 +7029,6 @@ snapshots:
 
   '@types/video.js@7.3.58': {}
 
-  '@types/web-bluetooth@0.0.16': {}
-
   '@types/web-bluetooth@0.0.20': {}
 
   '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.3.3))(eslint@8.57.1)(typescript@5.3.3)':
@@ -7653,20 +7653,8 @@ snapshots:
       - '@vue/composition-api'
       - vue
 
-  '@vueuse/core@9.13.0(vue@3.5.12(typescript@5.3.3))':
-    dependencies:
-      '@types/web-bluetooth': 0.0.16
-      '@vueuse/metadata': 9.13.0
-      '@vueuse/shared': 9.13.0(vue@3.5.12(typescript@5.3.3))
-      vue-demi: 0.14.10(vue@3.5.12(typescript@5.3.3))
-    transitivePeerDependencies:
-      - '@vue/composition-api'
-      - vue
-
   '@vueuse/metadata@10.11.1': {}
 
-  '@vueuse/metadata@9.13.0': {}
-
   '@vueuse/shared@10.11.1(vue@3.5.12(typescript@5.3.3))':
     dependencies:
       vue-demi: 0.14.10(vue@3.5.12(typescript@5.3.3))
@@ -7674,13 +7662,6 @@ snapshots:
       - '@vue/composition-api'
       - vue
 
-  '@vueuse/shared@9.13.0(vue@3.5.12(typescript@5.3.3))':
-    dependencies:
-      vue-demi: 0.14.10(vue@3.5.12(typescript@5.3.3))
-    transitivePeerDependencies:
-      - '@vue/composition-api'
-      - vue
-
   '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)':
     dependencies:
       '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
@@ -8424,6 +8405,8 @@ snapshots:
 
   dayjs@1.11.13: {}
 
+  dayjs@1.11.19: {}
+
   de-indent@1.0.2: {}
 
   debug@3.1.0:
@@ -8567,18 +8550,17 @@ snapshots:
 
   electron-to-chromium@1.5.67: {}
 
-  element-plus@2.9.1(vue@3.5.12(typescript@5.3.3)):
+  element-plus@2.13.0(vue@3.5.12(typescript@5.3.3)):
     dependencies:
       '@ctrl/tinycolor': 3.6.1
-      '@element-plus/icons-vue': 2.3.1(vue@3.5.12(typescript@5.3.3))
+      '@element-plus/icons-vue': 2.3.2(vue@3.5.12(typescript@5.3.3))
       '@floating-ui/dom': 1.6.12
       '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
-      '@types/lodash': 4.17.13
+      '@types/lodash': 4.17.21
       '@types/lodash-es': 4.17.12
-      '@vueuse/core': 9.13.0(vue@3.5.12(typescript@5.3.3))
+      '@vueuse/core': 10.11.1(vue@3.5.12(typescript@5.3.3))
       async-validator: 4.2.5
-      dayjs: 1.11.13
-      escape-html: 1.0.3
+      dayjs: 1.11.19
       lodash: 4.17.21
       lodash-es: 4.17.21
       lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
@@ -8658,8 +8640,6 @@ snapshots:
 
   escalade@3.2.0: {}
 
-  escape-html@1.0.3: {}
-
   escape-string-regexp@1.0.5: {}
 
   escape-string-regexp@4.0.0: {}
@@ -8859,22 +8839,22 @@ snapshots:
       '@bpmn-io/cm-theme': 0.1.0-alpha.2
       '@bpmn-io/feel-lint': 1.4.0
       '@codemirror/autocomplete': 6.20.0
-      '@codemirror/commands': 6.10.0
-      '@codemirror/language': 6.11.3
+      '@codemirror/commands': 6.10.1
+      '@codemirror/language': 6.12.1
       '@codemirror/lint': 6.9.2
-      '@codemirror/state': 6.5.2
-      '@codemirror/view': 6.38.8
-      '@lezer/common': 1.3.0
+      '@codemirror/state': 6.5.3
+      '@codemirror/view': 6.39.8
+      '@lezer/common': 1.5.0
       '@lezer/highlight': 1.2.3
-      '@lezer/lr': 1.4.3
-      '@lezer/markdown': 1.6.0
+      '@lezer/lr': 1.4.6
+      '@lezer/markdown': 1.6.2
       feelin: 3.2.0
       lezer-feel: 1.9.0
-      min-dom: 5.1.1
+      min-dom: 5.1.2
 
   feelin@3.2.0:
     dependencies:
-      '@lezer/lr': 1.4.3
+      '@lezer/lr': 1.4.6
       lezer-feel: 1.9.0
       luxon: 3.7.2
 
@@ -8923,9 +8903,9 @@ snapshots:
 
   flatted@3.3.2: {}
 
-  focus-trap@7.6.6:
+  focus-trap@7.7.1:
     dependencies:
-      tabbable: 6.3.0
+      tabbable: 6.4.0
 
   follow-redirects@1.15.9(debug@4.3.7):
     optionalDependencies:
@@ -9300,7 +9280,7 @@ snapshots:
   lezer-feel@1.9.0:
     dependencies:
       '@lezer/highlight': 1.2.3
-      '@lezer/lr': 1.4.3
+      '@lezer/lr': 1.4.6
       min-dash: 4.2.3
 
   lilconfig@3.1.2: {}
@@ -9535,7 +9515,7 @@ snapshots:
       domify: 1.4.2
       min-dash: 4.2.2
 
-  min-dom@5.1.1:
+  min-dom@5.1.2:
     dependencies:
       domify: 2.0.0
       min-dash: 4.2.3
@@ -10317,7 +10297,7 @@ snapshots:
 
   systemjs@6.15.1: {}
 
-  tabbable@6.3.0: {}
+  tabbable@6.4.0: {}
 
   table@6.8.2:
     dependencies:

+ 168 - 171
src/views/pms/iotrhdailyreport/fill.vue

@@ -3,11 +3,10 @@ import { IotRhDailyReportApi } from '@/api/pms/iotrhdailyreport'
 import { rangeShortcuts } from '@/utils/formatTime'
 import { useDebounceFn } from '@vueuse/core'
 import dayjs from 'dayjs'
-import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
+import { DICT_TYPE } from '@/utils/dict'
 import { TableColumnCtx } from 'element-plus/es/components/table/src/table-column/defaults'
-import { FormInstance, FormRules } from 'element-plus'
-import Form from '@/components/Form/src/Form.vue'
 import { useUserStore } from '@/store/modules/user'
+import rhForm from './rh-form.vue'
 
 interface List {
   createTime: number // 日期
@@ -403,79 +402,77 @@ watch(
   { immediate: true }
 )
 
-const FORM_KEYS = [
-  'id',
-  'deptId',
-  'projectId',
-  'taskId',
-  'deptName',
-  'contractName',
-  'taskName',
-  'dailyGasInjection',
-  'dailyWaterInjection',
-  'dailyInjectGasTime',
-  'dailyInjectWaterTime',
-  'nonProductionTime',
-  'nptReason',
-  'productionStatus',
-  'remark',
-  'relocationDays',
-  'capacity',
-  'createTime',
-  'opinion'
-] as const
-
-type FormKey = (typeof FORM_KEYS)[number]
-type Form = Partial<Pick<List, FormKey>>
-
-const dialogVisible = ref(false)
-const formRef = ref<FormInstance>()
-const formLoading = ref(false)
-const message = useMessage()
-
-const initFormData = (): Form => ({
-  dailyGasInjection: 0,
-  dailyWaterInjection: 0,
-  dailyInjectGasTime: 0,
-  dailyInjectWaterTime: 0,
-  nonProductionTime: 0,
-  relocationDays: 0,
-  capacity: 0
-})
-
-const form = ref<Form>(initFormData())
-
-async function loadDetail(id: number) {
-  try {
-    const res = await IotRhDailyReportApi.getIotRhDailyReport(id)
-    FORM_KEYS.forEach((key) => {
-      form.value[key] = res[key] ?? form.value[key]
-    })
-    form.value.id = id
-
-    if (res.status !== 0) {
-      formType.value = 'readonly'
-    }
-
-    if (!form.value.capacity) {
-      message.error('请维护增压机产能')
-    }
-  } finally {
-  }
-}
-
-const formType = ref<'edit' | 'readonly'>('edit')
+// const FORM_KEYS = [
+//   'id',
+//   'deptId',
+//   'projectId',
+//   'taskId',
+//   'deptName',
+//   'contractName',
+//   'taskName',
+//   'dailyGasInjection',
+//   'dailyWaterInjection',
+//   'dailyInjectGasTime',
+//   'dailyInjectWaterTime',
+//   'nonProductionTime',
+//   'nptReason',
+//   'productionStatus',
+//   'remark',
+//   'relocationDays',
+//   'capacity',
+//   'createTime',
+//   'opinion'
+// ] as const
+
+// type FormKey = (typeof FORM_KEYS)[number]
+// type Form = Partial<Pick<List, FormKey>>
+
+// const dialogVisible = ref(false)
+// const formRef = ref<FormInstance>()
+// const formLoading = ref(false)
+// const message = useMessage()
+
+// const initFormData = (): Form => ({
+//   dailyGasInjection: 0,
+//   dailyWaterInjection: 0,
+//   dailyInjectGasTime: 0,
+//   dailyInjectWaterTime: 0,
+//   nonProductionTime: 0,
+//   relocationDays: 0,
+//   capacity: 0
+// })
+
+// const form = ref<Form>(initFormData())
+
+// async function loadDetail(id: number) {
+//   try {
+//     const res = await IotRhDailyReportApi.getIotRhDailyReport(id)
+//     FORM_KEYS.forEach((key) => {
+//       form.value[key] = res[key] ?? form.value[key]
+//     })
+//     form.value.id = id
+
+//     if (res.status !== 0) {
+//       formType.value = 'readonly'
+//     }
+
+//     if (!form.value.capacity) {
+//       message.error('请维护增压机产能')
+//     }
+//   } finally {
+//   }
+// }
+
+// const formType = ref<'edit' | 'readonly'>('edit')
+
+const visible = ref(false)
+
+const formRef = ref()
 
 function handleOpenForm(id: number, type: 'edit' | 'readonly') {
-  form.value = initFormData()
-  formRef.value?.resetFields()
-
-  formType.value = type
-
-  dialogVisible.value = true
-  loadDetail(id).then(() => {
-    formRef.value?.validate()
-  })
+  if (formRef.value) {
+    formRef.value.handleOpenForm(id, type)
+  }
 }
 
 const route = useRoute()
@@ -486,98 +483,98 @@ onMounted(() => {
   }
 })
 
-const transitTime = computed(() => {
-  const cap = form.value.capacity
-  const gas = form.value.dailyGasInjection ?? 0
-
-  if (!cap) return { original: 0, value: '0%' }
-
-  const original = gas / cap
-  return { original, value: (original * 100).toFixed(2) + '%' }
-})
-
-const sumTimes = () => {
-  const { dailyInjectGasTime = 0, dailyInjectWaterTime = 0, nonProductionTime = 0 } = form.value
-  return parseFloat((dailyInjectGasTime + dailyInjectWaterTime + nonProductionTime).toFixed(2))
-}
-
-const validateTotalTime = (_rule: any, _value: any, callback: any) => {
-  const total = sumTimes()
-  if (total !== 24) {
-    callback(new Error(`当前合计 ${total} 小时,三项时间之和必须等于 24`))
-  } else {
-    callback()
-  }
-}
-
-const validateNptReason = (_rule: any, value: any, callback: any) => {
-  if ((form.value.nonProductionTime || 0) > 0 && !value) {
-    callback(new Error('非生产时间大于 0 时,必须选择原因'))
-  } else {
-    callback()
-  }
-}
-
-const timeRuleItem = [
-  { required: true, message: '请输入时间', trigger: 'blur' },
-  { validator: validateTotalTime, trigger: 'blur' }
-]
-
-const rules = reactive<FormRules>({
-  dailyGasInjection: [{ required: true, message: '请输入当日注气量', trigger: ['change', 'blur'] }],
-  dailyWaterInjection: [
-    { required: true, message: '请输入当日注水量', trigger: ['change', 'blur'] }
-  ],
-  productionStatus: [{ required: true, message: '请输入生产动态', trigger: ['change', 'blur'] }],
-
-  // 复用规则
-  // dailyInjectGasTime: timeRuleItem,
-  // dailyInjectWaterTime: timeRuleItem,
-  // nonProductionTime: timeRuleItem,
-
-  nptReason: [{ validator: validateNptReason, trigger: ['change', 'blur'] }]
-})
-
-watch(
-  [
-    () => form.value.dailyInjectGasTime,
-    () => form.value.dailyInjectWaterTime,
-    () => form.value.nonProductionTime
-  ],
-  () => {
-    nextTick(() => {
-      formRef.value?.validateField('nptReason')
-      if (sumTimes() === 24) {
-        formRef.value?.clearValidate([
-          'dailyInjectGasTime',
-          'dailyInjectWaterTime',
-          'nonProductionTime'
-        ])
-      }
-    })
-  }
-)
-
-const { t } = useI18n()
-
-const submitForm = async () => {
-  if (!formRef.value) return
-
-  try {
-    await formRef.value.validate()
-    formLoading.value = true
-    const { createTime, ...other } = form.value
-    const data = { ...other, fillOrderCreateTime: createTime } as any
-    await IotRhDailyReportApi.createIotRhDailyReport(data)
-    message.success(t('common.updateSuccess'))
-    dialogVisible.value = false
-    loadList()
-  } catch (error) {
-    console.warn('表单校验未通过或提交出错')
-  } finally {
-    formLoading.value = false
-  }
-}
+// const transitTime = computed(() => {
+//   const cap = form.value.capacity
+//   const gas = form.value.dailyGasInjection ?? 0
+
+//   if (!cap) return { original: 0, value: '0%' }
+
+//   const original = gas / cap
+//   return { original, value: (original * 100).toFixed(2) + '%' }
+// })
+
+// const sumTimes = () => {
+//   const { dailyInjectGasTime = 0, dailyInjectWaterTime = 0, nonProductionTime = 0 } = form.value
+//   return parseFloat((dailyInjectGasTime + dailyInjectWaterTime + nonProductionTime).toFixed(2))
+// }
+
+// const validateTotalTime = (_rule: any, _value: any, callback: any) => {
+//   const total = sumTimes()
+//   if (total !== 24) {
+//     callback(new Error(`当前合计 ${total} 小时,三项时间之和必须等于 24`))
+//   } else {
+//     callback()
+//   }
+// }
+
+// const validateNptReason = (_rule: any, value: any, callback: any) => {
+//   if ((form.value.nonProductionTime || 0) > 0 && !value) {
+//     callback(new Error('非生产时间大于 0 时,必须选择原因'))
+//   } else {
+//     callback()
+//   }
+// }
+
+// const timeRuleItem = [
+//   { required: true, message: '请输入时间', trigger: 'blur' },
+//   { validator: validateTotalTime, trigger: 'blur' }
+// ]
+
+// const rules = reactive<FormRules>({
+//   dailyGasInjection: [{ required: true, message: '请输入当日注气量', trigger: ['change', 'blur'] }],
+//   dailyWaterInjection: [
+//     { required: true, message: '请输入当日注水量', trigger: ['change', 'blur'] }
+//   ],
+//   productionStatus: [{ required: true, message: '请输入生产动态', trigger: ['change', 'blur'] }],
+
+//   // 复用规则
+//   // dailyInjectGasTime: timeRuleItem,
+//   // dailyInjectWaterTime: timeRuleItem,
+//   // nonProductionTime: timeRuleItem,
+
+//   nptReason: [{ validator: validateNptReason, trigger: ['change', 'blur'] }]
+// })
+
+// watch(
+//   [
+//     () => form.value.dailyInjectGasTime,
+//     () => form.value.dailyInjectWaterTime,
+//     () => form.value.nonProductionTime
+//   ],
+//   () => {
+//     nextTick(() => {
+//       formRef.value?.validateField('nptReason')
+//       if (sumTimes() === 24) {
+//         formRef.value?.clearValidate([
+//           'dailyInjectGasTime',
+//           'dailyInjectWaterTime',
+//           'nonProductionTime'
+//         ])
+//       }
+//     })
+//   }
+// )
+
+// const { t } = useI18n()
+
+// const submitForm = async () => {
+//   if (!formRef.value) return
+
+//   try {
+//     await formRef.value.validate()
+//     formLoading.value = true
+//     const { createTime, ...other } = form.value
+//     const data = { ...other, fillOrderCreateTime: createTime } as any
+//     await IotRhDailyReportApi.createIotRhDailyReport(data)
+//     message.success(t('common.updateSuccess'))
+//     dialogVisible.value = false
+//     loadList()
+//   } catch (error) {
+//     console.warn('表单校验未通过或提交出错')
+//   } finally {
+//     formLoading.value = false
+//   }
+// }
 </script>
 
 <template>
@@ -690,7 +687,8 @@ const submitForm = async () => {
         </div>
       </div>
     </div>
-    <Dialog title="编辑" v-model="dialogVisible">
+    <rh-form v-model:visible="visible" type="edit" ref="formRef" :load-list="loadList" />
+    <!-- <Dialog title="编辑">
       <el-form
         ref="formRef"
         label-position="top"
@@ -717,7 +715,7 @@ const submitForm = async () => {
                   >120% 红色预警
                 </span>
               </div>
-              <!-- <div class="flex items-center justify-between">
+              <div class="flex items-center justify-between">
                 <div class="text-gray-600 dark:text-gray-400">
                   <span class="font-bold text-gray-800 dark:text-gray-200">时间平衡:</span>
                   注气 + 注水 + 非生产 = 24H
@@ -727,7 +725,7 @@ const submitForm = async () => {
                 >
                   ≠24H 橙色预警
                 </span>
-              </div> -->
+              </div>
             </div>
           </div>
           <div
@@ -784,7 +782,6 @@ const submitForm = async () => {
               placeholder="请输入当日注水量(方)"
             />
           </el-form-item>
-          <!-- :class="{ 'orange-input': sumTimes() !== 24 }" -->
           <el-form-item label="当日注气时间(H)" prop="dailyInjectGasTime">
             <el-input-number
               class="w-full!"
@@ -847,7 +844,7 @@ const submitForm = async () => {
         </el-button>
         <el-button size="default" @click="dialogVisible = false">取 消</el-button>
       </template>
-    </Dialog>
+    </Dialog> -->
   </div>
 </template>
 

+ 524 - 0
src/views/pms/iotrhdailyreport/rh-form copy.vue

@@ -0,0 +1,524 @@
+<script lang="ts" setup generic="T">
+import { IotRhDailyReportApi } from '@/api/pms/iotrhdailyreport'
+import { FormInstance, FormRules } from 'element-plus'
+import { computed, reactive, ref, watch, nextTick } from 'vue'
+
+interface Props {
+  visible: boolean
+  type?: 'edit' | 'approval' | 'readonly'
+  loadList: () => void
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  type: 'edit'
+})
+
+const emits = defineEmits(['update:visible'])
+
+// 1. 定义非生产时间字段映射,方便循环和计算
+const NON_PROD_FIELDS = [
+  { key: 'repairTime', label: '设备故障' },
+  { key: 'selfStopTime', label: '设备保养' },
+  { key: 'accidentTime', label: '工程质量' },
+  { key: 'complexityTime', label: '技术受限' },
+  { key: 'rectificationTime', label: '生产组织' },
+  { key: 'waitingStopTime', label: '不可抗力' },
+  { key: 'partyaDesign', label: '甲方设计' },
+  { key: 'partyaPrepare', label: '甲方准备' },
+  { key: 'partyaResource', label: '甲方资源' },
+  { key: 'relocationTime', label: '生产配合' },
+  { key: 'winterBreakTime', label: '待命' }
+] as const
+
+interface FormOriginal {
+  id: number
+  deptName: string
+  contractName: string
+  taskName: string
+  dailyGasInjection: number
+  dailyWaterInjection: number
+  dailyInjectGasTime: number
+  dailyInjectWaterTime: number
+  // 新增非生产时间字段
+  repairTime: number
+  selfStopTime: number
+  accidentTime: number
+  complexityTime: number
+  rectificationTime: number
+  waitingStopTime: number
+  partyaDesign: number
+  partyaPrepare: number
+  partyaResource: number
+  relocationTime: number
+  winterBreakTime: number
+  otherNptReason: string // 其他非生产时间原因说明
+
+  productionStatus: string
+  remark: string
+  relocationDays: number
+  capacity: number
+  createTime: number
+  opinion: string
+}
+
+type Form = Partial<FormOriginal>
+
+const formRef = ref<FormInstance>()
+const loading = ref(false)
+const formLoading = ref(false)
+const formType = ref<'edit' | 'readonly'>('edit')
+const message = useMessage()
+const { t } = useI18n()
+
+// 初始化表单数据,包含新字段默认为0
+const initFormData = (): Form => {
+  const base: Form = {
+    dailyGasInjection: 0,
+    dailyWaterInjection: 0,
+    dailyInjectGasTime: 0,
+    dailyInjectWaterTime: 0,
+    relocationDays: 0,
+    capacity: 0,
+    otherNptReason: '',
+    opinion: ''
+  }
+  // 初始化所有非生产时间为0
+  NON_PROD_FIELDS.forEach((field) => {
+    base[field.key as keyof FormOriginal] = 0
+  })
+  return base
+}
+
+const form = ref<Form>(initFormData())
+
+// 计算属性:判断当前操作模式
+const isApproval = computed(() => props.type === 'approval')
+const isEdit = computed(() => props.type === 'edit')
+
+// 计算属性:主业务字段是否禁用
+// 规则:如果是 'readonly' 模式 或者 处于 'approval' (审批) 模式下,主业务数据不可改
+const isMainFieldDisabled = computed(() => {
+  return formType.value === 'readonly' || isApproval.value
+})
+
+async function loadDetail(id: number) {
+  loading.value = true
+  try {
+    const res = await IotRhDailyReportApi.getIotRhDailyReport(id)
+    // 简单的对象合并
+    form.value = { ...initFormData(), ...res }
+
+    // 逻辑控制:如果状态不是初始草稿,编辑模式下也转为只读(或者根据具体业务需求)
+    // 这里假设 status != 0 时,edit 模式下只能看
+    if (props.type === 'edit' && res.status !== 0) {
+      formType.value = 'readonly'
+    }
+    // 审批模式下,如果已经审批过了(假设10是待审批),则只读
+    if (props.type === 'approval' && res.auditStatus !== 10) {
+      formType.value = 'readonly'
+    }
+
+    if (!form.value.capacity) {
+      message.error('请维护增压机产能')
+    }
+  } finally {
+    loading.value = false
+  }
+}
+
+function handleOpenForm(id: number, type: 'edit' | 'readonly') {
+  form.value = initFormData()
+  formRef.value?.resetFields()
+  formType.value = type
+
+  emits('update:visible', true)
+  loadDetail(id).then(() => {
+    // 加载完成后清除校验,避免数字0触发校验红字
+    nextTick(() => formRef.value?.clearValidate())
+  })
+}
+
+defineExpose({ handleOpenForm })
+
+// --- 运行时效计算 ---
+const transitTime = computed(() => {
+  const cap = form.value.capacity
+  const gas = form.value.dailyGasInjection ?? 0
+  if (!cap) return { original: 0, value: '0%' }
+  const original = gas / cap
+  return { original, value: (original * 100).toFixed(2) + '%' }
+})
+
+// --- 时间校验逻辑 ---
+
+// 计算所有非生产时间之和
+const sumNonProdTimes = () => {
+  let sum = 0
+  NON_PROD_FIELDS.forEach((field) => {
+    sum += (form.value[field.key as keyof FormOriginal] as number) || 0
+  })
+  return sum
+}
+
+// 核心校验规则
+const validateTotalTime = (_rule: any, _value: any, callback: any) => {
+  const gasTime = form.value.dailyInjectGasTime || 0
+  const waterTime = form.value.dailyInjectWaterTime || 0
+  const nonProdSum = sumNonProdTimes()
+
+  let total = 0
+  let msg = ''
+
+  // 规则:
+  // (如果注气时间>0) 注气时间 + 所有非生产时间累计 = 24
+  // (如果注气时间=0) 注水时间 + 所有非生产时间累计 = 24
+  if (gasTime > 0) {
+    total = parseFloat((gasTime + nonProdSum).toFixed(2))
+    msg = `注气时间(${gasTime}) + 非生产时间合计(${nonProdSum}) 必须等于 24,当前合计: ${total}`
+  } else {
+    total = parseFloat((waterTime + nonProdSum).toFixed(2))
+    msg = `注水时间(${waterTime}) + 非生产时间合计(${nonProdSum}) 必须等于 24,当前合计: ${total}`
+  }
+
+  if (Math.abs(total - 24) > 0.01) {
+    // 浮点数容错
+    callback(new Error(msg))
+  } else {
+    callback()
+  }
+}
+
+const rules = reactive<FormRules>({
+  dailyGasInjection: [{ required: true, message: '请输入当日注气量', trigger: ['blur', 'change'] }],
+  dailyWaterInjection: [
+    { required: true, message: '请输入当日注水量', trigger: ['blur', 'change'] }
+  ],
+  productionStatus: [{ required: true, message: '请输入生产动态', trigger: ['blur', 'change'] }],
+
+  // 时间校验绑定在主要时间字段上
+  dailyInjectGasTime: [{ validator: validateTotalTime, trigger: ['blur', 'change'] }],
+  dailyInjectWaterTime: [{ validator: validateTotalTime, trigger: ['blur', 'change'] }],
+  // 审批意见在审批通过/拒绝时可能需要校验,视业务而定,这里设为非必填或自定义
+  opinion: [{ required: false, message: '请输入审批意见', trigger: 'blur' }]
+})
+
+// 监听所有时间字段变化,触发重新校验
+watch(
+  () => [
+    form.value.dailyInjectGasTime,
+    form.value.dailyInjectWaterTime,
+    ...NON_PROD_FIELDS.map((f) => form.value[f.key as keyof FormOriginal])
+  ],
+  () => {
+    // 只有在非禁用状态下才实时触发校验,避免只读打开时满屏红字
+    if (!isMainFieldDisabled.value) {
+      // 这里的防抖或 nextTick 很重要
+      nextTick(() => {
+        // 触发注气时间的校验即可,因为它关联了整体逻辑
+        formRef.value?.validateField('dailyInjectGasTime')
+      })
+    }
+  },
+  { deep: true }
+)
+
+// --- 提交逻辑 ---
+
+// 1. 编辑/修改 提交
+const submitForm = async () => {
+  if (!formRef.value) return
+  try {
+    await formRef.value.validate()
+    formLoading.value = true
+    const { createTime, ...other } = form.value
+    // 构造提交数据
+    const data = { ...other, fillOrderCreateTime: createTime } as any
+    await IotRhDailyReportApi.createIotRhDailyReport(data)
+
+    message.success(t('common.updateSuccess'))
+    emits('update:visible', false)
+    props.loadList()
+  } catch (error) {
+    console.warn('表单校验未通过或提交出错')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+// 2. 审批 提交 (通过 20 / 拒绝 30)
+const handleAudit = async (auditStatus: 20 | 30) => {
+  if (!formRef.value) return
+
+  // 审批时,可能不需要校验主数据的24小时规则(因为是只读的),只校验意见?
+  // 如果需要校验意见必填,可以在这里手动校验 opinion 字段
+  if (auditStatus === 30 && !form.value.opinion) {
+    message.error('拒绝时请必须填写审批意见')
+    return
+  }
+
+  try {
+    formLoading.value = true
+    const { opinion, id } = form.value
+    const data = { id, auditStatus, opinion }
+
+    await IotRhDailyReportApi.approvalIotRhDailyReport(data)
+    message.success(auditStatus === 20 ? '审批通过成功' : '审批拒绝成功')
+    emits('update:visible', false)
+    props.loadList()
+  } catch (error) {
+    console.warn('审批提交出错', error)
+  } finally {
+    formLoading.value = false
+  }
+}
+</script>
+
+<template>
+  <el-drawer
+    :model-value="visible"
+    @update:model-value="emits('update:visible', $event)"
+    header-class="mb-0!"
+    size="50%"
+  >
+    <template #header>
+      <span class="text-xl font-bold text-[var(--el-text-color-primary)]">
+        {{ type === 'edit' ? '编辑日报' : '审批日报' }}
+      </span>
+    </template>
+
+    <el-form
+      ref="formRef"
+      label-position="top"
+      size="default"
+      :rules="rules"
+      :model="form"
+      v-loading="loading"
+      require-asterisk-position="right"
+      :disabled="formType === 'readonly' && type !== 'approval'"
+    >
+      <!-- 顶部提示区 -->
+      <div class="flex flex-col gap-3 text-sm mb-4">
+        <!-- 运行时效预警 -->
+        <div
+          class="rounded-md border border-blue-100 bg-blue-50/80 p-3 dark:border-blue-900/30 dark:bg-blue-900/10"
+        >
+          <div class="flex flex-col gap-2.5">
+            <div class="flex items-center justify-between">
+              <div class="text-gray-600 dark:text-gray-400">
+                <span class="font-bold text-gray-800 dark:text-gray-200">运行时效:</span>
+                当日注气量 / 产能
+              </div>
+              <span
+                class="inline-flex items-center rounded border border-red-200 bg-red-100 px-2 py-0.5 text-xs font-medium text-red-600 dark:bg-red-900/20 dark:border-red-800 dark:text-red-400"
+              >
+                >120% 红色预警
+              </span>
+            </div>
+          </div>
+        </div>
+
+        <!-- 历史审批意见:仅在 edit 模式且有意见时显示 -->
+        <div
+          v-if="isEdit && form.opinion"
+          class="flex gap-3 rounded-md border border-yellow-200 bg-yellow-50 p-3 dark:border-yellow-800 dark:bg-yellow-900/10"
+        >
+          <Icon
+            icon="ep:warning-filled"
+            class="mt-0.5 shrink-0 text-base text-yellow-600 dark:text-yellow-500"
+          />
+          <div class="flex flex-col">
+            <h4 class="mb-1 font-bold text-yellow-800 dark:text-yellow-500">历史审核意见</h4>
+            <p class="leading-relaxed text-gray-600 dark:text-gray-400">{{ form.opinion }}</p>
+          </div>
+        </div>
+      </div>
+
+      <!-- 表单主体区域 -->
+      <div class="grid grid-cols-2 gap-4">
+        <!-- 基础信息 -->
+        <div class="col-span-2 flex items-center gap-2 mt-2">
+          <div class="bg-[var(--el-color-primary)] w-1 h-5 rounded-full"></div>
+          <div class="text-lg font-medium text-[var(--el-text-color-primary)]">基础信息</div>
+        </div>
+
+        <el-form-item label="施工队伍" prop="deptName">
+          <el-input v-model="form.deptName" disabled />
+        </el-form-item>
+        <el-form-item label="项目" prop="contractName">
+          <el-input v-model="form.contractName" disabled />
+        </el-form-item>
+        <el-form-item label="任务" prop="taskName">
+          <el-input v-model="form.taskName" disabled />
+        </el-form-item>
+        <el-form-item label="搬迁安装天数(D)" prop="relocationDays">
+          <el-input v-model="form.relocationDays" disabled />
+        </el-form-item>
+        <el-form-item label="运行时效" prop="transitTime">
+          <el-input
+            :model-value="transitTime.value"
+            disabled
+            :class="{ 'warning-input': transitTime.original > 1.2 }"
+          />
+        </el-form-item>
+
+        <!-- 核心业务数据:审批模式下禁用 -->
+        <el-form-item label="当日注气量(方)" prop="dailyGasInjection">
+          <el-input-number
+            class="!w-full"
+            :min="0"
+            v-model="form.dailyGasInjection"
+            :controls="false"
+            align="left"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+        <el-form-item label="当日注水量(方)" prop="dailyWaterInjection">
+          <el-input-number
+            class="!w-full"
+            :min="0"
+            v-model="form.dailyWaterInjection"
+            :controls="false"
+            align="left"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+        <el-form-item class="col-span-2" label="生产动态" prop="productionStatus">
+          <el-input
+            v-model="form.productionStatus"
+            type="textarea"
+            autosize
+            maxlength="1000"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+        <el-form-item class="col-span-2" label="备注" prop="remark">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            autosize
+            maxlength="1000"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+
+        <!-- 时间信息 -->
+        <div class="col-span-2 flex items-center gap-2 mt-4">
+          <div class="bg-[var(--el-color-primary)] w-1 h-5 rounded-full"></div>
+          <div class="text-lg font-medium text-[var(--el-text-color-primary)]"
+            >生产与非生产时间</div
+          >
+        </div>
+
+        <!-- 生产时间 -->
+        <el-form-item label="当日注气时间(H)" prop="dailyInjectGasTime">
+          <el-input-number
+            class="!w-full"
+            :min="0"
+            :max="24"
+            v-model="form.dailyInjectGasTime"
+            :controls="false"
+            align="left"
+            placeholder="注气+非生产=24H"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+        <el-form-item label="当日注水时间(H)" prop="dailyInjectWaterTime">
+          <el-input-number
+            class="!w-full"
+            :min="0"
+            :max="24"
+            v-model="form.dailyInjectWaterTime"
+            :controls="false"
+            align="left"
+            placeholder="注气=0时,注水+非生产=24H"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+
+        <!-- 非生产时间:循环生成 -->
+        <el-form-item
+          v-for="field in NON_PROD_FIELDS"
+          :key="field.key"
+          :label="field.label + '(H)'"
+          :prop="field.key"
+        >
+          <el-input-number
+            class="!w-full"
+            :min="0"
+            :max="24"
+            v-model="form[field.key as keyof FormOriginal] as number"
+            :controls="false"
+            align="left"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+
+        <!-- 其他原因说明 -->
+        <el-form-item class="col-span-2" label="其他非生产原因" prop="otherNptReason">
+          <el-input
+            v-model="form.otherNptReason"
+            placeholder="如果有其他非生产时间,请在此说明"
+            :disabled="isMainFieldDisabled"
+          />
+        </el-form-item>
+
+        <!-- 审批意见输入框:仅在 approval 模式下显示,且只要整体不是 readonly 就可以编辑 -->
+        <div v-if="isApproval" class="col-span-2 mt-4 border-t pt-4">
+          <el-form-item label="审批意见" prop="opinion">
+            <el-input
+              v-model="form.opinion"
+              placeholder="请输入审批意见(拒绝时必填)"
+              :maxlength="1000"
+              type="textarea"
+              :autosize="{ minRows: 3 }"
+              :disabled="formType === 'readonly'"
+            />
+          </el-form-item>
+        </div>
+      </div>
+    </el-form>
+
+    <template #footer>
+      <!-- Edit 模式的按钮 -->
+      <div v-if="type === 'edit'">
+        <el-button
+          type="primary"
+          @click="submitForm"
+          :loading="formLoading"
+          :disabled="formType === 'readonly'"
+        >
+          确 定
+        </el-button>
+        <el-button @click="emits('update:visible', false)">取 消</el-button>
+      </div>
+
+      <!-- Approval 模式的按钮 -->
+      <div v-if="type === 'approval'">
+        <el-button
+          type="primary"
+          @click="handleAudit(20)"
+          :loading="formLoading"
+          :disabled="formType === 'readonly'"
+        >
+          审批通过
+        </el-button>
+        <el-button
+          type="danger"
+          @click="handleAudit(30)"
+          :loading="formLoading"
+          :disabled="formType === 'readonly'"
+        >
+          审批拒绝
+        </el-button>
+        <el-button @click="emits('update:visible', false)">取 消</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<style scoped>
+.warning-input :deep(.el-input__inner) {
+  font-weight: bold;
+  color: var(--el-color-danger);
+}
+</style>

+ 396 - 0
src/views/pms/iotrhdailyreport/rh-form.vue

@@ -0,0 +1,396 @@
+<script lang="ts" setup generic="T">
+import { IotRhDailyReportApi } from '@/api/pms/iotrhdailyreport'
+import { FormInstance, FormRules } from 'element-plus'
+
+interface Props {
+  visible: boolean
+  type?: 'edit' | 'approval' | 'readonly'
+  loadList: () => void
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  type: 'edit'
+})
+
+const emits = defineEmits(['update:visible'])
+
+interface FormOriginal {
+  id: number
+  deptName: string
+  contractName: string
+  taskName: string
+  dailyGasInjection: number
+  dailyWaterInjection: number
+  dailyInjectGasTime: number
+  dailyInjectWaterTime: number
+  nonProductionTime: number
+  nptReason: string
+  productionStatus: string
+  remark: string
+  relocationDays: number
+  capacity: number
+  createTime: number
+  opinion: string
+}
+
+const FORM_KEYS = [
+  'id',
+  'deptId',
+  'projectId',
+  'taskId',
+  'deptName',
+  'contractName',
+  'taskName',
+  'dailyGasInjection',
+  'dailyWaterInjection',
+  'dailyInjectGasTime',
+  'dailyInjectWaterTime',
+  'nonProductionTime',
+  'nptReason',
+  'productionStatus',
+  'remark',
+  'relocationDays',
+  'capacity',
+  'createTime',
+  'opinion'
+]
+
+type Form = Partial<FormOriginal>
+
+const formRef = ref<FormInstance>()
+const loading = ref(false)
+const formLoading = ref(false)
+const formType = ref<'edit' | 'readonly'>('edit')
+const message = useMessage()
+
+const initFormData = (): Form => ({
+  dailyGasInjection: 0,
+  dailyWaterInjection: 0,
+  dailyInjectGasTime: 0,
+  dailyInjectWaterTime: 0,
+  nonProductionTime: 0,
+  relocationDays: 0,
+  capacity: 0
+})
+
+const form = ref<Form>(initFormData())
+
+async function loadDetail(id: number) {
+  loading.value = true
+  try {
+    const res = await IotRhDailyReportApi.getIotRhDailyReport(id)
+    FORM_KEYS.forEach((key) => {
+      form.value[key] = res[key] ?? form.value[key]
+    })
+    form.value.id = id
+
+    if (props.type === 'edit' && res.status !== 0) {
+      formType.value = 'readonly'
+    }
+
+    if (props.type === 'approval' && res.auditStatus !== 10) {
+      formType.value = 'readonly'
+    }
+
+    if (!form.value.capacity) {
+      message.error('请维护增压机产能')
+    }
+  } finally {
+    loading.value = false
+  }
+}
+
+function handleOpenForm(id: number, type: 'edit' | 'readonly') {
+  form.value = initFormData()
+  formRef.value?.resetFields()
+
+  formType.value = type
+
+  emits('update:visible', true)
+  loadDetail(id).then(() => {
+    formRef.value?.validate()
+  })
+}
+
+defineExpose({
+  handleOpenForm
+})
+
+const transitTime = computed(() => {
+  const cap = form.value.capacity
+  const gas = form.value.dailyGasInjection ?? 0
+
+  if (!cap) return { original: 0, value: '0%' }
+
+  const original = gas / cap
+  return { original, value: (original * 100).toFixed(2) + '%' }
+})
+
+const sumTimes = () => {
+  const { dailyInjectGasTime = 0, dailyInjectWaterTime = 0, nonProductionTime = 0 } = form.value
+  return parseFloat((dailyInjectGasTime + dailyInjectWaterTime + nonProductionTime).toFixed(2))
+}
+
+const validateTotalTime = (_rule: any, _value: any, callback: any) => {
+  const total = sumTimes()
+  if (total !== 24) {
+    callback(new Error(`当前合计 ${total} 小时,三项时间之和必须等于 24`))
+  } else {
+    callback()
+  }
+}
+
+const validateNptReason = (_rule: any, value: any, callback: any) => {
+  if ((form.value.nonProductionTime || 0) > 0 && !value) {
+    callback(new Error('非生产时间大于 0 时,必须选择原因'))
+  } else {
+    callback()
+  }
+}
+
+// const timeRuleItem = [
+//   { required: true, message: '请输入时间', trigger: 'blur' },
+//   { validator: validateTotalTime, trigger: 'blur' }
+// ]
+
+const rules = reactive<FormRules>({
+  dailyGasInjection: [{ required: true, message: '请输入当日注气量', trigger: ['change', 'blur'] }],
+  dailyWaterInjection: [
+    { required: true, message: '请输入当日注水量', trigger: ['change', 'blur'] }
+  ],
+  productionStatus: [{ required: true, message: '请输入生产动态', trigger: ['change', 'blur'] }],
+
+  // 复用规则
+  // dailyInjectGasTime: timeRuleItem,
+  // dailyInjectWaterTime: timeRuleItem,
+  // nonProductionTime: timeRuleItem,
+
+  nptReason: [{ validator: validateNptReason, trigger: ['change', 'blur'] }]
+})
+
+watch(
+  [
+    () => form.value.dailyInjectGasTime,
+    () => form.value.dailyInjectWaterTime,
+    () => form.value.nonProductionTime
+  ],
+  () => {
+    nextTick(() => {
+      formRef.value?.validateField('nptReason')
+      if (sumTimes() === 24) {
+        formRef.value?.clearValidate([
+          'dailyInjectGasTime',
+          'dailyInjectWaterTime',
+          'nonProductionTime'
+        ])
+      }
+    })
+  }
+)
+
+const { t } = useI18n()
+
+const submitForm = async () => {
+  if (!formRef.value) return
+
+  try {
+    await formRef.value.validate()
+    formLoading.value = true
+    const { createTime, ...other } = form.value
+    const data = { ...other, fillOrderCreateTime: createTime } as any
+    await IotRhDailyReportApi.createIotRhDailyReport(data)
+    message.success(t('common.updateSuccess'))
+    emits('update:visible', false)
+    props.loadList()
+  } catch (error) {
+    console.warn('表单校验未通过或提交出错')
+  } finally {
+    formLoading.value = false
+  }
+}
+</script>
+<template>
+  <el-drawer
+    :model-value="visible"
+    @update:model-value="emits('update:visible', $event)"
+    header-class="mb-0!"
+  >
+    <template #header>
+      <span class="text-xl font-bold text-[var(--el-text-color-primary)]">{{
+        type === 'edit' ? '编辑' : '审批'
+      }}</span>
+    </template>
+    <el-form
+      ref="formRef"
+      label-position="top"
+      size="default"
+      :rules="rules"
+      :model="form"
+      v-loading="loading"
+      require-asterisk-position="right"
+      :disabled="formType === 'readonly'"
+    >
+      <div class="flex flex-col gap-3 text-sm">
+        <div
+          class="rounded-md border border-blue-100 bg-blue-50/80 p-3 dark:border-blue-900/30 dark:bg-blue-900/10"
+        >
+          <div class="flex flex-col gap-2.5">
+            <div class="flex items-center justify-between">
+              <div class="text-gray-600 dark:text-gray-400">
+                <span class="font-bold text-gray-800 dark:text-gray-200">运行时效:</span>
+                当日注气量 / 产能
+              </div>
+              <span
+                class="inline-flex items-center rounded border border-red-200 bg-red-100 px-2 py-0.5 text-xs font-medium text-red-600 dark:bg-red-900/20 dark:border-red-800 dark:text-red-400"
+              >
+                >120% 红色预警
+              </span>
+            </div>
+            <!-- <div class="flex items-center justify-between">
+                <div class="text-gray-600 dark:text-gray-400">
+                  <span class="font-bold text-gray-800 dark:text-gray-200">时间平衡:</span>
+                  注气 + 注水 + 非生产 = 24H
+                </div>
+                <span
+                  class="inline-flex items-center rounded border border-orange-200 bg-orange-100 px-2 py-0.5 text-xs font-medium text-orange-600 dark:bg-orange-900/20 dark:border-orange-800 dark:text-orange-400"
+                >
+                  ≠24H 橙色预警
+                </span>
+              </div> -->
+          </div>
+        </div>
+        <div
+          v-if="form.opinion"
+          class="flex gap-3 rounded-md border border-yellow-200 bg-yellow-50 p-3 dark:border-yellow-800 dark:bg-yellow-900/10"
+        >
+          <Icon
+            icon="ep:warning-filled"
+            class="mt-0.5 shrink-0 text-base text-yellow-600 dark:text-yellow-500"
+          />
+          <div class="flex flex-col">
+            <h4 class="mb-1 font-bold text-yellow-800 dark:text-yellow-500"> 审核意见 </h4>
+            <p class="leading-relaxed text-gray-600 dark:text-gray-400">
+              {{ form.opinion }}
+            </p>
+          </div>
+        </div>
+      </div>
+
+      <div class="grid grid-cols-2 gap-4 mt-4">
+        <div class="flex items-center gap-2 grid-col-span-2">
+          <div class="bg-[var(--el-color-primary)] w-1 h-5 rounded-full"></div>
+          <div class="text-lg font-medium text-var(--el-text-color-primary)">基础信息</div>
+        </div>
+        <el-form-item label="施工队伍" prop="deptName">
+          <el-input v-model="form.deptName" placeholder="" disabled />
+        </el-form-item>
+        <el-form-item label="项目" prop="contractName">
+          <el-input v-model="form.contractName" placeholder="" disabled />
+        </el-form-item>
+        <el-form-item label="任务" prop="taskName">
+          <el-input v-model="form.taskName" placeholder="" disabled />
+        </el-form-item>
+        <el-form-item label="搬迁安装天数(D)" prop="relocationDays">
+          <el-input v-model="form.relocationDays" placeholder="" disabled />
+        </el-form-item>
+        <el-form-item label="运行时效" prop="transitTime">
+          <el-input
+            :model-value="transitTime.value"
+            placeholder="运行时效"
+            disabled
+            :class="{ 'warning-input': transitTime.original > 1.2 }"
+            id="transitTimeInput"
+          />
+        </el-form-item>
+        <el-form-item label="当日注气量(方)" prop="dailyGasInjection">
+          <el-input-number
+            class="w-full!"
+            :min="0"
+            v-model="form.dailyGasInjection"
+            placeholder="请输入当日注气量(方)"
+            align="left"
+            :controls="false"
+          />
+        </el-form-item>
+        <el-form-item label="当日注水量(方)" prop="dailyWaterInjection">
+          <el-input-number
+            class="w-full!"
+            :min="0"
+            v-model="form.dailyWaterInjection"
+            placeholder="请输入当日注水量(方)"
+            align="left"
+            :controls="false"
+          />
+        </el-form-item>
+        <el-form-item class="grid-col-span-2" label="生产动态" prop="productionStatus">
+          <el-input
+            v-model="form.productionStatus"
+            placeholder="请输入生产动态"
+            type="textarea"
+            autosize
+            :max-length="1000"
+          />
+        </el-form-item>
+        <el-form-item class="grid-col-span-2" label="备注" prop="remark">
+          <el-input
+            v-model="form.remark"
+            placeholder="请输入备注"
+            :max-length="1000"
+            type="textarea"
+            autosize
+          />
+        </el-form-item>
+        <div class="flex items-center gap-2 grid-col-span-2">
+          <div class="bg-[var(--el-color-primary)] w-1 h-5 rounded-full"></div>
+          <div class="text-lg font-medium text-var(--el-text-color-primary)">生产时间</div>
+        </div>
+        <el-form-item label="当日注气时间(H)" prop="dailyInjectGasTime">
+          <el-input-number
+            class="w-full!"
+            :min="0"
+            v-model="form.dailyInjectGasTime"
+            placeholder="请输入当日注气时间(H)"
+            align="left"
+            :controls="false"
+          />
+        </el-form-item>
+        <el-form-item label="当日注水时间(H)" prop="dailyInjectWaterTime">
+          <el-input-number
+            class="w-full!"
+            :min="0"
+            v-model="form.dailyInjectWaterTime"
+            placeholder="当日注水时间(H)"
+            align="left"
+            :controls="false"
+          />
+        </el-form-item>
+        <!-- <el-form-item label="非生产时间(H)" prop="nonProductionTime">
+          <el-input-number
+            class="w-full!"
+            :min="0"
+            v-model="form.nonProductionTime"
+            placeholder="非生产时间(H)"
+          />
+        </el-form-item>
+        <el-form-item label="非生产时间原因" prop="nptReason">
+          <el-select v-model="form.nptReason" placeholder="请选择" clearable>
+            <el-option
+              v-for="(dict, index) of getStrDictOptions(DICT_TYPE.PMS_PROJECT_NPT_REASON)"
+              :key="index"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item> -->
+      </div>
+    </el-form>
+    <template #footer>
+      <el-button size="default" @click="submitForm" type="primary" :disabled="formLoading">
+        确 定
+      </el-button>
+      <el-button size="default" @click="emits('update:visible', false)">取 消</el-button>
+    </template>
+  </el-drawer>
+</template>
+
+<style scoped></style>