完善客服功能
authorliangzhenying <867174124@qq.com>
Mon, 20 Oct 2025 03:04:42 +0000 (11:04 +0800)
committerliangzhenying <867174124@qq.com>
Mon, 20 Oct 2025 03:04:42 +0000 (11:04 +0800)
ShenYin/ShenYin/UI/Base/BaseTC.swift
ShenYin/ShenYin/UI/Customer/CustomerVC.swift
ShenYin/ShenYin/UI/Customer/QaHeaderView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mine/AboutVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift
ShenYin/ShenYin/UI/Mine/UpdateVC.swift
ShenYin/ShenYin/UI/Mode/ModeVC.swift

index afa86ac..c5ee6b0 100644 (file)
@@ -55,6 +55,6 @@ class BaseTC:UITabBarController{
         self.tabBar.backgroundColor = .white
         view.backgroundColor = .color(.bgColor)
 
-        self.selectedIndex = 4
+        self.selectedIndex = 3
     }
 }
index fc8376d..4461200 100644 (file)
 //
 
 import UIKit
-
 class CustomerVC:BaseVC{
-    
+    let scrollView = UIScrollView()
+    let toolBar = SendToolBar()
+    let qaView = QaHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 160))
+    let tableView = UITableView(frame: CGRectZero, style: .plain)
+    var dataList:[FeedbackContentModel] = []
     override func viewDidLoad() {
         super.viewDidLoad()
-        self.navBar.title = "客服"
-        
     }
     override func setupViews() {
-        navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
+        self.navBar.title = "客服"
+//        navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
+        
+        view.addSubviews([scrollView])
+        scrollView.addSubviews([toolBar,tableView])
+        
+        tableView.do { v in
+            v.keyboardDismissMode = .onDragWithAccessory
+            v.backgroundColor = .clear
+            v.delegate = self
+            v.dataSource = self
+            v.estimatedRowHeight = 60
+            v.separatorStyle = .none
+            v.tableHeaderView = qaView
+            v.register(FeedbackContentViewCell.self, forCellReuseIdentifier: FeedbackContentViewCell.reuseID)
+        }
+        toolBar.do { v in
+            v.textField.text = ""
+            v.delegate = self
+//            v.backgroundColor = .green
+        }
+        qaView.do { v in
+            v.didSelected = {[weak self] model in
+                guard let self = self else{return}
+                addModel(model)
+            }
+        }
     }
     override func setupLayout() {
+        scrollView.snp.makeConstraints { make in
+            make.top.equalTo(kNavBtm)
+            make.left.equalToSuperview()
+            make.height.equalTo(kScreenHei - kNavBtm - 56)
+            make.width.equalTo(kScreenWid)
+        }
+        tableView.snp.makeConstraints { make in
+            make.top.equalToSuperview()
+            make.left.equalToSuperview()
+            make.width.equalTo(kScreenWid)
+            make.height.equalTo(kScreenHei - kNavBtm - 56 - 62)
+        }
         
+        toolBar.snp.makeConstraints { make in
+            make.width.centerX.equalToSuperview()
+            make.height.equalTo(52)
+            make.top.equalTo(tableView.snp.bottom).offset(10)
+            make.bottom.equalToSuperview()
+        }
+    }
+    override func setupData() {
+        let api = CommomApi.qaCategory
+        HttpClient.request(api) {[weak self] (model:QaCategoryModelRoot,res) in
+            guard let self = self else {return}
+            if model.isSuccess,let item = model.data.first{
+                self.qaView.loadData(categoryId: item.id)
+            }
+        }
+    }
+    func refreshData(){
+        tableView.reloadData()
+        if dataList.count > 0 {
+            tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true)
+        }
+    }
+    func addModel(_ model:QaModelListModel){
+        dataList.append(FeedbackContentModel(content: model.title,isSend: true))
+        dataList.append(FeedbackContentModel(content: model.content,isSend: false))
+        refreshData()
     }
-    override func navRightViewTapped() {
+}
+extension CustomerVC:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return dataList.count
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = FeedbackContentViewCell.cell(withTableView: tableView, indexPath: indexPath)
+        cell.data = dataList[indexPath.row]
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        
+    }
+}
+extension CustomerVC:SendToolBarDelegate{
+    func sendToolBar(_ toolBar: SendToolBar, _ text: String) {
+        toolBar.textField.resignFirstResponder()
+        dataList.append(FeedbackContentModel(content: text,isSend: true))
+        dataList.append(FeedbackContentModel(content: "请加企业微信:123456",isSend: false))
+        refreshData()
+        toolBar.textField.text = ""
+        
+        
+//        JoyGemAIManager.shared().translate(text, from: from, to: to) {[weak self] result, finish in
+//            guard let self = self else{return}
+//            if !finish{
+//                dataList.last!.response = dataList.last!.response + result
+//                refreshData()
+//            }
+//            
+//        } error: { error in
+//            
+//        }
         
     }
 }
diff --git a/ShenYin/ShenYin/UI/Customer/QaHeaderView.swift b/ShenYin/ShenYin/UI/Customer/QaHeaderView.swift
new file mode 100644 (file)
index 0000000..af17fb9
--- /dev/null
@@ -0,0 +1,112 @@
+//
+//  QaHeaderView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/10/20.
+//
+
+class QaHeaderView: BaseView {
+    let bgView = UIView()
+    let titleLabel = UILabel()
+    let tableView = UITableView(frame: .zero, style: .plain)
+    let vm = FeedbackVM()
+    var didSelected:((_ model:QaModelListModel)->Void)?
+    
+    override func setupViews() {
+//        backgroundColor = .red
+        bgView.do { v in
+            v.backgroundColor = .white
+            v.yc.setCornerRadius(12)
+        }
+        titleLabel.do { (v) in
+            v.textColor = .rgb(0x121212)
+            v.font = .regular(18)
+            v.textAlignment = .left
+            v.lineBreakMode = .byTruncatingTail
+            v.text = "Hi," + CacheManager.shared.user.info.userName
+        }
+        tableView.do { v in
+            v.delegate = self
+            v.dataSource = self
+            v.separatorStyle = .none
+            v.estimatedRowHeight = 50
+            v.register(QaHeaderViewCell.self, forCellReuseIdentifier: QaHeaderViewCell.reuseID)
+        }
+        
+        addSubviews([titleLabel,bgView])
+        bgView.addSubview(tableView)
+    }
+    override func setupLayout() {
+        titleLabel.snp.makeConstraints { make in
+            make.top.equalToSuperview().inset(20)
+            make.left.right.equalToSuperview().inset(18)
+        }
+        bgView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.bottom.equalToSuperview()
+            make.top.equalToSuperview().inset(60)
+        }
+
+        tableView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalToSuperview().inset(10)
+            make.bottom.equalToSuperview().inset(10)
+        }
+    }
+    
+    func loadData(categoryId:String){
+        vm.categoryId = categoryId
+        vm.refresh {[weak self] model in
+            guard let self = self else{return}
+            if model.isSuccess{
+                tableView.reloadData()
+            }
+        }
+    }
+}
+extension QaHeaderView:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return vm.list.count
+    }
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = QaHeaderViewCell.cell(withTableView: tableView, indexPath: indexPath)
+        cell.titleLabel.text = "\(indexPath.row + 1)." + vm.list[indexPath.row].title
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let data = vm.list[indexPath.row]
+        didSelected?(data)
+    }
+}
+class QaHeaderViewCell: BaseTableViewCell {
+    let titleLabel = UILabel()
+    
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+    }
+    
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    override func setupViews() {
+        contentView.addSubviews([titleLabel])
+        
+        titleLabel.do { (v) in
+            v.textColor = .rgb(0x666666)
+            v.font = .regular(14)
+            v.textAlignment = .left
+            v.numberOfLines = 0
+        }
+    }
+    
+    override func setupLayout() {
+        titleLabel.snp.makeConstraints { (m) in
+            m.top.bottom.equalToSuperview().inset(5)
+            m.left.equalToSuperview().inset(15)
+            m.right.lessThanOrEqualToSuperview().inset(10)
+        }
+    }
+    
+    
+}
index 5d87b7a..81dea40 100644 (file)
@@ -70,7 +70,7 @@ extension AboutVC:UITableViewDelegate,UITableViewDataSource {
             App.shared.goToPage(vc)
         }
         else if data == .update{
-            
+            YLprogressHUD.showAutoHiden("当前已经是最新版本")
         }
     }
 }
index c58b9ef..7cc3403 100644 (file)
@@ -9,9 +9,9 @@ import UIKit
 
 class FeekbackVC:BaseVC{
     let bottomView = FeedbackBottomView()
-    let qaView = FeedbackQaListView()
-    let contentView = FeedbackContentView()
-    
+    let qaView =  QaHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 160))
+    let tableView = UITableView()
+    var dataList:[FeedbackContentModel] = []
     override func viewDidLoad() {
         super.viewDidLoad()
         
@@ -20,7 +20,7 @@ class FeekbackVC:BaseVC{
     override func setupViews() {
         self.navBar.title = "意见反馈"
         view.backgroundColor = .color(.bgColor)
-        view.addSubviews([bottomView,qaView,contentView])
+        view.addSubviews([bottomView, tableView])
         
         qaView.do { v in
             v.didSelected = {[weak self] model in
@@ -32,21 +32,27 @@ class FeekbackVC:BaseVC{
             v.feedbackItem.yc.addTap(target: self, action: #selector(feedbackAction))
             v.chatItem.yc.addTap(target: self, action: #selector(chatAction))
         }
+        tableView.do { v in
+            v.keyboardDismissMode = .onDragWithAccessory
+            v.backgroundColor = .clear
+            v.delegate = self
+            v.dataSource = self
+            v.estimatedRowHeight = 60
+            v.separatorStyle = .none
+            v.tableHeaderView = qaView
+            v.register(FeedbackContentViewCell.self, forCellReuseIdentifier: FeedbackContentViewCell.reuseID)
+        }
     }
     override func setupLayout() {
         bottomView.snp.makeConstraints { make in
             make.left.width.bottom.equalToSuperview()
             make.height.equalTo(73)
         }
-        qaView.snp.makeConstraints { make in
-            make.left.right.equalToSuperview().inset(18)
-            make.height.equalTo(162)
-            make.top.equalToSuperview().inset(150)
-        }
-        contentView.snp.makeConstraints { make in
-            make.left.right.equalToSuperview().inset(18)
+
+        tableView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
             make.bottom.equalTo(bottomView.snp.top).offset(0)
-            make.top.equalTo(qaView.snp.bottom).offset(20)
+            make.top.equalTo(kNavBtm)
         }
     }
     override func setupData() {
@@ -59,11 +65,6 @@ class FeekbackVC:BaseVC{
         }
     }
     
-    func addModel(_ model:QaModelListModel){
-        contentView.addData(model: FeedbackContentModel(content: model.title,isSend: true))
-        contentView.addData(model: FeedbackContentModel(content: model.content,isSend: false))
-    }
-    
     @objc func feedbackAction(){
         App.shared.goToPage(FeedbackCommitVC())
     }
@@ -72,4 +73,30 @@ class FeekbackVC:BaseVC{
         App.shared.tabController?.selectedIndex = 3
 
     }
+
+    func refreshData(){
+        tableView.reloadData()
+        if dataList.count > 0 {
+            tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true)
+        }
+    }
+    func addModel(_ model:QaModelListModel){
+        dataList.append(FeedbackContentModel(content: model.title,isSend: true))
+        dataList.append(FeedbackContentModel(content: model.content,isSend: false))
+        refreshData()
+    }
+}
+extension FeekbackVC:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return dataList.count
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = FeedbackContentViewCell.cell(withTableView: tableView, indexPath: indexPath)
+        cell.data = dataList[indexPath.row]
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        
+    }
 }
index 8e9e53a..2c45bfc 100644 (file)
@@ -47,6 +47,6 @@ class UpdateVC:BaseVC{
         }
     }
     @objc func tapAction(){
-        
+        YLprogressHUD.showAutoHiden("当前已经是最新版本")
     }
 }
index e169aba..897bb42 100644 (file)
@@ -9,7 +9,7 @@ import JoyGemAI
 class ModeVC:BaseVC{
     let bgView = UIScrollView()
     let headerView = CurrentDeviceView()
-    let controlView = ModeControView()
+//    let controlView = ModeControView()
     let effectsView = ModeEffectsView()
     let findView = ModeFindView()
     
@@ -24,7 +24,7 @@ class ModeVC:BaseVC{
 //        navBar.rightView.setImage(UIImage(named: "add_icon"), for: .normal)
         
         view.addSubview(bgView)
-        bgView.addSubviews([headerView,controlView,effectsView,findView])
+        bgView.addSubviews([headerView,effectsView,findView])
         
 //        bgView.backgroundColor = .red
         effectsView.do { v in
@@ -45,20 +45,22 @@ class ModeVC:BaseVC{
             make.left.equalToSuperview()
             make.width.equalTo(kScreenWid)
         }
-        controlView.snp.makeConstraints { make in
+//        controlView.snp.makeConstraints { make in
+//            make.top.equalTo(headerView.snp.bottom).offset(10)
+//            make.centerX.equalToSuperview()
+//            make.width.equalTo(kScreenWid - 36)
+//            make.height.equalTo(128)
+//        }
+        effectsView.snp.makeConstraints { make in
             make.top.equalTo(headerView.snp.bottom).offset(10)
             make.centerX.equalToSuperview()
             make.width.equalTo(kScreenWid - 36)
-            make.height.equalTo(128)
-        }
-        effectsView.snp.makeConstraints { make in
-            make.top.equalTo(controlView.snp.bottom).offset(10)
-            make.left.width.equalTo(controlView)
             make.height.equalTo(325)
         }
         findView.snp.makeConstraints { make in
             make.top.equalTo(effectsView.snp.bottom).offset(10)
-            make.left.width.equalTo(effectsView)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(kScreenWid - 36)
             make.height.equalTo(62)
             make.bottom.equalToSuperview().inset(20)
         }