Please enable JavaScript.
Coggle requires JavaScript to display documents.
ZALO, be-pima, customer chat, fe-crm-pima, customer chat, hiện các tên…
-
be-pima
module entities
[BE1]
-
-
-
handleRegisterSocketId
- FE gửi cái socketId và user_id_customer đến gateway
- save socketId vào bảng zaloChatList theo user_id_customer
=> như vậy mỗi user_id_customer có socketId riêng
-
-
ZalochatgatewayService
- Phải tạo ra service riêng để thao tác với model ZaloChat, vì ZaloChatService gốc được nhúng và dùng ở quá nhiều nơi, dùng nó tiếp trong gateway thì bị lỗi, sửa hoài ko đc, nên mình tạo cái mới cho nó sạch sẽ không bị đụng với các logic khác
- create zalochat
- save cái zalochat mới vào bảng
- lấy ra cái user_id_customer
- tìm cái socketId trong bảng zaloChatList dựa trên user_id_customer
- gọi hàm emitToSpecificClient để nó truyền ra FE đoạn chat vừa save và cái socketId
-
module zalo
controller
-
- ZaloapioasendmessageController
- FE OA gửi tin nhắn đến một khách hàng nào đó
- controller này dùng khi FE OA gửi tin nhắn manual đến khách hàng
- Còn nếu nhờ AI gửi thì chỉ cần dùng service zaloapioasendmessageService [#]
- ZaloapioasendmessageController
- khi attachmentID === "" thì dùng hàm này chỉ để gửi tin nhắn
- gọi zaloapioasendmessageService.oasendTextMessage
- zaloapioasendmessageService
- lấy accessToken và refreshToken
- gọi api tới zalo để oa send message
- nếu token invalid thì update invalid
- khi attachmentID !== "" thì dùng hàm này chỉ để gửi tin nhắn kèm hình ảnh
- zaloapioasendmessageService.sendMessageWithAttachmentId(user_id, finalAnswer, attachmentId)
zaloapialluser
- fetchAllUsers
- Lấy toàn bộ user_id trên zalo server, sau đó update vào bảng zaloUserMini và ZaloUser, nếu có rồi thì ignore, chưa có thì thêm vào
-
zaloapiallgroup
- fetchAllGroups
- lấy toàn bộ group zalo trên zalo server
- thêm vào bảng zaloGroup nếu chưa có [BE111]
- Hàm readAllFiles
- excelService.processFilesAndSheets()
- ExcelService
- processFilesAndSheets
readExcelFromGoogleDrive(fileId: string, sheetNames: string[])
Tùy theo sheet name mà ta convert theo từng kiểu, vì mỗi sheet có cấu trúc data khác nhau, sau đó save vào file BGG.json thông qua hàm saveJsonData
- iterate theo từng fileId
- truyền vào từng hàm theo fileId và sheetName
- lưu ý sheetName và fileId mình định nghĩa sẵn trong file fileSheetsMapping
- nên sheetname mình truyền vào hàm là do mình set trước
- có thể dùng sheetName thực tế khi lấy file về từ google drive để iterate, nhưng nếu lấy kiểu đó thì sẽ iterate cả những sheetName mình không cần, còn mình set trước thì chủ đích mình chỉ muốn iterate những cái đó thôi, đỡ tốn tài nguyên, nhưng nếu sheetName thực tế thay đổi trên GD, thì sẽ bị lỗi
- Đối với mỗi fileId thì mình phải tạo hàm riêng, tách ra cho đơn giản
- hàm tiền tố readExcelFromGoogleDrive
- lưu các sheetName vào ExcelFile để theo dõi sự thay đổi của sheetName
- trong mỗi sheet sẽ có một hày nhiều mặt hàng , vì vậy ta phải tạo nhiều hàm convert để đổ vào từng ngành hàng khác nhau
- hàm readtest
- truyền vào là fileId của file excel trên google drive
- sheetname
- để nó lưu vào file test,json, để ta đọc thử nội dung của 1 sheet của 1 file để ta xem có lấy đc data không
- ExcelService
- readExcelFromGoogleDriveTest
- download file từ google drive theo fileId
- lưu nội dung của sheet vào file test.json
- ZalouploadpictureController
- uploadImage
- Lấy toàn bộ sanphamTen mà url ko null
- sau đó upload hình lên zalo server thông qua hàm this.zaloUploadPictureService.uploadImageFromUrl(url)
- zalo server sẽ trả về cái attachmentId, mình update vào sanphamten cái attachmentId theo id,
- vậy là sanphamten sẽ có url từ firebase và attachmentId từ zalo server
module ai
- AichatController
- request_AI_answer
- yêu cầu gemini trả lời nếu là câu hỏi, còn các type praise, negative hay greeting mình cho nó randome từ bộ câu trả lời sẵn
- sau khi có answer ta gửi đến OA bằng cách dùng zaloapioasendmessageService.oasendTextMessage(user_id, statement)
-
-
firebase module
controller
hàm getPictures
- lấy tất cả tên hình và url từ google firebase storage
- sau đó gán url của mỗi hình vào sanphamten dựa theo tên của hình
firebasestorage service
- this.firebaseStorageService.getAllPictures()
- this.sanphamtenService.searchSanPhamByTen(name)
- this.sanphamtenService.updateUrlById(sanPhamTenId, url)
customer chat
-
- TextclassifyController
- function: classify
- TextclassifyService
- fu: getGeminiGenerateType
- Trả ra TextclassifyController type và try
- TextclassifyController
- lưu vào testChat type và try thông qua testchatService
-
-
fe-crm-pima
-
-
pages
Zalo
component ZaloChat
- Lấy toàn bộ user
- tách thành các mảng employee, customerFollow, not follow
-
- Nhân viên Pima sẽ phụ trách tổng những khách hàng chưa phân cho nhân viên cụ thể
- Khi nhấn vào nhân viên thì sẽ hiện ra các khách hàng mà nhân viên đó phụ trách
gọi hàm selectEmployee
gọi hàm getChatList(user_id)
- để lấy danh sách single chat mà employee đó quản lý
- danh sách trả về có mảng unseenMessages chứa các id của message chưa đọc seen false
-
gọi hàm findManyByMainUserEmployeeInChargeId để lấy danh sách group chat mà đc quản lý bởi employee đc click vào
-
- rê chuột vào tin nhắn của khách hàng để hiện nút ai
- khi click vào nút này thì kích hoạt hàm mutation_request_AI_answer
- Để yêu cầu AI phản hồi cầu nói đó của khách hàng
- gọi hàm request_AI_answer
- /aichat/request_AI_answer
-
- chỉ định khách hàng cho employee phụ trách
- tạo select cho chọn các employee để lấy user_id của empoyee đó
- mỗi lần chọn gọi hàm handleChangeEmployeeAssign_user_id
- hàm này sẽ update cái user_id_employee_real có giá trị user_id của emp được chọn
-
- employee nhập vào ô input để gửi message đến customer trong ô chat bên tay phải
- mục đích :
- gửi tin nhắn này lên OA cho customer thấy
- sau đó listen từ webhook có sự kiện oa_send_text và sẽ lưu vào bảng ZaloChat
-
-
- Nhấn vào single chat nào thì gọi hàm selectChatSingle
- mục đích là lấy tất cả đoạn chat của khách hàng đc lick vào
-
- Nhấn vào group chat nào thì gọi hàm selectGroup, chỉ mới bật màu xanh, chưa hiện các message của group đó
-
-
-
-
Excel
-
-
-
- Lọc ra tên sản phẩm unique
- sau khi đã làm xong việc đổ các file báo giá json vào postgres
- Mục đích là có tên các sản phẩm unique để đỡ phải query trong bảng SanPhamOng nhiều lần, bảng SanPhamOng có tới hơn 3000 sản hẩm, nên query sẽ mệt
-