diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteEnergyService.java b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteEnergyService.java index ad2047e10..402061924 100644 --- a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteEnergyService.java +++ b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteEnergyService.java @@ -18,4 +18,12 @@ public interface RemoteEnergyService { @PostMapping("/buildInfo/removeDatasource") public R removeDatasource(@RequestBody DataSourcePropertyDTO dataSourceProperty); + + + @PostMapping(value = "/record/dnbInstant/getNhEnergy") + public R SyncNhEnergy(); + + + @PostMapping(value = "/record/dnbInstant/getNhEnergyDetail") + public R SyncNhEnergyDetail(); } diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteMesService.java b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteMesService.java index eb158bb22..259d92cb3 100644 --- a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteMesService.java +++ b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteMesService.java @@ -54,4 +54,7 @@ public interface RemoteMesService { @PostMapping("/reportWorks/updateEquRunTime") public R updateEquRunTime(); + + @PostMapping("/AttendanceRecords/syncHrAttendance") + public R syncHrAttendance(); } diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteOpenService.java b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteOpenService.java index 3a9584651..df2319cf2 100644 --- a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteOpenService.java +++ b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteOpenService.java @@ -51,4 +51,19 @@ public interface RemoteOpenService { @PostMapping("/openInterface/getDeliveryNoteDetail") public AjaxResult getDeliveryNoteDetail(@RequestBody Map paramMap); + + @PostMapping("/openInterface/getVoltageCurrent") + public AjaxResult getVoltageCurrent(@RequestBody Map paramMap); + + @PostMapping("/openInterface/getElectricPower") + public AjaxResult getElectricPower(@RequestBody Map paramMap); + + @PostMapping("/openInterface/getElectricQuantity") + public AjaxResult getElectricQuantity(@RequestBody Map paramMap); + + @PostMapping("/openInterface/getFrozenElectricity") + public AjaxResult getFrozenElectricity(@RequestBody Map paramMap); + + @PostMapping("/openInterface/getAttRecord") + public AjaxResult getAttRecord(@RequestBody Map paramMap); } diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteEnergyFallbackFactory.java b/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteEnergyFallbackFactory.java index ce4d4ecf2..32a0e9b19 100644 --- a/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteEnergyFallbackFactory.java +++ b/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteEnergyFallbackFactory.java @@ -26,6 +26,16 @@ public class RemoteEnergyFallbackFactory implements FallbackFactory paramMap) { + return AjaxResult.error("获取电表电压电流失败:" + throwable.getMessage()); + } + + @Override + public AjaxResult getElectricPower(Map paramMap) { + return AjaxResult.error("获取电表功率失败:" + throwable.getMessage()); + } + + @Override + public AjaxResult getElectricQuantity(Map paramMap) { + return AjaxResult.error("获取电表电量失败:" + throwable.getMessage()); + } + + @Override + public AjaxResult getFrozenElectricity(Map paramMap) { + return AjaxResult.error("获取电表冻结电量失败:" + throwable.getMessage()); + } + + @Override + public AjaxResult getAttRecord(Map paramMap) { + return AjaxResult.error("获取人员打开记录失败:" + throwable.getMessage()); + } + + }; } } diff --git a/op-modules/op-device/src/main/java/com/op/device/controller/DeviceInterfaceController.java b/op-modules/op-device/src/main/java/com/op/device/controller/DeviceInterfaceController.java index dce62c2f6..fe8205e12 100644 --- a/op-modules/op-device/src/main/java/com/op/device/controller/DeviceInterfaceController.java +++ b/op-modules/op-device/src/main/java/com/op/device/controller/DeviceInterfaceController.java @@ -261,4 +261,20 @@ public class DeviceInterfaceController { } } + + + /** + * 产线故障率 + * @param equOperation + * @return + */ + @GetMapping("/getFaultRateList") + public AjaxResult getFaultRateList(EquOperation equOperation) { + DynamicDataSourceContextHolder.push(equOperation.getPoolName()); + try { + return deviceInterfaceService.getFaultRateList(); + }finally { + DynamicDataSourceContextHolder.poll(); + } + } } diff --git a/op-modules/op-device/src/main/java/com/op/device/domain/EquOrder.java b/op-modules/op-device/src/main/java/com/op/device/domain/EquOrder.java index da830927c..089f55e49 100644 --- a/op-modules/op-device/src/main/java/com/op/device/domain/EquOrder.java +++ b/op-modules/op-device/src/main/java/com/op/device/domain/EquOrder.java @@ -74,6 +74,12 @@ public class EquOrder extends BaseEntity { @Excel(name = "循环周期类型") private String planLoopType; + /** + * 点检结果 + * **/ + @Excel(name = "点检结果") + private String checkResult; + /** * 循环执行时间开始 */ @@ -848,6 +854,14 @@ public class EquOrder extends BaseEntity { public String getTimeDimension() { return timeDimension; } public void setTimeDimension(String timeDimension) { this.timeDimension = timeDimension; } + public String getCheckResult() { + return checkResult; + } + + public void setCheckResult(String checkResult) { + this.checkResult = checkResult; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/op-modules/op-device/src/main/java/com/op/device/domain/vo/EquFaultRateVO.java b/op-modules/op-device/src/main/java/com/op/device/domain/vo/EquFaultRateVO.java new file mode 100644 index 000000000..7511d5397 --- /dev/null +++ b/op-modules/op-device/src/main/java/com/op/device/domain/vo/EquFaultRateVO.java @@ -0,0 +1,62 @@ +package com.op.device.domain.vo; + +import java.math.BigDecimal; + +/** + * remark + * + * @author 019117 + * @date + */ +public class EquFaultRateVO { + + private String lineCode; + + private String lineName; + + private BigDecimal workTime; + + private BigDecimal fixTime; + + private BigDecimal faultRate; + + public String getLineCode() { + return lineCode; + } + + public void setLineCode(String lineCode) { + this.lineCode = lineCode; + } + + public String getLineName() { + return lineName; + } + + public void setLineName(String lineName) { + this.lineName = lineName; + } + + public BigDecimal getWorkTime() { + return workTime; + } + + public void setWorkTime(BigDecimal workTime) { + this.workTime = workTime; + } + + public BigDecimal getFixTime() { + return fixTime; + } + + public void setFixTime(BigDecimal fixTime) { + this.fixTime = fixTime; + } + + public BigDecimal getFaultRate() { + return faultRate; + } + + public void setFaultRate(BigDecimal faultRate) { + this.faultRate = faultRate; + } +} diff --git a/op-modules/op-device/src/main/java/com/op/device/mapper/DeviceInterfaceMapper.java b/op-modules/op-device/src/main/java/com/op/device/mapper/DeviceInterfaceMapper.java index 98a460350..7863e5b63 100644 --- a/op-modules/op-device/src/main/java/com/op/device/mapper/DeviceInterfaceMapper.java +++ b/op-modules/op-device/src/main/java/com/op/device/mapper/DeviceInterfaceMapper.java @@ -92,4 +92,7 @@ public interface DeviceInterfaceMapper { Map getWave(); List getRepairWorkOrderCostTime(); + + List getFaultRateList(); + } diff --git a/op-modules/op-device/src/main/java/com/op/device/mapper/EquOrderStandardMapper.java b/op-modules/op-device/src/main/java/com/op/device/mapper/EquOrderStandardMapper.java index 93fab4aa3..abb5f5d89 100644 --- a/op-modules/op-device/src/main/java/com/op/device/mapper/EquOrderStandardMapper.java +++ b/op-modules/op-device/src/main/java/com/op/device/mapper/EquOrderStandardMapper.java @@ -110,4 +110,10 @@ public interface EquOrderStandardMapper { //更新标准 void updateActualValues(EquOrderStandard standardList); + + + /** + * 获取不合格记录 + * **/ + int selectUnqualifiedCount(String orderCode); } diff --git a/op-modules/op-device/src/main/java/com/op/device/service/IDeviceInterfaceService.java b/op-modules/op-device/src/main/java/com/op/device/service/IDeviceInterfaceService.java index f93b7d42c..c1b0e4e85 100644 --- a/op-modules/op-device/src/main/java/com/op/device/service/IDeviceInterfaceService.java +++ b/op-modules/op-device/src/main/java/com/op/device/service/IDeviceInterfaceService.java @@ -75,6 +75,8 @@ public interface IDeviceInterfaceService { AjaxResult getWave(); AjaxResult getRepairWorkOrderCostTime(); + + AjaxResult getFaultRateList(); // // AjaxResult getInspectionWorkOrder(EquOrder equOrder); // diff --git a/op-modules/op-device/src/main/java/com/op/device/service/impl/DeviceInterfaceServiceImpl.java b/op-modules/op-device/src/main/java/com/op/device/service/impl/DeviceInterfaceServiceImpl.java index 5349e9e63..d3a88f6ce 100644 --- a/op-modules/op-device/src/main/java/com/op/device/service/impl/DeviceInterfaceServiceImpl.java +++ b/op-modules/op-device/src/main/java/com/op/device/service/impl/DeviceInterfaceServiceImpl.java @@ -2,7 +2,6 @@ package com.op.device.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; import com.op.common.core.utils.DateUtils; -import com.op.common.core.utils.StringUtils; import com.op.common.core.web.domain.AjaxResult; import com.op.device.domain.*; import com.op.device.domain.vo.*; @@ -312,4 +311,10 @@ public class DeviceInterfaceServiceImpl implements IDeviceInterfaceService { List resultMap = deviceInterfaceMapper.getRepairWorkOrderCostTime(); return success(resultMap); } + + @Override + public AjaxResult getFaultRateList() { + //获取当天在生产的产线的故障率 + return AjaxResult.success(deviceInterfaceMapper.getFaultRateList()); + } } diff --git a/op-modules/op-device/src/main/java/com/op/device/service/impl/DevicePDAServiceImpl.java b/op-modules/op-device/src/main/java/com/op/device/service/impl/DevicePDAServiceImpl.java index 4d95043a8..fb1dc10cf 100644 --- a/op-modules/op-device/src/main/java/com/op/device/service/impl/DevicePDAServiceImpl.java +++ b/op-modules/op-device/src/main/java/com/op/device/service/impl/DevicePDAServiceImpl.java @@ -1137,15 +1137,12 @@ public class DevicePDAServiceImpl implements IDevicePDAService { } else if (list.getFaultStartTime() != null) { downStartTime = list.getFaultStartTime(); } - LocalDateTime downStart = LocalDateTime.ofInstant(downStartTime.toInstant(), zoneId); - LocalDateTime downEnd = LocalDateTime.ofInstant(equRepairWorkOrder.getWorkEndTime().toInstant(), zoneId); - LocalDateTime downDateTime = LocalDateTime.from(downStart); - double downHours = downDateTime.until(downEnd, ChronoUnit.HOURS); - double downMinutes = ((downDateTime.until(downEnd, ChronoUnit.MINUTES) * 1.0) % 60) / 60; - double downSeconds = ((downDateTime.until(downEnd, ChronoUnit.SECONDS) * 1.0) % 3600) / 3600; - double downHour = BigDecimal.valueOf(downHours + downMinutes + downSeconds).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - equRepairWorkOrder.setFaultDownTime(String.valueOf(downHour) + "小时"); + Date workEndTime = equRepairWorkOrder.getWorkEndTime(); + double diff = BigDecimal.valueOf((workEndTime.getTime() - downStartTime.getTime())) + .divide(BigDecimal.valueOf(3600000), 2, RoundingMode.HALF_UP) + .doubleValue(); + equRepairWorkOrder.setFaultDownTime(diff + "小时"); } //代码注释掉了 改了流程 之前是维修完成后,更改设备状态 和 设备运行报表 现在是审核通过之后,才会扣除 diff --git a/op-modules/op-device/src/main/java/com/op/device/service/impl/EquOrderServiceImpl.java b/op-modules/op-device/src/main/java/com/op/device/service/impl/EquOrderServiceImpl.java index a9740ba9c..cd453a0ad 100644 --- a/op-modules/op-device/src/main/java/com/op/device/service/impl/EquOrderServiceImpl.java +++ b/op-modules/op-device/src/main/java/com/op/device/service/impl/EquOrderServiceImpl.java @@ -188,6 +188,21 @@ public class EquOrderServiceImpl implements IEquOrderService { // 获取工单列表 List orderList = equOrderMapper.selectEquOrderList(equOrder); + for (EquOrder order : orderList) { + //获取点检结果 + if ("0".equals(order.getOrderStatus())){ + //未完成不获取结果 + continue; + } + //获取不合格记录,大于0则不合格 + int unqualifiedCount = equOrderStandardMapper.selectUnqualifiedCount(order.getOrderCode()); + if (unqualifiedCount > 0) { + order.setCheckResult("未达标"); + } else { + order.setCheckResult("达标"); + } + } + // 获取工作中心 List workCenters = getWorkCenterCommon(); diff --git a/op-modules/op-device/src/main/resources/mapper/device/DeviceInterfaceMapper.xml b/op-modules/op-device/src/main/resources/mapper/device/DeviceInterfaceMapper.xml index 1671fb070..835ed067c 100644 --- a/op-modules/op-device/src/main/resources/mapper/device/DeviceInterfaceMapper.xml +++ b/op-modules/op-device/src/main/resources/mapper/device/DeviceInterfaceMapper.xml @@ -537,4 +537,64 @@ ORDER BY erwo.work_cost_time DESC; + + + + diff --git a/op-modules/op-device/src/main/resources/mapper/device/EquOrderStandardMapper.xml b/op-modules/op-device/src/main/resources/mapper/device/EquOrderStandardMapper.xml index ff86a9252..c98a8f023 100644 --- a/op-modules/op-device/src/main/resources/mapper/device/EquOrderStandardMapper.xml +++ b/op-modules/op-device/src/main/resources/mapper/device/EquOrderStandardMapper.xml @@ -304,4 +304,15 @@ and del_flag = '0' + + diff --git a/op-modules/op-energy/src/main/java/com/op/energy/base/domain/BaseMonitorInfo.java b/op-modules/op-energy/src/main/java/com/op/energy/base/domain/BaseMonitorInfo.java index 994adda04..2999959d8 100644 --- a/op-modules/op-energy/src/main/java/com/op/energy/base/domain/BaseMonitorInfo.java +++ b/op-modules/op-energy/src/main/java/com/op/energy/base/domain/BaseMonitorInfo.java @@ -183,6 +183,8 @@ public class BaseMonitorInfo extends BaseEntity { private String businessName; + private String addressCode; + /** * 计量设备状态 */ @@ -461,6 +463,14 @@ public class BaseMonitorInfo extends BaseEntity { this.publicShareType = publicShareType; } + public String getAddressCode() { + return addressCode; + } + + public void setAddressCode(String addressCode) { + this.addressCode = addressCode; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/op-modules/op-energy/src/main/java/com/op/energy/base/service/impl/BaseMonitorInfo1ServiceImpl.java b/op-modules/op-energy/src/main/java/com/op/energy/base/service/impl/BaseMonitorInfo1ServiceImpl.java index d1ed9758a..2fc873086 100644 --- a/op-modules/op-energy/src/main/java/com/op/energy/base/service/impl/BaseMonitorInfo1ServiceImpl.java +++ b/op-modules/op-energy/src/main/java/com/op/energy/base/service/impl/BaseMonitorInfo1ServiceImpl.java @@ -1,5 +1,6 @@ package com.op.energy.base.service.impl; +import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.baomidou.dynamic.datasource.annotation.DS; import com.op.common.core.exception.ServiceException; import com.op.common.core.utils.DateUtils; @@ -93,6 +94,14 @@ public class BaseMonitorInfo1ServiceImpl implements IBaseMonitorInfo1Service { System.out.println("新增计量设备信息异常:" + e.getMessage()); } + //判断该通信地址是否已绑定设备 + BaseMonitorInfo temp = new BaseMonitorInfo(); + temp.setAddressCode(baseMonitorInfo.getAddressCode()); + List list = baseMonitorInfoMapper.selectBaseMonitorInfoList(temp); + if (!CollectionUtils.isEmpty(list)){ + throw new ServiceException("通信地址重复:" + baseMonitorInfo.getAddressCode()); + } + baseMonitorInfo.setCreateTime(DateUtils.getNowDate()); baseMonitorInfo.setCreateBy(SecurityUtils.getUsername()); return baseMonitorInfoMapper.insertBaseMonitorInfo(baseMonitorInfo); diff --git a/op-modules/op-energy/src/main/java/com/op/energy/record/controller/RecordDnbInstantController.java b/op-modules/op-energy/src/main/java/com/op/energy/record/controller/RecordDnbInstantController.java index d63cc5836..5f85a9f51 100644 --- a/op-modules/op-energy/src/main/java/com/op/energy/record/controller/RecordDnbInstantController.java +++ b/op-modules/op-energy/src/main/java/com/op/energy/record/controller/RecordDnbInstantController.java @@ -188,4 +188,26 @@ public class RecordDnbInstantController extends BaseController { return AjaxResult.success(recordDnbInstantService.voltageCurrentCurve(baseDnbInstant)); } + /** + * 获取威伟电表能耗明细获取 + * **/ + @PostMapping("/getNhEnergyDetail") + @ResponseBody + public AjaxResult getNhEnergyDetail() { + recordDnbInstantService.getNhEnergyDetail(); + return AjaxResult.success(); + } + + + /** + * 获取威伟电表能耗获取 + * **/ + @PostMapping("/getNhEnergy") + @ResponseBody + public AjaxResult getNhEnergy() { + recordDnbInstantService.getNhEnergy(); + return AjaxResult.success(); + } + + } diff --git a/op-modules/op-energy/src/main/java/com/op/energy/record/service/IRecordDnbInstantService.java b/op-modules/op-energy/src/main/java/com/op/energy/record/service/IRecordDnbInstantService.java index 640bb7524..837ea3fdb 100644 --- a/op-modules/op-energy/src/main/java/com/op/energy/record/service/IRecordDnbInstantService.java +++ b/op-modules/op-energy/src/main/java/com/op/energy/record/service/IRecordDnbInstantService.java @@ -85,4 +85,8 @@ public interface IRecordDnbInstantService { RecordDnbInstant tablewareDetailsInfo(RecordDnbInstant dnbInstant); List voltageCurrentCurve(RecordDnbInstant baseDnbInstant); + + void getNhEnergyDetail(); + + void getNhEnergy(); } diff --git a/op-modules/op-energy/src/main/java/com/op/energy/record/service/impl/RecordDnbInstantServiceImpl.java b/op-modules/op-energy/src/main/java/com/op/energy/record/service/impl/RecordDnbInstantServiceImpl.java index 9238d835c..386103493 100644 --- a/op-modules/op-energy/src/main/java/com/op/energy/record/service/impl/RecordDnbInstantServiceImpl.java +++ b/op-modules/op-energy/src/main/java/com/op/energy/record/service/impl/RecordDnbInstantServiceImpl.java @@ -1,24 +1,30 @@ package com.op.energy.record.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.op.common.core.text.Convert; import com.op.common.core.utils.DateUtils; import com.op.common.core.utils.StringUtils; +import com.op.common.core.web.domain.AjaxResult; import com.op.energy.base.domain.BaseMonitorInfo; +import com.op.energy.base.mapper.BaseMonitorInfo1Mapper; import com.op.energy.base.service.IBaseMonitorInfoService; import com.op.energy.record.domain.RecordDnbInstant; import com.op.energy.record.mapper.RecordDnbInstantMapper; import com.op.energy.record.service.IRecordDnbInstantService; +import com.op.energy.report.domain.ReportPointDnb; +import com.op.energy.report.mapper.ReportPointDnbMapper; +import com.op.system.api.RemoteOpenService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -35,6 +41,15 @@ public class RecordDnbInstantServiceImpl implements IRecordDnbInstantService { @Autowired private IBaseMonitorInfoService baseMonitorInfoService; + @Autowired + private RemoteOpenService remoteOpenService; + + @Autowired + private ReportPointDnbMapper reportPointDnbMapper; + + @Autowired + private BaseMonitorInfo1Mapper baseMonitorInfoMapper; + /** * 查询电实时数据 * @@ -232,5 +247,212 @@ public class RecordDnbInstantServiceImpl implements IRecordDnbInstantService { return recordDnbInstantMapper.selectRecordDnbInstantList(dnbInstant); } + @Override + public void getNhEnergyDetail() { + Map params = new HashMap<>(); + params.put("dateType","mi15"); + //获取当前时间的前后5分钟 + Date nowTime = DateUtils.getNowDate(); + String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,DateUtils.addMinutes(nowTime,-20)); + String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,DateUtils.addMinutes(nowTime,-10)); + params.put("startTime",startTime); + params.put("endTime",endTime); +// params.put("startTime","2025-07-30 13:40:00"); +// params.put("endTime","2025-07-30 13:50:00"); + params.put("valueType","SJZ"); + + + /** + * 电压/电流 + * **/ + AjaxResult voltageRes = remoteOpenService.getVoltageCurrent(params); + List list = new ArrayList<>(); + if(voltageRes.isSuccess()){ + JSONObject resData = JSONObject.parseObject(JSON.toJSONString(voltageRes.get(AjaxResult.DATA_TAG))); + JSONArray array = JSONArray.parseArray(resData.get("Data").toString()); + for (int i = 0; i < array.size(); i++) { + RecordDnbInstant instant = new RecordDnbInstant(); + instant.setVA(getSafeBigDecimal(array.getJSONObject(i), "ADY")); + instant.setVB(getSafeBigDecimal(array.getJSONObject(i), "BDY")); + instant.setVC(getSafeBigDecimal(array.getJSONObject(i), "CDY")); + instant.setIA(getSafeBigDecimal(array.getJSONObject(i), "ADL")); + instant.setIB(getSafeBigDecimal(array.getJSONObject(i), "BDL")); + instant.setIC(getSafeBigDecimal(array.getJSONObject(i), "CDL")); + instant.setMonitorId(array.getJSONObject(i).getString("Address")); + instant.setRecordTime(nowTime); + instant.setCollectTime(DateUtils.dateTime("yyyy-MM-dd HH:mm", array.getJSONObject(i).getString("ReadingDate"))); + list.add(instant); + } + } + + /** + * 功率 + * **/ + AjaxResult electricPowerRes = remoteOpenService.getElectricPower(params); + if(electricPowerRes.isSuccess()){ + JSONObject resData = JSONObject.parseObject(JSON.toJSONString(electricPowerRes.get(AjaxResult.DATA_TAG))); + JSONArray array = JSONArray.parseArray(resData.get("Data").toString()); + for (int i = 0; i < array.size(); i++) { + for (RecordDnbInstant item : list) { + String address = array.getJSONObject(i).getString("Address"); + if (address.equals(item.getMonitorId())) { + item.setGlys(getSafeBigDecimal(array.getJSONObject(i), "GLYS")); + item.setZxyg(getSafeBigDecimal(array.getJSONObject(i), "YGGL")); + item.setActivePower(getSafeBigDecimal(array.getJSONObject(i), "YGGL")); + item.setReactivePower(getSafeBigDecimal(array.getJSONObject(i), "WGGL")); + } + } + } + } + + /** + * 电量 + * **/ + AjaxResult electricQuantityRes= remoteOpenService.getElectricQuantity(params); + if(electricQuantityRes.isSuccess()){ + JSONObject resData = JSONObject.parseObject(JSON.toJSONString(electricQuantityRes.get(AjaxResult.DATA_TAG))); + JSONArray array = JSONArray.parseArray(resData.get("Data").toString()); + for (int i = 0; i < array.size(); i++) { + for (RecordDnbInstant item : list) { + String address = array.getJSONObject(i).getString("Address"); + if (address.equals(item.getMonitorId())) { + item.setReactivePower(getSafeBigDecimal(array.getJSONObject(i), "ZYGDN")); + } + } + } + } + + DynamicDataSourceContextHolder.push("ds_1000"); + + + try { + for (RecordDnbInstant item : list) { + BaseMonitorInfo temp = new BaseMonitorInfo(); + temp.setAddressCode(item.getMonitorId()); + List BaseList = baseMonitorInfoMapper.selectBaseMonitorInfoList(temp); + for (BaseMonitorInfo base : BaseList) { + item.setMonitorId(base.getMonitorId()); + recordDnbInstantMapper.insertRecordDnbInstant(item); + } + } + }finally { + DynamicDataSourceContextHolder.poll(); + } + + } + + @Override + public void getNhEnergy() { + Map params = new HashMap<>(); + params.put("dateType","mi15"); + //获取当前时间的前后5分钟 + Date nowDate = DateUtils.getNowDate(); + //取整点数据 + String nowDateStr = DateUtils.parseDateToStr("yyyy-MM-dd HH",nowDate)+":00:00"; + String startTime = DateUtils.parseDateToStr("yyyy-MM-dd HH",DateUtils.addHours(nowDate,-1))+":00:00"; + params.put("startTime",startTime); + params.put("endTime",nowDateStr); + params.put("valueType","SJZ"); + + /** + * 电量 + * **/ + List list = new ArrayList<>(); + AjaxResult electricQuantityRes= remoteOpenService.getElectricQuantity(params); + if(electricQuantityRes.isSuccess()){ + JSONObject resData = JSONObject.parseObject(JSON.toJSONString(electricQuantityRes.get(AjaxResult.DATA_TAG))); + JSONArray array = JSONArray.parseArray(resData.get("Data").toString()); + //根据Address分类 + List addressList = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + addressList.add(array.getJSONObject(i).getString("Address")); + } + //addressList去重 + addressList = addressList.stream().distinct().collect(Collectors.toList()); + + DynamicDataSourceContextHolder.push("ds_1000"); + try { + for (String address : addressList) { + ReportPointDnb dnb = new ReportPointDnb(); + BigDecimal electricQuantity = BigDecimal.ZERO; + for (int i = 0; i < array.size(); i++) { + if (address.equals(array.getJSONObject(i).getString("Address"))) { + electricQuantity = electricQuantity.add(getSafeBigDecimal(array.getJSONObject(i), "ZYGDN")); + } + } + dnb.setMeterValue(array.getJSONObject(0).getBigDecimal("ZYGDNSZ")); + dnb.setExpend(electricQuantity); + dnb.setMonitorId(address); + dnb.setBeginTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,startTime)); + dnb.setEndTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,nowDateStr)); + dnb.setRecordTime(new Date()); + dnb.setPointTime(removeLeadingZeros(DateUtils.parseDateToStr("HH",DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,startTime)))); + BaseMonitorInfo temp = new BaseMonitorInfo(); + temp.setAddressCode(dnb.getMonitorId()); + List BaseList = baseMonitorInfoMapper.selectBaseMonitorInfoList(temp); + for (BaseMonitorInfo base : BaseList) { + dnb.setMonitorId(base.getMonitorId()); + reportPointDnbMapper.insertReportPointDnb(dnb); + } + } + }finally { + DynamicDataSourceContextHolder.poll(); + } + + + } + } + + /** + * 移除前面的0 + * **/ + public static String removeLeadingZeros(String str) { + if (str.isEmpty()){ + return ""; + } + int index = 0; + while (index < str.length() && str.charAt(index) == '0') { + index++; + } + // 处理全零情况(如"0000"返回"0") + return index == str.length() ? "0" : str.substring(index); + } + + private static BigDecimal getSafeBigDecimal(JSONObject jsonObject, String key) { + BigDecimal defaultValue = BigDecimal.ZERO; + // 处理字段不存在的情况 + if (!jsonObject.containsKey(key)) { + return defaultValue; + } + + Object value = jsonObject.get(key); + // 处理值为null的情况 + if (value == null) { + return defaultValue; + } + + // 处理各种可能的数值类型 + try { + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } else if (value instanceof Number) { + // 处理整数、浮点数等数字类型 + return new BigDecimal(value.toString()); + } else if (value instanceof String) { + // 处理字符串类型的数字 + String strValue = (String) value; + if (strValue.trim().isEmpty()) { + return defaultValue; + } + return new BigDecimal(strValue); + } else { + // 不支持的类型 + return defaultValue; + } + } catch (NumberFormatException e) { + // 转换失败时返回默认值 + return defaultValue; + } + } } diff --git a/op-modules/op-energy/src/main/resources/mapper/base/BaseMonitorInfo1Mapper.xml b/op-modules/op-energy/src/main/resources/mapper/base/BaseMonitorInfo1Mapper.xml index bc5534481..e3581324e 100644 --- a/op-modules/op-energy/src/main/resources/mapper/base/BaseMonitorInfo1Mapper.xml +++ b/op-modules/op-energy/src/main/resources/mapper/base/BaseMonitorInfo1Mapper.xml @@ -37,13 +37,14 @@ + select objid, parent_id, monitor_id, monitor_name, monitor_addr, monitor_type, monitor_status, collect_device_id, ancestors, grade, build_id, subentry_id, business_id, meter_type_id, meter_id, correct_value, pt, ct, is_ammeter, is_key_monitor, is_circuit, dept_id, user_id, - create_by, create_time, update_by, update_time, public_share_type,monitor_hierarchy,room_code,room_name,physical_code from base_monitor_info + create_by, create_time, update_by, update_time, public_share_type,monitor_hierarchy,room_code,room_name,physical_code,address_code from base_monitor_info @@ -143,6 +145,7 @@ room_code, room_name, physical_code, + address_code, #{parentId}, @@ -176,6 +179,7 @@ #{roomCode}, #{roomName}, #{physicalCode}, + #{addressCode}, @@ -213,6 +217,7 @@ room_code = #{roomCode}, room_name = #{roomName}, physical_code = #{physicalCode}, + address_code = #{addressCode}, where objid = #{objid} diff --git a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java index e97de7bb8..77d2dc6ad 100644 --- a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java +++ b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java @@ -41,6 +41,9 @@ public class RyTask { @Autowired private RemoteWmsService remoteWmsService; + @Autowired + private RemoteEnergyService remoteEnergyService; + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); } @@ -256,5 +259,25 @@ public class RyTask { logger.info("++更新设备的运行时间+开始++updateEquRunTime+++++"); remoteMesService.updateEquRunTime(); } + + /**********同步电整点数据*********/ + public void SyncNhEnergy(){ + logger.info("++同步电整点数据+开始++getNhEnergy+++++"); + remoteEnergyService.SyncNhEnergy(); + } + + /**********同步电实时数据*********/ + public void SyncNhEnergyDetail(){ + logger.info("++同步电实时数据+开始++getNhEnergyDetail+++++"); + remoteEnergyService.SyncNhEnergyDetail(); + } + + + /**********同步新hr系统的出勤记录*********/ + public void syncHrAttendance(){ + logger.info("+++开始同步新hr系统的出勤记录++syncHrAttendance+++++"); + remoteMesService.syncHrAttendance(); + } + } diff --git a/op-modules/op-mes/src/main/java/com/op/mes/controller/MesAttendanceRecordsController.java b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesAttendanceRecordsController.java index 717c3126a..92f2f10e3 100644 --- a/op-modules/op-mes/src/main/java/com/op/mes/controller/MesAttendanceRecordsController.java +++ b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesAttendanceRecordsController.java @@ -5,8 +5,10 @@ import javax.servlet.http.HttpServletResponse; import com.op.common.core.utils.poi.ExcelUtil; import com.op.common.core.web.controller.BaseController; +import com.op.common.core.web.domain.AjaxResult; import com.op.common.core.web.page.TableDataInfo; import com.op.common.security.annotation.RequiresPermissions; +import com.op.mes.domain.MesPostAttendanceRecords; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -96,4 +98,38 @@ public class MesAttendanceRecordsController extends BaseController // { // return toAjax(mesAttendanceRecordsService.deleteMesAttendanceRecordsByIds(ids)); // } + + /** + * 同步hr系统出勤记录信息 + * **/ + @PostMapping("/syncHrAttendance") + public AjaxResult syncHrAttendance() { + return mesAttendanceRecordsService.syncHrAttendance(); + } + + /** + * 获取岗位人员出勤列表 + * **/ + @RequiresPermissions("mes:AttendanceRecords:list") + @GetMapping("/postAttendance/list") + public TableDataInfo getPostAttendanceList(MesPostAttendanceRecords mesAttendanceRecords) + { + startPage(); + List list = mesAttendanceRecordsService.getPostAttendanceList(mesAttendanceRecords); + return getDataTable(list); + } + + + /** + * 导出岗位出勤列表 + */ + @RequiresPermissions("mes:AttendanceRecords:export") + @PostMapping("/postAttendance/export") + public void exportPostAttendance(HttpServletResponse response, MesPostAttendanceRecords mesAttendanceRecords) + { + List list = mesAttendanceRecordsService.getPostAttendanceList(mesAttendanceRecords); + ExcelUtil util = new ExcelUtil(MesPostAttendanceRecords.class); + util.exportExcel(response, list, "岗位出勤数据"); + } + } diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/MesPostAttendanceRecords.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesPostAttendanceRecords.java new file mode 100644 index 000000000..bbfaf2e6b --- /dev/null +++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesPostAttendanceRecords.java @@ -0,0 +1,98 @@ +package com.op.mes.domain; + +import com.op.common.core.annotation.Excel; + +/** + * remark + * + * @author 019117 + * @date + */ +public class MesPostAttendanceRecords { + + @Excel(name = "排序") + private String sort; + + @Excel(name = "岗位") + private String post; + + @Excel(name = "总人数") + private String allNum; + + @Excel(name = "出勤人数") + private String attendNum; + + @Excel(name = "缺勤人数") + private String diffNum; + + private String beginDate; + + private String endDate; + + private String deptId; + + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public String getPost() { + return post; + } + + public void setPost(String post) { + this.post = post; + } + + public String getAllNum() { + return allNum; + } + + public void setAllNum(String allNum) { + this.allNum = allNum; + } + + public String getAttendNum() { + return attendNum; + } + + public void setAttendNum(String attendNum) { + this.attendNum = attendNum; + } + + public String getDiffNum() { + return diffNum; + } + + public void setDiffNum(String diffNum) { + this.diffNum = diffNum; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } +} diff --git a/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesAttendanceRecordsMapper.java b/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesAttendanceRecordsMapper.java index 8823c336b..9db293c20 100644 --- a/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesAttendanceRecordsMapper.java +++ b/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesAttendanceRecordsMapper.java @@ -2,6 +2,7 @@ package com.op.mes.mapper; import java.util.List; import com.op.mes.domain.MesAttendanceRecords; +import com.op.mes.domain.MesPostAttendanceRecords; /** * MES打卡记录Mapper接口 @@ -61,4 +62,11 @@ public interface MesAttendanceRecordsMapper List selectMesClockRecord(MesAttendanceRecords mesAttendanceRecords); + + + List selectMesPersonList(String deptId); + + int batchAttendanceRecords(List list); + + List getPostAttendanceList(MesPostAttendanceRecords params); } diff --git a/op-modules/op-mes/src/main/java/com/op/mes/service/IMesAttendanceRecordsService.java b/op-modules/op-mes/src/main/java/com/op/mes/service/IMesAttendanceRecordsService.java index f0819b23f..3719f5c1b 100644 --- a/op-modules/op-mes/src/main/java/com/op/mes/service/IMesAttendanceRecordsService.java +++ b/op-modules/op-mes/src/main/java/com/op/mes/service/IMesAttendanceRecordsService.java @@ -1,7 +1,9 @@ package com.op.mes.service; import java.util.List; +import com.op.common.core.web.domain.AjaxResult; import com.op.mes.domain.MesAttendanceRecords; +import com.op.mes.domain.MesPostAttendanceRecords; /** * MES打卡记录Service接口 @@ -58,4 +60,11 @@ public interface IMesAttendanceRecordsService * @return 结果 */ public int deleteMesAttendanceRecordsById(String id); + + AjaxResult syncHrAttendance(); + + List getPostAttendanceList(MesPostAttendanceRecords params); + + + } diff --git a/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesAttendanceRecordsServiceImpl.java b/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesAttendanceRecordsServiceImpl.java index 167eb9f2f..70f0eb60e 100644 --- a/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesAttendanceRecordsServiceImpl.java +++ b/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesAttendanceRecordsServiceImpl.java @@ -1,15 +1,32 @@ package com.op.mes.service.impl; -import java.util.ArrayList; -import java.util.List; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import com.op.common.core.domain.R; import com.op.common.core.utils.DateUtils; +import com.op.common.core.utils.uuid.IdUtils; +import com.op.common.core.web.domain.AjaxResult; +import com.op.mes.domain.MesPostAttendanceRecords; +import com.op.system.api.RemoteOpenService; +import com.op.system.api.RemoteUserService; +import com.op.system.api.domain.SysUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.op.mes.mapper.MesAttendanceRecordsMapper; import com.op.mes.domain.MesAttendanceRecords; import com.op.mes.service.IMesAttendanceRecordsService; +import org.springframework.util.CollectionUtils; + +import static com.op.common.core.web.domain.AjaxResult.error; +import static com.op.common.core.web.domain.AjaxResult.success; /** * MES打卡记录Service业务层处理 @@ -23,6 +40,14 @@ public class MesAttendanceRecordsServiceImpl implements IMesAttendanceRecordsSer @Autowired private MesAttendanceRecordsMapper mesAttendanceRecordsMapper; + + @Autowired + private RemoteOpenService remoteOpenService; + + @Autowired + private RemoteUserService remoteUserService; + + /** * 查询MES打卡记录 * @@ -96,4 +121,119 @@ public class MesAttendanceRecordsServiceImpl implements IMesAttendanceRecordsSer { return mesAttendanceRecordsMapper.deleteMesAttendanceRecordsById(id); } + + + @Override + public AjaxResult syncHrAttendance() { + // 加载sf-cloud库的sys_datasource + SysUser sysUser = new SysUser(); + sysUser.setUserId(1L); + DynamicDataSourceContextHolder.push("master"); + R>> dateSources0 = new R<>(); + try { + dateSources0 = remoteUserService.getPoolNameList(sysUser); + }finally { + DynamicDataSourceContextHolder.poll(); + } + List> dateSources = dateSources0.getData(); + ExecutorService executorService = new ThreadPoolExecutor( + dateSources.size(), + dateSources.size(), + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue()); + try { + dateSources.forEach(dateSource -> { + if("ds_1000".equals(dateSource.get("poolName"))){ + + Runnable run = () -> { + DynamicDataSourceContextHolder.push(dateSource.get("poolName")); + + //不同工厂使用不同的deptId + String deptId = "10000152"; + + //查询当前生效的车间人员信息 + List personList = mesAttendanceRecordsMapper.selectMesPersonList(deptId); + + //查询当天人员打开记录 + Map paramMap = new HashMap<>(); + paramMap.put("bd", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.getNowDate())); + paramMap.put("ed", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.getNowDate())); + AjaxResult result = remoteOpenService.getAttRecord(paramMap); + List attendanceRecords = new ArrayList<>(); + if (result.isSuccess()){ + List> attList = (List>) result.get("data"); + + //循环遍历出车间人员打开记录 + for (Map map : attList){ + for (MesAttendanceRecords person : personList) + if (person.getUserId().equals(map.get("empcode"))){ + MesAttendanceRecords attendanceRecord = new MesAttendanceRecords(); + attendanceRecord.setId(IdUtils.fastSimpleUUID()); + attendanceRecord.setUserId(person.getUserId()); + attendanceRecord.setUserName(person.getUserName()); + attendanceRecord.setAttendanceStatus("正常"); + attendanceRecord.setSex(person.getSex()); + Date attendTime = extractAttendTime(map.get("strdata")); + attendanceRecord.setStartTime(attendTime); + attendanceRecord.setAttendanceTime("07:30-19:30"); + attendanceRecord.setAttendanceDate(attendTime); + attendanceRecord.setWorkHours(0L); + attendanceRecord.setCreateTime(new Date()); + attendanceRecord.setPost(person.getPost()); + attendanceRecords.add(attendanceRecord); + } + } + //插入人员打卡记录 + if (!CollectionUtils.isEmpty(attendanceRecords)){ + mesAttendanceRecordsMapper.batchAttendanceRecords(attendanceRecords); + } + } + }; + executorService.execute(run); + } + }); + } catch (Exception e) { + return error("service == createCPBatchTask == exception"); + } finally { + executorService.shutdown(); + } + return success(); + } + + @Override + @DS("#header.poolName") + public List getPostAttendanceList(MesPostAttendanceRecords params) { + //目前只有小榄工厂黑蚊香车间 + params.setDeptId("10000152"); + return mesAttendanceRecordsMapper.getPostAttendanceList(params); + } + + private static Date extractAttendTime(String data) { + // 校验输入是否为空 + if (data == null || data.trim().isEmpty()) { + System.out.println("输入字符串不能为空"); + return null; + } + + // 按照空格分割字符串 + String[] parts = data.split(" "); + + // 校验分割后的数组长度是否符合预期 + if (parts.length < 6) { + System.out.println("输入字符串格式不正确,无法提取时间"); + return null; + } + + // 拼接日期和时间部分 + String datetimeStr = parts[4] + " " + parts[5]; + + // 定义日期格式并进行转换 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d HH:mm:ss"); + try { + return sdf.parse(datetimeStr); + } catch (ParseException e) { + System.out.println("时间格式解析错误: " + e.getMessage()); + return null; + } + } } diff --git a/op-modules/op-mes/src/main/resources/mapper/mes/MesAttendanceRecordsMapper.xml b/op-modules/op-mes/src/main/resources/mapper/mes/MesAttendanceRecordsMapper.xml index d51c9ebda..f4e93bd3a 100644 --- a/op-modules/op-mes/src/main/resources/mapper/mes/MesAttendanceRecordsMapper.xml +++ b/op-modules/op-mes/src/main/resources/mapper/mes/MesAttendanceRecordsMapper.xml @@ -169,4 +169,111 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + + + + + INSERT INTO mes_attendance_records ( + id, + user_id, + user_name, + attendance_status, + sex, + start_time, + attendance_time, + attendance_date, + work_hours, + create_time, + post + ) + SELECT + temp.id, + temp.userId, + temp.userName, + temp.attendanceStatus, + temp.sex, + temp.startTime, + temp.attendanceTime, + temp.attendanceDate, + temp.workHours, + temp.createTime, + temp.post + FROM ( + + SELECT + #{item.id, jdbcType=VARCHAR} AS id, + #{item.userId, jdbcType=VARCHAR} AS userId, + #{item.userName, jdbcType=VARCHAR} AS userName, + #{item.attendanceStatus, jdbcType=VARCHAR} AS attendanceStatus, + #{item.sex, jdbcType=VARCHAR} AS sex, + #{item.startTime, jdbcType=TIMESTAMP} AS startTime, + #{item.attendanceTime, jdbcType=VARCHAR} AS attendanceTime, + #{item.attendanceDate, jdbcType=TIMESTAMP} AS attendanceDate, + #{item.workHours, jdbcType=DECIMAL} AS workHours, + #{item.createTime, jdbcType=TIMESTAMP} AS createTime, + #{item.post, jdbcType=VARCHAR} AS post + + ) AS temp + WHERE NOT EXISTS ( + SELECT 1 + FROM mes_attendance_records target + WHERE target.user_id = temp.userId + AND target.start_time = temp.startTime + ) + + + + + diff --git a/op-modules/op-mes/src/main/resources/mapper/mes/MesReportWorkMapper.xml b/op-modules/op-mes/src/main/resources/mapper/mes/MesReportWorkMapper.xml index 400c40a7b..47bfef884 100644 --- a/op-modules/op-mes/src/main/resources/mapper/mes/MesReportWorkMapper.xml +++ b/op-modules/op-mes/src/main/resources/mapper/mes/MesReportWorkMapper.xml @@ -203,7 +203,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sf1.factory_name carName, sf.equipment_code machineCode, sf.equipment_name machineName, - mrw.workorder_code workorderCode, + RIGHT(wo.workorder_code_sap, 9) workorderCode, mrw.batch batch, mrw.product_code productCode, mrw.product_name productName, @@ -215,6 +215,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join base_equipment sf on sf.equipment_code = mrw.machine_code left join sys_factory sf1 on sf.workshop_code = sf1.factory_code left join sys_factory sf2 on sf1.parent_id = sf2.factory_id + LEFT JOIN pro_order_workorder wo ON wo.workorder_code = mrw.workorder_code where mrw.parent_order = '0' and mrw.del_flag = '0' and sf.equipment_name like concat('%', #{machineName}, '%') and sf1.factory_name like concat('%', #{carName}, '%') diff --git a/op-modules/op-open/src/main/java/com/op/open/common/CustomFeignLogger.java b/op-modules/op-open/src/main/java/com/op/open/common/CustomFeignLogger.java new file mode 100644 index 000000000..ee5216320 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/common/CustomFeignLogger.java @@ -0,0 +1,49 @@ +package com.op.open.common; + + +import feign.Logger; +import feign.Request; +import feign.Response; +import feign.Util; + +import org.slf4j.MDC; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.URLDecoder; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +/** + * @author 018301 + */ +@Component +public class CustomFeignLogger extends Logger { + + private static final String KEY_OUTSIDE_TRACE_ID = "outsideTraceId"; + + @Override + protected void log(String configKey, String format, Object... args) { + + } + + @Override + protected void logRequest(String configKey, Level logLevel, Request request) { + + } + + @Override + protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException { + int status = response.status(); + if (response.body() != null && !(status == 204 || status == 205)) { + byte[] bodyData = Util.toByteArray(response.body().asInputStream()); + + MDC.remove(KEY_OUTSIDE_TRACE_ID); + return response.toBuilder().body(bodyData).build(); + } + return response; + } + +} diff --git a/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConverter.java b/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConverter.java new file mode 100644 index 000000000..73374c15d --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConverter.java @@ -0,0 +1,26 @@ +package com.op.open.common; + +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: 负责处理Feign接口消息体转换 + * + * @author : huangjinxian + * @version : 1.0 + * @since : 2024/9/13 + */ +@SuppressWarnings({"unused"}) +public class FeignHttpMessageConverter extends MappingJackson2HttpMessageConverter { + public FeignHttpMessageConverter() { + List mediaTypes = new ArrayList<>(); + String utf8Suf = ";charset=UTF-8"; + mediaTypes.add(MediaType.valueOf(MediaType.TEXT_EVENT_STREAM_VALUE + utf8Suf)); + mediaTypes.add(MediaType.valueOf(MediaType.TEXT_PLAIN_VALUE + utf8Suf)); + mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + utf8Suf)); + setSupportedMediaTypes(mediaTypes); + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConvertersFactory.java b/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConvertersFactory.java new file mode 100644 index 000000000..9508d2e20 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/common/FeignHttpMessageConvertersFactory.java @@ -0,0 +1,20 @@ +package com.op.open.common; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; + +/** + * Description: Feign接口消息体转换工厂类 + * + * @author : huangjinxian + * @version : 1.0 + * @since : 2024/9/13 + */ +@SuppressWarnings({"unused"}) +public class FeignHttpMessageConvertersFactory implements ObjectFactory { + @Override + public HttpMessageConverters getObject() throws BeansException { + return new HttpMessageConverters(new FeignHttpMessageConverter()); + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/config/OutsideApiConfig.java b/op-modules/op-open/src/main/java/com/op/open/config/OutsideApiConfig.java new file mode 100644 index 000000000..96a717e31 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/config/OutsideApiConfig.java @@ -0,0 +1,78 @@ +package com.op.open.config; + + +import com.op.open.common.CustomFeignLogger; +import com.op.open.common.FeignHttpMessageConvertersFactory; +import com.op.open.hr.HrClient; +import com.op.open.hr.HrRequestInterceptor; +import com.op.open.nhApi.NhApiClient; +import com.op.open.nhApi.NhApiRequestInterceptor; +import feign.*; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.openfeign.support.ResponseEntityDecoder; +import org.springframework.cloud.openfeign.support.SpringDecoder; +import org.springframework.cloud.openfeign.support.SpringEncoder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * Description: + * + * @author : huangjinxian + * @version : 1.0 + * @since : 2024/9/23 + */ +@Configuration +public class OutsideApiConfig { + + @Value("${nhApi.domain}") + private String nhAipDomain; + + @Value("${nhApi.key}") + private String nhAipKey; + + @Value("${newHr.domain}") + private String hrDomain; + + + private final CustomFeignLogger customFeignLogger; + + public OutsideApiConfig(CustomFeignLogger customFeignLogger) { + this.customFeignLogger = customFeignLogger; + } + + + private Feign.Builder getDefaultFeignClient() { + return Feign.builder() + .decoder(new ResponseEntityDecoder(new SpringDecoder(new FeignHttpMessageConvertersFactory()))) + .options(new Request.Options(60, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true)) + .contract(new Contract.Default()) + .logLevel(Logger.Level.FULL) + .logger(customFeignLogger) + .dismiss404(); + } + + @Bean + public NhApiClient nhApiClient() { + return getDefaultFeignClient() + .encoder(new SpringEncoder(new FeignHttpMessageConvertersFactory())) + .retryer(new Retryer.Default(100, SECONDS.toMillis(1), 3)) + .requestInterceptor(new NhApiRequestInterceptor(nhAipKey)) + .target(NhApiClient.class, nhAipDomain); + } + + @Bean + public HrClient hrClient() { + return getDefaultFeignClient() + .encoder(new SpringEncoder(new FeignHttpMessageConvertersFactory())) + .retryer(new Retryer.Default(100, SECONDS.toMillis(1), 3)) + .requestInterceptor(new HrRequestInterceptor()) + .target(HrClient.class, hrDomain); + } + +} diff --git a/op-modules/op-open/src/main/java/com/op/open/config/SpringContext.java b/op-modules/op-open/src/main/java/com/op/open/config/SpringContext.java new file mode 100644 index 000000000..f0d7732a5 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/config/SpringContext.java @@ -0,0 +1,150 @@ +package com.op.open.config; + +import com.google.common.collect.Lists; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * spring上下文综合应用 + * + * @author huangjinxian + * @version 1.0 + * @date 2024/9/8 + */ +@Component +public class SpringContext implements ApplicationContextAware { + //上下文 + private static ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContext.init(applicationContext); + } + + public static void init(ApplicationContext context) throws BeansException { + if (applicationContext == null) { + applicationContext = context; + } + } + + /** + * 获取Spring配置环境变量 + * + * @return: org.springframework.core.env.Environment + * @auther huangjinxian + * @see Environment + */ + public static Environment getEnvironment() { + return applicationContext.getEnvironment(); + } + + /** + * 获取上下文 + * + * @return: org.springframework.context.ApplicationContext + * @auther huangjinxian + * @see ApplicationContext + */ + public static ApplicationContext self() { + return applicationContext; + } + + /** + * 发送事件通知 + * + * @param event + */ + public static void publishEvent(Object event) { + applicationContext.publishEvent(event); + } + + /** + * 获取java bean + * + * @param name: bean名 + * @return: java.lang.Object + * @auther huangjinxian + * @see Object + */ + public static Object getBean(String name) throws BeansException { + return applicationContext.getBean(name); + } + + /** + * 获取java bean + * + * @param clazz: bean类 + * @return: T + * @auther huangjinxian + * @see T + */ + public static T getBean(Class clazz) throws BeansException { + return applicationContext.getBean(clazz); + } + + /** + * 获取java bean + * + * @param name: bean名 + * @param clazz: bean类 + * @return: T + * @auther huangjinxian + * @see T + */ + public static T getBean(String name, Class clazz) throws BeansException { + return applicationContext.getBean(name, clazz); + } + + /** + * 根据类型获取BeanMap + * + * @param clazz: bean类 + * @return: java.util.Map + * @auther huangjinxian + * @see Map < String,T> + */ + public static Map getBeanMapOfType(Class clazz) { + return applicationContext.getBeansOfType(clazz); + } + + /** + * 根据类型获取BeanList + * + * @param clazz: bean类 + * @return: java.util.Map + * @auther huangjinxian + * @see Map< String,T> + */ + public static List getBeanListOfType(Class clazz) { + return Lists.newArrayList(applicationContext.getBeansOfType(clazz).values()); + } + + /** + * 自动装配这个类型的依赖 + * + * @param t: 类 + * @return: void + * @auther huangjinxian + */ + public static void autowireBean(T t) { + applicationContext.getAutowireCapableBeanFactory().autowireBean(t); + } + + /** + * 判断IOC容器中是否匹配了名字为name的bean + * + * @param name: bean名 + * @return: boolean + * @auther huangjinxian + * @see boolean + */ + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/controller/OpenController.java b/op-modules/op-open/src/main/java/com/op/open/controller/OpenController.java index 1c329cf0e..a3f7f287e 100644 --- a/op-modules/op-open/src/main/java/com/op/open/controller/OpenController.java +++ b/op-modules/op-open/src/main/java/com/op/open/controller/OpenController.java @@ -8,6 +8,8 @@ import com.op.common.core.utils.StringUtils; import com.op.common.core.web.controller.BaseController; import com.op.common.core.web.domain.AjaxResult; import com.op.common.datasource.creator.DynamicDatasourceCreator; +import com.op.open.hr.domain.HrQuery; +import com.op.open.nhApi.domain.NhQuery; import com.op.open.service.OpenService; import com.op.system.api.domain.DataSourcePropertyDTO; import com.op.system.api.domain.device.EquEquipmentDTO; @@ -270,4 +272,45 @@ public class OpenController extends BaseController { return openService.addEquSapInfo(dto); } + /** + * 电压/电流 + * **/ + @PostMapping("/getVoltageCurrent") + public AjaxResult getVoltageCurrent(@RequestBody NhQuery params) { + return openService.getVoltageCurrent(params); + } + + /** + * 功率 + * **/ + @PostMapping("/getElectricPower") + public AjaxResult getElectricPower(@RequestBody NhQuery params) { + return openService.getElectricPower(params); + } + /** + * 电量 + * **/ + @PostMapping("/getElectricQuantity") + public AjaxResult getElectricQuantity(@RequestBody NhQuery params) { + return openService.getElectricQuantity(params); + } + + /** + * 电量 + * **/ + @PostMapping("/getFrozenElectricity") + public AjaxResult getFrozenElectricity(@RequestBody NhQuery params) { + return openService.getFrozenElectricity(params); + } + + + /** + * 从hr系统获取人员打开信息 + * **/ + @PostMapping("/getAttRecord") + public AjaxResult getAttRecord(@RequestBody HrQuery params){ + return openService.getAttRecord(params); + } + + } diff --git a/op-modules/op-open/src/main/java/com/op/open/hr/HrApi.java b/op-modules/op-open/src/main/java/com/op/open/hr/HrApi.java new file mode 100644 index 000000000..94f99fcc1 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/hr/HrApi.java @@ -0,0 +1,75 @@ +package com.op.open.hr; + + +import com.op.open.hr.domain.HrQuery; +import com.op.open.hr.domain.UserSign; +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * remark + * + * @author 019117 + * @date + */ +@Component +public class HrApi { + private final HrClient hrClient; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public HrApi(HrClient hrClient) { + this.hrClient = hrClient; + } + + /** + * 重试参数 + */ + private int reloadValue = 0; + + public List getAttRecord( HrQuery params ) { + try { + String httpResult = hrClient.getAttRecord(params); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(httpResult); + + String code = jsonNode.get("iserror").asText(); + if (!"0".equals(code)) { + + if ("无效的v8apitoken".equals(jsonNode.get("errormsg").asText())){ + if (reloadValue < 3) { + reloadValue++; + return getAttRecord(params); + } + } + throw new RuntimeException(); + } + + reloadValue = 0; + + + return convert(jsonNode.get("data"), UserSign.class); + + }catch (Exception e){ + throw new RuntimeException(); + } + } + + + public static List convert(JsonNode jsonNode, Class elementType) throws Exception { + // 如果是数组节点,直接转换 + if (jsonNode.isArray()) { + // 使用TypeReference来指定泛型类型 + return objectMapper.readValue( + objectMapper.writeValueAsString(jsonNode), + new TypeReference>() {} + ); + } + throw new IllegalArgumentException("JsonNode is not an array"); + } + +} diff --git a/op-modules/op-open/src/main/java/com/op/open/hr/HrClient.java b/op-modules/op-open/src/main/java/com/op/open/hr/HrClient.java new file mode 100644 index 000000000..39e106a1c --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/hr/HrClient.java @@ -0,0 +1,28 @@ +package com.op.open.hr; + +import com.fasterxml.jackson.databind.JsonNode; +import com.op.open.hr.domain.HrQuery; +import feign.Headers; +import feign.QueryMap; +import feign.RequestLine; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +/** + * remark + * + * @author 019117 + * @date + */ +public interface HrClient { + + @RequestLine("GET /v8api/api/login/getDynV8ApiToken") + @Headers({"Content-Type: application/json"}) + String getToken(); + + @RequestLine("GET /v8api/v8api/att/getAttRecord") + @Headers({"Content-Type: application/json"}) + String getAttRecord(@QueryMap HrQuery params); + +} diff --git a/op-modules/op-open/src/main/java/com/op/open/hr/HrRequestInterceptor.java b/op-modules/op-open/src/main/java/com/op/open/hr/HrRequestInterceptor.java new file mode 100644 index 000000000..afd605bc7 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/hr/HrRequestInterceptor.java @@ -0,0 +1,37 @@ +package com.op.open.hr; + +import com.fasterxml.jackson.databind.JsonNode; +import com.op.open.config.SpringContext; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; + +import java.util.HashMap; +import java.util.Map; + +/** + * remark + * + * @author 019117 + * @date + */ +public class HrRequestInterceptor implements RequestInterceptor { + + + private String getToken() { + HrClient hrClient = SpringContext.getBean(HrClient.class); + return hrClient.getToken(); + } + + @Override + public void apply(RequestTemplate template) { + if ("/v8api/api/login/getDynV8ApiToken".equals(template.url())) { + return; + } + + String token = getToken(); + + template.header("v8apitoken", token); + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/hr/domain/HrQuery.java b/op-modules/op-open/src/main/java/com/op/open/hr/domain/HrQuery.java new file mode 100644 index 000000000..4f2804cb7 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/hr/domain/HrQuery.java @@ -0,0 +1,40 @@ +package com.op.open.hr.domain; + +/** + * remark + * + * @author 019117 + * @date + */ +public class HrQuery { + + private String bd; + + private String ed; + + private String empcode; + + public String getBd() { + return bd; + } + + public void setBd(String bd) { + this.bd = bd; + } + + public String getEd() { + return ed; + } + + public void setEd(String ed) { + this.ed = ed; + } + + public String getEmpcode() { + return empcode; + } + + public void setEmpcode(String empcode) { + this.empcode = empcode; + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/hr/domain/UserSign.java b/op-modules/op-open/src/main/java/com/op/open/hr/domain/UserSign.java new file mode 100644 index 000000000..394d39a02 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/hr/domain/UserSign.java @@ -0,0 +1,48 @@ +package com.op.open.hr.domain; + +/** + * remark + * + * @author 019117 + * @date + */ +public class UserSign { + + private String empname; + private String empcode; + private String strdata; + private String kqdate; + + + public String getEmpname() { + return empname; + } + + public void setEmpname(String empname) { + this.empname = empname; + } + + public String getEmpcode() { + return empcode; + } + + public void setEmpcode(String empcode) { + this.empcode = empcode; + } + + public String getStrdata() { + return strdata; + } + + public void setStrdata(String strdata) { + this.strdata = strdata; + } + + public String getKqdate() { + return kqdate; + } + + public void setKqdate(String kqdate) { + this.kqdate = kqdate; + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiClient.java b/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiClient.java new file mode 100644 index 000000000..a87fed529 --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiClient.java @@ -0,0 +1,35 @@ +package com.op.open.nhApi; + +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.databind.JsonNode; +import com.op.open.nhApi.domain.NhQuery; +import feign.Headers; +import feign.RequestLine; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * remark + * + * @author 019117 + * @date + */ +public interface NhApiClient { + + @RequestLine("POST /WebApi/NH2/VoltageCurrent") + @Headers({"Content-Type: application/json"}) + JSONObject getVoltageCurrent(@RequestBody NhQuery params); + + @RequestLine("POST /WebApi/NH2/ElectricPower") + @Headers({"Content-Type: application/json"}) + JSONObject getElectricPower(@RequestBody NhQuery params); + + @RequestLine("POST /WebApi/NH2/ElectricQuantity") + @Headers({"Content-Type: application/json"}) + JSONObject getElectricQuantity(@RequestBody NhQuery params); + + @RequestLine("POST /WebApi/NH2/FrozenElectricity") + @Headers({"Content-Type: application/json"}) + JSONObject getFrozenElectricity(@RequestBody NhQuery params); + + +} diff --git a/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiRequestInterceptor.java b/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiRequestInterceptor.java new file mode 100644 index 000000000..f793bf71f --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/nhApi/NhApiRequestInterceptor.java @@ -0,0 +1,27 @@ +package com.op.open.nhApi; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +/** + * remark + * + * @author 019117 + * @date + */ +public class NhApiRequestInterceptor implements RequestInterceptor { + + private final String token; + + /** + * 构造函数 + * **/ + public NhApiRequestInterceptor(String token) { + this.token = token; + } + + @Override + public void apply(RequestTemplate template) { + template.header("API_KEY", token); + } +} \ No newline at end of file diff --git a/op-modules/op-open/src/main/java/com/op/open/nhApi/domain/NhQuery.java b/op-modules/op-open/src/main/java/com/op/open/nhApi/domain/NhQuery.java new file mode 100644 index 000000000..c0c050f6a --- /dev/null +++ b/op-modules/op-open/src/main/java/com/op/open/nhApi/domain/NhQuery.java @@ -0,0 +1,50 @@ +package com.op.open.nhApi.domain; + +/** + * remark + * + * @author 019117 + * @date + */ +public class NhQuery { + + private String dateType; + + private String startTime; + + private String endTime; + + private String valueType; + + public String getDateType() { + return dateType; + } + + public void setDateType(String dateType) { + this.dateType = dateType; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getValueType() { + return valueType; + } + + public void setValueType(String valueType) { + this.valueType = valueType; + } +} diff --git a/op-modules/op-open/src/main/java/com/op/open/service/OpenService.java b/op-modules/op-open/src/main/java/com/op/open/service/OpenService.java index 2e7647557..df54f5c33 100644 --- a/op-modules/op-open/src/main/java/com/op/open/service/OpenService.java +++ b/op-modules/op-open/src/main/java/com/op/open/service/OpenService.java @@ -1,6 +1,8 @@ package com.op.open.service; import com.op.common.core.web.domain.AjaxResult; +import com.op.open.hr.domain.HrQuery; +import com.op.open.nhApi.domain.NhQuery; import com.op.system.api.domain.device.EquEquipmentDTO; import com.op.system.api.domain.device.EquRepairOrderDTO; import com.op.system.api.domain.dto.WCSDTO; @@ -46,4 +48,15 @@ public interface OpenService { AjaxResult sendProductCheckNo(List dots); AjaxResult addEquSapInfo(EquEquipmentDTO dto); + + + AjaxResult getVoltageCurrent(NhQuery paramMap); + + AjaxResult getElectricPower(NhQuery paramMap); + + AjaxResult getElectricQuantity(NhQuery paramMap); + + AjaxResult getFrozenElectricity(NhQuery paramMap); + + AjaxResult getAttRecord(HrQuery paramMap); } diff --git a/op-modules/op-open/src/main/java/com/op/open/service/impl/OpenServiceImpl.java b/op-modules/op-open/src/main/java/com/op/open/service/impl/OpenServiceImpl.java index a483978b2..b2f16e80b 100644 --- a/op-modules/op-open/src/main/java/com/op/open/service/impl/OpenServiceImpl.java +++ b/op-modules/op-open/src/main/java/com/op/open/service/impl/OpenServiceImpl.java @@ -1,10 +1,8 @@ package com.op.open.service.impl; -import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import com.alibaba.fastjson2.JSONWriter; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.op.common.core.constant.Constants; import com.op.common.core.utils.DateUtils; @@ -18,7 +16,11 @@ import com.op.common.security.utils.SecurityUtils; import com.op.open.domain.EquEquipmentBo; import com.op.open.domain.EquRepairWorkOrderBo; +import com.op.open.hr.HrApi; +import com.op.open.hr.domain.HrQuery; import com.op.open.mapper.OpenMapper; +import com.op.open.nhApi.NhApiClient; +import com.op.open.nhApi.domain.NhQuery; import com.op.open.service.OpenService; import com.op.system.api.RemoteOpenService; import com.op.system.api.domain.SysNoticeGroup; @@ -95,8 +97,18 @@ public class OpenServiceImpl implements OpenService { @Autowired private RemoteOpenService remoteOpenService; + private final HrApi hrApi; + + @Autowired + private NhApiClient nhApiClient; + + private static Pattern p2= Pattern.compile("<[^>]+>"); + public OpenServiceImpl(HrApi hrApi) { + this.hrApi = hrApi; + } + /** * 下一工序机台集合获取 * JSON @@ -988,4 +1000,60 @@ public class OpenServiceImpl implements OpenService { return error(e.getMessage()); } } + + + /** + * 获取电表电流电压 + * **/ + @Override + public AjaxResult getVoltageCurrent(NhQuery paramMap) { + try { + JSONObject jsonObject= nhApiClient.getVoltageCurrent(paramMap);; + return AjaxResult.success(jsonObject); + } catch (Exception e) { + e.printStackTrace(); + return error(e.getMessage()); + } + } + + /** + * 获取电表功率 + * **/ + @Override + public AjaxResult getElectricPower(NhQuery paramMap) { + try { + JSONObject jsonObject= nhApiClient.getElectricPower(paramMap); + return AjaxResult.success(jsonObject); + } catch (Exception e) { + e.printStackTrace(); + return error(e.getMessage()); + } + } + + @Override + public AjaxResult getElectricQuantity(NhQuery paramMap) { + try { + JSONObject jsonObject= nhApiClient.getElectricQuantity(paramMap); + return AjaxResult.success(jsonObject); + } catch (Exception e) { + e.printStackTrace(); + return error(e.getMessage()); + } + } + + @Override + public AjaxResult getFrozenElectricity(NhQuery paramMap) { + try { + JSONObject jsonObject= nhApiClient.getFrozenElectricity(paramMap); + return AjaxResult.success(jsonObject); + } catch (Exception e) { + e.printStackTrace(); + return error(e.getMessage()); + } + } + + @Override + public AjaxResult getAttRecord(HrQuery paramMap) { + return AjaxResult.success(hrApi.getAttRecord(paramMap)); + } } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckSampleTask.java b/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckSampleTask.java index c4f290d7b..0f22e9c9c 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckSampleTask.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckSampleTask.java @@ -91,6 +91,16 @@ public class QcCheckSampleTask extends BaseEntity { @Excel(name = "第三次检验时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private String thirdCheckTime; + /** 留样人工号 **/ + @Excel(name = "留样人工号") + private String sampleUserCode; + + + /** 留样人姓名 **/ + @Excel(name = "留样人姓名") + private String sampleUserName; + + /** 订单号 **/ private String orderNo; @@ -253,4 +263,20 @@ public class QcCheckSampleTask extends BaseEntity { public void setOrderNo(String orderNo) { this.orderNo = orderNo; } + + public String getSampleUserCode() { + return sampleUserCode; + } + + public void setSampleUserCode(String sampleUserCode) { + this.sampleUserCode = sampleUserCode; + } + + public String getSampleUserName() { + return sampleUserName; + } + + public void setSampleUserName(String sampleUserName) { + this.sampleUserName = sampleUserName; + } } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java index f45b2ec76..0832f2a23 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java @@ -1193,7 +1193,7 @@ public class QcCheckTaskIncomeServiceImpl implements if (StringUtils.isNotBlank(incomeBatchNo)) { if (incomeBatchNo.length() == 24){ //国内物料去掉前面时间 - incomeBatchNo = incomeBatchNo.substring(9,24); + incomeBatchNo = incomeBatchNo.substring(8,24); } else if (incomeBatchNo.length() < 24){ //海外物料取创建时间 incomeBatchNo = DateUtils.parseDateToStr(DateUtils.YYYYMMDD,qcCheckTaskIncome.getCreateTime()); @@ -1201,8 +1201,9 @@ public class QcCheckTaskIncomeServiceImpl implements } sampleTask.setIncomeBatchNo(incomeBatchNo); - sampleTask.setOrderNo(qcCheckTaskIncome.getOrderNo()); - sampleTask.setCreateTime(qcCheckTaskIncome.getCreateTime()); + sampleTask.setWorkOrderCodeSap(qcCheckTaskIncome.getWorkorderCodeSap()); + sampleTask.setCreateTime(new Date()); + sampleTask.setOrderNo(qcCheckTaskIncome.getOrderCode()); //查询该物料是否留样 QcCheckSampleTask temp = qcCheckSampleTaskMapper.selectQcCheckSampleTask(sampleTask); //未留样则进行留样 diff --git a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckSampleTaskMapper.xml b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckSampleTaskMapper.xml index 8287c345b..caf0575d8 100644 --- a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckSampleTaskMapper.xml +++ b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckSampleTaskMapper.xml @@ -23,6 +23,8 @@ + + @@ -35,7 +37,7 @@ id, material_name, income_batch_no, - SUBSTRING ( pow.workorder_code_sap, 4, 12 ) AS work_order_code_sap, + work_order_code_sap, sample_time, sample_num, sample_address, @@ -50,9 +52,10 @@ third_check_user_code, third_check_user_name, third_check_result, - third_check_time + third_check_time, + sample_user_code, + sample_user_name from qc_check_sample_task task - left join pro_order_workorder pow ON pow.workorder_code = task.order_no and CONVERT(VARCHAR(10), task.create_time ,23) #{queryDate} @@ -67,7 +70,7 @@ and task.material_name like concat('%', #{materialName}, '%') - and SUBSTRING ( pow.workorder_code_sap, 4, 12 ) #{workOrderCodeSap} + and task.work_order_code_sap = #{workOrderCodeSap} order by task.sample_time desc,task.create_time desc @@ -166,6 +169,12 @@ third_check_time = #{thirdCheckTime}, + + sample_user_code = #{sampleUserCode}, + + + sample_user_name = #{sampleUserName}, + update_time = getDate() where id = #{id} @@ -238,6 +247,7 @@ material_name, income_batch_no, order_no, + work_order_code_sap, create_time ) VALUES @@ -246,6 +256,7 @@ #{materialName}, #{incomeBatchNo}, #{orderNo}, + #{workOrderCodeSap}, #{createTime} ) @@ -253,7 +264,7 @@ diff --git a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapItemSyncImpl.java b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapItemSyncImpl.java index 06a970a7a..6f4b867a5 100644 --- a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapItemSyncImpl.java +++ b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapItemSyncImpl.java @@ -1096,8 +1096,6 @@ public class SapItemSyncImpl implements SapItemSyncService { String bprme = new String(); // 订单价格单位(采购) String RETCODE= new String(); String MESSAGE= new String(); - String MATERIALDOCUMENT = new String(); - String MATDOCUMENTYEAR= new String(); String tem="0"; for (int i = 0; i < maraTable.getNumRows(); i++) { maraTable.setRow(i); @@ -1136,37 +1134,31 @@ public class SapItemSyncImpl implements SapItemSyncService { }else { continue; } - JCoFunction func2 = repository.getFunction("ZMES_106_MIGO");//105冲销--冲销 + JCoFunction func2 = repository.getFunction("ZMES_MBST");//105冲销--冲销 if (func2 == null) { throw new RuntimeException("Function does not exist in SAP"); } - log.info("106参数-------" + mapList.toString()); - JCoTable L_ITEM = func2.getTableParameterList().getTable("L_ITEM"); - L_ITEM.appendRow(); - L_ITEM.setValue("LFBJA",map.get("LFBJA"));//参考凭证会计年度 - L_ITEM.setValue("LFBNR",map.get("LFBNR"));//参考凭证的凭证号 - L_ITEM.setValue("LFPOS",zeile);//参考凭证项目 - L_ITEM.setValue("EBELN", ebeln);//采购订单编号 采购凭证号 - L_ITEM.setValue("EBELP",map.get("ebelp") );//采购凭证的项目编号 - L_ITEM.setValue("MATNR", matnr);//物料号 - L_ITEM.setValue("WERKS", werks);//工厂 - L_ITEM.setValue("LGORT", "0001");//库存地点 - L_ITEM.setValue("QUANTITY",menge);//数量 - System.out.println(L_ITEM); + //凭证 + func2.getImportParameterList().setValue("P_BELNR", map.get("LFBNR")); + + //会计年度 + func2.getImportParameterList().setValue("P_GJAHR", mjahr); + + //冲销日期 + func2.getImportParameterList().setValue("P_BUDAT", DateUtils.parseDateToStr("yyyyMMdd", new Date())); + func2.execute(dest);//执行调用函数 RETCODE = func2.getExportParameterList().getString("RETCODE"); - MESSAGE = func2.getExportParameterList().getString("L_MSG"); - MATERIALDOCUMENT = func2.getExportParameterList().getString("MATERIALDOCUMENT"); - MATDOCUMENTYEAR = func2.getExportParameterList().getString("MATDOCUMENTYEAR"); - log.info("106冲销结果结果-----" + RETCODE+"/" +MESSAGE+"/" +MATERIALDOCUMENT+"/" +MATDOCUMENTYEAR); + MESSAGE = func2.getExportParameterList().getString("RETMSG"); + + log.info("106冲销结果结果-----" + RETCODE+"/" +MESSAGE+"/" ); } if((Constants.FAIL).equals(Integer.parseInt(RETCODE))){ return R.fail(MESSAGE); } Map Resmap = new HashMap(); - Resmap.put("MATERIALDOCUMENT", MATERIALDOCUMENT); - Resmap.put("MATDOCUMENTYEAR", MATDOCUMENTYEAR); + Resmap.put("code106", MESSAGE); return R.ok(Resmap, MESSAGE); } else { // 表为空的处理 diff --git a/op-modules/op-wms/src/main/java/com/op/wms/controller/OdsProcureOutOrderController.java b/op-modules/op-wms/src/main/java/com/op/wms/controller/OdsProcureOutOrderController.java index 922636a65..9fc2b8f53 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/controller/OdsProcureOutOrderController.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/controller/OdsProcureOutOrderController.java @@ -198,4 +198,16 @@ public class OdsProcureOutOrderController extends BaseController { odsProcureOrderService.OutboundPostingzcSAPTH(orderList); return success(); } + + /** + * 退货过账 + * + * @param orderList + * @return + */ + @PostMapping("/batchSapTl") + public AjaxResult batchSapTl(@RequestBody List orderList) { + odsProcureOrderService.batchSapTl(orderList); + return success(); + } } diff --git a/op-modules/op-wms/src/main/java/com/op/wms/domain/BaseProduct.java b/op-modules/op-wms/src/main/java/com/op/wms/domain/BaseProduct.java index d67d5476e..aabc792ed 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/domain/BaseProduct.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/domain/BaseProduct.java @@ -361,6 +361,9 @@ public class BaseProduct extends BaseEntity { private String mvgr5; private String palletNum; private String warehouseCycle; + + + @Excel (name = "垛型" , readConverterExp = "1=垛形1-424,2=垛形2-224,3=垛形3-2222") private String packType; private String waCode; diff --git a/op-modules/op-wms/src/main/java/com/op/wms/domain/WmsRawOrderIn.java b/op-modules/op-wms/src/main/java/com/op/wms/domain/WmsRawOrderIn.java index 550a1da4f..ea726b1ea 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/domain/WmsRawOrderIn.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/domain/WmsRawOrderIn.java @@ -389,6 +389,11 @@ public class WmsRawOrderIn extends BaseEntity { * **/ private String deliveryTimeEnd; + /** + * 106冲销后,保留的105凭证 + * **/ + private String oldCode105; + public String getCheckNo() { return checkNo; } @@ -917,6 +922,14 @@ public class WmsRawOrderIn extends BaseEntity { return activeFlag; } + public String getOldCode105() { + return oldCode105; + } + + public void setOldCode105(String oldCode105) { + this.oldCode105 = oldCode105; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/op-modules/op-wms/src/main/java/com/op/wms/mapper/OdsProcureOutOrderMapper.java b/op-modules/op-wms/src/main/java/com/op/wms/mapper/OdsProcureOutOrderMapper.java index 99e512c62..e88b051b4 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/mapper/OdsProcureOutOrderMapper.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/mapper/OdsProcureOutOrderMapper.java @@ -183,4 +183,6 @@ public interface OdsProcureOutOrderMapper { String getWmsOdsProcureOutOrder(OdsProcureOutOrder order); int removeReturn(String[] IDs); + + List selectWmsOdsProcureReturnOrderByProduceCode(String order); } diff --git a/op-modules/op-wms/src/main/java/com/op/wms/service/IOdsProcureOrderService.java b/op-modules/op-wms/src/main/java/com/op/wms/service/IOdsProcureOrderService.java index 0050ecd50..37cec3ccd 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/service/IOdsProcureOrderService.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/service/IOdsProcureOrderService.java @@ -162,4 +162,6 @@ public interface IOdsProcureOrderService { List PurchaseOrderPdaT(OdsProcureOrder odsProcureOrder); List selectOrderCardTLTWO(OdsProcureOrder odsProcureOrder); + + void batchSapTl(List orderList); } diff --git a/op-modules/op-wms/src/main/java/com/op/wms/service/impl/OdsProcureOrderServiceImpl.java b/op-modules/op-wms/src/main/java/com/op/wms/service/impl/OdsProcureOrderServiceImpl.java index 544f6d8ef..5dd781995 100644 --- a/op-modules/op-wms/src/main/java/com/op/wms/service/impl/OdsProcureOrderServiceImpl.java +++ b/op-modules/op-wms/src/main/java/com/op/wms/service/impl/OdsProcureOrderServiceImpl.java @@ -1787,6 +1787,7 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { order.setUserDefined9(""); order.setUserDefined10("3");//失败 odsProcureOutOrderMapper.updateWMSOdsProcureReturnOrderByids(order, orderList2); + throw new RuntimeException("过账失败:"+msg); } } } @@ -3315,6 +3316,7 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { } /** * 105冲销 + * (实际是要106冲销) * @param odsProcureOrders * @return */ @@ -3342,8 +3344,7 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { if (result2.getCode()==200){ Map map = new HashMap(); map = (Map) result2.getData(); - String MATERIALDOCUMENT = (String) map.get("MATERIALDOCUMENT"); - String MATDOCUMENTYEAR = (String) map.get("MATDOCUMENTYEAR"); + String code106 = (String) map.get("code106"); //成功了--成功了,根据 WmsRawOrderInSn wmsRawOrderInSn=new WmsRawOrderInSn(); wmsRawOrderInSn.setUserDefined5(wmsRawOrderIn.getDnNo()); @@ -3359,8 +3360,10 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { wmsRawOrderInNewsSn.setWhCode(wmsRawOrderInSn1.getWhCode()); wmsRawOrderInNewsSn.setWlCode(wmsRawOrderInSn1.getWlCode()); wmsRawOrderInNewsSn.setUserDefined3("0"); + //更新包材库存明细,变为暂收 wmsOdsMateStorageNewsSnMapper.updateWmsOdsMateStorageNewsSnTWM(wmsRawOrderInNewsSn); wmsRawOrderInSn1.setUserDefined1("1"); + //更新收货明细状态,变为暂收 wmsRawOrderInSnMapper.updateWmsRawOrderInSn(wmsRawOrderInSn1); WmsOdsMateStorageNews wmsOdsMateStorageNews=new WmsOdsMateStorageNews(); wmsOdsMateStorageNews.setMaterialCode(wmsRawOrderInSn1.getMaterialCode()); @@ -3368,15 +3371,28 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { wmsOdsMateStorageNews.setWlCode(wmsRawOrderInSn1.getWlCode()); wmsOdsMateStorageNews.setWhCode(wmsRawOrderInSn1.getWhCode()); wmsOdsMateStorageNews.setStorageAmount(wmsRawOrderInSn1.getAmount()); + //更新库存数量 wmsOdsMateStorageNewsMapper.updateWmsOdsMateStorageNewsUpdateStorageAmountFC(wmsOdsMateStorageNews); } wmsRawOrderIn.setOrderStatus("0"); wmsRawOrderIn.setAccountingTime(new Date()); - wmsRawOrderIn.setUserDefined10(result2.getMsg()); -// wmsRawOrderIn.setUserDefined4(MATERIALDOCUMENT); -// wmsRawOrderIn.setUserDefined5(MATDOCUMENTYEAR); + //106冲销凭证 + wmsRawOrderIn.setUserDefined10(code106); + //记录旧的105凭证 + if (StringUtils.isNotEmpty(wmsRawOrderIn.getOldCode105())){ + wmsRawOrderIn.setOldCode105(wmsRawOrderIn.getOldCode105() + ',' + wmsRawOrderIn.getUserDefined4()); + }else { + wmsRawOrderIn.setOldCode105(wmsRawOrderIn.getUserDefined4()); + } + + //去除物料凭证 + wmsRawOrderIn.setUserDefined4(""); + wmsRawOrderIn.setUserDefined5(""); + //更新库存凭证 wmsRawOrderInMapper.updateWmsRawOrderIn(wmsRawOrderIn); + // + }else { //失败了 wmsRawOrderIn.setAccountingTime(new Date()); @@ -3971,6 +3987,7 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { order.setUserDefined9(""); order.setUserDefined10("3");//失败 odsProcureOutOrderMapper.updateWMSOdsProcureReturnOrderByids(order, orderList2); + throw new RuntimeException("过账失败:"+msg); } } } @@ -4033,4 +4050,17 @@ public class OdsProcureOrderServiceImpl implements IOdsProcureOrderService { return null; } + + /** + * params 退料单号 + * **/ + @Override + @DS("#header.poolName") + public void batchSapTl(List orderList) { + //根据退料单查询出对应的物料 + for (String order : orderList){ + List orderList1 = odsProcureOutOrderMapper.selectWmsOdsProcureReturnOrderByProduceCode(order); + OutboundPostingzcSAPTH(orderList1); + } + } } diff --git a/op-modules/op-wms/src/main/resources/mapper/wms/OdsProcureOutOrderMapper.xml b/op-modules/op-wms/src/main/resources/mapper/wms/OdsProcureOutOrderMapper.xml index 323bc8a7c..c00adf109 100644 --- a/op-modules/op-wms/src/main/resources/mapper/wms/OdsProcureOutOrderMapper.xml +++ b/op-modules/op-wms/src/main/resources/mapper/wms/OdsProcureOutOrderMapper.xml @@ -2129,4 +2129,16 @@ #{ID} + + diff --git a/op-modules/op-wms/src/main/resources/mapper/wms/WmsRawOrderInMapper.xml b/op-modules/op-wms/src/main/resources/mapper/wms/WmsRawOrderInMapper.xml index 9b22b29a1..1e55585bf 100644 --- a/op-modules/op-wms/src/main/resources/mapper/wms/WmsRawOrderInMapper.xml +++ b/op-modules/op-wms/src/main/resources/mapper/wms/WmsRawOrderInMapper.xml @@ -68,6 +68,7 @@ + @@ -322,7 +323,8 @@ wms_raw_order_in.gmt_modified, wms_raw_order_in_sn.user_defined2 incomeBatchNo, ods_procure_order.ID kem, - wms_raw_order_in.active_flag + wms_raw_order_in.active_flag, + wms_raw_order_in.old_code105 FROM wms_raw_order_in LEFT JOIN wms_raw_order_in_sn ON wms_raw_order_in.dn_no=wms_raw_order_in_sn.user_defined5 AND wms_raw_order_in_sn.po_no=wms_raw_order_in.po_no @@ -497,6 +499,7 @@ last_modified_by = #{lastModifiedBy}, gmt_modified = #{gmtModified}, active_flag = #{activeFlag}, + old_code105 = #{oldCode105}, where raw_order_in_id = #{rawOrderInId}