diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java new file mode 100644 index 0000000..7d01475 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.modular.system.service.IUserRegisterService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:28 + */ +@Service +public class UserRegisterServiceImpl implements IUserRegisterService { + + @Override + @Cacheable(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String getVerifyCode(){ + return null; + } + + @Override + @CachePut(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String setVerifyCode(String code){ + return code; + } +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java new file mode 100644 index 0000000..7d01475 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.modular.system.service.IUserRegisterService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:28 + */ +@Service +public class UserRegisterServiceImpl implements IUserRegisterService { + + @Override + @Cacheable(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String getVerifyCode(){ + return null; + } + + @Override + @CachePut(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String setVerifyCode(String code){ + return code; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java new file mode 100644 index 0000000..d7fa354 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java @@ -0,0 +1,248 @@ +package com.casic.missiles.modular.system.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dto.HwSmsRoot; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: 短信公共类 + * @Author: wangpeng + * @Date: 2022/8/15 15:38 + */ +@Slf4j +@Component +public class HwSmsSender { + /** + * 无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + */ + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + /** + * 无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + */ + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + @Value("${sms.huawei.url}") + private String url; + + @Value("${sms.huawei.appKey}") + private String appKey; + + @Value("${sms.huawei.appSecret}") + private String appSecret; + +// public String sendNotifyMsg(String mobile, String templateId, String templateParas) throws Exception { +// // 默认通知类 +// return sendMsg(mobile, SmsConstants.ResultMessage.SIGN_NOTIFY_ID, templateId, templateParas); +// } + + public String sendMsg(String mobile, String sender, String templateId, String templateParas) throws Exception { + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "华为云短信测试"; + + String receiver = "+86" + mobile; + + //选填,回调地址,用于接收短信状态报告,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + //templateParas = "[\"369751\"]"; + + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + log.info("huawei sms request body is null."); + return "0"; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + log.info("huawei sms request wsse header is null."); + return "0"; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + log.info("huawei sms 响应头域:{}", response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + log.info("huawei sms 消息实体:{}", entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + if(!"000000".equals(hwSmsRoot.getCode())){ + return "0"; + } + return "1"; + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallbackUrl + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallbackUrl, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + log.info("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + List keyValues = new ArrayList(); + + keyValues.add(new BasicNameValuePair("from", sender)); + keyValues.add(new BasicNameValuePair("to", receiver)); + keyValues.add(new BasicNameValuePair("templateId", templateId)); + if (null != templateParas && !templateParas.isEmpty()) { + keyValues.add(new BasicNameValuePair("templateParas", templateParas)); + } + if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) { + keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl)); + } + if (null != signature && !signature.isEmpty()) { + keyValues.add(new BasicNameValuePair("signature", signature)); + } + return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8")); + } + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + log.info("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + //Created + String time = sdf.format(new Date()); + //Nonce + String nonce = UUID.randomUUID().toString().replace("-", ""); + byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret); + String hexDigest = Hex.encodeHexString(passwordDigest); + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + //PasswordDigest + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + //本地调试方法 + public static void main(String[] args) throws Exception { + //必填,请参考"开发准备"获取如下数据,替换为实际值 + //APP接入地址+接口访问URI + String url = "https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"; + //APP_Key 输入自己的 + String appKey = "******"; + //APP_Secret 输入自己的 + String appSecret = "******"; + //国内短信签名通道号或国际/港澳台短信通道号 + String sender = "8820032023657"; + //模板ID + String templateId = "d1e8f2c7ab964c6998bda5638238bb7d"; + + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "美团外卖"; + //必填,全局号码格式(包含国家码),示例:+8615123**6789,多个号码之间用英文逗号分隔 + //String receiver = "+8615123**6789,+8615234**7890"; //短信接收人号码 + String receiver = "+8617520**2687"; + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + String templateParas = JSONObject.toJSONString(new String[]{"598745", "1"}); + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + return; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + return; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + System.out.println(response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + System.out.println(entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + System.out.println(hwSmsRoot.getCode()); + } + +} diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java new file mode 100644 index 0000000..7d01475 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.modular.system.service.IUserRegisterService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:28 + */ +@Service +public class UserRegisterServiceImpl implements IUserRegisterService { + + @Override + @Cacheable(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String getVerifyCode(){ + return null; + } + + @Override + @CachePut(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String setVerifyCode(String code){ + return code; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java new file mode 100644 index 0000000..d7fa354 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java @@ -0,0 +1,248 @@ +package com.casic.missiles.modular.system.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dto.HwSmsRoot; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: 短信公共类 + * @Author: wangpeng + * @Date: 2022/8/15 15:38 + */ +@Slf4j +@Component +public class HwSmsSender { + /** + * 无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + */ + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + /** + * 无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + */ + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + @Value("${sms.huawei.url}") + private String url; + + @Value("${sms.huawei.appKey}") + private String appKey; + + @Value("${sms.huawei.appSecret}") + private String appSecret; + +// public String sendNotifyMsg(String mobile, String templateId, String templateParas) throws Exception { +// // 默认通知类 +// return sendMsg(mobile, SmsConstants.ResultMessage.SIGN_NOTIFY_ID, templateId, templateParas); +// } + + public String sendMsg(String mobile, String sender, String templateId, String templateParas) throws Exception { + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "华为云短信测试"; + + String receiver = "+86" + mobile; + + //选填,回调地址,用于接收短信状态报告,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + //templateParas = "[\"369751\"]"; + + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + log.info("huawei sms request body is null."); + return "0"; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + log.info("huawei sms request wsse header is null."); + return "0"; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + log.info("huawei sms 响应头域:{}", response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + log.info("huawei sms 消息实体:{}", entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + if(!"000000".equals(hwSmsRoot.getCode())){ + return "0"; + } + return "1"; + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallbackUrl + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallbackUrl, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + log.info("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + List keyValues = new ArrayList(); + + keyValues.add(new BasicNameValuePair("from", sender)); + keyValues.add(new BasicNameValuePair("to", receiver)); + keyValues.add(new BasicNameValuePair("templateId", templateId)); + if (null != templateParas && !templateParas.isEmpty()) { + keyValues.add(new BasicNameValuePair("templateParas", templateParas)); + } + if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) { + keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl)); + } + if (null != signature && !signature.isEmpty()) { + keyValues.add(new BasicNameValuePair("signature", signature)); + } + return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8")); + } + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + log.info("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + //Created + String time = sdf.format(new Date()); + //Nonce + String nonce = UUID.randomUUID().toString().replace("-", ""); + byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret); + String hexDigest = Hex.encodeHexString(passwordDigest); + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + //PasswordDigest + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + //本地调试方法 + public static void main(String[] args) throws Exception { + //必填,请参考"开发准备"获取如下数据,替换为实际值 + //APP接入地址+接口访问URI + String url = "https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"; + //APP_Key 输入自己的 + String appKey = "******"; + //APP_Secret 输入自己的 + String appSecret = "******"; + //国内短信签名通道号或国际/港澳台短信通道号 + String sender = "8820032023657"; + //模板ID + String templateId = "d1e8f2c7ab964c6998bda5638238bb7d"; + + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "美团外卖"; + //必填,全局号码格式(包含国家码),示例:+8615123**6789,多个号码之间用英文逗号分隔 + //String receiver = "+8615123**6789,+8615234**7890"; //短信接收人号码 + String receiver = "+8617520**2687"; + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + String templateParas = JSONObject.toJSONString(new String[]{"598745", "1"}); + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + return; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + return; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + System.out.println(response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + System.out.println(entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + System.out.println(hwSmsRoot.getCode()); + } + +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3c8af39..f2dbe75 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -80,3 +80,9 @@ template: download-path: template\marker_template.xlsx + +sms: + huawei: + url: https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1 + appKey: 507ivF6BNl8Kk1luu9ZmsAXqO86t + appSecret: ogVpR4tiJ7OAF91tso5PPAy9nNTI diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java new file mode 100644 index 0000000..7d01475 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.modular.system.service.IUserRegisterService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:28 + */ +@Service +public class UserRegisterServiceImpl implements IUserRegisterService { + + @Override + @Cacheable(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String getVerifyCode(){ + return null; + } + + @Override + @CachePut(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String setVerifyCode(String code){ + return code; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java new file mode 100644 index 0000000..d7fa354 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java @@ -0,0 +1,248 @@ +package com.casic.missiles.modular.system.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dto.HwSmsRoot; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: 短信公共类 + * @Author: wangpeng + * @Date: 2022/8/15 15:38 + */ +@Slf4j +@Component +public class HwSmsSender { + /** + * 无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + */ + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + /** + * 无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + */ + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + @Value("${sms.huawei.url}") + private String url; + + @Value("${sms.huawei.appKey}") + private String appKey; + + @Value("${sms.huawei.appSecret}") + private String appSecret; + +// public String sendNotifyMsg(String mobile, String templateId, String templateParas) throws Exception { +// // 默认通知类 +// return sendMsg(mobile, SmsConstants.ResultMessage.SIGN_NOTIFY_ID, templateId, templateParas); +// } + + public String sendMsg(String mobile, String sender, String templateId, String templateParas) throws Exception { + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "华为云短信测试"; + + String receiver = "+86" + mobile; + + //选填,回调地址,用于接收短信状态报告,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + //templateParas = "[\"369751\"]"; + + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + log.info("huawei sms request body is null."); + return "0"; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + log.info("huawei sms request wsse header is null."); + return "0"; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + log.info("huawei sms 响应头域:{}", response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + log.info("huawei sms 消息实体:{}", entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + if(!"000000".equals(hwSmsRoot.getCode())){ + return "0"; + } + return "1"; + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallbackUrl + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallbackUrl, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + log.info("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + List keyValues = new ArrayList(); + + keyValues.add(new BasicNameValuePair("from", sender)); + keyValues.add(new BasicNameValuePair("to", receiver)); + keyValues.add(new BasicNameValuePair("templateId", templateId)); + if (null != templateParas && !templateParas.isEmpty()) { + keyValues.add(new BasicNameValuePair("templateParas", templateParas)); + } + if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) { + keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl)); + } + if (null != signature && !signature.isEmpty()) { + keyValues.add(new BasicNameValuePair("signature", signature)); + } + return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8")); + } + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + log.info("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + //Created + String time = sdf.format(new Date()); + //Nonce + String nonce = UUID.randomUUID().toString().replace("-", ""); + byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret); + String hexDigest = Hex.encodeHexString(passwordDigest); + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + //PasswordDigest + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + //本地调试方法 + public static void main(String[] args) throws Exception { + //必填,请参考"开发准备"获取如下数据,替换为实际值 + //APP接入地址+接口访问URI + String url = "https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"; + //APP_Key 输入自己的 + String appKey = "******"; + //APP_Secret 输入自己的 + String appSecret = "******"; + //国内短信签名通道号或国际/港澳台短信通道号 + String sender = "8820032023657"; + //模板ID + String templateId = "d1e8f2c7ab964c6998bda5638238bb7d"; + + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "美团外卖"; + //必填,全局号码格式(包含国家码),示例:+8615123**6789,多个号码之间用英文逗号分隔 + //String receiver = "+8615123**6789,+8615234**7890"; //短信接收人号码 + String receiver = "+8617520**2687"; + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + String templateParas = JSONObject.toJSONString(new String[]{"598745", "1"}); + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + return; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + return; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + System.out.println(response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + System.out.println(entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + System.out.println(hwSmsRoot.getCode()); + } + +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3c8af39..f2dbe75 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -80,3 +80,9 @@ template: download-path: template\marker_template.xlsx + +sms: + huawei: + url: https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1 + appKey: 507ivF6BNl8Kk1luu9ZmsAXqO86t + appSecret: ogVpR4tiJ7OAF91tso5PPAy9nNTI diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index bf2329f..f94fdc2 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -3,7 +3,8 @@ ########################################################## spring: profiles: - active: @activatedProperties@ +# active: @activatedProperties@ + active: dev http: multipart: max-file-size: 50MB diff --git a/casic-car-support/pom.xml b/casic-car-support/pom.xml index 3cba3f8..e0fb19d 100644 --- a/casic-car-support/pom.xml +++ b/casic-car-support/pom.xml @@ -228,6 +228,11 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + com.casic + casic-admin-core + 1.0.0.alpha + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java new file mode 100644 index 0000000..dc82b66 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/controller/BackpackController.java @@ -0,0 +1,111 @@ +package com.casic.missiles.modular.backpack.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Description: 背负式设备 + * @Author: wangpeng + * @Date: 2022/8/15 19:19 + */ +@Controller +@RequestMapping("/backpack") +public class BackpackController extends ExportController { + + @Autowired + private IBackpackInfoService backpackInfoService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IBusDeviceInfoService busDeviceInfoService; + + /** + * 获取分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId) { + Page page = new PageFactory().defaultPage(); + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackInfoService.listBackpackScopePage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody BackpackInfo backpackInfo) { + backpackInfo.setDelflag("0"); + backpackInfoService.insert(backpackInfo); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Long backpackInfoId) { + backpackInfoService.deleteById(backpackInfoId); + return ResponseData.success(); + } + + /** + * 批量删除 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object delete(@RequestParam("backpackInfoIds") List backpackInfoIds) { + backpackInfoService.deleteBatchIds(backpackInfoIds); + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(@RequestBody BackpackInfo backpackInfo) { + backpackInfoService.updateById(backpackInfo); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{backpackInfoId}") + @ResponseBody + public Object detail(@PathVariable("backpackInfoId") String backpackInfoId) { + BackpackInfo detail = backpackInfoService.selectById(backpackInfoId); + detail.setDeptName(permissionService.getDeptName(permissionService.getDeptName(detail.getDeptId()))); + if(ToolUtil.isNotEmpty(detail.getDeviceId())){ + BusDeviceInfo deviceInfo = busDeviceInfoService.selectById(detail.getDeviceId()); + if(!Objects.isNull(deviceInfo)){ + detail.setImei(deviceInfo.getImei()); + detail.setIot(deviceInfo.getIot()); + } + } + return ResponseData.success(detail); + } + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java new file mode 100644 index 0000000..1c5e029 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/BackpackInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.backpack.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:42 + */ +public interface BackpackInfoMapper extends BaseMapper { + List listBackpackScopePage(@Param("dataScope") DataScope dataScope, @Param("page") Page page, @Param("description") String description, @Param("backpackCode") String backpackCode, @Param("deptId") Long deptId); + + List selectListByWrapper(@Param("ew") EntityWrapper ew); + + List selectPageByWrapper(@Param("page") Page page, @Param("ew") EntityWrapper ew); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml new file mode 100644 index 0000000..2e03d80 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/dao/mapping/BackpackInfoMapper.xml @@ -0,0 +1,53 @@ + + + + + + ID AS id, BACKPACK_CODE AS backpackCode, DESCRIPTION AS description, DEPTID AS deptId, BRAND_MODEL AS brandModel, + USER_PERSON AS userPerson, USER_PHONE AS userPhone, CHARGE_PERSON AS chargePerson, CHARGE_PHONE AS chargePhone, + PURCHASE_DATE AS purchaseDate, REGISTER_DATE AS registerDate, REMARKS AS remarks, liquid_code AS liquidCode, + DELFLAG AS delflag, DEVICE_ID as deviceId, electric_code as electricCode + + + + + + + + \ No newline at end of file diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java new file mode 100644 index 0000000..cf96883 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/model/BackpackInfo.java @@ -0,0 +1,116 @@ +package com.casic.missiles.modular.backpack.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:32 + */ +@Data +@TableName("bus_backpack_info") +public class BackpackInfo extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 背负式设备code + */ + @TableField("BACKPACK_CODE") + private String backpackCode; + /** + * 描述 + */ + @TableField("DESCRIPTION") + private String description; + /** + * 使用单位 + */ + @TableField("DEPTID") + private Long deptId; + /** + * 品牌型号 + */ + @TableField("BRAND_MODEL") + private String brandModel; + /** + * 使用人 + */ + @TableField("USER_PERSON") + private String userPerson; + /** + * 使用人电话 + */ + @TableField("USER_PHONE") + private String userPhone; + /** + * 负责人 + */ + @TableField("CHARGE_PERSON") + private String chargePerson; + /** + * 负责人电话 + */ + @TableField("CHARGE_PHONE") + private String chargePhone; + /** + * 购入日期 + */ + @TableField("PURCHASE_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + /** + * 登记日期 + */ + @TableField("REGISTER_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date registerDate; + /** + * 备注 + */ + @TableField("REMARKS") + private String remarks; + /** + * 删除标记(0表示未删除) + */ + @TableField("DELFLAG") + @TableLogic(value = "0",delval = "1") + private String delflag; + + @TableField("DEVICE_ID") + private Long deviceId; + + @TableField("liquid_code") + private String liquidCode; + + @TableField("electric_code") + private String electricCode; + + @TableField(exist = false) + private String imei; + + @TableField(exist = false) + private String iot; + + @TableField(exist = false) + private String deptName; + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java new file mode 100644 index 0000000..0096732 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/IBackpackInfoService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.backpack.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:39 + */ +public interface IBackpackInfoService extends IService { + + List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java new file mode 100644 index 0000000..4bd989e --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/backpack/service/impl/BackpackInfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.backpack.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 19:40 + */ +@Service +public class BackpackInfoServiceImpl extends ServiceImpl implements IBackpackInfoService { + @Autowired + private ICommonPermissionService permissionService; + + @Override + public List listBackpackScopePage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = this.baseMapper.listBackpackScopePage(dataScope, page, description, backpackCode, deptId); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java new file mode 100644 index 0000000..25174dd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/car/enums/BackpackExportEnum.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.car.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum BackpackExportEnum implements ExportExcelEnum { + + BACKPACK_EXPORT("backpackExportTemp.xlsx","backpackExportTemp.xlsx","背负式信息"), + OFFLINE_EXPORT("offlineExportTemp.xlsx","offlineExportTemp.xlsx","离线背负式"), + ALARM_EXPORT("alarmExportTemp.xlsx","alarmExportTemp.xlsx","违规记录"); + + + BackpackExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + private String fileTempPath; + + private String fileName; + + private String description; + + + @Override + public String getFileTempPath() { + return this.fileTempPath; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getDescription() { + return this.description; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java index 8447e27..9d31ca6 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/controller/BusDeviceInfoController.java @@ -76,6 +76,16 @@ return ResponseData.success(list); } + /** + * 获取背负式未关联的设备列表(以及关联自身的列表) + */ + @RequestMapping(value = "/backpack/listNoBind") + @ResponseBody + public Object listNoBindBackpack(Long backpackId){ + List list = busDeviceInfoService.listNoBindBackpack(backpackId); + return ResponseData.success(list); + } + /** * 新增 diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java index 8bd59ea..e715c6e 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/BusDeviceInfoMapper.java @@ -24,4 +24,5 @@ void batchDelete(@Param("ids") List ids); + List listNoBindBackpack(@Param("backpackId") Serializable backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml index e8a030e..33f8acf 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/dao/mapping/BusDeviceInfoMapper.xml @@ -43,4 +43,14 @@ + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java index 0b1d6ab..5334776 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/IBusDeviceInfoService.java @@ -26,4 +26,5 @@ void batchDelete(List deviceIds); + List listNoBindBackpack(Long backpackId); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 1bdd651..4d0d477 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -62,4 +62,9 @@ public void batchDelete(List deviceIds) { this.baseMapper.batchDelete(deviceIds); } + + @Override + public List listNoBindBackpack(Long backpackId) { + return this.baseMapper.listNoBindBackpack(backpackId); + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java new file mode 100644 index 0000000..e6514c4 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/consts/BackpackPositionConstant.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.position.consts; + +public class BackpackPositionConstant { + + /** + * 背负式定位ES索引,复用车辆的 + */ + public static final String BACKPACK_POSITION_IDX = "sos_car_position"; + + /** + * 背负式定位ES类型,复用车辆的 + */ + public static final String BACKPACK_POSITION_TYPE = "sos_car_position"; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java new file mode 100644 index 0000000..e7f62e2 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/controller/BackpackPositionController.java @@ -0,0 +1,159 @@ +package com.casic.missiles.modular.position.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.backpack.service.IBackpackInfoService; +import com.casic.missiles.modular.car.enums.BackpackExportEnum; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/backpackPosition") +public class BackpackPositionController extends ExportController { + + @Resource + private ICommonPermissionService permissionService; + + @Resource + private IBackpackPositionService backpackPositionService; + + @Resource + private IBackpackInfoService backpackInfoService; + + /** + * 背负式设备实时位置查询 + */ + @RequestMapping("/list") + @ResponseBody + public Object list(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.list(dataScope,description,backpackCode,deptId); + return ResponseData.success(list); + } + + /** + * 背负式设备实时位置分页查询 + */ + @RequestMapping("/listPage") + @ResponseBody + public Object listPage(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.listPage(dataScope,page,description,backpackCode,deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 跟踪(查询背负式设备最新位置) + */ + @RequestMapping("/track") + @ResponseBody + public Object track(Long backpackId){ + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + BackpackPosition backpackPosition = backpackPositionService.selectLatestBackpackPosition(backpackId); + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo,backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition,backpackPositionDto); + backpackPositionDto.setStatus(backpackPositionService.getBackPackStatus(backpackPosition)); + return ResponseData.success(backpackPositionDto); + } + + /** + * 轨迹(查询背负式设备一段时间内的位置) + */ + @RequestMapping("/trace") + @ResponseBody + public Object trace(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + BackpackInfo backpackInfo = backpackInfoService.selectById(backpackId); + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List positionDtos = new ArrayList<>(); + for (BackpackPosition backpackPosition : positionList) { + BackpackPositionDto backpackPositionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, backpackPositionDto); + BackpackPositionDto.convPositionInfo(backpackPosition, backpackPositionDto); + positionDtos.add(backpackPositionDto); + } + return ResponseData.success(positionDtos); + } + + /** + * 速度曲线 + */ + @RequestMapping("/speedLine") + @ResponseBody + public Object speedLine(Long backpackId, String startTime, String endTime){ + // 如果没有传时间,返回空值 + if(ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)){ + return ResponseData.success(); + } + List positionList = backpackPositionService.selectHistoryBackpackPosition(backpackId,startTime,endTime); + List> speedList = new ArrayList<>(); + for (BackpackPosition position : positionList) { + Map speed = new HashMap<>(); + speed.put("speed", position.getSpeed()); + speed.put("upTime", position.getUpTime()); + speedList.add(speed); + } + return ResponseData.success(speedList); + } + + /** + * 统计当前在线/离线数量 + */ + @RequestMapping("/offlineCount") + @ResponseBody + public Object offlineCount(String description, String backpackCode, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Map res = backpackPositionService.offlineCount(dataScope, description, backpackCode, deptId); + return ResponseData.success(res); + } + + + /** + * 离线背负式统计(某段时间内都没有定位数据) + */ + @RequestMapping("/offlineStatics") + @ResponseBody + public Object offlineStatics(String startTime, String endTime, Long deptId){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + Page page = new PageFactory().defaultPage(); + List list = backpackPositionService.offlineList(dataScope, page, startTime, endTime, deptId); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 离线背负式导出 + */ + @RequestMapping("/offlineExport") + @ResponseBody + public void offlineExport(HttpServletResponse response, String startTime, String endTime, Long deptId) throws IOException { + DataScope dataScope = permissionService.getCurrUserDataScope(); + List list = backpackPositionService.offlineList(dataScope, startTime, endTime, deptId); + super.exportExcel(BackpackExportEnum.OFFLINE_EXPORT,list,response); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java new file mode 100644 index 0000000..f2e1ffa --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/dto/BackpackPositionDto.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.position.dto; + +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.es.BackpackPosition; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class BackpackPositionDto { + + private Long positionId; + private Long backpackId; + private String description; + private String backpackCode; + private Long deptId; + private String deptName; + private String status; + private String lng; + private String lat; + private String direction; + private String speed; + private String liquidValue; + + public String getUpTime() { + if(!StringUtils.isEmpty(this.upTime) && !this.upTime.contains("-")){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(this.upTime)); + return dateFormat.format(date); + } + return upTime; + } + + private String upTime; + + public static void convBackpackInfo(BackpackInfo backpackInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(backpackInfo)){ + positionDto.setBackpackId(backpackInfo.getId()); + positionDto.setDescription(backpackInfo.getDescription()); + positionDto.setBackpackCode(backpackInfo.getBackpackCode()); + positionDto.setDeptId(backpackInfo.getDeptId()); + positionDto.setDeptName(backpackInfo.getDeptName()); + } + } + + public static void convPositionInfo(BackpackPosition positionInfo, BackpackPositionDto positionDto) { + if(ToolUtil.isNotEmpty(positionInfo)){ + positionDto.setPositionId(positionInfo.getId()); + positionDto.setLng(positionInfo.getLng()); + positionDto.setLat(positionInfo.getLat()); + positionDto.setDirection(positionInfo.getDirection()); + positionDto.setSpeed(positionInfo.getSpeed()); + positionDto.setUpTime(positionInfo.getUpTime()); + } + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java new file mode 100644 index 0000000..129fd9b --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/es/BackpackPosition.java @@ -0,0 +1,55 @@ +package com.casic.missiles.modular.position.es; + +import lombok.Data; + +/** + * 背负式位置ES模型 + */ +@Data +public class BackpackPosition { + /** + * 位置id + */ + private Long id; + /** + * 背负式设备id + */ + private Long backpackId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 速度 + */ + private String speed; + /** + * 方向 + */ + private String direction; + /** + * 海拔 + */ + private String altitude; + /** + * 里程 + */ + private String mile; + /** + * 电量 + */ + private String electric; + /** + * 采集时间 + */ + private String upTime; + /** + * 上传时间 + */ + private String logTime; + +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java new file mode 100644 index 0000000..e22b80c --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/IBackpackPositionService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.position.service; + + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public interface IBackpackPositionService { + + List list(DataScope dataScope, String description, String backpackCode, Long deptId); + + BackpackPosition selectLatestBackpackPosition(Serializable backpackId); + + String getBackPackStatus(BackpackPosition backpackPosition); + + List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId); + + List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime); + + Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId); + + List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId); + + List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java new file mode 100644 index 0000000..a9c4a8f --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/position/service/impl/BackpackPositionServiceImpl.java @@ -0,0 +1,299 @@ +package com.casic.missiles.modular.position.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.es.EsResponse; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.alarm.consts.AlarmConsts; +import com.casic.missiles.modular.alarm.model.BusAlarmRecord; +import com.casic.missiles.modular.alarm.service.IBusAlarmRecordSupportService; +import com.casic.missiles.modular.backpack.dao.BackpackInfoMapper; +import com.casic.missiles.modular.backpack.model.BackpackInfo; +import com.casic.missiles.modular.car.model.BusCarInfo; +import com.casic.missiles.modular.car.service.IBusCarInfoSupportService; +import com.casic.missiles.modular.position.consts.BackpackPositionConstant; +import com.casic.missiles.modular.position.dto.BackpackPositionDto; +import com.casic.missiles.modular.position.es.BackpackPosition; +import com.casic.missiles.modular.position.service.IBackpackPositionService; +import com.casic.missiles.modular.position.util.ElasticSearchQuery; +import com.casic.missiles.modular.position.util.ElasticSearchUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.EntityUtils; +import org.elasticsearch.client.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/16 15:24 + */ +@Slf4j +@Service +public class BackpackPositionServiceImpl extends ServiceImpl implements IBackpackPositionService { + @Autowired + private BackpackInfoMapper backpackInfoMapper; + + @Autowired + private IBusCarInfoSupportService busCarInfoSupportService; + + @Autowired + private ICommonPermissionService permissionService; + + @Resource + private IBusAlarmRecordSupportService alarmRecordSupportService; + + @Value("${casic.car.offlineTime:20}") + private String offlineTime; + + @Override + public List list(DataScope dataScope, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + + @Override + public List listPage(DataScope dataScope, Page page, String description, String backpackCode, Long deptId) { + List list = new ArrayList<>(); + //查询背负式基础信息 + EntityWrapper ew = new EntityWrapper<>(); + setQueryCondition(ew, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectPageByWrapper(page, ew); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + //查询每个背负式的位置信息,并设置背负式状态 + //查询背负式液位值 + list.add(convertBackpackPositionDto(backpackInfo)); + } + return list; + } + + @Override + public List selectHistoryBackpackPosition(Long backpackId, String startTime, String endTime) { + List positionList = new ArrayList<>(); + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.range("upTime", startTime, endTime); + query.sort("upTime", "asc"); + query.size(1000); + List datas = ElasticSearchUtil.searchQueryScroll(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + for (Object data : datas) { + JSONObject hits = (JSONObject) data; + positionList.add(JSONObject.toJavaObject(hits, BackpackPosition.class)); + } + return positionList; + } catch (Exception e) { + log.error("search history position error, {}", e.getMessage()); + return positionList; + } + } + + @Override + public Map offlineCount(DataScope dataScope, String description, String backpackCode, Long deptId) { + Map res = new HashMap<>(); + Calendar calendar = Calendar.getInstance(); + String endTime = DateUtil.getTime(calendar.getTime()); + calendar.add(Calendar.MINUTE, 0 - Integer.valueOf(offlineTime)); + String startTime = DateUtil.getTime(calendar.getTime()); + // 获取这段时间内的在线背负式 + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + if (ToolUtil.isNotEmpty(backpackIds)) { + EntityWrapper onlineEw = new EntityWrapper<>(); + setQueryCondition(onlineEw, description, backpackCode, deptId); + onlineEw.in("ID", backpackIds); + List onlineList = backpackInfoMapper.selectListByWrapper(onlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + EntityWrapper offlineEw = new EntityWrapper<>(); + setQueryCondition(offlineEw, description, backpackCode, deptId); + offlineEw.notIn("ID", backpackIds); + List offlineList = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : onlineList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", onlineList.size()); + res.put("offline", offlineList.size()); + } else { + // 如果该时段没有背负式数据 + EntityWrapper allEw = new EntityWrapper<>(); + setQueryCondition(allEw, description, backpackCode, deptId); + List backpackInfoList = backpackInfoMapper.selectListByWrapper(allEw); + for (BackpackInfo backpackInfo : backpackInfoList) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + res.put("online", 0); + res.put("offline", backpackInfoList.size()); + } + return res; + } + + @Override + public List offlineList(DataScope dataScope, Page page, String startTime, String endTime, Long deptId) { + List backpackIds = this.countBackpackIdsByRange(startTime, endTime); + EntityWrapper offlineEw = new EntityWrapper<>(); + offlineEw.notIn("ID", backpackIds); + offlineEw.eq("DELFLAG", "0"); + if (ToolUtil.isNotEmpty(deptId)) { + offlineEw.eq("DEPTID", deptId); + } + if (ToolUtil.isNotEmpty(page)) { + List list = backpackInfoMapper.selectPageByWrapper(page, offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } else { + List list = backpackInfoMapper.selectListByWrapper(offlineEw); + for (BackpackInfo backpackInfo : list) { + backpackInfo.setDeptName(permissionService.getDeptName(backpackInfo.getDeptId())); + } + return list; + } + } + + @Override + public List offlineList(DataScope dataScope, String startTime, String endTime, Long deptId) { + return offlineList(dataScope, null, startTime, endTime, deptId); + } + + @Override + public BackpackPosition selectLatestBackpackPosition(Serializable backpackId) { + try { + ElasticSearchQuery query = new ElasticSearchQuery(); + query.term("carId", String.valueOf(backpackId)); + query.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + query.sort("upTime", "desc"); + query.size(1); + EsResponse esResponse = ElasticSearchUtil.searchQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, query); + if (Integer.parseInt(esResponse.getHits().getTotal()) > 0) { + JSONObject data = (JSONObject) esResponse.getDatas().get(0); + return JSONObject.toJavaObject(data, BackpackPosition.class); + } else { + return null; + } + // todo 坐标转换 + } catch (Exception e) { + log.error("search latest position error, {}", e.getMessage()); + return null; + } + } + + @Override + public String getBackPackStatus(BackpackPosition backpackPosition) { + String status = ""; + if (ToolUtil.isNotEmpty(backpackPosition)) { + // TODO: 2022/8/16 判定在线时间 + String offlineThreshold = offlineTime; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + date.setTime(Long.parseLong(backpackPosition.getUpTime())); + Date latestTime = DateUtil.parseTime(dateFormat.format(date)); + Long offlineMinutes = ((System.currentTimeMillis() - latestTime.getTime()) / 1000) / 60; + // TODO: 2022/8/18 报警信息来自? + //这里复用车辆的报警表bus_alarm_record + List alarmRecords = alarmRecordSupportService.selectAlarm(backpackPosition.getBackpackId(), null, AlarmConsts.ALARM_STATUS_NOW); + + if (offlineMinutes.compareTo(Long.valueOf(offlineThreshold)) > 0) { + // 如果超过设置离线时间,则为离线 + status = "离线"; + } else if (ToolUtil.isNotEmpty(alarmRecords)) { + // 如果当前有报警,则状态为报警 + status = "报警"; + } else if (Double.parseDouble(backpackPosition.getSpeed()) < 1) { + // 如果速度小于1,则为停止 + status = "停止"; + } else { + // 正常,则为移动 + status = "移动"; + } + + } else { + status = "离线"; + } + return status; + } + + public List countBackpackIdsByRange(String startTime, String endTime) { + List backpackIds = new ArrayList<>(); + try { + String aggName = "distinct_backpack"; + ElasticSearchQuery aggs = new ElasticSearchQuery(); + + aggs.range("upTime", startTime, endTime); + aggs.term("lng", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.term("lat", "0.000000", ElasticSearchQuery.MUST_NOT_FLAG); + aggs.size(0); + aggs.aggs(aggName, "backpack"); + + Response response = ElasticSearchUtil.aggsQuery(BackpackPositionConstant.BACKPACK_POSITION_IDX, BackpackPositionConstant.BACKPACK_POSITION_TYPE, aggs); + JSONObject result = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); + JSONArray buckets = result.getJSONObject("aggregations").getJSONObject(aggName).getJSONArray("buckets"); + for (Object bucket : buckets) { + JSONObject res = (JSONObject) bucket; + backpackIds.add(res.getLong("key")); + } + return backpackIds; + } catch (Exception e) { + log.error("count packageId error, {}", e.getMessage()); + return backpackIds; + } + } + + + private BackpackPositionDto convertBackpackPositionDto(BackpackInfo backpackInfo) { + BackpackPositionDto positionDto = new BackpackPositionDto(); + BackpackPositionDto.convBackpackInfo(backpackInfo, positionDto); + if (StringUtils.isNotBlank(backpackInfo.getLiquidCode())) { + //复用消防车获取液位方法 + String liquid = busCarInfoSupportService.getLiquidValue(backpackInfo.getLiquidCode()); + positionDto.setLiquidValue(liquid); + } + BackpackPosition backpackPosition = this.selectLatestBackpackPosition(backpackInfo.getId()); + BackpackPositionDto.convPositionInfo(backpackPosition, positionDto); + positionDto.setStatus(getBackPackStatus(backpackPosition)); + return positionDto; + } + + private void setQueryCondition(EntityWrapper ew, String description, String backpackCode, Long deptId) { + if (ToolUtil.isNotEmpty(description)) { + ew.like("DESCRIPTION", description); + } + if (ToolUtil.isNotEmpty(backpackCode)) { + ew.like("BACKPACK_CODE", backpackCode); + } + if (ToolUtil.isNotEmpty(deptId)) { + ew.eq("DEPTID", deptId); + } + ew.eq("DELFLAG", "0"); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java index a2a4d5a..4c6220a 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/MarkerController.java @@ -104,6 +104,11 @@ return resultData; } + /** + * 标识器附近的标识器,20m内的标识器List + * @param id + * @return + */ @RequestMapping(value = "/aroundList") @ResponseBody public Object aroundList(Integer id){ @@ -120,6 +125,16 @@ } /** + * 用户gps或地址附近1.5km的标识器List + */ + @RequestMapping(value = "/nearbyList") + @ResponseBody + public Object nearbyList(Double longitude, Double latitude, String position){ + DataScope dataScope = permissionService.getCurrUserDataScope(); + return markerService.selectDataScopeNearbyList(dataScope, longitude, latitude, position); + } + + /** * 获取分页列表 */ @RequestMapping(value = "/listPage") diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java index 3630b88..cc06698 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/RescueController.java @@ -48,7 +48,7 @@ private Semaphore semaphore=new Semaphore(1); /** - * 推送救援信息 + * 推送救援信息,推送给3km范围内的救援人员 * @param id 标识器id (markerId) * @param position 位置信息 * @return diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java new file mode 100644 index 0000000..e6860e7 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/controller/UserRegisterController.java @@ -0,0 +1,102 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.state.ManagerStatus; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.modular.system.dto.RegisterUserDTO; +import com.casic.missiles.modular.system.factory.UserFactory; +import com.casic.missiles.modular.system.service.IUserRegisterService; +import com.casic.missiles.modular.system.service.IUserService; +import com.casic.missiles.modular.system.util.HwSmsSender; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Objects; + +/** + * @Description: 华为云用户注册 + * @Author: wangpeng + * @Date: 2022/8/15 15:30 + */ +@Slf4j +@RestController +@RequestMapping(value = "/user") +public class UserRegisterController { + @Autowired + private HwSmsSender hwSmsSender; + + @Autowired + private IUserRegisterService userRegisterService; + + @Autowired + private CasicProperties casicProperties; + + @Autowired + private IUserService userService; + /** + * 获取验证码 + * @param phone + * @return + */ + @PostMapping("/sms/send/{phone}") + public ResponseData sendMsg(@PathVariable(name = "phone") String phone) { + + if (!StringUtils.isEmpty(userRegisterService.getVerifyCode())) { + return ResponseData.error("不允许重复发送!"); + } + String code = RandomStringUtils.randomNumeric(4); + log.info("发送给手机号:{} 的验证码:{}", phone, code); + try { + //sender,国内短信填写为短信平台为短信签名分配的通道号码 + String sender = "1069368924410003102"; + String templateId = "2f25d5494ef64e0593b0239aba837c79"; + String result = hwSmsSender.sendMsg(phone, sender, templateId, "["+ code +"]"); + if("0".equals(result)){ + return ResponseData.error("短信发送失败!请稍后重试!"); + } + } catch (Exception e) { + log.error("验证码发送失败!,异常:{}", e.getMessage()); + return ResponseData.error("短信发送失败!请稍后重试!"); + } + + userRegisterService.setVerifyCode(code); //验证码验证期内设置 + return ResponseData.success("短信发送成功!"); + } + + /** + * 用户注册,用户名为手机号 + */ + @PostMapping("/register") + public ResponseData userRegister(@RequestBody RegisterUserDTO user) { + //验证码验证 + String verifyCode = String.valueOf(userRegisterService.getVerifyCode()); + if(StringUtils.isEmpty(verifyCode)){ + return ResponseData.error("验证码已过期!"); + } + if(!verifyCode.equals(user.getVerifyCode())){ + return ResponseData.error("验证码不正确!"); + } + + user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount())); + if(!Objects.isNull(userService.getByAccount(user.getPhone()))){ + return ResponseData.error("该用户已经注册!"); + } + + try { + user.setPassword(RSAUtils.decrypt(user.getPassword(), ShiroKit.getSession().getAttribute(RSAUtils.RSAPrivateKey).toString())); + } catch (Exception var4) { + log.error("密码解密异常:{}", var4); + } + + user.setSalt(ShiroKit.getRandomSalt(5)); + user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt())); + user.setStatus(ManagerStatus.OK.getCode()); +// user.setCreateTime(new Date()); + this.userService.insert(UserFactory.createUser(user)); + return ResponseData.success(); + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java index 3feec61..96a66fd 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/MarkerMapper.java @@ -72,5 +72,5 @@ Integer statisticsMaintain(@Param("deptIds")String deptIds); - + List> selectDataScopeNearbyList(@Param("scope") DataScope dataScope, @Param("longitude") Double longitude, @Param("latitude")Double latitude); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml index d123280..e1d902f 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dao/mapping/MarkerMapper.xml @@ -249,4 +249,15 @@ SELECT FROM bus_marker + + diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java new file mode 100644 index 0000000..a7d8dcd --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/HwSmsRoot.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 16:08 + */ +@Data +public class HwSmsRoot { + private List result; + private String code; + private String description; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java new file mode 100644 index 0000000..139c306 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/dto/RegisterUserDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.transfer.UserDto; +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:56 + */ +@Data +public class RegisterUserDTO extends UserDto { + //验证码 + private String verifyCode; +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java index 83cb18e..afc1bf5 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IMarkerService.java @@ -44,4 +44,6 @@ Object inVaildMarker(String markerId); Object batchDelete(List ids); + + Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position); } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java new file mode 100644 index 0000000..7ffe520 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/IUserRegisterService.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.system.service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:27 + */ +public interface IUserRegisterService { + String getVerifyCode(); + + String setVerifyCode(String code); +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java index 9d29798..d2ca7f4 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/MarkerServiceImpl.java @@ -1,8 +1,11 @@ package com.casic.missiles.modular.system.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.util.ToolUtil; @@ -15,18 +18,18 @@ import com.casic.missiles.modular.system.service.IMaintainService; import com.casic.missiles.modular.system.service.IMarkerService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.util.HttpUtil; +import com.casic.missiles.modular.system.warpper.MarkerWarpper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -46,6 +49,8 @@ private IInspectionService inspectionService; @Autowired private ICommonPermissionService permissionService; + @Value("${securitymarker.gaode.key}") + private String gaodeKey; @Override public List> selectDataScopeAllValidList(DataScope dataScope,String markerId,String position){ @@ -232,4 +237,39 @@ } return ResponseData.success(); } + + @Override + public Object selectDataScopeNearbyList(DataScope dataScope, Double longitude, Double latitude, String position) { + List> mapList = new ArrayList<>(); + if((!Objects.isNull(longitude) && !Objects.isNull(latitude)) || StringUtils.isEmpty(position)){ + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, longitude, latitude); + }else if(!StringUtils.isEmpty(position)){ + //逆地址解析 + String url = "https://restapi.amap.com/v3/geocode/geo"; + Double lng,lat; + try { + Map params = new HashMap<>(); + params.put("key", gaodeKey); + params.put("address", position); + String str = HttpUtil.httpGet(url,params); + JSONObject jsStr = JSONObject.parseObject(str); + if(1 == jsStr.getInteger("status")){ + JSONArray regeocodes = jsStr.getJSONArray("geocodes"); + String location = regeocodes.getJSONObject(0).getString("location"); + lng = Double.valueOf(location.split(",")[0]); + lat = Double.valueOf(location.split(",")[1]); + }else{ + return ResponseData.error("解析地址失败!"); + } + mapList = this.baseMapper.selectDataScopeNearbyList(dataScope, lng, lat); + }catch (Exception e){ + return ResponseData.error("用户地址获取失败!"); + } + } + SuccessResponseData resultData = new SuccessResponseData(); + new MarkerWarpper(mapList).warp(); + resultData.setMessage("success"); + resultData.setData(mapList); + return resultData; + } } diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java index 83c3e98..5f2354b 100644 --- a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserExtendServiceImpl.java @@ -96,7 +96,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); @@ -137,7 +137,7 @@ return ResponseData.error("请填写手机号"); } if(ToolUtil.isEmpty(verifyCode)){ - return ResponseData.error("请填写手验证码"); + return ResponseData.error("请填写手机验证码"); } if(ToolUtil.isEmpty(password)){ return ResponseData.error("请填写密码"); diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java new file mode 100644 index 0000000..7d01475 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/service/impl/UserRegisterServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.modular.system.service.IUserRegisterService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/15 17:28 + */ +@Service +public class UserRegisterServiceImpl implements IUserRegisterService { + + @Override + @Cacheable(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String getVerifyCode(){ + return null; + } + + @Override + @CachePut(value = "VERIFY_CODE", key = "'verifyCode'+#phone") + public String setVerifyCode(String code){ + return code; + } +} diff --git a/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java new file mode 100644 index 0000000..d7fa354 --- /dev/null +++ b/casic-car-support/src/main/java/com/casic/missiles/modular/system/util/HwSmsSender.java @@ -0,0 +1,248 @@ +package com.casic.missiles.modular.system.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dto.HwSmsRoot; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description: 短信公共类 + * @Author: wangpeng + * @Date: 2022/8/15 15:38 + */ +@Slf4j +@Component +public class HwSmsSender { + /** + * 无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + */ + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + /** + * 无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + */ + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + @Value("${sms.huawei.url}") + private String url; + + @Value("${sms.huawei.appKey}") + private String appKey; + + @Value("${sms.huawei.appSecret}") + private String appSecret; + +// public String sendNotifyMsg(String mobile, String templateId, String templateParas) throws Exception { +// // 默认通知类 +// return sendMsg(mobile, SmsConstants.ResultMessage.SIGN_NOTIFY_ID, templateId, templateParas); +// } + + public String sendMsg(String mobile, String sender, String templateId, String templateParas) throws Exception { + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "华为云短信测试"; + + String receiver = "+86" + mobile; + + //选填,回调地址,用于接收短信状态报告,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + //templateParas = "[\"369751\"]"; + + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + log.info("huawei sms request body is null."); + return "0"; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + log.info("huawei sms request wsse header is null."); + return "0"; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + log.info("huawei sms 响应头域:{}", response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + log.info("huawei sms 消息实体:{}", entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + if(!"000000".equals(hwSmsRoot.getCode())){ + return "0"; + } + return "1"; + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallbackUrl + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallbackUrl, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + log.info("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + List keyValues = new ArrayList(); + + keyValues.add(new BasicNameValuePair("from", sender)); + keyValues.add(new BasicNameValuePair("to", receiver)); + keyValues.add(new BasicNameValuePair("templateId", templateId)); + if (null != templateParas && !templateParas.isEmpty()) { + keyValues.add(new BasicNameValuePair("templateParas", templateParas)); + } + if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) { + keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl)); + } + if (null != signature && !signature.isEmpty()) { + keyValues.add(new BasicNameValuePair("signature", signature)); + } + return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8")); + } + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + log.info("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + //Created + String time = sdf.format(new Date()); + //Nonce + String nonce = UUID.randomUUID().toString().replace("-", ""); + byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret); + String hexDigest = Hex.encodeHexString(passwordDigest); + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + //PasswordDigest + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + //本地调试方法 + public static void main(String[] args) throws Exception { + //必填,请参考"开发准备"获取如下数据,替换为实际值 + //APP接入地址+接口访问URI + String url = "https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"; + //APP_Key 输入自己的 + String appKey = "******"; + //APP_Secret 输入自己的 + String appSecret = "******"; + //国内短信签名通道号或国际/港澳台短信通道号 + String sender = "8820032023657"; + //模板ID + String templateId = "d1e8f2c7ab964c6998bda5638238bb7d"; + + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + //签名名称 + String signature = "美团外卖"; + //必填,全局号码格式(包含国家码),示例:+8615123**6789,多个号码之间用英文逗号分隔 + //String receiver = "+8615123**6789,+8615234**7890"; //短信接收人号码 + String receiver = "+8617520**2687"; + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + String templateParas = JSONObject.toJSONString(new String[]{"598745", "1"}); + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + return; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + return; + } + //如果JDK版本是1.8,可使用如下代码 + //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 + CloseableHttpClient client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + //请求方法POST + HttpResponse response = client.execute(RequestBuilder.create("POST") + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //打印响应头域信息 + System.out.println(response.toString()); + //打印响应消息实体 + String entity = EntityUtils.toString(response.getEntity()); + System.out.println(entity); + HwSmsRoot hwSmsRoot = JSONObject.parseObject(entity, HwSmsRoot.class); + System.out.println(hwSmsRoot.getCode()); + } + +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3c8af39..f2dbe75 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -80,3 +80,9 @@ template: download-path: template\marker_template.xlsx + +sms: + huawei: + url: https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1 + appKey: 507ivF6BNl8Kk1luu9ZmsAXqO86t + appSecret: ogVpR4tiJ7OAF91tso5PPAy9nNTI diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index bf2329f..f94fdc2 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -3,7 +3,8 @@ ########################################################## spring: profiles: - active: @activatedProperties@ +# active: @activatedProperties@ + active: dev http: multipart: max-file-size: 50MB diff --git a/casic-web/src/main/resources/ehcache.xml b/casic-web/src/main/resources/ehcache.xml index 13084ec..930d522 100644 --- a/casic-web/src/main/resources/ehcache.xml +++ b/casic-web/src/main/resources/ehcache.xml @@ -68,6 +68,19 @@ memoryStoreEvictionPolicy="LFU" transactionalMode="off"> + +