diff --git a/src/main/java/com/huaheng/pc/config/camera/controller/CameraController.java b/src/main/java/com/huaheng/pc/config/camera/controller/CameraController.java new file mode 100644 index 0000000..c41d478 --- /dev/null +++ b/src/main/java/com/huaheng/pc/config/camera/controller/CameraController.java @@ -0,0 +1,211 @@ +package com.huaheng.pc.config.camera.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.huaheng.common.utils.security.ShiroUtils; +import com.huaheng.framework.web.page.PageDomain; +import com.huaheng.framework.web.page.TableDataInfo; +import com.huaheng.framework.web.page.TableSupport; +import com.huaheng.common.utils.StringUtils; +import com.huaheng.pc.config.camera.service.ICameraService; +import com.huaheng.pc.system.user.domain.User; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.huaheng.framework.aspectj.lang.annotation.Log; +import com.huaheng.framework.aspectj.lang.constant.BusinessType; +import com.huaheng.pc.config.camera.domain.Camera; +import com.huaheng.framework.web.controller.BaseController; +import com.huaheng.framework.web.domain.AjaxResult; +import com.huaheng.common.support.Convert; +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + + +@Controller +@RequestMapping("/config/camera") +public class CameraController extends BaseController { + private String prefixSB = "config/camera"; + + @Resource + private ICameraService cameraService; + + @GetMapping("/openCamera") + public String camera() { + return prefixSB+"/camera.html"; + } + + /** + * 查询【请填写功能名称】列表 + */ + @RequiresPermissions("config:camera:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(Camera camera) { + LambdaQueryWrapper<Camera> lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper + .eq(StringUtils.isNotEmpty(camera.getWarehouseCode()), Camera::getWarehouseCode, camera.getWarehouseCode()) + .eq(StringUtils.isNotEmpty(camera.getCompanyCode()), Camera::getCompanyCode, camera.getCompanyCode()) + .eq(StringUtils.isNotEmpty(camera.getIp()), Camera::getIp, camera.getIp()) + .eq(StringUtils.isNotEmpty(camera.getPort()), Camera::getPort, camera.getPort()) + .like(StringUtils.isNotEmpty(camera.getUserName()), Camera::getUserName, camera.getUserName()) + .eq(StringUtils.isNotEmpty(camera.getPassword()), Camera::getPassword, camera.getPassword()) + .eq(StringUtils.isNotEmpty(camera.getUseKey()), Camera::getUseKey, camera.getUseKey()) + .eq(StringUtils.isNotNull(camera.getIsEnable()), Camera::getIsEnable, camera.getIsEnable()) + .eq(StringUtils.isNotNull(camera.getIsLocked()), Camera::getIsLocked, camera.getIsLocked()) + .eq(StringUtils.isNotNull(ShiroUtils.getWarehouseCode()),Camera::getWarehouseCode,ShiroUtils.getWarehouseCode()); + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){ + /*使用分页查询*/ + Page<Camera> page = new Page<>(pageNum, pageSize); + IPage<Camera> iPage = cameraService.page(page, lambdaQueryWrapper); + return getMpDataTable(iPage.getRecords(), iPage.getTotal()); + } else { + List<Camera> list = cameraService.list(lambdaQueryWrapper); + return getDataTable(list); + } + } + + /** + * 新增【请填写功能名称】 + */ + @GetMapping("/add") + public String add() { + return prefixSB + "/add"; + } + + /** + * 新增保存【请填写功能名称】 + */ + @RequiresPermissions("config:camera:add") + @Log(title = "【请填写功能名称】", action = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(Camera camera) { + if(camera == null){ + return AjaxResult.error("摄像头信息为空"); + } + camera.setWarehouseCode(ShiroUtils.getWarehouseCode()); + camera.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0)); + camera.setIsEnable(0); + camera.setIsLocked(0); + return toAjax(cameraService.save(camera)); + } + + @GetMapping("/bindCamera/{id}") + public String bindCamera(@PathVariable("id") Integer id, ModelMap mmap) + { + mmap.put("camera", cameraService.getById(id)); + return prefixSB + "/bindCamera"; + } + + @Log(title = "配置-摄像头设置", operating = "绑定摄像头", action = BusinessType.UPDATE) + @PostMapping("/bindUpdate") + @ResponseBody + public AjaxResult bindUpdate(Camera camera) + { + if(camera.getUseKey()==null){ + return error("摄像头绑定失败!!!"); + } + LambdaQueryWrapper<Camera> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(StringUtils.isNotEmpty(camera.getUseKey()),Camera::getUseKey,camera.getUseKey()); + Camera only = cameraService.getOne(queryWrapper); + if(only!=null){ + return error(only.getBindName()+":已经被绑定【 "+only.getIp()+" 】请先解绑,在进行绑定!!"); + } + camera.setIsEnable(1); + camera.setUseKey(camera.getUseKey()); + if (cameraService.updateById(camera)) + { + return success(); + } + return error(); + } + + + @GetMapping("/cameraReset/{id}") + public String resetPwd(@PathVariable("id") Integer id, ModelMap mmap) + { + mmap.put("camera", cameraService.getById(id)); + return prefixSB + "/cameraReset"; + } + + @Log(title = "配置-摄像头设置", operating = "修改密码", action = BusinessType.UPDATE) + @PostMapping("/cameraReset") + @ResponseBody + public AjaxResult resetPwd(Camera camera) + { + boolean flag = cameraService.updateById(camera); + if (flag) + { + return success(); + } + return error(); + } + + @Log(title = "配置-摄像头设置", operating = "解绑", action = BusinessType.UPDATE) + @PostMapping("/unBind/{id}") + @ResponseBody + public AjaxResult unBind(@PathVariable("id") Integer id) + { + Camera camera = cameraService.getById(id); + if(camera==null){ + return error(); + } + camera.setUseKey(""); + camera.setBindName(""); + camera.setIsEnable(0); + boolean flag = cameraService.updateById(camera); + if (flag) + { + return success(); + } + return error(); + } + + /** + * 修改【请填写功能名称】 + */ + @GetMapping("/edit/{id}") + public String edit(@PathVariable("id") Integer id, ModelMap mmap) { + Camera camera = cameraService.getById(id); + mmap.put("camera", camera); + return prefixSB + "/edit"; + } + + /** + * 修改保存【请填写功能名称】 + */ + @RequiresPermissions("config:camera:edit") + @Log(title = "【请填写功能名称】", action = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(Camera camera) { + return toAjax(cameraService.updateById(camera)); + } + + /** + * 删除【请填写功能名称】 + */ + @RequiresPermissions("config:camera:remove") + @Log(title = "【请填写功能名称】", action = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) { + if (StringUtils.isEmpty(ids)){ + return AjaxResult.error("id不能为空"); + } + return toAjax(cameraService.removeByIds(Arrays.asList(Convert.toIntArray(ids)))); + } + +} diff --git a/src/main/java/com/huaheng/pc/config/camera/domain/Camera.java b/src/main/java/com/huaheng/pc/config/camera/domain/Camera.java new file mode 100644 index 0000000..76cb911 --- /dev/null +++ b/src/main/java/com/huaheng/pc/config/camera/domain/Camera.java @@ -0,0 +1,57 @@ +package com.huaheng.pc.config.camera.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import java.io.Serializable; + +/** + * 【请填写功能名称】表 camera + * + * @author huaheng + * @date 2022-05-23 + */ +@ApiModel(value="com.huaheng.pc.config.camera.domain.Camera") +@Data +@TableName(value = "camera") +public class Camera implements Serializable{ + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** 仓库编码 */ + @TableField(value = "warehouseCode") + private String warehouseCode; + /** 货主编码 */ + @TableField(value = "companyCode") + private String companyCode; + /** ip */ + @TableField(value = "ip") + private String ip; + /** 端口 */ + @TableField(value = "port") + private String port; + /** 登录名称 */ + @TableField(value = "userName") + private String userName; + /** 密码 */ + @TableField(value = "password") + private String password; + /** 使用标识 */ + @TableField(value = "useKey") + private String useKey; + /** 是否可用 */ + @TableField(value = "isEnable") + private Integer isEnable; + /** 状态 */ + @TableField(value = "isLocked") + private Integer isLocked; + /** 状态 */ + @TableField(value = "bindName") + private String bindName; + +} diff --git a/src/main/java/com/huaheng/pc/config/camera/mapper/CameraMapper.java b/src/main/java/com/huaheng/pc/config/camera/mapper/CameraMapper.java new file mode 100644 index 0000000..11d5381 --- /dev/null +++ b/src/main/java/com/huaheng/pc/config/camera/mapper/CameraMapper.java @@ -0,0 +1,17 @@ +package com.huaheng.pc.config.camera.mapper; + +import com.huaheng.pc.config.camera.domain.Camera; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】 数据层 + * + * @author huaheng + * @date 2022-05-23 + */ +@Service +public interface CameraMapper extends BaseMapper<Camera> { + +} + diff --git a/src/main/java/com/huaheng/pc/config/camera/service/ICameraService.java b/src/main/java/com/huaheng/pc/config/camera/service/ICameraService.java new file mode 100644 index 0000000..e0f3199 --- /dev/null +++ b/src/main/java/com/huaheng/pc/config/camera/service/ICameraService.java @@ -0,0 +1,16 @@ +package com.huaheng.pc.config.camera.service; + +import com.huaheng.pc.config.camera.domain.Camera; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 【请填写功能名称】 服务层 + * + * @author huaheng + * @date 2022-05-23 + */ +public interface ICameraService extends IService<Camera> { + +} + + diff --git a/src/main/java/com/huaheng/pc/config/camera/service/impl/CameraServiceImpl.java b/src/main/java/com/huaheng/pc/config/camera/service/impl/CameraServiceImpl.java new file mode 100644 index 0000000..9e8d5a7 --- /dev/null +++ b/src/main/java/com/huaheng/pc/config/camera/service/impl/CameraServiceImpl.java @@ -0,0 +1,21 @@ +package com.huaheng.pc.config.camera.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.huaheng.pc.config.camera.domain.Camera; +import com.huaheng.pc.config.camera.mapper.CameraMapper; +import com.huaheng.pc.config.camera.service.ICameraService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + + +/** + * 【请填写功能名称】 服务层实现 + * + * @author huaheng + * @date 2022-05-23 + */ +@Service +public class CameraServiceImpl extends ServiceImpl<CameraMapper, Camera> implements ICameraService { + +} diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java index c990be4..3e641ca 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java @@ -320,17 +320,17 @@ public class InventoryHeaderController extends BaseController } /** * 合托保存 - * @param destContainerCode 原容器 - * @param destContainerCode 目的容器 - * detailIdList ,原容器下面的库存详情id + * @param orgLocationCode 原库位 + * @param destLocationCode 目的库位 + * detailIdList ,原库位下面的库存详情id * @return */ @Log(title = "入库-入库单 ",operating = "修改入库单 ", action = BusinessType.UPDATE) @PostMapping("/conformContainerSave") @ResponseBody - public AjaxResult conformContainerSave(String orgContainerCode, String destContainerCode, String detailIdList) + public AjaxResult conformContainerSave(String orgLocationCode, String destLocationCode, String detailIdList) { - return inventoryHeaderService.conformContainerSave(orgContainerCode, destContainerCode,detailIdList); + return inventoryHeaderService.conformContainerSave(orgLocationCode, destLocationCode,detailIdList); } diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java index 8e05f30..e657eed 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java @@ -67,7 +67,7 @@ public interface InventoryHeaderService extends IService<InventoryHeader> { List<Integer> cycleCountInventoryHeader(); - AjaxResult conformContainerSave(String orgContainerCode, String destContainerCode, String detailIdList); + AjaxResult conformContainerSave(String orgLocationCode, String destLocationCode, String detailIdList); } diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java index 3ec5aa6..b2d7b8b 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java @@ -447,27 +447,30 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe /** * 合托,将原容器物料移到目的容器,可以整个容器全部移到目的容器,也可以其中一分部移动 * 记录库存交易,判断明细不能是锁定状态(详情表锁状态没用到,暂时没判断) - * @param orgContainerCode 原容器 - * @param destContainerCode 目的容器 + * @param orgLocationCode 原容器 + * @param destLocationCode 目的容器 * @param detailIdList 库存详情id * @return */ @Override @Transactional(rollbackFor = Exception.class) - public AjaxResult conformContainerSave(String orgContainerCode, String destContainerCode, String detailIdList) { - if(StringUtils.isEmpty(orgContainerCode)||StringUtils.isEmpty(destContainerCode)){ - return AjaxResult.error("原容器,目的容器不能为空"); + public AjaxResult conformContainerSave(String orgLocationCode, String destLocationCode, String detailIdList) { + if(StringUtils.isEmpty(orgLocationCode)||StringUtils.isEmpty(destLocationCode)){ + return AjaxResult.error("原库位,目的库位不能为空"); } // 判断原容器、目的容器是否存在库存里 - InventoryHeader inventoryHeader=checkContainer(orgContainerCode); - InventoryHeader inventoryHeader1=checkContainer(destContainerCode); + InventoryHeader inventoryHeader=checkContainer(orgLocationCode); + InventoryHeader inventoryHeader1=checkContainer(destLocationCode); if(inventoryHeader==null){ - return AjaxResult.error("原容器不存在库存"); + return AjaxResult.error("原库位不存在库存"); } if(inventoryHeader1==null){ - return AjaxResult.error("目的容器不存在库存"); + return AjaxResult.error("目的库位不存在库存"); + } + if(inventoryHeader.getId().equals(inventoryHeader1.getId())){ + return AjaxResult.error("目的库位库存不能和原库位库存同一个"); } - List<InventoryDetail> list=getDetailByContainerCode(orgContainerCode); + List<InventoryDetail> list=getDetailByContainerCode(orgLocationCode); if(null==list||list.size()==0){ return AjaxResult.error("原容器不存在库存"); } @@ -483,7 +486,7 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe for(int a=0;a<str.length;a++){ Integer detailid=Integer.valueOf(str[a]); if(detail.getId().equals(detailid)){ - saveInvDetail(detail,destContainerCode,inventoryHeader1); + saveInvDetail(detail,destLocationCode,inventoryHeader1); } } } @@ -492,20 +495,20 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe } }else{ for (InventoryDetail detail:list){ - saveInvDetail(detail,destContainerCode,inventoryHeader1); + saveInvDetail(detail,destLocationCode,inventoryHeader1); } } //修改库存主表 - updateInventoryHeader(orgContainerCode); - updateInventoryHeader(destContainerCode); + updateInventoryHeader(orgLocationCode); + updateInventoryHeader(destLocationCode); return AjaxResult.success(); } //保存库存交易表,修改库存详情 - public void saveInvDetail(InventoryDetail detail,String destContainerCode,InventoryHeader inventoryHeader1){ + public void saveInvDetail(InventoryDetail detail,String destLocationCode,InventoryHeader inventoryHeader1){ //保存库存交易 saveInventoryTransaction(detail,true); - detail.setContainerCode(destContainerCode); - detail.setLocationCode(inventoryHeader1.getLocationCode()); + detail.setLocationCode(destLocationCode); + detail.setContainerCode(inventoryHeader1.getContainerCode()); detail.setInventoryHeaderId(inventoryHeader1.getId()); detail.setLastUpdated(new Date()); detail.setLastUpdatedBy(ShiroUtils.getLoginName()); @@ -514,27 +517,27 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe saveInventoryTransaction(detail,false); } //根据容器检查库存主表是否有数量 - public InventoryHeader checkContainer(String orgContainerCode){ + public InventoryHeader checkContainer(String orgLocationCode){ boolean result=false; LambdaQueryWrapper<InventoryHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(InventoryHeader::getContainerCode, orgContainerCode); + lambdaQueryWrapper.eq(InventoryHeader::getLocationCode, orgLocationCode); lambdaQueryWrapper.gt(InventoryHeader::getTotalQty,0); InventoryHeader inventoryHeader=this.getOne(lambdaQueryWrapper); return inventoryHeader; } //根据容器查询库存详情列表 - public List<InventoryDetail> getDetailByContainerCode(String orgContainerCode){ + public List<InventoryDetail> getDetailByContainerCode(String orgLocationCode){ LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(InventoryDetail::getContainerCode, orgContainerCode); + lambdaQueryWrapper.eq(InventoryDetail::getLocationCode, orgLocationCode); List<InventoryDetail> list=inventoryDetailService.list(lambdaQueryWrapper); return list; } //根据容器修改库存主表 - public void updateInventoryHeader(String orgContainerCode){ - List<InventoryDetail> list=getDetailByContainerCode(orgContainerCode); + public void updateInventoryHeader(String orgLocationCode){ + List<InventoryDetail> list=getDetailByContainerCode(orgLocationCode); int qty=0; LambdaQueryWrapper<InventoryHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(InventoryHeader::getContainerCode, orgContainerCode); + lambdaQueryWrapper.eq(InventoryHeader::getLocationCode, orgLocationCode); InventoryHeader inventoryHeader=this.getOne(lambdaQueryWrapper); if(list==null||list.size()==0){ this.removeById(inventoryHeader); diff --git a/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java b/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java index 963a1ef..787311e 100644 --- a/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java +++ b/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java @@ -23,6 +23,9 @@ import com.huaheng.pc.barcode.barcodeDetail.service.BarCodeDetailService; import com.huaheng.pc.barcode.barcodeHeader.domain.BarCodeHeader; import com.huaheng.pc.barcode.barcodeHeader.service.BarCodeHeaderService; import com.huaheng.pc.config.address.service.AddressService; +import com.huaheng.pc.config.camera.domain.Camera; +import com.huaheng.pc.config.camera.service.ICameraService; +import com.huaheng.pc.config.camera.service.impl.CameraServiceImpl; import com.huaheng.pc.config.company.service.CompanyService; import com.huaheng.pc.config.container.service.ContainerService; import com.huaheng.pc.config.location.domain.Location; @@ -97,16 +100,10 @@ public class RyTask extends BaseController { @Resource private TaskHeaderService taskHeaderService; @Resource - private ContainerService containerService; - @Resource private LocationService locationService; @Resource private WcsscanbarcodeService wcsscanbarcodeService; @Resource - private CompanyService companyService; - @Resource - private IUserService userService; - @Resource private IApiLogService apiLogService; @Resource private ZoneService zoneService; @@ -131,15 +128,13 @@ public class RyTask extends BaseController { @Resource private TaskDetailService taskDetailService; @Resource - private ReceiptContainerDetailService receiptContainerDetailService; - @Resource private ReceiptDetailService receiptDetailService; @Resource - private ShipmentContainerDetailService shipmentContainerDetailService; - @Resource private BarCodeHeaderService barCodeHeaderService; @Resource private BarCodeDetailService barCodeDetailService; + @Resource + private ICameraService cameraService; public static String camera1 = null; public static String camera2 = null; @@ -542,18 +537,33 @@ public class RyTask extends BaseController { public AjaxResult loginCamera() { boolean flag= true; String msg = "成功"; - if (StringUtils.isNull(RyTask.camera1) || StringUtils.isNull(RyTask.camera2)) { - LoginModule.init(disConnect, haveReConnect); - RyTask.camera1 = LoginModule.login("10.34.101.55", 37777, "admin", "hk999999"); - if(camera1 == null){ - return AjaxResult.toAjax(false).setData(ToolKits.getErrorCodePrint()); - } - RyTask.camera2 = LoginModule.login("10.34.101.59", 37777, "admin", "hk999999"); - if(camera2 == null){ - return AjaxResult.toAjax(false).setData(ToolKits.getErrorCodePrint()); - } - CapturePictureModule.setSnapRevCallBack(RyTask.m_CaptureReceiveCB); + LambdaQueryWrapper<Camera> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Camera::getUseKey,"camera1"); + Camera c1 = cameraService.getOne(queryWrapper); + String ip1 = c1.getIp(); + String port1 = c1.getPort(); + String userName1 = c1.getUserName(); + String password1 = c1.getPassword(); + + LambdaQueryWrapper<Camera> queryWrapper2 = Wrappers.lambdaQuery(); + queryWrapper2.eq(Camera::getUseKey,"camera2"); + Camera c2 = cameraService.getOne(queryWrapper); + String ip2 = c2.getIp(); + String port2 = c2.getPort(); + String userName2 = c2.getUserName(); + String password2 = c2.getPassword(); + + LoginModule.init(disConnect, haveReConnect); + + RyTask.camera1 = LoginModule.login(ip1, Integer.valueOf(port1), userName1, password1); + if(RyTask.camera1 == null){ + return AjaxResult.toAjax(false).setData(ToolKits.getErrorCodePrint()); + } + RyTask.camera2 = LoginModule.login(ip2, Integer.valueOf(port2), userName2, password2); + if(camera2 == null){ + return AjaxResult.toAjax(false).setData(ToolKits.getErrorCodePrint()); } + CapturePictureModule.setSnapRevCallBack(RyTask.m_CaptureReceiveCB); return AjaxResult.success(); } diff --git a/src/main/resources/mybatis/config/CameraMapper.xml b/src/main/resources/mybatis/config/CameraMapper.xml new file mode 100644 index 0000000..6cdcba8 --- /dev/null +++ b/src/main/resources/mybatis/config/CameraMapper.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.huaheng.pc.config.camera.mapper.CameraMapper"> + + <resultMap type="com.huaheng.pc.config.camera.domain.Camera" id="cameraResult"> + <result property="id" column="id" /> + <result property="warehouseCode" column="warehouseCode" /> + <result property="companyCode" column="companyCode" /> + <result property="ip" column="ip" /> + <result property="port" column="port" /> + <result property="userName" column="userName" /> + <result property="password" column="password" /> + <result property="useKey" column="useKey" /> + <result property="isEnable" column="isEnable" /> + <result property="isLocked" column="isLocked" /> + <result property="bindName" column="bindName" /> + </resultMap> + <sql id="selectCameraVo"> + select id, warehouseCode, companyCode, ip, port, userName, password, useKey, isEnable, isLocked,bindName from camera + </sql> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/templates/config/camera/add.html b/src/main/resources/templates/config/camera/add.html new file mode 100644 index 0000000..8a00e91 --- /dev/null +++ b/src/main/resources/templates/config/camera/add.html @@ -0,0 +1,92 @@ +<!DOCTYPE HTML> +<html lang="zh" xmlns:th="http://www.thymeleaf.org"> +<meta charset="utf-8"> +<head> + <th:block th:include="include :: header"/> + </head> +<body class="white-bg"> +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> + <form class="form-horizontal m" id="form-camera-add"> + <div class="form-group"> + <label class="col-sm-3 control-label">ip + :</label> + <div class="col-sm-8"> + <input id="ip" name="ip" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">端口 + :</label> + <div class="col-sm-8"> + <input id="port" name="port" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">登录名称 + :</label> + <div class="col-sm-8"> + <input id="userName" name="userName" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">密码 :</label> + <div class="col-sm-8"> + <input id="password" name="password" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <div class="form-control-static col-sm-offset-9"> + <button type="submit" class="btn btn-primary">提交</button> + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> + </div> + </div> + </form> +</div> +<th:block th:include="include :: footer"/> +<script type="text/javascript"> + var prefix = ctx + "config/camera" + function submitHandler() { + if ($.validate.form()) { + $.operate.save(prefix + "/add", $('#form-camera-add').serialize()); + } + } + $("#form-camera-add").validate({ + rules:{ + ip:{ + required:true, + }, + port:{ + required:true, + }, + userName:{ + required:true, + }, + password:{ + required:true, + }, + }, + submitHandler: function(form) { + $.ajax({ + cache : true, + type : "POST", + url : ctx + "config/camera/add", + data : $('#form-camera-add').serialize(), + async : false, + error : function(request) { + $.modal.alertError("请求失败!"); + }, + success : function(result) { + setTimeout(function () { + // 因为使用layui弹出 所以需要引用 + var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引 + // + parent.loadDetail(); + parent.layer.close(index); //再执行关闭 + }, 1000); + } + }); + } + }); + </script> +</body> +</html> diff --git a/src/main/resources/templates/config/camera/bindCamera.html b/src/main/resources/templates/config/camera/bindCamera.html new file mode 100644 index 0000000..a62d531 --- /dev/null +++ b/src/main/resources/templates/config/camera/bindCamera.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html lang="zh" xmlns:th="http://www.thymeleaf.org" > +<meta charset="utf-8"> +<head th:include="include :: header"></head> +<body class="white-bg"> +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> + <form class="form-horizontal m" id="form-camera-bindCamera"> + <input id="id" name="id" type="hidden" th:value="${camera.id}" /> + <div class="form-group"> + <label class="col-sm-3 control-label ">摄像头IP:</label> + <div class="col-sm-8"> + <input class="form-control" type="text" readonly="true" id="ip" name="ip" th:value="${camera.ip}"/> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">选择摄像头:</label> + <div class="col-sm-8"> + <select id="useKey" name="useKey" class="form-control" th:with="firstStatus=${@dict.getType('cameraIp')}"> + <option value="">请选择</option> + <option th:each="item : ${firstStatus}" th:text="${item['dictLabel']}" th:value="${item['dictValue']}" th:attr = " code = ${item['dictValue']}"></option> + </select> + + </div> + </div> + <div class="form-group"> + <div class="form-control-static col-sm-offset-9"> + <button type="submit" class="btn btn-primary">提交</button> + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> + </div> + </div> + </form> +</div> +<div th:include="include :: footer"></div> +<script type="text/javascript"> + $("#form-camera-bindCamera").validate({ + submitHandler:function(form){ + let url = ctx + "config/camera/bindUpdate"; + let useKey = $("#useKey").val(); + if(useKey==''){ + $.modal.alertWarning("选择绑定摄像头后在提交!!!"); + return false; + } + let data = { + "id":$("#id").val(), + "ip":$("#ip").val(), + "useKey":$("#useKey option:selected").val(), + "bindName":$("select[name='useKey']").find("option:selected").text(), + } + var config = { + url: url, + type: "post", + dataType: "json", + data: data, + success: function (result) { + if(result.code==web_status.SUCCESS){ + layer.alert(result.msg, { icon: 1, closeBtn: 0 }, function () { + var index = parent.layer.getFrameIndex(window.name); + layer.close(index); + parent.location.reload(); + parent.layer.close(index); //再执行关闭 + }) + }else{ + layer.alert(result.msg, { icon: 2, closeBtn: 0 }, function () { + var index = parent.layer.getFrameIndex(window.name); + layer.close(index); + parent.location.reload(); + parent.layer.close(index); //再执行关闭 + }) + } + + } + }; + $.ajax(config) + } + }); +</script> +</body> + +</html> diff --git a/src/main/resources/templates/config/camera/camera.html b/src/main/resources/templates/config/camera/camera.html new file mode 100644 index 0000000..b8f0447 --- /dev/null +++ b/src/main/resources/templates/config/camera/camera.html @@ -0,0 +1,212 @@ +<!DOCTYPE HTML> +<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> +<meta charset="utf-8"> +<head th:include="include :: header"></head> +<body class="gray-bg"> + <div class="container-div"> + <div class="row"> + <div class="col-sm-12 select-info"> + <form id="formId"> + <div class="select-list"> + <ul> + <li> + <label>ip:</label> + <input type="text" name="ip"/> + </li> + <li> + <label>端口:</label> + <input type="text" name="port"/> + </li> + <li> + <label>登录名称:</label> + <input type="text" name="userName"/> + </li> + <li> + <label>使用标识:</label> + <input type="text" name="useKey" value=""/> + </li> + <li> + <label>是否可用:</label> + <input type="text" name="isEnable"/> + </li> + <li> + <label>状态:</label> + <input type="text" name="isLocked"/> + </li> + <li> + <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a> + <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> 重置</a> + </li> + </ul> + </div> + </form> + <div class="btn-group hidden-xs" id="toolbar" role="group"> + <a class="btn btn-outline btn-success btn-rounded" onclick="$.operate.add()"> + <i class="fa fa-plus"></i> 新增 + </a> + <a class="btn btn-outline btn-primary single disabled" onclick="$.operate.edit()"> + <i class="fa fa-edit"></i> 修改 + </a> + <a class="btn btn-outline btn-danger btn-rounded multiple disabled" onclick="$.operate.batRemove()" > + <i class="fa fa-trash-o"></i> 删除 + </a> + </div> + <div class="col-sm-12 select-info table-striped tab-pane"> + <table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover text-nowrap"></table> + </div> + </div> + + </div> + </div> + <div th:include="include :: footer"></div> + <script th:inline="javascript"> + var editFlag = [[${@permission.hasPermi('config:camera:edit')}]]; + var removeFlag = [[${@permission.hasPermi('config:camera:remove')}]]; + var prefix = ctx + "config/camera" + + function initFrame() { + $.ajax({ + url:ctx + 'config/camera/list', + type:"post", + success:function (value) { + $('#bootstrap-table').bootstrapTable({ + toolbar:"#toolbar", + data:value.data, + columns: value.total, + }); + } + }); + } + /*用户管理-重置密码*/ + function resetPwd(id) { + var url = prefix + '/cameraReset/' + id; + $.modal.open("重置密码", url, '800', '300'); + } + + /*用户管理-重置密码*/ + function bindCamera(id) { + var url = prefix + '/bindCamera/' + id; + $.modal.open("绑定摄像头", url, '800', '300'); + } + + function unBind(id) { + var url = prefix + '/unBind/' + id; + var config = { + url: url, + type: "post", + dataType: "json", + success: function (result) { + layer.alert(result.msg, { icon: 1, closeBtn: 0 }, function () { + location.reload(); + }) + } + }; + $.ajax(config); + } + + $(function() { + var options = { + url: prefix + "/list", + createUrl: prefix + "/add", + updateUrl: prefix + "/edit/{id}", + removeUrl: prefix + "/remove", + modalName: "【请填写功能名称】", + columns: [{ + checkbox: true + }, + { + field: 'id', + title: 'id', + visible: true + }, + { + field: 'warehouseCode', + title: '仓库编码', + visible: false + }, + { + field: 'companyCode', + title: '货主编码', + visible: false + }, + { + field: 'ip', + title: 'ip', + align: 'center', + }, + { + field: 'port', + title: '端口', + align: 'center', + }, + { + field: 'userName', + title: '登录名称', + align: 'center', + }, + { + field: 'password', + title: '密码', + visible: false + }, + { + field: 'useKey', + title: '使用标识', + visible: false + }, + { + field: 'isEnable', + title: '状态', + align: 'center', + formatter: function(value, row, index) { + if(value!=undefined){ + if(value==0){ + return '<span class="badge badge-info">空闲</span>' + }else if(value==1){ + return '<span class="badge badge-danger">使用中</span>' + } + } + return ''; + } + }, + { + field: 'bindName', + title: '绑定名称', + align: 'center', + }, + { + field: 'isLocked', + title: '锁定', + align: 'center', + formatter: function(value, row, index) { + if(value!=undefined){ + if(value==0){ + return '<span class="badge badge-info">正常</span>' + }else if(value==1){ + return '<span class="badge badge-danger">锁定</span>' + } + } + return ''; + } + }, + { + title: '操作', + align: 'center', + formatter: function(value, row, index) { + var actions = []; + // actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> '); + actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-trash-o"></i>删除</a>'); + actions.push('<a class="btn btn-info btn-xs ' + removeFlag + '" href="#" onclick="resetPwd(\'' + row.id + '\')"><i class="fa fa-key"></i>修改密码</a>'); + actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="bindCamera(\'' + row.id + '\')"><i class="fa fa-lock"></i>绑定摄像头</a>'); + if (row.useKey != undefined && row.useKey != '' ){ + actions.push('<a class="btn btn-primary btn-xs ' + removeFlag + '" href="#" onclick="unBind(\'' + row.id + '\')"><i class="fa fa-unlock"></i>解绑</a>'); + } + return actions.join(''); + } + }] + }; + $.table.init(options); + }); + </script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/config/camera/cameraReset.html b/src/main/resources/templates/config/camera/cameraReset.html new file mode 100644 index 0000000..4fbc930 --- /dev/null +++ b/src/main/resources/templates/config/camera/cameraReset.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html lang="zh" xmlns:th="http://www.thymeleaf.org" > +<meta charset="utf-8"> +<head th:include="include :: header"></head> +<body class="white-bg"> +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> + <form class="form-horizontal m" id="form-camera-cameraReset"> + <input name="id" type="hidden" th:value="${camera.id}" /> + <div class="form-group"> + <label class="col-sm-3 control-label ">摄像头IP:</label> + <div class="col-sm-8"> + <input class="form-control" type="text" readonly="true" name="ip" th:value="${camera.ip}"/> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">输入密码:</label> + <div class="col-sm-8"> + <input class="form-control" type="password" name="password" id="password" value="123456"> + </div> + </div> + <div class="form-group"> + <div class="form-control-static col-sm-offset-9"> + <button type="submit" class="btn btn-primary">提交</button> + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> + </div> + </div> + </form> +</div> +<div th:include="include :: footer"></div> +<script type="text/javascript"> + $("#form-camera-cameraReset").validate({ + rules:{ + password:{ + required:true, + minlength: 5, + maxlength: 20 + }, + }, + submitHandler:function(form){ + let url = ctx + "config/camera/cameraReset"; + let data = $('#form-camera-cameraReset').serialize(); + $.modal.loading("正在处理中,请稍后..."); + var config = { + url: url, + type: "post", + dataType: "json", + data: data, + success: function (result) { + layer.alert(result.msg, { icon: 1, closeBtn: 0 }, function () { + var index = parent.layer.getFrameIndex(window.name); + layer.close(index); + parent.layer.close(index); //再执行关闭 + }) + } + }; + $.ajax(config) + } + + }); +</script> +</body> + +</html> diff --git a/src/main/resources/templates/config/camera/edit.html b/src/main/resources/templates/config/camera/edit.html new file mode 100644 index 0000000..ce2dc48 --- /dev/null +++ b/src/main/resources/templates/config/camera/edit.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html lang="zh" xmlns:th="http://www.thymeleaf.org" > +<head> + <th:block th:include="include :: header" /> + </head> +<body class="white-bg"> +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> + <form class="form-horizontal m" id="form-camera-edit" th:object="${camera}"> + <input name="id" th:field="*{id}" type="hidden"> + <input name="warehouseCode" th:field="*{warehouseCode}" class="form-control" type="hidden"> + <input name="companyCode" th:field="*{companyCode}" class="form-control" type="hidden"> + <div class="form-group"> + <label class="col-sm-3 control-label">ip:</label> + <div class="col-sm-8"> + <input name="ip" th:field="*{ip}" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">端口:</label> + <div class="col-sm-8"> + <input name="port" th:field="*{port}" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">登录名称:</label> + <div class="col-sm-8"> + <input name="userName" th:field="*{userName}" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">密码:</label> + <div class="col-sm-8"> + <input name="password" th:field="*{password}" class="form-control" type="password"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">使用标识:</label> + <div class="col-sm-8"> + <input name="useKey" th:field="*{useKey}" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">是否可用:</label> + <div class="col-sm-8"> + <input name="isEnable" th:field="*{isEnable}" class="form-control" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">状态:</label> + <div class="col-sm-8"> + <input name="isLocked" th:field="*{isLocked}" class="form-control" type="text"> + </div> + </div> + </form> +</div> +<th:block th:include="include :: footer" /> +<script th:inline="javascript"> + var prefix = ctx + "camera/camera"; + $("#form-camera-edit").validate({ + focusCleanup: true + }); + + function submitHandler() { + if ($.validate.form()) { + $.operate.save(prefix + "/edit", $('#form-camera-edit').serialize()); + } + } + </script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/inventory/inventoryHeader/conformContainer.html b/src/main/resources/templates/inventory/inventoryHeader/conformContainer.html index 68f5ec1..b462f02 100644 --- a/src/main/resources/templates/inventory/inventoryHeader/conformContainer.html +++ b/src/main/resources/templates/inventory/inventoryHeader/conformContainer.html @@ -5,20 +5,22 @@ <body class="white-bg"> <div class="wrapper wrapper-content animated fadeInRight ibox-content"> <form class="form-horizontal m" id="form-task-emptyIn"> - <span style="color:red;margin-left:25%">*如果不勾选明细,则默认该容器明细全部转移到目的容器</span> + <span style="color:red;margin-left:25%">*如果不勾选明细,则默认该库位明细全部转移到目的容器</span> <div class="form-group"> - <label class="col-sm-3 control-label">原容器编码:</label> + <label class="col-sm-3 control-label">原库位编码:</label> <div class="col-sm-6"> - <input id="orgContainerCode" name="orgContainerCode" class="form-control" type="text" > + <input id="orgLocationCode" name="orgLocationCode" class="form-control" type="text" > + <!--<input id="orgContainerCode" name="orgContainerCode" class="form-control" type="text" >--> </div> <input type="hidden" id="detailIdList" name="detailIdList"> <button type="button" class="btn btn-primary" onclick="selectMaterial()">选取明细</button> <button type="button" class="btn btn-primary" onclick="clearSelect()">清空明细</button> </div> <div class="form-group"> - <label class="col-sm-3 control-label">目的容器:</label> + <label class="col-sm-3 control-label">目的库位:</label> <div class="col-sm-8"> - <input id="destContainerCode" name="destContainerCode" class="form-control" type="text" > + <input id="destLocationCode" name="destLocationCode" class="form-control" type="text"> + <!--<input id="destContainerCode" name="destContainerCode" class="form-control" type="text">--> </div> </div> <div class="col-sm-12 select-info" id="selecttable" > @@ -43,16 +45,16 @@ $("#detailIdList").val(''); } function selectMaterial(){ - var orgContainerCode=$("#orgContainerCode").val(); - if(orgContainerCode==''||orgContainerCode==undefined){ - $.modal.alertError("请填写原容器编码"); + var orgLocationCode=$("#orgLocationCode").val(); + if(orgLocationCode==''||orgLocationCode==undefined){ + $.modal.alertError("请填写原库位编码"); return; } $.ajax({ url:prefix + '/inventoryDetailLook', type:"post", data:{ - "containerCode":orgContainerCode, + "locationCode":orgLocationCode, }, success:function (value) { console.log(value) @@ -183,14 +185,14 @@ $("#form-task-emptyIn").validate({ submitHandler: function(form) { - var orgContainerCode=$("#orgContainerCode").val(); - var destContainerCode=$("#destContainerCode").val(); - if(orgContainerCode==''||destContainerCode==''){ - $.modal.alertError("请填写原容器编码和目的容器编号"); + var orgLocationCode=$("#orgLocationCode").val(); + var destLocationCode=$("#destLocationCode").val(); + if(orgLocationCode==''||destLocationCode==''){ + $.modal.alertError("请填写原库位编码和目的库位编号"); return; } let rows = $("#bootstrap-table").bootstrapTable('getSelections'); - console.log(rows); + //console.log(rows); var ids = ""; for (var i = 0; i<rows.length; i++){ ids += rows[i].id; @@ -202,8 +204,8 @@ url:prefix_header + "/conformContainerSave", type:"post", data:{ - "orgContainerCode":orgContainerCode, - "destContainerCode":destContainerCode, + "orgLocationCode":orgLocationCode, + "destLocationCode":destLocationCode, "detailIdList":ids, }, success:function (result) {