Просмотр исходного кода

Merge branch 'fix/android_ai_update' into 'develop'

更新语音助手功能

See merge request o2oa/o2oa!1617
楼国栋 5 лет назад
Родитель
Сommit
e5935d7f93

+ 1 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/attendance/main/AttendanceCheckInFragment.kt

@@ -255,7 +255,7 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
     private fun drawCheckInWorkplaceCircle() {
         if (myLocation != null) {
             calNearestWorkplace()
-            if (checkInPosition != null) {
+            if (checkInPosition != null && activity != null) {
                 val llCircle = LatLng(checkInPosition!!.latitude.toDouble(), checkInPosition!!.longitude.toDouble())
                 val ooCircle = CircleOptions()
                         .center(llCircle)

+ 4 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/ai/O2AIActivity.kt

@@ -137,6 +137,7 @@ class O2AIActivity : AppCompatActivity(), O2AIContract.View {
         tv_o2_ai_voice_transaction.text = message
         circle_ripple.stop()
         stopRecord()
+        tv_o2_ai_tips.text = ""//清除提示
         synthesizer?.speak(message, id)
     }
 
@@ -145,7 +146,9 @@ class O2AIActivity : AppCompatActivity(), O2AIContract.View {
         finish()
     }
 
-
+    override fun showTips(message: String) {
+        tv_o2_ai_tips.text = message
+    }
 
     private fun startRecord() {
         XLog.info("start Record.......................")

+ 1 - 0
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/ai/O2AIContract.kt

@@ -17,6 +17,7 @@ object O2AIContract {
          */
         fun speak(message:String, id:String)
         fun finishAI()
+        fun showTips(message: String)
     }
     interface Presenter: BasePresenter<View>{
 

+ 37 - 11
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/ai/O2AIPresenter.kt

@@ -13,6 +13,7 @@ import okhttp3.RequestBody
 import rx.android.schedulers.AndroidSchedulers
 import rx.schedulers.Schedulers
 import java.util.*
+import kotlin.collections.ArrayList
 
 /**
  * Created by fancyLou on 15/05/2018.
@@ -63,6 +64,7 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
 
         if (utteranceId.startsWith(next_key_listen_command)) {
             mView?.beginListen()
+            showTips()
         } else {
             when(status){
                 STATUS_TOP->{
@@ -92,6 +94,7 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
         }
         if (utteranceId.startsWith(next_key_listen_command)) {
             mView?.beginListen()
+            showTips()
         } else {
             XLog.info("logic is not over , keep speaking.....")
         }
@@ -106,6 +109,24 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
         currentTaskList.clear()
     }
 
+    private fun showTips() {
+        when(status) {
+            STATUS_TOP -> {
+                mView?.showTips("可以使用如下命令:${loadTaskCommand()?.joinToString{it}} , ${loadStopCommand()?.joinToString { it }}")
+            }
+            STATUS_TASK -> {
+                if (currentTaskList.isNotEmpty()) {
+                    val task = currentTaskList[currentTaskIndex]
+                    val routeList = task.routeNameList.joinToString(separator = "或" )
+                    val ignore = loadIgnoreCommand()?.joinToString { it }
+                    val neural = loadTaskNeuralCommand()?.joinToString { it }
+                    mView?.showTips("可以使用如下命令:$routeList, $ignore, $neural")
+                }else {
+                    mView?.showTips("可以使用如下命令:${loadStopCommand()?.joinToString { it }}")
+                }
+            }
+        }
+    }
 
 
     private fun logicTop(result: String) {
@@ -289,17 +310,19 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
                     .o2Subscribe {
                         onNext { response->
                             val data = response.data
-                            if (data!=null && data.isNotEmpty()) {
+                            val properties = data.properties
+                            if (properties != null) {
                                 var text = ""
                                 val fromActivityName = ArrayList<String>()
+                                if (properties.nextManualList.isNotEmpty()) {
+                                    properties.nextManualList.map {
+                                        fromActivityName.add(it.activityName)
+                                    }
+                                }
                                 val people = ArrayList<String>()
-                                data.map {
-                                    fromActivityName.add(it.fromActivityName)
-                                    val tasklist = it.taskList
-                                    if (tasklist!=null && tasklist.isNotEmpty()){
-                                        tasklist.map {
-                                            people.add(it.person.split("@")[0])
-                                        }
+                                if (properties.nextManualTaskIdentityList.isNotEmpty()) {
+                                    properties.nextManualTaskIdentityList.map {
+                                        people.add(it.substring(0, it.indexOf("@")))
                                     }
                                 }
                                 if (fromActivityName.isNotEmpty()){
@@ -354,9 +377,9 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
     private fun isInIgnoreCommand(result: String): Boolean =
             (loadIgnoreCommand()?.any { result.trim() == it } == true)
 
-    private fun isInTaskCommand(result: String): Boolean =
-            (loadTaskCommand()?.any { result.trim() == it } == true)
-
+    private fun isInTaskCommand(result: String): Boolean  {
+        return (loadTaskCommand()?.any { result.trim() == it } == true) || (loadTaskMistakeCommand()?.any{result.trim() == it} == true)
+    }
     private fun isInTaskNeuralCommand(result: String): Boolean =
             (loadTaskNeuralCommand()?.any { it == result.trim() } == true)
 
@@ -373,6 +396,9 @@ class O2AIPresenter : BasePresenterImpl<O2AIContract.View>(), O2AIContract.Prese
     private fun loadTaskCommand(): Array<String>? =
             mView?.getContext()?.resources?.getStringArray(R.array.ai_command_task)
 
+    private fun loadTaskMistakeCommand(): Array<String>? =
+            mView?.getContext()?.resources?.getStringArray(R.array.ai_command_task_mistake)
+
     private fun loadTaskNeuralCommand(): Array<String>? =
             mView?.getContext()?.resources?.getStringArray(R.array.ai_command_task_neural)
 

+ 2 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/webview/TaskWebViewPresenter.kt

@@ -13,6 +13,7 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.main.AttachmentInfo
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2.ReadData
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2.TaskData
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2.WorkLog
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2.WorkPostResult
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.*
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.o2Subscribe
 import okhttp3.MediaType
@@ -93,7 +94,7 @@ class TaskWebViewPresenter : BasePresenterImpl<TaskWebViewContract.View>(), Task
                         service.postTask(taskBody, data.id)
                     }
                     .observeOn(AndroidSchedulers.mainThread())
-                    .subscribe(ResponseHandler<List<WorkLog>> { list -> mView?.submitSuccess() },
+                    .subscribe(ResponseHandler<WorkPostResult> { _ -> mView?.submitSuccess() },
                             ExceptionHandler(mView?.getContext()) { e ->
                                 XLog.error("", e)
                                 mView?.finishLoading() })

+ 2 - 2
o2android/app/src/main/res/layout/activity_attendance_main.xml

@@ -14,7 +14,7 @@
         android:id="@+id/view_pager_attendance_main_content"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1"></androidx.viewpager.widget.ViewPager>
+        android:layout_weight="1" />
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -24,7 +24,7 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="1px"
-            android:background="@color/z_color_split_line"></LinearLayout>
+            android:background="@color/z_color_split_line" />
 
         <LinearLayout
             android:layout_width="match_parent"

+ 7 - 96
o2android/app/src/main/res/layout/activity_o2_ai.xml

@@ -40,111 +40,22 @@
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent" />
 
-    <TextView
-        android:id="@+id/tv_o2_ai_top"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="24dp"
-        android:text="您可以使用类似如下命令:"
-        android:textColor="@android:color/white"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="1.0"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
 
     <TextView
-        android:layout_width="wrap_content"
+        android:id="@+id/tv_o2_ai_tips"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="今天杭州的天气怎么样?"
+        tools:text="您可以使用类似如下命令:"
         android:textColor="@android:color/white"
         android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
         android:layout_marginTop="24dp"
-        android:text="查看我的工作"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="40dp"
-        android:text="我的待办"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="56dp"
-        android:text="退出工作"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="72dp"
-        android:text="讲个笑话"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
+        android:layout_marginEnd="@dimen/spacing_small"
+        app:layout_constraintHorizontal_bias="1.0"
+        app:layout_constraintWidth_max="160dp"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
+        app:layout_constraintTop_toTopOf="parent"  />
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="88dp"
-        android:text="关闭"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="104dp"
-        android:text="退出"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="120dp"
-        android:text="......"
-        android:textColor="@android:color/white"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.9"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_o2_ai_top" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 13 - 3
o2android/app/src/main/res/values/strings.xml

@@ -605,14 +605,16 @@
         <item>下一个</item>
         <item>继续下一个工作</item>
         <item>继续</item>
+        <item>下一个工作</item>
+        <item>不处理</item>
+        <item>忽略</item>
     </string-array>
     <string-array name="ai_command_task">
-        <item>TASK</item>
-        <item>WORK</item>
         <item>待办</item>
         <item>工作</item>
         <item>我的待办</item>
         <item>我的工作</item>
+        <item>查找工作</item>
         <item>查看我的工作</item>
         <item>查看我的待办</item>
         <item>查看一下我的待办</item>
@@ -622,8 +624,16 @@
         <item>处理工作</item>
         <item>处理待办</item>
     </string-array>
+    <string-array name="ai_command_task_mistake">
+        <item>代办</item>
+        <item>我的代办</item>
+        <item>查看我的代办</item>
+        <item>查看一下我的代办</item>
+        <item>查一下我的代办</item>
+        <item>处理代办</item>
+    </string-array>
+
     <string-array name="ai_command_task_neural">
-        <item>NEURAL</item>
         <item>你来处理</item>
         <item>你帮我处理</item>
         <item>你看着办</item>

+ 1 - 1
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/api/service/ProcessAssembleSurfaceService.kt

@@ -236,7 +236,7 @@ interface ProcessAssembleSurfaceService {
      */
     @Headers("Content-Type:application/json;charset=UTF-8")
     @POST("jaxrs/task/{taskId}/processing")
-    fun postTask(@Body taskBody: RequestBody, @Path("taskId") taskId: String): Observable<ApiResponse<List<WorkLog>>>
+    fun postTask(@Body taskBody: RequestBody, @Path("taskId") taskId: String): Observable<ApiResponse<WorkPostResult>>
 
 
     /**

+ 88 - 0
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/o2/WorkPostResult.kt

@@ -0,0 +1,88 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2
+
+/**
+ * Created by fancyLou on 2020-09-01.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+//"id": "4cf5707e-286f-4dfe-9aa9-58dfa1b7068b",
+//        "application": "687f8355-fb91-4605-857f-c03e2ede716b",
+//        "process": "a2aab7b4-812e-42b2-84ca-2230bf9242cf",
+//        "job": "caf280c4-8048-4c99-90dc-0e9fdd41638f",
+//        "work": "def24592-cd14-4083-8093-4bd8979dc576",
+//        "completed": false,
+//        "display": true,
+//        "order": 1598944402840,
+//        "properties": {
+//            "nextManualList": [
+//                {
+//                    "activity": "5cae04d5-14de-4ea5-ba1e-5e4a7e0b3a27",
+//                    "activityType": "manual",
+//                    "activityName": "核稿",
+//                    "activityAlias": "",
+//                    "activityToken": "2f10ea31-9a9d-467d-96d8-f72b25e8ba0d",
+//                    "taskIdentityList": [
+//                        "楼国栋@b8684062-d6ee-4740-9f2c-d660cda49ca8@I"
+//                    ]
+//                }
+//            ],
+//            "nextManualTaskIdentityList": [
+//                "楼国栋@b8684062-d6ee-4740-9f2c-d660cda49ca8@I"
+//            ],
+//            "routeName": "送核稿",
+//            "opinion": "哈哈😄",
+//            "mediaOpinion": "",
+//            "startTime": "2020-08-27 16:01:39",
+//            "elapsed": 1211,
+//            "fromGroup": "",
+//            "fromOpinionGroup": ""
+//        },
+//        "fromActivity": "02e23421-c048-4582-a04f-47451128e200",
+//        "fromActivityType": "manual",
+//        "fromActivityName": "拟稿",
+//        "fromActivityAlias": "",
+//        "fromActivityToken": "005a38b4-3e1f-46a2-9f53-4769ed0f4487",
+//        "recordTime": "2020-09-01 15:13:22",
+//        "person": "楼国栋@237@P",
+//        "identity": "楼国栋@b8684062-d6ee-4740-9f2c-d660cda49ca8@I",
+//        "unit": "移动开发组@320494093@U",
+//        "type": "task"
+
+data class WorkPostResult(
+    var id: String = "",
+    var application: String = "",
+    var process: String = "",
+    var job: String = "",
+    var work: String = "",
+    var completed: Boolean = false,
+    var fromActivity: String = "",
+    var fromActivityType: String = "",
+    var fromActivityName: String = "",
+    var fromActivityAlias: String = "",
+    var fromActivityToken: String = "",
+    var recordTime: String = "",
+    var person: String = "",
+    var identity: String = "",
+    var unit: String = "",
+    var type: String = "",
+    var properties: WorkProperties? = null
+)
+
+
+data class WorkProperties(
+        var nextManualTaskIdentityList: ArrayList<String> = ArrayList(),
+        var routeName: String = "",
+        var opinion: String = "",
+        var mediaOpinion: String = "",
+        var fromGroup: String = "",
+        var fromOpinionGroup: String = "",
+        var nextManualList: ArrayList<WorkManual> = ArrayList()
+)
+
+data class WorkManual(
+        var activity: String = "",
+        var activityType: String = "",
+        var activityName: String = "",
+        var activityAlias: String = "",
+        var activityToken: String = "",
+        var taskIdentityList: ArrayList<String> = ArrayList()
+)