DbStockController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package com.zd.airbottle.controller;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.zd.airbottle.domain.DbBeacon;
  6. import com.zd.airbottle.domain.DbInOutRecord;
  7. import com.zd.airbottle.domain.DbStock;
  8. import com.zd.airbottle.domain.DbUsageRecord;
  9. import com.zd.airbottle.domain.bo.DbStockBo;
  10. import com.zd.airbottle.domain.bo.DbStockParam;
  11. import com.zd.airbottle.domain.vo.DbStockVo;
  12. import com.zd.airbottle.service.DbBeaconService;
  13. import com.zd.airbottle.service.DbInOutRecordService;
  14. import com.zd.airbottle.service.DbStockService;
  15. import com.zd.airbottle.service.DbUsageRecordService;
  16. import com.zd.airbottle.utils.PageUtil;
  17. import com.zd.common.core.annotation.Log;
  18. import com.zd.common.core.log.BusinessType;
  19. import com.zd.common.core.redis.RedisService;
  20. import com.zd.common.core.security.TokenService;
  21. import com.zd.common.core.utils.StringUtils;
  22. import com.zd.common.core.web.controller.AbstractController;
  23. import com.zd.laboratory.api.dto.CheckSubjectDto;
  24. import com.zd.laboratory.api.feign.RemoteLaboratoryService;
  25. import com.zd.model.constant.BaseConstants;
  26. import com.zd.model.constant.HttpStatus;
  27. import com.zd.model.domain.ResultData;
  28. import io.swagger.annotations.Api;
  29. import io.swagger.annotations.ApiOperation;
  30. import org.springframework.beans.BeanUtils;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.web.bind.annotation.*;
  33. import java.time.LocalDateTime;
  34. import java.util.*;
  35. import java.util.concurrent.TimeUnit;
  36. import java.util.stream.Collectors;
  37. /**
  38. * @Description 东北大学库存
  39. * @Author hzw
  40. * @Date 2023/10/16 17:50
  41. * @Version 2.0
  42. */
  43. @Api(tags = "东北大学库存")
  44. @RestController
  45. @RequestMapping("/stock")
  46. public class DbStockController extends AbstractController {
  47. @Autowired
  48. private DbStockService dbStockService;
  49. @Autowired
  50. private DbBeaconService dbBeaconService;
  51. @Autowired
  52. private DbInOutRecordService dbInOutRecordService;
  53. @Autowired
  54. private DbUsageRecordService dbUsageRecordService;
  55. @Autowired
  56. private RemoteLaboratoryService remoteLaboratoryService;
  57. @Autowired
  58. private TokenService tokenService;
  59. @Autowired
  60. private static RedisService redisService;
  61. /**
  62. * 库存入库
  63. *
  64. * @param dbStockBo
  65. * @return
  66. */
  67. @ApiOperation(value = "库存入库", notes = "参数说明:gasName 气体名称,level 级别,size 规格,gasComposition 气体成分,bottleColour 气瓶颜色,handwheel 手轮(0否 1是),fixed 固定(0否 1是),statusLabel 状态标牌(0否 1是),electronicTag 电子标签(0否 1是),gasPressure 气体压力,validPeriod 有效期限,beaconTag 信标标签,subjectId 实验室id,subjectName 实验室名称,remark 备注 ")
  68. @PostMapping(value = "/enter")
  69. public ResultData in(@RequestBody DbStockBo dbStockBo) {
  70. //参数检查
  71. paramCheck.notNull(dbStockBo).strNotEmpty(dbStockBo.getGasName()).notNull(dbStockBo.getBeaconTag()).notNull(dbStockBo.getSubjectId());
  72. //验证信标
  73. long count1 = dbStockService.count(new LambdaQueryWrapper<DbStock>().eq(DbStock::getBeaconTag, dbStockBo.getBeaconTag()));
  74. if (count1 > 0) {
  75. return ResultData.success("当前信标已绑定!");
  76. }
  77. //查询实验室所在学院
  78. ResultData<List<CheckSubjectDto>> resultData = remoteLaboratoryService.findSubjectInfoList(String.valueOf(dbStockBo.getSubjectId()));
  79. if (resultData != null && HttpStatus.SUCCESS == resultData.getCode()) {
  80. List<CheckSubjectDto> data = resultData.getData();
  81. dbStockBo.setCollegeId(data.get(0).getDeptId());
  82. dbStockBo.setCollegeName(data.get(0).getCollegeName());
  83. dbStockBo.setRoomNum(data.get(0).getRoomNumber());
  84. }
  85. DbStock dbStock = new DbStock();
  86. BeanUtils.copyProperties(dbStockBo, dbStock);
  87. dbStock.setCreateBy(getCurrentUserId());
  88. dbStock.setCreateName(getCurrentUserName());
  89. if (dbStockService.save(dbStock)) {
  90. DbInOutRecord dbInOutRecord = new DbInOutRecord();
  91. BeanUtils.copyProperties(dbStockBo, dbInOutRecord);
  92. dbInOutRecord.setType(1);
  93. dbInOutRecord.setPhone(tokenService.getLoginUser().getSysUser().getPhonenumber());
  94. dbInOutRecordService.save(dbInOutRecord);
  95. dbBeaconService.update(new LambdaUpdateWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbInOutRecord.getBeaconTag()).set(DbBeacon::getState, Boolean.TRUE).set(DbBeacon::getBindingTime, LocalDateTime.now()));
  96. //todo 重新加载入库的信标到redis chai
  97. new Thread(()->loadBeaconDate(dbStock)).start();
  98. return ResultData.success("操作成功");
  99. }
  100. return ResultData.fail("操作失败");
  101. }
  102. /**
  103. * 库存出库
  104. *
  105. * @param dbStockBo
  106. * @return
  107. */
  108. @ApiOperation(value = "库存出库", notes = "参数说明:id 必填 ")
  109. @PostMapping(value = "/out")
  110. public ResultData out(@RequestBody DbStockBo dbStockBo) {
  111. //参数检查
  112. paramCheck.notNull(dbStockBo).notNull(dbStockBo.getId());
  113. DbStock stock = dbStockService.getById(dbStockBo.getId());
  114. if (dbStockService.removeById(stock.getId())) {
  115. DbInOutRecord dbInOutRecord = new DbInOutRecord();
  116. BeanUtils.copyProperties(stock, dbInOutRecord);
  117. dbInOutRecord.setType(2);
  118. dbInOutRecordService.save(dbInOutRecord);
  119. dbBeaconService.update(new LambdaUpdateWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbInOutRecord.getBeaconTag()).set(DbBeacon::getState, 0));
  120. //todo 重新加载入库的信标到redis chai
  121. new Thread(()->remBeaconDate(stock)).start();
  122. return ResultData.success("出库成功");
  123. }
  124. return ResultData.fail("出库失败");
  125. }
  126. /**
  127. * 更新库存信息
  128. *
  129. * @Param [dbStockBo]
  130. * @Return com.zd.model.domain.ResultData
  131. **/
  132. @ApiOperation(value = "更新库存信息", notes = "参数说明:id 必填,gasName 气体名称,level 级别,size 规格,gasComposition 气体成分,bottleColour 气瓶颜色,handwheel 手轮(0否 1是),fixed 固定(0否 1是),statusLabel 状态标牌(0否 1是),electronicTag 电子标签(0否 1是),gasPressure 气体压力,validPeriod 有效期限,beaconTag 信标标签,subjectId 实验室id,subjectName 实验室名称,remark 备注 ")
  133. @Log(title = "更新库存信息", businessType = BusinessType.UPDATE)
  134. @PostMapping(value = "/update")
  135. public ResultData update(@RequestBody DbStockBo dbStockBo) {
  136. //参数检查
  137. paramCheck.notNull(dbStockBo).notNull(dbStockBo.getId()).notNull(dbStockBo.getBeaconTag());
  138. long count = dbStockService.count(new LambdaQueryWrapper<DbStock>().ne(DbStock::getBeaconTag, dbStockBo.getBeaconTag()).eq(DbStock::getBeaconTag, dbStockBo.getBeaconTag()));
  139. if (count > 0) {
  140. return ResultData.success("信标标签已存在!");
  141. }
  142. //将旧的信标从redis中移除 chai
  143. DbStock oldDbStock = dbStockService.getById(dbStockBo.getId());
  144. if (dbStockService.update(new LambdaUpdateWrapper<DbStock>().eq(DbStock::getId, dbStockBo.getId()).set(DbStock::getBeaconTag, dbStockBo.getBeaconTag()))) {
  145. redisService.deleteObject(BaseConstants.BEACON_MATE_DET+"~"+ oldDbStock.getBeaconTag()+"~"+oldDbStock.getSubjectId()+"~"+oldDbStock.getGasName());
  146. //先把对应的信标提示语撤销
  147. List <Map<String,Object>> beaconNoticeList = redisService.getCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+oldDbStock.getSubjectId());
  148. List <Map<String,Object>> newNoticeList = new ArrayList <>();
  149. if(beaconNoticeList!=null){
  150. newNoticeList.addAll(beaconNoticeList);
  151. }
  152. //todo 循环信标通知,修改的信标提示语移除。
  153. if(beaconNoticeList != null){
  154. for(Map notice:beaconNoticeList){
  155. if(notice.get("beaconTag").equals(oldDbStock.getBeaconTag())){
  156. log.info("=====================================》移除返回来的信标提示语:"+notice);
  157. newNoticeList.remove(notice);
  158. }
  159. }
  160. }
  161. //下发通知,告诉前端页面,查询redis获取相关信息
  162. if(beaconNoticeList!=null && beaconNoticeList.size()!=newNoticeList.size()){
  163. //判断通知消息集合有数据,说明信标有变动,需要重新变更加通知
  164. redisService.setCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+ oldDbStock.getSubjectId(),newNoticeList, 30L, TimeUnit.MINUTES);
  165. }
  166. //todo 重新加载入库的信标到redis chai
  167. DbStock newDbStock = dbStockService.getById(dbStockBo.getId());
  168. new Thread(()->loadBeaconDate(newDbStock)).start();
  169. return ResultData.success("操作成功");
  170. }
  171. return ResultData.fail("操作失败");
  172. }
  173. /**
  174. * 通过ID获取库存详情
  175. *
  176. * @param id
  177. * @return
  178. */
  179. @ApiOperation(value = "通过ID获取库存详情", notes = "参数说明:库存id 必填")
  180. @GetMapping(value = "/findById")
  181. public ResultData find(@RequestParam("id") Long id) {
  182. paramCheck.notNull(id);
  183. DbStock dbStock = dbStockService.getById(id);
  184. DbUsageRecord dbUsageRecord = dbUsageRecordService.getOne(new LambdaQueryWrapper<DbUsageRecord>().eq(DbUsageRecord::getStcokId, dbStock.getId()).orderByDesc(DbUsageRecord::getId).last("limit 1"));
  185. DbStockVo dbStockVo = new DbStockVo();
  186. BeanUtils.copyProperties(dbStock,dbStockVo);
  187. dbStockVo.setUser(dbUsageRecord.getCreateName());
  188. dbStockVo.setLastUseTime(dbUsageRecord.getCreateTime());
  189. return ResultData.success(dbStock);
  190. }
  191. /**
  192. * 获取库存list
  193. *
  194. * @param dbStockParam
  195. * @return
  196. */
  197. @ApiOperation(value = "获取库存list", notes = "参数说明:searchValue 关键字,collegeId 学院id,startTime 开始时间,endTime 结束时间")
  198. @PostMapping(value = "/list")
  199. public ResultData list(@RequestBody DbStockParam dbStockParam) {
  200. //查询条件
  201. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper<>();
  202. //气瓶编号 气瓶名称 实验室名称
  203. if (StringUtils.isNotBlank(dbStockParam.getSearchValue())) {
  204. queryWrapper.like(DbStock::getGasName, dbStockParam.getSearchValue()).or().like(DbStock::getSubjectName, dbStockParam.getSearchValue());
  205. }
  206. if (Objects.nonNull(dbStockParam.getCollegeId())) {
  207. queryWrapper.eq(DbStock::getCollegeId, dbStockParam.getCollegeId());
  208. }
  209. if (Objects.nonNull(dbStockParam.getStartTime()) && Objects.nonNull(dbStockParam.getEndTime())) {
  210. queryWrapper.between(DbStock::getCreateTime, dbStockParam.getStartTime(), dbStockParam.getEndTime());
  211. }
  212. //倒叙
  213. queryWrapper.orderByDesc(DbStock::getId);
  214. IPage<DbStock> result = dbStockService.page(PageUtil.getQuery(dbStockParam.getPageNum(), dbStockParam.getPageSize()), queryWrapper);
  215. return ResultData.success(result);
  216. }
  217. /**
  218. * 通过信标查询库信息
  219. *
  220. * @param BeaconTag
  221. * @return
  222. */
  223. @ApiOperation(value = "通过信标查询库信息", notes = "参数说明:subId 必填")
  224. @GetMapping(value = "/findByBeaconTag")
  225. public ResultData findByBancon(@RequestParam("BeaconTag") String BeaconTag) {
  226. paramCheck.strNotEmpty(BeaconTag);
  227. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  228. queryWrapper.eq(DbStock::getBeaconTag, BeaconTag);
  229. DbStock dbStock = dbStockService.getOne(queryWrapper);
  230. return ResultData.success(dbStock);
  231. }
  232. /**
  233. * 通过subId查询库存分类
  234. *
  235. * @param subId
  236. * @return
  237. */
  238. @ApiOperation(value = "通过subId查询库存分类", notes = "参数说明:subId 必填")
  239. @GetMapping(value = "/findClassifyBySubId")
  240. public ResultData findClassifyBySubId(@RequestParam("subId") Long subId) {
  241. paramCheck.notNull(subId);
  242. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  243. queryWrapper.eq(DbStock::getSubjectId, subId);
  244. List<DbStock> list = dbStockService.list(queryWrapper);
  245. Map <String,List<DbStock>> dbStockMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream()
  246. .collect(Collectors.groupingBy(DbStock::getGasName));
  247. Map<String,Object> allMap = new HashMap <>();
  248. allMap.put("total",list.size());
  249. List<Map<String,Object>> classifyList = new ArrayList <>();
  250. dbStockMap.forEach((key,value)->{
  251. Map<String,Object> classifyMap = new HashMap <>();
  252. classifyMap.put("name",key);
  253. classifyMap.put("bottleSize",value.size());
  254. classifyList.add(classifyMap);
  255. });
  256. allMap.put("classifyList",classifyList);
  257. return ResultData.success(allMap);
  258. }
  259. /**
  260. * 通过subId查询库存列表
  261. *
  262. * @param subId
  263. * @return
  264. */
  265. @ApiOperation(value = "通过subId查询库存列表", notes = "参数说明:subId 必填")
  266. @GetMapping(value = "/findBySubId")
  267. public ResultData findBySubId(@RequestParam("subId") Long subId) {
  268. paramCheck.notNull(subId);
  269. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  270. queryWrapper.eq(DbStock::getSubjectId, subId);
  271. List<DbStock> list = dbStockService.list(queryWrapper);
  272. return ResultData.success(list);
  273. }
  274. /**
  275. * 每次入库,修改,需要重新加载对应的实验室信标列表和对应的信标
  276. *
  277. * @param dbStock
  278. * @return
  279. */
  280. public void loadBeaconDate(DbStock dbStock){
  281. //查询库存信标列表,存入redis
  282. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  283. queryWrapper.eq(DbStock::getSubjectId, dbStock.getSubjectId());
  284. List<DbStock> list = dbStockService.list(queryWrapper);
  285. redisService.setCacheObject(BaseConstants.BEACON_MATE_INFO+"~"+ dbStock.getSubjectId(),list, 7L, TimeUnit.DAYS);
  286. //将提交的库存数据,存入redis
  287. redisService.setCacheObject(BaseConstants.BEACON_MATE_DET+"~"+ dbStock.getBeaconTag()+"~"+dbStock.getSubjectId()+"~"+dbStock.getGasName(),dbStock.getBeaconTag(), 120L, TimeUnit.SECONDS);
  288. }
  289. /**
  290. * 每次出库需要重新加载对应的实验室信标列表和移除对应信标
  291. *
  292. * @param dbStock
  293. * @return
  294. */
  295. public void remBeaconDate(DbStock dbStock){
  296. //查询库存信标列表,存入redis
  297. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  298. queryWrapper.eq(DbStock::getSubjectId, dbStock.getSubjectId());
  299. List<DbStock> list = dbStockService.list(queryWrapper);
  300. redisService.setCacheObject(BaseConstants.BEACON_MATE_INFO+"~"+ dbStock.getSubjectId(),list, 7L, TimeUnit.DAYS);
  301. //将信标从redis中移除
  302. redisService.deleteObject(BaseConstants.BEACON_MATE_DET+"~"+ dbStock.getBeaconTag()+"~"+dbStock.getSubjectId()+"~"+dbStock.getGasName());
  303. }
  304. /**
  305. * 根据实验室ids查询库存列表
  306. */
  307. @ApiOperation(value = "根据实验室ids查询库存列表")
  308. @GetMapping("/{ids}")
  309. public ResultData getStockBySubIds(@PathVariable Long[] ids)
  310. {
  311. //查询库存信标列表,存入redis
  312. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  313. queryWrapper.in(DbStock::getSubjectId, ids);
  314. List<DbStock> list = dbStockService.list(queryWrapper);
  315. return ResultData.success(list);
  316. }
  317. /***
  318. *
  319. * @param
  320. * @return
  321. */
  322. @ApiOperation(value = "查询气体按名称分组")
  323. @GetMapping(value = "/groupBottleName")
  324. public ResultData findBySubId(DbStockBo bo) {
  325. return ResultData.success(dbStockService.selectStockListGroupBy(bo));
  326. }
  327. }