package com.product.administration.service; import com.product.administration.config.CmnConst; import com.product.administration.service.ide.ICarChartservice; import com.product.common.lang.DateUtils; import com.product.common.lang.StringUtils; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.service.support.AbstractBaseService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.transfer.Transactional; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; /** * Copyright LX * @Title: CarChartservice * @Project: product-server * @date: 2021-05-07 10:07 * @author: ZhouJie * @Description: */ @Component @Service public class CarChartservice extends AbstractBaseService implements ICarChartservice { @Autowired public BaseDao baseDao; /** * @description: 用车看板保存 * @author: ZhouJie * @date: 2021-05-07 11:46 */ @Override @Transactional public String saveCarChart(FieldSetEntity fs) { if (StringUtils.isEmpty(fs.getString(CmnConst.UUID))) { fs.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fs.setValue("created_utc_datetime", new Date()); return baseDao.add(fs); } else { fs.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fs.setValue("updated_utc_datetime", new Date()); baseDao.update(fs); return fs.getString(CmnConst.UUID); } } /** * @description: 用车看板删除 * @author: ZhouJie * @date: 2021-05-07 11:46 */ @Override @Transactional public boolean deleteCarChart (FieldSetEntity fs){ String uuid = fs.getUUID(); String[] uuids = uuid.split(","); return baseDao.delete(CmnConst.PRODUCT_OA_CAR_CHART, BaseUtil.buildQuestionMarkFilter(CmnConst.UUID, uuids.length, true), uuids); } /** * @description: 用车看板列表 * @author: ZhouJie * @date: 2021-05-07 11:47 */ public DataTableEntity CarChartlist(FieldSetEntity fs) { DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_OA_CAR_CHART,null,null,null,null,fs.getInteger(CmnConst.PAGESIZE),fs.getInteger(CmnConst.CPAGE)); baseDao.loadPromptData(dt); return dt; } /** * @description: 用车看板详情 * @author: ZhouJie * @date: 2021-05-07 11:47 */ public FieldSetEntity CarChartInfo(FieldSetEntity fs) throws BaseException { return baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_CAR_CHART,fs.getUUID(),true); } /** * 用车看板 * * @return * @throws BaseException */ public String useTheKanban(FieldSetEntity fse) throws BaseException { String org_level_uuid = SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid(); if (StringUtils.isEmpty(org_level_uuid)) { return null; } //一周开始时间 String startTime = fse.getString("start_time"); //一周结束时间 String endTime = fse.getString("end_time"); StringBuilder sql = new StringBuilder(); //没有还车时间的 车辆一律在使用中。 vehicle_status 是车辆使用状态 sql.append(" SELECT b.uuid,b.plate_number,a.driving_time,a.return_time,a.scheduled_start_time,a.scheduled_end_time,a.show_name,CASE WHEN c.return_time is null AND c.driving_time is not null THEN 1 ELSE 0 END vehicle_status FROM product_oa_car_info b ") .append(" LEFT JOIN (SELECT a.vehicle_info_uuid,a.driving_time,a.return_time,a.scheduled_start_time,a.scheduled_end_time,c.show_name FROM product_oa_car_application a ") .append(" LEFT JOIN product_sys_staffs c ON a.applicant = c.user_id WHERE a.scheduled_start_time >= ? AND a.scheduled_start_time <= ? and a.flow_flag > 0) ") .append(" a ON a.vehicle_info_uuid = b.uuid LEFT JOIN (SELECT a.vehicle_info_uuid,a.driving_time,a.return_time,a.scheduled_start_time,a.scheduled_end_time,c.show_name FROM product_oa_car_application a ") .append(" LEFT JOIN product_sys_staffs c ON a.applicant = c.user_id WHERE a.flow_flag > 0 AND a.scheduled_start_time is not null and a.return_time is null) c on c.vehicle_info_uuid = b.uuid order by b.id "); DataTableEntity dt = baseDao.listTable(sql.toString(), new Object[]{startTime, endTime}); dt.getMeta().addAliasTable(CmnConst.PRODUCT_OA_CAR_INFO, "b"); //baseDao.loadPromptData(dt); sql.setLength(0); if (!BaseUtil.dataTableIsEmpty(dt)) { List weekRefer = new ArrayList<>(); weekRefer.add("星期一"); weekRefer.add("星期二"); weekRefer.add("星期三"); weekRefer.add("星期四"); weekRefer.add("星期五"); weekRefer.add("星期六"); weekRefer.add("星期日"); // key = 会议室 value : key=星期几上午或下午 value=每次申请会议室的数据 Map>>> plate = new HashMap<>(); Map plate_number = new LinkedHashMap<>(); for (int i = 0; i < dt.getRows(); i++) { FieldSetEntity fs = dt.getFieldSetEntity(i); String uuid = fs.getUUID(); //uuid 为key Map>> data = plate.get(uuid); if (data == null) { data = new HashMap<>(); //车辆名称 plate_number.put(uuid,new String[]{fs.getString("plate_number"), fs.getString("vehicle_status"),fs.getString("return_time")}); plate.put(uuid, data); } putMeetingToWeek(data, fs, fse); } HashMap objectObjectHashMap = new HashMap<>(); objectObjectHashMap.put("plate", plate); return BaseUtil.success(plate_number, objectObjectHashMap); } return null; } private void putMeetingToWeek(Map>> data, FieldSetEntity fs, FieldSetEntity fse) throws BaseException { Date scheduledStartTime = fs.getDate("scheduled_start_time"); // 周几 if (scheduledStartTime == null) { return; } //时间转换为星期 String week = BaseUtil.getWeek(scheduledStartTime); Calendar calendar = Calendar.getInstance(); calendar.setTime(scheduledStartTime); // 0 上午 1 下午 // System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); // System.out.println(calendar.get(Calendar.AM_PM)); int am_pm = calendar.get(Calendar.HOUR_OF_DAY) > 12 ? 1 : 0; Date scheduledEndTime = fs.getDate("scheduled_end_time"); calendar.setTime(scheduledEndTime); int end_am_pm = calendar.get(Calendar.HOUR_OF_DAY) > 12 ? 1 : 0; //是否同一天 boolean samedate = DateUtils.isSameDay(scheduledStartTime, scheduledEndTime); if (end_am_pm == am_pm && samedate) { // 开始时间 和结束时间属于同一时间段且是同一天 } else { if (end_am_pm != am_pm && samedate) { // 开始时间 和结束时间不属于同一时间段且是同一天 putMeetingToWeek(data, week, end_am_pm, fs.getValues()); } else { // 不在同一天 //获取开始到结束的每一天 List timePeriodDate = getTimePeriodDate(scheduledStartTime, scheduledEndTime, false); putMeetingToWeek(data, timePeriodDate, fse, fs, am_pm); } } //记录的开始时间不能大于每周的开始时间 //Date1.before(Date2),当Date1小于Date2时,返回TRUE,当大于等于时,返回false; if (!scheduledStartTime.before(fse.getDate("start_time"))) { //星期几_0 上午 星期几_1 下午 List> listMap = data.get(week + "_" + am_pm); if (listMap == null) { listMap = new ArrayList<>(); data.put(week + "_" + am_pm, listMap); } listMap.add(fs.getValues()); } } private void putMeetingToWeek(Map>> data, List timePeriodDate, FieldSetEntity fse, FieldSetEntity fs, int am_pm) { Calendar calendar = Calendar.getInstance(); //预计开始时间 Date scheduledStartTime = fs.getDate("scheduled_start_time"); //预计结束时间 Date scheduledEndTime = fs.getDate("scheduled_end_time"); for (int j = 0; j < timePeriodDate.size(); j++) { //每天的date Date o = (Date) timePeriodDate.get(j); //startTime 一周开始时间 endTime 一周结束时间 if (o.before(fse.getDate("start_time")) || fse.getDate("end_time").before(o)) { continue; } String week_evey = BaseUtil.getWeek(o); //是否是同一天 if (DateUtils.isSameDay(scheduledStartTime, o)) { //是否为上午时段 if (am_pm == 0) { putMeetingToWeek(data, week_evey, 1, fs.getValues()); } } else if ((j + 1) < timePeriodDate.size()) { putMeetingToWeek(data, week_evey, 0, fs.getValues()); putMeetingToWeek(data, week_evey, 1, fs.getValues()); } else { SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1 = dtf.format(o); String date2 = dtf.format(scheduledEndTime); if (date1.equals(date2)) { //最后结束日期 calendar.setTime(o); // System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); // System.out.println(calendar.get(Calendar.AM_PM)); int cc = calendar.get(Calendar.HOUR_OF_DAY) > 12 ? 1 : 0; if (cc == 1) { //如果最后一天是下午则加上 上午 putMeetingToWeek(data, week_evey, 0, fs.getValues()); } putMeetingToWeek(data, week_evey, cc, fs.getValues()); } else { } } } } private void putMeetingToWeek(Map>> data, String week, int am_pm, Map values) { List> list = data.get(week + "_" + am_pm); if (list == null) { list = new ArrayList<>(); data.put(week + "_" + am_pm, list); } Map clone = new TreeMap<>(); clone.putAll(values); list.add(clone); } /** * 获取时间段内的每一天 * * @param startDate * @param endDate * @return */ public static List getTimePeriodDate(Date startDate, Date endDate, boolean returnChar) { // 返回的日期集合 List days = new ArrayList<>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Calendar tempStart = Calendar.getInstance(); tempStart.setTime(startDate); Calendar tempEnd = Calendar.getInstance(); tempEnd.setTime(endDate); while (tempStart.before(tempEnd)) { days.add(returnChar ? dateFormat.format(tempStart.getTime()) : tempStart.getTime()); tempStart.add(Calendar.DAY_OF_YEAR, 1); } if(days.size()>1){ days.add(endDate); } return days; } }