diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/framework/bean/ProductUnitEnum.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/framework/bean/ProductUnitEnum.java new file mode 100644 index 0000000000..ab9c6f0ef6 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/framework/bean/ProductUnitEnum.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.erp.framework.bean; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +//关键重量单位不允许更改 +@Getter +@AllArgsConstructor +public enum ProductUnitEnum { + + Ton(2L, "t"), + Kilogram(3L, "kg"), + Gram(4L, "g"), + Each(5L, "个"); + + /** + * 值 + */ + private final Long unitId; + /** + * 名 + */ + private final String name; + + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java index d2592a4921..80caaa1644 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.erp.service.product; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductUnitMapper; +import cn.iocoder.yudao.module.erp.framework.bean.ProductUnitEnum; import com.google.common.annotations.VisibleForTesting; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -46,6 +48,12 @@ public class ErpProductUnitServiceImpl implements ErpProductUnitService { @Override public void updateProductUnit(ErpProductUnitSaveReqVO updateReqVO) { + if(updateReqVO.getId().equals(ProductUnitEnum.Ton.getUnitId()) || + updateReqVO.getId().equals(ProductUnitEnum.Kilogram.getUnitId()) + || updateReqVO.getId().equals(ProductUnitEnum.Gram.getUnitId()) + || updateReqVO.getId().equals(ProductUnitEnum.Each.getUnitId())){ + throw exception(new ErrorCode(500,"内置单位不允许更改")); + } // 1.1 校验存在 validateProductUnitExists(updateReqVO.getId()); // 1.2 校验名字唯一 @@ -72,6 +80,10 @@ public class ErpProductUnitServiceImpl implements ErpProductUnitService { @Override public void deleteProductUnit(Long id) { + if(id.equals(ProductUnitEnum.Ton.getUnitId()) || id.equals(ProductUnitEnum.Kilogram.getUnitId()) + || id.equals(ProductUnitEnum.Gram.getUnitId()) || id.equals(ProductUnitEnum.Each.getUnitId())){ + throw exception(new ErrorCode(500,"内置单位不允许更改")); + } // 1.1 校验存在 validateProductUnitExists(id); // 1.2 校验产品是否使用 diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index f6b59df8e6..85f496b0f0 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.iot.controller.admin.device; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.gateway.GatewayDO; +import cn.iocoder.yudao.module.iot.framework.gateway.service.impl.TheGatewayServiceImpl; +import cn.iocoder.yudao.module.iot.service.gateway.GatewayService; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; @@ -37,6 +40,8 @@ public class DeviceController { @Resource private DeviceService deviceService; + @Resource + private GatewayService gatewayService; @PostMapping("/create") @Operation(summary = "创建物联设备") @@ -91,7 +96,15 @@ public class DeviceController { ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class, BeanUtils.toBean(list, DeviceRespVO.class)); } - + @GetMapping("/pushDevice") + @Operation(summary = "下发物联设备配置到网关") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('iot:device:update')") + public CommonResult pushDevice(@RequestParam("id") Long id) { + DeviceDO device = deviceService.getDevice(id); + GatewayDO gatewayDO = gatewayService.getGateway(device.getGatewayId()); + return deviceService.pushDevice(device,gatewayDO); + } // ==================== 子表(设备属性) ==================== @GetMapping("/device-attribute/page") @@ -107,6 +120,8 @@ public class DeviceController { @Operation(summary = "创建设备属性") @PreAuthorize("@ss.hasPermission('iot:device:create')") public CommonResult createDeviceAttribute(@Valid @RequestBody DeviceAttributeDO deviceAttribute) { + DeviceDO deviceDO = deviceService.getDevice(deviceAttribute.getDeviceId()); + deviceAttribute.setDeviceCode(deviceDO.getDeviceCode()); return success(deviceService.createDeviceAttribute(deviceAttribute)); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java index 6ea2815309..3a593a1b5a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java @@ -130,7 +130,7 @@ public class DeviceAttributeDO extends BaseDO { /** * 个数 */ - private String modbusFieldSize; + private Integer modbusFieldSize; /** * 缩放因子(默认值为1,大于0的小数 */ @@ -161,6 +161,10 @@ public class DeviceAttributeDO extends BaseDO { * 设备id */ private Long deviceId; + /** + * 设备code + */ + private String deviceCode; /** * 组织设备id */ diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java index 4ac64c7062..7eb4eaee7c 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java @@ -26,5 +26,7 @@ public interface DeviceAttributeMapper extends BaseMapperX { default int deleteByDeviceId(Long deviceId) { return delete(DeviceAttributeDO::getDeviceId, deviceId); } - + default List selectByDeviceId(Long deviceId) { + return selectList(DeviceAttributeDO::getDeviceId, deviceId); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java index 7ad141f044..96b8d6ee69 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java @@ -4,10 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; +import java.util.List; + /** * 物联设备 Mapper * @@ -57,4 +60,7 @@ public interface DeviceMapper extends BaseMapperX { default int deleteByGatewayId(Long gatewayId) { return delete(DeviceDO::getGatewayId, gatewayId); } + default List selectByGatewayId(Long gatewayId) { + return selectList(DeviceDO::getGatewayId, gatewayId); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceTypeEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceTypeEnum.java new file mode 100644 index 0000000000..ce68a5ca2b --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceTypeEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.iot.framework.constant; + +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +@AllArgsConstructor +public enum DeviceTypeEnum { + + modbus("modbus", "modbus"), + siemens("siemens", "siemens"); + private final String value; + + private final String name; + + public static boolean isSiemens(String value) { + return ObjUtil.equal(siemens.value, value); + } + + public static boolean isModbus(String value) { + return ObjUtil.equal(modbus.value, value); + } +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/GatewayMqttServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/GatewayMqttServiceImpl.java index 0352bc8f1e..9ae15391de 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/GatewayMqttServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/GatewayMqttServiceImpl.java @@ -22,8 +22,8 @@ import java.io.UnsupportedEncodingException; import java.util.List; @Service -public class GatewayServiceImpl implements GatewayMqttService { - private static final Logger log = LoggerFactory.getLogger(GatewayServiceImpl.class); +public class GatewayMqttServiceImpl implements GatewayMqttService { + private static final Logger log = LoggerFactory.getLogger(GatewayMqttServiceImpl.class); private String cookie; //先登录 @Override diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/TheGatewayServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/TheGatewayServiceImpl.java index be97f5accc..ba9afaf5d0 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/TheGatewayServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/service/impl/TheGatewayServiceImpl.java @@ -2,12 +2,22 @@ package cn.iocoder.yudao.module.iot.framework.gateway.service.impl; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.gateway.GatewayDO; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceAttributeMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.framework.constant.AddressDataType; +import cn.iocoder.yudao.module.iot.framework.gateway.bo.ChangeStatus; import cn.iocoder.yudao.module.iot.framework.gateway.bo.HttpEntity; -import cn.iocoder.yudao.module.iot.framework.gateway.entity.DeviceVideoEntity; +import cn.iocoder.yudao.module.iot.framework.gateway.entity.*; +import cn.iocoder.yudao.module.iot.framework.gateway.service.GatewayMqttService; +import cn.iocoder.yudao.module.iot.framework.gateway.service.IModbusPointService; +import cn.iocoder.yudao.module.iot.framework.gateway.service.ISiemensPointService; +import cn.iocoder.yudao.module.iot.framework.gateway.service.IVideoService; import cn.iocoder.yudao.module.iot.framework.gateway.util.HttpUtils; import cn.iocoder.yudao.module.iot.framework.gateway.util.UrlConstans; +import cn.iocoder.yudao.module.iot.service.device.DeviceService; import cn.iocoder.yudao.module.iot.service.gateway.GatewayService; import com.alibaba.fastjson.JSON; import lombok.Data; @@ -19,6 +29,7 @@ import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -26,17 +37,19 @@ import java.util.List; @Service public class TheGatewayServiceImpl { - @Autowired - private IBeEquipmentsSiemensService beEquipmentsSiemensService; - @Autowired - private IIoPointService ioPointService; - @Autowired + @Resource + private DeviceMapper deviceMapper; + @Resource + private DeviceAttributeMapper deviceAttributeMapper; + @Resource private IVideoService videoService; - @Autowired + @Resource private ISiemensPointService siemensPointService; - @Autowired - private IMqttService mqttService; - @Autowired + @Resource + private IModbusPointService modbusPointService; + @Resource + private GatewayMqttService gatewayMqttService; + @Resource private GatewayService gatewayService; //清除原本的西门子设备和点位数据 @@ -67,29 +80,30 @@ public class TheGatewayServiceImpl { // } //清除指定原本的西门子设备和点位数据 - public void deleteSiemensEntity(GatewayDO gatewayDO, String deviceCode) { - siemensPointService.login(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); - List list = siemensPointService.getSiemensList(gatewaysMessage.getAdminIp(), - gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + public void deleteSiemensEntity(GatewayDO gatewayDO, DeviceDO deviceDO) { + + siemensPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); + List list = siemensPointService.getSiemensList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceDO.getDeviceCode()); if (null != list && list.size() > 0) { //先清除点位数据 String[] deviceIds = new String[list.size()]; for (int i = 0; i < list.size(); i++) { deviceIds[i] = list.get(i).getDeviceConfigID(); //删除每个设备下的原有点位 - List pointList = siemensPointService.getPointListAll(gatewaysMessage.getAdminIp(), - list.get(i).getDeviceConfigID(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); + List pointList = siemensPointService.getPointListAll(gatewayDO.getAdminIp(), + list.get(i).getDeviceConfigID(), gatewayDO.getUsername(), gatewayDO.getPassword()); if (pointList != null && pointList.size() > 0) { String[] addressIds = new String[pointList.size()]; for (int j = 0; j < pointList.size(); j++) { addressIds[j] = pointList.get(j).getDeviceConfigContentID().toString(); } //删除点位 - siemensPointService.deletePoint(gatewaysMessage.getAdminIp(), String.join(",", addressIds)); + siemensPointService.deletePoint(gatewayDO.getAdminIp(), String.join(",", addressIds)); } } //再清除设备数据 - siemensPointService.delete(gatewaysMessage.getAdminIp(), String.join(",", deviceIds)); + siemensPointService.delete(gatewayDO.getAdminIp(), String.join(",", deviceIds)); } } @@ -125,180 +139,126 @@ public class TheGatewayServiceImpl { // } //新增西门子设备 - public void addSiemensEntity(GatewayDO gatewaysMessage, DeviceDO siemens) { - siemensPointService.login(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); + public void addSiemensEntity(GatewayDO gatewayDO, DeviceDO siemens) { + siemensPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); DeviceSiemensEntity deviceSiemensEntity = new DeviceSiemensEntity(); - deviceSiemensEntity.setDeviceID(siemen.getDeviceId()); - deviceSiemensEntity.setDeviceName(siemen.getDeviceName()); - deviceSiemensEntity.setSiemensSeries(siemen.getSiemensSeries()); - deviceSiemensEntity.setSiemensConnectParam(siemen.getSiemensConnectParam()); - deviceSiemensEntity.setReadCronType(siemen.getReadCronType()); - deviceSiemensEntity.setReadRepeatValue(siemen.getReadRepeatValue()); - deviceSiemensEntity.setReadRepeatUnit(siemen.getReadRepeatUnit()); - deviceSiemensEntity.setReadCron(siemen.getReadCron()); - deviceSiemensEntity.setWriteCronType(siemen.getWriteCronType()); - deviceSiemensEntity.setWriteRepeatValue(siemen.getWriteRepeatValue()); - deviceSiemensEntity.setWriteCron(siemen.getWriteCron()); - deviceSiemensEntity.setLocalPersistent(siemen.getLocalPersistent()); - deviceSiemensEntity.setUploadRate(siemen.getUploadRate()); - deviceSiemensEntity.setRateCount(siemen.getRateCount()); - siemensPointService.add(deviceSiemensEntity, gatewaysMessage.getAdminIp()); + deviceSiemensEntity.setDeviceID(siemens.getDeviceCode()); + deviceSiemensEntity.setDeviceName(siemens.getDeviceName()); + deviceSiemensEntity.setSiemensSeries(siemens.getSiemensSeries()); + deviceSiemensEntity.setSiemensConnectParam(siemens.getSiemensConnectParam()); + deviceSiemensEntity.setReadCronType(siemens.getReadCronType()); + deviceSiemensEntity.setReadRepeatValue(siemens.getReadRepeatValue()); + deviceSiemensEntity.setReadRepeatUnit(siemens.getReadRepeatUnit()); + deviceSiemensEntity.setReadCron(siemens.getReadCron()); + deviceSiemensEntity.setWriteCronType(siemens.getWriteCronType()); + deviceSiemensEntity.setWriteRepeatValue(siemens.getWriteRepeatValue()); + deviceSiemensEntity.setWriteCron(siemens.getWriteCron()); + deviceSiemensEntity.setLocalPersistent(siemens.getLocalPersistent()); + deviceSiemensEntity.setUploadRate(siemens.getUploadRate()); + deviceSiemensEntity.setRateCount(siemens.getRateCount()); + siemensPointService.add(deviceSiemensEntity, gatewayDO.getAdminIp()); } //下发完成西门子设备后 下发对应设备的点位 - public void addDeviceSiemensEntity(BeGatewaysMessage gatewaysMessage,String equipmentsId, String deviceId) { - siemensPointService.login(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); + public void addDeviceSiemensEntity(GatewayDO gatewayDO,Long machineId, DeviceDO deviceDO) { + siemensPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); /*下发好设备后获取设备列表找点位*/ - List siemensList = siemensPointService.getSiemensList(gatewaysMessage.getAdminIp(), - gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + List siemensList = siemensPointService.getSiemensList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceDO.getDeviceCode()); for (DeviceSiemensEntity deviceSiemensEntity : siemensList) { //根据deviceId 和机台编码查询sql数据库点位信息 - IoPoint bo = new IoPoint(); - bo.setDeviceId(deviceSiemensEntity.getDeviceID()); - bo.setEquipmentsId(equipmentsId); - //检索 - List points = ioPointService.list(ioPointService.buildQueryWrapper(bo)); + List points = deviceAttributeMapper.selectByDeviceId(deviceDO.getId()); List list = new ArrayList<>(); - for (IoPoint point : points) { - //新增点位 - SiemensPointEntity siemensPointEntity = new SiemensPointEntity(); - siemensPointEntity.setSiemensFieldName(point.getPointCode()); - siemensPointEntity.setSiemensFieldAddress(point.getAddress()); + for (DeviceAttributeDO point : points) { Integer dataType = AddressDataType.getGatewayDataTypeMap(point.getDataType()); - siemensPointEntity.setSiemensFieldDataType(dataType); - siemensPointEntity.setSiemensFieldPrecision(point.getSiemensFieldPrecision()); - siemensPointEntity.setSiemensFieldUnit(point.getUnit()); - list.add(siemensPointEntity); - } - if (list.size() > 0) - siemensPointService.add(list, gatewaysMessage.getAdminIp(), deviceSiemensEntity.getDeviceConfigID()); - } - } - - //下发完成西门子设备后 下发对应设备的点位 - public void addDeviceSiemensEntity(BeEquipments equipments) { - siemensPointService.login(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); - /*下发好设备后获取设备列表找点位*/ - List siemensList = siemensPointService.getSiemensList(equipments.getAdminIp(), - equipments.getUsername(), equipments.getPassword()); - - for (DeviceSiemensEntity deviceSiemensEntity : siemensList) { - //根据deviceId 和机台编码查询sql数据库点位信息 - IoPoint bo = new IoPoint(); - bo.setDeviceId(deviceSiemensEntity.getDeviceID()); - bo.setEquipmentsId(equipments.getEquipmentsId()); - //检索 - List points = ioPointService.list(ioPointService.buildQueryWrapper(bo)); - List list = new ArrayList<>(); - for (IoPoint point : points) { //新增点位 - SiemensPointEntity siemensPointEntity = new SiemensPointEntity(); - siemensPointEntity.setSiemensFieldName(point.getPointCode()); - siemensPointEntity.setSiemensFieldAddress(point.getAddress()); - Integer dataType = AddressDataType.getGatewayDataTypeMap(point.getDataType()); - siemensPointEntity.setSiemensFieldDataType(dataType); - siemensPointEntity.setSiemensFieldPrecision(point.getSiemensFieldPrecision()); - siemensPointEntity.setSiemensFieldUnit(point.getUnit()); + SiemensPointEntity siemensPointEntity = new SiemensPointEntity() + .setSiemensFieldName(point.getAttributeCode()) + .setSiemensFieldAddress(point.getAddress()) + .setSiemensFieldDataType(dataType) + .setSiemensFieldPrecision(point.getSiemensFieldPrecision()) + .setSiemensFieldUnit(point.getUnit()); + list.add(siemensPointEntity); } if (list.size() > 0) - siemensPointService.add(list, equipments.getAdminIp(), deviceSiemensEntity.getDeviceConfigID()); + siemensPointService.add(list, gatewayDO.getAdminIp(), deviceSiemensEntity.getDeviceConfigID()); } } //清除原本的Modbus设备数据 - public void deleteModbusEntity(BeEquipments equipments) { - modbusPointService.login(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); - List list = modbusPointService.getModbusList(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); - if (null != list && list.size() > 0) { - //先清除点位数据 - String[] deviceIds = new String[list.size()]; - for (int i = 0; i < list.size(); i++) { - deviceIds[i] = list.get(i).getDeviceConfigID(); - //删除每个设备下的原有点位 - List pointList = modbusPointService.getPointList(equipments.getAdminIp(), - equipments.getUsername(), equipments.getPassword(), list.get(i).getDeviceConfigID()); - if (pointList != null && pointList.size() > 0) { - String[] addressIds = new String[pointList.size()]; - for (int j = 0; j < pointList.size(); j++) { - addressIds[j] = pointList.get(j).getDeviceConfigContentID().toString(); - } - //删除点位数据 - modbusPointService.deletePoint(equipments.getAdminIp(), String.join(",", addressIds)); - } - } - //再清除设备数据 - modbusPointService.delete(equipments.getAdminIp(), String.join(",", deviceIds)); - } - } +// public void deleteModbusEntity(BeEquipments equipments) { +// modbusPointService.login(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); +// List list = modbusPointService.getModbusList(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); +// if (null != list && list.size() > 0) { +// //先清除点位数据 +// String[] deviceIds = new String[list.size()]; +// for (int i = 0; i < list.size(); i++) { +// deviceIds[i] = list.get(i).getDeviceConfigID(); +// //删除每个设备下的原有点位 +// List pointList = modbusPointService.getPointList(equipments.getAdminIp(), +// equipments.getUsername(), equipments.getPassword(), list.get(i).getDeviceConfigID()); +// if (pointList != null && pointList.size() > 0) { +// String[] addressIds = new String[pointList.size()]; +// for (int j = 0; j < pointList.size(); j++) { +// addressIds[j] = pointList.get(j).getDeviceConfigContentID().toString(); +// } +// //删除点位数据 +// modbusPointService.deletePoint(equipments.getAdminIp(), String.join(",", addressIds)); +// } +// } +// //再清除设备数据 +// modbusPointService.delete(equipments.getAdminIp(), String.join(",", deviceIds)); +// } +// } //清除原本的Modbus设备数据 - public void deleteModbusEntity(BeGatewaysMessage gatewaysMessage, String deviceId) { - modbusPointService.login(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); - List list = modbusPointService.getModbusList(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + public void deleteModbusEntity(GatewayDO gatewayDO, String deviceId) { + modbusPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); + List list = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceId); if (null != list && list.size() > 0) { //先清除点位数据 String[] deviceIds = new String[list.size()]; for (int i = 0; i < list.size(); i++) { deviceIds[i] = list.get(i).getDeviceConfigID(); //删除每个设备下的原有点位 - List pointList = modbusPointService.getPointListAll(gatewaysMessage.getAdminIp(), - gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), list.get(i).getDeviceConfigID()); + List pointList = modbusPointService.getPointListAll(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), list.get(i).getDeviceConfigID()); if (pointList != null && pointList.size() > 0) { String[] addressIds = new String[pointList.size()]; for (int j = 0; j < pointList.size(); j++) { addressIds[j] = pointList.get(j).getDeviceConfigContentID(); } //删除点位数据 - modbusPointService.deletePoint(gatewaysMessage.getAdminIp(), String.join(",", addressIds)); + modbusPointService.deletePoint(gatewayDO.getAdminIp(), String.join(",", addressIds)); } } //再清除设备数据 - modbusPointService.delete(gatewaysMessage.getAdminIp(), String.join(",", deviceIds)); + modbusPointService.delete(gatewayDO.getAdminIp(), String.join(",", deviceIds)); } } - public void addModbusEntity(BeEquipments equipments) { - modbusPointService.login(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); - BeEquipmentsModbus bo = new BeEquipmentsModbus(); - bo.setEquipmentsId(equipments.getEquipmentsId()); - List modbuses = beEquipmentsModbusService.list(beEquipmentsModbusService.buildQueryWrapper(bo)); + public void addModbusEntity(GatewayDO gatewayDO) { + modbusPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); + List modbuses = deviceMapper.selectByGatewayId(gatewayDO.getId()); List list = new ArrayList<>(); if (modbuses != null && modbuses.size() > 0) { - for (BeEquipmentsModbus modbus : modbuses) { - DeviceModbusEntity deviceModbusEntity = new DeviceModbusEntity(); - deviceModbusEntity.setEquipmentsId(modbus.getEquipmentsId()); - deviceModbusEntity.setDeviceId(modbus.getDeviceId()); - deviceModbusEntity.setDeviceName(modbus.getDeviceName()); - deviceModbusEntity.setModbusProtocol(modbus.getModbusProtocol()); - deviceModbusEntity.setModbusPattern(modbus.getModbusPattern()); - deviceModbusEntity.setPortName(modbus.getPortName()); - deviceModbusEntity.setModbusConnectParam(modbus.getModbusConnectParam()); - deviceModbusEntity.setReadCronType(modbus.getReadCronType()); - deviceModbusEntity.setReadRepeatValue(modbus.getReadRepeatValue()); - deviceModbusEntity.setReadRepeatUnit(modbus.getReadRepeatUnit()); - deviceModbusEntity.setReadCron(modbus.getReadCron()); - deviceModbusEntity.setWriteCronType(modbus.getWriteCronType()); - deviceModbusEntity.setWriteRepeatValue(modbus.getWriteRepeatValue()); - deviceModbusEntity.setWriteRepeatUnit(modbus.getWriteRepeatUnit()); - deviceModbusEntity.setWriteCron(modbus.getWriteCron()); - deviceModbusEntity.setLocalPersistent(modbus.getLocalPersistent()); - deviceModbusEntity.setUploadRate(modbus.getUploadRate()); - deviceModbusEntity.setRateCount(modbus.getRateCount()); - deviceModbusEntity.setModbusReadAddrGap(modbus.getModbusReadAddrGap()); + for (DeviceDO modbus : modbuses) { + DeviceModbusEntity deviceModbusEntity = initEntity(modbus); list.add(deviceModbusEntity); //mob 下发失败 {"code":500,"msg":"该串口已经配置"} } - if (list.size() > 0) modbusPointService.add(list, equipments.getAdminIp()); + modbusPointService.add(list, gatewayDO.getAdminIp()); } } - public void addModbusEntity(BeGatewaysMessage gatewaysMessage, BeEquipmentsModbus modbus) { + private DeviceModbusEntity initEntity(DeviceDO modbus) { DeviceModbusEntity deviceModbusEntity = new DeviceModbusEntity(); - deviceModbusEntity.setEquipmentsId(modbus.getEquipmentsId()); - deviceModbusEntity.setDeviceId(modbus.getDeviceId()); + deviceModbusEntity.setEquipmentsId(modbus.getOrgId().toString()); + deviceModbusEntity.setDeviceId(modbus.getDeviceCode()); deviceModbusEntity.setDeviceName(modbus.getDeviceName()); deviceModbusEntity.setModbusProtocol(modbus.getModbusProtocol()); deviceModbusEntity.setModbusPattern(modbus.getModbusPattern()); @@ -316,70 +276,68 @@ public class TheGatewayServiceImpl { deviceModbusEntity.setUploadRate(modbus.getUploadRate()); deviceModbusEntity.setRateCount(modbus.getRateCount()); deviceModbusEntity.setModbusReadAddrGap(modbus.getModbusReadAddrGap()); + return deviceModbusEntity; + } + + public void addModbusEntity(GatewayDO gatewayDO, DeviceDO modbus) { + DeviceModbusEntity deviceModbusEntity = initEntity(modbus); //mob 下发失败 {"code":500,"msg":"该串口已经配置"} - modbusPointService.add(deviceModbusEntity, gatewaysMessage.getAdminIp()); + modbusPointService.add(deviceModbusEntity, gatewayDO.getAdminIp()); } - public void addDeviceModbusEntity(BeEquipments equipments) { - modbusPointService.login(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); + public void addDeviceModbusEntity(GatewayDO gatewayDO) { + modbusPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); /*下发好设备后获取设备列表找点位*/ - List modbusPointList = modbusPointService.getModbusList(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword()); + List modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword()); + for (DeviceModbusEntity deviceModbusEntity : modbusPointList) { //根据deviceId 和机台编码查询sql数据库点位信息 - IoPoint bo = new IoPoint(); - bo.setDeviceId(deviceModbusEntity.getDeviceId()); - bo.setEquipmentsId(equipments.getEquipmentsId()); - List points = ioPointService.list(ioPointService.buildQueryWrapper(bo)); - List list = new ArrayList<>(); - for (IoPoint point : points) { - //新增点位 - ModbusPointEntity modbusPointEntity = new ModbusPointEntity(); - modbusPointEntity.setModbusSlaveID(point.getModbusSlaveId()); - modbusPointEntity.setModbusFieldName(point.getPointName()); - modbusPointEntity.setModbusFieldAddress(point.getModbusFieldAddress()); - modbusPointEntity.setModbusAddressType(point.getModbusAddressType()); - modbusPointEntity.setModbusFieldSize(point.getModbusFieldSize()); - modbusPointEntity.setModbusFieldPrecision(point.getModbusFieldPrecision()); - modbusPointEntity.setModbusFieldDataType(point.getDataType()); - modbusPointEntity.setModbusFieldOrder(point.getModbusFieldOrder()); - modbusPointEntity.setModbusFieldUnit(point.getUnit()); - list.add(modbusPointEntity); - } + List points = deviceAttributeMapper.selectByDeviceId(1L); + getModbusPointEntityList(gatewayDO, deviceModbusEntity, points); + List list = getModbusPointEntityList(gatewayDO, deviceModbusEntity, points); + //下发 if (list.size() > 0) - modbusPointService.add(list, equipments.getAdminIp(), deviceModbusEntity.getDeviceConfigID()); + modbusPointService.add(list, gatewayDO.getAdminIp(), deviceModbusEntity.getDeviceConfigID()); } } - public void addDeviceModbusEntity(BeGatewaysMessage gatewaysMessage,String equipmentsId, String deviceId) { - modbusPointService.login(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword()); + public void addDeviceModbusEntity(GatewayDO gatewayDO, DeviceDO deviceDO) { + modbusPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword()); /*下发好设备后获取设备列表找点位*/ - List modbusPointList = modbusPointService.getModbusList(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + List modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceDO.getDeviceCode()); for (DeviceModbusEntity deviceModbusEntity : modbusPointList) { //根据deviceId 和机台编码查询sql数据库点位信息 - IoPoint bo = new IoPoint(); - bo.setDeviceId(deviceModbusEntity.getDeviceId()); - bo.setEquipmentsId(equipmentsId); - List points = ioPointService.list(ioPointService.buildQueryWrapper(bo)); - List list = new ArrayList<>(); - for (IoPoint point : points) { - //新增点位 - ModbusPointEntity modbusPointEntity = new ModbusPointEntity(); - modbusPointEntity.setModbusSlaveID(point.getModbusSlaveId()); - modbusPointEntity.setModbusFieldName(point.getPointCode()); - modbusPointEntity.setModbusFieldAddress(point.getModbusFieldAddress()); - modbusPointEntity.setModbusAddressType(point.getModbusAddressType()); - modbusPointEntity.setModbusFieldSize(point.getModbusFieldSize()); - modbusPointEntity.setModbusFieldPrecision(point.getModbusFieldPrecision()); - modbusPointEntity.setModbusFieldDataType(point.getDataType()); - modbusPointEntity.setModbusFieldOrder(point.getModbusFieldOrder()); - modbusPointEntity.setModbusFieldUnit(point.getUnit()); - list.add(modbusPointEntity); - } + + List points = deviceAttributeMapper.selectByDeviceId(deviceDO.getId()); + List list = getModbusPointEntityList(gatewayDO, deviceModbusEntity, points); if (list.size() > 0) - modbusPointService.add(list, gatewaysMessage.getAdminIp(), deviceModbusEntity.getDeviceConfigID()); + modbusPointService.add(list, gatewayDO.getAdminIp(), deviceModbusEntity.getDeviceConfigID()); } } + private List getModbusPointEntityList(GatewayDO gatewayDO, + DeviceModbusEntity deviceModbusEntity, + List points) { + List list = new ArrayList<>(); + for (DeviceAttributeDO point : points) { + //新增点位 + ModbusPointEntity modbusPointEntity = new ModbusPointEntity(); + modbusPointEntity.setModbusSlaveID(point.getModbusSlaveId()); + modbusPointEntity.setModbusFieldName(point.getAttributeCode()); + modbusPointEntity.setModbusFieldAddress(point.getModbusFieldAddress()); + modbusPointEntity.setModbusAddressType(point.getModbusAddressType()); + modbusPointEntity.setModbusFieldSize(point.getModbusFieldSize()); + modbusPointEntity.setModbusFieldPrecision(point.getModbusFieldPrecision()); + modbusPointEntity.setModbusFieldDataType(point.getDataType()); + modbusPointEntity.setModbusFieldOrder(point.getModbusFieldOrder()); + modbusPointEntity.setModbusFieldUnit(point.getUnit()); + list.add(modbusPointEntity); + } + return list; + } + /** * 下发mqtt主题 * 1拿到列表 @@ -388,30 +346,30 @@ public class TheGatewayServiceImpl { * 4新增 * 5启用 */ - public void deleteMqttEntity(BeEquipments equipments) { - //modbusPointService.login(equipments.getAdminIp(),equipments.getUsername(),equipments.getPassword()); - List mqttBrokerEntity = mqttService.getMqttBrokerEntity(equipments.getAdminIp(), - equipments.getUsername(), equipments.getPassword()); + public void deleteMqttEntity(GatewayDO gatewayDO) { + modbusPointService.login(gatewayDO.getAdminIp(),gatewayDO.getUsername(),gatewayDO.getPassword()); + List mqttBrokerEntity = gatewayMqttService.getMqttBrokerEntity(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword()); for (MqttBrokerEntity brokerEntity : mqttBrokerEntity) { - mqttService.delete(equipments.getAdminIp(), brokerEntity.getCloudConfigID()); + gatewayMqttService.delete(gatewayDO.getAdminIp(), brokerEntity.getCloudConfigID()); } } /***启用设备 */ - public void changeStatus(BeGatewaysMessage gatewaysMessage, String deviceId, String type) { + public void changeStatus(GatewayDO gatewayDO, String deviceCode, String type) { List deviceIds = new ArrayList<>(); if (type.equals("modbus")) { /*下发好设备后获取设备列表找点位*/ - List modbusPointList = modbusPointService.getModbusList(gatewaysMessage.getAdminIp(), - gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + List modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceCode); for (DeviceModbusEntity entity : modbusPointList) { deviceIds.add(entity.getDeviceConfigID()); } } if (type.equals("siemens")) { /*下发好设备后获取设备列表找点位*/ - List siemensList = siemensPointService.getSiemensList(gatewaysMessage.getAdminIp(), - gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId); + List siemensList = siemensPointService.getSiemensList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceCode); for (DeviceSiemensEntity entity : siemensList) { deviceIds.add(entity.getDeviceConfigID()); @@ -420,17 +378,17 @@ public class TheGatewayServiceImpl { ChangeStatus changeStatus = new ChangeStatus(); changeStatus.setNewStatus("2"); changeStatus.setOldStatus("1"); - siemensPointService.changeStatusDevice(deviceIds, changeStatus, gatewaysMessage.getAdminIp()); + siemensPointService.changeStatusDevice(deviceIds, changeStatus, gatewayDO.getAdminIp()); } /***启用设备 */ - public void changeStatus(BeEquipments equipments) { + public void changeStatus(GatewayDO gatewayDO) { /*下发好设备后获取设备列表找点位*/ - List modbusPointList = modbusPointService.getModbusList(equipments.getAdminIp(), - equipments.getUsername(), equipments.getPassword()); + List modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword()); /*下发好设备后获取设备列表找点位*/ - List siemensList = siemensPointService.getSiemensList(equipments.getAdminIp(), - equipments.getUsername(), equipments.getPassword()); + List siemensList = siemensPointService.getSiemensList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword()); List deviceIds = new ArrayList<>(); for (DeviceModbusEntity entity : modbusPointList) { deviceIds.add(entity.getDeviceConfigID()); @@ -441,43 +399,39 @@ public class TheGatewayServiceImpl { ChangeStatus changeStatus = new ChangeStatus(); changeStatus.setNewStatus("2"); changeStatus.setOldStatus("1"); - siemensPointService.changeStatusDevice(deviceIds, changeStatus, equipments.getAdminIp()); + siemensPointService.changeStatusDevice(deviceIds, changeStatus, gatewayDO.getAdminIp()); } - public BeEquipments getEquipments(Integer gatewayMessageId) { - BeGatewaysMessage gatewaysMessage = gatewaysMessageService.getById(gatewayMessageId); - BeEquipments bo = new BeEquipments(); - bo.setEquipmentsId(gatewaysMessage.getEquipmentId()); - bo = equipmentsService.getOne(equipmentsService.buildQueryWrapper(bo)); - return bo; - } /*检测下发数据和实际下发数量是否匹配*/ - public AjaxResult compare(String url, String username, String password, String deviceId, String equipmentId, String type) { + public CommonResult compare(GatewayDO gatewayDO, DeviceDO deviceDO, String type) { String deviceConfigID = null; Integer pointList = 0; - if ("m".equals(type)) { - List modbusList = modbusPointService.getModbusList(url, username, password, deviceId); + if ("modbus".equals(type)) { + List modbusList = modbusPointService.getModbusList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceDO.getDeviceCode()); if (modbusList != null && modbusList.size() > 0) { deviceConfigID = modbusList.get(0).getDeviceConfigID(); } - pointList = modbusPointService.getPointListByCount(url, username, password, deviceConfigID); + pointList = modbusPointService.getPointListByCount(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceConfigID); } else { - List siemensList = siemensPointService.getSiemensList(url, username, password, deviceId); + List siemensList = siemensPointService.getSiemensList(gatewayDO.getAdminIp(), + gatewayDO.getUsername(), gatewayDO.getPassword(), deviceDO.getDeviceCode()); if (siemensList != null && siemensList.size() > 0) { deviceConfigID = siemensList.get(0).getDeviceConfigID(); } - pointList = siemensPointService.getPointListByCount(url, deviceConfigID, username, password); + pointList = siemensPointService.getPointListByCount(gatewayDO.getAdminIp(), deviceConfigID, + gatewayDO.getUsername(), gatewayDO.getPassword()); } //根据deviceId 和机台编码查询sql数据库点位信息 - IoPoint bo = new IoPoint(); - bo.setDeviceId(deviceId); - bo.setEquipmentsId(equipmentId); - List points = ioPointService.list(ioPointService.buildQueryWrapper(bo)); + + List points = deviceAttributeMapper.selectByDeviceId(deviceDO.getId()); int size = points.size(); - return size!=pointList?AjaxResult.error("下发失败!应下发" + points.size() + "个地址,实下发" + pointList + "个地址") - :AjaxResult.success("下发成功!应下发" + points.size() + "个地址,实下发" + pointList + "个地址"); + String str = "应下发" + points.size() + "个地址,实下发" + pointList + "个地址"; + return size!=pointList? CommonResult.error(500,"下发失败!"+str) + : CommonResult.success("下发成功!"+str); } /**网关登录测试*/ @@ -537,13 +491,13 @@ public class TheGatewayServiceImpl { } } - public void addVideo(String adminIp,String username,String password, Monitor monitor) { - videoService.login(adminIp,username,password); - DeviceVideoEntity deviceVideoEntity = new DeviceVideoEntity(); - deviceVideoEntity.setDeviceID(monitor.getMonitorCode()); - deviceVideoEntity.setDeviceName(monitor.getMonitorName()); - deviceVideoEntity.setServerAddress(monitor.getServiceAddress()); - deviceVideoEntity.setVideoAddress(monitor.getVideoAddress()); - videoService.add(deviceVideoEntity, adminIp); - } +// public void addVideo(String adminIp,String username,String password, Monitor monitor) { +// videoService.login(adminIp,username,password); +// DeviceVideoEntity deviceVideoEntity = new DeviceVideoEntity(); +// deviceVideoEntity.setDeviceID(monitor.getMonitorCode()); +// deviceVideoEntity.setDeviceName(monitor.getMonitorName()); +// deviceVideoEntity.setServerAddress(monitor.getServiceAddress()); +// deviceVideoEntity.setVideoAddress(monitor.getVideoAddress()); +// videoService.add(deviceVideoEntity, adminIp); +// } } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/util/TestApp.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/util/TestApp.java index 9f8561fbd5..6dd4ffdb53 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/util/TestApp.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/gateway/util/TestApp.java @@ -26,6 +26,8 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,6 +39,12 @@ public class TestApp { private ISiemensPointService iopointUploadService; public static void main(String[] args){ + + BigDecimal b1 = new BigDecimal("123.564"); + BigDecimal b2 = new BigDecimal("3.3"); + BigDecimal divide = b1.divide(b2, 3, RoundingMode.HALF_UP); + System.out.println(divide); + System.out.println(DateUtils.getMillsLong());//1657075430559 1657461174420 //get(); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index aaf89ee20c..9edfea9e7a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.iot.service.device; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.gateway.GatewayDO; import javax.validation.Valid; @@ -54,6 +56,7 @@ public interface DeviceService { */ PageResult getDevicePage(DevicePageReqVO pageReqVO); + CommonResult pushDevice(DeviceDO deviceDO, GatewayDO gatewayDO); // ==================== 子表(设备属性) ==================== /** diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 005f5b5871..96f0892418 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -1,7 +1,12 @@ package cn.iocoder.yudao.module.iot.service.device; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.gateway.GatewayDO; import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.framework.constant.DeviceTypeEnum; +import cn.iocoder.yudao.module.iot.framework.gateway.service.impl.TheGatewayServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -14,9 +19,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceAttributeMapper; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; @@ -34,6 +44,9 @@ public class DeviceServiceImpl implements DeviceService { @Resource private DeviceAttributeMapper deviceAttributeMapper; + @Resource + private TheGatewayServiceImpl theGatewayService; + @Override public Long createDevice(DeviceSaveReqVO createReqVO) { // 插入 @@ -79,7 +92,63 @@ public class DeviceServiceImpl implements DeviceService { public PageResult getDevicePage(DevicePageReqVO pageReqVO) { return deviceMapper.selectPage(pageReqVO); } + @Override + public CommonResult pushDevice(DeviceDO deviceDO, GatewayDO gatewayDO){ + if(DeviceTypeEnum.isSiemens(deviceDO.getDeviceType())){ + return siemensAdd(deviceDO,gatewayDO); + } + else if(DeviceTypeEnum.isModbus(deviceDO.getDeviceType())){ + return modbusAdd(deviceDO,gatewayDO); + } + else return CommonResult.error(500,"未知类型设备!"); + } + public CommonResult siemensAdd(DeviceDO deviceDO, GatewayDO gatewayDO) { + if (gatewayDO != null && deviceDO != null && + deviceDO.getDeviceCode() != null && gatewayDO.getGatewayCode() != null) { + try { + //清除原本的西门子设备和点位数据 + theGatewayService.deleteSiemensEntity(gatewayDO, deviceDO); + //新增西门子设备 + theGatewayService.addSiemensEntity(gatewayDO, deviceDO); + //下发完成西门子设备后 下发对应设备的点位 + theGatewayService.addDeviceSiemensEntity(gatewayDO, deviceDO.getOrgMachineId(), deviceDO); + //修改下发标识 + deviceDO.setIsUpload("1"); + deviceMapper.updateById(deviceDO); + //启用设备 + //todo 启用有点问题 + theGatewayService.changeStatus(gatewayDO, deviceDO.getDeviceCode(), "siemens"); + return theGatewayService.compare(gatewayDO, deviceDO, "siemens"); + } catch (Exception e) { + e.getLocalizedMessage(); + } + } + return CommonResult.error(500,"设备或网关不存在!"); + } + /*modbus设备下发*/ + public CommonResult modbusAdd(DeviceDO deviceDO, GatewayDO gatewayDO) { + if (deviceDO.getDeviceCode() != null && gatewayDO.getGatewayCode() != null) { + try { + //清除原本的Modbus设备和点位数据 + theGatewayService.deleteModbusEntity(gatewayDO, deviceDO.getDeviceCode()); + //新增Modbus + theGatewayService.addModbusEntity(gatewayDO, deviceDO); + //下发完成Modbus设备后 下发对应设备的点位 + theGatewayService.addDeviceModbusEntity(gatewayDO, deviceDO); + //修改下发标识 + deviceDO.setIsUpload("1"); + deviceMapper.updateById(deviceDO); + //启用设备 + theGatewayService.changeStatus(gatewayDO, deviceDO.getDeviceCode(), "modbus"); + return theGatewayService.compare(gatewayDO, deviceDO, "modbus"); + + } catch (Exception e) { + e.getLocalizedMessage(); + } + } + return CommonResult.error(500,"设备或网关不存在!"); + } // ==================== 子表(设备属性) ==================== @Override diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java index d35941d002..375e77b09c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java @@ -33,4 +33,8 @@ public interface BomMapper extends BaseMapperX { default BomDO selectByNo(String no) { return selectOne(BomDO::getCode, no); } + default BomDO selectByProductId(Long productId) { + return selectOne(BomDO::getProductId, productId, + BomDO::getIsEnable,true); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/stockworkshop/StockWorkshopMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/stockworkshop/StockWorkshopMapper.java index 6cffa8e942..488e7ca952 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/stockworkshop/StockWorkshopMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/stockworkshop/StockWorkshopMapper.java @@ -1,11 +1,16 @@ package cn.iocoder.yudao.module.mes.dal.mysql.stockworkshop; +import java.math.BigDecimal; import java.util.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.*; @@ -25,5 +30,15 @@ public interface StockWorkshopMapper extends BaseMapperX { .betweenIfPresent(StockWorkshopDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(StockWorkshopDO::getId)); } - + default BigDecimal selectSumByProductId(Long productId) { + // SQL sum 查询 + List> result = selectMaps(new QueryWrapper() + .select("SUM(count) AS sumCount") + .eq("item_id", productId)); + // 获得数量 + if (CollUtil.isEmpty(result)) { + return BigDecimal.ZERO; + } + return BigDecimal.valueOf(MapUtil.getDouble(result.get(0), "sumCount", 0D)); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/RedisKeyConstants.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/RedisKeyConstants.java similarity index 83% rename from yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/RedisKeyConstants.java rename to yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/RedisKeyConstants.java index 8c9682b27a..74f0df0103 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/RedisKeyConstants.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/RedisKeyConstants.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.mes.framework.redis; +package cn.iocoder.yudao.module.mes.dal.redis; /** * CRM Redis Key 枚举类 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/MesNoRedisDAO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java similarity index 94% rename from yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/MesNoRedisDAO.java rename to yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java index a58e71df52..87a6b3fcac 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/redis/MesNoRedisDAO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java @@ -1,8 +1,10 @@ -package cn.iocoder.yudao.module.mes.framework.redis; +package cn.iocoder.yudao.module.mes.dal.redis.no; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.iocoder.yudao.module.mes.dal.redis.RedisKeyConstants; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import javax.annotation.Resource; @@ -16,6 +18,7 @@ import java.time.LocalDateTime; * @author HUIHUI */ @Repository +@Component public class MesNoRedisDAO { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java index c10ca0ca10..8ca05b32e3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java @@ -64,4 +64,20 @@ public interface BomService { */ List getBomDetailListByBomId(Long bomId); + /** + * 获得产品需求明细列表 + * + * @param productId 产品 ID + * @return 产品BOM明细列表 + */ + List getBomDetailListByProductId(Long productId); + /** + * 获得产品需求明细列表 + * + * @param productId 产品 ID + * @return 产品BOM明细列表 + */ + List getBomDetailListByProductId(Long productId, Long number); + + BomDO selectByProductId(Long productId); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java index 19a03a1406..28b78fd741 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java @@ -1,24 +1,26 @@ package cn.iocoder.yudao.module.mes.service.bom; import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.erp.framework.bean.ProductUnitEnum; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; -import cn.iocoder.yudao.module.mes.framework.redis.MesNoRedisDAO; +import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.bom.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDO; import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDetailDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.dal.mysql.bom.BomMapper; @@ -28,7 +30,6 @@ import javax.annotation.Resource; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PURCHASE_ORDER_NO_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -53,6 +54,12 @@ public class BomServiceImpl implements BomService { @Override @Transactional(rollbackFor = Exception.class) public Long createBom(BomSaveReqVO createReqVO) { + if(createReqVO.getIsEnable()){ + BomDO temp = bomMapper.selectByProductId(createReqVO.getProductId()); + if(temp!=null){ + throw exception(new ErrorCode(500,"每个产品启用的BOM只能有一个,请先禁用改产品其他BOM!")); + } + } // 插入 BomDO bom = BeanUtils.toBean(createReqVO, BomDO.class); bomMapper.insert(bom); @@ -60,7 +67,7 @@ public class BomServiceImpl implements BomService { // 1.4 生成订单号,并校验唯一性 String no = noRedisDAO.generate2(MesNoRedisDAO.BOM_NO_PREFIX); if (bomMapper.selectByNo(no) != null) { - throw exception(PURCHASE_ORDER_NO_EXISTS); + throw exception(BOM_EXISTS); } bom.setCode(no); } @@ -73,6 +80,12 @@ public class BomServiceImpl implements BomService { @Override @Transactional(rollbackFor = Exception.class) public void updateBom(BomSaveReqVO updateReqVO) { + if(updateReqVO.getIsEnable()){ + BomDO temp = bomMapper.selectByProductId(updateReqVO.getProductId()); + if(temp!=null && !Objects.equals(temp.getId(), updateReqVO.getId())){ + throw exception(new ErrorCode(500,"每个产品启用的BOM只能有一个,请先禁用改产品其他BOM!")); + } + } // 校验存在 validateBomExists(updateReqVO.getId()); // 更新 @@ -105,7 +118,10 @@ public class BomServiceImpl implements BomService { public BomDO getBom(Long id) { return bomMapper.selectById(id); } - + @Override + public BomDO selectByProductId(Long productId) { + return bomMapper.selectByProductId(productId); + } @Override public PageResult getBomPage(BomPageReqVO pageReqVO) { PageResult pageResult = bomMapper.selectPage(pageReqVO); @@ -134,6 +150,34 @@ public class BomServiceImpl implements BomService { List list = bomDetailMapper.selectListByBomId(bomId); return buildDetailVOList(list); } + + @Override + public List getBomDetailListByProductId(Long productId) { + BomDO bomDO = bomMapper.selectByProductId(productId); + List list = bomDetailMapper.selectListByBomId(bomDO.getId()); + return list; + } + + /***根据产品id和产品数量,计算产品bom的物料需求,如果是重量单位,则统一到kg + * 其他单位暂不处理 + */ + @Override + public List getBomDetailListByProductId(Long productId, Long number) { + BomDO bomDO = bomMapper.selectByProductId(productId); + List list = bomDetailMapper.selectListByBomId(bomDO.getId()); + for (BomDetailDO detail : list) { + BigDecimal result = detail.getUsageNumber().multiply(BigDecimal.valueOf(number)); + //如果是g则统一到kg + if(detail.getUnitId().equals(ProductUnitEnum.Gram.getUnitId())){ + detail.setUsageNumber(result.divide(BigDecimal.valueOf(1000),3, RoundingMode.HALF_UP)); + detail.setUnitId(ProductUnitEnum.Kilogram.getUnitId()); + }else{ + detail.setUsageNumber(result); + } + } + return list; + } + private List buildDetailVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisService.java new file mode 100644 index 0000000000..f78e9b453e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisService.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock; + +import javax.validation.Valid; +import java.util.List; + +/** + * 物料分析 Service 接口 + * + * @author 内蒙必硕 + */ +public interface ItemAnalysisService { + + /** + * 分析任务单的物料需求 + * + * @param taskDO 生产任务单 + * @return 物料需求 + */ + public List getItemAnalysis(TaskDO taskDO); + + /** + * 分析计划的物料需求 + * + * @param plan 生产计划 + * @return 物料需求 + */ + public List getItemAnalysis(PlanDO plan); + /** + * 分析销售单的物料需求 + * + * @param saleOrderDO 销售单 + * @return 物料需求 + */ + public List getItemAnalysis(ErpSaleOrderDO saleOrderDO); + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java new file mode 100644 index 0000000000..6117ba2184 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java @@ -0,0 +1,183 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; +import cn.iocoder.yudao.module.erp.framework.bean.ProductUnitEnum; +import cn.iocoder.yudao.module.erp.service.product.ErpProductService; +import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; +import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; +import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; +import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.module.mes.service.bom.BomService; +import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock; +import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService; +import cn.iocoder.yudao.module.mes.service.task.TaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * 生产领料 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class ItemAnalysisServiceImpl implements ItemAnalysisService { + private static final Logger log = LoggerFactory.getLogger(ItemAnalysisServiceImpl.class); + private static final String UNIT_ERROR = "物料bom单位不一致!"; + @Resource + private ErpStockService erpStockService; + @Resource + private StockWorkshopService stockWorkshopService; + @Resource + private TaskService taskService; + @Resource + private BomService bomService; + @Resource + private ErpProductService productService; + @Resource + private ErpProductUnitService productUnitService; + @Resource + private ErpSaleOrderService saleOrderService; + + + //分析任务单的物料需求 + @Override + public List getItemAnalysis(TaskDO taskDO) { + + List detailDOList = taskService.getTaskDetailListByTaskId(taskDO.getId()); + Map itemMap = new HashMap<>(); + //算物料需求 + for (TaskDetailDO detail :detailDOList) { + //这里要求销售的单位和物料单位一致等于内置单位 + BomDO bomDO = bomService.selectByProductId(detail.getProductId()); + if(!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId()) + || !detail.getUnitId().equals(ProductUnitEnum.Each.getUnitId())){ + log.error(UNIT_ERROR); + throw exception(new ErrorCode(500, UNIT_ERROR)); + } + + //每个taskDetail计算一次物料需求,汇总到map里面 + List bomDetailDOList = + bomService.getBomDetailListByProductId(detail.getProductId(), detail.getNumber()); + buildItemMap(itemMap, bomDetailDOList); + } + //算库存 + for (Long key : itemMap.keySet()) { + BigDecimal stockCount = erpStockService.getStockCount(key); + itemMap.get(key).setStockNumber(stockCount); + BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(key); + itemMap.get(key).setStockWorkshopNumber(stockWorkshopCount); + } + List list = new ArrayList<>(itemMap.values()); + list = buildDetailVOList(list); + return list; + } + + //分析计划的物料需求 + @Override + public List getItemAnalysis(PlanDO plan) { + List list = new ArrayList<>(); + List bomDetailDOList = + bomService.getBomDetailListByProductId(plan.getProductId(), plan.getPlanNumber()); + for (BomDetailDO bomDetail : bomDetailDOList) { + Long itemId = bomDetail.getProductId(); + ItemRequisitionAndStock temp = new ItemRequisitionAndStock() + .setItemId(itemId) + .setNumber(bomDetail.getUsageNumber()); + + BigDecimal stockCount = erpStockService.getStockCount(itemId); + temp.setStockNumber(stockCount); + BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(itemId); + temp.setStockWorkshopNumber(stockWorkshopCount); + list.add(temp); + } + return list; + } + + @Override + public List getItemAnalysis(ErpSaleOrderDO saleOrderDO) { + List detailDOList = saleOrderService.getSaleOrderItemListByOrderId(saleOrderDO.getId()); + Map itemMap = new HashMap<>(); + //算物料需求 + for (ErpSaleOrderItemDO detail :detailDOList) { + //这里要求销售的单位和物料单位一致等于内置单位 + BomDO bomDO = bomService.selectByProductId(detail.getProductId()); + if(!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId()) + || !detail.getProductUnitId().equals(ProductUnitEnum.Each.getUnitId())){ + log.error(UNIT_ERROR); + throw exception(new ErrorCode(500, UNIT_ERROR)); + } + //每个detail计算一次物料需求,汇总到map里面 + List bomDetailDOList = + bomService.getBomDetailListByProductId(detail.getProductId(), detail.getCount().longValue()); + buildItemMap(itemMap, bomDetailDOList); + } + //算库存 + for (Long key : itemMap.keySet()) { + BigDecimal stockCount = erpStockService.getStockCount(key); + itemMap.get(key).setStockNumber(stockCount); + BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(key); + itemMap.get(key).setStockWorkshopNumber(stockWorkshopCount); + } + List list = new ArrayList<>(itemMap.values()); + list = buildDetailVOList(list); + return list; + } + //添加原料名称,添加单位名称 + private List buildDetailVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map map = productService.getProductMap( + convertSet(list, ItemRequisitionAndStock::getItemId)); + Map unitMap = productUnitService.getProductUnitMap( + convertSet(list, ItemRequisitionAndStock::getUnitId)); + + return BeanUtils.toBean(list, ItemRequisitionAndStock.class, item -> { + MapUtils.findAndThen(map, item.getItemId(), + product -> item.setItemName(product.getName())); + MapUtils.findAndThen(unitMap, item.getUnitId(), + unit -> item.setUnitName(unit.getName())); + }); + } + private void buildItemMap(Map itemMap, List bomDetailDOList){ + for (BomDetailDO bomDetail : bomDetailDOList) { + if(itemMap.containsKey(bomDetail.getProductId())){ + ItemRequisitionAndStock temp = itemMap.get(bomDetail.getProductId()); + //比较单位是否一致 + if(! temp.getUnitId().equals(bomDetail.getUnitId())){ + log.error(UNIT_ERROR); + throw exception(new ErrorCode(500, UNIT_ERROR)); + } + temp.setNumber(temp.getNumber().add(bomDetail.getUsageNumber())); + } + else{ + ItemRequisitionAndStock temp = new ItemRequisitionAndStock() + .setItemId(bomDetail.getProductId()) + .setNumber(bomDetail.getUsageNumber()) + .setUnitId(bomDetail.getUnitId()); + itemMap.put(bomDetail.getProductId(),temp); + } + } + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java index 9423b6ad61..5a31013fd6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.mes.service.itemrequisition; -import cn.iocoder.yudao.module.mes.framework.redis.MesNoRedisDAO; +import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -11,7 +11,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java new file mode 100644 index 0000000000..c3f7b0f2ed --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition.entity; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 物料分析结果,需求和库存对比 + * + * @author 内蒙必硕 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemRequisitionAndStock { + + /** + * 原料ID + */ + private Long itemId; + /** + * 原料 + */ + private String itemName; + /** + * 单位id + */ + private Long unitId; + /** + * 单位 + */ + private String unitName; + + /** + * 需求数量 + */ + private BigDecimal number; + /** + * 库存数量 + */ + private BigDecimal stockNumber; + /** + * 车间仓库存数量 + */ + private BigDecimal stockWorkshopNumber; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java index c2917828b3..cc8d5d8a0b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java @@ -3,25 +3,20 @@ package cn.iocoder.yudao.module.mes.service.plan; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; -import cn.iocoder.yudao.module.mes.controller.admin.bom.vo.BomRespVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; -import cn.iocoder.yudao.module.mes.framework.redis.MesNoRedisDAO; +import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import cn.iocoder.yudao.module.mes.service.task.TaskService; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; @@ -30,7 +25,6 @@ import javax.annotation.Resource; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PURCHASE_ORDER_NO_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopService.java index 46613fa595..af9cb06a64 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopService.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.stockworkshop; +import java.math.BigDecimal; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO; @@ -53,4 +54,14 @@ public interface StockWorkshopService { */ PageResult getStockWorkshopPage(StockWorkshopPageReqVO pageReqVO); + /** + * 获得原料库存数量 + * + * 如果不存在库存记录,则返回 0 + * + * @param productId 原料编号 + * @return 原料库存数量 + */ + BigDecimal getStockCount(Long productId); + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopServiceImpl.java index c829feff50..fac67bf475 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/stockworkshop/StockWorkshopServiceImpl.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO; @@ -72,4 +73,10 @@ public class StockWorkshopServiceImpl implements StockWorkshopService { return stockWorkshopMapper.selectPage(pageReqVO); } + @Override + public BigDecimal getStockCount(Long productId) { + BigDecimal count = stockWorkshopMapper.selectSumByProductId(productId); + return count != null ? count : BigDecimal.ZERO; + } + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index b252e95794..8c6a33dd42 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -4,13 +4,9 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; -import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; -import cn.iocoder.yudao.module.mes.controller.admin.bom.vo.BomDetailRespVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDetailDO; -import cn.iocoder.yudao.module.mes.framework.redis.MesNoRedisDAO; -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 017537bb94..0f0e5d5030 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -150,7 +150,7 @@ yudao: base-package: cn.iocoder.yudao web: admin-ui: - url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址 + url: http://localhost # Admin 管理后台 UI 的地址 security: permit-all_urls: - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录