ソースを参照

增加老师端VIP课程设置页面接口业务逻辑

Pq 8 ヶ月 前
コミット
9a9ccc03aa
22 ファイル変更556 行追加50 行削除
  1. 1 1
      BaseLibrary/src/main/java/com/cooleshow/base/bean/CourseTipBean.java
  2. 25 14
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/dialog/CourseTipDialog.java
  3. 0 0
      BaseLibrary/src/main/res/drawable-xhdpi/bg_course_tip_top.png
  4. 0 0
      BaseLibrary/src/main/res/drawable-xxhdpi/bg_course_tip_top.png
  5. 1 1
      BaseLibrary/src/main/res/layout/dialog_course_tip_layout.xml
  6. 0 0
      BaseLibrary/src/main/res/layout/item_dialog_course_tip_layout.xml
  7. 9 0
      BaseLibrary/src/main/res/values/strings.xml
  8. 1 1
      student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java
  9. 0 8
      student/src/main/res/values/strings.xml
  10. 20 0
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  11. 72 0
      teacher/src/main/java/com/cooleshow/teacher/bean/CourseSettingTimeAndPriceSectionBean.java
  12. 12 1
      teacher/src/main/java/com/cooleshow/teacher/bean/QuerySubjectBean.java
  13. 81 0
      teacher/src/main/java/com/cooleshow/teacher/bean/SysParamConfigBean.java
  14. 11 0
      teacher/src/main/java/com/cooleshow/teacher/bean/request/SubmitVIPCourseSettingEntry.java
  15. 15 0
      teacher/src/main/java/com/cooleshow/teacher/constants/CourseConstants.java
  16. 10 0
      teacher/src/main/java/com/cooleshow/teacher/contract/VIPCourseSettingContract.java
  17. 56 0
      teacher/src/main/java/com/cooleshow/teacher/presenter/course/VIPCourseSettingPresenter.java
  18. 218 8
      teacher/src/main/java/com/cooleshow/teacher/ui/course/VIPCourseSettingActivity.java
  19. 2 1
      teacher/src/main/java/com/cooleshow/teacher/ui/homepage/VIPCustomCoursePageFragment.java
  20. 13 8
      teacher/src/main/res/layout/ac_vip_course_setting_layout.xml
  21. 5 6
      teacher/src/main/res/layout/item_vip_course_setting_select_layout.xml
  22. 4 1
      teacher/src/main/res/values/strings.xml

+ 1 - 1
student/src/main/java/com/cooleshow/student/bean/CourseTipBean.java → BaseLibrary/src/main/java/com/cooleshow/base/bean/CourseTipBean.java

@@ -1,4 +1,4 @@
-package com.cooleshow.student.bean;
+package com.cooleshow.base.bean;
 
 /**
  * Author by pq, Date on 2024/11/20.

+ 25 - 14
student/src/main/java/com/cooleshow/student/widgets/dialog/CourseTipDialog.java → BaseLibrary/src/main/java/com/cooleshow/base/widgets/dialog/CourseTipDialog.java

@@ -1,4 +1,4 @@
-package com.cooleshow.student.widgets.dialog;
+package com.cooleshow.base.widgets.dialog;
 
 import android.app.Dialog;
 import android.content.Context;
@@ -11,12 +11,11 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.R;
+import com.cooleshow.base.bean.CourseTipBean;
 import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.utils.JumpUtils;
-import com.cooleshow.student.R;
-import com.cooleshow.student.bean.AppHomeBean;
-import com.cooleshow.student.bean.CourseTipBean;
 import com.youth.banner.Banner;
 import com.youth.banner.adapter.BannerAdapter;
 import com.youth.banner.adapter.BannerImageAdapter;
@@ -40,6 +39,7 @@ public class CourseTipDialog extends Dialog implements View.OnClickListener {
     private Banner mBanner;
     private ImageView mIvClose;
     private TextView mTvConfirm;
+    private MyBannerAdapter mBannerAdapter;
 
     public CourseTipDialog(@NonNull Context context) {
         super(context, R.style.DialogStyle);
@@ -66,8 +66,8 @@ public class CourseTipDialog extends Dialog implements View.OnClickListener {
             courseTipBean.setDes(getContext().getString(desDatas[i]));
             list.add(courseTipBean);
         }
-        MyBannerAdapter myBannerAdapter = new MyBannerAdapter(list);
-        mBanner.setAdapter(myBannerAdapter, false)//添加生命周期观察者
+        mBannerAdapter = new MyBannerAdapter(list);
+        mBanner.setAdapter(mBannerAdapter, false)//添加生命周期观察者
                 .isAutoLoop(false)
                 .setIndicatorGravity(IndicatorConfig.Direction.RIGHT)
 //                .removeIndicator()
@@ -77,19 +77,30 @@ public class CourseTipDialog extends Dialog implements View.OnClickListener {
 
     @Override
     public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.iv_close:
-            case R.id.tv_confirm:
-                dismiss();
-                break;
+        int id = v.getId();
+        if (id == R.id.iv_close || id == R.id.tv_confirm) {
+            dismiss();
+            return;
         }
     }
 
     public void setSelect(int currentPos) {
         int itemCount = mBanner.getItemCount();
-        if(currentPos<itemCount){
-            mBanner.setCurrentItem(currentPos,false);
-            mBanner.getIndicator().onPageChanged(itemCount,currentPos);
+        if (currentPos < itemCount) {
+            mBanner.setCurrentItem(currentPos, false);
+            mBanner.getIndicator().onPageChanged(itemCount, currentPos);
+        }
+    }
+
+    public void onlyShowPos(int pos) {
+        if (pos < titles.length) {
+            list = new ArrayList<>();
+            CourseTipBean courseTipBean = new CourseTipBean();
+            courseTipBean.setTitle(getContext().getString(titles[pos]));
+            courseTipBean.setDes(getContext().getString(desDatas[pos]));
+            list.add(courseTipBean);
+            mBannerAdapter.setDatas(list);
+            mBanner.removeIndicator();
         }
     }
 

+ 0 - 0
student/src/main/res/drawable-xhdpi/bg_course_tip_top.png → BaseLibrary/src/main/res/drawable-xhdpi/bg_course_tip_top.png


+ 0 - 0
student/src/main/res/drawable-xxhdpi/bg_course_tip_top.png → BaseLibrary/src/main/res/drawable-xxhdpi/bg_course_tip_top.png


+ 1 - 1
student/src/main/res/layout/dialog_course_tip_layout.xml → BaseLibrary/src/main/res/layout/dialog_course_tip_layout.xml

@@ -46,7 +46,7 @@
         app:layout_constraintTop_toBottomOf="@+id/banner"
         app:layout_constraintRight_toRightOf="@+id/iv_top"
         app:layout_constraintLeft_toLeftOf="@+id/iv_top"
-        tools:text="我知道了"
+        android:text="我知道了"
         android:gravity="center"
         android:textColor="@color/white"
         android:background="@drawable/shape_2dc7aa_8dp"

+ 0 - 0
student/src/main/res/layout/item_dialog_course_tip_layout.xml → BaseLibrary/src/main/res/layout/item_dialog_course_tip_layout.xml


+ 9 - 0
BaseLibrary/src/main/res/values/strings.xml

@@ -30,4 +30,13 @@
     <string name="error_tip">无网络连接,请检查网络后重试</string>
     <string name="cancel_upload_str">取消上传</string>
     <string name="confirm_str">确认</string>
+
+    <string name="vip_course_tip_str">VIP定制课程采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。</string>
+    <string name="interest_course_tip_str">趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。</string>
+    <string name="live_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
+    <string name="video_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
+    <string name="vip_course_tip_title">什么是VIP定制课程?</string>
+    <string name="interest_course_tip_title">什么是趣纠课?</string>
+    <string name="live_course_tip_title">什么是直播课?</string>
+    <string name="video_course_tip_title">什么是视频课?</string>
 </resources>

+ 1 - 1
student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java

@@ -13,6 +13,7 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.widgets.dialog.CourseTipDialog;
 import com.cooleshow.musicmerge.adapter.MyWorkPagerAdapter;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.MineCoursePagerAdapter;
@@ -23,7 +24,6 @@ import com.cooleshow.student.databinding.ActivityAppointmentCourseBinding;
 import com.cooleshow.student.databinding.ActivityMineCourseBinding;
 import com.cooleshow.student.presenter.course.AppointCoursePresenter;
 import com.cooleshow.student.presenter.course.MineCoursePresenter;
-import com.cooleshow.student.widgets.dialog.CourseTipDialog;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 

+ 0 - 8
student/src/main/res/values/strings.xml

@@ -42,12 +42,4 @@
     <string name="custom_service_tip">或通过以下方式联系我们:\n客服电话:%s\n邮箱:%s</string>
     <string name="icp_str">ICP备案号:鄂ICP备2021020787号-4A</string>
     <string name="app_info_record">增值电信业务经营许可证:鄂B2-20231246\n教育移动互联网应用备案:教APP备4200224号\n网络安全等级保护备案号:42010043158-24001\nCopyright@2021-2024|酷乐秀 colexiu.com 版权所有</string>
-    <string name="vip_course_tip_str">VIP定制课程采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。</string>
-    <string name="interest_course_tip_str">趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。</string>
-    <string name="live_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
-    <string name="video_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
-    <string name="vip_course_tip_title">什么是VIP定制课程?</string>
-    <string name="interest_course_tip_title">什么是趣纠课?</string>
-    <string name="live_course_tip_title">什么是直播课?</string>
-    <string name="video_course_tip_title">什么是视频课?</string>
 </resources>

+ 20 - 0
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -14,6 +14,7 @@ import com.cooleshow.teacher.bean.HomeMenuBean;
 import com.cooleshow.teacher.bean.LiveListBean;
 import com.cooleshow.teacher.bean.LivePlayBackDataBean;
 import com.cooleshow.base.bean.StudentPageListBean;
+import com.cooleshow.teacher.bean.SysParamConfigBean;
 import com.cooleshow.teacher.bean.TeacherPromoteIncomeBean;
 import com.cooleshow.teacher.bean.UnBindTenantDetailBean;
 import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
@@ -57,6 +58,7 @@ import com.cooleshow.teacher.bean.WithdrawalInfoBean;
 import com.cooleshow.teacher.bean.WithdrawalRecordBean;
 import com.cooleshow.teacher.bean.request.QueryGroupListEntry;
 import com.cooleshow.teacher.bean.request.SheetMusicEntry;
+import com.cooleshow.teacher.bean.request.SubmitVIPCourseSettingEntry;
 import com.cooleshow.teacher.bean.request.TeacherPracticeCourseEntry;
 import com.cooleshow.teacher.bean.request.UnBindCardEntry;
 import com.cooleshow.usercenter.bean.SetDetailBean;
@@ -860,4 +862,22 @@ public interface APIService {
      */
     @POST(TEACHER_GROUP + "courseGroup/myCourseGroup")
     Observable<BaseResponse<VIPCourseGroupListBean>> getCourseGroup(@Body RequestBody body);
+
+    /**
+     *
+     *
+     * @param
+     * @return
+     */
+    @GET(TEACHER_GROUP + "sysConfig/queryByParamNameList")
+    Observable<BaseResponse<ArrayList<SysParamConfigBean>>> getSysParamConfigs(@Query("paramNames") String paramName);
+
+    /**
+     *
+     *
+     * @param
+     * @return
+     */
+    @POST(TEACHER_GROUP + "teacherSubjectPrice/saveOrUpdate")
+    Observable<BaseResponse<Object>> submitVIPCourseOptions(@Body SubmitVIPCourseSettingEntry vipCourseSettingEntry);
 }

+ 72 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/CourseSettingTimeAndPriceSectionBean.java

@@ -0,0 +1,72 @@
+package com.cooleshow.teacher.bean;
+
+import com.cooleshow.base.iml.ICommonFilterData;
+
+/**
+ * Author by pq, Date on 2024/11/21.
+ */
+public class CourseSettingTimeAndPriceSectionBean implements ICommonFilterData {
+    /**
+     * courseMinutes : 25
+     * freeMinutes : 5
+     * lowestPrice : 100
+     * highestPrice : 200
+     * id : 0
+     */
+
+    private String courseMinutes;
+    private String freeMinutes;
+    private String lowestPrice;
+    private String highestPrice;
+    private String id;
+
+    @Override
+    public String getText() {
+        return courseMinutes+"分钟";
+    }
+
+    @Override
+    public String getFilterId() {
+        return courseMinutes;
+    }
+
+    public String getCourseMinutes() {
+        return courseMinutes;
+    }
+
+    public void setCourseMinutes(String courseMinutes) {
+        this.courseMinutes = courseMinutes;
+    }
+
+    public String getFreeMinutes() {
+        return freeMinutes;
+    }
+
+    public void setFreeMinutes(String freeMinutes) {
+        this.freeMinutes = freeMinutes;
+    }
+
+    public String getLowestPrice() {
+        return lowestPrice;
+    }
+
+    public void setLowestPrice(String lowestPrice) {
+        this.lowestPrice = lowestPrice;
+    }
+
+    public String getHighestPrice() {
+        return highestPrice;
+    }
+
+    public void setHighestPrice(String highestPrice) {
+        this.highestPrice = highestPrice;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}

+ 12 - 1
teacher/src/main/java/com/cooleshow/teacher/bean/QuerySubjectBean.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.bean;
 
 import com.contrarywind.interfaces.IPickerViewData;
+import com.cooleshow.base.iml.ICommonFilterData;
 import com.cooleshow.base.interfaces.IFilterViewData;
 
 import java.util.List;
@@ -11,7 +12,7 @@ import java.util.List;
  * @author Ryan
  * 类说明:
  */
-public class QuerySubjectBean implements IPickerViewData, IFilterViewData {
+public class QuerySubjectBean implements IPickerViewData, IFilterViewData, ICommonFilterData {
     /*
     	"code": "",
 			"createTime": "",
@@ -73,4 +74,14 @@ public class QuerySubjectBean implements IPickerViewData, IFilterViewData {
     public String getShowName() {
         return name;
     }
+
+    @Override
+    public String getText() {
+        return name;
+    }
+
+    @Override
+    public String getFilterId() {
+        return String.valueOf(id);
+    }
 }

+ 81 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/SysParamConfigBean.java

@@ -0,0 +1,81 @@
+package com.cooleshow.teacher.bean;
+
+/**
+ * Author by pq, Date on 2023/2/27.
+ */
+public class SysParamConfigBean {
+
+    /**
+     * id : 100049
+     * paramName : qr_code_expire_hours
+     * paramValue : 5
+     * description : 二维码过期时间(单位:小时)
+     * group : OTHER
+     * updateTime : 2023-02-27 14:28:37
+     * createTime : 2023-02-06 20:08:30
+     */
+
+    private String id;
+    private String paramName;
+    private String paramValue;
+    private String description;
+    private String group;
+    private String updateTime;
+    private String createTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getParamName() {
+        return paramName;
+    }
+
+    public void setParamName(String paramName) {
+        this.paramName = paramName;
+    }
+
+    public String getParamValue() {
+        return paramValue;
+    }
+
+    public void setParamValue(String paramValue) {
+        this.paramValue = paramValue;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+}

+ 11 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/request/SubmitVIPCourseSettingEntry.java

@@ -0,0 +1,11 @@
+package com.cooleshow.teacher.bean.request;
+
+/**
+ * Author by pq, Date on 2024/11/21.
+ */
+public class SubmitVIPCourseSettingEntry {
+    public int courseMinutes;
+    public String subjectId;
+    public String courseType;
+    public int subjectPrice;
+}

+ 15 - 0
teacher/src/main/java/com/cooleshow/teacher/constants/CourseConstants.java

@@ -33,4 +33,19 @@ public class CourseConstants {
     public static final String COURSE_ID = "course_id";
     public static final String COURSE_GROUP_ID = "course_group_id";
     public static final String STUDENT_ID = "student_id";
+    public static final String VIP_COURSE_ACCOUNT_PERIOD = "vip_course_account_period";//VIP定制课老师确认收款账期
+    public static final String VIP_COURSE_TIMES_SETTING = "vip_course_times_setting";//VIP定制课可选时长配置
+    public static final String VIP_COURSE_SERVICE_FEE = "vip_course_service_fee";//VIP定制课服务费
+
+
+    public static double countVIPCourseRate(String rateValue) {
+        try {
+            double v = Double.parseDouble(rateValue);
+            double p = v / 100.00;
+            return 1 - p;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 1.00;
+    }
 }

+ 10 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/VIPCourseSettingContract.java

@@ -1,6 +1,11 @@
 package com.cooleshow.teacher.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
+import com.cooleshow.teacher.bean.SysParamConfigBean;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 创建日期:2022/5/20 10:34
@@ -11,6 +16,11 @@ import com.cooleshow.base.presenter.view.BaseView;
 public interface VIPCourseSettingContract {
     interface View extends BaseView {
 
+        void queryConfigSuccess(ArrayList<SysParamConfigBean> data);
+
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
+
+        void submitSuccess(Object data);
     }
     interface Presenter {
     }

+ 56 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/course/VIPCourseSettingPresenter.java

@@ -1,9 +1,26 @@
 package com.cooleshow.teacher.presenter.course;
 
+import android.text.TextUtils;
+
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.teacher.api.APIService;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
+import com.cooleshow.teacher.bean.SysParamConfigBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
+import com.cooleshow.teacher.bean.request.SubmitVIPCourseSettingEntry;
+import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.CreateLiveCourseArrangementContract;
 import com.cooleshow.teacher.contract.VIPCourseSettingContract;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 创建日期:2022/5/20 10:33
  *
@@ -11,4 +28,43 @@ import com.cooleshow.teacher.contract.VIPCourseSettingContract;
  * 类说明:
  */
 public class VIPCourseSettingPresenter extends BasePresenter<VIPCourseSettingContract.View> implements VIPCourseSettingContract.Presenter {
+    public void queryCourseConfig() {
+        String params = CourseConstants.VIP_COURSE_ACCOUNT_PERIOD + "," + CourseConstants.VIP_COURSE_TIMES_SETTING + "," + CourseConstants.VIP_COURSE_SERVICE_FEE;
+        addSubscribe(create(APIService.class).getSysParamConfigs(params), new BaseObserver<ArrayList<SysParamConfigBean>>(getView()) {
+            @Override
+            protected void onSuccess(ArrayList<SysParamConfigBean> data) {
+                if (getView() != null) {
+                    getView().queryConfigSuccess(data);
+                }
+            }
+        });
+    }
+
+    public void querySubjectItem() {
+        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<QuerySubjectBean> data) {
+                if (getView() != null) {
+                    getView().querySubjectItemSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+
+    public void submit(SubmitVIPCourseSettingEntry vipCourseSettingEntry) {
+        addSubscribe(create(APIService.class).submitVIPCourseOptions(vipCourseSettingEntry), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().submitSuccess(data);
+                }
+            }
+        });
+    }
 }

+ 218 - 8
teacher/src/main/java/com/cooleshow/teacher/ui/course/VIPCourseSettingActivity.java

@@ -1,21 +1,45 @@
 package com.cooleshow.teacher.ui.course;
 
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.view.View;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.iml.ICommonFilterData;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.NumberUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.dialog.CourseTipDialog;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.HomePageVipCourseAdapter;
 import com.cooleshow.teacher.adapter.VIPCourseSettingSelectAdapter;
+import com.cooleshow.teacher.bean.CourseSettingTimeAndPriceSectionBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
+import com.cooleshow.teacher.bean.SysParamConfigBean;
+import com.cooleshow.teacher.bean.request.SubmitVIPCourseSettingEntry;
+import com.cooleshow.teacher.constants.CourseConstants;
+import com.cooleshow.teacher.contract.VIPCourseSettingContract;
 import com.cooleshow.teacher.databinding.AcVipCourseSettingLayoutBinding;
 import com.cooleshow.teacher.presenter.course.VIPCourseSettingPresenter;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -24,15 +48,42 @@ import androidx.recyclerview.widget.RecyclerView;
  * Author by pq, Date on 2024/11/15.
  */
 @Route(path = RouterPath.CourseCenter.VIP_COURSE_SETTING)
-public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSettingLayoutBinding, VIPCourseSettingPresenter> implements View.OnClickListener {
-
-
+public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSettingLayoutBinding, VIPCourseSettingPresenter> implements View.OnClickListener, VIPCourseSettingContract.View {
+    private String days = "0";//课程结束后多少天到账
+    private double singleCoursePriceRate = 0;//单课时价格费率
     private VIPCourseSettingSelectAdapter subjectAdapter;
     private VIPCourseSettingSelectAdapter timeSelectAdapter;
+    private int minPrice = 100;
+    private int maxPrice = 1000;
+    private List<ICommonFilterData> subjectDatas = new ArrayList<>();
+    private ArrayList<ICommonFilterData> timesData = new ArrayList<>();
+    private TextWatcher mTextWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            refreshPriceUI();
+        }
+    };
+    private CourseTipDialog mCourseTipDialog;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
 
     @Override
     protected void initView() {
-        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar,"VIP定制课设置");
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "VIP定制课设置");
         viewBinding.toolbarInclude.tvRight.setVisibility(View.VISIBLE);
         viewBinding.toolbarInclude.tvRight.setImageResource(R.drawable.icon_question_mark);
         viewBinding.toolbarInclude.tvRight.setOnClickListener(this);
@@ -41,12 +92,12 @@ public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSetting
     @Override
     public void initData() {
         super.initData();
-        GridLayoutManager gridLayoutManager =new GridLayoutManager(this,3);
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
         subjectAdapter = new VIPCourseSettingSelectAdapter();
         viewBinding.recyclerViewSubject.setLayoutManager(gridLayoutManager);
         viewBinding.recyclerViewSubject.setAdapter(subjectAdapter);
 
-        GridLayoutManager gridLayoutManager2 =new GridLayoutManager(this,3);
+        GridLayoutManager gridLayoutManager2 = new GridLayoutManager(this, 3);
         timeSelectAdapter = new VIPCourseSettingSelectAdapter();
         viewBinding.recyclerViewTime.setLayoutManager(gridLayoutManager2);
         viewBinding.recyclerViewTime.setAdapter(timeSelectAdapter);
@@ -55,6 +106,8 @@ public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSetting
     }
 
     private void initListener() {
+        viewBinding.tvConfirm.setOnClickListener(this);
+        viewBinding.editPrice.addTextChangedListener(mTextWatcher);
         subjectAdapter.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
@@ -74,6 +127,7 @@ public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSetting
                 }
             }
         });
+
     }
 
     @Override
@@ -84,7 +138,8 @@ public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSetting
     @Override
     protected void onResume() {
         super.onResume();
-
+        presenter.queryCourseConfig();
+        presenter.querySubjectItem();
     }
 
     @Override
@@ -95,8 +150,163 @@ public class VIPCourseSettingActivity extends BaseMVPActivity<AcVipCourseSetting
     @Override
     public void onClick(View v) {
         int id = v.getId();
-        if(id == R.id.tv_confirm){
+        if (id == R.id.tv_confirm) {
+            SubmitVIPCourseSettingEntry vipCourseSettingEntry = checkCondition();
+            if (vipCourseSettingEntry != null) {
+                presenter.submit(vipCourseSettingEntry);
+            }
+            return;
+        }
+        if (id == com.cooleshow.base.R.id.tv_right) {
+            showTipDialog();
+            return;
+        }
+    }
+
+    private SubmitVIPCourseSettingEntry checkCondition() {
+        ArrayList<String> selectList = subjectAdapter.getSelectList();
+        if (selectList == null || selectList.size() == 0) {
+            ToastUtil.getInstance().showShort("请选择声部");
+            return null;
+        }
+
+        ArrayList<String> timeSelectList = timeSelectAdapter.getSelectList();
+        if (timeSelectList == null || timeSelectList.size() == 0) {
+            ToastUtil.getInstance().showShort("请选择单课时时长");
+            return null;
+        }
+
+        int coursePrice = 0;
+        Editable editable = viewBinding.editPrice.getText();
+        if (editable != null) {
+            String s = editable.toString();
+            if (TextUtils.isEmpty(s)) {
+                ToastUtil.getInstance().showShort("请输入课时单价");
+                return null;
+            }
+            coursePrice = Integer.parseInt(s);
+            if (coursePrice < minPrice || coursePrice > maxPrice) {
+                ToastUtil.getInstance().showShort(String.format("课时单价应在%d到%d元之间", minPrice, maxPrice));
+                return null;
+            }
+        } else {
+            ToastUtil.getInstance().showShort("请输入课时单价");
+            return null;
+        }
+
+        SubmitVIPCourseSettingEntry vipCourseSettingEntry = new SubmitVIPCourseSettingEntry();
+        try {
+            vipCourseSettingEntry.courseMinutes = Integer.parseInt(timeSelectList.get(0));
+            vipCourseSettingEntry.subjectId = selectList.get(0);
+            vipCourseSettingEntry.courseType = Constants.VIP_COURSE_TAG;
+            vipCourseSettingEntry.subjectPrice = coursePrice;
+            return vipCourseSettingEntry;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    @Override
+    public void queryConfigSuccess(ArrayList<SysParamConfigBean> data) {
+        if (!checkActivityExist()) {
             return;
         }
+        if (data != null && data.size() > 0) {
+            for (int i = 0; i < data.size(); i++) {
+                SysParamConfigBean sysParamConfigBean = data.get(i);
+                if (TextUtils.equals(sysParamConfigBean.getParamName(), CourseConstants.VIP_COURSE_ACCOUNT_PERIOD)) {
+                    days = sysParamConfigBean.getParamValue();
+                }
+                if (TextUtils.equals(sysParamConfigBean.getParamName(), CourseConstants.VIP_COURSE_SERVICE_FEE)) {
+                    singleCoursePriceRate = CourseConstants.countVIPCourseRate(sysParamConfigBean.getParamValue());
+                }
+
+                if (TextUtils.equals(sysParamConfigBean.getParamName(), CourseConstants.VIP_COURSE_TIMES_SETTING)) {
+                    createTimeAndPriceSectionData(sysParamConfigBean.getParamValue());
+                }
+            }
+        }
+        refreshUI();
+    }
+
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        if (subjectAdapter != null) {
+            subjectDatas.clear();
+            subjectDatas.addAll(data);
+            subjectAdapter.setNewInstance(subjectDatas);
+        }
+    }
+
+    @Override
+    public void submitSuccess(Object data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        ToastUtil.getInstance().showShort("设置成功");
+        finish();
+    }
+
+    private void refreshUI() {
+        //汇款天数
+        SpannableString string = UiUtils.diffColorStringAndBold(getString(R.string.vip_setting_str3), " " + days + " ", getString(R.string.vip_setting_str4), getResources().getColor(com.cooleshow.base.R.color.color_999999), getResources().getColor(com.cooleshow.base.R.color.color_ff4e19));
+        viewBinding.tvTip2.setText(string);
+        timeSelectAdapter.setNewInstance(timesData);
+        viewBinding.editPrice.setHint(minPrice + "~" + maxPrice);
+        refreshPriceUI();
+    }
+
+    private void refreshPriceUI() {
+        double twoDecimalValue = 0.00;
+        try {
+            String prePrice = viewBinding.editPrice.getText().toString().trim();
+            int i = Integer.parseInt(prePrice);
+            twoDecimalValue = NumberUtils.getTwoDecimalValue(i * singleCoursePriceRate);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        SpannableString string = UiUtils.diffColorStringAndBold(getString(R.string.vip_setting_str1), " " + twoDecimalValue + " ", getString(R.string.vip_setting_str2), getResources().getColor(com.cooleshow.base.R.color.color_999999), getResources().getColor(com.cooleshow.base.R.color.color_ff4e19));
+        viewBinding.tvTip1.setText(string);
+    }
+
+    private void createTimeAndPriceSectionData(String paramValue) {
+        try {
+            Type itemType = new TypeToken<List<CourseSettingTimeAndPriceSectionBean>>() {
+            }.getType();
+            List<CourseSettingTimeAndPriceSectionBean> result = GsonUtils.fromJson(paramValue, itemType);
+            if (result != null) {
+                timesData.clear();
+                timesData.addAll(result);
+                CourseSettingTimeAndPriceSectionBean courseSettingTimeAndPriceSectionBean = result.get(0);
+                minPrice = Integer.parseInt(courseSettingTimeAndPriceSectionBean.getLowestPrice());
+                maxPrice = Integer.parseInt(courseSettingTimeAndPriceSectionBean.getHighestPrice());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void showTipDialog() {
+        if (mCourseTipDialog == null) {
+            mCourseTipDialog = new CourseTipDialog(this);
+        }
+        if (!mCourseTipDialog.isShowing()) {
+            mCourseTipDialog.show();
+        }
+        //仅显示VIP定制课
+        mCourseTipDialog.onlyShowPos(0);
+    }
+
+    @Override
+    public void onDestroy() {
+        if (viewBinding != null) {
+            viewBinding.editPrice.removeTextChangedListener(mTextWatcher);
+        }
+        super.onDestroy();
     }
 }

+ 2 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/VIPCustomCoursePageFragment.java

@@ -41,7 +41,8 @@ public class VIPCustomCoursePageFragment extends BaseMVPFragment<FragmentVipCust
         mViewBinding.commonHeader.setDataStyle(TIP_CACHE_KEY,R.drawable.icon_vip_custom_course_des_tag, getString(R.string.vip_course_des_title), getString(R.string.vip_custom_course_des), R.drawable.icon_vip_course_set,getString(R.string.set_vip_course_confirm_text), new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-
+                ARouter.getInstance().build(RouterPath.CourseCenter.VIP_COURSE_SETTING)
+                        .navigation();
             }
         });
 

+ 13 - 8
teacher/src/main/res/layout/ac_vip_course_setting_layout.xml

@@ -12,10 +12,8 @@
         android:layout_marginTop="12dp"
         android:layout_marginEnd="14dp"
         android:layout_marginStart="14dp"
-        android:paddingBottom="12dp"
-        android:paddingStart="12dp"
-        android:paddingEnd="12dp"
-        android:paddingTop="12dp"
+        android:paddingBottom="8dp"
+        android:paddingTop="8dp"
         app:layout_constraintTop_toBottomOf="@+id/toolbar_include"
         android:id="@+id/ll_subject"
         android:orientation="vertical"
@@ -23,6 +21,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
         <TextView
+            android:paddingStart="12dp"
             android:drawablePadding="4dp"
             android:drawableStart="@drawable/icon_vip_course_setting_subject_tag"
             android:textSize="@dimen/sp_16"
@@ -33,6 +32,8 @@
 
         <androidx.recyclerview.widget.RecyclerView
             android:scrollbars="none"
+            android:layout_marginEnd="8dp"
+            android:layout_marginStart="8dp"
             android:layout_marginTop="12dp"
             android:id="@+id/recyclerView_subject"
             android:overScrollMode="never"
@@ -46,10 +47,8 @@
         android:layout_marginTop="12dp"
         android:layout_marginEnd="14dp"
         android:layout_marginStart="14dp"
-        android:paddingBottom="12dp"
-        android:paddingStart="12dp"
-        android:paddingEnd="12dp"
-        android:paddingTop="12dp"
+        android:paddingBottom="8dp"
+        android:paddingTop="8dp"
         app:layout_constraintTop_toBottomOf="@+id/ll_subject"
         android:id="@+id/ll_time"
         android:orientation="vertical"
@@ -57,6 +56,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
         <TextView
+            android:paddingStart="12dp"
             android:drawablePadding="4dp"
             android:drawableStart="@drawable/icon_vip_course_setting_time_tag"
             android:textSize="@dimen/sp_16"
@@ -67,6 +67,8 @@
 
         <androidx.recyclerview.widget.RecyclerView
             android:scrollbars="none"
+            android:layout_marginEnd="8dp"
+            android:layout_marginStart="8dp"
             android:layout_marginTop="12dp"
             android:id="@+id/recyclerView_time"
             android:overScrollMode="never"
@@ -143,6 +145,7 @@
         android:textSize="@dimen/sp_14"
         android:layout_width="0dp"
         android:paddingTop="12dp"
+        android:lineSpacingMultiplier="1.2"
         android:layout_height="wrap_content"/>
 
     <TextView
@@ -153,6 +156,8 @@
         tools:text="元/节 实际课程收入按学生实际付款金额计算\n您的课程收入将在课程结束"
         android:textColor="@color/color_999999"
         android:textSize="@dimen/sp_14"
+        android:paddingTop="3dp"
+        android:lineSpacingMultiplier="1.2"
         android:layout_width="0dp"
         android:layout_height="wrap_content"/>
     

+ 5 - 6
teacher/src/main/res/layout/item_vip_course_setting_select_layout.xml

@@ -1,11 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_marginStart="4dp"
-    android:layout_marginEnd="4dp"
-    android:layout_marginBottom="12dp"
+    android:padding="4dp"
     xmlns:tools="http://schemas.android.com/tools">
     <TextView
         android:id="@+id/tv_text"
@@ -13,10 +11,11 @@
         android:paddingEnd="8dp"
         android:paddingStart="8dp"
         android:gravity="center"
-        android:minWidth="70dp"
+        android:singleLine="true"
+        android:ellipsize="middle"
         android:background="@drawable/selector_common_filter_item2"
         android:textSize="@dimen/sp_14"
         android:textColor="@color/selector_common_filter_item_text_color2"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="32dp"/>
 </FrameLayout>

+ 4 - 1
teacher/src/main/res/values/strings.xml

@@ -66,5 +66,8 @@
     <string name="video_course_des">视频课是由老师根据教学内容精心录制的课程,购买后永久有效,您可以随时观看学习。</string>
     <string name="create_video_course_text">创建视频课</string>
     <string name="upload_music_sheet_str">上传乐谱</string>
-
+    <string name="vip_setting_str1">扣除应缴税金和平台服务费后\n您的课程预计收入为:单课时</string>
+    <string name="vip_setting_str2">元/节</string>
+    <string name="vip_setting_str3">实际课程收入按学生实际付款金额计算\n您的课程收入将在课程结束</string>
+    <string name="vip_setting_str4">天后结算到您的账户</string>
 </resources>