KeeperOrderApiService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. package com.care.keeper.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.date.DateUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.care.common.cache.RedisKeyConstant;
  9. import com.care.common.cache.RedisUtil;
  10. import com.care.common.entity.*;
  11. import com.care.common.enums.*;
  12. import com.care.common.exception.BDException;
  13. import com.care.common.service.*;
  14. import com.care.common.vo.PageReqVO;
  15. import com.care.common.vo.order.*;
  16. import com.care.keeper.vo.HouseContactVO;
  17. import com.care.keeper.vo.KeeperInfoVO;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.commons.compress.utils.Lists;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import javax.annotation.Resource;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.List;
  26. /**
  27. * @Author: lilt
  28. * @Date: 2021/6/7
  29. * @Desc:
  30. */
  31. @Slf4j
  32. @Service
  33. public class KeeperOrderApiService {
  34. @Resource
  35. private CareDeviceService careDeviceService;
  36. @Resource
  37. private CareHouseContactService careHouseContactService;
  38. @Resource
  39. private CareEventOrderService careEventOrderService;
  40. @Resource
  41. private CareEventOrderHandleHisService careEventOrderHandleHisService;
  42. @Resource
  43. private CareSysUserService careSysUserService;
  44. @Resource
  45. private CareEventOrderChambService careEventOrderChambService;
  46. @Resource
  47. private CareEventOrderOlderService careEventOrderOlderService;
  48. @Resource
  49. private CareEventOrderKeyApplyService careEventOrderKeyApplyService;
  50. @Resource
  51. private CareHouseContactRelService careHouseContactRelService;
  52. @Resource
  53. RedisUtil redisUtil;
  54. /**
  55. * 待处理的工单
  56. *
  57. * @param pageReqVo
  58. * @param chambId
  59. * @return
  60. */
  61. public IPage<ChambEventOrderVO> queryTodoEventByChambId(PageReqVO pageReqVo, Long chambId) {
  62. return this.careEventOrderChambService.queryTodoEventByChambId(pageReqVo,chambId);
  63. }
  64. /**
  65. * 进行中的工单
  66. *
  67. * @param pageReqVo
  68. * @param chambId
  69. * @return
  70. */
  71. public IPage<ChambEventOrderVO> queryDoingEventByChambId(PageReqVO pageReqVo, Long chambId) {
  72. return this.careEventOrderChambService.queryDoingEventByChambId(pageReqVo,chambId);
  73. }
  74. /**
  75. * 完成的工单
  76. *
  77. * @param pageReqVo
  78. * @param chambId
  79. * @return
  80. */
  81. public IPage<ChambEventOrderVO> queryDoneEventByChambId(PageReqVO pageReqVo, Long chambId) {
  82. return this.careEventOrderChambService.queryDoneEventByChambId(pageReqVo,chambId);
  83. }
  84. public ChambEventOrderVO getChambOrder(Long id){
  85. CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(id);
  86. ChambEventOrderVO chambEventOrderVO = new ChambEventOrderVO();
  87. BeanUtil.copyProperties(orderChamb,chambEventOrderVO);
  88. return chambEventOrderVO;
  89. }
  90. /**
  91. * 事件详情
  92. * @param orderId
  93. * @return
  94. */
  95. public EventOrderVO getEventInfo(Long orderId){
  96. CareEventOrder eventOrder = this.careEventOrderService.getById(orderId);
  97. EventOrderVO vo = new EventOrderVO();
  98. BeanUtil.copyProperties(eventOrder,vo);
  99. vo.setOrderTypeName(OrderTypeEnum.getCodeToName(vo.getOrderType()));
  100. return vo;
  101. }
  102. /**
  103. * 主管家改派管家列表查询
  104. * @param orderId
  105. * @return
  106. */
  107. public List<ChamberlainVO> queryChambList(Long orderId){
  108. List<ChamberlainVO> chambList = new ArrayList<>();
  109. ChamberlainVO mainVO = null;
  110. ChamberlainVO assignVO = null;
  111. CareEventOrder order = this.careEventOrderService.getById(orderId);
  112. CareDevice dev = this.careDeviceService.getById(order.getDevId());
  113. if(dev != null){
  114. CareSysUser careSysUser = this.careSysUserService.getById(dev.getChambId());
  115. if (careSysUser != null) {
  116. mainVO = new ChamberlainVO();
  117. BeanUtil.copyProperties(careSysUser,mainVO);
  118. mainVO.setIsMain(TrueFalseEnum.TRUE.getValue());
  119. mainVO.setStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getStatus()));
  120. }
  121. }
  122. CareEventOrderChamb careEventOrderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderId);
  123. if(careEventOrderChamb != null) {
  124. CareSysUser careSysUser = this.careSysUserService.getById(careEventOrderChamb.getChambId());
  125. if(careSysUser != null){
  126. assignVO = new ChamberlainVO();
  127. BeanUtil.copyProperties(careSysUser,assignVO);
  128. assignVO.setIsMain(TrueFalseEnum.FALSE.getValue());
  129. assignVO.setStatusDesc(ChambStatusEnum.getCodeToName(mainVO.getStatus()));
  130. }
  131. }
  132. if (mainVO != null && assignVO != null) {
  133. if(mainVO.getId().equals(assignVO.getId())){ //没有指派管家
  134. if(ChambStatusEnum.BUSY.getValue().equals(mainVO.getStatus())){ //主状态是忙碌时拆分子状态
  135. if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){
  136. mainVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中
  137. } else {
  138. mainVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌
  139. }
  140. } else {//主状态不是忙碌时设置子状态和主状态相同
  141. mainVO.setSubStatus(mainVO.getStatus());
  142. }
  143. mainVO.setSubStatusDesc(ChambSubStatusEnum.getCodeToName(mainVO.getSubStatus()));
  144. chambList.add(mainVO);
  145. } else{ //指派了管家
  146. //设置主管家子状态和主状态相同:空闲、休假、忙碌
  147. mainVO.setSubStatus(mainVO.getStatus());
  148. //设置指派管家状态
  149. if(ChambStatusEnum.BUSY.getValue().equals(assignVO.getStatus())) { //指派管家的主状态是忙碌时拆分子状态
  150. if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){
  151. assignVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中
  152. } else {
  153. assignVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌
  154. }
  155. } else {//指派管家的主状态不是忙碌时设置子状态和主状态相同
  156. assignVO.setSubStatus(assignVO.getStatus());
  157. }
  158. mainVO.setSubStatusDesc(ChambSubStatusEnum.getCodeToName(mainVO.getSubStatus()));
  159. chambList.add(mainVO);
  160. assignVO.setSubStatusDesc(ChambSubStatusEnum.getCodeToName(assignVO.getSubStatus()));
  161. chambList.add(assignVO);
  162. }
  163. } else if(mainVO == null && assignVO != null) {
  164. //设置指派管家状态
  165. if(ChambStatusEnum.BUSY.getValue().equals(assignVO.getStatus())) { //指派管家的主状态是忙碌时拆分子状态
  166. if(ChambOrderStatusEnum.DOING.getValue().equals(careEventOrderChamb.getStatus())){
  167. assignVO.setSubStatus(ChambSubStatusEnum.DOING.getValue());//处理中
  168. } else {
  169. assignVO.setSubStatus(ChambSubStatusEnum.BUSY.getValue());//忙碌
  170. }
  171. } else {//指派管家的主状态不是忙碌时设置子状态和主状态相同
  172. assignVO.setSubStatus(assignVO.getStatus());
  173. }
  174. assignVO.setSubStatusDesc(ChambSubStatusEnum.getCodeToName(assignVO.getSubStatus()));
  175. chambList.add(assignVO);
  176. }
  177. return chambList;
  178. }
  179. /**
  180. * 查询工单对应的老人列表
  181. * @param orderId
  182. * @return
  183. */
  184. public List<OrderOlderVO> queryOrderOlderList(Long orderId){
  185. List<OrderOlderVO> orderOlderVOList = Lists.newArrayList();
  186. QueryWrapper<CareEventOrderOlder> queryWrapper = new QueryWrapper<>();
  187. queryWrapper.lambda().eq(CareEventOrderOlder::getOrderId,orderId);
  188. List<CareEventOrderOlder> ceoos = this.careEventOrderOlderService.list(queryWrapper);
  189. if (CollUtil.isNotEmpty(ceoos)){
  190. ceoos.forEach(item->{
  191. OrderOlderVO orderOlderVO = new OrderOlderVO();
  192. BeanUtil.copyProperties(item,orderOlderVO);
  193. orderOlderVO.setStatusDesc(OrderOlderStatusEnum.getCodeToName(orderOlderVO.getStatus()));
  194. orderOlderVOList.add(orderOlderVO);
  195. });
  196. }
  197. return orderOlderVOList;
  198. }
  199. /**
  200. * 查询事件紧急联系人
  201. * @param orderId
  202. * @return
  203. */
  204. public List<HouseContactVO> queryContactByOrderId(Long orderId){
  205. List<HouseContactVO> vos = Lists.newArrayList();
  206. CareEventOrder order = this.careEventOrderService.getById(orderId);
  207. QueryWrapper<CareHouseContactRel> queryWrapper = new QueryWrapper<>();
  208. queryWrapper.lambda().eq(CareHouseContactRel::getHouseId, order.getHouseId());
  209. List<CareHouseContactRel> contactRelss = this.careHouseContactRelService.list(queryWrapper);
  210. if (CollUtil.isNotEmpty(contactRelss)){
  211. contactRelss.forEach(item -> {
  212. CareHouseContact careHouseContact = careHouseContactService.getById(item.getContactId());
  213. HouseContactVO vo = new HouseContactVO();
  214. BeanUtil.copyProperties(careHouseContact,vo);
  215. vo.setRelationTypeDesc(RelationTypeEnum.getCodeToName(vo.getRelationType()));
  216. vos.add(vo);
  217. });
  218. }
  219. List<HouseContactVO> vosNew = CollUtil.sortByProperty(vos,"contactLevel");
  220. return vosNew;
  221. }
  222. /**
  223. * 钥匙信息
  224. * @param orderId
  225. * @param keeperId
  226. * @return
  227. */
  228. public OrderKeyApplyVO getApplyKeyInfo(Long orderId,Long keeperId ){
  229. QueryWrapper<CareEventOrderKeyApply> queryWrapper = new QueryWrapper<>();
  230. queryWrapper.lambda().eq(CareEventOrderKeyApply::getOrderId,orderId).eq(CareEventOrderKeyApply::getApplyRole,UserRoleEnum.CHANMB.getValue())
  231. .eq(CareEventOrderKeyApply::getApplyUserId,keeperId);
  232. List<CareEventOrderKeyApply> datas = this.careEventOrderKeyApplyService.list(queryWrapper);
  233. if (CollUtil.isNotEmpty(datas)){
  234. OrderKeyApplyVO keyApplyVO = new OrderKeyApplyVO();
  235. BeanUtil.copyProperties(datas.get(0),keyApplyVO);
  236. return keyApplyVO;
  237. }else {
  238. return null;
  239. }
  240. }
  241. /**
  242. * 申请钥匙
  243. * @param orderId
  244. * @param keeperInfoVO
  245. * @return
  246. */
  247. public boolean applyKey(Long orderId,KeeperInfoVO keeperInfoVO){
  248. String key = RedisKeyConstant.KEY_APPLY_LOCAK+":"+keeperInfoVO.getId();
  249. boolean result = redisUtil.tryLock(key,3000);
  250. Date date = DateUtil.date();
  251. boolean flag =false;
  252. try{
  253. if (result){
  254. CareEventOrder order = this.careEventOrderService.getById(orderId);
  255. CareEventOrderKeyApply keyApply = new CareEventOrderKeyApply();
  256. keyApply.setOrgId(order.getOrgId());
  257. keyApply.setStationId(order.getStationId());
  258. keyApply.setHouseId(order.getHouseId());
  259. keyApply.setOrderId(orderId);
  260. keyApply.setApplyRole(UserRoleEnum.CHANMB.getValue());
  261. keyApply.setApplyUserId(keeperInfoVO.getId());
  262. keyApply.setApplyUserName(keeperInfoVO.getName());
  263. keyApply.setStatus(KeyAuthEnum.TODO.getValue());
  264. keyApply.setCreateTime(date);
  265. keyApply.setModifyTime(date);
  266. keyApply.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName());
  267. flag = this.careEventOrderKeyApplyService.save(keyApply);
  268. if (flag){
  269. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  270. his.setOrgId(keyApply.getOrgId());
  271. his.setStationId(keyApply.getStationId());
  272. his.setOrderId(keyApply.getOrderId());
  273. his.setLogType(LogTypeEnum.KEY.getValue());
  274. his.setLogObjectId(keyApply.getApplyUserId());
  275. his.setLogObjectName(keyApply.getApplyUserName());
  276. his.setLogResult("申请钥匙");
  277. his.setOpUserRole(UserRoleEnum.SEAT.getValue());
  278. his.setOpUserId(keyApply.getApplyUserId());
  279. his.setOpUserName(keyApply.getApplyUserName());
  280. his.setCreateTime(date);
  281. his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName());
  282. this.careEventOrderHandleHisService.save(his);
  283. }
  284. }else {
  285. throw new BDException("已经申请,请勿重复申请");
  286. }
  287. }finally {
  288. redisUtil.releaseLock(key);
  289. }
  290. return flag;
  291. }
  292. /**
  293. * 到达确认
  294. * @param orderChambId
  295. * @return
  296. */
  297. @Transactional(rollbackFor = Exception.class)
  298. public boolean daoDaConfirm(Long orderChambId){
  299. boolean flag = false;
  300. CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderChambId);
  301. Date date = DateUtil.date();
  302. UpdateWrapper<CareEventOrderChamb> updateWrapper = new UpdateWrapper<>();
  303. updateWrapper.lambda().eq(CareEventOrderChamb::getId,orderChamb.getId())
  304. .set(CareEventOrderChamb::getStatus,ChambOrderStatusEnum.DOING.getValue())
  305. .set(CareEventOrderChamb::getDaodaTime,date)
  306. .set(CareEventOrderChamb::getModifyTime,date);
  307. flag = this.careEventOrderChambService.update(updateWrapper);
  308. if (flag){
  309. UpdateWrapper<CareSysUser> updateWrapper2 = new UpdateWrapper<>();
  310. updateWrapper2.lambda().eq(CareSysUser::getId,orderChamb.getChambId())
  311. .set(CareSysUser::getStatus,ChambStatusEnum.BUSY.getValue())
  312. .set(CareSysUser::getModifyTime,date);
  313. this.careSysUserService.update(updateWrapper2);
  314. //保存日志
  315. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  316. his.setOrgId(orderChamb.getOrgId());
  317. his.setStationId(orderChamb.getStationId());
  318. his.setOrderId(orderChamb.getOrderId());
  319. his.setLogType(LogTypeEnum.CHAMB.getValue());
  320. his.setLogObjectId(orderChamb.getId());
  321. his.setLogObjectName(orderChamb.getChambName());
  322. his.setLogResult("已到达");
  323. his.setOpUserRole(UserRoleEnum.CHANMB.getValue());
  324. his.setOpUserId(orderChamb.getChambId());
  325. his.setOpUserName(orderChamb.getChambName());
  326. his.setCreateTime(date);
  327. his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName());
  328. this.careEventOrderHandleHisService.save(his);
  329. }
  330. return flag;
  331. }
  332. /**
  333. * 离开确认
  334. * @param orderChambId
  335. * @return
  336. */
  337. @Transactional(rollbackFor = Exception.class)
  338. public boolean liKaiConfirm(Long orderChambId,String remark,String scenePic){
  339. boolean flag = false;
  340. CareEventOrderChamb orderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderChambId);
  341. Date date = DateUtil.date();
  342. UpdateWrapper<CareEventOrderChamb> updateWrapper = new UpdateWrapper<>();
  343. updateWrapper.lambda().eq(CareEventOrderChamb::getId,orderChamb.getId())
  344. .set(CareEventOrderChamb::getRemark,remark)
  345. .set(CareEventOrderChamb::getScenePic,scenePic)
  346. .set(CareEventOrderChamb::getLikaiTime,date)
  347. .set(CareEventOrderChamb::getStatus,ChambOrderStatusEnum.COMPLETE.getValue())
  348. .set(CareEventOrderChamb::getModifyTime,date);
  349. flag = this.careEventOrderChambService.update(updateWrapper);
  350. if (flag){
  351. UpdateWrapper<CareSysUser> updateWrapper2 = new UpdateWrapper<>();
  352. updateWrapper2.lambda().eq(CareSysUser::getId,orderChamb.getChambId())
  353. .set(CareSysUser::getStatus,ChambStatusEnum.FREE.getValue())
  354. .set(CareSysUser::getModifyTime,date);
  355. this.careSysUserService.update(updateWrapper2);
  356. //保存日志
  357. CareEventOrderHandleHis his = new CareEventOrderHandleHis();
  358. his.setOrgId(orderChamb.getOrgId());
  359. his.setStationId(orderChamb.getStationId());
  360. his.setOrderId(orderChamb.getOrderId());
  361. his.setLogType(LogTypeEnum.CHAMB.getValue());
  362. his.setLogObjectId(orderChamb.getId());
  363. his.setLogObjectName(orderChamb.getChambName());
  364. his.setLogResult("已离开");
  365. his.setOpUserRole(UserRoleEnum.CHANMB.getValue());
  366. his.setOpUserId(orderChamb.getChambId());
  367. his.setOpUserName(orderChamb.getChambName());
  368. his.setCreateTime(date);
  369. his.setRelationTypeDesc(RelationTypeEnum.CHANMB.getName());
  370. this.careEventOrderHandleHisService.save(his);
  371. }
  372. return flag;
  373. }
  374. /**
  375. * 获取处理记录
  376. * @return
  377. */
  378. public List<OrderHandleHisVO> queryOrderHandleHis(Long orderId){
  379. List<OrderHandleHisVO> result = Lists.newArrayList();
  380. QueryWrapper<CareEventOrderHandleHis> queryWrapper = new QueryWrapper<>();
  381. queryWrapper.select("distinct org_id,station_id,house_id,order_id,log_type,order_type,log_object_id,log_object_name,log_result," +
  382. "op_user_role,op_user_id,op_user_name,create_time,relation_type_desc,call_result_id").lambda().eq(CareEventOrderHandleHis::getOrderId,orderId)
  383. .orderByDesc(CareEventOrderHandleHis::getCreateTime);
  384. List<CareEventOrderHandleHis> datas = this.careEventOrderHandleHisService.list(queryWrapper);
  385. if (CollUtil.isNotEmpty(datas)){
  386. datas.forEach(item ->{
  387. OrderHandleHisVO hisVO = new OrderHandleHisVO();
  388. BeanUtil.copyProperties(item,hisVO);
  389. result.add(hisVO);
  390. });
  391. }
  392. return result;
  393. }
  394. /**
  395. * 管家工单统计
  396. * @param chambId
  397. * @return
  398. */
  399. public ChambEventOrderCountVO getOrderCountByChambId(Long chambId){
  400. return this.careEventOrderChambService.getOrderCountByChambId(chambId);
  401. }
  402. }