Jelajahi Sumber

考勤打卡 添加根据排版来打卡的功能

fancy 5 tahun lalu
induk
melakukan
042aae323b

+ 5 - 3
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/attendance/main/AttendanceCheckInContract.kt

@@ -4,11 +4,12 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenter
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseView
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseView
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileCheckInJson
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileCheckInJson
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileCheckInWorkplaceInfoJson
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileCheckInWorkplaceInfoJson
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileMyRecords
 
 
 
 
 object AttendanceCheckInContract {
 object AttendanceCheckInContract {
     interface View : BaseView {
     interface View : BaseView {
-
+        fun myRecords(records: MobileMyRecords?)
         fun workplaceList(list: List<MobileCheckInWorkplaceInfoJson>)
         fun workplaceList(list: List<MobileCheckInWorkplaceInfoJson>)
         fun todayCheckInRecord(list: List<MobileCheckInJson>)
         fun todayCheckInRecord(list: List<MobileCheckInJson>)
         fun checkIn(result: Boolean)
         fun checkIn(result: Boolean)
@@ -16,8 +17,9 @@ object AttendanceCheckInContract {
 
 
     interface Presenter : BasePresenter<View> {
     interface Presenter : BasePresenter<View> {
 
 
-        fun findTodayCheckInRecord(cId: String)
+        fun listMyRecords()
+        fun findTodayCheckInRecord(person: String)
         fun loadAllWorkplace()
         fun loadAllWorkplace()
-        fun checkIn(latitude: String, longitude: String, addrStr: String?, signDesc: String, signDate: String, signTime: String, id: String)
+        fun checkIn(latitude: String, longitude: String, addrStr: String?, signDesc: String, signDate: String, signTime: String, id: String, checkType: String?)
     }
     }
 }
 }

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

@@ -4,6 +4,7 @@ import android.os.Handler
 import android.os.Message
 import android.os.Message
 import android.support.v4.content.ContextCompat
 import android.support.v4.content.ContextCompat
 import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.LinearLayoutManager
+import android.text.TextUtils
 import com.baidu.location.BDLocation
 import com.baidu.location.BDLocation
 import com.baidu.location.BDLocationListener
 import com.baidu.location.BDLocationListener
 import com.baidu.location.LocationClient
 import com.baidu.location.LocationClient
@@ -29,8 +30,8 @@ import org.jetbrains.anko.uiThread
 import java.util.*
 import java.util.*
 import com.baidu.mapapi.map.MapStatusUpdateFactory
 import com.baidu.mapapi.map.MapStatusUpdateFactory
 import com.baidu.mapapi.map.MapStatus
 import com.baidu.mapapi.map.MapStatus
-
-
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileFeature
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.attendance.MobileMyRecords
 
 
 
 
 class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInContract.View, AttendanceCheckInContract.Presenter>(),
 class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInContract.View, AttendanceCheckInContract.Presenter>(),
@@ -45,7 +46,17 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
     private val recordAdapter: CommonRecycleViewAdapter<MobileCheckInJson> by lazy {
     private val recordAdapter: CommonRecycleViewAdapter<MobileCheckInJson> by lazy {
         object : CommonRecycleViewAdapter<MobileCheckInJson>(activity, recordList, R.layout.item_attendance_check_in_record_list) {
         object : CommonRecycleViewAdapter<MobileCheckInJson>(activity, recordList, R.layout.item_attendance_check_in_record_list) {
             override fun convert(holder: CommonRecyclerViewHolder?, t: MobileCheckInJson?) {
             override fun convert(holder: CommonRecyclerViewHolder?, t: MobileCheckInJson?) {
-                holder?.setText(R.id.tv_item_attendance_check_in_time, t?.signTime)
+                if (!TextUtils.isEmpty(t?.checkin_type)) {
+                    holder?.setText(R.id.tv_item_attendance_check_in_type, t?.checkin_type)
+                }else {
+                    holder?.setText(R.id.tv_item_attendance_check_in_type, getString(R.string.attendance_check_in_time_label))
+                }
+                var time = if(!TextUtils.isEmpty(t?.signTime) && t?.signTime?.length ?: 0 > 5) {
+                     t?.signTime?.substring(0, 5) ?: ""
+                }else {
+                    ""
+                }
+                holder?.setText(R.id.tv_item_attendance_check_in_time, time)
                         ?.setText(R.id.tv_item_attendance_check_in_location, t?.recordAddress)
                         ?.setText(R.id.tv_item_attendance_check_in_location, t?.recordAddress)
             }
             }
         }
         }
@@ -57,6 +68,7 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
     private var myLocation: BDLocation? = null //当前我的位置
     private var myLocation: BDLocation? = null //当前我的位置
     private var checkInPosition: MobileCheckInWorkplaceInfoJson? = null//离的最近的工作地点位置
     private var checkInPosition: MobileCheckInWorkplaceInfoJson? = null//离的最近的工作地点位置
     private var isInCheckInPositionRange = false
     private var isInCheckInPositionRange = false
+    private var feature : MobileFeature? = null
 
 
 
 
     val handler = Handler { msg ->
     val handler = Handler { msg ->
@@ -105,12 +117,14 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
             tv_attendance_check_in_time.gone()
             tv_attendance_check_in_time.gone()
             val signDate = DateHelper.nowByFormate("yyyy-MM-dd")
             val signDate = DateHelper.nowByFormate("yyyy-MM-dd")
             val signTime = DateHelper.nowByFormate("HH:mm:ss")
             val signTime = DateHelper.nowByFormate("HH:mm:ss")
-            mPresenter.checkIn(myLocation!!.latitude.toString(), myLocation!!.longitude.toString(), myLocation!!.addrStr, "", signDate, signTime, "")
+            mPresenter.checkIn(myLocation!!.latitude.toString(), myLocation!!.longitude.toString(),
+                    myLocation!!.addrStr, "", signDate, signTime, "", this.feature?.checkinType)
         }
         }
     }
     }
 
 
     override fun lazyLoad() {
     override fun lazyLoad() {
         mPresenter.findTodayCheckInRecord(O2SDKManager.instance().distinguishedName)
         mPresenter.findTodayCheckInRecord(O2SDKManager.instance().distinguishedName)
+        mPresenter.listMyRecords()
         mPresenter.loadAllWorkplace()
         mPresenter.loadAllWorkplace()
     }
     }
 
 
@@ -179,6 +193,20 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
         drawCheckInWorkplaceCircle()
         drawCheckInWorkplaceCircle()
     }
     }
 
 
+    override fun myRecords(records: MobileMyRecords?) {
+         if (records != null) {
+             this.feature = records.feature
+             if (this.feature?.signSeq ?: -1 > 0) {
+                 ll_attendance_check_in_button.visible()
+             }else {
+                 ll_attendance_check_in_button.gone()
+             }
+         }else {//兼容老版本 没有这个接口就开放打卡功能
+             this.feature = null
+             ll_attendance_check_in_button.visible()
+         }
+
+    }
 
 
     override fun todayCheckInRecord(list: List<MobileCheckInJson>) {
     override fun todayCheckInRecord(list: List<MobileCheckInJson>) {
         XLog.debug("todayCheckInRecord  size:${list.size}")
         XLog.debug("todayCheckInRecord  size:${list.size}")
@@ -196,6 +224,7 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
             XToast.toastShort(activity, "打卡失败!")
             XToast.toastShort(activity, "打卡失败!")
         }
         }
         mPresenter.findTodayCheckInRecord(O2SDKManager.instance().distinguishedName)
         mPresenter.findTodayCheckInRecord(O2SDKManager.instance().distinguishedName)
+        mPresenter.listMyRecords()
     }
     }
 
 
     /**
     /**
@@ -249,7 +278,7 @@ class AttendanceCheckInFragment : BaseMVPViewPagerFragment<AttendanceCheckInCont
      * 找到最近的打卡地点
      * 找到最近的打卡地点
      */
      */
     private fun calNearestWorkplace() {
     private fun calNearestWorkplace() {
-        if (!workplaceList.isEmpty() && myLocation!=null) {
+        if (workplaceList.isNotEmpty() && myLocation!=null) {
             var minDistance: Double = -1.0
             var minDistance: Double = -1.0
             XLog.debug("calNearestWorkplace...................")
             XLog.debug("calNearestWorkplace...................")
             workplaceList.map {
             workplaceList.map {

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

@@ -19,6 +19,19 @@ import rx.schedulers.Schedulers
 
 
 class AttendanceCheckInPresenter : BasePresenterImpl<AttendanceCheckInContract.View>(), AttendanceCheckInContract.Presenter {
 class AttendanceCheckInPresenter : BasePresenterImpl<AttendanceCheckInContract.View>(), AttendanceCheckInContract.Presenter {
 
 
+    override fun listMyRecords() {
+        getAttendanceAssembleControlService(mView?.getContext())?.let { service ->
+            service.listMyRecords().subscribeOn(Schedulers.io())
+                    .observeOn(AndroidSchedulers.mainThread())
+                    .o2Subscribe {
+                        onNext { mView?.myRecords(it.data) }
+                        onError { e, _ ->
+                            XLog.error("", e)
+                            mView?.myRecords(null)
+                        }
+                    }
+        }
+    }
 
 
     override fun findTodayCheckInRecord(person: String) {
     override fun findTodayCheckInRecord(person: String) {
         val queryBean = MobileCheckInQueryFilterJson()
         val queryBean = MobileCheckInQueryFilterJson()
@@ -64,7 +77,7 @@ class AttendanceCheckInPresenter : BasePresenterImpl<AttendanceCheckInContract.V
         }
         }
     }
     }
 
 
-    override fun checkIn(latitude: String, longitude: String, addrStr: String?, signDesc: String, signDate: String, signTime: String, id: String) {
+    override fun checkIn(latitude: String, longitude: String, addrStr: String?, signDesc: String, signDate: String, signTime: String, id: String, checkType: String?) {
         val form = MobileCheckInJson()
         val form = MobileCheckInJson()
         if (!TextUtils.isEmpty(id)) {
         if (!TextUtils.isEmpty(id)) {
             form.id = id
             form.id = id
@@ -77,6 +90,7 @@ class AttendanceCheckInPresenter : BasePresenterImpl<AttendanceCheckInContract.V
         form.optMachineType = AndroidUtils.getDeviceBrand() + "-" + AndroidUtils.getDeviceModelNumber()
         form.optMachineType = AndroidUtils.getDeviceBrand() + "-" + AndroidUtils.getDeviceModelNumber()
         form.optSystemName = O2.DEVICE_TYPE
         form.optSystemName = O2.DEVICE_TYPE
         form.recordAddress = addrStr ?: ""
         form.recordAddress = addrStr ?: ""
+        form.checkin_type = checkType
         val json = O2SDKManager.instance().gson.toJson(form)
         val json = O2SDKManager.instance().gson.toJson(form)
         val body = RequestBody.create(MediaType.parse("text/json"), json)
         val body = RequestBody.create(MediaType.parse("text/json"), json)
         getAttendanceAssembleControlService(mView?.getContext())?.let { service ->
         getAttendanceAssembleControlService(mView?.getContext())?.let { service ->

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

@@ -64,7 +64,8 @@
         android:layout_marginEnd="@dimen/spacing_small"
         android:layout_marginEnd="@dimen/spacing_small"
         android:background="@drawable/attendance_check_in_background"
         android:background="@drawable/attendance_check_in_background"
         android:gravity="center"
         android:gravity="center"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        android:visibility="gone">
 
 
         <TextView
         <TextView
             android:id="@+id/tv_attendance_check_in_button_label"
             android:id="@+id/tv_attendance_check_in_button_label"

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

@@ -27,6 +27,7 @@
             android:orientation="horizontal">
             android:orientation="horizontal">
 
 
             <TextView
             <TextView
+                android:id="@+id/tv_item_attendance_check_in_type"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/attendance_check_in_time_label"
                 android:text="@string/attendance_check_in_time_label"
@@ -37,6 +38,7 @@
                 android:id="@+id/tv_item_attendance_check_in_time"
                 android:id="@+id/tv_item_attendance_check_in_time"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_tiny"
                 android:textColor="@color/z_color_text_primary"
                 android:textColor="@color/z_color_text_primary"
                 android:textSize="@dimen/font_large"
                 android:textSize="@dimen/font_large"
                 tools:text="12:09:00"/>
                 tools:text="12:09:00"/>

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

@@ -162,4 +162,11 @@ interface AttendanceAssembleControlService {
      */
      */
     @GET("jaxrs/attendanceadmin/list/all")
     @GET("jaxrs/attendanceadmin/list/all")
     fun attendanceAdmin(): Observable<ApiResponse<List<AdministratorInfoJson>>>
     fun attendanceAdmin(): Observable<ApiResponse<List<AdministratorInfoJson>>>
+
+    /**
+     *
+     * @return
+     */
+    @GET("jaxrs/attendancedetail/mobile/my")
+    fun listMyRecords(): Observable<ApiResponse<MobileMyRecords>>
 }
 }

+ 51 - 1
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/attendance/AttendanceJSON.kt

@@ -191,7 +191,57 @@ data class MobileCheckInJson(
         var latitude: String = "", //纬度, 可以为空.
         var latitude: String = "", //纬度, 可以为空.
         var optMachineType: String = "", //操作设备类别:手机品牌|PAD|PC|其他, 可以为空.
         var optMachineType: String = "", //操作设备类别:手机品牌|PAD|PC|其他, 可以为空.
         var optSystemName: String = O2.DEVICE_TYPE, //操作设备类别:Mac|Windows|IOS|Android|其他, 可以为空.
         var optSystemName: String = O2.DEVICE_TYPE, //操作设备类别:Mac|Windows|IOS|Android|其他, 可以为空.
-        var recordStatus: Int = 0//记录状态:0-未分析 1-已分析
+        var recordStatus: Int = 0, //记录状态:0-未分析 1-已分析
+//        "checkin_type": "上午上班打卡",
+////        "checkin_time": 1591166591469,
+        var checkin_type: String? = ""
+)
+/**
+ * 班次设置情况
+ * "id": "0859ffe7-e85a-4c1a-91ac-2697069fba42",
+"topUnitName": "浙江兰德纵横网络技术股份有限公司@1@U",
+"unitName": "应用支撑组@319131979@U",
+"unitOu": "应用支撑组@319131979@U",
+"onDutyTime": "09:00",
+"offDutyTime": "17:00",
+"signProxy": 0,
+"lateStartTime": "9:05",
+"createTime": "2020-06-03 14:02:20",
+"updateTime": "2020-06-03 14:02:20"
+ */
+data class MobileScheduleSetting(
+        var id: String = "",
+        var createTime: String = "",
+        var updateTime: String = "",
+        var topUnitName: String = "",
+        var unitName: String = "",
+        var unitOu: String = "",
+        var onDutyTime: String = "",
+        var offDutyTime: String = "",
+        var signProxy: Int = 0, // 打卡策略:1-两次打卡(上午上班,下午下班) 2-三次打卡(上午上班,下午下班加中午一次共三次) 3-四次打卡(上午下午都打上班下班卡)
+        var lateStartTime: String = ""
+)
+/**
+ * 移动端打卡功能
+ *  "signSeq": -1,
+"signDate": "2020-06-03",
+"signTime": "17:00",
+"checkinType": "下午下班打卡"
+ */
+data class MobileFeature(
+        var signSeq: Int = -1, //当天第几次打卡 -1不能打了
+        var signDate: String = "",
+        var signTime: String = "",
+        var checkinType: String = ""
+)
+
+/**
+ * listMyRecords 返回对象
+ */
+data class MobileMyRecords(
+        var records:List<MobileCheckInJson> = ArrayList(),
+        var scheduleSetting: MobileScheduleSetting?,
+        var feature : MobileFeature?
 )
 )
 
 
 /**
 /**