DbStockController.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. package com.zd.airbottle.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.zd.airbottle.domain.DbBeacon;
  9. import com.zd.airbottle.domain.DbInOutRecord;
  10. import com.zd.airbottle.domain.DbStock;
  11. import com.zd.airbottle.domain.DbUsageRecord;
  12. import com.zd.airbottle.domain.bo.DbStockBo;
  13. import com.zd.airbottle.domain.bo.DbStockParam;
  14. import com.zd.airbottle.domain.vo.DbInOutRecordVo;
  15. import com.zd.airbottle.domain.vo.DbStockVo;
  16. import com.zd.airbottle.service.DbBeaconService;
  17. import com.zd.airbottle.service.DbInOutRecordService;
  18. import com.zd.airbottle.service.DbStockService;
  19. import com.zd.airbottle.service.DbUsageRecordService;
  20. import com.zd.airbottle.utils.PageUtil;
  21. import com.zd.common.core.annotation.Log;
  22. import com.zd.common.core.annotation.PreAuthorize;
  23. import com.zd.common.core.log.BusinessType;
  24. import com.zd.common.core.redis.RedisService;
  25. import com.zd.common.core.security.TokenService;
  26. import com.zd.common.core.utils.StringUtils;
  27. import com.zd.common.core.web.controller.AbstractController;
  28. import com.zd.laboratory.api.dto.CheckSubjectDto;
  29. import com.zd.laboratory.api.dto.WarningNoticeLogDto;
  30. import com.zd.laboratory.api.feign.RemoteLaboratoryService;
  31. import com.zd.model.constant.BaseConstants;
  32. import com.zd.model.constant.HttpStatus;
  33. import com.zd.model.domain.ResultData;
  34. import com.zd.model.domain.per.PerFun;
  35. import com.zd.model.domain.per.PerPrefix;
  36. import com.zd.model.entity.SysUser;
  37. import io.swagger.annotations.Api;
  38. import io.swagger.annotations.ApiOperation;
  39. import org.springframework.beans.BeanUtils;
  40. import org.springframework.beans.factory.annotation.Autowired;
  41. import org.springframework.web.bind.annotation.*;
  42. import java.text.DecimalFormat;
  43. import java.time.LocalDateTime;
  44. import java.time.LocalTime;
  45. import java.util.*;
  46. import java.util.concurrent.TimeUnit;
  47. import java.util.stream.Collectors;
  48. /**
  49. * @Description 东北大学库存
  50. * @Author hzw
  51. * @Date 2023/10/16 17:50
  52. * @Version 2.0
  53. */
  54. @Api(tags = "东北大学库存")
  55. @RestController
  56. @RequestMapping("/stock")
  57. public class DbStockController extends AbstractController {
  58. @Autowired
  59. private DbStockService dbStockService;
  60. @Autowired
  61. private DbBeaconService dbBeaconService;
  62. @Autowired
  63. private DbInOutRecordService dbInOutRecordService;
  64. @Autowired
  65. private DbUsageRecordService dbUsageRecordService;
  66. @Autowired
  67. private RemoteLaboratoryService remoteLaboratoryService;
  68. @Autowired
  69. private TokenService tokenService;
  70. @Autowired
  71. private RedisService redisService;
  72. /**
  73. * 库存入库
  74. *
  75. * @param dbStockBo
  76. * @return
  77. */
  78. @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 备注 ")
  79. @PostMapping(value = "/enter")
  80. public ResultData in(@RequestBody DbStockBo dbStockBo) {
  81. //参数检查
  82. paramCheck.notNull(dbStockBo).strNotEmpty(dbStockBo.getGasName()).notNull(dbStockBo.getBeaconTag()).notNull(dbStockBo.getSubjectId());
  83. long count = dbBeaconService.count(new LambdaQueryWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbStockBo.getBeaconTag()));
  84. if (count == 0) {
  85. return ResultData.fail("信标库中不存在此标签!");
  86. }
  87. //验证信标
  88. long count1 = dbStockService.count(new LambdaQueryWrapper<DbStock>().eq(DbStock::getBeaconTag, dbStockBo.getBeaconTag()));
  89. if (count1 > 0) {
  90. return ResultData.fail("当前信标已绑定!");
  91. }
  92. SysUser sysUser = tokenService.getLoginUser().getSysUser();
  93. //查询实验室所在学院
  94. ResultData<List<CheckSubjectDto>> resultData = remoteLaboratoryService.findSubjectInfoList(String.valueOf(dbStockBo.getSubjectId()));
  95. if (resultData != null && HttpStatus.SUCCESS == resultData.getCode()) {
  96. List<CheckSubjectDto> data = resultData.getData();
  97. dbStockBo.setCollegeId(data.get(0).getDeptId());
  98. dbStockBo.setCollegeName(data.get(0).getCollegeName());
  99. dbStockBo.setRoomNum(data.get(0).getRoomNumber());
  100. }
  101. DbStock dbStock = new DbStock();
  102. BeanUtils.copyProperties(dbStockBo, dbStock);
  103. dbStock.setCreateBy(getCurrentUserId());
  104. dbStock.setCreateName(getCurrentUserName());
  105. if (dbStockService.save(dbStock)) {
  106. DbInOutRecord dbInOutRecord = new DbInOutRecord();
  107. BeanUtils.copyProperties(dbStockBo, dbInOutRecord);
  108. if(sysUser != null){
  109. dbInOutRecord.setOperator(sysUser.getNickName());
  110. dbInOutRecord.setOperatorId(sysUser.getUserId());
  111. dbInOutRecord.setPhone(sysUser.getPhonenumber());
  112. dbInOutRecord.setCreateBy(sysUser.getUserId());
  113. dbInOutRecord.setCreateName(sysUser.getUserName());
  114. }
  115. dbInOutRecord.setType(1);
  116. dbInOutRecordService.save(dbInOutRecord);
  117. dbBeaconService.update(new LambdaUpdateWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbInOutRecord.getBeaconTag()).set(DbBeacon::getState, Boolean.TRUE).set(DbBeacon::getBindingTime, LocalDateTime.now()));
  118. // 重新加载入库的信标到redis chai
  119. new Thread(() -> loadBeaconDate(dbStock)).start();
  120. return ResultData.success("操作成功");
  121. }
  122. return ResultData.fail("操作失败");
  123. }
  124. /**
  125. * 库存出库
  126. *
  127. * @param dbStockBo
  128. * @return
  129. */
  130. @ApiOperation(value = "库存出库", notes = "参数说明:id 必填 ")
  131. @PostMapping(value = "/out")
  132. public ResultData out(@RequestBody DbStockBo dbStockBo) {
  133. //参数检查
  134. paramCheck.notNull(dbStockBo).notNull(dbStockBo.getId());
  135. DbStock stock = dbStockService.getById(dbStockBo.getId());
  136. if(dbStockBo.getGasPressure() != null){
  137. dbStockService.update(new LambdaUpdateWrapper<DbStock>().set(DbStock::getGasPressure, dbStockBo.getGasPressure()).eq(DbStock::getGasPressure, dbStockBo.getGasPressure()));
  138. }
  139. SysUser sysUser = tokenService.getLoginUser().getSysUser();
  140. if (dbStockService.removeById(stock.getId())) {
  141. DbInOutRecord dbInOutRecord = new DbInOutRecord();
  142. BeanUtils.copyProperties(stock, dbInOutRecord,new String[] {"createBy","createTime","updateName","updateBy","updateTime","createName"});
  143. if(sysUser != null){
  144. dbInOutRecord.setOperator(sysUser.getNickName());
  145. dbInOutRecord.setOperatorId(sysUser.getUserId());
  146. dbInOutRecord.setPhone(sysUser.getPhonenumber());
  147. dbInOutRecord.setCreateBy(sysUser.getUserId());
  148. dbInOutRecord.setCreateName(sysUser.getUserName());
  149. }
  150. dbInOutRecord.setType(2);
  151. dbInOutRecordService.save(dbInOutRecord);
  152. //解除信标
  153. dbBeaconService.update(new LambdaUpdateWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbInOutRecord.getBeaconTag()).set(DbBeacon::getState, 0));
  154. // 重新加载入库的信标到redis chai
  155. new Thread(() -> remBeaconDate(stock)).start();
  156. return ResultData.success("出库成功");
  157. }
  158. return ResultData.fail("出库失败");
  159. }
  160. /**
  161. * 更新库存信息
  162. *
  163. * @Param [dbStockBo]
  164. * @Return com.zd.model.domain.ResultData
  165. **/
  166. @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 备注 ")
  167. @Log(title = "更新库存信息", businessType = BusinessType.UPDATE)
  168. @PostMapping(value = "/update")
  169. public ResultData update(@RequestBody DbStockBo dbStockBo) {
  170. //参数检查
  171. paramCheck.notNull(dbStockBo).notNull(dbStockBo.getId()).notNull(dbStockBo.getBeaconTag());
  172. long count1 = dbBeaconService.count(new LambdaQueryWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbStockBo.getBeaconTag()));
  173. if (count1 == 0) {
  174. return ResultData.fail("信标库中不存在此标签!");
  175. }
  176. long count = dbStockService.count(new LambdaQueryWrapper<DbStock>().ne(DbStock::getBeaconTag, dbStockBo.getBeaconTag()).eq(DbStock::getBeaconTag, dbStockBo.getBeaconTag()));
  177. if (count > 0) {
  178. return ResultData.fail("信标标签已绑定!");
  179. }
  180. dbBeaconService.update(new LambdaUpdateWrapper<DbBeacon>().eq(DbBeacon::getBeaconTag, dbStockBo.getBeaconTag()).set(DbBeacon::getState, Boolean.TRUE).set(DbBeacon::getBindingTime, LocalDateTime.now()));
  181. //将旧的信标从redis中移除 chai
  182. DbStock oldDbStock = dbStockService.getById(dbStockBo.getId());
  183. if (dbStockService.update(new LambdaUpdateWrapper<DbStock>().eq(DbStock::getId, dbStockBo.getId()).set(DbStock::getBeaconTag, dbStockBo.getBeaconTag()))) {
  184. redisService.deleteObject(BaseConstants.BEACON_MATE_DET + "~" + oldDbStock.getBeaconTag() + "~" + oldDbStock.getSubjectId() + "~" + oldDbStock.getGasName());
  185. //先把对应的信标提示语撤销
  186. List <Map<String,Object>> beaconNoticeList = redisService.getCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+oldDbStock.getSubjectId());
  187. List <Map<String,Object>> newNoticeList = new ArrayList <>();
  188. if(beaconNoticeList!=null){
  189. newNoticeList.addAll(beaconNoticeList);
  190. }
  191. // 循环信标通知,修改的信标提示语移除。
  192. if(beaconNoticeList != null){
  193. for(Map notice:beaconNoticeList){
  194. if(notice.get("beaconTag").equals(oldDbStock.getBeaconTag())){
  195. log.info("=====================================》移除返回来的信标提示语:"+notice);
  196. newNoticeList.remove(notice);
  197. }
  198. }
  199. }
  200. //下发通知,告诉前端页面,查询redis获取相关信息
  201. if(beaconNoticeList!=null && beaconNoticeList.size()!=newNoticeList.size()){
  202. //判断通知消息集合有数据,说明信标有变动,需要重新变更加通知
  203. redisService.setCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+ oldDbStock.getSubjectId(),newNoticeList, 30L, TimeUnit.MINUTES);
  204. }
  205. // 重新加载入库的信标到redis chai
  206. DbStock newDbStock = dbStockService.getById(dbStockBo.getId());
  207. new Thread(() -> loadBeaconDate(newDbStock)).start();
  208. return ResultData.success("操作成功");
  209. }
  210. return ResultData.fail("操作失败");
  211. }
  212. /**
  213. * 通过ID获取库存详情
  214. *
  215. * @param id
  216. * @return
  217. */
  218. @ApiOperation(value = "通过ID获取库存详情", notes = "参数说明:库存id 必填")
  219. @GetMapping(value = "/findById")
  220. public ResultData find(@RequestParam("id") Long id) {
  221. paramCheck.notNull(id);
  222. DbStock dbStock = dbStockService.getById(id);
  223. DbUsageRecord dbUsageRecord = dbUsageRecordService.getOne(new LambdaQueryWrapper<DbUsageRecord>().eq(DbUsageRecord::getStcokId, dbStock.getId()).orderByDesc(DbUsageRecord::getId).last("limit 1"));
  224. DbStockVo dbStockVo = new DbStockVo();
  225. BeanUtils.copyProperties(dbStock, dbStockVo);
  226. if (dbUsageRecord != null) {
  227. dbStockVo.setUser(dbUsageRecord.getOperator());
  228. dbStockVo.setLastUseTime(dbUsageRecord.getCreateTime());
  229. }
  230. List<DbUsageRecord> list = dbUsageRecordService.list(new LambdaQueryWrapper<DbUsageRecord>().eq(DbUsageRecord::getStcokId, dbStock.getId()).orderByDesc(DbUsageRecord::getId));
  231. dbStockVo.setDbUsageRecordList(list);
  232. return ResultData.success(dbStockVo);
  233. }
  234. /**
  235. * 获取库存list
  236. *
  237. * @param dbStockParam
  238. * @return
  239. */
  240. @ApiOperation(value = "获取库存list", notes = "参数说明:searchValue 关键字,collegeId 学院id,startTime 开始时间,endTime 结束时间")
  241. @PreAuthorize(hasPermi = PerPrefix.DB_STOCK + PerFun.LIST)
  242. @PostMapping(value = "/list")
  243. public ResultData list(@RequestBody DbStockParam dbStockParam) {
  244. //查询条件
  245. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper<>();
  246. //气瓶名称 实验室名称
  247. if (StringUtils.isNotBlank(dbStockParam.getSearchValue())) {
  248. queryWrapper.and(wrapper -> {
  249. wrapper.like(DbStock::getGasName, dbStockParam.getSearchValue()).or().like(DbStock::getSubjectName, dbStockParam.getSearchValue()).or().like(DbStock::getRoomNum, dbStockParam.getSearchValue());
  250. });
  251. }
  252. if (Objects.nonNull(dbStockParam.getCollegeId())) {
  253. queryWrapper.eq(DbStock::getCollegeId, dbStockParam.getCollegeId());
  254. }
  255. if (Objects.nonNull(dbStockParam.getStartTime()) && Objects.nonNull(dbStockParam.getEndTime())) {
  256. queryWrapper.between(DbStock::getCreateTime, dbStockParam.getStartTime().atStartOfDay(), dbStockParam.getEndTime().atTime(LocalTime.MAX));
  257. }
  258. //倒叙
  259. queryWrapper.orderByDesc(DbStock::getId);
  260. IPage<DbStock> result = dbStockService.page(PageUtil.getQuery(dbStockParam.getPageNum(), dbStockParam.getPageSize()), queryWrapper);
  261. return ResultData.success(result);
  262. }
  263. /**
  264. * app-获取库存list
  265. *
  266. * @param dbStockParam
  267. * @return
  268. */
  269. @ApiOperation(value = "app-获取库存list", notes = "参数说明:searchValue 关键字,collegeId 学院id,startTime 开始时间,endTime 结束时间")
  270. @PostMapping(value = "/appList")
  271. public ResultData appList(@RequestBody DbStockParam dbStockParam) {
  272. //查询条件
  273. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper<>();
  274. //气瓶名称 实验室名称
  275. if (StringUtils.isNotBlank(dbStockParam.getSearchValue())) {
  276. queryWrapper.and(wrapper -> {
  277. wrapper.like(DbStock::getGasName, dbStockParam.getSearchValue()).or().like(DbStock::getSubjectName, dbStockParam.getSearchValue()).or().like(DbStock::getRoomNum, dbStockParam.getSearchValue());
  278. });
  279. }
  280. if (Objects.nonNull(dbStockParam.getCollegeId())) {
  281. queryWrapper.eq(DbStock::getCollegeId, dbStockParam.getCollegeId());
  282. }
  283. if (Objects.nonNull(dbStockParam.getStartTime()) && Objects.nonNull(dbStockParam.getEndTime())) {
  284. queryWrapper.between(DbStock::getCreateTime, dbStockParam.getStartTime().atStartOfDay(), dbStockParam.getEndTime().atTime(LocalTime.MAX));
  285. }
  286. //倒叙
  287. queryWrapper.orderByDesc(DbStock::getId);
  288. IPage<DbStock> result = dbStockService.page(PageUtil.getQuery(dbStockParam.getPageNum(), dbStockParam.getPageSize()), queryWrapper);
  289. return ResultData.success(result);
  290. }
  291. /**
  292. * 通过信标查询库信息
  293. *
  294. * @param BeaconTag
  295. * @return
  296. */
  297. @ApiOperation(value = "通过信标查询库信息", notes = "参数说明:subId 必填")
  298. @GetMapping(value = "/findByBeaconTag")
  299. public ResultData findByBancon(@RequestParam("BeaconTag") String BeaconTag) {
  300. paramCheck.strNotEmpty(BeaconTag);
  301. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  302. queryWrapper.eq(DbStock::getBeaconTag, BeaconTag);
  303. DbStock dbStock = dbStockService.getOne(queryWrapper);
  304. if (dbStock != null) {
  305. return ResultData.success(dbStock);
  306. }
  307. return ResultData.fail("信标未绑定库存信息!");
  308. }
  309. /**
  310. * 通过subId查询库存分类
  311. *
  312. * @param subId
  313. * @return
  314. */
  315. @ApiOperation(value = "通过subId查询库存分类", notes = "参数说明:subId 必填")
  316. @GetMapping(value = "/findClassifyBySubId")
  317. public ResultData findClassifyBySubId(@RequestParam("subId") Long subId) {
  318. paramCheck.notNull(subId);
  319. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  320. queryWrapper.eq(DbStock::getSubjectId, subId);
  321. List<DbStock> list = dbStockService.list(queryWrapper);
  322. Map<String, List<DbStock>> dbStockMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(DbStock::getGasName));
  323. Map<String, Object> allMap = new HashMap<>();
  324. allMap.put("total", list.size());
  325. List<Map<String, Object>> classifyList = new ArrayList<>();
  326. dbStockMap.forEach((key, value) -> {
  327. Map<String, Object> classifyMap = new HashMap<>();
  328. classifyMap.put("name", key);
  329. classifyMap.put("bottleSize", value.size());
  330. classifyList.add(classifyMap);
  331. });
  332. allMap.put("classifyList", classifyList);
  333. return ResultData.success(allMap);
  334. }
  335. /**
  336. * 通过subId查询库存列表
  337. *
  338. * @param subId
  339. * @return
  340. */
  341. @ApiOperation(value = "通过subId查询库存列表", notes = "参数说明:subId 必填")
  342. @GetMapping(value = "/findBySubId")
  343. public ResultData findBySubId(@RequestParam("subId") Long subId) {
  344. paramCheck.notNull(subId);
  345. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  346. queryWrapper.eq(DbStock::getSubjectId, subId);
  347. List<DbStock> list = dbStockService.list(queryWrapper);
  348. return ResultData.success(list);
  349. }
  350. /**
  351. * 通过subId载入库存列表
  352. *
  353. * @param subId
  354. * @return
  355. */
  356. @ApiOperation(value = "通过subId载入库存列表", notes = "参数说明:subId 必填")
  357. @GetMapping(value = "/setBeaconBySubId")
  358. public ResultData setBeaconBySubId(@RequestParam("subId") Long subId) {
  359. paramCheck.notNull(subId);
  360. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  361. queryWrapper.eq(DbStock::getSubjectId, subId);
  362. List<DbStock> list = dbStockService.list(queryWrapper);
  363. redisService.setCacheObject(BaseConstants.BEACON_MATE_INFO + "~" + subId, list, 7L, TimeUnit.DAYS);
  364. for(DbStock stock : list){
  365. redisService.setCacheObject(BaseConstants.BEACON_MATE_DET + "~" + stock.getBeaconTag() + "~" + stock.getSubjectId() + "~" + stock.getGasName(), stock.getBeaconTag(), 120L, TimeUnit.SECONDS);
  366. }
  367. return ResultData.success(list);
  368. }
  369. /**
  370. * 每次入库,修改,需要重新加载对应的实验室信标列表和对应的信标
  371. *
  372. * @param dbStock
  373. * @return
  374. */
  375. public void loadBeaconDate(DbStock dbStock) {
  376. //查询库存信标列表,存入redis
  377. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  378. queryWrapper.eq(DbStock::getSubjectId, dbStock.getSubjectId());
  379. List<DbStock> list = dbStockService.list(queryWrapper);
  380. redisService.setCacheObject(BaseConstants.BEACON_MATE_INFO + "~" + dbStock.getSubjectId(), list, 7L, TimeUnit.DAYS);
  381. //将提交的库存数据,存入redis
  382. redisService.setCacheObject(BaseConstants.BEACON_MATE_DET + "~" + dbStock.getBeaconTag() + "~" + dbStock.getSubjectId() + "~" + dbStock.getGasName(), dbStock.getBeaconTag(), 120L, TimeUnit.SECONDS);
  383. }
  384. /**
  385. * 每次出库需要重新加载对应的实验室信标列表和移除对应信标
  386. *
  387. * @param dbStock
  388. * @return
  389. */
  390. public void remBeaconDate(DbStock dbStock) {
  391. //查询库存信标列表,存入redis
  392. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  393. queryWrapper.eq(DbStock::getSubjectId, dbStock.getSubjectId());
  394. List<DbStock> list = dbStockService.list(queryWrapper);
  395. redisService.setCacheObject(BaseConstants.BEACON_MATE_INFO + "~" + dbStock.getSubjectId(), list, 7L, TimeUnit.DAYS);
  396. //将信标从redis中移除
  397. redisService.deleteObject(BaseConstants.BEACON_MATE_DET + "~" + dbStock.getBeaconTag() + "~" + dbStock.getSubjectId() + "~" + dbStock.getGasName());
  398. //先把对应的信标提示语撤销
  399. List <Map<String,Object>> beaconNoticeList = redisService.getCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+dbStock.getSubjectId());
  400. List <Map<String,Object>> newNoticeList = new ArrayList <>();
  401. if(beaconNoticeList!=null){
  402. newNoticeList.addAll(beaconNoticeList);
  403. }
  404. // 循环信标通知,修改的信标提示语移除。
  405. if(beaconNoticeList != null){
  406. for(Map notice:beaconNoticeList){
  407. if(notice.get("beaconTag").equals(dbStock.getBeaconTag())){
  408. log.info("=====================================》移除返回来的信标提示语:"+notice);
  409. newNoticeList.remove(notice);
  410. }
  411. }
  412. }
  413. //下发通知,告诉前端页面,查询redis获取相关信息
  414. if(beaconNoticeList!=null && beaconNoticeList.size()!=newNoticeList.size()){
  415. //判断通知消息集合有数据,说明信标有变动,需要重新变更加通知
  416. redisService.setCacheObject(BaseConstants.BEACON_MATE_NOTICE+"~"+ dbStock.getSubjectId(),newNoticeList, 30L, TimeUnit.MINUTES);
  417. }
  418. }
  419. /**
  420. * 根据实验室ids查询库存列表
  421. */
  422. @ApiOperation(value = "根据实验室ids查询库存列表")
  423. @GetMapping("/{ids}")
  424. public ResultData getStockBySubIds(@PathVariable Long[] ids)
  425. {
  426. //查询库存信标列表,存入redis
  427. LambdaQueryWrapper<DbStock> queryWrapper = new LambdaQueryWrapper();
  428. queryWrapper.in(DbStock::getSubjectId, ids);
  429. List<DbStock> list = dbStockService.list(queryWrapper);
  430. return ResultData.success(list);
  431. }
  432. /***
  433. *
  434. * @param
  435. * @return
  436. */
  437. @ApiOperation(value = "查询气体按名称分组")
  438. @GetMapping(value = "/groupBottleName")
  439. public ResultData findBySubId(DbStockBo bo) {
  440. return ResultData.success(dbStockService.selectStockListGroupBy(bo));
  441. }
  442. /**
  443. * 按气体名称分组(电子信息牌使用)
  444. * @param bo
  445. * @return
  446. */
  447. @ApiOperation(value = "按气体名称分组")
  448. @GetMapping(value = "/groupName")
  449. public ResultData groupName(DbStockBo bo) {
  450. if(bo.getSubjectId()==null){
  451. ResultData.success(new ArrayList<>());
  452. }
  453. //气瓶分类后显示的长度
  454. int num=4;
  455. List<DbStockVo> backList = new ArrayList<>();
  456. paramCheck.notNull(bo.getSubjectId());
  457. List<DbStockVo> list= dbStockService.selectStockListGroupBy(bo);
  458. if(list!=null && !list.isEmpty()){
  459. Integer totalNum = list.stream().mapToInt(DbStockVo::getTotalNum).sum();
  460. int p=0;
  461. String gasNameStr="";
  462. for (int i=0;i<list.size();i++){
  463. DbStockVo backVo = new DbStockVo();
  464. if(i<num){
  465. backVo.setGasName(list.get(i).getGasName());
  466. backVo.setTotalNum(list.get(i).getTotalNum());
  467. backVo.setRatio(myPercent(list.get(i).getTotalNum(),totalNum,"##.##"));
  468. backList.add(backVo);
  469. }else{
  470. p=p+list.get(i).getTotalNum();
  471. gasNameStr = gasNameStr+list.get(i).getGasName()+",";
  472. }
  473. }
  474. if(list.size()>num){
  475. DbStockVo backVo2 = new DbStockVo();
  476. backVo2.setGasName("更多");
  477. backVo2.setTotalNum(p);
  478. backVo2.setRemark(gasNameStr);
  479. backVo2.setFlg(1);
  480. backVo2.setRatio(myPercent(p,totalNum,"##.##"));
  481. backList.add(backVo2);
  482. }
  483. }
  484. return ResultData.success(backList);
  485. }
  486. /***
  487. * 查询实验室下气体列表(信息牌使用)
  488. * @param bo
  489. * @return
  490. */
  491. @ApiOperation(value = "查询实验室下气体列表(信息牌使用)")
  492. @GetMapping(value = "/getListByName")
  493. public ResultData getListByName(DbStockBo bo) {
  494. if(bo.getSubjectId()==null || bo.getGasName()==null){
  495. return ResultData.success(new ArrayList<>());
  496. }
  497. List<DbInOutRecordVo> backList = new ArrayList<>();
  498. //实验室下根据气体名称查询未出库的气瓶集合
  499. paramCheck.notNull(bo.getSubjectId()).notNull(bo.getGasName());
  500. QueryWrapper<DbStock> queryWrapper = new QueryWrapper<>();
  501. queryWrapper.lambda().eq(DbStock::getSubjectId,bo.getSubjectId());
  502. if(bo.getFlg()!=null && 1==bo.getFlg() && bo.getRemark()!=null && bo.getRemark()!=""){
  503. if(bo.getRemark()!=null && bo.getRemark()!=""){
  504. queryWrapper.lambda().in(DbStock::getGasName,bo.getRemark().split(","));
  505. }else {
  506. log.error(" 查询实验室下气体列表,气体集合为空:"+bo.getRemark());
  507. }
  508. }else{
  509. queryWrapper.lambda().eq(DbStock::getGasName,bo.getGasName());
  510. }
  511. List<DbStock> list = dbStockService.list(queryWrapper);
  512. if(list!=null && !list.isEmpty()){
  513. for (DbStock r:list) {
  514. DbInOutRecordVo vo = new DbInOutRecordVo();
  515. BeanUtils.copyProperties(r,vo);
  516. if(r.getBeaconTag()!=null){
  517. //查看redis是否有值
  518. String redisStr =redisService.getCacheObject(BaseConstants.BEACON_MATE_DET+"~"+ r.getBeaconTag()+"~"+r.getSubjectId()+"~"+r.getGasName());
  519. if(redisStr!=null && redisStr!=""){
  520. //在位
  521. vo.setLocationState(1);
  522. }else {
  523. //离位
  524. vo.setLocationState(0);
  525. }
  526. }
  527. backList.add(vo);
  528. }
  529. }
  530. return ResultData.success(backList);
  531. }
  532. /**
  533. * 百分比计算
  534. *
  535. * @param y
  536. * @param z
  537. * @return
  538. */
  539. public String myPercent(Integer y, Integer z, String format) {
  540. if (0 == y || 0 == z) {
  541. return "0";
  542. }
  543. // 接受百分比的值
  544. String baifenbi = "";
  545. double baiy = y * 1.0;
  546. double baiz = z * 1.0;
  547. double fen = baiy / baiz;
  548. DecimalFormat df1 = new DecimalFormat(format);
  549. // 百分比格式,后面不足2位的用0补齐
  550. baifenbi = df1.format(fen);
  551. return baifenbi;
  552. }
  553. }