package com.care.keeper.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.care.common.cache.RedisKeyConstant; import com.care.common.cache.RedisUtil; import com.care.common.entity.*; import com.care.common.enums.*; import com.care.common.exception.BDException; import com.care.common.service.*; import com.care.common.vo.PageReqVO; import com.care.common.vo.order.*; import com.care.keeper.vo.HouseContactVO; import com.care.keeper.vo.KeeperInfoVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.utils.Lists; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @Author: lilt * @Date: 2021/6/7 * @Desc: */ @Slf4j @Service public class KeeperOrderApiService { @Resource private CareDeviceService careDeviceService; @Resource private CareHouseContactService careHouseContactService; @Resource private CareEventOrderService careEventOrderService; @Resource private CareEventOrderHandleHisService careEventOrderHandleHisService; @Resource private CareSysUserService careSysUserService; @Resource private CareEventOrderChambService careEventOrderChambService; @Resource private CareEventOrderOlderService careEventOrderOlderService; @Resource private CareEventOrderKeyApplyService careEventOrderKeyApplyService; @Resource private CareHouseContactRelService careHouseContactRelService; @Resource RedisUtil redisUtil; /** * 待处理的工单 * * @param pageReqVo * @param chambId * @return */ public IPage queryTodoEventByChambId(PageReqVO pageReqVo, Long chambId) { return this.careEventOrderChambService.queryTodoEventByChambId(pageReqVo,chambId); } /** * 进行中的工单 * * @param pageReqVo * @param chambId * @return */ public IPage queryDoingEventByChambId(PageReqVO pageReqVo, Long chambId) { return this.careEventOrderChambService.queryDoingEventByChambId(pageReqVo,chambId); } /** * 完成的工单 * * @param pageReqVo * @param chambId * @return */ public IPage queryDoneEventByChambId(PageReqVO pageReqVo, Long chambId) { return this.careEventOrderChambService.queryDoneEventByChambId(pageReqVo,chambId); } public ChambEventOrderVO getChambOrder(Long id){ CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(id); ChambEventOrderVO chambEventOrderVO = new ChambEventOrderVO(); BeanUtil.copyProperties(orderChamb,chambEventOrderVO); return chambEventOrderVO; } /** * 事件详情 * @param orderId * @return */ public EventOrderVO getEventInfo(Long orderId){ CareEventOrder eventOrder = this.careEventOrderService.getById(orderId); EventOrderVO vo = new EventOrderVO(); BeanUtil.copyProperties(eventOrder,vo); vo.setOrderTypeName(OrderTypeEnum.getCodeToName(vo.getOrderType())); return vo; } /** * 主管家改派管家列表查询 * @param orderId * @return */ public List queryChambList(Long orderId){ List chambList = new ArrayList<>(); ChamberlainVO mainVO = null; ChamberlainVO assignVO = null; CareEventOrder order = this.careEventOrderService.getById(orderId); CareDevice dev = this.careDeviceService.getById(order.getDevId()); if(dev != null){ CareSysUser careSysUser = this.careSysUserService.getById(dev.getChambId()); if (careSysUser != null) { mainVO = new ChamberlainVO(); BeanUtil.copyProperties(careSysUser,mainVO); mainVO.setIsMain(TrueFalseEnum.TRUE.getValue()); mainVO.setStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getStatus())); } } CareEventOrderChamb careEventOrderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderId); if(careEventOrderChamb != null) { CareSysUser careSysUser = this.careSysUserService.getById(careEventOrderChamb.getChambId()); if(careSysUser != null){ assignVO = new ChamberlainVO(); BeanUtil.copyProperties(careSysUser,assignVO); assignVO.setIsMain(TrueFalseEnum.FALSE.getValue()); assignVO.setStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getStatus())); } } if (mainVO != null && assignVO != null) { if(mainVO.getId().equals(assignVO.getId())){ //没有指派管家 if(ChambStatusEnum.BUSY.getValue().equals(mainVO.getStatus())){ //主状态是忙碌时拆分子状态 if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){ mainVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中 } else { mainVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌 } } else {//主状态不是忙碌时设置子状态和主状态相同 mainVO.setSubStatus(mainVO.getStatus()); } mainVO.setSubStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getSubStatus())); chambList.add(mainVO); } else{ //指派了管家 //设置主管家子状态和主状态相同:空闲、休假、忙碌 mainVO.setSubStatus(mainVO.getStatus()); //设置指派管家状态 if(ChambStatusEnum.BUSY.getValue().equals(assignVO.getStatus())) { //指派管家的主状态是忙碌时拆分子状态 if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){ assignVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中 } else { assignVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌 } } else {//指派管家的主状态不是忙碌时设置子状态和主状态相同 assignVO.setSubStatus(assignVO.getStatus()); } mainVO.setSubStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getSubStatus())); chambList.add(mainVO); assignVO.setSubStatusDesc(ChambStatusEnum.getCodeToName(assignVO.getSubStatus())); chambList.add(assignVO); } } else if(mainVO == null && assignVO != null) { //设置指派管家状态 if(ChambStatusEnum.BUSY.getValue().equals(assignVO.getStatus())) { //指派管家的主状态是忙碌时拆分子状态 if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){ assignVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中 } else { assignVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌 } } else {//指派管家的主状态不是忙碌时设置子状态和主状态相同 assignVO.setSubStatus(assignVO.getStatus()); } assignVO.setSubStatusDesc(ChambStatusEnum.getCodeToName(assignVO.getSubStatus())); chambList.add(assignVO); } return chambList; } /** * 查询工单对应的老人列表 * @param orderId * @return */ public List queryOrderOlderList(Long orderId){ List orderOlderVOList = Lists.newArrayList(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareEventOrderOlder::getOrderId,orderId); List ceoos = this.careEventOrderOlderService.list(queryWrapper); if (CollUtil.isNotEmpty(ceoos)){ ceoos.forEach(item->{ OrderOlderVO orderOlderVO = new OrderOlderVO(); BeanUtil.copyProperties(item,orderOlderVO); orderOlderVO.setStatusDesc(OrderOlderStatusEnum.getCodeToName(orderOlderVO.getStatus())); orderOlderVOList.add(orderOlderVO); }); } return orderOlderVOList; } /** * 查询事件紧急联系人 * @param orderId * @return */ public List queryContactByOrderId(Long orderId){ List vos = Lists.newArrayList(); CareEventOrder order = this.careEventOrderService.getById(orderId); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareHouseContactRel::getHouseId, order.getHouseId()); List contactRelss = this.careHouseContactRelService.list(queryWrapper); if (CollUtil.isNotEmpty(contactRelss)){ contactRelss.forEach(item -> { CareHouseContact careHouseContact = careHouseContactService.getById(item.getContactId()); HouseContactVO vo = new HouseContactVO(); BeanUtil.copyProperties(careHouseContact,vo); vo.setRelationTypeDesc(RelationTypeEnum.getCodeToName(vo.getRelationType())); vos.add(vo); }); } List vosNew = CollUtil.sortByProperty(vos,"contactLevel"); return vosNew; } /** * 钥匙信息 * @param orderId * @param keeperId * @return */ public OrderKeyApplyVO getApplyKeyInfo(Long orderId,Long keeperId ){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareEventOrderKeyApply::getOrderId,orderId).eq(CareEventOrderKeyApply::getApplyRole,UserRoleEnum.CHANMB.getValue()) .eq(CareEventOrderKeyApply::getApplyUserId,keeperId); List datas = this.careEventOrderKeyApplyService.list(queryWrapper); if (CollUtil.isNotEmpty(datas)){ OrderKeyApplyVO keyApplyVO = new OrderKeyApplyVO(); BeanUtil.copyProperties(datas.get(0),keyApplyVO); return keyApplyVO; }else { return null; } } /** * 申请钥匙 * @param orderId * @param keeperInfoVO * @return */ public boolean applyKey(Long orderId,KeeperInfoVO keeperInfoVO){ String key = RedisKeyConstant.KEY_APPLY_LOCAK+":"+keeperInfoVO.getId(); boolean result = redisUtil.tryLock(key,3000); Date date = DateUtil.date(); boolean flag =false; try{ if (result){ CareEventOrder order = this.careEventOrderService.getById(orderId); CareEventOrderKeyApply keyApply = new CareEventOrderKeyApply(); keyApply.setOrgId(order.getOrgId()); keyApply.setStationId(order.getStationId()); keyApply.setHouseId(order.getHouseId()); keyApply.setOrderId(orderId); keyApply.setApplyRole(UserRoleEnum.CHANMB.getValue()); keyApply.setApplyUserId(keeperInfoVO.getId()); keyApply.setApplyUserName(keeperInfoVO.getName()); keyApply.setStatus(KeyAuthEnum.TODO.getValue()); keyApply.setCreateTime(date); keyApply.setModifyTime(date); keyApply.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName()); flag = this.careEventOrderKeyApplyService.save(keyApply); if (flag){ CareEventOrderHandleHis his = new CareEventOrderHandleHis(); his.setOrgId(keyApply.getOrgId()); his.setStationId(keyApply.getStationId()); his.setOrderId(keyApply.getOrderId()); his.setLogType(LogTypeEnum.KEY.getValue()); his.setLogObjectId(keyApply.getApplyUserId()); his.setLogObjectName(keyApply.getApplyUserName()); his.setLogResult("申请钥匙"); his.setOpUserRole(UserRoleEnum.SEAT.getValue()); his.setOpUserId(keyApply.getApplyUserId()); his.setOpUserName(keyApply.getApplyUserName()); his.setCreateTime(date); his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName()); this.careEventOrderHandleHisService.save(his); } }else { throw new BDException("已经申请,请勿重复申请"); } }finally { redisUtil.releaseLock(key); } return flag; } /** * 到达确认 * @param orderChambId * @return */ @Transactional(rollbackFor = Exception.class) public boolean daoDaConfirm(Long orderChambId){ boolean flag = false; CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderChambId); Date date = DateUtil.date(); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(CareEventOrderChamb::getId,orderChamb.getId()) .set(CareEventOrderChamb::getStatus,ChambOrderStatusEnum.DOING.getValue()) .set(CareEventOrderChamb::getDaodaTime,date) .set(CareEventOrderChamb::getModifyTime,date); flag = this.careEventOrderChambService.update(updateWrapper); if (flag){ UpdateWrapper updateWrapper2 = new UpdateWrapper<>(); updateWrapper2.lambda().eq(CareSysUser::getId,orderChamb.getChambId()) .set(CareSysUser::getStatus,ChambStatusEnum.BUSY.getValue()) .set(CareSysUser::getModifyTime,date); this.careSysUserService.update(updateWrapper2); //保存日志 CareEventOrderHandleHis his = new CareEventOrderHandleHis(); his.setOrgId(orderChamb.getOrgId()); his.setStationId(orderChamb.getStationId()); his.setOrderId(orderChamb.getOrderId()); his.setLogType(LogTypeEnum.CHAMB.getValue()); his.setLogObjectId(orderChamb.getId()); his.setLogObjectName(orderChamb.getChambName()); his.setLogResult("已到达"); his.setOpUserRole(UserRoleEnum.CHANMB.getValue()); his.setOpUserId(orderChamb.getChambId()); his.setOpUserName(orderChamb.getChambName()); his.setCreateTime(date); his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName()); this.careEventOrderHandleHisService.save(his); } return flag; } /** * 离开确认 * @param orderChambId * @return */ @Transactional(rollbackFor = Exception.class) public boolean liKaiConfirm(Long orderChambId,String remark,String scenePic){ boolean flag = false; CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderChambId); Date date = DateUtil.date(); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(CareEventOrderChamb::getId,orderChamb.getId()) .set(CareEventOrderChamb::getRemark,remark) .set(CareEventOrderChamb::getScenePic,scenePic) .set(CareEventOrderChamb::getLikaiTime,date) .set(CareEventOrderChamb::getStatus,ChambOrderStatusEnum.COMPLETE.getValue()) .set(CareEventOrderChamb::getModifyTime,date); flag = this.careEventOrderChambService.update(updateWrapper); if (flag){ UpdateWrapper updateWrapper2 = new UpdateWrapper<>(); updateWrapper2.lambda().eq(CareSysUser::getId,orderChamb.getChambId()) .set(CareSysUser::getStatus,ChambStatusEnum.FREE.getValue()) .set(CareSysUser::getModifyTime,date); this.careSysUserService.update(updateWrapper2); //保存日志 CareEventOrderHandleHis his = new CareEventOrderHandleHis(); his.setOrgId(orderChamb.getOrgId()); his.setStationId(orderChamb.getStationId()); his.setOrderId(orderChamb.getOrderId()); his.setLogType(LogTypeEnum.CHAMB.getValue()); his.setLogObjectId(orderChamb.getId()); his.setLogObjectName(orderChamb.getChambName()); his.setLogResult("已离开"); his.setOpUserRole(UserRoleEnum.CHANMB.getValue()); his.setOpUserId(orderChamb.getChambId()); his.setOpUserName(orderChamb.getChambName()); his.setCreateTime(date); his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName()); this.careEventOrderHandleHisService.save(his); } return flag; } /** * 获取处理记录 * @return */ public List queryOrderHandleHis(Long orderId){ List result = Lists.newArrayList(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareEventOrderHandleHis::getOrderId,orderId) .orderByDesc(CareEventOrderHandleHis::getCreateTime); List datas = this.careEventOrderHandleHisService.list(queryWrapper); if (CollUtil.isNotEmpty(datas)){ datas.forEach(item ->{ OrderHandleHisVO hisVO = new OrderHandleHisVO(); BeanUtil.copyProperties(item,hisVO); result.add(hisVO); }); } return result; } /** * 管家工单统计 * @param chambId * @return */ public ChambEventOrderCountVO getOrderCountByChambId(Long chambId){ return this.careEventOrderChambService.getOrderCountByChambId(chambId); } }