ソースを参照

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/views/worker/inspectionWork/index.vue
hmm 7 ヶ月 前
コミット
addf71cc57

+ 59 - 59
pnpm-lock.yaml

@@ -427,139 +427,139 @@ packages:
       vue: ^3.2.0
 
   '@esbuild/aix-ppc64@0.21.5':
-    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [aix]
 
   '@esbuild/android-arm64@0.21.5':
-    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]
 
   '@esbuild/android-arm@0.21.5':
-    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
 
   '@esbuild/android-x64@0.21.5':
-    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
 
   '@esbuild/darwin-arm64@0.21.5':
-    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]
 
   '@esbuild/darwin-x64@0.21.5':
-    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
 
   '@esbuild/freebsd-arm64@0.21.5':
-    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]
 
   '@esbuild/freebsd-x64@0.21.5':
-    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
 
   '@esbuild/linux-arm64@0.21.5':
-    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]
 
   '@esbuild/linux-arm@0.21.5':
-    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]
 
   '@esbuild/linux-ia32@0.21.5':
-    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]
 
   '@esbuild/linux-loong64@0.21.5':
-    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
 
   '@esbuild/linux-mips64el@0.21.5':
-    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]
 
   '@esbuild/linux-ppc64@0.21.5':
-    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]
 
   '@esbuild/linux-riscv64@0.21.5':
-    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]
 
   '@esbuild/linux-s390x@0.21.5':
-    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]
 
   '@esbuild/linux-x64@0.21.5':
-    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]
 
   '@esbuild/netbsd-x64@0.21.5':
-    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
 
   '@esbuild/openbsd-x64@0.21.5':
-    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
 
   '@esbuild/sunos-x64@0.21.5':
-    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
 
   '@esbuild/win32-arm64@0.21.5':
-    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]
 
   '@esbuild/win32-ia32@0.21.5':
-    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
 
   '@esbuild/win32-x64@0.21.5':
-    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]
@@ -685,7 +685,7 @@ packages:
     resolution: {integrity: sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==}
 
   '@pkgjs/parseargs@0.11.0':
-    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz}
     engines: {node: '>=14'}
 
   '@pkgr/core@0.1.1':
@@ -706,91 +706,91 @@ packages:
         optional: true
 
   '@rollup/rollup-android-arm-eabi@4.24.0':
-    resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==}
+    resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz}
     cpu: [arm]
     os: [android]
 
   '@rollup/rollup-android-arm64@4.24.0':
-    resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
+    resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz}
     cpu: [arm64]
     os: [android]
 
   '@rollup/rollup-darwin-arm64@4.24.0':
-    resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
+    resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz}
     cpu: [arm64]
     os: [darwin]
 
   '@rollup/rollup-darwin-x64@4.24.0':
-    resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
+    resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz}
     cpu: [x64]
     os: [darwin]
 
   '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
-    resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
+    resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz}
     cpu: [arm]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.24.0':
-    resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
+    resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz}
     cpu: [arm]
     os: [linux]
     libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.24.0':
-    resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
+    resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz}
     cpu: [arm64]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.24.0':
-    resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
+    resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz}
     cpu: [arm64]
     os: [linux]
     libc: [musl]
 
   '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
-    resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
+    resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz}
     cpu: [ppc64]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.24.0':
-    resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
+    resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz}
     cpu: [riscv64]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-s390x-gnu@4.24.0':
-    resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
+    resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz}
     cpu: [s390x]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.24.0':
-    resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
+    resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz}
     cpu: [x64]
     os: [linux]
     libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.24.0':
-    resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
+    resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz}
     cpu: [x64]
     os: [linux]
     libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.24.0':
-    resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
+    resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz}
     cpu: [arm64]
     os: [win32]
 
   '@rollup/rollup-win32-ia32-msvc@4.24.0':
-    resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
+    resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz}
     cpu: [ia32]
     os: [win32]
 
   '@rollup/rollup-win32-x64-msvc@4.24.0':
-    resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
+    resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz}
     cpu: [x64]
     os: [win32]
 
@@ -798,7 +798,7 @@ packages:
     resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==}
 
   '@sxzz/popperjs-es@2.11.7':
-    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==, tarball: https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz}
 
   '@trysound/sax@0.2.0':
     resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
@@ -1030,43 +1030,43 @@ packages:
     resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
 
   '@xn-sakina/rml-darwin-arm64@2.5.0':
-    resolution: {integrity: sha512-JC1ODK8KdsrtadS/efvIXVAknllyLjt7Aov67TymUwD9sqZMQUivziPmsKrdh8FO2a7vxSZoSzuokWVEN0xgdw==}
+    resolution: {integrity: sha512-JC1ODK8KdsrtadS/efvIXVAknllyLjt7Aov67TymUwD9sqZMQUivziPmsKrdh8FO2a7vxSZoSzuokWVEN0xgdw==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-darwin-arm64/-/rml-darwin-arm64-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [arm64]
     os: [darwin]
 
   '@xn-sakina/rml-darwin-x64@2.5.0':
-    resolution: {integrity: sha512-OgZ8MTSD9PPwAhbeXV0s3u1QhsUQloBgrIk9OWNqwgtvqJLZhlASmFXGRIntbZnlYgySyV9rhxJfXZkCrIL8Cg==}
+    resolution: {integrity: sha512-OgZ8MTSD9PPwAhbeXV0s3u1QhsUQloBgrIk9OWNqwgtvqJLZhlASmFXGRIntbZnlYgySyV9rhxJfXZkCrIL8Cg==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-darwin-x64/-/rml-darwin-x64-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [x64]
     os: [darwin]
 
   '@xn-sakina/rml-linux-arm-gnueabihf@2.5.0':
-    resolution: {integrity: sha512-/ns7pt0KRWUuhjdCoQuGBKVH0O8bXyc3UKcvbsHCxCq3+6XwcErijt0n6DGkBblo8iWKV03rLOquRGjcgHxVtg==}
+    resolution: {integrity: sha512-/ns7pt0KRWUuhjdCoQuGBKVH0O8bXyc3UKcvbsHCxCq3+6XwcErijt0n6DGkBblo8iWKV03rLOquRGjcgHxVtg==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-linux-arm-gnueabihf/-/rml-linux-arm-gnueabihf-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [arm]
     os: [linux]
 
   '@xn-sakina/rml-linux-arm64-gnu@2.5.0':
-    resolution: {integrity: sha512-BwVelPhv554HaF2m/ztoAi47WXehBT+jlNguH2bFBoQ/ZCFJzvvygQ4DgSBN5GnoWjdTB3K6gUB2UHnVPuaRHg==}
+    resolution: {integrity: sha512-BwVelPhv554HaF2m/ztoAi47WXehBT+jlNguH2bFBoQ/ZCFJzvvygQ4DgSBN5GnoWjdTB3K6gUB2UHnVPuaRHg==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-linux-arm64-gnu/-/rml-linux-arm64-gnu-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [arm64]
     os: [linux]
 
   '@xn-sakina/rml-linux-arm64-musl@2.5.0':
-    resolution: {integrity: sha512-4U+djV+229GpZP5aXHq2oNSeyrg2lXGqe3gFVGy1Ag3uw1+Q2wLrHB1D6D4Vhx2pporH+/nJ92Tldz3lnhP1vw==}
+    resolution: {integrity: sha512-4U+djV+229GpZP5aXHq2oNSeyrg2lXGqe3gFVGy1Ag3uw1+Q2wLrHB1D6D4Vhx2pporH+/nJ92Tldz3lnhP1vw==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-linux-arm64-musl/-/rml-linux-arm64-musl-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [arm64]
     os: [linux]
 
   '@xn-sakina/rml-linux-x64-gnu@2.5.0':
-    resolution: {integrity: sha512-9I09DOuAaQX8AfsLJaqy7kC20LHRSaZgVj1q6oHa5Z2ChE7GAUE9KQpel2RRKS/gQzwArsACMsdkQ8KrOUMS2A==}
+    resolution: {integrity: sha512-9I09DOuAaQX8AfsLJaqy7kC20LHRSaZgVj1q6oHa5Z2ChE7GAUE9KQpel2RRKS/gQzwArsACMsdkQ8KrOUMS2A==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-linux-x64-gnu/-/rml-linux-x64-gnu-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [x64]
     os: [linux]
 
   '@xn-sakina/rml-linux-x64-musl@2.5.0':
-    resolution: {integrity: sha512-QoVii5PTvTrWcKZEUp1lMsr3WlxmN84RgQqr7kjngIhWEqWiWWUUQ3se7y848+pAVGvJsqw44Cy0MdfyJyuexQ==}
+    resolution: {integrity: sha512-QoVii5PTvTrWcKZEUp1lMsr3WlxmN84RgQqr7kjngIhWEqWiWWUUQ3se7y848+pAVGvJsqw44Cy0MdfyJyuexQ==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-linux-x64-musl/-/rml-linux-x64-musl-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [x64]
     os: [linux]
@@ -1075,13 +1075,13 @@ packages:
     resolution: {integrity: sha512-S9dFEB8jxxwarcSNh/sEcpRapB11RsZzOW6Bl3VgcJZTHKm+y61we4weu+tipAUwjmmCnXyOuqqydm8E8wSNsA==}
 
   '@xn-sakina/rml-win32-arm64-msvc@2.5.0':
-    resolution: {integrity: sha512-Y9+WXxLSuW23/7d36i5uJeOJkxKVPpLTp7w6lpPXOTP19bIfDKGhhNEQ3+r1eBU4cOf9xsScGA5jcaMGdFtcjA==}
+    resolution: {integrity: sha512-Y9+WXxLSuW23/7d36i5uJeOJkxKVPpLTp7w6lpPXOTP19bIfDKGhhNEQ3+r1eBU4cOf9xsScGA5jcaMGdFtcjA==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-win32-arm64-msvc/-/rml-win32-arm64-msvc-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [arm64]
     os: [win32]
 
   '@xn-sakina/rml-win32-x64-msvc@2.5.0':
-    resolution: {integrity: sha512-MCdLOANVS4gVrkRaZ9UIC2ZU7yGVNUXuxFhrnp6SlNqa7u5Dy1TPJ2SnCXjddt1GzBW/1r+1NckzmPuSVkExvg==}
+    resolution: {integrity: sha512-MCdLOANVS4gVrkRaZ9UIC2ZU7yGVNUXuxFhrnp6SlNqa7u5Dy1TPJ2SnCXjddt1GzBW/1r+1NckzmPuSVkExvg==, tarball: https://registry.npmmirror.com/@xn-sakina/rml-win32-x64-msvc/-/rml-win32-x64-msvc-2.5.0.tgz}
     engines: {node: '>=14'}
     cpu: [x64]
     os: [win32]
@@ -1801,7 +1801,7 @@ packages:
     engines: {node: '>=6'}
 
   errno@0.1.8:
-    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz}
     hasBin: true
 
   error-ex@1.3.2:
@@ -2064,7 +2064,7 @@ packages:
     engines: {node: '>=12'}
 
   fsevents@2.3.3:
-    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
     os: [darwin]
 
@@ -2173,7 +2173,7 @@ packages:
     resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
 
   graceful-fs@4.2.11:
-    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz}
 
   graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
@@ -2294,7 +2294,7 @@ packages:
     engines: {node: '>= 4'}
 
   image-size@0.5.5:
-    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz}
     engines: {node: '>=0.10.0'}
     hasBin: true
 
@@ -2698,7 +2698,7 @@ packages:
     resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
 
   make-dir@2.1.0:
-    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz}
     engines: {node: '>=6'}
 
   map-cache@0.2.2:
@@ -2767,7 +2767,7 @@ packages:
     engines: {node: '>= 0.6'}
 
   mime@1.6.0:
-    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz}
     engines: {node: '>=4'}
     hasBin: true
 
@@ -2842,7 +2842,7 @@ packages:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
   needle@3.3.1:
-    resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+    resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, tarball: https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz}
     engines: {node: '>= 4.4.x'}
     hasBin: true
 
@@ -3476,7 +3476,7 @@ packages:
     engines: {node: '>=0.10.0'}
 
   source-map@0.6.1:
-    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz}
     engines: {node: '>=0.10.0'}
 
   sourcemap-codec@1.4.8:
@@ -3784,7 +3784,7 @@ packages:
     resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
 
   uglify-js@3.19.3:
-    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.19.3.tgz}
     engines: {node: '>=0.8.0'}
     hasBin: true
 

+ 10 - 0
src/api/InformationReception/InformationReception.ts

@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+// 信息列表
+export function InformationList(data) {
+  return request({
+    url: "/api/info_publish/back/list",
+    method: "get",
+    data: data
+  });
+}

+ 46 - 0
src/api/duty/duty.ts

@@ -0,0 +1,46 @@
+import request from '@/utils/request';
+
+// 当前值班内容
+export function dutyByDay(params) {
+  return request({
+    url: '/api/duty_management/duty/duty_by_day',
+    method: 'get',
+    params: params
+  });
+}
+
+// 新增提醒或者待办
+export function addDutyNotify(data) {
+  return request({
+    url: '/api/duty_management/duty/add_notify',
+    method: 'post',
+    data: data
+  });
+}
+
+// 交班
+export function handover(data) {
+  return request({
+    url: '/api/duty_management/duty/handover',
+    method: 'post',
+    data: data
+  });
+}
+
+// 排班表
+export function duty_book_by_area(params) {
+  return request({
+    url: '/api/duty_management/duty/duty_book_by_area',
+    method: 'get',
+    params: params
+  });
+}
+
+// 上传值班表
+export function upload_duty_book(data) {
+  return request({
+    url: '/api/duty_management/duty/upload_duty_book',
+    method: 'post',
+    data: data
+  });
+}

+ 9 - 0
src/api/inspectionWork/inspector.ts

@@ -0,0 +1,9 @@
+import request from '@/utils/request';
+
+export function workSubList(params) {
+    return request({
+      url: '/api/riskManagement/inspection/task/list',
+      method: 'get',
+      params: params
+    });
+}

+ 2 - 0
src/api/inspectionWork/riskManagement.ts

@@ -0,0 +1,2 @@
+import request from '@/utils/request';
+

+ 1 - 1
src/api/onlineRollCall/index.ts

@@ -63,7 +63,7 @@ export function endCall(data) {
 }
 
 // 标记用户已应答
-export function ackCall(data) {
+export function ackMyCall(data) {
     return request({
         url: '/api/online_roll_call/call/ack',
         method: 'post',

+ 17 - 10
src/components/FileUpload/index.vue

@@ -1,15 +1,18 @@
 <template>
   <div>
-    <van-uploader
-        multiple
-        :accept="fileType.toString()"
-        :max-count="limit"
-        :max-size="fileSize * 1024 * 1024"
-        @oversize="onOversize"
-        :before-read="beforeRead"
-        :after-read="afterRead">
-      <van-button icon="plus" type="primary" class="button">上传文件</van-button>
-    </van-uploader>
+    <div class="flex-box">
+      <van-uploader
+          multiple
+          :accept="fileType.toString()"
+          :max-count="limit"
+          :max-size="fileSize * 1024 * 1024"
+          @oversize="onOversize"
+          :before-read="beforeRead"
+          :after-read="afterRead">
+        <van-button icon="plus" type="primary" class="button">上传文件</van-button>
+      </van-uploader>
+      <slot></slot>
+    </div>
     <div v-if="isShowTip" class="upload-tip">
       <div v-if="fileType">1、支持{{ fileType.join('、') }}文件</div>
       <div v-if="limit">2、最多支持上传{{limit}}个文件</div>
@@ -255,4 +258,8 @@ const handleDownload = (file: any) => {
     }
   }
 }
+.flex-box {
+  display: flex;
+  align-items: center;
+}
 </style>

+ 9 - 7
src/components/OnlineRollCall/index.vue

@@ -34,7 +34,7 @@
 <script lang="ts" setup name="OnlineRollCall">
 import { ref, onUnmounted, nextTick } from "vue";
 import { useRouter } from "vue-router";
-import { hasMyCall } from "@/api/onlineRollCall";
+import { hasMyCall, ackMyCall } from "@/api/onlineRollCall";
 
 const router = useRouter();
 
@@ -56,11 +56,13 @@ const handleToRollCall = () => {
     img.value = "2";
   }, 3000);
 };
-const handleToRollCall2 = () => {
-  router.push({
-    name: "RollCallDetails",
-    query: { id: rollCallData.value.id }
-  });
+const handleToRollCall2 = () => {  
+  ackMyCall({call_id: rollCallData.value.id}).then((res)=>{
+    router.push({
+      name: "rollCallRecord2",
+      query: { id: rollCallData.value.id }
+    });
+  })
 };
 const calculateDuration = startTimeStr => {
   // 将起始时间字符串转换为日期对象
@@ -96,7 +98,7 @@ const handleHideDialog = () => {
 };
 nextTick(() => {
   const env = import.meta.env.VITE_APP_ENV
-  if (env != 'development') {
+  if (env != 'development_') {
     hasMyCall({}).then((res)=>{
       if(res.data && res.data.length > 0) {
         rollCallData.value = res.data[0];

+ 1 - 1
src/components/Tabbar/index.vue

@@ -110,7 +110,7 @@ onMounted(() => {
       iconActive: 'command',
       title: "移动指挥",
       to: {
-        name: "MobileControl2"
+        name: "MobileControl"
       }
     }
   }

+ 9 - 0
src/router/routes.ts

@@ -298,6 +298,15 @@ export const workerRoute = [
           title: "值班管理",
           noCache: true
         }
+      },
+      {
+        path: "rollCallRecord2",
+        name: "rollCallRecord2",
+        component: () => import("@/views/onlineRollCall/rollCallRecord2.vue"),
+        meta: {
+          title: "点名记录",
+          noCache: true
+        }
       }
     ]
   }

+ 176 - 141
src/views/InformationReception/index.vue

@@ -1,193 +1,218 @@
 <template>
   <div class="table-content">
+    <!-- 搜索框 -->
+    <div class="search-box">
+      <el-input
+        v-model="searchQuery"
+        class="search-input"
+        placeholder="请输入内容"
+        prefix-icon="el-icon-search"
+        clearable
+        @keyup.enter="onSearch"
+      />
+    </div>
     <!-- 筛选和排序区域 -->
     <div class="filter-sort-area">
       <div class="filter-item">
         <span>类型:</span>
-        <el-select
-          v-model="selectedType"
-          placeholder="请选择类型"
-          @change="fetchData"
-        >
-          <el-option
-            v-for="type in types"
-            :key="type"
-            :label="type"
-            :value="type"
-          />
-        </el-select>
+        <span class="type-trigger" @click="showTypePicker">
+          {{ selectedType || "请选择类型" }}
+          <i class="el-icon-arrow-down" />
+        </span>
       </div>
+      <!-- 类型选择抽屉 -->
+      <el-drawer
+        v-model="typeDrawerVisible"
+        title="选择类型"
+        direction="btt"
+        size="30%"
+      >
+        <ul>
+          <li v-for="type in types" :key="type" @click="selectType(type)">
+            {{ type }}
+          </li>
+        </ul>
+      </el-drawer>
       <div class="filter-item">
         <span>时间:</span>
-        <el-date-picker
-          v-model="selectedTime"
-          type="daterange"
-          range-separator="至"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          @change="fetchData"
-        />
+        <span class="time-label" @click="showTimePicker">
+          {{ selectedTimeLabel || "请选择时间" }}
+        </span>
+        <i class="el-icon-arrow-down" />
       </div>
       <div class="filter-item">
         <span>排序:</span>
-        <el-radio-group v-model="sortOrder" @change="fetchData">
-          <el-radio-button :label="'asc'">正序</el-radio-button>
-          <el-radio-button :label="'desc'">倒序</el-radio-button>
-        </el-radio-group>
+        <span class="sort-order" @click="toggleSortOrder">
+          {{ sortOrder === "asc" ? "↑" : "↓" }}
+          <i
+            :class="['el-icon-arrow-up', sortOrder === 'asc' ? 'active' : '']"
+          />
+          <i
+            :class="[
+              'el-icon-arrow-down',
+              sortOrder === 'desc' ? 'active' : ''
+            ]"
+          />
+        </span>
       </div>
     </div>
 
     <!-- 信息列表 -->
-    <div v-for="(item, index) in dataList" :key="index" class="info-box">
-      <div class="status-icon" :class="item.statusClass" />
+    <div v-for="(item, index) in sortedDataList" :key="index" class="info-box">
+      <div class="status-icon" :class="getStatusClass(item.examine_status)" />
       <div class="info-content">
         <div class="info-header">
           <div class="info-title">{{ item.title }}</div>
-          <div class="info-time">{{ item.time }}</div>
+          <div class="info-time">{{ item.publish_time }}</div>
+        </div>
+        <div class="info-description">
+          <div>发布人:{{ item.nick_name }}</div>
+          <div>部门:{{ item.dept_name }}</div>
+          <div>发布渠道:{{ item.publish_channel }}</div>
+          <div>阅读次数:{{ item.user_count }}</div>
+          <div>审核状态:{{ item.examine_status }}</div>
+          <div>发布状态:{{ item.publish_status }}</div>
         </div>
-        <div class="info-description">{{ item.description }}</div>
       </div>
     </div>
+    <!-- 时间选择抽屉 -->
+    <el-drawer
+      v-model="drawerVisible"
+      title="选择时间"
+      direction="btt"
+      size="30%"
+    >
+      <el-date-picker
+        v-model="selectedTime"
+        type="daterange"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+        @change="handleTimeChange"
+      />
+      <span class="drawer-footer">
+        <el-button @click="drawerVisible = false">取消</el-button>
+        <el-button type="primary" @click="confirmTime">确定</el-button>
+      </span>
+    </el-drawer>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted, reactive, onUnmounted, watch } from "vue";
-import { selectTask } from "@/api/emergencyCommandMap/JointDuty";
+import { ref, onMounted, onUnmounted, watch, computed } from "vue";
+import { InformationList } from "@/api/InformationReception/InformationReception";
 import { parseTime } from "@/utils/ruoyi";
+import {
+  ElInput,
+  ElDrawer,
+  ElDatePicker,
+  ElButton,
+  ElIconArrowDown
+} from "element-plus";
 
-const newSectionState = reactive({
-  showListDialog: false
-});
-
-// 选中的任务
-const selectedTask = ref({
-  task_id: "",
-  sortBy: "creation_time",
-  pageNum: 2,
-  pageSize: 20,
-  event_code: "YJSJ0000000001"
-});
-// ref()创建一个响应式对象
 const dataList = ref([]);
-const showScroll = ref(false);
+const selectedType = ref("↓");
+const types = ref(["预警", "灾情", "处置", "指挥救援", "公众防范"]);
+const selectedTime = ref([null, null]);
+const sortOrder = ref("desc");
+const drawerVisible = ref(false); // 确保使用 ref 定义
+const selectedTimeLabel = ref("↓");
+const typeDrawerVisible = ref(false);
+const searchQuery = ref("");
+
+const sortedDataList = computed(() => {
+  return dataList.value.slice().sort((a, b) => {
+    if (sortOrder.value === "asc") {
+      return new Date(a.publish_time) - new Date(b.publish_time);
+    } else {
+      return new Date(b.publish_time) - new Date(a.publish_time);
+    }
+  });
+});
 
-const props = defineProps<{
-  eventId?: string; // 使用可选属性
-}>();
+const showTypePicker = () => {
+  typeDrawerVisible.value = true;
+};
 
-// 事件接报
-const eventManageState = reactive({
-  showListDialog: false
-});
+const selectType = type => {
+  selectedType.value = type;
+  typeDrawerVisible.value = false;
+  fetchData(); // 重新获取数据
+};
 
-// 请求数据
 const fetchData = async () => {
   try {
-    console.log("请求任务数据:", props.eventId);
-    // 构建请求参数对象
     const params = {
-      event_code: selectedTask.value.event_code, // 确保这里的 props.eventId 是字符串类型,如果是数字类型需要转换为字符串
-      sortOrder: sortOrder.value, // 假设 sortOrder 是响应式的
-      sortBy: selectedTask.value.sortBy // 假设 sortBy 是 selectedTask 的一个属性
+      publish_group: "",
+      publish_status: "0",
+      examine_status: "0",
+      page: "1",
+      page_size: "20"
     };
-    const res = await selectTask(params); // 确保 selectTask 函数正确处理了这些参数
-    res.data.forEach(item => {
-      item.update_time = parseTime(item.update_time);
-      item.statusClass = getStatusClass(item.status);
+    const res = await InformationList(params);
+    dataList.value = res.data.map(item => {
+      item.publish_time = parseTime(item.publish_time);
+      return item;
     });
-    dataList.value = res.data;
+    sortedDataList.value = dataList.value;
   } catch (error) {
     console.error("请求任务数据失败:", error);
   }
 };
 
-const openUpdateDialog = task => {
-  selectedTask.value = { ...task };
-  newSectionState.showListDialog = true;
-};
-
-const handleUpdateSuccess = updatedData => {
-  console.log("任务进度更新成功:", updatedData);
-  fetchData(); // 重新加载任务列表
-};
-
-const toggleScroll = () => {
-  showScroll.value = !showScroll.value;
-};
-
-// 设置定时器
-const fetchInterval = process.env.NODE_ENV === "development" ? 60000 : 3000; // 每60秒刷新一次(刷新太频繁影响调试)
-let intervalId: number | null = null;
-
-const startFetchingData = () => {
-  if (!intervalId) {
-    intervalId = setInterval(() => {
-      fetchData();
-    }, fetchInterval);
-  }
-};
-
-const stopFetchingData = () => {
-  if (intervalId) {
-    clearInterval(intervalId);
-    intervalId = null;
-  }
-};
-
-// 在组件挂载时开始定时获取数据
 onMounted(() => {
-  if (props.eventId) {
-    fetchData();
-    startFetchingData();
-  }
+  fetchData();
 });
 
-// 在组件卸载时清除定时器
 onUnmounted(() => {
-  stopFetchingData();
+  // 清除定时器等资源
 });
 
+const toggleSortOrder = () => {
+  sortOrder.value = sortOrder.value === "asc" ? "desc" : "asc";
+};
+
 watch(
-  () => props.eventId,
-  newValue => {
-    if (newValue) {
-      fetchData();
-      startFetchingData();
-    } else {
-      stopFetchingData();
-    }
-  },
-  { immediate: true }
+  () => [selectedType.value, selectedTime.value, sortOrder.value],
+  () => {
+    fetchData();
+  }
 );
 
-// 类型筛选
-const selectedType = ref("");
-const types = ref(["预警", "灾情", "处置", "指挥救援", "公众防范"]);
+const showTimePicker = () => {
+  drawerVisible.value = true;
+};
 
-// 时间筛选
-const selectedTime = ref([null, null]);
+const handleTimeChange = value => {
+  selectedTimeLabel.value = value ? `${value[0]} 至 ${value[1]}` : "请选择时间";
+};
 
-// 排序
-const sortOrder = ref("desc");
+const confirmTime = () => {
+  drawerVisible.value = false;
+  fetchData(); // 重新获取数据
+};
 
-// 根据状态设置类名的方法
 const getStatusClass = (status: string): string => {
   switch (status) {
-    case "预警":
+    case "审核中":
       return "warning-icon";
-    case "灾情":
-      return "disaster-icon";
-    case "处置":
-      return "disposal-icon";
-    case "指挥救援":
-      return "rescue-icon";
-    case "公众防范":
-      return "public-defense-icon";
+    case "待审批":
+      return "pending-icon";
+    case "已通过":
+      return "success-icon";
+    case "已拒绝":
+      return "error-icon";
     default:
       return "";
   }
 };
+
+//搜索
+const onSearch = () => {
+  // 执行搜索操作
+  console.log("搜索内容:", searchQuery.value);
+  // 这里可以添加搜索的逻辑,比如调用 API 或更新数据列表
+};
 </script>
 
 <style scoped>
@@ -210,10 +235,14 @@ const getStatusClass = (status: string): string => {
 
 .info-box {
   display: flex;
-  margin-bottom: 16px;
+  align-items: center;
+  padding: 10px;
+  border-bottom: 1px solid #eee;
 }
 
 .status-icon {
+  width: 20px;
+  height: 20px;
   margin-right: 10px;
 }
 
@@ -240,24 +269,30 @@ const getStatusClass = (status: string): string => {
   color: #333;
 }
 
-/* 添加状态图标的样式 */
-.warning-icon {
-  /* 预警图标样式 */
+.el-icon-arrow-down {
+  margin-left: 8px;
 }
 
-.disaster-icon {
-  /* 灾情图标样式 */
+.sort-order {
+  cursor: pointer;
+  display: flex;
+  align-items: center;
 }
 
-.disposal-icon {
-  /* 处置图标样式 */
+.el-icon-arrow-up,
+.el-icon-arrow-down {
+  margin-left: 5px;
 }
 
-.rescue-icon {
-  /* 指挥救援图标样式 */
+.search-box {
+  padding: 10px;
+  background-color: #f5f5f5;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
 
-.public-defense-icon {
-  /* 公众防范图标样式 */
+.search-input {
+  width: 300px;
 }
 </style>

+ 38 - 25
src/views/duty/dutyCalendar.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="calendar-container">
-    <Calendar ref="calendarRef" :current="current" :dotDays="dutyData.dateList" @change="handleChange" />
+    <Calendar ref="calendarRef" :current="current" :dotDays="dutyData.days" @change="handleChange" @select="handleSelect" />
     <div class="duty-card">
       <div class="duty-header">当天值班:{{ parseTime(current, '{y}年{m}月{d}日') }}</div>
       <div class="duty-content">
@@ -9,35 +9,35 @@
             <i class="icon" />
             <div>带班领导</div>
           </div>
-          <div class="item-label">{{ dutyData.data1 }}</div>
+          <div class="item-label">{{ dutyData.users.user1 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>主班</div>
           </div>
-          <div class="item-label">{{ dutyData.data2 }}</div>
+          <div class="item-label">{{ dutyData.users.user2 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>副班</div>
           </div>
-          <div class="item-label">{{ dutyData.data3 }}</div>
+          <div class="item-label">{{ dutyData.users.user3 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>备班</div>
           </div>
-          <div class="item-label">{{ dutyData.data4 }}</div>
+          <div class="item-label">{{ dutyData.users.user4 }}</div>
         </div>
       </div>
     </div>
     <div class="duty-card">
       <div class="duty-header">提醒事项</div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList2" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.remainds" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -46,7 +46,7 @@
     <div class="duty-card">
       <div class="duty-header">待办事项</div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList3" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.todos" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -61,35 +61,45 @@
 <script lang="ts" setup>
 import {onMounted, ref} from "vue";
 import {parseTime} from "@/utils/ruoyi";
+import { dutyByDay } from "@/api/duty/duty";
 
 let calendarRef = ref();
 const current = ref('');
 const dutyData  = ref({
-  data1: '张珊珊1',
-  data2: '张珊珊2',
-  data3: '张珊珊3',
-  data4: '张珊珊4',
-  dateList: [
-    { date: '2024-10-19', color: '#a2d7f1' },
-    { date: '2024-10-18', color: '#ffd5d8' },
-    { date: '2024-10-17', color: '#ffefcc' },
-    { date: '2024-10-16', color: '#dfdfdf' }
+  users: {
+    user1: '',
+    user2: '',
+    user3: '',
+    user4: ''
+  },
+  days: [
+    // 不知道这个有什么用
+    //{ date: '2024-10-19', color: '#a2d7f1' },
+    //{ date: '2024-10-18', color: '#ffd5d8' },
+    //{ date: '2024-10-17', color: '#ffefcc' },
+    //{ date: '2024-10-16', color: '#dfdfdf' }
   ],
-  dataList2: [
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
+  remainds: [
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
   ],
-  dataList3: [
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
+  todos: [
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
   ]
 })
 
+const handleSelect = (date) => {
+  console.log(date.value);
+}
 const handleChange = (date) => {
   current.value = date.value;
-  console.log(current.value)
+  console.log(current.value);
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+  });
 }
 
 const initData = () => {
@@ -101,6 +111,9 @@ const handleToShiftChange = () => {
 }
 onMounted(() => {
   initData();
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+  });
 })
 </script>
 

+ 4 - 2
src/views/duty/index.vue

@@ -7,8 +7,9 @@
       </div>
     </div>
     <div class="content">
-      <duty-calendar v-show="activeIndex === 'calendar'" @changIndex="handleClickTab" />
-      <shift-change v-show="activeIndex === 'shiftChange'" />
+      <DutyCalendar v-if="activeIndex === 'calendar'" @changIndex="handleClickTab" />
+      <ShiftChange v-else-if="activeIndex === 'shiftChange'" />
+      <Rota v-else-if="activeIndex === 'rota'" />
     </div>
   </div>
 </template>
@@ -17,6 +18,7 @@
 import { ref } from "vue";
 import DutyCalendar from "@/views/duty/dutyCalendar.vue";
 import ShiftChange from "@/views/duty/shiftChange.vue";
+import Rota from "@/views/duty/rota.vue";
 
 let activeIndex = ref('calendar');
 let tabs = ref([

+ 204 - 0
src/views/duty/rota.vue

@@ -0,0 +1,204 @@
+<template>
+  <div class="rota-container">
+    <div class="field-box">
+      <van-field
+          v-model="fieldValue"
+          is-link
+          readonly
+          placeholder="请选择"
+          @click="showPicker = true"
+      />
+    </div>
+    <div class="rota-list">
+      <div class="rota-header">
+        <el-icon class="hand" @click="nextYear(-1)"><ArrowLeft /></el-icon>
+        <div class="calendar-header__center">{{ queryParams.year }}年</div>
+        <el-icon class="hand" @click="nextYear(1)"><ArrowRight /></el-icon>
+      </div>
+      <div class="rota-content">
+        <div v-for="(item, index) in dataList" :key="index" class="rota-item">
+          <div class="item-header">
+            <div class="text1">{{item.name}}</div>
+            <div class="text2">{{item.time}}</div>
+          </div>
+          <div class="img" @click="handleDownload(item.url, item.name2)"></div>
+        </div>
+      </div>
+    </div>
+    <div class="footer">
+      <div class="confirm-btn" @click="handleShowUpload">上传值班表</div>
+    </div>
+    <van-popup v-model:show="showPicker" round position="bottom">
+      <van-picker
+          :columns="columns"
+          @cancel="showPicker = false"
+          @confirm="onConfirm"
+      />
+    </van-popup>
+    <!--上传值班表-->
+    <upload-rota v-model:show="showPicker2" />
+  </div>
+</template>
+
+<script lang="ts" setup name="rota">
+import {onMounted, reactive, ref} from "vue";
+import {showConfirmDialog, showFailToast} from "vant";
+import {ArrowLeft, ArrowRight} from "@element-plus/icons-vue";
+import {ElIcon} from "element-plus";
+import dayjs from "dayjs";
+import {download2} from "@/utils/request";
+import UploadRota from "@/views/duty/uploadRota.vue";
+import {duty_book_by_area} from "@/api/duty/duty";
+
+const columns = [
+  { text: '茂名市', value: '440900' },
+  { text: '茂南区', value: '440902' },
+  { text: '电白区', value: '440904' },
+  { text: '高州市', value: '440981' },
+  { text: '化州市', value: '440982' },
+  { text: '信宜市', value: '440983' },
+  { text: '滨海新区', value: '440984' },
+  { text: '高新区', value: '440983' },
+];
+const fieldValue = ref('茂名市');
+const queryParams = reactive({
+  area: '440900',
+  year: dayjs().year()
+})
+const dataList = ref([]);
+const showPicker = ref(false);
+const baseUrl = import.meta.env.VITE_BASE_API;
+
+// 上下一年
+const nextYear = (number: number) => {
+  queryParams.year  = queryParams.year + number;
+  getList();
+};
+// 获取数据
+const getList = () => {
+  duty_book_by_area(queryParams).then((res)=>{
+    dataList.value = res.data;
+  })
+  /*
+  dataList.value = [
+    { name: '一月份排班表', name2: '一月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '二月份排班表', name2: '二月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '三月份排班表', name2: '三月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '四月份排班表', name2: '四月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '五月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '六月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '七月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '八月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '九月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '十月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '十一月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+    { name: '十二月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
+  ];
+  */
+
+}
+// 下载
+const handleDownload = (url, name) => {
+  if(url!="") {
+    showConfirmDialog({
+      title: '提示',
+      message: '是否下载排班表?',
+    }).then(() => {
+      download2(baseUrl + '/file/download/' + url, name);
+    })
+  }
+}
+// 选择区域
+const onConfirm = ({ selectedOptions }) => {
+  showPicker.value = false;
+  fieldValue.value = selectedOptions[0].text;
+  queryParams.area = selectedOptions[0].value;
+  getList();
+};
+let showPicker2 = ref(false);
+// 上传弹窗
+const handleShowUpload = () => {
+  showPicker2.value = true;
+};
+onMounted(() => {
+  getList();
+})
+</script>
+
+<style lang="scss" scoped>
+.rota-container {
+  .field-box {
+    width: 100%;
+    padding: 10px 15px;
+    background-color: #ffffff;
+    border-bottom: 1px solid #eeeeee;
+    .van-field {
+      border: 1px solid #eeeeee;
+      padding: 5px 15px;
+    }
+  }
+  .rota-list {
+    .rota-header {
+      height: 45px;
+      background-color: #ffffff;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 0 15px;
+    }
+    .rota-content {
+      display: flex;
+      flex-wrap: wrap;
+      padding: 15px;
+      background-color: #ffffff;
+      .rota-item {
+        width: 167.5px;
+        background-color: #f2f2f2;
+        margin-bottom: 10px;
+        padding: 6px;
+        &:nth-child(odd) {
+          margin-right: 10px;
+        }
+        .item-header {
+          display: flex;
+          justify-content: space-between;
+          .text1 {
+            font-size: 14px;
+          }
+          .text2 {
+            font-size: 12px;
+          }
+        }
+        .img {
+          width: 100%;
+          height: 80px;
+          background-color: #9d9d9d;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+}
+.footer {
+  position: fixed;
+  bottom: 55px;
+  left: 0;
+  width: 100%;
+  height: 55px;
+  background: #FFFFFF;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  .confirm-btn {
+    width: 110px;
+    height: 40px;
+    background: #2C81FF;
+    border-radius: 2px;
+    font-size: 16px;
+    color: #FFFFFF;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+}
+</style>

+ 82 - 17
src/views/duty/shiftChange.vue

@@ -3,10 +3,10 @@
     <div class="duty-card">
       <div class="duty-header">
         <div>提醒事项</div>
-        <div class="add-text" @click="handleShowAdd('1')">新增事项</div>
+        <div v-if="status==0" class="add-text" @click="handleShowAdd('1')">新增事项</div>
       </div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList2" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.remainds" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -15,46 +15,58 @@
     <div class="duty-card">
       <div class="duty-header">
         <div>待办事项</div>
-        <div class="add-text" @click="handleShowAdd('2')">新增事项</div>
+        <div v-if="status==0" class="add-text" @click="handleShowAdd('2')">新增事项</div>
       </div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList3" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.todos" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
       </div>
     </div>
     <div class="footer">
-      <div class="confirm-btn" @click="handleToShiftChange">确认交班</div>
+      <div v-if="status==0" class="confirm-btn" @click="handleToShiftChange">确认交班</div>
+      <div v-if="status==1" class="confirm-btn handover_btn">已交班,交班时间:{{shift_time}}</div>
     </div>
     <van-dialog
         v-model:show="show"
         class="custom-dialog"
         :title="eventKey === '1' ? '新增提醒事项' : '新增待办事项'"
-        confirmButtonText="确认点名"
+        show-cancel-button
+        @cancel="handleCancel"
         @confirm="handleConfirm"
     >
-      <van-field v-model="content" :placeholder="eventKey === '1' ? '请输入提醒事项' : '请输入待办事项'" />
+      <van-field v-model="content" :placeholder="eventKey === '1' ? '请输入提醒事项' : '请输入待办事项'"  type="textarea" rows="5" />
     </van-dialog>
   </div>
 </template>
 
 <script lang="ts" setup name="shiftChange">
-import {ref} from "vue";
+import {onMounted, ref} from "vue";
+import {showConfirmDialog, showFailToast} from "vant";
+import {parseTime} from "@/utils/ruoyi";
+import { dutyByDay, addDutyNotify, handover } from "@/api/duty/duty";
 
+const emits = defineEmits(['confirm']);
 let show = ref(false);
+const current = ref('');
+const status = ref(0);
+const shift_time = ref('');
 let eventKey = ref('');
 let content = ref('');
 const dutyData  = ref({
-  dataList2: [
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
+  shift_id: 0,
+  shift_status: 0,
+  handover_time: '',
+  remainds: [
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
   ],
-  dataList3: [
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
+  todos: [
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
   ]
 });
 const handleShowAdd = (key) => {
@@ -62,12 +74,61 @@ const handleShowAdd = (key) => {
   show.value = true;
 }
 const handleToShiftChange = () => {
+  showConfirmDialog({
+    title: '提示',
+    message: '是否确认交班?',
+  }).then(() => {
+    handover({
+      shift_id: dutyData.value.shift_id
+    }).then((res)=>{
+      getDuytData();
+    })
 
+    // on confirm
+  })
+}
+// 编辑
+const handleCancel = () => {
+  show.value = false;
+  content.value = '';
 }
 // 新增
 const handleConfirm = () => {
+  if(content.value == '') {
+    showFailToast("请输入事项内容");
+  }
+  else {
+    addDutyNotify({
+      shift_id: dutyData.value.shift_id, 
+      notify_content: content.value, 
+      notify_type: eventKey.value}
+    ).then((res)=>{
+      getDuytData();
+    })
+  }
+  // let method = eventKey.value === '1' ? 'method1' : 'method2';
+  // method().then((res) => {
+  //   show.value = false;
+  //   content.value = false;
+  //   emits('confirm');
+  // })
+};
 
-}
+const getDuytData = () => {
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+    status.value = dutyData.value.shift_status;
+    shift_time.value = dutyData.value.handover_time;
+    
+    show.value = false;
+    content.value = '';
+  });
+};
+
+onMounted(()=>{
+  current.value = parseTime(new Date(), '{y}-{m}-{d}');
+  getDuytData();
+})
 </script>
 
 <style lang="scss" scoped>
@@ -148,5 +209,9 @@ const handleConfirm = () => {
     justify-content: center;
     align-items: center;
   }
+  .handover_btn {
+    background: #aaa;
+    width:330px;
+  }
 }
 </style>

+ 188 - 0
src/views/duty/uploadRota.vue

@@ -0,0 +1,188 @@
+<template>
+  <div>
+    <van-popup v-model:show="showPicker">
+      <van-form @submit="onSubmit">
+        <div class="van-doc-block__title">上传值班表</div>
+        <van-field
+            v-model="formLabel.area"
+            is-link
+            readonly
+            name="area"
+            label="区划"
+            placeholder="请选择"
+            :rules="[{ required: true, message: '请选择区划', trigger: 'change' }]"
+            @click="showPicker2 = true"
+        />
+        <van-field
+            v-model="form.year"
+            is-link
+            readonly
+            name="year"
+            label="年份"
+            placeholder="请选择"
+            :rules="[{ required: true, message: '请选择年份', trigger: 'change' }]"
+            @click="showPicker3 = true"
+        />
+        <van-field
+            v-model="form.month"
+            is-link
+            readonly
+            name="month"
+            label="月份"
+            placeholder="请选择"
+            :rules="[{ required: true, message: '请选择月份', trigger: 'change' }]"
+            @click="showPicker4 = true"
+        />
+        <van-field
+            name="files"
+            label="值班表"
+            label-align="top"
+            :rules="[{ validator: validatorFile, message: '请上传值班表', trigger: 'change' }]"
+        >
+          <template #input>
+            <FileUpload v-model="form.files" :limit="1" :fileType="['xls', 'xlsx']" :isShowTip="false">
+              <van-button type="primary" class="button" @click="handleDownload">模板下载</van-button>
+            </FileUpload>
+          </template>
+        </van-field>
+        <div class="popup-footer">
+          <van-button @click="handleCancel" class="cancel-btn">取 消</van-button>
+          <van-button type="primary" native-type="submit" class="confirm-btn">确 定</van-button>
+        </div>
+      </van-form>
+    </van-popup>
+    <van-popup v-model:show="showPicker2" round position="bottom">
+      <van-picker
+          title="选择区划"
+          :columns="columns"
+          @confirm="onConfirm"
+          @cancel="showPicker2 = false"
+      />
+    </van-popup>
+    <van-popup v-model:show="showPicker3" round position="bottom">
+      <van-date-picker
+          v-model="formLabel.year"
+          title="选择年份"
+          :columns-type="['year']"
+          @confirm="onConfirm2"
+          @cancel="showPicker3 = false"
+      />
+    </van-popup>
+    <van-popup v-model:show="showPicker4" round position="bottom">
+      <van-date-picker
+          v-model="formLabel.month"
+          title="选择月份"
+          :columns-type="['month']"
+          @confirm="onConfirm3"
+          @cancel="showPicker4 = false"
+      />
+    </van-popup>
+  </div>
+</template>
+
+<script lang="ts" setup name="uploadRota">
+import {computed, ref} from "vue";
+import dayjs from "dayjs";
+import FileUpload from "@/components/FileUpload/index.vue";
+import {download2} from "@/utils/request";
+import { upload_duty_book } from "@/api/duty/duty";
+
+const emits = defineEmits(['update:show']);
+const props = defineProps({
+  show: Boolean,
+});
+const showPicker = computed( {
+  get() {
+    return props.show
+  },
+  set(newValue) {
+    emits('update:show', newValue);
+  }
+});
+const columns = [
+  { text: '茂名市', value: '440900' },
+  { text: '茂南区', value: '440902' },
+  { text: '电白区', value: '440904' },
+  { text: '高州市', value: '440981' },
+  { text: '化州市', value: '440982' },
+  { text: '信宜市', value: '440983' },
+  { text: '滨海新区', value: '440984' },
+  { text: '高新区', value: '440983' },
+];
+let showPicker2 = ref(false);
+let showPicker3 = ref(false);
+let showPicker4 = ref(false);
+let formLabel = ref({
+  area: '',
+  year: [dayjs().year()],
+  month: [dayjs().month() + 1]
+})
+let form = ref({
+  area: '',
+  year: '',
+  month: '',
+  files: []
+});
+
+// 选择区域
+const onConfirm = ({ selectedOptions }) => {
+  showPicker2.value = false;
+  formLabel.value.area = selectedOptions[0].text;
+  form.value.area = selectedOptions[0].value;
+};
+
+// 选择年份
+const onConfirm2 = ({ selectedValues }) => {
+  showPicker3.value = false;
+  form.value.year = selectedValues.toString();
+};
+
+// 选择月份
+const onConfirm3 = ({ selectedValues }) => {
+  showPicker4.value = false;
+  form.value.month = selectedValues.toString();
+};
+
+// 下载模板
+const handleDownload = () => {
+  download2(import.meta.env.VITE_BASE_API + '/file/download/' + 'duty_book.xlsx', '值班表模板.xlsx');
+}
+const validatorFile = () => {
+
+  return !!form.value.files && form.value.files.length > 0;
+}
+const reset = () => {
+  formLabel.value = {
+    area: '',
+    year: [dayjs().year()],
+    month: []
+  };
+  form.value = {
+    area: '',
+    year: '',
+    month: '',
+    files: []
+  };
+}
+const handleCancel = () => {
+  reset();
+  showPicker.value = false
+}
+const onSubmit = () => {
+  console.log('提交', form.value);
+  upload_duty_book(form.value).then((res)=>{
+    handleCancel();
+  });
+}
+</script>
+
+<style  lang="scss" scoped>
+.button {
+  padding: 0 10px;
+  height: 26px;
+  background: #2C81FF;
+  border-radius: 2px;
+  margin-bottom: 3px;
+  margin-left: 10px;
+}
+</style>

+ 1 - 1
src/views/event/UploadEventCasualtiesDialog.vue

@@ -25,7 +25,7 @@
       />
       <van-field name="fileNames" label="总结报告" label-align="top">
         <template #input>
-          <FileUpload v-model="form.fileNames" :fileType="['pdf', 'word', 'excel']"/>
+          <FileUpload v-model="form.fileNames" :fileType="['pdf', 'doc', 'docx', 'xls', 'xlsx']"/>
         </template>
       </van-field>
       <div class="popup-footer">

+ 2 - 2
src/views/leader/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <dic class="container">
+  <div class="container">
     <div class="container-header">
       <div ref="searchBoxRef" class="search-box">
         <van-search
@@ -80,7 +80,7 @@
       </div>
     </div>
     <OnlineRollCall />
-  </dic>
+  </div>
 </template>
 
 <script lang="ts" setup>

+ 5 - 5
src/views/worker/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <dic class="container">
+  <div class="container">
     <div class="container-header">
       <div ref="searchBoxRef" class="search-box">
         <van-search
@@ -84,8 +84,8 @@
         </div>
       </div>
     </div>
-  </dic>
-  <OnlineRollCall />
+    <OnlineRollCall />
+  </div>
 </template>
 
 <script lang="ts" setup>
@@ -109,10 +109,10 @@ const goToInformationReception = () => {
 };
 // 菜单数据
 const menu = ref([
-  { name: "巡查工作", icon: "icon1", num: 0, url: "" },
+  { name: "巡查工作", icon: "icon1", num: 0, url: "inspectionWork" },
   { name: "风险防控", icon: "icon2", num: 0, url: "riskManagement" },
   { name: "数据管理", icon: "icon3", num: 0, url: "" },
-  { name: "在线点名", icon: "icon4", num: 0, url: "" }
+  { name: "在线点名", icon: "icon4", num: 0, url: "rollCallRecord2" }
 ]);
 
 // 综合应用菜单

BIN
src/views/worker/inspectionWork/img/icon1_check.png


BIN
src/views/worker/inspectionWork/img/icon1_uncheck.png


BIN
src/views/worker/inspectionWork/img/icon2.png


BIN
src/views/worker/inspectionWork/img/icon3_check.png


BIN
src/views/worker/inspectionWork/img/icon3_uncheck.png


+ 79 - 3
src/views/worker/inspectionWork/index.vue

@@ -1,18 +1,94 @@
 <template>
+  <!--
   <van-tabs v-model:active="active" type="card">
     <van-tab title="巡查任务"> <PatrolTask /></van-tab>
     <van-tab title="巡查记录"><InspectionRecord /></van-tab>
     <van-tab title="巡查日历"><PatrolCalendar /></van-tab>
   </van-tabs>
+  -->
+  <div class="container">
+    <div class="tabs">
+      <div v-for="item in tabs" :key="item.id" class="tab" @click="handleClickTab(item.id)">
+        <i :class="item.icon" />
+        <div :class="activeIndex === item.id ? 'tab-text text-active' : 'tab-text'">{{ item.name }}</div>
+      </div>
+    </div>
+    <div class="content">
+      <PatrolTask v-if="activeIndex === 'PatrolTask'" @changIndex="handleClickTab" />
+      <InspectionRecord v-else-if="activeIndex === 'PatrolTask'" />
+      <PatrolCalendar v-else-if="activeIndex === 'PatrolTask'" />
+    </div>
+  </div>
 </template>
 <script setup lang="ts">
+import { ref } from "vue";
 import InspectionRecord from "./inspectionRecord.vue";
 import PatrolCalendar from "./patrolCalendar.vue";
 import PatrolTask from "./patrolTask.vue";
-</script>
-
-
 
+let activeIndex = ref('PatrolTask');
+let tabs = ref([
+  { id: 'PatrolTask', name: '巡查任务', icon: 'icon1' },
+  { id: 'InspectionRecord', name: '巡查记录', icon: 'icon2' },
+  { id: 'PatrolCalendar', name: '巡查日历', icon: 'icon3' },
+]);
 
+// 点击tab
+const handleClickTab = (id) => {
+  activeIndex.value = id;
+};
+</script>
 
+<style lang="scss" scoped>
+.container {
+  height: calc(100vh - 55px);
+  padding-top: 12px;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  .tabs {
+    height: 90px;
+    flex-shrink: 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 0 16px;
+    .tab {
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
 
+      .icon1 {
+        background: url(./img/icon1_uncheck.png) no-repeat;
+      }
+      .icon2 {
+        background: url(./img/icon2.png) no-repeat;
+      }
+      .icon3 {
+        background: url(./img/icon3_uncheck.png) no-repeat;
+      }
+      .icon1, .icon2, .icon3 {
+        display: inline-block;
+        width: 48px;
+        height: 48px;
+        // background-color: #9d9d9d;
+        background-size: 100% 100%;
+      }
+      .tab-text {
+        color: #414F64;
+        font-size: 14px;
+        margin-top: 8px;
+      }
+      .text-active {
+        color: #2C81FF;
+      }
+    }
+  }
+  .content {
+    margin-top: 10px;
+    height: calc(100vh - 230px);
+    overflow-y: auto;
+  }
+}
+</style>

+ 30 - 20
src/views/worker/inspectionWork/patrolTask.vue

@@ -17,7 +17,7 @@
       @load="getList"
     >
       <div
-        v-for="(item, index) in event_list"
+        v-for="(item, index) in taskData"
         :key="item.id"
         class="event-list-item"
       >
@@ -64,9 +64,11 @@ import { getCurrentInstance, reactive, ref, toRefs, onMounted } from "vue";
 import { useRouter } from "vue-router";
 import searchImg from "@/assets/images/search.png";
 import closeImg from "@/assets/images/close.png";
+import { workSubList } from "@/api/inspectionWork/inspector";
+
 const proxy = getCurrentInstance()?.proxy;
 const router = useRouter();
-const event_list = ref([]);
+const taskData = ref([]);
 const total = ref(0);
 const loading = ref(false);
 const error = ref(false);
@@ -75,12 +77,13 @@ const initFormData = reactive({
   scope: "",
   cycle: "",
   time: "",
-  event_title: "",
-  id: ""
+  title: "",
+  id: 0
 });
 const data = reactive({
   form: { ...initFormData },
   queryParams: {
+    search_keyword: '',
     page: 1,
     pageSize: 10
   }
@@ -88,49 +91,56 @@ const data = reactive({
 const { queryParams, form } = toRefs(data);
 // 获取列表数据的方法
 async function getList() {
+  /*
   loading.value = true;
   try {
     // 这里是获取列表数据的逻辑,可以根据实际需求进行修改
-    const res = await fetchListData(
-      queryParams.value.page,
-      queryParams.value.pageSize
+    const res = await workSubList(
+      queryParams.value
     );
-    event_list.value = res.data.list;
-    total.value = res.data.total;
+    taskData.value = res.data;
+    total.value = res.total;
   } catch (err) {
     console.error("获取列表数据出错", err);
     error.value = true;
   } finally {
     loading.value = false;
   }
+  */
+  loading.value = false;
+  taskData.value = [
+    {id: 1, title: '巡查子任务1', cycle: '每天', scope: '范围', time: '2024-10-27'},
+    {id: 2, title: '巡查子任务2', cycle: '每天', scope: '范围', time: '2024-10-27'},
+    {id: 3, title: '巡查子任务3', cycle: '每天', scope: '范围', time: '2024-10-27'},
+    {id: 4, title: '巡查子任务4', cycle: '每天', scope: '范围', time: '2024-10-27'},
+    {id: 5, title: '巡查子任务5', cycle: '每天', scope: '范围', time: '2024-10-27'},
+  ];
+  total.value = 5;
 }
 // 搜索关键字变化时触发的方法
 function on_search_keyword(keyword) {
   // 根据搜索关键字更新查询参数
   queryParams.value.search_keyword = keyword;
+  queryParams.value.page = 1;
   // 刷新列表数据
   getList();
 }
 
 // 右侧关闭按钮点击时触发的方法
-function on_search_cancel() {
+const on_search_cancel = () => {
   // 清空搜索关键字
   queryParams.value.search_keyword = "";
+  queryParams.value.page = 1;
   // 刷新列表数据
   getList();
 }
-</script>
 
-<style lang="scss" scoped>
-.van-doc-block__title {
-  color: var(--van-doc-text-color-4);
-  margin: 0;
-  padding: 32px 16px 16px;
-  font-size: 14px;
-  font-weight: 400;
-  line-height: 16px;
+const handleView = (item) => {
+
 }
+</script>
 
+<style lang="scss" scoped>
 .event-list-item {
   position: relative;
   margin: 16px 16px 0;
@@ -139,7 +149,7 @@ function on_search_cancel() {
   border: 0.5px solid #eaedf7;
   box-shadow: 0 0 4px 0 #4554661a;
   &:first-child {
-    margin-top: 0;
+    margin-top: 16px;
   }
   .item-title {
     display: flex;