add item analysis

plp
chenshuichuan 2 years ago
parent 258e51cd15
commit a2a2b50ac7

@ -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;
}

@ -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 校验产品是否使用

@ -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<String> 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<Long> createDeviceAttribute(@Valid @RequestBody DeviceAttributeDO deviceAttribute) {
DeviceDO deviceDO = deviceService.getDevice(deviceAttribute.getDeviceId());
deviceAttribute.setDeviceCode(deviceDO.getDeviceCode());
return success(deviceService.createDeviceAttribute(deviceAttribute));
}

@ -130,7 +130,7 @@ public class DeviceAttributeDO extends BaseDO {
/**
*
*/
private String modbusFieldSize;
private Integer modbusFieldSize;
/**
* 10
*/
@ -161,6 +161,10 @@ public class DeviceAttributeDO extends BaseDO {
* id
*/
private Long deviceId;
/**
* code
*/
private String deviceCode;
/**
* id
*/

@ -26,5 +26,7 @@ public interface DeviceAttributeMapper extends BaseMapperX<DeviceAttributeDO> {
default int deleteByDeviceId(Long deviceId) {
return delete(DeviceAttributeDO::getDeviceId, deviceId);
}
default List<DeviceAttributeDO> selectByDeviceId(Long deviceId) {
return selectList(DeviceAttributeDO::getDeviceId, deviceId);
}
}

@ -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<DeviceDO> {
default int deleteByGatewayId(Long gatewayId) {
return delete(DeviceDO::getGatewayId, gatewayId);
}
default List<DeviceDO> selectByGatewayId(Long gatewayId) {
return selectList(DeviceDO::getGatewayId, gatewayId);
}
}

@ -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);
}
}

@ -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

@ -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<DeviceSiemensEntity> 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<DeviceSiemensEntity> 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<SiemensPointEntity> pointList = siemensPointService.getPointListAll(gatewaysMessage.getAdminIp(),
list.get(i).getDeviceConfigID(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword());
List<SiemensPointEntity> 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<DeviceSiemensEntity> siemensList = siemensPointService.getSiemensList(gatewaysMessage.getAdminIp(),
gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId);
List<DeviceSiemensEntity> 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<IoPoint> points = ioPointService.list(ioPointService.buildQueryWrapper(bo));
List<DeviceAttributeDO> points = deviceAttributeMapper.selectByDeviceId(deviceDO.getId());
List<SiemensPointEntity> 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<DeviceSiemensEntity> 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<IoPoint> points = ioPointService.list(ioPointService.buildQueryWrapper(bo));
List<SiemensPointEntity> 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<DeviceModbusEntity> 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<ModbusPointEntity> 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<DeviceModbusEntity> 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<ModbusPointEntity> 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<DeviceModbusEntity> 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<DeviceModbusEntity> 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<ModbusPointEntity> pointList = modbusPointService.getPointListAll(gatewaysMessage.getAdminIp(),
gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), list.get(i).getDeviceConfigID());
List<ModbusPointEntity> 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<BeEquipmentsModbus> modbuses = beEquipmentsModbusService.list(beEquipmentsModbusService.buildQueryWrapper(bo));
public void addModbusEntity(GatewayDO gatewayDO) {
modbusPointService.login(gatewayDO.getAdminIp(), gatewayDO.getUsername(), gatewayDO.getPassword());
List<DeviceDO> modbuses = deviceMapper.selectByGatewayId(gatewayDO.getId());
List<DeviceModbusEntity> 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,56 +276,56 @@ 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<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(equipments.getAdminIp(), equipments.getUsername(), equipments.getPassword());
List<DeviceModbusEntity> 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<IoPoint> points = ioPointService.list(ioPointService.buildQueryWrapper(bo));
List<ModbusPointEntity> 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<DeviceAttributeDO> points = deviceAttributeMapper.selectByDeviceId(1L);
getModbusPointEntityList(gatewayDO, deviceModbusEntity, points);
List<ModbusPointEntity> 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<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(gatewaysMessage.getAdminIp(), gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId);
List<DeviceModbusEntity> 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<IoPoint> points = ioPointService.list(ioPointService.buildQueryWrapper(bo));
List<DeviceAttributeDO> points = deviceAttributeMapper.selectByDeviceId(deviceDO.getId());
List<ModbusPointEntity> list = getModbusPointEntityList(gatewayDO, deviceModbusEntity, points);
if (list.size() > 0)
modbusPointService.add(list, gatewayDO.getAdminIp(), deviceModbusEntity.getDeviceConfigID());
}
}
private List<ModbusPointEntity> getModbusPointEntityList(GatewayDO gatewayDO,
DeviceModbusEntity deviceModbusEntity,
List<DeviceAttributeDO> points) {
List<ModbusPointEntity> list = new ArrayList<>();
for (IoPoint point : points) {
for (DeviceAttributeDO point : points) {
//新增点位
ModbusPointEntity modbusPointEntity = new ModbusPointEntity();
modbusPointEntity.setModbusSlaveID(point.getModbusSlaveId());
modbusPointEntity.setModbusFieldName(point.getPointCode());
modbusPointEntity.setModbusFieldName(point.getAttributeCode());
modbusPointEntity.setModbusFieldAddress(point.getModbusFieldAddress());
modbusPointEntity.setModbusAddressType(point.getModbusAddressType());
modbusPointEntity.setModbusFieldSize(point.getModbusFieldSize());
@ -375,9 +335,7 @@ public class TheGatewayServiceImpl {
modbusPointEntity.setModbusFieldUnit(point.getUnit());
list.add(modbusPointEntity);
}
if (list.size() > 0)
modbusPointService.add(list, gatewaysMessage.getAdminIp(), deviceModbusEntity.getDeviceConfigID());
}
return list;
}
/**
@ -388,30 +346,30 @@ public class TheGatewayServiceImpl {
* 4
* 5
*/
public void deleteMqttEntity(BeEquipments equipments) {
//modbusPointService.login(equipments.getAdminIp(),equipments.getUsername(),equipments.getPassword());
List<MqttBrokerEntity> mqttBrokerEntity = mqttService.getMqttBrokerEntity(equipments.getAdminIp(),
equipments.getUsername(), equipments.getPassword());
public void deleteMqttEntity(GatewayDO gatewayDO) {
modbusPointService.login(gatewayDO.getAdminIp(),gatewayDO.getUsername(),gatewayDO.getPassword());
List<MqttBrokerEntity> 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<String> deviceIds = new ArrayList<>();
if (type.equals("modbus")) {
/*下发好设备后获取设备列表找点位*/
List<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(gatewaysMessage.getAdminIp(),
gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId);
List<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(),
gatewayDO.getUsername(), gatewayDO.getPassword(), deviceCode);
for (DeviceModbusEntity entity : modbusPointList) {
deviceIds.add(entity.getDeviceConfigID());
}
}
if (type.equals("siemens")) {
/*下发好设备后获取设备列表找点位*/
List<DeviceSiemensEntity> siemensList = siemensPointService.getSiemensList(gatewaysMessage.getAdminIp(),
gatewaysMessage.getUsername(), gatewaysMessage.getPassword(), deviceId);
List<DeviceSiemensEntity> 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<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(equipments.getAdminIp(),
equipments.getUsername(), equipments.getPassword());
List<DeviceModbusEntity> modbusPointList = modbusPointService.getModbusList(gatewayDO.getAdminIp(),
gatewayDO.getUsername(), gatewayDO.getPassword());
/*下发好设备后获取设备列表找点位*/
List<DeviceSiemensEntity> siemensList = siemensPointService.getSiemensList(equipments.getAdminIp(),
equipments.getUsername(), equipments.getPassword());
List<DeviceSiemensEntity> siemensList = siemensPointService.getSiemensList(gatewayDO.getAdminIp(),
gatewayDO.getUsername(), gatewayDO.getPassword());
List<String> 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<String> compare(GatewayDO gatewayDO, DeviceDO deviceDO, String type) {
String deviceConfigID = null;
Integer pointList = 0;
if ("m".equals(type)) {
List<DeviceModbusEntity> modbusList = modbusPointService.getModbusList(url, username, password, deviceId);
if ("modbus".equals(type)) {
List<DeviceModbusEntity> 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<DeviceSiemensEntity> siemensList = siemensPointService.getSiemensList(url, username, password, deviceId);
List<DeviceSiemensEntity> 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<IoPoint> points = ioPointService.list(ioPointService.buildQueryWrapper(bo));
List<DeviceAttributeDO> 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);
// }
}

@ -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();

@ -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<DeviceDO> getDevicePage(DevicePageReqVO pageReqVO);
CommonResult<String> pushDevice(DeviceDO deviceDO, GatewayDO gatewayDO);
// ==================== 子表(设备属性) ====================
/**

@ -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<DeviceDO> getDevicePage(DevicePageReqVO pageReqVO) {
return deviceMapper.selectPage(pageReqVO);
}
@Override
public CommonResult<String> 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<String> 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<String> 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

@ -33,4 +33,8 @@ public interface BomMapper extends BaseMapperX<BomDO> {
default BomDO selectByNo(String no) {
return selectOne(BomDO::getCode, no);
}
default BomDO selectByProductId(Long productId) {
return selectOne(BomDO::getProductId, productId,
BomDO::getIsEnable,true);
}
}

@ -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<StockWorkshopDO> {
.betweenIfPresent(StockWorkshopDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(StockWorkshopDO::getId));
}
default BigDecimal selectSumByProductId(Long productId) {
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<StockWorkshopDO>()
.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));
}
}

@ -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 {

@ -64,4 +64,20 @@ public interface BomService {
*/
List<BomDetailRespVO> getBomDetailListByBomId(Long bomId);
/**
*
*
* @param productId ID
* @return BOM
*/
List<BomDetailDO> getBomDetailListByProductId(Long productId);
/**
*
*
* @param productId ID
* @return BOM
*/
List<BomDetailDO> getBomDetailListByProductId(Long productId, Long number);
BomDO selectByProductId(Long productId);
}

@ -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<BomRespVO> getBomPage(BomPageReqVO pageReqVO) {
PageResult<BomDO> pageResult = bomMapper.selectPage(pageReqVO);
@ -134,6 +150,34 @@ public class BomServiceImpl implements BomService {
List<BomDetailDO> list = bomDetailMapper.selectListByBomId(bomId);
return buildDetailVOList(list);
}
@Override
public List<BomDetailDO> getBomDetailListByProductId(Long productId) {
BomDO bomDO = bomMapper.selectByProductId(productId);
List<BomDetailDO> list = bomDetailMapper.selectListByBomId(bomDO.getId());
return list;
}
/***idbomkg
*
*/
@Override
public List<BomDetailDO> getBomDetailListByProductId(Long productId, Long number) {
BomDO bomDO = bomMapper.selectByProductId(productId);
List<BomDetailDO> 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<BomDetailRespVO> buildDetailVOList(List<BomDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();

@ -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<ItemRequisitionAndStock> getItemAnalysis(TaskDO taskDO);
/**
*
*
* @param plan
* @return
*/
public List<ItemRequisitionAndStock> getItemAnalysis(PlanDO plan);
/**
*
*
* @param saleOrderDO
* @return
*/
public List<ItemRequisitionAndStock> getItemAnalysis(ErpSaleOrderDO saleOrderDO);
}

@ -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<ItemRequisitionAndStock> getItemAnalysis(TaskDO taskDO) {
List<TaskDetailDO> detailDOList = taskService.getTaskDetailListByTaskId(taskDO.getId());
Map<Long, ItemRequisitionAndStock> 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<BomDetailDO> 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<ItemRequisitionAndStock> list = new ArrayList<>(itemMap.values());
list = buildDetailVOList(list);
return list;
}
//分析计划的物料需求
@Override
public List<ItemRequisitionAndStock> getItemAnalysis(PlanDO plan) {
List<ItemRequisitionAndStock> list = new ArrayList<>();
List<BomDetailDO> 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<ItemRequisitionAndStock> getItemAnalysis(ErpSaleOrderDO saleOrderDO) {
List<ErpSaleOrderItemDO> detailDOList = saleOrderService.getSaleOrderItemListByOrderId(saleOrderDO.getId());
Map<Long, ItemRequisitionAndStock> 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<BomDetailDO> 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<ItemRequisitionAndStock> list = new ArrayList<>(itemMap.values());
list = buildDetailVOList(list);
return list;
}
//添加原料名称,添加单位名称
private List<ItemRequisitionAndStock> buildDetailVOList(List<ItemRequisitionAndStock> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, ItemRequisitionAndStock::getItemId));
Map<Long, ErpProductUnitDO> 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<Long, ItemRequisitionAndStock> itemMap, List<BomDetailDO> 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);
}
}
}
}

@ -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;

@ -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;
}

@ -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.*;
/**

@ -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<StockWorkshopDO> getStockWorkshopPage(StockWorkshopPageReqVO pageReqVO);
/**
*
*
* 0
*
* @param productId
* @return
*/
BigDecimal getStockCount(Long productId);
}

@ -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;
}
}

@ -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;

@ -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/** # 微信公众号开放平台,微信回调接口,不需要登录

Loading…
Cancel
Save