diff --git a/app.db b/app.db index 782e2f3..068ea14 100644 Binary files a/app.db and b/app.db differ diff --git a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java index f030696..a69dbd5 100644 --- a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java +++ b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java @@ -8,15 +8,10 @@ public enum ExtApiTabConfig { AppTubeSettingMgrService("应用控制.试管(样本)配置", true),//OK EmergencySamplePosStateMgrService("应用控制.急诊位状态管理", true),//OK - ConsumablesMgrService("应用状态.耗材状态管理", true), - IncubationPlateMgrService("应用状态.孵育板管理", true),//OK - AppUserMgrService("应用数据.用户管理", true), //Ok AppSettingsMgr("应用数据.设备配置管理", true), //OK - AppProjInfoMgrService("应用数据.项目信息管理", true), //OK + AppProjInfoMgrService("应用数据.项目与ID卡管理", true), //OK AppReactionResultMgrService("应用数据.反应结果管理", true), //OK - AppSampleMgrService("应用数据.样本管理", true), //OK - ActionReactorService("底层调试.单步调试", false),//OK Hbot2DCodeScanPos("参数.Hbot二维码扫描坐标参数", false), diff --git a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java index 20c805b..bc843da 100644 --- a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java +++ b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java @@ -63,6 +63,7 @@ public enum A8kEcode { ProjIndexIsEmpty(144),//项目ID为空 CanNotFindProjInfo(145),//找不到项目信息 ProjInfoIsNotExist(146),//项目信息不存在 + ACTION_IS_NOT_ALLOWED_WHEN_WORKING(147),//设备忙 /** * 特殊服务错误码 diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index f6e254a..26bce1c 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -4,12 +4,15 @@ import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; -import a8k.service.app.appstate.type.MainFlowCtrlState; -import a8k.service.app.appstate.type.TubeHolder; +import a8k.service.app.appstate.ConsumablesMgrService; +import a8k.service.app.appstate.type.*; +import a8k.service.app.appstate.type.state.OptScanModuleState; import a8k.service.debug.AppDebugHelperService; +import a8k.type.Consumable; import a8k.type.ConsumableGroup; import a8k.type.checkpoint.CheckResult; import a8k.service.app.appstate.GStateService; +import a8k.type.consumables.ConsumableState; import a8k.type.exception.AppException; import freemarker.debug.impl.DebuggerService; import jakarta.annotation.Resource; @@ -30,6 +33,8 @@ public class AppDeviceCtrlService { MainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 @Resource ConsumablesScanService consumablesScanService; //耗材扫描模块 + @Resource + ConsumablesMgrService consumablesMgrService; //耗材管理模块 @Resource AppDebugHelperService appDebugHelperService; @@ -96,7 +101,8 @@ public class AppDeviceCtrlService { * 设备状态 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - @ExtApiFn(name = "获取设备工作状态", group = "设备状态") + + @ExtApiFn(name = "获取主流程工作状态", group = "设备状态") public MainFlowCtrlState getDeviceWorkState() { return gstate.mainFlowCtrlState; } @@ -106,38 +112,71 @@ public class AppDeviceCtrlService { return gstate.mainFlowCtrlState.isPending(); } - @ExtApiFn(name = "获取运行步骤状态", group = "设备状态") - public List getA8kStepActionList() { - return mainFlowCtrlSampleScanService.getA8kStepActionList(); - } - - @ExtApiFn(name = "获取正在处理的试管架状态", group = "设备状态") + @ExtApiFn(name = "获取<试管架>状态", group = "设备状态") public TubeHolder getTubeHolderState() { return gstate.getTubeHolder(); } - @ExtApiFn(name = "获取设备状态(调试使用)", group = "设备状态") + @ExtApiFn(name = "获取<孵育盘>的状态", group = "设备状态") + public IncubationPlate getIncubationPlate() { + return gstate.getIncubationPlate(); + } + + @ExtApiFn(name = "获取<光学模组>状态", group = "设备状态") + public OptScanModule getOptScanModuleState() { + return gstate.getOptScanModule(); + } + + @ExtApiFn(name = "获取<急诊位>状态", group = "设备状态") + public EmergencyTubePos getEmergencyTubePosState() { + return gstate.getEmergencyTubePos(); + } + + @ExtApiFn(name = "获取<耗材>状态", group = "设备状态") + public ConsumableState getConsumablesState() { + return gstate.getConsumableState(); + } + + @ExtApiFn(name = "获取运行步骤状态", group = "调试") + public List getA8kStepActionList() { + return mainFlowCtrlSampleScanService.getA8kStepActionList(); + } + + @ExtApiFn(name = "获取设备状态(调试使用)", group = "调试") public GStateService getGState() { return gstate; } - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 系统控制 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - @ExtApiFn(name = "关机", group = "主机") - public void shutdown() { - //TODO: + @ExtApiFn(name = "获取应用版本", group = "系统状态") + public String getAppVersion() { + return gstate.getAppVersion(); + } + + @ExtApiFn(name = "获取MCU版本", group = "系统状态") + public String getMcuVersion() { + return gstate.getMcuVersion(); + } + + @ExtApiFn(name = "获取设备SN", group = "系统状态") + public String getSn() { + return gstate.getSn(); } - @ExtApiFn(name = "获取设备IP", group = "主机") + @ExtApiFn(name = "获取设备IP", group = "系统状态") public String readdeviceip() { //TODO: return "192.168.8.10"; } - Boolean beepState = false; + @ExtApiFn(name = "关机", group = "主机") + public void shutdown() { + //TODO: + } + Boolean beepState = false; @ExtApiFn(name = "打开蜂鸣器", group = "主机") public void startBeepWarning() { beepState = true; @@ -153,5 +192,4 @@ public class AppDeviceCtrlService { return false; } - } diff --git a/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java b/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java index 257854a..a48523e 100644 --- a/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java +++ b/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java @@ -28,7 +28,6 @@ import java.util.List; * takeXXXX,申请并减少数量 * setXXXX, 设置数量 */ -@ExtApiTab(cfg = ExtApiTabConfig.ConsumablesMgrService) @Component public class ConsumablesMgrService { @Resource @@ -222,7 +221,6 @@ public class ConsumablesMgrService { * @param group Tip组 * @param num 数量 */ - @ExtApiFn(name = "设置Tip数量") synchronized public void setTipNum(Integer group, Integer num) { var cState = gstate.getConsumableState(); cState.tips[group].tipNum = num; @@ -233,7 +231,6 @@ public class ConsumablesMgrService { * @param group 耗材组 * @param num 数量 */ - @ExtApiFn(name = "设置耗材数量") synchronized public void setCounsumableNum(ConsumableGroup group, Integer num) { priSetConsumableGroupNum(group, num); } diff --git a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java index 607c213..9b6f276 100644 --- a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java @@ -8,6 +8,7 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appdata.AppProjInfoMgrService; import a8k.service.app.appstate.type.EmergencyTubePos; import a8k.service.app.appstate.type.Tube; +import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.service.app.appstate.type.state.TubeState; import a8k.type.exception.AppException; import a8k.type.type.BloodType; @@ -50,22 +51,25 @@ public class EmergencySamplePosStateMgrService { Tube tube = emergencyTubePos.tube; List projIndex = new ArrayList<>(); List projInfo = new ArrayList<>(); - if (tube.state.equals(TubeState.EMPTY) || tube.state.equals(TubeState.PROCESS_COMPLETE)) { - for (String index : projIndexList.split(",")) { - projIndex.add(Integer.parseInt(index)); - } + if (gstate.getMainFlowCtrlState().workState.equals(A8kWorkState.WORKING)) { + throw new AppException(A8kEcode.ACTION_IS_NOT_ALLOWED_WHEN_WORKING); + } - if (projIndex.isEmpty()) { - throw new AppException(A8kEcode.ProjIndexIsEmpty); - } + for (String index : projIndexList.split(",")) { + projIndex.add(Integer.parseInt(index)); + } - projInfo = appProjInfoMgrService.getProjBrifInfo(projIndex); - if (projInfo == null || projInfo.size() != projIndex.size()) { - throw new AppException(A8kEcode.CanNotFindProjInfo); - } + if (projIndex.isEmpty()) { + throw new AppException(A8kEcode.ProjIndexIsEmpty); + } + projInfo = appProjInfoMgrService.getProjBrifInfo(projIndex); + if (projInfo == null || projInfo.size() != projIndex.size()) { + throw new AppException(A8kEcode.CanNotFindProjInfo); + } + if (tube.state.equals(TubeState.EMPTY) || tube.state.equals(TubeState.PROCESS_COMPLETE)) { tube.userid = userid; tube.bloodType = bloodType; tube.sampleBarcode = sampleBarcode; @@ -74,6 +78,14 @@ public class EmergencySamplePosStateMgrService { tube.state = TubeState.TO_BE_PROCESSED; tubeStateMgrService.createNewEmergencyTubeContext(tube); logger.info("添加紧急样本设置成功 {}", ZJsonHelper.objectToJson(tube)); + } else if (tube.state.equals(TubeState.TO_BE_PROCESSED)) { + tube.userid = userid; + tube.bloodType = bloodType; + tube.sampleBarcode = sampleBarcode; + tube.isEmergency = true; + tube.projInfo = projInfo; + tubeStateMgrService.updateTubeContext(tube); + logger.info("更新紧急样本设置成功 {}", ZJsonHelper.objectToJson(tube)); } else { throw new AppException(A8kEcode.EmergencySampleIsProcessing); } diff --git a/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java b/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java index e0bd99a..208e125 100644 --- a/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java @@ -16,7 +16,6 @@ import java.util.Date; import java.util.List; @Component -@ExtApiTab(cfg = ExtApiTabConfig.IncubationPlateMgrService) public class IncubationPlateMgrService { @Resource diff --git a/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java b/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java index 411953c..130dd64 100644 --- a/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java @@ -8,7 +8,6 @@ import a8k.service.app.appstate.type.state.TubeState; import a8k.type.Consumable; import a8k.type.IncubatorPos; import a8k.type.TipPos; -import a8k.service.db.type.A8kIdCardInfo; import a8k.utils.A8kProjCfg; import a8k.utils.ProjBriefInfo; import jakarta.annotation.Resource; @@ -26,7 +25,6 @@ import a8k.service.db.SampleRecordDBService; @Component public class TubeStateMgrService { - @Resource GStateService gstate; @Resource @@ -46,7 +44,6 @@ public class TubeStateMgrService { return sampleid; } - void assignTubeProcessContext(TubeProcessContext cxt, Tube tube) { cxt.sampleid = tube.sampleid; cxt.isHighTube = tube.isHighTube; @@ -59,7 +56,6 @@ public class TubeStateMgrService { } - private void addSampleRecord(Tube[] tube) { Date intertime = new Date(); for (int i = 0; i < tube.length; i++) { @@ -73,7 +69,7 @@ public class TubeStateMgrService { record.bloodType = tube[i].bloodType; record.sampleBarcode = tube[i].sampleBarcode; record.userid = tube[i].userid; - record.date = intertime; + record.createDate = intertime; record.isEmergency = tube[i].isEmergency; record.sampleid = generateSampleId(intertime, i); record.projIndex = ProjBriefInfo.toPorjIndex((tube[i].projInfo)); @@ -90,7 +86,7 @@ public class TubeStateMgrService { record.bloodType = tube.bloodType; record.sampleBarcode = tube.sampleBarcode; record.userid = tube.userid; - record.date = intertime; + record.createDate = intertime; record.isEmergency = true; record.sampleid = generateSampleId(intertime, -1); record.projIndex = ProjBriefInfo.toPorjIndex(tube.projInfo); @@ -98,11 +94,9 @@ public class TubeStateMgrService { sampleRecordDBService.add(record); } - synchronized public void createNewEmergencyTubeContext(Tube tube) { assert tube != null; - assert !tube.sampleid.isEmpty(); - + addEmergencySampleRecord(tube); TubeProcessContext context = new TubeProcessContext(); assignTubeProcessContext(context, tube); contexts.add(context); @@ -117,6 +111,12 @@ public class TubeStateMgrService { } } + synchronized public void updateTubeContext(Tube tube) { + TubeProcessContext processContext = getTubeContext(tube.sampleid); + if (processContext != null) + assignTubeProcessContext(processContext, tube); + } + synchronized public TubeProcessContext getTubeContext(String sampleid) { for (TubeProcessContext context : contexts) { if (context.sampleid.equals(sampleid)) { @@ -126,8 +126,8 @@ public class TubeStateMgrService { return null; } - - synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kProjCfg projCfg, @NotNull Consumable consumable, @NotNull List tipPos, + synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kProjCfg projCfg, + @NotNull Consumable consumable, @NotNull List tipPos, @NotNull IncubatorPos incubatorPos) { ProjProcessContext context = new ProjProcessContext(); context.projInfo = projCfg.getProjBriefInfo(); @@ -141,7 +141,6 @@ public class TubeStateMgrService { tube.projProcessContexts.add(context); } - synchronized public void setCurTubeState(TubeState state) { Tube tube = gstate.getCurProcessingTube(); assert tube != null; @@ -149,7 +148,8 @@ public class TubeStateMgrService { tube.state = state; } - synchronized public void setTubeResourceIsReady(@NotNull List a8kconfig, @NotNull List consumable, @NotNull List> tipPos, + synchronized public void setTubeResourceIsReady(@NotNull List a8kconfig, + @NotNull List consumable, @NotNull List> tipPos, @NotNull List incubatorPos) { Tube tube = gstate.getCurProcessingTube(); assert tube != null; diff --git a/src/main/java/a8k/service/db/SampleRecordDBService.java b/src/main/java/a8k/service/db/SampleRecordDBService.java index 4c4d15d..2478481 100644 --- a/src/main/java/a8k/service/db/SampleRecordDBService.java +++ b/src/main/java/a8k/service/db/SampleRecordDBService.java @@ -2,6 +2,7 @@ package a8k.service.db; import a8k.service.db.type.SampleRecord; import a8k.service.app.appdata.UtilsProjectColorAllocer; +import a8k.utils.DateUtil; import a8k.utils.ZSqliteJdbcHelper; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -12,6 +13,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import java.sql.ResultSet; +import java.util.Date; import java.util.List; @Component @@ -51,7 +53,9 @@ public class SampleRecordDBService { } public Integer getRecordCntToday(){ - return jdbcTemplate.queryForObject("select count(*) from " + tableName + " where between date('now','start of day') and date('now','start of day','+1 day')", Integer.class); + Long startOfDay = DateUtil.getDayStartTime(new Date()); + Long endOfDay = DateUtil.getDayEndTime(new Date()); + return jdbcTemplate.queryForObject("select count(*) from " + tableName + " where createDate >= ? and createDate < ?", Integer.class, startOfDay, endOfDay); } } diff --git a/src/main/java/a8k/service/db/type/SampleRecord.java b/src/main/java/a8k/service/db/type/SampleRecord.java index f26d02b..9262d43 100644 --- a/src/main/java/a8k/service/db/type/SampleRecord.java +++ b/src/main/java/a8k/service/db/type/SampleRecord.java @@ -12,7 +12,7 @@ import java.util.List; public class SampleRecord { public int id = 0; public String sampleid; // generated by system , year%100+month+day+时分 241230_1203_01 - public Date date; + public Date createDate; public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 public Boolean isEmergency = false; //是否急诊 public String sampleBarcode = ""; //用于请求用户信息的条码ID diff --git a/src/main/java/a8k/utils/DateUtil.java b/src/main/java/a8k/utils/DateUtil.java new file mode 100644 index 0000000..af31b57 --- /dev/null +++ b/src/main/java/a8k/utils/DateUtil.java @@ -0,0 +1,429 @@ +package a8k.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * @Author : JCccc + * @CreateTime : 2020/2/27 + * @Description : + **/ +public class DateUtil { + + /** + * 获取今天开始时间和结束时间 + * + * @return + */ + public static Map getTodayTime() { + Long startTime = getStartTime(); + //Long endTime = getEndTime(); //当期时间 + + Long endTime = new Date().getTime(); //当期时间 + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault())); + String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault())); + Map map = new HashMap(); + map.put("startDate", startTimeStr); + map.put("endDate", endTimeStr); + return map; + } + + //获取今天日期 年月日 + public static Date getTodayYmd(){ + Date now = new Date(); + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(now); + // 将时分秒,毫秒域清零 + cal1.set(Calendar.HOUR_OF_DAY, 0); + cal1.set(Calendar.MINUTE, 0); + cal1.set(Calendar.SECOND, 0); + cal1.set(Calendar.MILLISECOND, 0); + return cal1.getTime(); + } + + //获取昨天日期 年月日 + public static Date getYesterdayYmd() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.DAY_OF_MONTH, -1); + return cal.getTime(); + } + + + + + /** + * 获取昨天开始时间和结束时间 + * + * @return + */ + public static Map getYesterdayTime() { + Long startTime = getBeginDayOfYesterday(); + Long endTime = getEndDayOfYesterDay(); + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault())); + String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault())); + Map map = new HashMap(); + map.put("startDate", startTimeStr); + map.put("endDate", endTimeStr); + return map; + + + + + } + + /** + * 获取当月开始时间和结束时间 + * + * @return + */ + public static Map getMonthTime() { + Long startTime = getMonthStartTime(); + Long endTime = getMonthEndTime(); + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault())); + String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault())); + Map map = new HashMap(); + map.put("startDate", startTimeStr); + map.put("endDate", endTimeStr); + return map; + } + + /** + * 获取上个月月开始时间和结束时间 + * + * @return + */ + public static Map getLastMonthTime() throws Exception { + Long startTime = getLastMonthStartTime(); + Long endTime = getLastMonthEndTime(); + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault())); + String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault())); + Map map = new HashMap(); + map.put("startDate", startTimeStr); + map.put("endDate", endTimeStr); + return map; + } + + + //获取月均开始和结束时间 + public static Map getAverageTime(String minCreateTime) throws ParseException { + + + Long yesterdayTimeEnd =getEndDayOfYesterDay(); + + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + //昨天的时间 + String yesterdayStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(yesterdayTimeEnd), ZoneId.systemDefault())); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String yesterdayBefore30Str = ""; + Calendar calc = Calendar.getInstance(); + + calc.setTime(sdf.parse(yesterdayStr)); + calc.add(calc.DATE, -30); + calc.set(Calendar.HOUR_OF_DAY, 0); + calc.set(Calendar.MINUTE, 0); + calc.set(Calendar.SECOND, 0); + calc.set(Calendar.MILLISECOND, 0); + Date minDate = calc.getTime(); + yesterdayBefore30Str = sdf.format(minDate); + + int num = daysBetween(yesterdayBefore30Str, yesterdayStr); + + int checkNum = daysBetween(minCreateTime, yesterdayBefore30Str); + System.out.println("checkNum:"+checkNum); + Map map = new HashMap(); + if (checkNum < 0) { + int numNew = daysBetween(minCreateTime, yesterdayStr); + map.put("startDate", minCreateTime); + map.put("endDate", yesterdayStr); + map.put("num", Math.abs(numNew)); //取绝对值 + return map; + } + + map.put("startDate", yesterdayBefore30Str); + map.put("endDate", yesterdayStr); + map.put("num", num); + return map; + } + + + + + public static int daysBetween(String smdate, String bdate) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(sdf.parse(smdate)); + long time1 = cal.getTimeInMillis(); + cal.setTime(sdf.parse(bdate)); + long time2 = cal.getTimeInMillis(); + long between_days = (time2 - time1) / (1000 * 3600 * 24); + return Integer.parseInt(String.valueOf(between_days)); + + } + + + /** + * 获取今天开始时间 + */ + private static Long getStartTime() { + Calendar todayStart = Calendar.getInstance(); + todayStart.set(Calendar.HOUR_OF_DAY, 0); + todayStart.set(Calendar.MINUTE, 0); + todayStart.set(Calendar.SECOND, 0); + todayStart.set(Calendar.MILLISECOND, 0); + return todayStart.getTimeInMillis(); + } + + /** + * 获取今天结束时间 + */ + private static Long getEndTime() { + Calendar todayEnd = Calendar.getInstance(); + todayEnd.set(Calendar.HOUR, 23); + todayEnd.set(Calendar.MINUTE, 59); + todayEnd.set(Calendar.SECOND, 59); + todayEnd.set(Calendar.MILLISECOND, 999); + return todayEnd.getTime().getTime(); + } + + + /** + * 获取当月开始时间 + */ + public static Long getMonthStartTime() { + + Long currentTime = System.currentTimeMillis(); + + String timeZone = "GMT+8:00"; + Calendar calendar = Calendar.getInstance();// 获取当前日期 + calendar.setTimeZone(TimeZone.getTimeZone(timeZone)); + calendar.setTimeInMillis(currentTime); + calendar.add(Calendar.YEAR, 0); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTimeInMillis(); + + + } + + /** + * 获取当月的结束时间戳 + */ + public static Long getMonthEndTime() { + Long currentTime = System.currentTimeMillis(); + + String timeZone = "GMT+8:00"; + Calendar calendar = Calendar.getInstance();// 获取当前日期 + calendar.setTimeZone(TimeZone.getTimeZone(timeZone)); + calendar.setTimeInMillis(currentTime); + calendar.add(Calendar.YEAR, 0); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTimeInMillis(); + } + + + public static Long getLastMonthStartTime() throws Exception { + Long currentTime = System.currentTimeMillis(); + + String timeZone = "GMT+8:00"; + Calendar calendar = Calendar.getInstance();// 获取当前日期 + calendar.setTimeZone(TimeZone.getTimeZone(timeZone)); + calendar.setTimeInMillis(currentTime); + calendar.add(Calendar.YEAR, 0); + calendar.add(Calendar.MONTH, -1); + calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + return calendar.getTimeInMillis(); + } + + + public static Long getLastMonthEndTime() { + Long currentTime = System.currentTimeMillis(); + + String timeZone = "GMT+8:00"; + Calendar calendar = Calendar.getInstance();// 获取当前日期 + calendar.setTimeZone(TimeZone.getTimeZone(timeZone)); + calendar.setTimeInMillis(currentTime); + calendar.add(Calendar.YEAR, 0); + calendar.add(Calendar.MONTH, -1); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + + return calendar.getTimeInMillis(); + } + + + + + + public static Long getBeginDayOfYesterday() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.DAY_OF_MONTH, -1); + return cal.getTimeInMillis(); + } + + + + + public static Long getEndDayOfYesterDay() { + + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.add(Calendar.DAY_OF_MONTH, -1); + + + return cal.getTimeInMillis(); + } + + + + + + + + + //获取今年是哪一年 + + public static Integer getNowYear() { + + Date date = new Date(); + + GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance(); + + gc.setTime(date); + + return Integer.valueOf(gc.get(1)); + + } + + + public static Map getThisYearTime() throws Exception { + Long startTime = getBeginDayOfYear(); + Long endTime = getEndDayOfYear(); + DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault())); + String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault())); + Map map = new HashMap(); + map.put("startDate", startTimeStr); + map.put("endDate", endTimeStr); + return map; + } + + //获取本年的开始时间 + + public static Long getBeginDayOfYear() { + + Calendar cal = Calendar.getInstance(); + + cal.set(Calendar.YEAR, getNowYear()); + + // cal.set + + cal.set(Calendar.MONTH, Calendar.JANUARY); + + cal.set(Calendar.DATE, 1); + + + + return getDayStartTime(cal.getTime()); + + } + + //获取本年的结束时间 + + public static Long getEndDayOfYear() { + + Calendar cal = Calendar.getInstance(); + + cal.set(Calendar.YEAR, getNowYear()); + + cal.set(Calendar.MONTH, Calendar.DECEMBER); + + cal.set(Calendar.DATE, 31); + + return getDayEndTime(cal.getTime()); + + } + + //获取某个日期的开始时间 + + public static Long getDayStartTime(Date d) { + + Calendar calendar = Calendar.getInstance(); + + if(null != d) calendar.setTime(d); + + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0); + + calendar.set(Calendar.MILLISECOND, 0); + + return calendar.getTimeInMillis(); + + } + + //获取某个日期的结束时间 + + public static Long getDayEndTime(Date d) { + + Calendar calendar = Calendar.getInstance(); + + if(null != d) calendar.setTime(d); + + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59); + + calendar.set(Calendar.MILLISECOND, 999); + + return calendar.getTimeInMillis(); + + } + + public static void main(String[] args) throws Exception { + + Map todayTime = getTodayTime(); + System.out.println("今天:" + todayTime.toString()); + + Map yesterdayTime = getYesterdayTime(); + System.out.println("昨天:" + yesterdayTime.toString()); + + Map monthTime = getMonthTime(); + System.out.println("当月:" + monthTime.toString()); + + Map lastMonthTime = getLastMonthTime(); + System.out.println("上个月:" + lastMonthTime.toString()); + } + +} \ No newline at end of file