package com.product.administration.service; import com.alibaba.fastjson.JSONObject; import com.product.administration.config.CmnConst; import com.product.administration.config.SystemCode; import com.product.administration.service.ide.IConferenceManagerService; 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.permission.PermissionService; import com.product.core.service.support.AbstractBaseService; import com.product.core.service.support.QueryFilterService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.transfer.Transactional; import com.product.core.websocket.service.WebsocketMesssageServiceThread; import com.product.module.sys.entity.SystemUser; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.DecimalFormat; import java.text.Format; import java.text.SimpleDateFormat; import java.util.*; /** * @Author cheng * @Description * @Date 2021/4/20 14:42 * @Version 1.0 */ @Service("conferenceManagerService") public class ConferenceManagerService extends AbstractBaseService implements IConferenceManagerService { @Autowired BaseDao baseDao; @Autowired QueryFilterService queryFilterService; @Autowired PermissionService permissionService; /** * 会议室列表 * * @param fse * @return * @throws BaseException */ public DataTableEntity getListConferenceRoom(FieldSetEntity fse) throws BaseException { String queryFilter = queryFilterService.getQueryFilter(fse); String dataFilter = permissionService.getDataFilter(CmnConst.ORG_LEVEL_UUID); StringBuilder filter = new StringBuilder(); if (!StringUtils.isEmpty(queryFilter)) { filter.append(queryFilter); } String created_by_field = fse.getString("created_by_field"); if (!StringUtils.isEmpty(created_by_field)) { Integer userId = SpringMVCContextHolder.getCurrentUser().getUser_id(); if (filter.length() > 0) { filter.append("and (" + created_by_field + " = " + userId + ") "); } else { filter.append(" ( "); filter.append(created_by_field + " = " + userId); filter.append(" ) "); } } else if (!StringUtils.isEmpty(dataFilter)) { if (filter.length() > 0) { filter.append("and (" + dataFilter + ") "); } else { filter.append(" ( "); filter.append(dataFilter); filter.append(" ) "); } } if (!StringUtils.isEmpty(fse.getString("filter"))) { if (filter.length() > 0) { filter.append("and (" + fse.getString("filter") + ") "); } else { filter.append(" ( "); filter.append(fse.getString("filter")); filter.append(" ) "); } } DataTableEntity dt = baseDao.listTable(fse.getTableName(), filter.toString(), null, null, CmnConst.CREATED_UTC_DATETIME, fse.getInteger(CmnConst.PAGESIZE), fse.getInteger(CmnConst.CPAGE), false); baseDao.loadPromptData(dt); return dt; } /** * 会议室详情 * * @param fse * @return * @throws BaseException */ public FieldSetEntity findConferenceRoom(FieldSetEntity fse) throws BaseException { return baseDao.getFieldSetEntity(fse.getTableName(), fse.getUUID(), true); } /** * 保存会议室 * * @param fse * @return * @throws BaseException */ @Transactional @Override public boolean saveConferenceRoom(FieldSetEntity fse) throws BaseException { //重名验证对象 FieldSetEntity nameVerification = null; if (StringUtils.isEmpty(fse.getUUID())) { fse.setValue(CmnConst.ORG_LEVEL_UUID, SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid()); nameVerification = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_OA_CONFERENCE_ROOM_CONFIG, "room_name=?", new Object[] {fse.getString("room_name")}, false); }else { nameVerification = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_OA_CONFERENCE_ROOM_CONFIG, "room_name=? and uuid!=?", new Object[] {fse.getString("room_name"), fse.getUUID()}, false); } if (nameVerification!=null) { throw new BaseException(SystemCode.CONFERENCE_ROOM_SAVE_FIAL_DUPLICATE_NAME.getValue(), SystemCode.CONFERENCE_ROOM_SAVE_FIAL_DUPLICATE_NAME.getText()); } BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fse); //重名验证 return baseDao.saveFieldSetEntity(fse); } /** * 删除会议室 * * @param fse * @return * @throws BaseException */ @Transactional @Override public boolean delConferenceRoom(FieldSetEntity fse) throws BaseException { return baseDao.delete(fse.getTableName(), fse.getUUID().split(",")); } /** * 会议申请保存 * * @param fse * @return * @throws BaseException */ @Override @Transactional public String saveConferenceApply(FieldSetEntity fse) throws BaseException { if ("0".equals(fse.getString("type"))){ baseDao.saveFieldSetEntity(fse); return fse.getUUID(); } if (StringUtils.isEmpty(fse.getUUID())) { fse.setValue(CmnConst.ORG_LEVEL_UUID, SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid()); fse.setValue("flow_flag", 0); } if (StringUtils.isEmpty(fse.getString("meeting_room"))) { throw new BaseException(SystemCode.CONFERENCE_ROOM_REQUIRED.getValue(), SystemCode.CONFERENCE_ROOM_REQUIRED.getText()); } String start_time = fse.getDate(CmnConst.START_TIME, CmnConst.YYYYMMDDHHMMSS); String end_time = fse.getDate(CmnConst.END_TIME, CmnConst.YYYYMMDDHHMMSS); StringBuilder sql = new StringBuilder(); sql.append(" SELECT "); sql.append(" uuid "); sql.append(" FROM "); sql.append(" product_oa_conference_apply "); sql.append(" WHERE "); sql.append(" meeting_room=? "); Object[] params; if (!StringUtils.isEmpty(fse.getUUID())) { sql.append(" and uuid !=? "); params = new Object[]{fse.getString("meeting_room"), fse.getUUID(), start_time, end_time, start_time, end_time, start_time, end_time}; } else { params = new Object[]{fse.getString("meeting_room"), start_time, end_time, start_time, end_time, start_time, end_time}; } sql.append(" and (( start_time >=? AND start_time <= ? ) "); sql.append(" OR ( start_time <= ? AND end_time >= ? ) "); sql.append(" OR ( end_time >= ? AND end_time <= ? ) "); sql.append(" ) and flow_flag in (1,2) "); DataTableEntity dataTableEntity = baseDao.listTable(sql.toString(), params); //验证会议室在选择时间段内是否被使用 if (!BaseUtil.dataTableIsEmpty(dataTableEntity)) { // 会议室在时间段内被使用抛出错误 throw new BaseException(SystemCode.CONFERENCE_ROOM_IS_USED.getValue(), SystemCode.CONFERENCE_ROOM_IS_USED.getText()); } BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fse); baseDao.saveFieldSetEntity(fse); return fse.getUUID(); } @Override @Transactional public boolean delConferenceApply(FieldSetEntity fse) throws BaseException { return baseDao.delete(fse.getTableName(), fse.getUUID().split(",")); } /** * 会议室使用情况 * * @return * @throws BaseException */ public String getConferenceRoomUsage(FieldSetEntity fse) throws BaseException { SystemUser currentUser = SpringMVCContextHolder.getCurrentUser(); String org_level_uuid = currentUser != null ? currentUser.getOrg_level_uuid() : null; if (currentUser == null || StringUtils.isEmpty(org_level_uuid)) { return null; } String clientType = currentUser.getClientType(); System.out.println(clientType); String startTime = fse.getString("startTime"); String endTime = fse.getString("endTime"); StringBuilder sql = new StringBuilder(); sql.append(" SELECT "); sql.append(" a.uuid, "); sql.append(" b.uuid apply_uuid, "); sql.append(" a.room_name, "); sql.append(" b.meeting_topic, "); if (com.product.admin.config.CmnConst.MOBILE_CLIENT_TYPE.equalsIgnoreCase(clientType)) { //移动端 sql.append(" date_format(b.start_time,'%Y-%m-%d %H:%i:%s') start_time, "); sql.append(" date_format(b.end_time,'%Y-%m-%d %H:%i:%s') end_time, "); } else { sql.append(" b.start_time, "); sql.append(" b.end_time, "); } sql.append(" b.flow_flag, "); sql.append(" FROM "); sql.append(" ( SELECT user_name FROM product_sys_users WHERE user_id = b.created_by ) proposer "); sql.append(" product_oa_CONFERENCE_room_config a "); sql.append(" LEFT JOIN ( SELECT flow_flag,meeting_room,uuid,meeting_topic,start_time,end_time,created_by FROM "); sql.append(" product_oa_conference_apply b WHERE "); sql.append("start_time>=? and start_time<=? or (end_time>=? and start_time<=?) "); sql.append(" and start_time is not null and end_time is not null and flow_flag in (1,2) ) b "); sql.append(" ON a.uuid = b.meeting_room "); sql.append(" WHERE "); sql.append(" a.`status` = 1 "); sql.append(" AND org_level_uuid = ? "); sql.append(" AND enabled_time <= now( ) "); sql.append(" GROUP BY "); sql.append(" a.uuid, "); sql.append(" b.uuid, "); sql.append(" a.room_name, "); sql.append(" b.meeting_topic, "); sql.append(" b.start_time, "); sql.append(" b.end_time, "); sql.append(" b.created_by,b.flow_flag "); sql.append(" ORDER BY "); sql.append(" b.start_time "); DataTableEntity dt = baseDao.listTable(sql.toString(), new Object[]{startTime, endTime, startTime, endTime, org_level_uuid}); dt.getMeta().addAliasTable(CmnConst.PRODUCT_OA_CONFERENCE_APPLY, "b"); baseDao.loadPromptData(dt); sql.setLength(0); if (!BaseUtil.dataTableIsEmpty(dt)) { if (!com.product.admin.config.CmnConst.MOBILE_CLIENT_TYPE.equalsIgnoreCase(clientType)) { List weekRefer = new ArrayList<>(); weekRefer.add("星期一"); weekRefer.add("星期二"); weekRefer.add("星期三"); weekRefer.add("星期四"); weekRefer.add("星期五"); weekRefer.add("星期六"); weekRefer.add("星期日"); // key = 会议室 value : key=星期几上午或下午 value=每次申请会议室的数据 Map>>> room = new HashMap<>(); Map room_name = new LinkedHashMap<>(); for (int i = 0; i < dt.getRows(); i++) { FieldSetEntity fs = dt.getFieldSetEntity(i); String uuid = fs.getUUID(); Map>> data = room.get(uuid); if (data == null) { data = new HashMap<>(); room_name.put(uuid, fs.getString("room_name")); room.put(uuid, data); } putMeetingToWeek(data, fs, fse); } HashMap objectObjectHashMap = new HashMap<>(); objectObjectHashMap.put("room", room); return BaseUtil.success(room_name, objectObjectHashMap); } else { //移动端 List> roomList = !fse.getBoolean("roomList") ? new ArrayList<>() : null; Map> meetingRecordMap = new HashMap<>(); for (int i = 0; i < dt.getRows(); i++) { FieldSetEntity fs = dt.getFieldSetEntity(i); JSONObject jsonObject = BaseUtil.fieldSetEntityToJson(fs); String roomUid = fs.getString(CmnConst.UUID); List meetingRecordList = meetingRecordMap.get(roomUid); if (meetingRecordList == null) { meetingRecordList = new ArrayList<>(); meetingRecordMap.put(roomUid, meetingRecordList); Map room = new HashMap<>(); room.put("name", fs.getString("room_name")); room.put("value", fs.getUUID()); if (roomList != null) { roomList.add(room); } } if (!StringUtils.isEmpty(fs.getString("apply_uuid"))) { Date start_time = fs.getDate("start_time"); Calendar calendar = Calendar.getInstance(); calendar.setTime(start_time); jsonObject.put("year", calendar.get(Calendar.YEAR)); jsonObject.put("month", calendar.get(Calendar.MONTH) + 1); jsonObject.put("day", calendar.get(Calendar.DAY_OF_MONTH)); Format f1 = new DecimalFormat("00"); jsonObject.put("start_h_m", calendar.get(Calendar.HOUR_OF_DAY) + ":" + f1.format(calendar.get(Calendar.MINUTE))); calendar.setTime(fs.getDate("end_time")); jsonObject.put("end_h_m", calendar.get(Calendar.HOUR_OF_DAY) + ":" + f1.format(calendar.get(Calendar.MINUTE))); meetingRecordList.add(jsonObject); } } Map result = new HashMap<>(); result.put("roomList", roomList); result.put("meetingRecord", meetingRecordMap); return BaseUtil.success(result); } } return null; } private void putMeetingToWeek(Map>> data, FieldSetEntity fs, FieldSetEntity fse) throws BaseException { Date start_time = fs.getDate(CmnConst.START_TIME); // 周几 if (start_time == null) { return; } String week = BaseUtil.getWeek(start_time); Calendar calendar = Calendar.getInstance(); calendar.setTime(start_time); // 0 上午 1 下午 int am_pm = calendar.get(Calendar.HOUR_OF_DAY) != 12 ? calendar.get(Calendar.AM_PM) : 0; Date end_time = fs.getDate(CmnConst.END_TIME); calendar.setTime(end_time); int end_am_pm = calendar.get(Calendar.HOUR_OF_DAY) != 12 ? calendar.get(Calendar.AM_PM) : 0; ; //是否同一天 boolean samedate = DateUtils.isSameDay(start_time, end_time); 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 = BaseUtil.getTimePeriodDate(start_time, end_time, false); putMeetingToWeek(data, timePeriodDate, fse, fs, am_pm); } } //记录的开始时间不能大于每周的开始时间 if (!start_time.before(fse.getDate("startTime"))) { List> maps = data.get(week + "_" + am_pm); if (maps == null) { maps = new ArrayList<>(); data.put(week + "_" + am_pm, maps); } maps.add(fs.getValues()); } } private void putMeetingToWeek(Map>> data, List timePeriodDate, FieldSetEntity fse, FieldSetEntity fs, int am_pm) { Calendar calendar = Calendar.getInstance(); Date start_time = fs.getDate(CmnConst.START_TIME); Date end_time = fs.getDate(CmnConst.END_TIME); for (int j = 0; j < timePeriodDate.size(); j++) { //每天的date Date o = (Date) timePeriodDate.get(j); if (o.before(fse.getDate("startTime")) || fse.getDate("endTime").before(o)) { continue; } String week_evey = BaseUtil.getWeek(o); //是否是同一天 if (DateUtils.isSameDay(start_time, 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(CmnConst.YYYYMMDDHHMMSS); String date1 = dtf.format(o); String date2 = dtf.format(end_time); if (date1.equals(date2)) { //最后结束日期 calendar.setTime(o); int cc = calendar.get(Calendar.HOUR_OF_DAY) != 12 ? calendar.get(Calendar.AM_PM) : 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 fse * @return * @throws BaseException */ public FieldSetEntity findConferenceApply(FieldSetEntity fse) throws BaseException { FieldSetEntity fieldSetEntity = baseDao.getFieldSetEntity(fse.getTableName(), fse.getUUID(), true); DataTableEntity dt = new DataTableEntity(); dt.addFieldSetEntity(fieldSetEntity); if (!com.product.admin.config.CmnConst.MOBILE_CLIENT_TYPE.equals(SpringMVCContextHolder.getCurrentUser().getClientType())) { baseDao.loadPromptData(dt); fieldSetEntity.setValue("flow_flag", fieldSetEntity.getString("flow_flag_save_value")); fieldSetEntity.setValue(CmnConst.CREATED_BY, fieldSetEntity.getString(CmnConst.CREATED_BY + "_save_value")); fieldSetEntity.setValue("meetint_type", fieldSetEntity.getString("meetint_type_save_value")); } return fieldSetEntity; } /** * 会议申请列表 * * @param fse * @return * @throws BaseException */ public DataTableEntity getListConferenceApply(FieldSetEntity fse) throws BaseException { String queryFilter = queryFilterService.getQueryFilter(fse); String dataFilter = permissionService.getDataFilter(CmnConst.ORG_LEVEL_UUID); StringBuilder filter = new StringBuilder(); if (!StringUtils.isEmpty(queryFilter)) { filter.append(queryFilter); } String created_by_field = fse.getString("created_by_field"); if (!StringUtils.isEmpty(created_by_field)) { Integer userId = SpringMVCContextHolder.getCurrentUser().getUser_id(); if (filter.length() > 0) { filter.append("and (" + created_by_field + " = " + userId + ") "); } else { filter.append(" ( "); filter.append(created_by_field + " = " + userId); filter.append(" ) "); } } else if (!StringUtils.isEmpty(dataFilter)) { if (filter.length() > 0) { filter.append("and (" + dataFilter + ") "); } else { filter.append(" ( "); filter.append(dataFilter); filter.append(" ) "); } } if (!StringUtils.isEmpty(fse.getString("filter"))) { if (filter.length() > 0) { filter.append("and (" + fse.getString("filter") + ") "); } else { filter.append(" ( "); filter.append(fse.getString("filter")); filter.append(" ) "); } } DataTableEntity dt = baseDao.listTable(fse.getTableName(), filter.toString(), new Object[]{}, null, "ifnull(updated_utc_datetime,created_utc_datetime) desc", fse.getInteger(CmnConst.PAGESIZE), fse.getInteger(CmnConst.CPAGE), false); baseDao.loadPromptData(dt); return dt; } public void taskMeetingRminder() { DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_OA_CONFERENCE_APPLY, " flow_flag=2 and ( to_remind IS NULL OR to_remind = 0 ) AND reminder_time > 0 and reminder_time>=(( UNIX_TIMESTAMP(start_time ) - UNIX_TIMESTAMP( now( ) ) ) / 60) ", new Object[]{}); baseDao.loadPromptData(dt); DataTableEntity dtt = new DataTableEntity(); if (!BaseUtil.dataTableIsEmpty(dt)) { for (int i = 0; i < dt.getRows(); i++) { Set users = new HashSet<>(); String created_user = dt.getString(i, CmnConst.CREATED_BY + "_save_value"); //记录人 users.add(dt.getString(i, "record_man")); //主持人 users.add(dt.getString(i, "record_master")); //参加者 String[] participators = dt.getString(i, "participator").split(","); users.addAll(Arrays.asList(participators)); String uuid = dt.getFieldSetEntity(i).getUUID(); String date = dt.getDate(i, CmnConst.START_TIME, CmnConst.YYYYMMDDHHMMSS); if (date == null) { date = ""; } users.remove(created_user); Iterator iterator = users.iterator(); WebsocketMesssageServiceThread.getInstance().appendMessage(dt.getString(i, CmnConst.CREATED_BY + "_save_value"), "您发起的会议将在" + date + "开始", "您有新的会议提醒", dt.getInt(i, CmnConst.CREATED_BY + "_save_value"), "4", "162028970334036i3V1L458?uuid=" + uuid, CmnConst.PRODUCT_OA_CONFERENCE_APPLY, uuid, dt.getInt(i, CmnConst.CREATED_BY + "_save_value"), 0, 0); while (iterator.hasNext()) { String send_user = iterator.next(); WebsocketMesssageServiceThread.getInstance().appendMessage(send_user, "来自" + dt.getString(i, CmnConst.CREATED_BY) + "发起的会议将在" + date + "开始", "您有新的会议提醒", dt.getInt(i, CmnConst.CREATED_BY + "_save_value"), "4", "162028970334036i3V1L458?uuid=" + uuid, CmnConst.PRODUCT_OA_CONFERENCE_APPLY, uuid, dt.getInt(i, CmnConst.CREATED_BY + "_save_value"), 0, 0); } dt.getMeta().setFields(new Object[]{CmnConst.UUID, "to_remind"}); dt.getFieldSetEntity(i).getMeta().setFields(new Object[]{CmnConst.UUID}); dt.setFieldValue(i, "to_remind", 1); } baseDao.update(dt); } } }