BmsEventOrderService.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. package com.care.bms.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.util.RandomUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  11. import com.care.bigscreen.service.BigScreenService;
  12. import com.care.common.cache.RedisKeyConstant;
  13. import com.care.common.cache.RedisUtil;
  14. import com.care.common.entity.*;
  15. import com.care.common.enums.*;
  16. import com.care.common.exception.BDException;
  17. import com.care.common.service.*;
  18. import com.care.common.vo.PageReqVO;
  19. import com.care.common.vo.UserLogindConvertVO;
  20. import com.care.common.vo.order.*;
  21. import com.care.common.vo.outcall.CcCallResultVO;
  22. import org.apache.commons.compress.utils.Lists;
  23. import org.springframework.beans.BeanUtils;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import javax.annotation.Resource;
  27. import java.util.ArrayList;
  28. import java.util.List;
  29. /**
  30. * 事件定单表(CareEventOrder)表服务实现类
  31. *
  32. * @author makejava
  33. * @since 2021-05-21 00:08:29
  34. */
  35. @Service
  36. @Transactional(rollbackFor = Exception.class)
  37. public class BmsEventOrderService {
  38. @Resource
  39. RedisUtil redisUtil;
  40. @Resource
  41. private CareEventOrderService careEventOrderService;
  42. @Resource
  43. private CareSysUserService careSysUserService;
  44. @Resource
  45. private CareEventOrderOlderService careEventOrderOlderService;
  46. @Resource
  47. private CareEventOrderChambService careEventOrderChambService;
  48. @Resource
  49. private CareEventOrderContactStatusService careEventOrderContactStatusService;
  50. @Resource
  51. private CareEventOrderHandleHisService careEventOrderHandleHisService;
  52. @Resource
  53. private CareEventOrderKeyApplyService careEventOrderKeyApplyService;
  54. @Resource
  55. private CcCallResultService ccCallResultService;
  56. @Resource
  57. private CareHouseService careHouseService;
  58. @Resource
  59. private CareHouseContactService careHouseContactService;
  60. @Resource
  61. private CareOlderService careOlderService;
  62. @Resource
  63. private SmsSendService smsSendService;
  64. @Resource
  65. private BigScreenService bigScreenService;
  66. /**
  67. * 工单查询
  68. * @param orderStatus
  69. * @param olderName
  70. * @param loginUser
  71. * @param pageReqVo
  72. * @return
  73. */
  74. public IPage<EventOrderVO> listEvent(String orderStatus, String olderName, UserLogindConvertVO loginUser, PageReqVO pageReqVo) {
  75. IPage<CareEventOrder> page = new Page<>(pageReqVo.getCurrent(), pageReqVo.getPageSize());
  76. QueryWrapper<CareEventOrder> queryWrapper = new QueryWrapper<>();
  77. queryWrapper.lambda().eq(StrUtil.isNotEmpty(orderStatus),CareEventOrder::getStatus, orderStatus)
  78. .like(StrUtil.isNotEmpty(olderName),CareEventOrder::getOlderName,olderName)
  79. .eq(CareEventOrder::getOrgId,loginUser.getOrgId())
  80. .eq(loginUser.getStationId()!=null,CareEventOrder::getStationId,loginUser.getStationId())
  81. .orderByAsc(CareEventOrder::getCreateTime);
  82. IPage<CareEventOrder> pageRes = this.careEventOrderService.page(page, queryWrapper);
  83. IPage<EventOrderVO> results = new Page<>(pageRes.getCurrent(),pageRes.getSize(),pageRes.getTotal());
  84. if(CollUtil.isNotEmpty(pageRes.getRecords())){
  85. List<EventOrderVO> list = new ArrayList<>();
  86. pageRes.getRecords().forEach(item -> {
  87. EventOrderVO resVO = new EventOrderVO();
  88. BeanUtils.copyProperties(item,resVO);
  89. resVO.setOrderTypeName(OrderTypeEnum.getCodeToName(item.getOrderType()));
  90. resVO.setStatusName(OrderStatusEnum.getCodeToName(item.getStatus()));
  91. list.add(resVO);
  92. });
  93. results.setRecords(list);
  94. }
  95. return results;
  96. }
  97. /**
  98. * 我的处理事件 - 坐席
  99. *
  100. * @param orderStatus
  101. * @param olderName
  102. * @param loginUser
  103. * @param pageReqVo
  104. * @return
  105. */
  106. public IPage<EventOrderVO> listEvent4MyDo(String orderStatus, String olderName, UserLogindConvertVO loginUser, PageReqVO pageReqVo) {
  107. IPage<CareEventOrder> page = new Page<>(pageReqVo.getCurrent(), pageReqVo.getPageSize());
  108. QueryWrapper<CareEventOrder> queryWrapper = new QueryWrapper<>();
  109. queryWrapper.lambda().eq(StrUtil.isNotEmpty(orderStatus),CareEventOrder::getStatus, orderStatus)
  110. .like(StrUtil.isNotEmpty(olderName),CareEventOrder::getOlderName,olderName)
  111. .eq(CareEventOrder::getOrgId,loginUser.getOrgId())
  112. .eq(CareEventOrder::getSeatId,loginUser.getId())
  113. .orderByAsc(CareEventOrder::getModifyTime);
  114. IPage<CareEventOrder> pageRes = this.careEventOrderService.page(page, queryWrapper);
  115. IPage<EventOrderVO> results = new Page<>(pageRes.getCurrent(),pageRes.getSize(),pageRes.getTotal());
  116. if(CollUtil.isNotEmpty(pageRes.getRecords())){
  117. List<EventOrderVO> list = new ArrayList<>();
  118. pageRes.getRecords().forEach(item -> {
  119. EventOrderVO resVO = new EventOrderVO();
  120. BeanUtils.copyProperties(item,resVO);
  121. resVO.setOrderTypeName(OrderTypeEnum.getCodeToName(item.getOrderType()));
  122. resVO.setStatusName(OrderStatusEnum.getCodeToName(item.getStatus()));
  123. list.add(resVO);
  124. });
  125. results.setRecords(list);
  126. }
  127. return results;
  128. }
  129. /**
  130. * 处理工单
  131. * 使用分布式锁
  132. *
  133. * @param orderId
  134. * @param loginUser
  135. */
  136. public void receiveOrder(Long orderId, UserLogindConvertVO loginUser) {
  137. String key = RedisKeyConstant.DO_ORDER+":"+orderId;
  138. boolean result = redisUtil.tryLock(key,3000);
  139. try{
  140. if (result){
  141. CareEventOrder order = this.careEventOrderService.getById(orderId);
  142. //1.判断工单的状态,如果不是未处理状态,则不能处理
  143. if (OrderStatusEnum.TODO.getValue().equals(order.getStatus())){
  144. UpdateWrapper<CareEventOrder> updateWrapper = new UpdateWrapper<>();
  145. updateWrapper.lambda().eq(CareEventOrder::getId,orderId)
  146. .set(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue())
  147. .set(CareEventOrder::getSeatId,loginUser.getId())
  148. .set(CareEventOrder::getSeatName,loginUser.getName())
  149. .set(CareEventOrder::getModifyTime,DateUtil.date());
  150. this.careEventOrderService.update(updateWrapper);
  151. }else{
  152. throw new BDException("该工单状态已变化,请刷新");
  153. }
  154. }else {
  155. throw new BDException("该工单已经再被处理");
  156. }
  157. }finally {
  158. redisUtil.releaseLock(key);
  159. }
  160. }
  161. /**
  162. *
  163. * @param orderId
  164. * @return
  165. */
  166. public EventOrderVO getOrderInfo(Long orderId){
  167. EventOrderVO eventOrderVO = null;
  168. CareEventOrder order = this.careEventOrderService.getById(orderId);
  169. if (order!=null){
  170. eventOrderVO = new EventOrderVO();
  171. BeanUtil.copyProperties(order,eventOrderVO);
  172. eventOrderVO.setStatusName(OrderStatusEnum.getCodeToName(eventOrderVO.getStatus()));
  173. eventOrderVO.setOrderType(OrderTypeEnum.getCodeToName(eventOrderVO.getOrderType()));
  174. CareHouse house = this.careHouseService.getById(order.getHouseId());
  175. CareHouseVO houseVO = new CareHouseVO();
  176. BeanUtil.copyProperties(house,houseVO);
  177. houseVO.setRelationTypeDesc("屋主");
  178. eventOrderVO.setHouse(houseVO);
  179. }
  180. return eventOrderVO;
  181. }
  182. /**
  183. * 查询老人列表
  184. * @param orderId
  185. * @return
  186. */
  187. public List<OrderOlderVO> queryOrderOlderList(Long orderId){
  188. List<OrderOlderVO> orderOlderVOList = Lists.newArrayList();
  189. CareEventOrder order = this.careEventOrderService.getById(orderId);
  190. QueryWrapper<CareEventOrderOlder> queryWrapper = new QueryWrapper<>();
  191. queryWrapper.lambda().eq(CareEventOrderOlder::getOrderId,orderId);
  192. List<CareEventOrderOlder> ceoos = this.careEventOrderOlderService.list(queryWrapper);
  193. if (CollUtil.isNotEmpty(ceoos)){
  194. ChamberlainVO chamberlainVO = new ChamberlainVO();
  195. CareHouse house = this.careHouseService.getById(order.getHouseId());
  196. if (house!=null){
  197. CareSysUser user = this.careSysUserService.getById(house.getChambId());
  198. if (user!= null){
  199. BeanUtil.copyProperties(user,chamberlainVO);
  200. }
  201. }
  202. ceoos.forEach(item->{
  203. OrderOlderVO orderOlderVO = new OrderOlderVO();
  204. BeanUtil.copyProperties(item,orderOlderVO);
  205. orderOlderVO.setStatusDesc(OrderOlderStatusEnum.getCodeToName(orderOlderVO.getStatus()));
  206. orderOlderVO.setChamberlain(chamberlainVO);
  207. orderOlderVOList.add(orderOlderVO);
  208. });
  209. }
  210. return orderOlderVOList;
  211. }
  212. /**
  213. * 查询事件处理历史
  214. * @param orderId
  215. * @return
  216. */
  217. public List<OrderHandleHisVO> queryOrderHandleHis(Long orderId){
  218. List<OrderHandleHisVO> result = Lists.newArrayList();
  219. QueryWrapper<CareEventOrderHandleHis> queryWrapper = new QueryWrapper<>();
  220. queryWrapper.lambda().eq(CareEventOrderHandleHis::getOrderId,orderId)
  221. .orderByDesc(CareEventOrderHandleHis::getCreateTime);
  222. List<CareEventOrderHandleHis> datas = this.careEventOrderHandleHisService.list(queryWrapper);
  223. if (CollUtil.isNotEmpty(datas)){
  224. datas.forEach(item ->{
  225. OrderHandleHisVO hisVO = new OrderHandleHisVO();
  226. BeanUtil.copyProperties(item,hisVO);
  227. result.add(hisVO);
  228. });
  229. }
  230. return result;
  231. }
  232. /**
  233. * 查询工单的相关联系人
  234. * @param orderId
  235. * @return
  236. */
  237. public List<OrderContactorVO> queryContactList(Long orderId){
  238. List<OrderContactorVO> result = Lists.newArrayList();
  239. QueryWrapper<CareEventOrderContactStatus> queryWrapper = new QueryWrapper<>();
  240. queryWrapper.lambda().eq(CareEventOrderContactStatus::getOrderId,orderId).orderByAsc(CareEventOrderContactStatus::getContactLevel);
  241. List<CareEventOrderContactStatus> ceocs = this.careEventOrderContactStatusService.list(queryWrapper);
  242. if (CollUtil.isNotEmpty(ceocs)){
  243. ceocs.forEach(item -> {
  244. OrderContactorVO contactorVO = new OrderContactorVO();
  245. BeanUtil.copyProperties(item,contactorVO);
  246. contactorVO.setStatusDesc(ContactorStatusEnum.getCodeToName(item.getStatus()));
  247. result.add(contactorVO);
  248. });
  249. }
  250. return result;
  251. }
  252. /**
  253. * 更新工单状态
  254. * @param orderId
  255. * @param orderStatusEnum
  256. */
  257. public void updateOrderStatus(Long orderId,OrderStatusEnum orderStatusEnum){
  258. CareEventOrder order = this.careEventOrderService.getById(orderId);
  259. UpdateWrapper<CareEventOrder> updateWrapper = new UpdateWrapper<>();
  260. updateWrapper.lambda().eq(CareEventOrder::getId,orderId)
  261. .set(CareEventOrder::getStatus,orderStatusEnum.getValue())
  262. .set(CareEventOrder::getModifyTime,DateUtil.date());
  263. this.careEventOrderService.update(updateWrapper);
  264. this.bigScreenService.pushRtEventFlag(order.getStationId().toString());
  265. }
  266. /**
  267. * 获取钥匙请求历史
  268. * @param orderId
  269. * @return
  270. */
  271. public List<OrderKeyApplyVO> queryKeyAuthList(Long orderId){
  272. List<OrderKeyApplyVO> result = Lists.newArrayList();
  273. QueryWrapper<CareEventOrderKeyApply> queryWrapper = new QueryWrapper<>();
  274. queryWrapper.lambda().eq(CareEventOrderKeyApply::getOrderId,orderId).orderByDesc(CareEventOrderKeyApply::getCreateTime);
  275. List<CareEventOrderKeyApply> ceocs = this.careEventOrderKeyApplyService.list(queryWrapper);
  276. if (CollUtil.isNotEmpty(ceocs)){
  277. ceocs.forEach(item -> {
  278. OrderKeyApplyVO keyApplyVO = new OrderKeyApplyVO();
  279. BeanUtil.copyProperties(item,keyApplyVO);
  280. result.add(keyApplyVO);
  281. });
  282. }
  283. return result;
  284. }
  285. /**
  286. * 钥匙授权
  287. * @param applyId
  288. * @return
  289. */
  290. public boolean keyAuth(Long applyId ,UserLogindConvertVO loginUser){
  291. CareEventOrderKeyApply apply = this.careEventOrderKeyApplyService.getById(applyId);
  292. UpdateWrapper<CareEventOrderKeyApply> updateWrapper = new UpdateWrapper<>();
  293. updateWrapper.lambda().eq(CareEventOrderKeyApply::getId,applyId)
  294. .set(CareEventOrderKeyApply::getStatus,KeyAuthEnum.AUTHED.getValue());
  295. //TODO 增加日志
  296. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  297. his.setOrgId(apply.getOrgId());
  298. his.setStationId(apply.getStationId());
  299. his.setOrderId(apply.getOrderId());
  300. his.setLogType(LogTypeEnum.KEY.getValue());
  301. his.setLogObjectId(apply.getApplyUserId());
  302. his.setLogObjectName(apply.getApplyUserName());
  303. his.setLogResult("获得钥匙");
  304. his.setOpUserRole(UserRoleEnum.SEAT.getValue());
  305. his.setOpUserId(loginUser.getId());
  306. his.setOpUserName(loginUser.getName());
  307. his.setCreateTime(DateUtil.date());
  308. his.setRelationTypeDesc(apply.getRelationTypeDesc());
  309. this.careEventOrderHandleHisService.save(his);
  310. return this.careEventOrderKeyApplyService.update(updateWrapper);
  311. }
  312. /**
  313. * 修改联系人状态
  314. * @param orderContactId
  315. * @param status
  316. * @return
  317. */
  318. public boolean updateOrderContactStatus(Long orderContactId,Integer status,UserLogindConvertVO loginUser){
  319. CareEventOrderContactStatus contact = this.careEventOrderContactStatusService.getById(orderContactId);
  320. UpdateWrapper<CareEventOrderContactStatus> updateWrapper = new UpdateWrapper<>();
  321. updateWrapper.lambda().eq(CareEventOrderContactStatus::getId,orderContactId)
  322. .set(CareEventOrderContactStatus::getStatus,status);
  323. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  324. his.setOrgId(contact.getOrgId());
  325. his.setStationId(contact.getStationId());
  326. his.setOrderId(contact.getOrderId());
  327. his.setLogType(LogTypeEnum.OUT_CALL.getValue());
  328. his.setLogObjectId(contact.getContactId());
  329. his.setLogObjectName(contact.getContactName());
  330. his.setLogResult(ContactorStatusEnum.getCodeToName(status));
  331. his.setOpUserRole(UserRoleEnum.SEAT.getValue());
  332. his.setOpUserId(loginUser.getId());
  333. his.setOpUserName(loginUser.getName());
  334. his.setCreateTime(DateUtil.date());
  335. his.setRelationTypeDesc(contact.getRelationTypeDesc());
  336. this.careEventOrderHandleHisService.save(his);
  337. return this.careEventOrderContactStatusService.update(updateWrapper);
  338. }
  339. /**
  340. * 获取通话结果
  341. * @param hisId
  342. */
  343. public CcCallResultVO getCallRadio(Long hisId){
  344. CareEventOrderHandleHis his = this.careEventOrderHandleHisService.getById(hisId);
  345. if (his.getCallResultId()!= null){
  346. return this.ccCallResultService.getCallResult(his.getCallResultId());
  347. }else {
  348. return null;
  349. }
  350. }
  351. public void insertTestData(){
  352. List<CareHouse> houses = Lists.newArrayList();
  353. CareHouse house = new CareHouse();
  354. house.setId(1L);
  355. house.setName("201室");
  356. house.setAddr("北太平庄21号院1单元201室");
  357. houses.add(house);
  358. CareEventOrder order = new CareEventOrder();
  359. order.setOrgId(1L);
  360. order.setOrgName("测试机构");
  361. order.setStationId(1L);
  362. order.setStationName("站点1");
  363. order.setHouseId(1L);
  364. order.setDevId(1L);
  365. order.setDevName("卧室");
  366. order.setHouseName(house.getName());
  367. order.setTitle(house.getAddr());
  368. order.setOrderType(OrderTypeEnum.values()[RandomUtil.randomInt(0,4)].getValue());
  369. order.setStatus("0");
  370. order.setCreateTime(DateUtil.date());
  371. order.setModifyTime(DateUtil.date());
  372. this.careEventOrderService.saveOrder(order);
  373. }
  374. /**
  375. * 发送短信接口
  376. * @param orderContactId
  377. * @return
  378. */
  379. public boolean sendSmsToLianxiren(Long orderContactId){
  380. CareEventOrderContactStatus contactStatus = this.careEventOrderContactStatusService.getById(orderContactId);
  381. if (contactStatus!=null){
  382. CareHouse house = this.careHouseService.getById(contactStatus.getHouseId());
  383. boolean smsResult = smsSendService.sendSmsToLianxiren(contactStatus.getContactPhone(),house.getName());
  384. if (smsResult){
  385. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  386. his.setOrgId(contactStatus.getOrgId());
  387. his.setStationId(contactStatus.getStationId());
  388. his.setOrderId(contactStatus.getOrderId());
  389. his.setLogType(LogTypeEnum.SMS.getValue());
  390. his.setLogObjectId(contactStatus.getContactId());
  391. his.setLogObjectName(contactStatus.getContactName());
  392. his.setLogResult("短信通知");
  393. his.setOpUserRole(UserRoleEnum.SEAT.getValue());
  394. his.setCreateTime(DateUtil.date());
  395. his.setRelationTypeDesc(contactStatus.getRelationTypeDesc());
  396. this.careEventOrderHandleHisService.save(his);
  397. return true;
  398. }else {
  399. return false;
  400. }
  401. }else{
  402. return false;
  403. }
  404. }
  405. /**
  406. * 统计机构下的事件数量
  407. * @param loginUser
  408. * @return
  409. */
  410. public EventStaVO statOrder(UserLogindConvertVO loginUser) {
  411. return this.careEventOrderService.statOrder(loginUser.getOrgId(),null);
  412. }
  413. /**
  414. * 查询管家
  415. * @param orderId
  416. * @return
  417. */
  418. public CareEventOrderChamb queryChamberlain(Long orderId){
  419. CareEventOrderChamb data = new CareEventOrderChamb();
  420. QueryWrapper<CareEventOrderChamb> queryWrapper = new QueryWrapper<>();
  421. queryWrapper.lambda().eq(CareEventOrderChamb::getOrderId,orderId);
  422. List<CareEventOrderChamb> datas = this.careEventOrderChambService.list(queryWrapper);
  423. if (CollUtil.isNotEmpty(datas)){
  424. data = datas.get(0);
  425. }
  426. return data ;
  427. }
  428. public String getSmsTemplate(Long orderId){
  429. CareEventOrder order = this.careEventOrderService.getById(orderId);
  430. if (order!=null){
  431. CareHouse house = this.careHouseService.getById(order.getHouseId());
  432. return house.getName()+"的老人发生跌倒/久滞事情";
  433. }
  434. return null;
  435. }
  436. }