diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.scss b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.scss new file mode 100644 index 00000000..df291511 --- /dev/null +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.scss @@ -0,0 +1,199 @@ +.chat-message-container { + display: flex; + flex-direction: column; + height: 100%; + background: #f8fafc; +} + +.chat-header { + padding: 20px 24px; + border-bottom: 1px solid #e5e7eb; + background: #fff; +} + +.header-content { + .header-title { + font-size: 18px; + font-weight: 700; + color: #4b87ff; + margin-bottom: 4px; + } + + .header-subtitle { + font-size: 12px; + color: #9ca3af; + + .separator { + color: #d1d5db; + } + } +} + +.tabs-container { + padding: 0 24px; + background: #fff; +} + +.tabs-wrapper { + display: flex; + align-items: center; + gap: 32px; + border-bottom: 1px solid #e5e7eb; +} + +.tab-button { + padding: 12px 0; + font-size: 14px; + font-weight: 500; + color: #6b7280; + background: none; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all 0.2s; + position: relative; + bottom: -1px; + + &:hover { + color: #111827; + } + + &.active { + color: #4b87ff; + border-bottom-color: #4b87ff; + } +} + +.chat-main { + flex: 1; + overflow: hidden; + padding: 24px; +} + +.messages-container { + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 16px; + height: 420px; + overflow-y: auto; +} + +.messages-list { + display: flex; + flex-direction: column; + gap: 16px; +} + +.message-item { + display: flex; + gap: 12px; +} + +.message-left { + justify-content: flex-start; +} + +.message-right { + justify-content: flex-end; +} + +.avatar { + width: 36px; + height: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 14px; + font-weight: 500; + flex-shrink: 0; +} + +.avatar-ai { + background: #a855f7; +} + +.avatar-guest { + background: #d1d5db; +} + +.message-content { + display: flex; + flex-direction: column; + max-width: 70%; +} + +.message-meta { + font-size: 12px; + color: #9ca3af; + margin-bottom: 4px; +} + +.message-meta-right { + text-align: right; +} + +.message-bubble { + padding: 12px 16px; + border-radius: 16px; + font-size: 14px; + line-height: 1.5; + word-break: break-word; + white-space: pre-wrap; +} + +.message-bubble-left { + background: #f9fafb; + border: 1px solid #e5e7eb; + color: #374151; + border-top-left-radius: 4px; +} + +.message-bubble-right { + background: #4b87ff; + color: #fff; + border-top-right-radius: 4px; +} + +.empty-state { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + min-height: 200px; +} + +.empty-text { + font-size: 14px; + color: #9ca3af; +} + +.summary-container { + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 20px; +} + +.summary-content { + display: flex; + flex-direction: column; + gap: 16px; +} + +.summary-section { + .summary-title { + font-size: 14px; + font-weight: 700; + color: #111827; + margin-bottom: 8px; + } + + .summary-text { + font-size: 14px; + color: #374151; + line-height: 1.6; + } +} diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue new file mode 100644 index 00000000..f1fde134 --- /dev/null +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue @@ -0,0 +1,181 @@ + + + \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/index.ts b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/index.ts new file mode 100644 index 00000000..f62359f6 --- /dev/null +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/index.ts @@ -0,0 +1 @@ +export {default as ChatMessage} from './ChatMessage/ChatMessage.vue' \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.scss b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.scss index e69de29b..b174d843 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.scss +++ b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.scss @@ -0,0 +1,325 @@ +.workcase-detail { + display: flex; + flex-direction: column; + height: 100%; + background: #f8fafc; +} + +.detail-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 24px; + background: #fff; + border-bottom: 1px solid #e5e7eb; + flex-shrink: 0; +} + +.header-left { + flex: 1; +} + +.workcase-info { + display: flex; + align-items: center; + gap: 12px; +} + +.workcase-id { + font-size: 24px; + font-weight: 700; + color: #4b87ff; +} + +.status-badge, +.urgency-badge { + padding: 4px 8px; + font-size: 12px; + border-radius: 4px; + font-weight: 500; +} + +.status-pending { + background: #fef3c7; + color: #92400e; +} + +.status-processing { + background: #dbeafe; + color: #1e40af; +} + +.status-done { + background: #d1fae5; + color: #065f46; +} + +.urgency-normal { + background: #fed7aa; + color: #9a3412; +} + +.urgency-emergency { + background: #fecaca; + color: #991b1b; +} + +.header-right { + display: flex; + gap: 12px; +} + +.view-chat-btn { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: #4b87ff; + color: #fff; + border: none; + border-radius: 4px; + font-size: 14px; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: #3b77ef; + } +} + +.detail-main { + flex: 1; + overflow-y: auto; + padding: 24px; +} + +.info-table { + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 8px; + overflow: hidden; + margin-bottom: 32px; +} + +.table-row { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr) minmax(0, 3fr); + border-bottom: 1px solid #e5e7eb; + + &:last-child { + border-bottom: none; + } +} + +.table-label { + padding: 12px; + background: #f9fafb; + color: #4b5563; + font-weight: 500; + font-size: 14px; + border-right: 1px solid #e5e7eb; +} + +.table-value { + padding: 12px; + color: #111827; + font-size: 14px; + border-right: 1px solid #e5e7eb; + + &:last-child { + border-right: none; + } + + span { + display: block; + line-height: 1.5; + } +} + +.table-value-full { + grid-column: 2 / 5; +} + +// 铭牌照片 +.nameplate-photo { + max-width: 400px; + height: 200px; + border-radius: 8px; + overflow: hidden; + border: 1px solid #e5e7eb; + cursor: pointer; + transition: transform 0.2s; + + &:hover { + transform: scale(1.02); + } + + img { + width: 100%; + height: 100%; + object-fit: contain; + background: #f9fafb; + } +} + +.photos-section, +.timeline-section { + margin-bottom: 32px; +} + +.section-title { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 16px; + color: #111827; + font-weight: 700; + font-size: 16px; +} + +.title-icon { + color: #a855f7; +} + +.title-bar { + width: 4px; + height: 16px; + background: #a855f7; + border-radius: 2px; +} + +.photos-grid { + display: flex; + gap: 16px; + flex-wrap: wrap; +} + +.photo-item { + width: 128px; + height: 96px; + border-radius: 8px; + overflow: hidden; + border: 1px solid #e5e7eb; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +} + +.photo-upload { + width: 128px; + height: 96px; + border: 2px dashed #d1d5db; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + color: #9ca3af; + cursor: pointer; + transition: all 0.2s; + + &:hover { + border-color: #4b87ff; + color: #4b87ff; + } +} + +.timeline-content { + position: relative; + padding-left: 8px; +} + +.timeline-line { + position: absolute; + left: 8px; + top: 8px; + bottom: 16px; + width: 2px; + background: #f3f4f6; +} + +.timeline-item { + position: relative; + padding-left: 32px; + padding-bottom: 32px; + + &:last-child { + padding-bottom: 0; + } +} + +.timeline-dot { + position: absolute; + left: 0; + top: 6px; + width: 16px; + height: 16px; + border-radius: 50%; + border: 2px solid #fff; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + z-index: 10; +} + +.timeline-dot-system { + background: #60a5fa; +} + +.timeline-dot-manager { + background: #fb923c; +} + +.timeline-dot-engineer { + background: #34d399; +} + +.timeline-body { + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 12px 16px; +} + +.timeline-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 4px; +} + +.timeline-actor { + font-weight: 700; + color: #111827; +} + +.timeline-action { + color: #4b5563; +} + +.timeline-desc { + font-size: 14px; + color: #6b7280; + margin-bottom: 4px; +} + +.timeline-time { + font-size: 12px; + color: #9ca3af; +} + +.detail-footer { + display: flex; + justify-content: flex-end; + gap: 12px; + padding: 16px 24px; + background: #fff; + border-top: 1px solid #e5e7eb; + flex-shrink: 0; +} + +.chat-dialog { + :deep(.el-dialog__body) { + padding: 0; + } +} diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue index 62ea0194..3b3d9105 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue @@ -1,11 +1,319 @@ + + \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.scss b/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.scss deleted file mode 100644 index 36e932b0..00000000 --- a/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.scss +++ /dev/null @@ -1,248 +0,0 @@ -.workcase-creator-mask { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - z-index: 999; - display: flex; - flex-direction: column; - justify-content: flex-end; - animation: fadeIn 0.3s ease; -} - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -.workcase-creator { - max-height: 85vh; - background-color: #FFFFFF; - border-top-left-radius: 16px; - border-top-right-radius: 16px; - display: flex; - flex-direction: column; - animation: slideUp 0.3s ease; -} - -@keyframes slideUp { - from { - transform: translateY(100%); - } - to { - transform: translateY(0); - } -} - -.creator-header { - background-color: #FFFFFF; - padding: 20px 16px 16px; - border-bottom: 1px solid #F0F0F0; - display: flex; - justify-content: space-between; - align-items: center; - position: relative; -} - -.creator-header::before { - content: ''; - position: absolute; - top: 8px; - left: 50%; - transform: translateX(-50%); - width: 36px; - height: 4px; - background-color: #E0E0E0; - border-radius: 2px; -} - -.header-title { - color: #1F2329; - font-size: 18px; - font-weight: 600; -} - -.close-btn { - width: 28px; - height: 28px; - border-radius: 14px; - background-color: #F5F5F5; - display: flex; - align-items: center; - justify-content: center; -} - -.close-icon { - color: #8F959E; - font-size: 20px; - line-height: 1; -} - -.creator-content { - flex: 1; - background-color: #FFFFFF; - padding: 16px; -} - -.form-item { - margin-bottom: 24px; -} - -.label { - display: block; - color: #333333; - font-size: 16px; - font-weight: 500; - margin-bottom: 8px; -} - -.input, .textarea { - width: 100%; - padding: 12px 16px; - border: 1px solid #E0E0E0; - border-radius: 8px; - font-size: 16px; - background-color: #FAFAFA; -} - -.textarea { - min-height: 100px; - resize: none; -} - -.char-count { - color: #999999; - font-size: 12px; - text-align: right; - margin-top: 4px; -} - -.picker { - width: 100%; -} - -.picker-content { - padding: 12px 16px; - border: 1px solid #E0E0E0; - border-radius: 8px; - background-color: #FAFAFA; - display: flex; - justify-content: space-between; - align-items: center; -} - -.picker-text { - color: #333333; - font-size: 16px; -} - -.picker-arrow { - color: #999999; - font-size: 18px; -} - -.upload-area { - display: flex; - flex-wrap: wrap; - gap: 12px; -} - -.upload-item { - position: relative; - width: 80px; - height: 80px; -} - -.upload-image { - width: 100%; - height: 100%; - border-radius: 8px; -} - -.delete-btn { - position: absolute; - top: -6px; - right: -6px; - width: 20px; - height: 20px; - border-radius: 10px; - background-color: #FF5722; - display: flex; - align-items: center; - justify-content: center; -} - -.delete-icon { - color: #FFFFFF; - font-size: 14px; - line-height: 1; -} - -.upload-btn { - width: 80px; - height: 80px; - border: 1px dashed #CCCCCC; - border-radius: 8px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - background-color: #FAFAFA; -} - -.upload-plus { - color: #999999; - font-size: 24px; - line-height: 1; -} - -.upload-text { - color: #999999; - font-size: 12px; - margin-top: 4px; -} - -.upload-tip { - color: #999999; - font-size: 12px; - margin-top: 8px; -} - -.creator-footer { - background-color: #FFFFFF; - padding: 16px; - padding-bottom: calc(16px + env(safe-area-inset-bottom)); - border-top: 1px solid #F0F0F0; - display: flex; - gap: 12px; -} - -.cancel-btn, .submit-btn { - flex: 1; - height: 44px; - border-radius: 22px; - font-size: 16px; - font-weight: 500; - border: none; -} - -.cancel-btn { - background-color: #F5F5F5; - color: #666666; -} - -.submit-btn { -background-color: #5B8FF9; -color: #FFFFFF; -} - -.submit-btn.is-disabled { -background-color: #CCCCCC; -color: #999999; -} \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.uvue b/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.uvue deleted file mode 100644 index fcc69ab5..00000000 --- a/urbanLifelineWeb/packages/workcase_wechat/components/WorkcaseCreator/WorkcaseCreator.uvue +++ /dev/null @@ -1,206 +0,0 @@ -