From 8639283b7850e052b619b07d6cfcdd331a22bb30 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 31 Mar 2023 18:39:38 +0800 Subject: [PATCH] =?UTF-8?q?[dev=5Fopt=5F2.15.0]BadCase=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E7=BB=9F=E8=AE=A1=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 1 + .../badcase/BadCaseAnalyticsManager.kt | 106 ++++++++++++++++++ .../badcase/BadCaseManager.kt | 64 +++++------ .../badcase/biz/InitiativeBadCaseWindow.kt | 39 +++++-- .../badcase/biz/PassiveBadCaseWindow.kt | 24 +++- .../eagle/core/utilcode/util/TimeUtils.java | 12 ++ 6 files changed, 200 insertions(+), 46 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseAnalyticsManager.kt diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 15dffc48c2..0947465d35 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -82,6 +82,7 @@ class DevaToolsProvider : IDevaToolsProvider { moFangManager.init(mContext!!) bindingCarManager.init(mContext!!) apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "") + BadCaseManager.init() } override fun checkMonitorDb() { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseAnalyticsManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseAnalyticsManager.kt new file mode 100644 index 0000000000..4c58c3301f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseAnalyticsManager.kt @@ -0,0 +1,106 @@ +package com.zhjt.mogo_core_function_devatools.badcase + +import com.mogo.commons.utils.MogoAnalyticUtils + +/** + * BadCase埋点统计管理 + */ +object BadCaseAnalyticsManager { + + private val bagRecordReceive = "bagrecord_receive" //收到工控机回调时触发(可忽略是否开启美化模式) + private val bagRecordUpload = "bagrecord_upload"//点击上报按钮触发 + + private val eventParamKey = "key" //Bag包唯一关键字 + private val eventParamFileName = "fileName" //文件路径 + private val eventParamReceiveTime = "receiveTime" //时间 + private val eventParamStat = "stat" //状态record stat:100 - record succeed,auto stop | 101 - record succeed,handle stop | 200 - record failed + private val eventParamPlateNumber = "plateNumber" //车牌号 + private val eventParamTotalDuration = "totalDuration" //Bag包采集时长 + private val eventParamCarSn = "carSn" //鹰眼SN + private val eventParamMapVersion = "mapVersion" //工控机版本 + private val eventParamEyeVersion = "eyeVersion" //鹰眼版本 + private val eventParamLatitude = "latitude" //纬度 + private val eventParamLongitude = "longitude" //经度 + + private val eventParamUserRole = "userRole"//采集者角色 + private val eventParamAudioUrl = "audioUrl" //音频地址 + private val eventParamReason = "reason" //采集原因 + private val eventParamUploadTime = "uploadTime" //上报时间 + private val eventParamChannel = "channel" //渠道 + + /** + * 收到工控机回调时埋点 + * @param key Bag包唯一关键字 + * @param fileName 文件路径 + * @param receiveTime 时间 + * @param stat 状态record + * @param plateNumber 车牌号 + * @param totalDuration Bag包采集时长 + * @param carSn 鹰眼SN + * @param mapVersion 工控机版本 + * @param eyeVersion 鹰眼版本 + * @param latitude 纬度 + * @param longitude 经度 + */ + fun bagRecordReceive(key: String,fileName: String,receiveTime: String,stat: String,plateNumber: String + ,totalDuration: String,carSn: String,mapVersion: String + ,eyeVersion: String,latitude: String,longitude: String){ + val receiverParams = HashMap() + receiverParams[eventParamKey] = key + receiverParams[eventParamFileName] = fileName + receiverParams[eventParamReceiveTime] = receiveTime + receiverParams[eventParamStat] = stat + receiverParams[eventParamPlateNumber] = plateNumber + receiverParams[eventParamTotalDuration] = totalDuration + receiverParams[eventParamCarSn] = carSn + receiverParams[eventParamMapVersion] = mapVersion + receiverParams[eventParamEyeVersion] = eyeVersion + receiverParams[eventParamLatitude] = latitude + receiverParams[eventParamLongitude] = longitude + MogoAnalyticUtils.track(bagRecordReceive,receiverParams) + } + + /** + * 点击上报按钮触发埋点 + * @param key Bag包唯一关键字 + * @param fileName 文件路径 + * @param receiveTime 时间 + * @param stat 状态record + * @param plateNumber 车牌号 + * @param totalDuration Bag包采集时长 + * @param carSn 鹰眼SN + * @param mapVersion 工控机版本 + * @param eyeVersion 鹰眼版本 + * @param latitude 纬度 + * @param longitude 经度 + * @param userRole 采集者角色 + * @param audioUrl 音频地址 + * @param reason 采集原因 + * @param uploadTime 上报时间 + * @param channel 渠道 + */ + fun bagRecordUpload(key: String,fileName: String,receiveTime: String,stat: String,plateNumber: String + ,totalDuration: String,carSn: String,mapVersion: String + ,eyeVersion: String,latitude: String,longitude: String + ,userRole: String,audioUrl: String,reason: String,uploadTime: String,channel: String){ + val uploadParams = HashMap() + uploadParams[eventParamKey] = key + uploadParams[eventParamFileName] = fileName + uploadParams[eventParamReceiveTime] = receiveTime + uploadParams[eventParamStat] = stat + uploadParams[eventParamPlateNumber] = plateNumber + uploadParams[eventParamTotalDuration] = totalDuration + uploadParams[eventParamCarSn] = carSn + uploadParams[eventParamMapVersion] = mapVersion + uploadParams[eventParamEyeVersion] = eyeVersion + uploadParams[eventParamLatitude] = latitude + uploadParams[eventParamLongitude] = longitude + uploadParams[eventParamUserRole] = userRole + uploadParams[eventParamAudioUrl] = audioUrl + uploadParams[eventParamReason] = reason + uploadParams[eventParamUploadTime] = uploadTime + uploadParams[eventParamChannel] = channel + MogoAnalyticUtils.track(bagRecordUpload,uploadParams) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 6bd9988f4c..cedb44ffac 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -11,12 +11,17 @@ import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -35,50 +40,25 @@ import record_cache.RecordPanelOuterClass import java.lang.ref.WeakReference import java.util.concurrent.TimeUnit -internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener { +internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener, + IMoGoChassisLocationWGS84Listener { const val TAG = "BadCase" - /** - * 超过此时间,case入口自动消失 - */ - - private val CASE_EXPIRE_DURATION: Long = - TimeUnit.HOURS.toMillis(4)/* TimeUnit.SECONDS.toMillis(10) */ - private var hideFloat: (() -> Unit)? = null @Volatile private var record: AutoPilotRecord? = null - @Volatile - private var viewHolder: WeakReference? = null + private var longitude: Double = 0.0 + private var latitude: Double?= 0.0 - @Volatile - private var dismissJob: Job? = null - - @OptIn(ExperimentalCoroutinesApi::class) - private var channel: Channel = Channel(Channel.RENDEZVOUS) - get() = if (field.isClosedForReceive || field.isClosedForSend) { - field = Channel(Channel.RENDEZVOUS) - field - } else { - field - } - - private val presenter by lazy { - BadCasePresenter() + fun init(){ + CallerAutopilotRecordListenerManager.addListener(TAG, this) + // 添加 ADAS车辆状态&定位 监听 + CallerChassisLocationWGS84ListenerManager.addListener(TAG, this) } - @Volatile - private var scope: LifecycleCoroutineScope? = null - get() = if (field == null) { - field = viewHolder?.get()?.lifecycleOwner?.lifecycleScope - field - } else { - field - } - /** * 展示BadCase配置页面 */ @@ -120,8 +100,6 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis * 主动采集BadCase */ fun initBadCase(view: View) { - CallerAutopilotRecordListenerManager.addListener(TAG, this) - val activity = view.context as? FragmentActivity ?: throw IllegalStateException("please ensure context is FragmentActivity.") view.setOnClickListener { @@ -268,6 +246,17 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis ) ) ) + //埋点统计 + BadCaseAnalyticsManager.bagRecordReceive(recordPanel.key.toString(),recordPanel.filename, + System.currentTimeMillis().toString(),recordPanel.stat.toString(), + AppConfigInfo.plateNumber,recordPanel.duration.toString(), + MoGoAiCloudClientConfig.getInstance().sn,BadCaseConfig.dockerVersion ?:"", + AppUtils.getAppVersionName(),latitude.toString(),longitude.toString()) + //日志埋点 + CallerLogger.i("$M_DEVA$TAG", "BadCase Receive Analytics="+"key="+recordPanel.key+" filename="+recordPanel.filename+ + " receiveTime="+System.currentTimeMillis()+" stat="+recordPanel.stat+" plateNumber="+AppConfigInfo.plateNumber+ + " totalDuration="+recordPanel.duration+" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+ + " eyeVersion="+AppUtils.getAppVersionName()+" latitude="+latitude+" longitude="+longitude) } } } @@ -277,4 +266,9 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis } + override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { + latitude = gnssInfo.latitude + longitude = gnssInfo.longitude + } + } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt index 469c252887..b9ddf4bf5a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt @@ -35,6 +35,8 @@ import com.zhidao.loglib.call.LogInfoManagerFactory import com.zhidao.loglib.upload.OnUploadListener import com.zhidao.loglib.upload.UploadManager import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager +import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import kotlinx.coroutines.GlobalScope @@ -86,9 +88,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 @Volatile - private var recordKey: String?=null //录制bag包key + private var recordKey: Long = 0 //录制bag包key @Volatile private var recordFileName: String?=null //录制文件包名 + private var receiveTime: String?= null + private var uploadStamp: String = System.currentTimeMillis().toString() private var longitude: Double?=null private var latitude: Double?=null @@ -290,7 +294,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 - itx["key"] = recordKey?:"" //key + itx["key"] = recordKey.toString() //key itx["reason"] = uploadReason.toString() //采集原因 itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) @@ -301,7 +305,6 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList itx["mapVersion"] = BadCaseConfig.dockerVersion ?:"" //工控机版本 itx["eyeVersion"] = AppUtils.getAppVersionName() //鹰眼版本 itx["coordinate"] = "latitude:${latitude};longitude:${longitude}" //坐标 - }) if (uploadResult == null || uploadResult.code != 200) { TipToast.shortTip("上报失败") @@ -312,14 +315,32 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList val hasAudio = downloadUrl != null val descReqEntity = BagDescriptionEntity(uploadReason.toString(),hasAudio,downloadUrl.toString(),true) bagManagerEntity.reqType = 5 - bagManagerEntity.keyReq = it.toLong() + bagManagerEntity.keyReq = it bagManagerEntity.descReq = descReqEntity CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) } + BadCaseAnalyticsManager.bagRecordUpload(recordKey.toString(),recordFileName?:"",uploadStamp, + "100",AppConfigInfo.plateNumber,BadCaseConfig.totalDuration.toString(),MoGoAiCloudClientConfig.getInstance().sn, + BadCaseConfig.dockerVersion ?:"",AppUtils.getAppVersionName(),latitude.toString(),longitude.toString(), + BadCaseConfig.identity,downloadUrl?:"",uploadReason.toString(),System.currentTimeMillis().toString(),"1") + //日志 + CallerLogger.i("$M_DEVA$TAG", "BadCase Initiative Analytics="+"key="+recordKey+" filename="+recordFileName+ + " receiveTime="+uploadStamp+" stat="+"100"+" plateNumber="+AppConfigInfo.plateNumber+ + " totalDuration="+ BadCaseConfig.totalDuration +" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+ + " eyeVersion="+AppUtils.getAppVersionName()+" latitude="+ latitude +" longitude="+ longitude+ + " identity="+BadCaseConfig.identity + " downloadUrl="+downloadUrl +" uploadReason="+uploadReason+ + " uploadTime="+System.currentTimeMillis()+" channel="+"1") BadCaseConfig.windowNum-- clickListener?.closeWindow() } } + //主动上报埋点统计 + if(receiveTime!=null){ + try { + uploadStamp=TimeUtils.dateToStamp(receiveTime,"yyyyMMddHHmmss") + }catch (e: Exception){ + } + } } override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { @@ -356,11 +377,12 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 mWindowManager!!.addView(mFloatLayout, mWindowParams) //开启录包 + recordKey = Random(SystemClock.elapsedRealtime()).nextInt().toLong() if(recordCaseEntity!=null){ - CallerAutoPilotControlManager.recordPackage(recordCaseEntity.caseId,Random(SystemClock.elapsedRealtime()).nextInt(), + CallerAutoPilotControlManager.recordPackage(recordCaseEntity.caseId,recordKey.toInt(), BadCaseConfig.totalDuration, BadCaseConfig.previousDuration,recordCaseEntity.topicList) }else{ - CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,Random(SystemClock.elapsedRealtime()).nextInt(), + CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,recordKey.toInt(), BadCaseConfig.totalDuration, BadCaseConfig.previousDuration) } } @@ -376,8 +398,9 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList mWindowManager!!.addView(mFloatLayout, mWindowParams) //已经录包无需再次启动录包,只要将录包信息同步到弹窗 bagInfoEntity.let { - recordKey = it.key.toString() + recordKey = it.key recordFileName = it.bagPath + receiveTime = it.timestamp } } } @@ -394,7 +417,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel") ThreadUtils.runOnUiThread { if(recordKey==null){ - recordKey = recordPanel.key.toString() + recordKey = recordPanel.key BadCaseConfig.recordKeyList.add(recordPanel.key) } if(recordFileName==null){ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index 446b74c778..bb195a1144 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import mogo.telematics.pad.MessagePad import com.zhidao.loglib.upload.UploadManager +import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.EventBus import java.io.File @@ -69,9 +70,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var uploadReason: String = String() //上报原因,标签 private var recordKey: String?=null //录制bag包key private var recordFileName: String?=null //录制文件包名 + private var receiveTime: String ?= null //接收时间 + private var stat: String = "" private var boxBean: MsgBoxBean ?= null - private var longitude: Double?=null - private var latitude: Double?=null + private var longitude: Double = 0.0 + private var latitude: Double = 0.0 private var mInViewX = 0f private var mInViewY = 0f @@ -250,7 +253,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private fun upload(downloadUrl: String?){ GlobalScope.launch{ val uploadResult = presenter.upload(mutableMapOf().also { itx -> - itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 + itx["carLicense"] = AppConfigInfo.plateNumber //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey?:"" //key @@ -279,10 +282,23 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene bagManagerEntity.descReq = descReqEntity CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) } + //被动上报埋点统计 + BadCaseAnalyticsManager.bagRecordUpload(recordKey?:"",recordFileName?:"",receiveTime?:System.currentTimeMillis().toString(), + stat,AppConfigInfo.plateNumber,BadCaseConfig.totalDuration.toString(),MoGoAiCloudClientConfig.getInstance().sn, + BadCaseConfig.dockerVersion ?:"",AppUtils.getAppVersionName(),latitude.toString(),longitude.toString(), + BadCaseConfig.identity,downloadUrl?:"",uploadReason,System.currentTimeMillis().toString(),"0") + //日志 + CallerLogger.i("$M_DEVA$TAG", "BadCase Passive Analytics="+"key="+recordKey+" filename="+recordFileName+ + " receiveTime="+receiveTime+" stat="+"100"+" plateNumber="+AppConfigInfo.plateNumber+ + " totalDuration="+ BadCaseConfig.totalDuration +" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+ + " eyeVersion="+AppUtils.getAppVersionName()+" latitude="+ latitude +" longitude="+ longitude+ + " identity="+BadCaseConfig.identity + " downloadUrl="+downloadUrl +" uploadReason="+uploadReason+ + " uploadTime="+System.currentTimeMillis()+" channel="+"0") BadCaseConfig.windowNum-- clickListener?.closeWindow() } } + } override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { @@ -378,6 +394,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene val recordBagMsg = (msgBoxBean.bean as RecordBagMsg) recordKey = recordBagMsg.key.toString() recordFileName = recordBagMsg.fileName + receiveTime = msgBoxBean.timestamp.toString() + stat = recordBagMsg.stat.toString() } fun setClickListener(clickListener: ClickListener) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java index 1de99c382e..847aec3748 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java @@ -1626,4 +1626,16 @@ public final class TimeUtils { return sb.toString(); } + /* + * 将时间转换为时间戳 + */ + public static String dateToStamp(String dateString,String pattern) throws ParseException { + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern,Locale.CHINA); + Date date = simpleDateFormat.parse(dateString); + long ts = date.getTime(); + res = String.valueOf(ts); + return res; + } + }