Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,11 @@ import com.example.projetosaveit.model.EmpresaInsertDTO
import com.example.projetosaveit.model.EstoqueDTO
import com.example.projetosaveit.model.FuncionarioDTO
import com.example.projetosaveit.model.FuncionarioInsertDTO
import com.example.projetosaveit.model.HistoricoResponse
import com.example.projetosaveit.model.HistoricoSessaoRequest
//import com.example.projetosaveit.model.HistoricoResponse
import com.example.projetosaveit.model.HistoricoFuncionarioResponse
import com.example.projetosaveit.model.HistoricoSessaoResponse
import com.example.projetosaveit.model.ImagemDTO
import com.example.projetosaveit.model.IniciarChatRequest
import com.example.projetosaveit.model.IniciarChatResponse
//import com.example.projetosaveit.model.IniciarChatRequest
//import com.example.projetosaveit.model.IniciarChatResponse
import com.example.projetosaveit.model.LoteDTO
import com.example.projetosaveit.model.LoteInsertDTO
import com.example.projetosaveit.model.ProdutoInfoDTO
Expand Down Expand Up @@ -157,9 +154,12 @@ interface ApiService {
@POST("executar_fluxo")
fun enviarMensagem(@Body request: ChatRequest): Call<ChatResponse>

@POST("historico_funcionario")
fun obterHistoricoFuncionario(@Body request: Map<String, Int>): Call<HistoricoResponse>
@GET("historico_funcionario")
fun obterHistoricoFuncionario(@Query("funcionario_id") funcionarioId: Int): Call<HistoricoFuncionarioResponse>

@POST("historico_sessao")
fun obterHistoricoSessao(@Body request: HistoricoSessaoRequest): Call<HistoricoResponse>
@GET("historico_sessao")
fun obterHistoricoSessao(
@Query("funcionario_id") funcionarioId: Int,
@Query("session_id") sessionId: String
): Call<HistoricoSessaoResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

object ChatBotClient {
private const val BASE_URL = "http://3.92.141.56:8000"
private const val BASE_URL = "http://98.91.17.130:8000"

val okHttpClient = OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@ package com.example.projetosaveit.api.repository
import com.example.projetosaveit.api.network.ChatBotClient
import com.example.projetosaveit.model.ChatRequest
import com.example.projetosaveit.model.ChatResponse
import com.example.projetosaveit.model.HistoricoResponse
import com.example.projetosaveit.model.HistoricoSessaoRequest
import com.example.projetosaveit.model.IniciarChatRequest
import com.example.projetosaveit.model.IniciarChatResponse
import retrofit2.Call
import retrofit2.http.Body

class ChatbotRepository {
fun iniciarChat(request: IniciarChatRequest): Call<IniciarChatResponse> {
Expand All @@ -19,13 +16,9 @@ class ChatbotRepository {
return ChatBotClient.instance.enviarMensagem(request)
}

fun obterHistoricoFuncionario(funcionarioId: Int): Call<HistoricoResponse> {
val request = mapOf("funcionario_id" to funcionarioId)
return ChatBotClient.instance.obterHistoricoFuncionario(request)
}
fun obterHistoricoFuncionario(funcionarioId: Int) =
ChatBotClient.instance.obterHistoricoFuncionario(funcionarioId)

// Histórico de mensagens de uma sessão específica
fun obterHistoricoSessao(request: HistoricoSessaoRequest): Call<HistoricoResponse> {
return ChatBotClient.instance.obterHistoricoSessao(request)
}
fun obterHistoricoSessao(funcionarioId: Int, sessionId: String) =
ChatBotClient.instance.obterHistoricoSessao(funcionarioId, sessionId)
}
34 changes: 29 additions & 5 deletions app/src/main/java/com/example/projetosaveit/model/Chatbot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,43 @@ data class ChatResponse(
val resposta_assistente: String
)

data class HistoricoSessaoRequest(
data class HistoricoSessaoResponse(
val status: String,
val funcionario_id: Int,
val session_id: String
val session_id: String,
val historico: List<MensagemHistorico>
)

data class HistoricoFuncionarioResponse(
val status: String,
val funcionario_id: Int,
val total_sessoes: Int,
val historicos: List<MensagemHistoricoCompleto>
)

data class MensagemHistorico(
val tipo: String,
val mensagem: String
)

data class MensagemHistoricoCompleto(
val empresa_id: Int,
val funcionario_id: Int,
val session_id: String,
val role: String,
val content: String,
val timestamp: String
)

data class HistoricoResponse(
val historico: List<MensagemHistorico> = emptyList(),
val historico: List<MensagemChatHistorico> = emptyList(),
val sessoes: List<SessaoHistorico> = emptyList()
)

data class MensagemHistorico(
data class MensagemChatHistorico(
val role: String,
val content: String
val content: String,
val timestamp: String? = null
)

data class SessaoHistorico(
Expand Down
60 changes: 32 additions & 28 deletions app/src/main/java/com/example/projetosaveit/ui/Chatbot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ class Chatbot : AppCompatActivity() {
sessionId = response.body()?.session_id
Log.d("Chatbot", "Sessao iniciada: $sessionId")

val tituloSessao = "Sessao ${listaSessoes.size + 1}"
val tituloSessao = "Conversa ${listaSessoes.size + 1}"
adapterSessoes.adicionarConversa(tituloSessao, sessionId ?: "")

enviarMensagem(primeiraMsg)
Expand Down Expand Up @@ -206,62 +206,66 @@ class Chatbot : AppCompatActivity() {
}

private fun carregarHistoricoSessoes() {
Log.d("Chatbot", "Carregando historico de SESSOES...")
Log.d("Chatbot", "Carregando historico do FUNCIONARIO...")

chatbotRepository.obterHistoricoFuncionario(funcionarioId).enqueue(object : Callback<HistoricoResponse> {
override fun onResponse(call: Call<HistoricoResponse>, response: Response<HistoricoResponse>) {
chatbotRepository.obterHistoricoFuncionario(funcionarioId).enqueue(object : Callback<HistoricoFuncionarioResponse> {
override fun onResponse(
call: Call<HistoricoFuncionarioResponse>,
response: Response<HistoricoFuncionarioResponse>
) {
if (response.isSuccessful) {
val sessoes = response.body()?.sessoes ?: emptyList()
val historicoCompleto = response.body()?.historicos ?: emptyList()
listaSessoes.clear()

Log.d("Chatbot", "${sessoes.size} sessoes carregadas")
val sessoesAgrupadas = historicoCompleto.groupBy { it.session_id }

sessoes.forEachIndexed { index, sessao ->
val titulo = "Conversa ${index + 1} - ${sessao.data?.substring(0, 10) ?: "Data"}"
listaSessoes.add(com.example.projetosaveit.adapter.ConversaItem(titulo, sessao.session_id))
Log.d("Chatbot", "${sessoesAgrupadas.size} sessoes encontradas")

sessoesAgrupadas.keys.forEachIndexed { index, sessionId ->
val titulo = "Conversa ${index + 1}"
listaSessoes.add(com.example.projetosaveit.adapter.ConversaItem(titulo, sessionId))
}

adapterSessoes.notifyDataSetChanged()

if (sessoes.isNotEmpty()) {
sessionId = sessoes.first().session_id
carregarHistoricoMensagens(sessoes.first().session_id)
if (sessoesAgrupadas.isNotEmpty()) {
val primeiraSessao = sessoesAgrupadas.keys.first()
sessionId = primeiraSessao
carregarHistoricoMensagens(primeiraSessao)
}

} else {
Log.e("Chatbot", "Erro carregar historico de SESSOES: ${response.code()}")
Log.e("Chatbot", "Erro carregar historico do FUNCIONARIO: ${response.code()}")
}
}

override fun onFailure(call: Call<HistoricoResponse>, t: Throwable) {
Log.e("Chatbot", "Falha ao carregar historico de SESSOES", t)
override fun onFailure(call: Call<HistoricoFuncionarioResponse>, t: Throwable) {
Log.e("Chatbot", "Falha ao carregar historico do FUNCIONARIO", t)
}
})
}

private fun carregarHistoricoMensagens(sessionId: String) {
Log.d("Chatbot", "Carregando historico de MENSAGENS da sessao: $sessionId")

val request = HistoricoSessaoRequest(
funcionario_id = funcionarioId,
session_id = sessionId
)

chatbotRepository.obterHistoricoSessao(request).enqueue(object : Callback<HistoricoResponse> {
override fun onResponse(call: Call<HistoricoResponse>, response: Response<HistoricoResponse>) {
chatbotRepository.obterHistoricoSessao(funcionarioId, sessionId).enqueue(object : Callback<HistoricoSessaoResponse> {
override fun onResponse(
call: Call<HistoricoSessaoResponse>,
response: Response<HistoricoSessaoResponse>
) {
if (response.isSuccessful) {
val historico = response.body()?.historico ?: emptyList()
val historicoSessao = response.body()?.historico ?: emptyList()
listaMensagens.clear()

Log.d("Chatbot", "${historico.size} mensagens carregadas")
Log.d("Chatbot", "${historicoSessao.size} mensagens carregadas")

historico.forEach { mensagem ->
val tipo = when (mensagem.role) {
historicoSessao.forEach { mensagem ->
val tipo = when (mensagem.tipo) {
"user" -> TipoMensagemChatbot.USUARIO
"assistant" -> TipoMensagemChatbot.BOT
else -> TipoMensagemChatbot.BOT
}
listaMensagens.add(MensagemChatbot(mensagem.content, tipo))
listaMensagens.add(MensagemChatbot(mensagem.mensagem, tipo))
}

adapterChat.notifyDataSetChanged()
Expand All @@ -274,7 +278,7 @@ class Chatbot : AppCompatActivity() {
}
}

override fun onFailure(call: Call<HistoricoResponse>, t: Throwable) {
override fun onFailure(call: Call<HistoricoSessaoResponse>, t: Throwable) {
Log.e("Chatbot", "Falha ao carregar historico de MENSAGENS", t)
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,10 @@ class Perfil : Fragment() {
if (empresa.planId == 1) {
view.findViewById<FrameLayout>(R.id.FrameInserirFunc).visibility = View.GONE
plano = "Plano Atual: Nenhum"
view.findViewById<LinearLayout>(R.id.btChatbot).visibility = View.GONE
} else {
plano = "Plano Atual: SaveIt Pro"
view.findViewById<LinearLayout>(R.id.btChatbot).visibility = View.VISIBLE
}

view.findViewById<TextView>(R.id.planoAtual).text = plano
Expand Down
51 changes: 3 additions & 48 deletions app/src/main/res/layout-sw600dp/fragment_perfil.xml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="0dp"
android:layout_height="480dp"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginEnd="50dp"
android:orientation="vertical"
Expand All @@ -92,52 +92,7 @@
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/nomePerfil"
app:layout_constraintVertical_bias="0.312">

<FrameLayout
android:id="@+id/frameLayout2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="12dp"
android:background="@drawable/borda_card_tablet"
android:clipChildren="false"
android:clipToPadding="false"
android:elevation="6dp"
app:cardCornerRadius="20dp">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/btDados"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="16dp"
android:paddingEnd="16dp">

<ImageView
android:id="@+id/iconNotify3"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="20dp"
android:src="@drawable/icon_dados"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/titleTerms3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:fontFamily="@font/inclusive_sans"
android:text="Dados"
android:textColor="@color/PretoNaoPuro"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iconNotify3"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.542" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
app:layout_constraintVertical_bias="0.13999999">

<FrameLayout
android:layout_width="match_parent"
Expand Down Expand Up @@ -283,7 +238,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:fontFamily="@font/inclusive_sans"
android:text="Plano tual: Nenhum"
android:text="Plano Atual: Nenhum"
android:textColor="@color/PretoNaoPuro"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
Expand Down
13 changes: 7 additions & 6 deletions app/src/main/res/layout/activity_minha_vitrine.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,31 +36,32 @@
android:id="@+id/textView20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="5dp"
android:fontFamily="@font/plus_jakarta_sans_extralight"
android:text="Meus produtos da vitrine"
android:textColor="@color/PretoNaoPuro"
android:textColorHighlight="@color/PretoNaoPuro"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@+id/minhaVitrineRc"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.102"
app:layout_constraintHorizontal_bias="0.093"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView37"
app:layout_constraintVertical_bias="0.052" />
app:layout_constraintVertical_bias="0.0" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/minhaVitrineRc"
android:layout_width="391dp"
android:layout_height="582dp"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:paddingTop="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.502"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView20"
app:layout_constraintVertical_bias="0.436"
app:layout_constraintVertical_bias="0.0"
tools:listitem="@layout/item_vitrine" />

<ImageView
Expand Down
Loading