Commit dbb1f52deb0bffb5d6b85123e68d0c1fff2e6f50

Authored by shixianjie
1 parent 8f79866a79
Exists in master

录入作业

app/src/main/java/com/hjx/parent/ImageActivity.java
... ... @@ -347,10 +347,16 @@ public class ImageActivity extends BaseRxActivity<ActivityImageBinding> implemen
347 347 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans);
348 348 dialog.show();
349 349 } else {
  350 + List<String> paths = new ArrayList<>();
  351 + for (TopicBean it: topicBeans) {
  352 + paths.add(it.getPath());
  353 + }
350 354 if (addHomeworkDialog == null) {
351 355 addHomeworkDialog = new AddHomeworkDialog(this);
352 356 }
353   - addHomeworkDialog.show();
  357 + addHomeworkDialog.show(paths, () -> {
  358 + // TODO
  359 + });
354 360 }
355 361 }
356 362  
... ...
app/src/main/java/com/hjx/parent/dialog/AddHomeworkDialog.java
... ... @@ -2,39 +2,47 @@ package com.hjx.parent.dialog;
2 2  
3 3 import android.annotation.SuppressLint;
4 4 import android.content.Context;
  5 +import android.util.Pair;
5 6 import android.view.View;
6 7 import android.widget.AdapterView;
7 8 import android.widget.ArrayAdapter;
  9 +import android.widget.Toast;
8 10  
9 11 import androidx.annotation.NonNull;
10 12  
11 13 import com.bigkoo.pickerview.builder.TimePickerBuilder;
12   -import com.bigkoo.pickerview.listener.OnTimeSelectListener;
13   -import com.bigkoo.pickerview.view.TimePickerView;
14 14 import com.google.gson.Gson;
15 15 import com.hjx.parent.R;
16 16 import com.hjx.parent.bean.StudentBean;
17 17 import com.hjx.parent.databinding.DialogAddHomeworkBinding;
18   -import com.hjx.parent.rx.ILifecycleActivity;
  18 +import com.hjx.parent.function.Function0;
  19 +import com.hjx.parent.rx.BaseRxActivity;
19 20 import com.prws.common.bean.GradeAndSubject;
20 21 import com.prws.common.bean.ResponseResult;
21 22 import com.prws.common.bean.Student;
22 23 import com.prws.common.bean.Subject;
  24 +import com.prws.common.bean.baidu.BaiduInput;
23 25 import com.prws.common.net.NetWorks;
24 26 import com.prws.common.utils.SharedPreferencesUtil;
25 27 import com.trello.rxlifecycle2.android.RxLifecycleAndroid;
26 28  
  29 +import java.io.File;
27 30 import java.text.SimpleDateFormat;
28 31 import java.util.ArrayList;
29 32 import java.util.Date;
  33 +import java.util.HashMap;
30 34 import java.util.List;
31 35 import java.util.Locale;
  36 +import java.util.Map;
32 37  
  38 +import io.reactivex.Observable;
33 39 import io.reactivex.android.schedulers.AndroidSchedulers;
34 40 import io.reactivex.schedulers.Schedulers;
35 41  
36 42 public class AddHomeworkDialog extends BaseDialog<DialogAddHomeworkBinding>{
37   - private final ILifecycleActivity activity;
  43 + private final BaseRxActivity<?> activity;
  44 +
  45 + private Function0 callback;
38 46  
39 47 String stuId;
40 48  
... ... @@ -42,17 +50,25 @@ public class AddHomeworkDialog extends BaseDialog&lt;DialogAddHomeworkBinding&gt;{
42 50 List<Student> studentList;
43 51 List<GradeAndSubject> gradeAndSubjectList;
44 52  
  53 + List<String> images;
  54 +
45 55 Student student;
46 56 String grade;
47 57 String term;
48 58 String subject;
49 59 Date uploadTime = new Date();
50 60  
51   - public AddHomeworkDialog(ILifecycleActivity context) {
  61 + public AddHomeworkDialog(BaseRxActivity<?> context) {
52 62 super((Context) context);
53 63 activity = context;
54 64 }
55 65  
  66 + public void show(List<String> paths, Function0 callback) {
  67 + images = paths;
  68 + this.callback = callback;
  69 + super.show();
  70 + }
  71 +
56 72 @SuppressLint("SetTextI18n")
57 73 @Override
58 74 public void initView() {
... ... @@ -107,6 +123,15 @@ public class AddHomeworkDialog extends BaseDialog&lt;DialogAddHomeworkBinding&gt;{
107 123 }).setType(new boolean[]{true, true, true, false, false, false}).isDialog(true).build().show();
108 124 });
109 125  
  126 + binding.btnConfirm.setOnClickListener(v -> {
  127 + String name = binding.etName.getText().toString().trim();
  128 + if (name.isEmpty()) {
  129 + Toast.makeText(getContext(), "请输入作业名称", Toast.LENGTH_SHORT).show();
  130 + return;
  131 + }
  132 + uploadImage(name);
  133 + });
  134 +
110 135 getGrade();
111 136 }
112 137  
... ... @@ -183,6 +208,73 @@ public class AddHomeworkDialog extends BaseDialog&lt;DialogAddHomeworkBinding&gt;{
183 208 binding.spSubject.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_spinner, subjects));
184 209 }
185 210  
  211 + @SuppressLint("CheckResult")
  212 + public void uploadImage(String name) {
  213 + activity.showLoadingDialog("上传作业中...");
  214 + Observable.fromIterable(images)
  215 + .map(path -> {
  216 + int index = images.indexOf(path);
  217 + return new Pair<>(index, path);
  218 + })
  219 + .subscribeOn(Schedulers.io())
  220 + .flatMap(pair -> {
  221 + int index = pair.first;
  222 + String path = pair.second;
  223 + File file = new File(path);
  224 + String id = file.getName().substring(0, file.getName().lastIndexOf("."));
  225 + return Observable.just(file)
  226 + .map(var -> {
  227 + BaiduInput baiduInput = NetWorks.inputImage(path, id).blockingGet();
  228 + if (baiduInput.getError_code() != null) {
  229 + throw new RuntimeException("图片入库失败");
  230 + } else {
  231 + return baiduInput;
  232 + }
  233 + })
  234 + .map(var -> NetWorks.uploadImage(path, id).blockingGet())
  235 + .map(var -> {
  236 + Map<String, Object> map = new HashMap<>();
  237 + map.put("brief", id);
  238 + map.put("sort", index);
  239 + return map;
  240 + });
  241 + }, 2)
  242 + .toList()
  243 + .map(list -> {
  244 + List<String> stuIds = new ArrayList<>();
  245 + stuIds.add(student.stuId);
  246 + String userId = NetWorks.getUserId();
  247 +
  248 + Map<String, Object> map = new HashMap<>();
  249 + map.put("name", name);
  250 + map.put("grade", grade);
  251 + map.put("term", term);
  252 + map.put("subject", subject);
  253 + map.put("userId", userId);
  254 + map.put("stuIds", stuIds);
  255 + map.put("briefList", list);
  256 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
  257 + map.put("uploadTime", format.format(uploadTime));
  258 + return map;
  259 + })
  260 + .flatMap(body -> {
  261 + return NetWorks.service_url.uploadHomework(NetWorks.getHeader(), body);
  262 + })
  263 + .observeOn(AndroidSchedulers.mainThread())
  264 + .compose(RxLifecycleAndroid.bindActivity(activity.getRxLifecycle()))
  265 + .subscribe((response, th) -> {
  266 + if (th != null) th.printStackTrace();
  267 + if (response != null && response.getSuccess()) {
  268 + activity.cancelLoadingDialog();
  269 + dismiss();
  270 + if (callback != null) callback.invoke();
  271 + } else {
  272 + activity.loadFail("上传作业失败");
  273 + }
  274 + })
  275 + ;
  276 + }
  277 +
186 278 @NonNull
187 279 @Override
188 280 public DialogAddHomeworkBinding getBinding() {
... ...
app/src/main/res/layout/dialog_add_homework.xml
... ... @@ -165,12 +165,13 @@
165 165 android:maxLength="50"
166 166 android:paddingHorizontal="16dp"
167 167 android:textColor="@color/text_title"
168   - android:textSize="18sp"
  168 + android:textSize="13sp"
169 169 android:inputType="text"
170 170 tools:ignore="Autofill,LabelFor" />
171 171  
172 172 <Space style="@style/empty_space"/>
173 173 <TextView
  174 + android:id="@+id/btnConfirm"
174 175 android:text="确认录入"
175 176 android:gravity="center"
176 177 android:textSize="16sp"
... ...
libs/common/build.gradle
... ... @@ -19,6 +19,8 @@ android {
19 19  
20 20 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
21 21  
  22 + buildConfigField("String", "APIKey1", "\"eCa3YzEjTBBiNjlXcNnjnldP\"")
  23 + buildConfigField("String", "SecretKey1", "\"KnZPmjF0ZzmxWV964mzmm6yuDljnETLt\"")
22 24 }
23 25  
24 26 buildTypes {
... ...
libs/common/src/main/java/com/prws/common/bean/baidu/BaiduInput.java
... ... @@ -0,0 +1,57 @@
  1 +package com.prws.common.bean.baidu;
  2 +
  3 +public class BaiduInput {
  4 + String brief;
  5 + String error_code;
  6 + String cont_sign;
  7 + String log_id;
  8 +
  9 + public void setBrief(String brief) {
  10 + this.brief = brief;
  11 + }
  12 +
  13 + public void setError_code(String error_code) {
  14 + this.error_code = error_code;
  15 + }
  16 +
  17 + public void setCont_sign(String cont_sign) {
  18 + this.cont_sign = cont_sign;
  19 + }
  20 +
  21 + public void setLog_id(String log_id) {
  22 + this.log_id = log_id;
  23 + }
  24 +
  25 + public String getBrief() {
  26 + return brief;
  27 + }
  28 +
  29 + public String getError_code() {
  30 + return error_code;
  31 + }
  32 +
  33 + public String getCont_sign() {
  34 + return cont_sign;
  35 + }
  36 +
  37 + public String getLog_id() {
  38 + return log_id;
  39 + }
  40 +
  41 + public class Brief {
  42 + String name;
  43 + String id;
  44 +
  45 + public void setName(String name) {
  46 + this.name = name;
  47 + }
  48 +
  49 + public String getName() {
  50 + return name;
  51 + }
  52 +
  53 + public String getId() {
  54 + return id;
  55 + }
  56 + }
  57 +}
... ...
libs/common/src/main/java/com/prws/common/net/NetWorks.java
... ... @@ -13,7 +13,9 @@ import com.prws.common.bean.Student;
13 13 import com.prws.common.bean.Teacher;
14 14 import com.prws.common.bean.TopicBean;
15 15 import com.prws.common.bean.UpdateBean;
  16 +import com.prws.common.bean.baidu.BaiduInput;
16 17 import com.prws.common.bean.homework.HomeworkList;
  18 +import com.prws.common.utils.BitmapUtils;
17 19 import com.prws.common.utils.SharedPreferencesUtil;
18 20  
19 21 import java.io.File;
... ... @@ -180,6 +182,16 @@ public class NetWorks extends RetrofitUtils {
180 182 @GET("api/v1/homework/listHomeworkByStuId")
181 183 Single<ResponseResult<List<HomeworkList>>> getStudentHomework(@Header("Authorization") String token, @Query("stuId") String stuId);
182 184  
  185 + @POST
  186 + Single<BaiduInput> inputImage(@Url String url, @Body RequestBody body);
  187 +
  188 + @Multipart
  189 + @POST("api/v1/homework/uploadHomework")
  190 + Single<ResponseResult> uploadImage(@Header("Authorization") String token, @Part() MultipartBody.Part file, @Query("brief") String id);
  191 +
  192 + @POST("api/v1/homework/uploadHomeworkAction")
  193 + Single<ResponseResult> uploadHomework(@Header("Authorization") String token, @Body Object map);
  194 +
183 195 }
184 196  
185 197 public static String getUserId() {
... ... @@ -194,6 +206,24 @@ public class NetWorks extends RetrofitUtils {
194 206 return (String) SharedPreferencesUtil.getData("baiduToken", "");
195 207 }
196 208  
  209 + public static Single<BaiduInput> inputImage(String filePath, String id) {
  210 + MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
  211 + String base64 = BitmapUtils.fileToBase64(filePath);
  212 + File file = new File(filePath);
  213 + RequestBody body = RequestBody.create(mediaType, "image=" + base64 + "&brief={\"name\":\"" + file.getName() + "\", \"id\":\"" + id + "\"}");
  214 + return getBaiduTokenOcr().map(jsonObject -> jsonObject.get("access_token").getAsString())
  215 + .flatMap(token -> {
  216 + return service_url.inputImage("https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/add?access_token=" + token, body);
  217 + });
  218 + }
  219 +
  220 + public static Single<ResponseResult> uploadImage(String path, String id) {
  221 + File file = new File(path);
  222 + RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file);
  223 + MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
  224 + return service_url.uploadImage(getHeader(), part, id);
  225 + }
  226 +
197 227  
198 228 public static void checkUpdate(int code, String packageName, Callback<ResponseResult<UpdateBean>> callback) {
199 229 service_url.checkUpdate(code, packageName, 0).enqueue(callback);
... ... @@ -231,6 +261,10 @@ public class NetWorks extends RetrofitUtils {
231 261 setSubscribe(service_url.getBaiduToken("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + BuildConfig.APIKey + "&client_secret=" + BuildConfig.SecretKey), observer);
232 262 }
233 263  
  264 + public static Single<JsonObject> getBaiduTokenOcr() {
  265 + return service_url.getBaiduToken("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + BuildConfig.APIKey1 + "&client_secret=" + BuildConfig.SecretKey1).firstOrError();
  266 + }
  267 +
234 268 public static void removeWriting(String base64, Observer<JsonObject> observer) {
235 269 MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
236 270 RequestBody body = RequestBody.create(mediaType, "image=" + base64);
... ...