杨锴
2024-09-14 7dbd89e0e71513a9a800f693220276a540e3a328
fix API
20个文件已修改
342 ■■■■■ 已修改文件
XQMuse/Config/Enums/Enums.swift 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Models.swift 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/NetworkRequest.swift 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Services.swift 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskDetailListTCell.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskDetailListTCell.xib 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyExchangeRecordTCell.swift 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyExchangeRecordTCell.xib 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyTCell.swift 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyTCell.xib 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TreeTeskVC.swift 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskDetailListVC.swift 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskDetailVC.swift 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskDetailVC.xib 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeRecordVC.swift 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeVC.swift 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeVC.xib 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/View/TreeTeskListView.swift 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/View/TreeTeskListView.xib 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Config/Enums/Enums.swift
@@ -105,3 +105,14 @@
                                }
                }
}
enum TreeTeskDetailType:Int{
                case all = 1
                case increase = 2
                case decreate = 3
}
enum EnergyChangeType:Int,HandyJSONEnum{
                case increase = 1
                case decreate = 2
}
XQMuse/Root/.DS_Store
Binary files differ
XQMuse/Root/Network/Models.swift
@@ -280,6 +280,20 @@
                var status:ConditionType = .no //是否枯萎
}
//struct EnergyModel:HandyJSON{
//                var energyTotal:Int = 0
//                var list = [EnergyListModel]()
//}
struct EnergyListModel:HandyJSON{
                var appUserId: Int = 0
                var changeType: EnergyChangeType = .decreate
                var createTime:String = ""
                var energyValue: Int = 0
                var id: Int = 0
                var reason: String = ""
}
struct WateringModel:HandyJSON{
                var growthValue = 0
                var nextLevel = 0
@@ -287,6 +301,33 @@
                var status = 0 //是否枯萎 1是2否(暂时不用)
}
struct EnergyExchangeGiftModel:HandyJSON{
                var coverUrl: String = ""
                var createBy: String = ""
                var createTime: String = ""
                var delFlag: Int = 0
                var energyValue: Int = 0
                var id: Int = 0
                var name: String = ""
                var receiveStatus:ConditionType = .no
                var redemptionTime: String = ""
                var sortNum: Int = 0
                var status: Int = 0
                var updateBy: String = ""
                var updateTime: String = ""
                var worth: Int = 0
}
struct EnergyExchangeRecordModel:HandyJSON{
                var coverUrl: String = ""
                var energyValue: Int = 0
                var id: Int = 0
                var name: String = ""
                var status:ConditionType = .no
                var worth: Int = 0
                var code:String = ""
}
XQMuse/Root/Network/NetworkRequest.swift
@@ -25,6 +25,8 @@
                var list: [T] = []
                var pages:Int = 0
                var total:Int = 0
                var energyTotal:Int?
}
struct BaseData<T: HandyJSON>: HandyJSON {
XQMuse/Root/Network/Services.swift
@@ -326,6 +326,63 @@
                                                .append(key: "apipost_id", value: "2e763463799130")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 树苗签到
                class func treeTaskSign()->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-tree/sign")
                                                .append(key: "apipost_id", value: "2e76346379912f")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                /// 树苗签到
                class func energyList(page:Int,pageSize:Int = 20,type:TreeTeskDetailType)->Observable<BaseResponse<[EnergyListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-tree/energyDetail")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "state", value: type.rawValue)
                                                .append(key: "apipost_id", value: "2e763462b99129")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                ///兑换礼物列表
                class func energyExchangeGift(page:Int,pageSize:Int = 20)->Observable<BaseResponse<[EnergyExchangeGiftModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-tree/goodsList")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "apipost_id", value: "2e76346379912d")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 能量值
                class func getTotalEnergy()->Observable<BaseResponse<Int>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/getTotalEnergyValue")
                                                .append(key: "apipost_id", value: "2fc350e9799581")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 兑换礼物
                class func exchangeGift(prizeId:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-tree/exchange")
                                                .append(key: "apipost_id", value: "2e76346339912a")
                                                .append(key: "prizeId", value: prizeId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                ///兑换记录
                class func exchangeRecordList(page:Int,pageSize:Int = 20)->Observable<BaseResponse<[EnergyExchangeRecordModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-tree/exchangeRecordList")
                                                .append(key: "apipost_id", value: "2e76346339912b")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
}
extension Services{
@@ -338,4 +395,12 @@
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
                /// 获取客服二维码
                class func getCustomerCode()->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/system/system/common-question/getQrCode")
                                                .append(key: "apipost_id", value: "2fcbf1daf99704")
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
}
XQMuse/Root/TreeGroup/TCell/TreeTeskDetailListTCell.swift
@@ -9,8 +9,26 @@
class TreeTeskDetailListTCell: UITableViewCell {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_datetime: UILabel!
                @IBOutlet weak var label_price: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
                func setEnergyListModel(_ model:EnergyListModel){
                                label_title.text = model.reason
                                label_datetime.text = model.createTime
                                switch model.changeType {
                                                case .increase:
                                                                label_price.text = "+\(model.energyValue)"
                                                                label_price.textColor = UIColor(hexString: "#FE3211")
                                                case .decreate:
                                                                label_price.text = "-\(model.energyValue)"
                                                                label_price.textColor = .black
                                }
                }
}
XQMuse/Root/TreeGroup/TCell/TreeTeskDetailListTCell.xib
@@ -54,6 +54,11 @@
                    <constraint firstAttribute="bottom" secondItem="d4H-i8-xi4" secondAttribute="bottom" id="x9k-J8-fj9"/>
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="label_datetime" destination="gtf-gz-3zb" id="INu-AI-hlT"/>
                <outlet property="label_price" destination="Glz-Zy-F1n" id="qUm-3q-2j7"/>
                <outlet property="label_title" destination="jNm-iE-MEv" id="5qB-QV-bxa"/>
            </connections>
            <point key="canvasLocation" x="197.70992366412213" y="36.971830985915496"/>
        </tableViewCell>
    </objects>
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyExchangeRecordTCell.swift
@@ -14,12 +14,32 @@
                @IBOutlet weak var view_info: UIView!
                @IBOutlet weak var view_code: UIView!
                @IBOutlet weak var view_state: UIView!
                @IBOutlet weak var label_state: UILabel!
                @IBOutlet weak var image_cover: UIImageView!
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_price: UILabel!
                @IBOutlet weak var label_energy: UILabel!
                @IBOutlet weak var label_code: UILabel!
                
    override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
                func setEnergyExchangeRecordModel(_ model:EnergyExchangeRecordModel){
                                label_title.text = model.name
                                image_cover.sd_setImage(with: URL(string: model.coverUrl))
                                label_price.text = "奖品价值:¥\(model.worth)"
                                label_energy.text = "所需能量值:\(model.energyValue)"
                                label_state.text = model.status == .yes ? "已领取":"待领取"
                                view_state.backgroundColor = model.status == .yes ? UIColor(hexString: "#B1CA99")! : UIColor(hexString: "#D0D0D0")!
                                view_code.isHidden = model.code.isEmpty || model.status == .yes
                                label_code.text = "领取验证码:\(model.code)"
                }
                override func layoutSubviews() {
                                super.layoutSubviews()
                                view_container.jq_addShadows(shadowColor: UIColor(hexString: "#EBEBEB")!, corner: 10, radius: 4, offset: CGSize(width: 0, height: 2), opacity: 1)
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyExchangeRecordTCell.xib
@@ -159,6 +159,12 @@
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="image_cover" destination="owe-zF-I6L" id="hPs-4G-fan"/>
                <outlet property="label_code" destination="emz-hg-MQM" id="mvX-qM-tHn"/>
                <outlet property="label_energy" destination="BQ5-Kp-B8d" id="yYD-j5-INt"/>
                <outlet property="label_price" destination="XYi-0C-yik" id="AJq-O5-OCM"/>
                <outlet property="label_state" destination="mbs-Qr-YmI" id="oBD-po-qjK"/>
                <outlet property="label_title" destination="WtU-Jl-cYE" id="dqh-E6-eUR"/>
                <outlet property="view_code" destination="DZM-ob-eeu" id="b1H-JY-pFF"/>
                <outlet property="view_container" destination="Kvf-jK-fIA" id="KWA-qV-HeU"/>
                <outlet property="view_info" destination="qLn-vi-HZe" id="n3M-yH-GAU"/>
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyTCell.swift
@@ -10,7 +10,12 @@
class TreeTeskEnergyTCell: UITableViewCell {
                @IBOutlet weak var image_cover: UIImageView!
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_price: UILabel!
                @IBOutlet weak var label_energy: UILabel!
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var image_exchanged: UIImageView!
                override func awakeFromNib() {
        super.awakeFromNib()
@@ -22,7 +27,12 @@
                                view_container.jq_addShadows(shadowColor: UIColor(hexString: "#EBEBEB")!, corner: 10, radius: 4, offset: CGSize(width: 0, height: 2), opacity: 1)
                }
                func isExchanged(_ state:Bool){
                                view_container.alpha = state == true ? 0.5:1
                func setEnergyExchangeGiftModel(_ model:EnergyExchangeGiftModel){
                                image_exchanged.isHidden = model.receiveStatus == .no
                                view_container.alpha = model.receiveStatus == .yes ? 0.5:1
                                image_cover.sd_setImage(with: URL(string: model.coverUrl))
                                label_title.text = model.name
                                label_price.text = "奖品价值:¥\(model.worth)"
                                label_energy.text = "所需能量值:\(model.energyValue)"
                }
}
XQMuse/Root/TreeGroup/TCell/TreeTeskEnergyTCell.xib
@@ -84,6 +84,11 @@
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="image_cover" destination="e5F-Yd-WS5" id="p4p-8c-hKf"/>
                <outlet property="image_exchanged" destination="8Vp-5D-KCR" id="Wxw-MX-WJW"/>
                <outlet property="label_energy" destination="zFc-Mw-j6J" id="smQ-Ow-T1I"/>
                <outlet property="label_price" destination="Ur6-cY-xSA" id="546-cW-opS"/>
                <outlet property="label_title" destination="ngg-7A-Acy" id="I5C-yP-maQ"/>
                <outlet property="view_container" destination="woz-r3-sT7" id="Jjw-os-T4t"/>
            </connections>
            <point key="canvasLocation" x="258.77862595419845" y="57.394366197183103"/>
XQMuse/Root/TreeGroup/TreeTeskVC.swift
@@ -150,13 +150,15 @@
                                Services.treeInfo().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                try? self.cacheTreeInfoModel.save(m)
                                                                self.taskListView.setTreeInfoModel(m)
                                                                //检查hash,进行同步
                                                                if m.toJSON()?.jq_hash() != self.treeInfoModel?.toJSON()?.jq_hash(){
                                                                                self.treeInfoModel = m
                                                                                self.updateTreeInfo()
                                                                }
                                                                try? self.cacheTreeInfoModel.save(m)
                                                }
                                }).disposed(by: disposeBag)
                }
@@ -252,14 +254,14 @@
                                if treeInfoModel == nil {return}
//                                guard m.currentEnergyValue != 0 else{
//                                                alert(msg: "已经没有能量值了,快去做任务吧");return
//                                }
                                guard treeInfoModel!.currentEnergyValue != 0 else{
                                                alert(msg: "已经没有能量值了,快去做任务吧");return
                                }
                                Services.watering().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                if m.isNext{
                                                                                var type = self.treeInfoModel?.treeLevelType ?? .level_1
                                                                                let type = self.treeInfoModel?.treeLevelType ?? .level_1
                                                                                self.treeInfoModel!.treeLevelType = TreeLevel(rawValue: type.rawValue + 1) ?? .level_1
                                                                                let h = (JQ_ScreenW - 90) * 0.7729
@@ -348,13 +350,13 @@
                                                                make.height.equalTo(731 * scale)
                                                }
                                                UIView.animate(withDuration: 1.5) {
                                                UIView.animate(withDuration: 0.6) {
                                                                self.aPNGTreeImageView?.alpha = 0
                                                }completion: { state in
                                                                if state{
                                                                                self.aPNGTreeImageView!.image = treeApngImage
                                                                                UIView.animate(withDuration: 1.5, delay: 0.2) {
                                                                                UIView.animate(withDuration: 0.5, delay: 0.2) {
                                                                                                self.aPNGTreeImageView?.alpha = 1
                                                                                }completion: { _ in
                                                                                                self.aPNGTreeImageView!.startAnimating()
XQMuse/Root/TreeGroup/VC/TreeTeskDetailListVC.swift
@@ -6,21 +6,26 @@
//
import UIKit
import RxRelay
import RxSwift
import JQTools
enum TreeTeskDetailType{
                case all
                case increase
                case decreate
class TreeTaskDetailListViewModel:RefreshModel<EnergyListModel>{
                var type = BehaviorRelay<TreeTeskDetailType>(value: .all)
                override func api() -> (Observable<BaseResponse<[EnergyListModel]>>)? {
                                return Services.energyList(page: page, type: type.value)
                }
}
class TreeTeskDetailListVC: BaseVC {
                var energyValue:BehaviorRelay<Int>!
                private var tableView:UITableView!
                private var type:TreeTeskDetailType!
                private var viewModel = TreeTaskDetailListViewModel()
                init(type:TreeTeskDetailType) {
                                super.init(nibName: nil, bundle: nil)
                                self.type = type
                                self.viewModel.type.accept(type)
                }
                
                required init?(coder: NSCoder) {
@@ -29,7 +34,6 @@
                
    override func viewDidLoad() {
        super.viewDidLoad()
    }
                override func setUI() {
@@ -42,6 +46,9 @@
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
                }
}
@@ -51,12 +58,14 @@
extension TreeTeskDetailListVC:UITableViewDataSource{
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let m = viewModel.dataSource.value[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_TreeTeskDetailListTCell") as! TreeTeskDetailListTCell
                                cell.setEnergyListModel(m)
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 11
                                return viewModel.dataSource.value.count
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
XQMuse/Root/TreeGroup/VC/TreeTeskDetailVC.swift
@@ -8,9 +8,11 @@
import UIKit
import SPPageMenu
import FFPage
import RxRelay
class TreeTeskDetailVC: BaseVC {
                @IBOutlet weak var view_top: UIView!
                @IBOutlet weak var label_energy: UILabel!
                
                private(set) var pageMenu:SPPageMenu = {
                                let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
@@ -53,6 +55,10 @@
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "能量值明细"
                                Services.getTotalEnergy().subscribe(onNext: {[weak self] data in
                                                self?.label_energy.text = "\(data.data ?? 0)"
                                }).disposed(by: disposeBag)
    }
                override func setUI() {
@@ -71,6 +77,10 @@
                                                make.top.equalTo(pageMenu.snp.bottom)
                                                make.left.right.bottom.equalToSuperview()
                                }
                }
                override func setRx() {
                }
}
@@ -97,6 +107,7 @@
                                                case 2:type = .decreate
                                                default:type = .all
                                }
                                return TreeTeskDetailListVC(type: type)
                                let vc = TreeTeskDetailListVC(type: type)
                                return vc
                }
}
XQMuse/Root/TreeGroup/VC/TreeTeskDetailVC.xib
@@ -11,6 +11,7 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TreeTeskDetailVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="label_energy" destination="Y0k-tw-jfz" id="I5a-Qb-9KE"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="view_top" destination="tXu-Ek-y6F" id="ggw-B8-TLR"/>
            </connections>
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeRecordVC.swift
@@ -6,14 +6,25 @@
//
import UIKit
import RxSwift
class TreeTeskRecordViewModel:RefreshModel<EnergyExchangeRecordModel>{
                override func api() -> (Observable<BaseResponse<[EnergyExchangeRecordModel]>>)? {
                                return Services.exchangeRecordList(page: page)
                }
}
class TreeTeskEnergyExchangeRecordVC: BaseVC {
                private var tableView:UITableView!
                private var viewModel = TreeTeskRecordViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "兑换记录"
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
    }
                override func setUI() {
@@ -35,11 +46,13 @@
extension TreeTeskEnergyExchangeRecordVC:UITableViewDataSource{
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let m = viewModel.dataSource.value[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_TreeTeskEnergyExchangeRecordTCell") as! TreeTeskEnergyExchangeRecordTCell
                                cell.setEnergyExchangeRecordModel(m)
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 3
                                return viewModel.dataSource.value.count
                }
}
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeVC.swift
@@ -7,14 +7,40 @@
import UIKit
import JQTools
import RxSwift
import RxCocoa
import RxRelay
class TreeTeskExchangeViewModel:RefreshModel<EnergyExchangeGiftModel>{
                var energyValue = BehaviorRelay<Int>(value:0)
                override func api() -> (Observable<BaseResponse<[EnergyExchangeGiftModel]>>)? {
                                return Services.energyExchangeGift(page: page)
                }
}
class TreeTeskEnergyExchangeVC: BaseVC {
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var label_energy: UILabel!
                @IBOutlet weak var image_qrCode: UIImageView!
                var viewModel = TreeTeskExchangeViewModel()
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "礼品兑换"
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
                                Services.getTotalEnergy().subscribe(onNext: {[weak self] data in
                                                self?.viewModel.energyValue.accept(data.data ?? 0)
                                                self?.label_energy.text = "\(data.data ?? 0)"
                                }).disposed(by: disposeBag)
                                Services.getCustomerCode().subscribe(onNext: {[weak self] data in
                                                self?.image_qrCode.sd_setImage(with: URL(string: data.data ?? ""))
                                }).disposed(by: disposeBag)
                }
                override func setUI() {
@@ -43,25 +69,42 @@
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let attribute = AttributedStringbuilder.build().add(string: "是否确认使用X能量值兑换当前礼品?\n兑换后系统将自动扣除能量值", withFont: .systemFont(ofSize: 14, weight: .medium), withColor: .black.withAlphaComponent(0.59), indent: 0, lineSpace: 6).mutableAttributedString
                                let m = viewModel.dataSource.value[indexPath.row]
                                CommonAlertView.show(title: "提示", attribute: attribute, isSingle: false, cancelStr: "再想想", completeStr: "确认") { state in
                                guard m.receiveStatus == .no else {
                                                CommonAlertView.show(title: "提示", content: "你已经兑换过了", isSingle: true) { _ in
                                                if state{
                                                                TreeTeskExchangeSuccessView.show()
                                                }
                                                return
                                                }
                                guard viewModel.energyValue.value > m.energyValue else {
                                                CommonAlertView.show(title: "提示", content: "兑换能量值不足", isSingle: true) { _ in
                                                }
                                                return
                                }
                                let attribute = AttributedStringbuilder.build().add(string: "是否确认使用\(m.energyValue)能量值兑换当前礼品?\n兑换后系统将自动扣除能量值", withFont: .systemFont(ofSize: 14, weight: .medium), withColor: .black.withAlphaComponent(0.59), indent: 0, lineSpace: 6).mutableAttributedString
                                CommonAlertView.show(title: "提示", attribute: attribute, isSingle: false, cancelStr: "再想想", completeStr: "确认") { state in
                                                if state{
                                                                Services.exchangeGift(prizeId: m.id).subscribe(onNext: {data in
                                                                                TreeTeskExchangeSuccessView.show()
                                                                }).disposed(by: self.disposeBag)
                                                }
                                }
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let m = viewModel.dataSource.value[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_TreeTeskEnergyTCell") as! TreeTeskEnergyTCell
                                cell.isExchanged(indexPath.row == 0)
                                cell.setEnergyExchangeGiftModel(m)
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 11
                                return viewModel.dataSource.value.count
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
XQMuse/Root/TreeGroup/VC/TreeTeskEnergyExchangeVC.xib
@@ -11,6 +11,8 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TreeTeskEnergyExchangeVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="image_qrCode" destination="9aI-7D-eFc" id="DWI-j2-Hxg"/>
                <outlet property="label_energy" destination="Bdm-PA-8sh" id="wqz-0G-KjH"/>
                <outlet property="tableView" destination="JKR-h6-LMB" id="zkA-3O-scS"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
XQMuse/Root/TreeGroup/View/TreeTeskListView.swift
@@ -17,12 +17,14 @@
class TreeTeskListView: UIView,JQNibView{
                @IBOutlet weak var view_sign: UIView!
                @IBOutlet weak var view_sign_cricle: UIView!
                @IBOutlet weak var label_sign: UILabel!
                @IBOutlet weak var tap_sign: TapBtn!
                
                private var clouse:((TreeTeskListSwipe)->Void)?
                private var disposeBag = DisposeBag()
                private var treeInfoModel:TreeInfoModel?
                override func awakeFromNib() {
                                super.awakeFromNib()
@@ -66,11 +68,31 @@
                                self.clouse = clouse
                }
                @IBAction func signAction(_ sender: TapBtn) {
                func setTreeInfoModel(_ model:TreeInfoModel){
                                self.treeInfoModel = model
                                if model.isSign == .yes{
                                                tap_sign.isUserInteractionEnabled = false
                                label_sign.text = "已签到"
                                view_sign.backgroundColor = .gray.withAlphaComponent(0.2)
                                label_sign.textColor = .white
                                                view_sign_cricle.jq_borderColor = .gray.withAlphaComponent(0.2)
                                }else{
                                                tap_sign.isUserInteractionEnabled = true
                                                label_sign.text = "打卡签到"
                                                view_sign.backgroundColor = .white
                                                label_sign.textColor = UIColor(hexString: "#4E4E4E")
                                }
                }
                @IBAction func signAction(_ sender: TapBtn) {
                                tap_sign.isUserInteractionEnabled = false
                                label_sign.text = "已签到"
                                view_sign.backgroundColor = .gray.withAlphaComponent(0.1)
                                label_sign.textColor = .white
                                view_sign_cricle.jq_borderColor = .gray.withAlphaComponent(0.9)
                                let imageView = UIImageView(image: UIImage(named: "icon_signSuccess"))
                                imageView.transform = .init(scaleX: 0.1, y: 0.1)
XQMuse/Root/TreeGroup/View/TreeTeskListView.xib
@@ -305,7 +305,9 @@
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <connections>
                <outlet property="label_sign" destination="Vzb-As-8Sv" id="jv7-Zj-Xma"/>
                <outlet property="tap_sign" destination="QeN-rl-gb6" id="eP4-E2-KLg"/>
                <outlet property="view_sign" destination="bLC-YH-CzV" id="wAt-7y-Hql"/>
                <outlet property="view_sign_cricle" destination="vuQ-La-6pi" id="jIF-NF-3jH"/>
            </connections>
            <point key="canvasLocation" x="64.885496183206101" y="154.22535211267606"/>
        </view>