From: liangzhenying <867174124@qq.com> Date: Mon, 20 Oct 2025 03:04:42 +0000 (+0800) Subject: 完善客服功能 X-Git-Tag: 1.0.2~87 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=2883a3faa6b0cc60a35771dc9faf59fbee418853;p=mirrors%2FShenYin.git 完善客服功能 --- diff --git a/ShenYin/ShenYin/UI/Base/BaseTC.swift b/ShenYin/ShenYin/UI/Base/BaseTC.swift index afa86ac..c5ee6b0 100644 --- a/ShenYin/ShenYin/UI/Base/BaseTC.swift +++ b/ShenYin/ShenYin/UI/Base/BaseTC.swift @@ -55,6 +55,6 @@ class BaseTC:UITabBarController{ self.tabBar.backgroundColor = .white view.backgroundColor = .color(.bgColor) - self.selectedIndex = 4 + self.selectedIndex = 3 } } diff --git a/ShenYin/ShenYin/UI/Customer/CustomerVC.swift b/ShenYin/ShenYin/UI/Customer/CustomerVC.swift index fc8376d..4461200 100644 --- a/ShenYin/ShenYin/UI/Customer/CustomerVC.swift +++ b/ShenYin/ShenYin/UI/Customer/CustomerVC.swift @@ -6,21 +6,119 @@ // 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 index 0000000..af17fb9 --- /dev/null +++ b/ShenYin/ShenYin/UI/Customer/QaHeaderView.swift @@ -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) + } + } + + +} diff --git a/ShenYin/ShenYin/UI/Mine/AboutVC.swift b/ShenYin/ShenYin/UI/Mine/AboutVC.swift index 5d87b7a..81dea40 100644 --- a/ShenYin/ShenYin/UI/Mine/AboutVC.swift +++ b/ShenYin/ShenYin/UI/Mine/AboutVC.swift @@ -70,7 +70,7 @@ extension AboutVC:UITableViewDelegate,UITableViewDataSource { App.shared.goToPage(vc) } else if data == .update{ - + YLprogressHUD.showAutoHiden("当前已经是最新版本") } } } diff --git a/ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift b/ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift index c58b9ef..7cc3403 100644 --- a/ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift @@ -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) { + + } } diff --git a/ShenYin/ShenYin/UI/Mine/UpdateVC.swift b/ShenYin/ShenYin/UI/Mine/UpdateVC.swift index 8e9e53a..2c45bfc 100644 --- a/ShenYin/ShenYin/UI/Mine/UpdateVC.swift +++ b/ShenYin/ShenYin/UI/Mine/UpdateVC.swift @@ -47,6 +47,6 @@ class UpdateVC:BaseVC{ } } @objc func tapAction(){ - + YLprogressHUD.showAutoHiden("当前已经是最新版本") } } diff --git a/ShenYin/ShenYin/UI/Mode/ModeVC.swift b/ShenYin/ShenYin/UI/Mode/ModeVC.swift index e169aba..897bb42 100644 --- a/ShenYin/ShenYin/UI/Mode/ModeVC.swift +++ b/ShenYin/ShenYin/UI/Mode/ModeVC.swift @@ -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) }