22 changed files with 2312 additions and 9 deletions
@ -0,0 +1,67 @@ |
|||
package org.nl.acs.enums; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Getter; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.nl.acs.utils.MapOf; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* acs状态枚举 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-31 |
|||
*/ |
|||
@AllArgsConstructor |
|||
@Getter |
|||
public enum AcsDefineEnum { |
|||
|
|||
//agv状态 1-关机2-运行中3-交通管制4-任务等待5-充电中6-故障中7-低电量
|
|||
AGV_STATUS(MapOf.of("关机", "1", "运行中", "2", "交通管制", "3", "任务等待", "4", "充电中", "5", "故障中", "6", "低电量", "7")), |
|||
|
|||
//RGV状态 1-空闲 2-工作中 3-手动 4-下线
|
|||
RGV_STATUS(MapOf.of("1","IDLE","2","WORK","3","UNAVAIL","4","OFFLINE")), |
|||
|
|||
//载具类型
|
|||
VEHICLE_TYPE(MapOf.of("普涂", "1", "连涂", "2")), |
|||
|
|||
//是否
|
|||
IS_USED(MapOf.of("启用", "1", "未启用", "0")); |
|||
|
|||
|
|||
private Map<String, String> code; |
|||
|
|||
public String code(String desc) { |
|||
String code = this.getCode().get(desc); |
|||
if (StringUtils.isNotEmpty(code)) { |
|||
return code; |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + desc + "未定义"); |
|||
} |
|||
|
|||
public Long longCode(String desc) { |
|||
String code = this.getCode().get(desc); |
|||
if (StringUtils.isNotEmpty(code)) { |
|||
return Long.valueOf(code); |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + desc + "未定义"); |
|||
} |
|||
|
|||
public String check(String code) { |
|||
for (Map.Entry<String, String> entry : this.getCode().entrySet()) { |
|||
if (entry.getValue().equals(code)) { |
|||
return entry.getValue(); |
|||
} |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + code + "未定义"); |
|||
} |
|||
|
|||
public String check1(String code) { |
|||
for (Map.Entry<String, String> entry : this.getCode().entrySet()) { |
|||
if (entry.getValue().equals(code)) { |
|||
return entry.getKey(); |
|||
} |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + code + "未定义"); |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
package org.nl.acs.utils; |
|||
|
|||
|
|||
import java.io.Serializable; |
|||
import java.util.HashMap; |
|||
|
|||
/* |
|||
* @author ZZQ |
|||
* @Date 2022/11/29 2:55 下午 |
|||
*/ |
|||
public class MapOf implements Serializable { |
|||
|
|||
public static <K> HashMap of(K... key) { |
|||
HashMap map = new HashMap<>(); |
|||
for (int i = 0; i < (key.length & ~1); i = i + 2) { |
|||
map.put(key[i], key[i + 1]); |
|||
} |
|||
return map; |
|||
} |
|||
} |
@ -0,0 +1,289 @@ |
|||
package org.nl.quartz.task; |
|||
|
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.nl.acs.agv.server.ZheDaAgvService; |
|||
import org.nl.acs.device.domain.Device; |
|||
import org.nl.acs.device_driver.basedriver.cw_site.CwSiteDeviceDriver; |
|||
import org.nl.acs.device_driver.basedriver.standard_autodoor.StandardAutodoorDeviceDriver; |
|||
import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; |
|||
import org.nl.acs.instruction.service.InstructionService; |
|||
import org.nl.acs.opc.DeviceAppService; |
|||
import org.nl.common.utils.RedisUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.text.DecimalFormat; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 自动同步设备状态 |
|||
*/ |
|||
@Slf4j |
|||
@Component |
|||
public class SyncDeviceStatus { |
|||
|
|||
|
|||
@Autowired |
|||
ZheDaAgvService agvService; |
|||
|
|||
@Autowired |
|||
private RedisUtils redisUtils; |
|||
|
|||
@Resource |
|||
private DeviceAppService deviceAppService; |
|||
|
|||
@Resource |
|||
private InstructionService instructionService; |
|||
|
|||
public void run() throws Exception { |
|||
device(); |
|||
} |
|||
|
|||
|
|||
private void device() { |
|||
long startTime = System.currentTimeMillis(); |
|||
try { |
|||
//总数
|
|||
Integer a1_count = 0; |
|||
//正常运行
|
|||
Long a1_item1 = 0L; |
|||
//暂未生产
|
|||
Long a1_item2 = 0L; |
|||
//空闲设备
|
|||
Long a1_item3 = 0L; |
|||
//故障设备
|
|||
Long a1_item4 = 0L; |
|||
Integer a2_count = 0; |
|||
Long a2_item1 = 0L; |
|||
Long a2_item2 = 0L; |
|||
Long a2_item3 = 0L; |
|||
Long a2_item4 = 0L; |
|||
JSONArray tbxList1 = new JSONArray(); |
|||
JSONArray tbxList2 = new JSONArray(); |
|||
JSONArray ghsList1 = new JSONArray(); |
|||
JSONArray ghsList2 = new JSONArray(); |
|||
List<JSONObject> siteList = new ArrayList<>(); |
|||
//JSONArray agvList = new JSONArray();
|
|||
log.info("自动线程开始查询agv设备状态"); |
|||
List<Device> deviceList = deviceAppService.findAllDevice(); |
|||
for (Device device : deviceList) { |
|||
if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { |
|||
if (StringUtils.isNotBlank(device.getOpc_server_id())) { |
|||
StandardInspectSiteDeviceDriver tbx = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); |
|||
JSONObject json = new JSONObject(); |
|||
json.put("device_code", tbx.getDeviceCode()); |
|||
if (tbx.getError() == 0) { |
|||
//0:脱机,1:故障,2:待机,3:运行中
|
|||
//0:无货,3:有货
|
|||
getDeviceMode(tbx.getMode(), json); |
|||
} else { |
|||
json.put("mode", "1"); |
|||
} |
|||
//区分车间
|
|||
if (tbx.getDeviceCode().replaceAll("[^0-9]", "").startsWith("0")) { |
|||
json.put("workshop_code", "A1"); |
|||
tbxList1.add(json); |
|||
} else { |
|||
json.put("workshop_code", "A2"); |
|||
tbxList2.add(json); |
|||
} |
|||
} |
|||
} else if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { |
|||
if (StringUtils.isNotBlank(device.getOpc_server_id())) { |
|||
StandardAutodoorDeviceDriver ghs = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); |
|||
JSONObject json = new JSONObject(); |
|||
json.put("device_code", ghs.getDeviceCode()); |
|||
if (ghs.getError() == 0) { |
|||
//0:脱机,1:故障,2:待机,3:运行中
|
|||
getDeviceMode(ghs.getMode(), json); |
|||
//json.put("mode", ghs.getMode() == 0 ? "0" : "3");
|
|||
} else { |
|||
json.put("mode", "1"); |
|||
} |
|||
if (Integer.parseInt(ghs.getDeviceCode().replaceAll("[^0-9]", "")) < 11) { |
|||
json.put("workshop_code", "A1"); |
|||
ghsList1.add(json); |
|||
} else { |
|||
json.put("workshop_code", "A2"); |
|||
ghsList2.add(json); |
|||
} |
|||
} |
|||
} else if (device.getDeviceDriver() instanceof CwSiteDeviceDriver) { |
|||
if (StringUtils.isNotBlank(device.getOpc_server_id())) { |
|||
CwSiteDeviceDriver site = (CwSiteDeviceDriver) device.getDeviceDriver(); |
|||
JSONObject json = new JSONObject(); |
|||
json.put("device_code", site.getDeviceCode()); |
|||
json.put("workshop_code", "A1"); |
|||
if (site.getError() == 0) { |
|||
//0:脱机,1:故障,2:待机,3:运行中
|
|||
getDeviceMode(site.getMode(), json); |
|||
//json.put("mode", site.getMode() == 0 ? "0" : "3");
|
|||
} else { |
|||
json.put("mode", "1"); |
|||
} |
|||
siteList.add(json); |
|||
} |
|||
} |
|||
// else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) {
|
|||
// AgvNdcOneDeviceDriver agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver();
|
|||
// JSONObject json = new JSONObject();
|
|||
// json.put("device_code", device.getDevice_code());
|
|||
// json.put("device_name", device.getDevice_name());
|
|||
// json.put("device_status", agvNdcOneDeviceDriver.getStatus());
|
|||
// json.put("energyLevel", agvNdcOneDeviceDriver.getElectric_qty());
|
|||
// json.put("positionX", agvNdcOneDeviceDriver.getX());
|
|||
// json.put("positionY", agvNdcOneDeviceDriver.getY());
|
|||
// json.put("positionAngle", agvNdcOneDeviceDriver.getAngle());
|
|||
// agvList.add(json);
|
|||
// }
|
|||
} |
|||
List<JSONObject> bpList = siteList.stream() |
|||
.filter(r -> r.getString("device_code").contains("BP")) |
|||
.collect(Collectors.toList()); |
|||
redisUtils.set("tbxList1", tbxList1); |
|||
redisUtils.set("tbxList2", tbxList2); |
|||
redisUtils.set("ghsList1", ghsList1); |
|||
redisUtils.set("ghsList2", ghsList2); |
|||
redisUtils.set("bpjList", bpList); |
|||
tbxList1.addAll(ghsList1); |
|||
tbxList1.addAll(bpList); |
|||
JSONArray a1 = new JSONArray(); |
|||
JSONArray a2 = new JSONArray(); |
|||
getDeviceCountAndPercentage(tbxList1, a1); |
|||
tbxList2.addAll(ghsList2); |
|||
getDeviceCountAndPercentage(tbxList2, a2); |
|||
redisUtils.set("deviceA1", a1); |
|||
redisUtils.set("deviceA2", a2); |
|||
//正极板缓存区出库对接位,正极板空架回收对接位
|
|||
List<JSONObject> zjbKjHswList = siteList.stream() |
|||
.filter(r -> r.getString("device_code").contains("ZJBHCQCKDJW") || r.getString("device_code").contains("ZJBKJHSDJW")) |
|||
.collect(Collectors.toList()); |
|||
redisUtils.set("zjbKjHswList", zjbKjHswList); |
|||
//负极板空架对接位
|
|||
List<JSONObject> fjbKjDjwList = siteList.stream() |
|||
.filter(r -> r.getString("device_code").contains("FJBKJDJW")) |
|||
.collect(Collectors.toList()); |
|||
redisUtils.set("fjbKjDjwList", fjbKjDjwList); |
|||
//正极板对接位
|
|||
List<JSONObject> zjbDjwList = siteList.stream() |
|||
.filter(r -> r.getString("device_code").contains("ZJBDJW")) |
|||
.collect(Collectors.toList()); |
|||
redisUtils.set("zjbDjwList", zjbDjwList); |
|||
// if (ObjectUtil.isNotEmpty(agv)) {
|
|||
// List<String> deviceCodes = agv.stream()
|
|||
// .map(r -> {
|
|||
// String deviceCode = ((JSONObject) r).getString("device_code");
|
|||
// if (StringUtils.isNotBlank(deviceCode)) {
|
|||
// return deviceCode.substring(deviceCode.length() - 1);
|
|||
// } else {
|
|||
// return null;
|
|||
// }
|
|||
// })
|
|||
// .filter(Objects::nonNull)
|
|||
// .collect(Collectors.toList());
|
|||
// if (ObjectUtil.isNotEmpty(deviceCodes)) {
|
|||
// List<InstructionMybatis> instructionList = instructionService.list(new LambdaQueryWrapper<InstructionMybatis>().in(InstructionMybatis::getCarno, deviceCodes).lt(InstructionMybatis::getInstruction_status, 2).eq(InstructionMybatis::getIs_delete, 0));
|
|||
// if (ObjectUtil.isNotEmpty(instructionList)) {
|
|||
// Map<String, String> taskCodeToTaskIdMap = instructionList.stream()
|
|||
// .filter(instruction -> StringUtils.isNotBlank(instruction.getExt_task_id()))
|
|||
// .collect(Collectors.toMap(
|
|||
// InstructionMybatis::getInstruction_code,
|
|||
// InstructionMybatis::getExt_task_id
|
|||
// ));
|
|||
// agv.forEach(r -> {
|
|||
// JSONObject Item = (JSONObject) r;
|
|||
// String taskId = taskCodeToTaskIdMap.get(Item.getString("task_code"));
|
|||
// Item.put("task_id", "");
|
|||
// if (StringUtils.isNotBlank(taskId)) {
|
|||
// Item.put("task_id", taskId);
|
|||
// }
|
|||
// });
|
|||
// }
|
|||
// }
|
|||
//
|
|||
// }
|
|||
//redisUtils.set("agvList", agvList);
|
|||
log.trace("自动上报驱动状态,完毕耗时{}", System.currentTimeMillis() - startTime); |
|||
} catch (Exception e) { |
|||
//log.error("自动线程开始查询AGV设备,自动上报驱动状态失败{}{}", e, e.getMessage());
|
|||
} |
|||
} |
|||
|
|||
private static void getDeviceCountAndPercentage(JSONArray deviceList, JSONArray result) { |
|||
Integer a1_count; |
|||
Long a1_item3; |
|||
Long a1_item1; |
|||
Long a1_item2; |
|||
Long a1_item4; |
|||
//0:脱机,1:故障,2:待机,3:运行中
|
|||
a1_count = deviceList.size(); |
|||
JSONObject item1 = new JSONObject(); |
|||
item1.put("count", a1_count); |
|||
result.add(item1); |
|||
a1_item1 = deviceList.stream() |
|||
.map(JSONObject.class::cast) |
|||
.filter(r -> "3".equals(r.getString("mode"))) |
|||
.count(); |
|||
JSONObject item2 = new JSONObject(); |
|||
item2.put("count", a1_item1.toString()); |
|||
item2.put("name", "正常运行"); |
|||
// 计算百分比
|
|||
double a1Item1Percentage = (double) a1_item1 / a1_count * 100; |
|||
String a1Item1Percentages = new DecimalFormat("0.00").format(a1Item1Percentage) + "%"; |
|||
item2.put("percent", a1Item1Percentages); |
|||
result.add(item2); |
|||
a1_item2 = deviceList.stream() |
|||
.map(JSONObject.class::cast) |
|||
.filter(r -> "2".equals(r.getString("mode"))) |
|||
.count(); |
|||
JSONObject item3 = new JSONObject(); |
|||
item3.put("count", a1_item2.toString()); |
|||
item3.put("name", "暂未生产"); |
|||
// 计算百分比
|
|||
double a1Item2Percentage = (double) a1_item2 / a1_count * 100; |
|||
String a1Item2Percentages = new DecimalFormat("0.00").format(a1Item2Percentage) + "%"; |
|||
item3.put("percent", a1Item2Percentages); |
|||
result.add(item3); |
|||
a1_item3 = deviceList.stream() |
|||
.map(JSONObject.class::cast) |
|||
.filter(r -> "0".equals(r.getString("mode"))) |
|||
.count(); |
|||
JSONObject item4 = new JSONObject(); |
|||
item4.put("count", a1_item3.toString()); |
|||
item4.put("name", "空闲设备"); |
|||
// 计算百分比
|
|||
double a1Item3Percentage = (double) a1_item3 / a1_count * 100; |
|||
String a1Item3Percentages = new DecimalFormat("0.00").format(a1Item3Percentage) + "%"; |
|||
item4.put("percent", a1Item3Percentages); |
|||
result.add(item4); |
|||
a1_item4 = deviceList.stream() |
|||
.map(JSONObject.class::cast) |
|||
.filter(r -> "1".equals(r.getString("mode"))) |
|||
.count(); |
|||
JSONObject item5 = new JSONObject(); |
|||
item5.put("count", a1_item4.toString()); |
|||
item5.put("name", "故障设备"); |
|||
// 计算百分比
|
|||
double a1Item4Percentage = (double) a1_item4 / a1_count * 100; |
|||
String a1Item4Percentages = new DecimalFormat("0.00").format(a1Item4Percentage) + "%"; |
|||
item5.put("percent", a1Item4Percentages); |
|||
result.add(item5); |
|||
} |
|||
|
|||
private static void getDeviceMode(Integer mode, JSONObject json) { |
|||
if (mode == 0) { |
|||
json.put("mode", "0"); |
|||
} else if (mode == 2) { |
|||
json.put("mode", "2"); |
|||
} else { |
|||
json.put("mode", "3"); |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package org.nl.common.base; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 异常信息 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-04 |
|||
*/ |
|||
@Data |
|||
public class ErrorData { |
|||
private String error_info; |
|||
} |
@ -0,0 +1,67 @@ |
|||
package org.nl.wms.cockpit; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Getter; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.nl.config.MapOf; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* acs状态枚举 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-31 |
|||
*/ |
|||
@AllArgsConstructor |
|||
@Getter |
|||
public enum AcsDefineEnum { |
|||
|
|||
//agv状态 1-关机2-运行中3-交通管制4-任务等待5-充电中6-故障中7-低电量
|
|||
AGV_STATUS(MapOf.of("关机", "1", "运行中", "2", "交通管制", "3", "任务等待", "4", "充电中", "5", "故障中", "6", "低电量", "7")), |
|||
|
|||
//RGV状态 1-空闲 2-工作中 3-手动 4-下线
|
|||
RGV_STATUS(MapOf.of("1","IDLE","2","WORK","3","UNAVAIL","4","OFFLINE")), |
|||
|
|||
//载具类型
|
|||
VEHICLE_TYPE(MapOf.of("普涂", "1", "连涂", "2")), |
|||
|
|||
//是否
|
|||
IS_USED(MapOf.of("启用", "1", "未启用", "0")); |
|||
|
|||
|
|||
private Map<String, String> code; |
|||
|
|||
public String code(String desc) { |
|||
String code = this.getCode().get(desc); |
|||
if (StringUtils.isNotEmpty(code)) { |
|||
return code; |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + desc + "未定义"); |
|||
} |
|||
|
|||
public Long longCode(String desc) { |
|||
String code = this.getCode().get(desc); |
|||
if (StringUtils.isNotEmpty(code)) { |
|||
return Long.valueOf(code); |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + desc + "未定义"); |
|||
} |
|||
|
|||
public String check(String code) { |
|||
for (Map.Entry<String, String> entry : this.getCode().entrySet()) { |
|||
if (entry.getValue().equals(code)) { |
|||
return entry.getValue(); |
|||
} |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + code + "未定义"); |
|||
} |
|||
|
|||
public String check1(String code) { |
|||
for (Map.Entry<String, String> entry : this.getCode().entrySet()) { |
|||
if (entry.getValue().equals(code)) { |
|||
return entry.getKey(); |
|||
} |
|||
} |
|||
throw new RuntimeException(this.name() + "对应类型" + code + "未定义"); |
|||
} |
|||
} |
@ -0,0 +1,52 @@ |
|||
package org.nl.wms.cockpit.controller; |
|||
|
|||
import cn.dev33.satoken.annotation.SaIgnore; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import io.swagger.annotations.Api; |
|||
import io.swagger.annotations.ApiOperation; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.common.logging.annotation.Log; |
|||
import org.nl.wms.cockpit.service.CockpitService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.http.HttpStatus; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @Author: gbx |
|||
* @Description: 天能数字孪生接口 |
|||
* @Date: 2024/10/18 |
|||
*/ |
|||
@RestController |
|||
@Api(tags = "数字孪生") |
|||
@RequestMapping("/api/chaoWei") |
|||
@Slf4j |
|||
@SaIgnore |
|||
public class CockpitController { |
|||
|
|||
@Autowired |
|||
private CockpitService cockpitService; |
|||
|
|||
|
|||
@PostMapping("/allDeviceStatus") |
|||
@Log("秒级接口") |
|||
@ApiOperation("秒级接口") |
|||
public ResponseEntity<Object> allDeviceStatus() { |
|||
return new ResponseEntity<>(cockpitService.allDeviceStatus(), HttpStatus.OK); |
|||
} |
|||
|
|||
|
|||
|
|||
@PostMapping("/getHomeInfo") |
|||
@Log("获取首页总览信息") |
|||
@ApiOperation("获取首页总览信息") |
|||
public ResponseEntity<Object> getHomeInfo() { |
|||
return new ResponseEntity<>(cockpitService.getHomeInfo(), HttpStatus.OK); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
} |
@ -0,0 +1,24 @@ |
|||
package org.nl.wms.cockpit.service; |
|||
|
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
|
|||
/** |
|||
* @Author: gbx |
|||
* @Description: |
|||
* @Date: 2024/10/18 |
|||
*/ |
|||
public interface CockpitService { |
|||
|
|||
|
|||
JSONObject allDeviceStatus(); |
|||
|
|||
|
|||
HashMap<String, Object> getHomeInfo(); |
|||
|
|||
|
|||
|
|||
} |
@ -0,0 +1,36 @@ |
|||
package org.nl.wms.cockpit.service.dao; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.IdType; |
|||
import com.baomidou.mybatisplus.annotation.TableId; |
|||
import com.baomidou.mybatisplus.annotation.TableName; |
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* 设备故障表 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-12 |
|||
*/ |
|||
|
|||
|
|||
@Data |
|||
@TableName("das_device_fault") |
|||
public class DasDeviceFault implements Serializable { |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
@TableId(value = "data_id", type = IdType.NONE) |
|||
private String data_id; |
|||
|
|||
private String region_code; |
|||
|
|||
private String device_code; |
|||
|
|||
private String failure_time; |
|||
|
|||
private String failure_info; |
|||
|
|||
private String current_status; |
|||
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package org.nl.wms.cockpit.service.dao; |
|||
|
|||
import lombok.Data; |
|||
import org.nl.common.base.ErrorData; |
|||
|
|||
/** |
|||
* @author gbx |
|||
* @since 2024-01-08 |
|||
*/ |
|||
@Data |
|||
public class DayData extends ErrorData { |
|||
private String item_name; |
|||
private String item_qty; |
|||
} |
@ -0,0 +1,21 @@ |
|||
package org.nl.wms.cockpit.service.dao; |
|||
|
|||
import io.swagger.models.auth.In; |
|||
import lombok.Builder; |
|||
import lombok.Data; |
|||
import org.nl.common.base.ErrorData; |
|||
|
|||
/** |
|||
* 点位 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-11 |
|||
*/ |
|||
@Data |
|||
public class PointInfo { |
|||
private String device_code; |
|||
private String workshop_code; |
|||
private String region_code; |
|||
private Integer move; |
|||
private Integer row_num; |
|||
} |
@ -0,0 +1,40 @@ |
|||
package org.nl.wms.cockpit.service.dao; |
|||
|
|||
import lombok.Data; |
|||
import org.nl.common.base.ErrorData; |
|||
|
|||
import java.math.BigDecimal; |
|||
|
|||
/** |
|||
* 生产目标 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-07 |
|||
*/ |
|||
|
|||
@Data |
|||
public class TargetAchievement extends ErrorData { |
|||
//接口文档待修改
|
|||
private BigDecimal expected_production = BigDecimal.valueOf(0); |
|||
private BigDecimal actual_production= BigDecimal.valueOf(0);; |
|||
private Integer percentage =0; |
|||
private String await_curing = "1"; |
|||
private String curing = "1"; |
|||
private String complete = "1"; |
|||
private String material_name = "1"; |
|||
private String vehicle_type = "1"; |
|||
private String create_time = "1"; |
|||
private TbxTargetAchievement tbxTargetAchievement; |
|||
|
|||
@Data |
|||
public static class TbxTargetAchievement extends ErrorData { |
|||
//接口文档待修改
|
|||
private TargetAchievement lt_production; |
|||
private TargetAchievement pt_production; |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
@ -0,0 +1,27 @@ |
|||
package org.nl.wms.cockpit.service.dao; |
|||
|
|||
import lombok.Data; |
|||
import org.nl.common.base.ErrorData; |
|||
|
|||
/** |
|||
* 任务 |
|||
* |
|||
* @author gbx |
|||
* @since 2024-01-11 |
|||
*/ |
|||
@Data |
|||
public class TaskInfo extends ErrorData { |
|||
private String car_no; |
|||
private String point_code; |
|||
private String point_code1; |
|||
private String point_code2; |
|||
private String material_name; |
|||
private String material_spec; |
|||
private String qty; |
|||
private String type; |
|||
private Integer task_status; |
|||
private String material_qty; |
|||
private String vehicle_type; |
|||
private String vehicle_code; |
|||
private String task_type; |
|||
} |
@ -0,0 +1,638 @@ |
|||
package org.nl.wms.cockpit.service.impl; |
|||
|
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.nl.common.utils.RedisUtils; |
|||
import org.nl.wms.cockpit.service.CockpitService; |
|||
import org.nl.wms.cockpit.service.dao.PointInfo; |
|||
import org.nl.wms.cockpit.service.dao.TaskInfo; |
|||
import org.nl.wms.cockpit.service.mapper.CockpitMapper; |
|||
import org.nl.wms.sch.point.service.dao.SchBasePoint; |
|||
import org.nl.wms.sch.point.service.impl.SchBasePointServiceImpl; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Qualifier; |
|||
import org.springframework.scheduling.annotation.EnableScheduling; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.math.BigDecimal; |
|||
import java.time.LocalDate; |
|||
import java.time.format.DateTimeFormatter; |
|||
import java.util.*; |
|||
import java.util.concurrent.CompletableFuture; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
import java.util.concurrent.atomic.AtomicReference; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* @Author: gbx |
|||
* @Description: |
|||
* @Date: 2024/10/18 |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
@EnableScheduling |
|||
public class CockpitServiceImpl implements CockpitService { |
|||
|
|||
@Autowired |
|||
private CockpitMapper cockpitMapper; |
|||
|
|||
@Autowired |
|||
@Qualifier("threadPoolExecutor") |
|||
private ThreadPoolExecutor pool; |
|||
|
|||
|
|||
@Resource |
|||
private SchBasePointServiceImpl schBasePoint; |
|||
|
|||
@Autowired |
|||
private RedisUtils redisUtils; |
|||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); |
|||
LocalDate today = LocalDate.now(); |
|||
|
|||
/** |
|||
* 总览 |
|||
*/ |
|||
@Override |
|||
public HashMap<String, Object> getHomeInfo() { |
|||
HashMap<String, Object> getHomeInfo = new HashMap<>(); |
|||
//设备运行状态
|
|||
JSONObject device_status = new JSONObject(); |
|||
//库存结构
|
|||
JSONObject zc_storage_info = new JSONObject(); |
|||
//状态信息
|
|||
CompletableFuture<JSONObject> task1 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.statusInfo(); |
|||
device_status.put("status_info", result); |
|||
return null; |
|||
}, pool); |
|||
task1.exceptionally((e) -> { |
|||
log.error("状态信息: {}", e.getMessage(), e); |
|||
device_status.put("status_info", null); |
|||
return null; |
|||
}); |
|||
//固化架信息
|
|||
CompletableFuture<JSONObject> task2 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.storageInfo(); |
|||
device_status.put("storage_info", result); |
|||
return null; |
|||
}, pool); |
|||
task2.exceptionally((e) -> { |
|||
log.error("固化架信息: {}", e.getMessage(), e); |
|||
device_status.put("storage_info", null); |
|||
return null; |
|||
}); |
|||
//暂存库库存结构
|
|||
CompletableFuture<JSONObject> task3 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.getZcMaterialmsg(); |
|||
zc_storage_info.put("material_info", result); |
|||
return null; |
|||
}, pool); |
|||
task3.exceptionally((e) -> { |
|||
log.error("暂存库库存结构: {}", e.getMessage(), e); |
|||
zc_storage_info.put("material_info", null); |
|||
return null; |
|||
}); |
|||
//库位使用占比
|
|||
CompletableFuture<JSONObject> task4 = CompletableFuture.supplyAsync(() -> { |
|||
String result = cockpitMapper.percent(); |
|||
zc_storage_info.put("percent", result); |
|||
return null; |
|||
}, pool); |
|||
task4.exceptionally((e) -> { |
|||
log.error("库位使用占比: {}", e.getMessage(), e); |
|||
getHomeInfo.put("percent", null); |
|||
return null; |
|||
}); |
|||
//生产任务目标达成
|
|||
CompletableFuture<JSONObject> task5 = CompletableFuture.supplyAsync(() -> { |
|||
JSONObject result = cockpitMapper.getProductTarget(); |
|||
getHomeInfo.put("target_achievement", result); |
|||
return null; |
|||
}, pool); |
|||
task5.exceptionally((e) -> { |
|||
log.error("获取生产任务目标达成: {}", e.getMessage(), e); |
|||
getHomeInfo.put("target_achievement", null); |
|||
return null; |
|||
}); |
|||
//生产汇总
|
|||
CompletableFuture<JSONObject> task6 = CompletableFuture.supplyAsync(() -> { |
|||
JSONObject result = cockpitMapper.getProductionsummary(); |
|||
List<Map<String, Object>> productionSummaryList = new ArrayList<>(); |
|||
for (String itemName : Arrays.asList("1", "2", "3")) { |
|||
Map<String, Object> item = new HashMap<>(); |
|||
item.put("item_name", itemName); |
|||
item.put("item_qty", "0"); |
|||
productionSummaryList.add(item); |
|||
} |
|||
if (ObjectUtil.isNotEmpty(result)) { |
|||
productionSummaryList.forEach(item -> { |
|||
String key = item.get("item_name").toString().toLowerCase(); |
|||
if (ObjectUtil.isNotEmpty(result.get(key))) { |
|||
item.put("item_qty", result.get(key).toString()); |
|||
} |
|||
}); |
|||
} |
|||
getHomeInfo.put("production_summary", productionSummaryList); |
|||
return null; |
|||
}, pool); |
|||
task6.exceptionally((e) -> { |
|||
log.error("生产汇总: {}", e.getMessage(), e); |
|||
getHomeInfo.put("production_summary", null); |
|||
return null; |
|||
}); |
|||
//今日生产任务
|
|||
CompletableFuture<List<Map<String, Object>>> task7 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.getTdWorkmsg(); |
|||
// List<Map<String, Object>> today_work = new ArrayList<>();
|
|||
// if (ObjectUtil.isEmpty(result)) {
|
|||
// //测试数据,上线后删除
|
|||
// Map<String, Object> item1 = new HashMap<>();
|
|||
// item1.put("workorder_code", "240918001");
|
|||
// item1.put("material_name", "TS_12Z中负");
|
|||
// item1.put("plan_qty", "100");
|
|||
// item1.put("real_qty", "0");
|
|||
// item1.put("point_name", "普涂线01");
|
|||
// item1.put("device_code", "LTX01");
|
|||
// item1.put("workorder_status", "生产中");
|
|||
// today_work.add(item1);
|
|||
// }
|
|||
getHomeInfo.put("today_work", result); |
|||
return null; |
|||
}, pool); |
|||
task7.exceptionally((e) -> { |
|||
log.error("今日生产任务: {}", e.getMessage(), e); |
|||
getHomeInfo.put("today_work", null); |
|||
return null; |
|||
}); |
|||
//固化一周生产
|
|||
CompletableFuture<List<Map<String, Object>>> task8 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.getGhsQty("7"); |
|||
List<Map<String, Object>> gh_real_qty_default = new ArrayList<>(); |
|||
getWeekWorkStatistics(result, gh_real_qty_default, "GHS", 7); |
|||
getHomeInfo.put("ghs_produce", gh_real_qty_default); |
|||
return null; |
|||
}, pool); |
|||
task8.exceptionally((e) -> { |
|||
log.error("固化一周生产: {}", e.getMessage(), e); |
|||
getHomeInfo.put("ghs_produce", null); |
|||
return null; |
|||
}); |
|||
//涂板一周生产
|
|||
CompletableFuture<List<Map<String, Object>>> task9 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.getTxQty("7", "TBX"); |
|||
List<Map<String, Object>> tb_real_qty_default = new ArrayList<>(); |
|||
getWeekWorkStatistics(result, tb_real_qty_default, "TBX", 7); |
|||
getHomeInfo.put("tbx_produce", tb_real_qty_default); |
|||
return null; |
|||
}, pool); |
|||
task9.exceptionally((e) -> { |
|||
log.error("涂板一周生产: {}", e.getMessage(), e); |
|||
getHomeInfo.put("tbx_produce", null); |
|||
return null; |
|||
}); |
|||
//实时故障告警
|
|||
CompletableFuture<List<Map<String, Object>>> task10 = CompletableFuture.supplyAsync(() -> { |
|||
List<Map<String, Object>> result = cockpitMapper.faultAlarm(); |
|||
//测试数据,上线后删除
|
|||
//faultAlarmDefault(result, "GHS01");
|
|||
getHomeInfo.put("fault_alarm", result); |
|||
return null; |
|||
}, pool); |
|||
task10.exceptionally((e) -> { |
|||
log.error("实时故障告警: {}", e.getMessage(), e); |
|||
getHomeInfo.put("fault_alarm", null); |
|||
return null; |
|||
}); |
|||
//近30日故障统计
|
|||
CompletableFuture<JSONArray> task11 = CompletableFuture.supplyAsync(() -> { |
|||
JSONArray result = cockpitMapper.monthlyFaultStatistics(); |
|||
getHomeInfo.put("monthly_fault_statistics", result); |
|||
return null; |
|||
}, pool); |
|||
task11.exceptionally((e) -> { |
|||
log.error("近30日故障统计: {}", e.getMessage(), e); |
|||
getHomeInfo.put("monthly_fault_statistics", null); |
|||
return null; |
|||
}); |
|||
//设备报警前十
|
|||
CompletableFuture<List<Map<String, Object>>> task12 = CompletableFuture.supplyAsync(() -> cockpitMapper.ghStatistics(), pool); |
|||
task12.thenAccept((result) -> { |
|||
getHomeInfo.put("gh_statistics", result); |
|||
}).exceptionally((e) -> { |
|||
log.error("设备报警前十: {}", e.getMessage(), e); |
|||
getHomeInfo.put("gh_statistics", null); |
|||
return null; |
|||
}); |
|||
CompletableFuture<Void> allQuery = CompletableFuture.allOf(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12); |
|||
CompletableFuture<HashMap<String, Object>> future = allQuery.thenApply((result) -> getHomeInfo).exceptionally((e) -> { |
|||
log.error(e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
future.join(); |
|||
getHomeInfo.put("device_status", device_status); |
|||
getHomeInfo.put("zc_storage_info", zc_storage_info); |
|||
return getHomeInfo; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 秒级接口 |
|||
*/ |
|||
@Override |
|||
public JSONObject allDeviceStatus() { |
|||
JSONObject jsonObject = new JSONObject(); |
|||
//涂板线
|
|||
CompletableFuture<List<Map<String, Object>>> task1 = CompletableFuture.supplyAsync(() -> { |
|||
// todo 初始化点位所在排信息
|
|||
// List<SchBasePoint> list = schBasePoint.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getIs_used, 1));
|
|||
// List<SchBasePoint> list1 = list.stream().filter(r -> "HCQ1".equals(r.getRegion_code()) || "HCQ2".equals(r.getRegion_code()) || "HCQ3".equals(r.getRegion_code()) || "HCQ4".equals(r.getRegion_code()) || "HCQ5".equals(r.getRegion_code()) || "HCQ7".equals(r.getRegion_code())).collect(Collectors.toList());
|
|||
// for (SchBasePoint r : list1) {
|
|||
// if (r.getRow_num() == 0) {
|
|||
// LambdaUpdateWrapper<SchBasePoint> updateWrapper = new LambdaUpdateWrapper<SchBasePoint>()
|
|||
// .eq(SchBasePoint::getPoint_code, r.getPoint_code());
|
|||
// String pointId = r.getPoint_code().substring(5, 9);
|
|||
// updateWrapper.set(SchBasePoint::getRow_num, Integer.parseInt(pointId));
|
|||
// schBasePoint.update(null, updateWrapper);
|
|||
// }
|
|||
// }
|
|||
// todo 未对接的涂板线数据
|
|||
JSONObject tbx01 = new JSONObject(); |
|||
tbx01.put("mode", "0"); |
|||
tbx01.put("device_code", "TBX0001"); |
|||
tbx01.put("workshop_code", "A1"); |
|||
JSONObject tbx02 = new JSONObject(); |
|||
tbx02.put("mode", "0"); |
|||
tbx02.put("device_code", "TBX0002"); |
|||
tbx02.put("workshop_code", "A1"); |
|||
JSONArray tbx1 = (JSONArray) redisUtils.get("tbxList1"); |
|||
tbx1.add(tbx01); |
|||
tbx1.add(tbx02); |
|||
List<JSONObject> tbxList1 = getSortedList(tbx1); |
|||
if (ObjectUtil.isNotEmpty(tbxList1)) { |
|||
jsonObject.put("1", tbxList1); |
|||
} else { |
|||
jsonObject.put("1", new JSONArray()); |
|||
} |
|||
JSONArray tbx2 = (JSONArray) redisUtils.get("tbxList2"); |
|||
List<JSONObject> tbxList2 = getSortedList(tbx2); |
|||
if (ObjectUtil.isNotEmpty(tbxList2)) { |
|||
jsonObject.put("9", tbxList2); |
|||
} else { |
|||
jsonObject.put("9", new JSONArray()); |
|||
} |
|||
return null; |
|||
}, pool); |
|||
task1.exceptionally((e) -> { |
|||
log.error("读取涂板线设备缓存信息: {}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
CompletableFuture<List<Map<String, Object>>> task2 = CompletableFuture.supplyAsync(() -> { |
|||
JSONArray ghs1 = (JSONArray) redisUtils.get("ghsList1"); |
|||
List<JSONObject> ghsList1 = getSortedList(ghs1); |
|||
JSONArray ghs2 = (JSONArray) redisUtils.get("ghsList2"); |
|||
List<JSONObject> ghsList2 = getSortedList(ghs2); |
|||
if (ObjectUtil.isNotEmpty(ghsList1)) { |
|||
jsonObject.put("2", ghsList1); |
|||
} else { |
|||
jsonObject.put("2", new JSONArray()); |
|||
} |
|||
if (ObjectUtil.isNotEmpty(ghsList2)) { |
|||
jsonObject.put("11", ghsList2); |
|||
} else { |
|||
jsonObject.put("11", new JSONArray()); |
|||
} |
|||
return null; |
|||
}, pool); |
|||
task2.exceptionally((e) -> { |
|||
log.error("读取固化室设备缓存信息: {}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
CompletableFuture<List<Map<String, Object>>> task3 = CompletableFuture.supplyAsync(() -> { |
|||
JSONArray bpjList = (JSONArray) redisUtils.get("bpjList"); |
|||
List<JSONObject> bpjList1 = getSortedList(bpjList); |
|||
if (ObjectUtil.isNotEmpty(bpjList1)) { |
|||
jsonObject.put("7", bpjList1); |
|||
} else { |
|||
jsonObject.put("7", new JSONArray()); |
|||
} |
|||
JSONArray deviceA1 = (JSONArray) redisUtils.get("deviceA1"); |
|||
JSONArray deviceA2 = (JSONArray) redisUtils.get("deviceA2"); |
|||
jsonObject.put("17", deviceA1); |
|||
jsonObject.put("19", deviceA2); |
|||
return null; |
|||
}, pool); |
|||
task3.exceptionally((e) -> { |
|||
log.error("读取包片机设备缓存信息: {}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
CompletableFuture<List<Map<String, Object>>> task4 = CompletableFuture.supplyAsync(() -> { |
|||
//正极板空架回收位
|
|||
JSONArray zjbKjHswList = (JSONArray) redisUtils.get("zjbKjHswList"); |
|||
List<JSONObject> zjbKjHswList1 = getSortedList(zjbKjHswList); |
|||
//负极板空架回收位
|
|||
JSONArray fjbKjDjwList = (JSONArray) redisUtils.get("fjbKjDjwList"); |
|||
List<JSONObject> fjbKjDjwList1 = getSortedList(fjbKjDjwList); |
|||
//正极板对接位
|
|||
JSONArray zjbDjwList = (JSONArray) redisUtils.get("zjbDjwList"); |
|||
List<JSONObject> zjbDjwList1 = getSortedList(zjbDjwList); |
|||
if (ObjectUtil.isNotEmpty(zjbKjHswList1)) { |
|||
jsonObject.put("13", zjbKjHswList1); |
|||
} else { |
|||
jsonObject.put("13", new JSONArray()); |
|||
} |
|||
if (ObjectUtil.isNotEmpty(fjbKjDjwList1)) { |
|||
jsonObject.put("14", fjbKjDjwList1); |
|||
} else { |
|||
jsonObject.put("14", new JSONArray()); |
|||
} |
|||
if (ObjectUtil.isNotEmpty(zjbDjwList1)) { |
|||
jsonObject.put("15", zjbDjwList1); |
|||
} else { |
|||
jsonObject.put("15", new JSONArray()); |
|||
} |
|||
return null; |
|||
}, pool); |
|||
task4.exceptionally((e) -> { |
|||
log.error("读取包片机设备缓存信息: {}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
CompletableFuture<JSONArray> task5 = CompletableFuture.supplyAsync(() -> { |
|||
JSONArray jsonArray = cockpitMapper.getZCList(); |
|||
List<PointInfo> pointInfoList = jsonArray.stream() |
|||
.map(r -> JSON.parseObject(r.toString(), PointInfo.class)) |
|||
.collect(Collectors.toList()); |
|||
//正极板空固化架缓存区A1
|
|||
List<PointInfo> hcq6 = pointInfoList.stream().filter(r -> "HCQ6".equals(r.getRegion_code())).sorted(Comparator.comparing(PointInfo::getRow_num)).collect(Collectors.toList()); |
|||
AtomicReference<List<PointInfo>> list1 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task01 = CompletableFuture.supplyAsync(() -> { |
|||
//边负极板缓存区
|
|||
List<PointInfo> hcq1 = pointInfoList.stream().filter(r -> "HCQ3".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list1.set(getPointInfoList(hcq1)); |
|||
return null; |
|||
}, pool); |
|||
AtomicReference<List<PointInfo>> list2 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task02 = CompletableFuture.supplyAsync(() -> { |
|||
//边负极板缓存区
|
|||
//负极板缓存区
|
|||
List<PointInfo> hcq2 = pointInfoList.stream().filter(r -> "HCQ2".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list2.set(getPointInfoList(hcq2)); |
|||
return null; |
|||
}, pool); |
|||
AtomicReference<List<PointInfo>> list3 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task03 = CompletableFuture.supplyAsync(() -> { |
|||
//负极板空架缓存区
|
|||
List<PointInfo> hcq3 = pointInfoList.stream().filter(r -> "HCQ1".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list3.set(getPointInfoList(hcq3)); |
|||
return null; |
|||
}, pool); |
|||
AtomicReference<List<PointInfo>> list4 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task04 = CompletableFuture.supplyAsync(() -> { |
|||
//正极板缓存区
|
|||
List<PointInfo> hcq4 = pointInfoList.stream().filter(r -> "HCQ4".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list4.set(getPointInfoList(hcq4)); |
|||
return null; |
|||
}, pool); |
|||
AtomicReference<List<PointInfo>> list5 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task05 = CompletableFuture.supplyAsync(() -> { |
|||
//正极板空固化架缓存区
|
|||
List<PointInfo> hcq5 = pointInfoList.stream().filter(r -> "HCQ5".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list5.set(getPointInfoList(hcq5)); |
|||
return null; |
|||
}, pool); |
|||
AtomicReference<List<PointInfo>> list7 = new AtomicReference<>(); |
|||
CompletableFuture<List<Map<String, Object>>> task07 = CompletableFuture.supplyAsync(() -> { |
|||
//涂板线空固化架缓存区
|
|||
List<PointInfo> hcq7 = pointInfoList.stream().filter(r -> "HCQ7".equals(r.getRegion_code())).collect(Collectors.toList()); |
|||
list7.set(getPointInfoList(hcq7)); |
|||
return null; |
|||
}, pool); |
|||
CompletableFuture<Void> allQuery = CompletableFuture.allOf(task01, task02, task03, task04, task05, task07); |
|||
CompletableFuture<JSONObject> future = allQuery.thenApply((result) -> jsonObject).exceptionally((e) -> { |
|||
log.error(e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
future.join(); |
|||
jsonObject.put("8", hcq6); |
|||
jsonObject.put("4", list1.get()); |
|||
jsonObject.put("5", list2.get()); |
|||
jsonObject.put("6", list3.get()); |
|||
jsonObject.put("12", list4.get()); |
|||
jsonObject.put("10", list5.get()); |
|||
jsonObject.put("3", list7.get()); |
|||
return null; |
|||
}, pool); |
|||
task5.exceptionally((e) -> { |
|||
log.error("库位详情{}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
//今日生产任务
|
|||
CompletableFuture<List<Map<String, Object>>> task6 = CompletableFuture.supplyAsync(() -> { |
|||
JSONArray a1 = new JSONArray(); |
|||
JSONArray a2 = new JSONArray(); |
|||
JSONObject tbx = new JSONObject(); |
|||
JSONObject ghs = new JSONObject(); |
|||
JSONObject tbx1 = new JSONObject(); |
|||
JSONObject ghs1 = new JSONObject(); |
|||
List<TaskInfo> result = cockpitMapper.getTodayTaskList(); |
|||
if (ObjectUtil.isNotEmpty(result)) { |
|||
Integer[] tbInProduction = {0, 0}; |
|||
Integer[] tbEndProduction = {0, 0}; |
|||
Integer[] ghInProduction = {0, 0}; |
|||
Integer[] ghEndProduction = {0, 0}; |
|||
//生产中的涂板任务
|
|||
List<TaskInfo> list1 = result.stream().filter(r -> r.getTask_status() < 5 && "MJXLTask".equals(r.getType())).collect(Collectors.toList()); |
|||
extracted(list1, tbInProduction); |
|||
//生产完成的涂板任务
|
|||
List<TaskInfo> list2 = result.stream().filter(r -> r.getTask_status() == 5 && "MJXLTask".equals(r.getType())).collect(Collectors.toList()); |
|||
extracted(list2, tbEndProduction); |
|||
//生产中的固化任务
|
|||
List<TaskInfo> list3 = result.stream().filter(r -> "GHSFMTask".equals(r.getType())).collect(Collectors.toList()); |
|||
extracted(list3, ghInProduction); |
|||
//生产完成的固化任务
|
|||
List<TaskInfo> list4 = result.stream().filter(r -> "GHSQHTask".equals(r.getType())).collect(Collectors.toList()); |
|||
extracted(list4, ghEndProduction); |
|||
tbx.put("device_code", "涂板"); |
|||
tbx.put("a", tbInProduction[0]); |
|||
tbx.put("b", tbEndProduction[0]); |
|||
a1.add(tbx); |
|||
tbx1.put("device_code", "涂板"); |
|||
tbx1.put("a", tbInProduction[1]); |
|||
tbx1.put("b", tbEndProduction[1]); |
|||
a2.add(tbx1); |
|||
ghs.put("device_code", "固化"); |
|||
ghs.put("a", ghInProduction[0]); |
|||
ghs.put("b", ghEndProduction[0]); |
|||
a1.add(ghs); |
|||
ghs1.put("device_code", "固化"); |
|||
ghs1.put("a", ghInProduction[1]); |
|||
ghs1.put("b", ghEndProduction[1]); |
|||
a2.add(ghs1); |
|||
} else { |
|||
tbx.put("device_code", "涂板"); |
|||
tbx.put("a", "0"); |
|||
tbx.put("b", 0); |
|||
a1.add(tbx); |
|||
ghs.put("device_code", "固化"); |
|||
ghs.put("a", "0"); |
|||
ghs.put("b", 0); |
|||
a1.add(ghs); |
|||
tbx1.put("device_code", "涂板"); |
|||
tbx1.put("a", "0"); |
|||
tbx1.put("b", 0); |
|||
a2.add(tbx1); |
|||
ghs1.put("device_code", "固化"); |
|||
ghs1.put("a", "0"); |
|||
ghs1.put("b", 0); |
|||
a2.add(ghs1); |
|||
} |
|||
jsonObject.put("16", a1); |
|||
jsonObject.put("18", a2); |
|||
return null; |
|||
}, pool); |
|||
task6.exceptionally((e) -> { |
|||
log.error("今日生产任务: {}", e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
//设备统计
|
|||
// CompletableFuture<List<Map<String, Object>>> task7 = CompletableFuture.supplyAsync(() -> {
|
|||
// JSONArray a1 = new JSONArray();
|
|||
// JSONArray a2 = new JSONArray();
|
|||
// //测试数据,上线后删除
|
|||
// if (ObjectUtil.isEmpty(a1)) {
|
|||
// JSONObject item1 = new JSONObject();
|
|||
// item1.put("count", "401");
|
|||
// a1.add(item1);
|
|||
// JSONObject item2 = new JSONObject();
|
|||
// item2.put("count", "350");
|
|||
// item2.put("name", "正常运行");
|
|||
// item2.put("percent", "87.28%");
|
|||
// a1.add(item2);
|
|||
// JSONObject item3 = new JSONObject();
|
|||
// item3.put("count", "29");
|
|||
// item3.put("name", "暂未生产");
|
|||
// item3.put("percent", "0.07%");
|
|||
// a1.add(item3);
|
|||
// JSONObject item4 = new JSONObject();
|
|||
// item4.put("count", "21");
|
|||
// item4.put("name", "空闲设备");
|
|||
// item4.put("percent", "0.05%");
|
|||
// a1.add(item4);
|
|||
// JSONObject item5 = new JSONObject();
|
|||
// item5.put("count", "1");
|
|||
// item5.put("name", "故障设备");
|
|||
// item5.put("percent", "0.02%");
|
|||
// a1.add(item5);
|
|||
// JSONObject item01 = new JSONObject();
|
|||
// item01.put("count", "439");
|
|||
// a2.add(item01);
|
|||
// JSONObject item02 = new JSONObject();
|
|||
// item02.put("count", "321");
|
|||
// item02.put("name", "正常运行");
|
|||
// item02.put("percent", "73.12%");
|
|||
// a2.add(item02);
|
|||
// JSONObject item03 = new JSONObject();
|
|||
// item03.put("count", "51");
|
|||
// item03.put("name", "暂未生产");
|
|||
// item03.put("percent", "11.61%");
|
|||
// a2.add(item03);
|
|||
// JSONObject item04 = new JSONObject();
|
|||
// item04.put("count", "60");
|
|||
// item04.put("name", "空闲设备");
|
|||
// item04.put("percent", "13.66%");
|
|||
// a2.add(item04);
|
|||
// JSONObject item05 = new JSONObject();
|
|||
// item05.put("count", "7");
|
|||
// item05.put("name", "故障设备");
|
|||
// item05.put("percent", "0.01%");
|
|||
// a2.add(item05);
|
|||
// }
|
|||
// jsonObject.put("17", a1);
|
|||
// jsonObject.put("19", a2);
|
|||
// return null;
|
|||
// }, pool);
|
|||
// task7.exceptionally((e) -> {
|
|||
// log.error("今日生产任务: {}", e.getMessage(), e);
|
|||
// return null;
|
|||
// });
|
|||
CompletableFuture<Void> allQuery = CompletableFuture.allOf(task1, task2, task3, task4, task5, task6); |
|||
CompletableFuture<JSONObject> future = allQuery.thenApply((result) -> jsonObject).exceptionally((e) -> { |
|||
log.error(e.getMessage(), e); |
|||
return null; |
|||
}); |
|||
future.join(); |
|||
return jsonObject; |
|||
} |
|||
|
|||
private static void extracted(List<TaskInfo> list, Integer[] production) { |
|||
list.stream() |
|||
.peek(taskInfo -> { |
|||
if (StringUtils.isBlank(taskInfo.getPoint_code1()) && StringUtils.isNotBlank(taskInfo.getPoint_code2())) { |
|||
taskInfo.setPoint_code1(taskInfo.getPoint_code2()); |
|||
} |
|||
}) |
|||
.forEach(taskInfo -> { |
|||
int vehicleCount = taskInfo.getVehicle_code().split(",").length; |
|||
if ("A1".equals(taskInfo.getPoint_code1())) { |
|||
production[0] += vehicleCount; |
|||
} else { |
|||
production[1] += vehicleCount; |
|||
} |
|||
}); |
|||
} |
|||
|
|||
private static List<JSONObject> getSortedList(JSONArray jsonArray) { |
|||
return jsonArray.stream() |
|||
.map(JSONObject.class::cast) |
|||
.sorted(Comparator.comparing(json -> json.getString("device_code"))) |
|||
.collect(Collectors.toList()); |
|||
} |
|||
|
|||
private static List<PointInfo> getPointInfoList(List<PointInfo> pointInfoList) { |
|||
Map<Integer, List<PointInfo>> groupedByRowNum = pointInfoList.stream() |
|||
.collect(Collectors.groupingBy(PointInfo::getRow_num)); |
|||
List<PointInfo> result = groupedByRowNum.entrySet().stream() |
|||
.map(r -> { |
|||
List<PointInfo> groupList = r.getValue(); |
|||
PointInfo point = groupList.get(0); |
|||
if (groupList.stream().anyMatch(g -> g.getMove() == 3)) { |
|||
point.setMove(3); |
|||
} else { |
|||
point.setMove(0); |
|||
} |
|||
return point; |
|||
}).sorted(Comparator.comparing(PointInfo::getRow_num)) |
|||
.collect(Collectors.toList()); |
|||
return result; |
|||
} |
|||
|
|||
|
|||
private void getWeekWorkStatistics(List<Map<String, Object>> gh_real_qty, List<Map<String, Object>> tb_real_qty_default, String region_name, Integer days) { |
|||
for (int i = 0; i < days; i++) { |
|||
Map<String, Object> item = new HashMap<>(); |
|||
item.put("region_name", region_name); |
|||
item.put("total_qty", "0"); |
|||
item.put("date", today.minusDays(i).format(formatter)); |
|||
tb_real_qty_default.add(item); |
|||
} |
|||
Map<String, BigDecimal> ghRealQtyMap = gh_real_qty.stream() |
|||
.collect(Collectors.toMap( |
|||
item -> (String) item.get("date"), |
|||
item -> (BigDecimal) item.get("total_qty") |
|||
)); |
|||
tb_real_qty_default.forEach(tbItem -> { |
|||
String date = (String) tbItem.get("date"); |
|||
if (ghRealQtyMap.containsKey(date)) { |
|||
tbItem.put("total_qty", ghRealQtyMap.get(date)); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,151 @@ |
|||
package org.nl.wms.cockpit.service.mapper; |
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import org.apache.ibatis.annotations.Insert; |
|||
import org.apache.ibatis.annotations.Param; |
|||
import org.nl.wms.cockpit.service.dao.DasDeviceFault; |
|||
import org.nl.wms.cockpit.service.dao.DayData; |
|||
import org.nl.wms.cockpit.service.dao.TargetAchievement; |
|||
import org.nl.wms.cockpit.service.dao.TaskInfo; |
|||
import org.nl.wms.sch.point.service.dao.SchBasePoint; |
|||
|
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @Author: gbx |
|||
* @Description: |
|||
* @Date: 2024/10/18 |
|||
*/ |
|||
public interface CockpitMapper { |
|||
/** |
|||
* 获取最近n条工单数据 |
|||
* |
|||
* @param deviceCode |
|||
* @param number |
|||
* @return |
|||
*/ |
|||
List<TargetAchievement> getDeviceLimitOrders(@Param("deviceCode") String deviceCode, @Param("number") int number); |
|||
|
|||
|
|||
List<DayData> getTemporaryStorage(); |
|||
|
|||
|
|||
List<TaskInfo> getTemporaryInTask(); |
|||
|
|||
|
|||
List<TaskInfo> getTemporaryOutTask(); |
|||
|
|||
|
|||
TargetAchievement getCompletionPercent(@Param("regionCode") String regionCode, @Param("vehicleType") String vehicleType, @Param("days") Integer days); |
|||
|
|||
|
|||
List<TargetAchievement> getWorkOrders(@Param("regionCode") String regionCode, @Param("days") Integer days); |
|||
|
|||
List<Map<String, Object>> getCurrentTasks(@Param("deviceCodes") List<String> deviceCodes); |
|||
|
|||
JSONObject getCurrentTask(@Param("taskId") String taskId); |
|||
|
|||
List<TargetAchievement> getGhActualProduction(@Param("days") Integer days); |
|||
|
|||
|
|||
List<TaskInfo> getTodayTaskList(); |
|||
|
|||
|
|||
JSONObject getFaultsForDevice(@Param("deviceCode") String deviceCode); |
|||
|
|||
|
|||
List<DayData> getGhCuringSummary(); |
|||
|
|||
@Insert("INSERT INTO das_device_fault (data_id,region_code, device_code, failure_time, failure_info) " + |
|||
"VALUES (#{data_id},#{region_code}, #{device_code}, #{failure_time}, #{failure_info})") |
|||
int insertDeviceFault(DasDeviceFault deviceFault); |
|||
|
|||
|
|||
JSONObject getVehicleGroupInfo(String vehicleCode, String vehicleType); |
|||
|
|||
/** |
|||
* 固化室详情 |
|||
* |
|||
* @return |
|||
*/ |
|||
JSONArray getGHSInteriorList(); |
|||
|
|||
|
|||
JSONArray getSSXInteriorList(); |
|||
|
|||
JSONArray getZCList(); |
|||
|
|||
JSONArray getKJList(); |
|||
|
|||
//目前是获取当天的错误数据
|
|||
JSONArray getError(); |
|||
|
|||
//获取生产中的工单数据
|
|||
JSONObject getProductTarget(); |
|||
|
|||
//获取暂存库库存信息
|
|||
List<Map<String, Object>> getZcMaterialmsg(); |
|||
|
|||
//获取暂存库库存信息
|
|||
JSONObject getProductionsummary(); |
|||
|
|||
|
|||
//库位使用占比
|
|||
String percent(); |
|||
|
|||
//获取今日创建的每一条工单的信息
|
|||
List<Map<String, Object>> getTdWorkmsg(); |
|||
|
|||
//7天涂板实际生产
|
|||
List<Map<String, Object>> getTxQty(String days, String region); |
|||
|
|||
//7天固化室实际生产
|
|||
List<Map<String, Object>> getGhsQty(String days); |
|||
|
|||
//获取连涂普涂月统计数
|
|||
List<Map<String, Object>> getTbxMonthlyStatistics(); |
|||
|
|||
//查询所传设备当前生产的工单信息
|
|||
JSONObject getDeviceWorker(String devicecode); |
|||
|
|||
//根据所传的物料id获取物料名称
|
|||
String getMaterialName(String material_id); |
|||
|
|||
//根据所传设备得到该设备日产量
|
|||
JSONArray getProductionDay(String devicecode); |
|||
|
|||
//根据所传设备得到该设备班产量
|
|||
JSONArray getProductionTeam(@Param("deviceCode") String devicecode,@Param("dateType") Integer dateType); |
|||
|
|||
//根据所传设备得到该设备30天生产记录
|
|||
List<Map<String, Object>> getProductionHistory(String devicecode); |
|||
//今日生产连涂生产
|
|||
JSONObject ltProduction(); |
|||
//今日生产普涂生产
|
|||
JSONObject ptProduction(); |
|||
//今日涂板任务
|
|||
JSONArray todayTbTask(); |
|||
//实时故障告警
|
|||
List<Map<String, Object>> FaultTime(String region_code); |
|||
//进30日故障统计
|
|||
JSONArray FaultTotal(String region_code); |
|||
//固化汇总
|
|||
JSONArray curingSummary(); |
|||
//暂存库
|
|||
JSONObject temporaryStorage(); |
|||
//暂存区库存
|
|||
JSONArray inventory(); |
|||
//状态信息
|
|||
List<Map<String, Object>> statusInfo(); |
|||
//固化架信息
|
|||
List<Map<String, Object>> storageInfo(); |
|||
//实时故障告警
|
|||
List<Map<String, Object>> faultAlarm(); |
|||
//进30日故障统计
|
|||
JSONArray monthlyFaultStatistics(); |
|||
//设备报警前十
|
|||
List<Map<String, Object>> ghStatistics(); |
|||
//货位货位信息
|
|||
JSONArray taskInfo(); |
|||
} |
@ -0,0 +1,782 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="org.nl.wms.cockpit.service.mapper.CockpitMapper"> |
|||
<select id="getDeviceLimitOrders" resultType="org.nl.wms.cockpit.service.dao.TargetAchievement"> |
|||
SELECT |
|||
w.plan_qty, |
|||
w.real_qty, |
|||
m.material_name |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
|||
WHERE 1=1 |
|||
AND w.is_delete = 0 |
|||
<if test="deviceCode != null and deviceCode != ''"> |
|||
AND w.point_code = #{deviceCode} |
|||
</if> |
|||
order by w.create_time desc |
|||
<if test="number != 0 "> |
|||
LIMIT #{number} |
|||
</if> |
|||
</select> |
|||
|
|||
<select id="getWorkOrders" resultType="org.nl.wms.cockpit.service.dao.TargetAchievement"> |
|||
SELECT |
|||
w.plan_qty AS expected_production, |
|||
w.real_qty AS actual_production, |
|||
w.vehicle_type, |
|||
w.create_time |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
WHERE 1=1 |
|||
AND w.is_delete = 0 |
|||
<if test="days != null and days != ''"> |
|||
<![CDATA[ |
|||
AND w.create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) |
|||
AND w.create_time < CURDATE() + INTERVAL 1 DAY |
|||
]]> |
|||
</if> |
|||
<if test="regionCode != null and regionCode != ''"> |
|||
AND w.region_code = #{regionCode} |
|||
</if> |
|||
</select> |
|||
|
|||
|
|||
<select id="getGhActualProduction" resultType="org.nl.wms.cockpit.service.dao.TargetAchievement"> |
|||
SELECT |
|||
g.material_qty AS actual_production, |
|||
t.task_id, |
|||
t.create_time |
|||
FROM |
|||
`sch_base_task` t |
|||
LEFT JOIN sch_base_vehiclematerialgroup g ON t.group_id = g.group_id |
|||
WHERE |
|||
1 = 1 |
|||
AND t.is_delete = 0 |
|||
AND t.config_code = 'GHSMLTask' |
|||
<if test="days != null and days != ''"> |
|||
<![CDATA[ |
|||
AND t.create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) |
|||
AND t.create_time < CURDATE() + INTERVAL 1 DAY |
|||
]]> |
|||
</if> |
|||
</select> |
|||
|
|||
<select id="getTodayTaskList" resultType="org.nl.wms.cockpit.service.dao.TaskInfo"> |
|||
SELECT |
|||
t.config_code AS type, |
|||
t.task_status, |
|||
t.vehicle_code, |
|||
p1.workshop_code AS point_code1, |
|||
p2.workshop_code AS point_code2 |
|||
FROM |
|||
sch_base_task t |
|||
LEFT JOIN sch_base_point p1 ON p1.point_code = t.point_code1 |
|||
LEFT JOIN sch_base_point p2 ON p2.point_code = t.point_code2 |
|||
WHERE |
|||
t.is_delete = 0 |
|||
# AND DATE ( t.create_time )= CURDATE() |
|||
AND t.task_status<![CDATA[ < ]]> 6 |
|||
AND (t.config_code = 'MJXLTask' OR t.config_code = 'GHSFMTask' OR t.config_code = 'GHSQHTask' ); |
|||
</select> |
|||
|
|||
<select id="getCompletionPercent" resultType="org.nl.wms.cockpit.service.dao.TargetAchievement"> |
|||
SELECT |
|||
SUM( plan_qty ) AS expected_production, |
|||
SUM( real_qty ) AS actual_production |
|||
FROM |
|||
pdm_bd_workorder |
|||
WHERE |
|||
is_delete = 0 |
|||
<if test="days != null and days != ''"> |
|||
<![CDATA[ |
|||
AND create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) |
|||
AND create_time < CURDATE() + INTERVAL 1 DAY |
|||
]]> |
|||
</if> |
|||
<if test="regionCode != null and regionCode != ''"> |
|||
AND region_code = #{regionCode} |
|||
</if> |
|||
<if test="vehicleType != null and vehicleType != ''"> |
|||
AND vehicle_type = #{vehicleType} |
|||
</if> |
|||
</select> |
|||
<select id="getCurrentTasks" resultType="java.util.HashMap"> |
|||
SELECT |
|||
g.vehicle_type, |
|||
g.pcsn, |
|||
g.material_qty, |
|||
m.material_name, |
|||
m.material_spec |
|||
FROM |
|||
sch_base_vehiclematerialgroup g |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE |
|||
g.vehicle_code IN ( |
|||
SELECT |
|||
vehicle_code |
|||
FROM |
|||
sch_base_point |
|||
WHERE point_code IN |
|||
<foreach collection="deviceCodes" item="code" open="(" separator="," close=")"> |
|||
#{code} |
|||
</foreach> |
|||
) |
|||
AND g.is_delete = '0' |
|||
</select> |
|||
|
|||
<select id="getCurrentTask" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
t.task_code, |
|||
t.point_code1, |
|||
t.point_code2, |
|||
CASE |
|||
WHEN t.next_wait_point IS NULL THEN |
|||
"" ELSE "" |
|||
END AS next_wait_point, |
|||
t.vehicle_code, |
|||
g.vehicle_type, |
|||
m.material_name, |
|||
g.pcsn, |
|||
g.material_qty |
|||
FROM |
|||
sch_base_task t |
|||
LEFT JOIN sch_base_vehiclematerialgroup g ON g.group_id = t.group_id |
|||
LEFT JOIN md_base_material m ON m.material_id = g.material_id |
|||
WHERE t.task_id = #{taskId} |
|||
</select> |
|||
|
|||
<select id="getFaultsForDevice" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
COUNT(*) AS fault_total, CASE |
|||
WHEN COUNT(*) = 0 THEN 0 |
|||
ELSE ROUND((COUNT(*) / 30.0) * 100, 0) |
|||
END AS fault_percentage |
|||
FROM |
|||
das_device_fault |
|||
WHERE |
|||
device_code = #{deviceCode} |
|||
AND failure_time >= NOW() - INTERVAL 30 DAY; |
|||
</select> |
|||
|
|||
<select id="getGhCuringSummary" resultType="org.nl.wms.cockpit.service.dao.DayData"> |
|||
SELECT CASE |
|||
p.point_status |
|||
WHEN '3' THEN |
|||
'待固化' |
|||
WHEN '4' THEN |
|||
'固化中' |
|||
WHEN '5' THEN |
|||
'固化完毕' |
|||
ELSE '' |
|||
END AS item_name, |
|||
COUNT(p.point_type) AS item_qty |
|||
FROM `pdm_bd_workorder` w |
|||
LEFT JOIN sch_base_point p ON w.point_code = p.point_code |
|||
WHERE w.region_code = 'GH' |
|||
AND w.is_delete = 0 |
|||
AND DATE_FORMAT(w.create_time, '%Y-%m-%d') = CURDATE() |
|||
GROUP BY p.point_status; |
|||
</select> |
|||
|
|||
|
|||
<select id="getTemporaryStorage" resultType="org.nl.wms.cockpit.service.dao.DayData"> |
|||
SELECT p.point_code, |
|||
m.material_name item_name, |
|||
g.material_qty item_qty |
|||
FROM `sch_base_point` p |
|||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.point_code = g.point_code |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE p.region_code = 'ZC' |
|||
AND g.group_bind_material_status = 2 |
|||
AND DATE_FORMAT(g.update_time, '%Y-%m-%d') = CURDATE() |
|||
</select> |
|||
|
|||
|
|||
<select id="getTemporaryInTask" resultType="org.nl.wms.cockpit.service.dao.TaskInfo"> |
|||
SELECT g.point_code, |
|||
g.vehicle_code, |
|||
CASE |
|||
g.vehicle_type |
|||
WHEN 1 THEN |
|||
"普涂" |
|||
ELSE "连涂" |
|||
END AS vehicle_type, |
|||
m.material_name, |
|||
"出库" AS task_type |
|||
FROM `sch_base_vehiclematerialgroup` g |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE g.region_code = 'ZC' |
|||
AND g.group_bind_material_status = 3 |
|||
AND DATE_FORMAT(g.update_time, '%Y-%m-%d') = CURDATE() |
|||
</select> |
|||
|
|||
|
|||
<select id="getTemporaryOutTask" resultType="org.nl.wms.cockpit.service.dao.TaskInfo"> |
|||
SELECT p.point_code, |
|||
m.material_name, |
|||
g.vehicle_code, |
|||
CASE |
|||
g.vehicle_type |
|||
WHEN 1 THEN |
|||
"普涂" |
|||
ELSE "连涂" |
|||
END AS vehicle_type, |
|||
"出库" as type |
|||
FROM `sch_base_point` p |
|||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.point_code = g.point_code |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE p.region_code = 'ZC' |
|||
AND group_bind_material_status = 2 |
|||
AND DATE_FORMAT(p.update_time, '%Y-%m-%d') = CURDATE() |
|||
</select> |
|||
|
|||
|
|||
<select id="getVehicleGroupInfo" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT vg.vehicle_type |
|||
, vg.vehicle_code |
|||
, ma.material_name |
|||
, ma.material_code |
|||
,vg.material_qty AS qty |
|||
,vg.pcsn |
|||
FROM sch_base_vehiclematerialgroup vg |
|||
LEFT JOIN md_base_material ma ON vg.material_id = ma.material_id |
|||
WHERE 1 = 1 |
|||
<if test="vehicleCode != null"> |
|||
AND vg.vehicle_code = #{vehicleCode} |
|||
</if> |
|||
<if test="vehicleType != null"> |
|||
AND vg.vehicle_type = #{vehicleType} |
|||
</if> |
|||
AND vg.is_delete = '0' |
|||
</select> |
|||
<select id="getGHSInteriorList" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT CAST(point_status - 1 AS SIGNED) AS move, |
|||
point_code AS device_code, |
|||
point_name AS device_name, |
|||
IF(LENGTH(vehicle_type) > 0, vehicle_type, '0') AS vehicle_type, |
|||
parent_point_code AS device |
|||
FROM `sch_base_point` |
|||
WHERE region_code = 'GH' |
|||
AND point_type = '2' |
|||
</select> |
|||
<select id="getSSXInteriorList" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
CAST( point_status - 1 AS SIGNED ) AS move, |
|||
point_code AS device_code, |
|||
point_name AS device_name, |
|||
"1" AS mode, |
|||
"0" AS error, |
|||
"1" AS device_status, |
|||
parent_point_code AS device, |
|||
CASE |
|||
vehicle_type |
|||
WHEN 1 THEN |
|||
"1" |
|||
WHEN 2 THEN |
|||
"2" ELSE "0" |
|||
END AS vehicle_type |
|||
FROM |
|||
`sch_base_point` |
|||
WHERE |
|||
region_code = 'KJZC' |
|||
AND point_type IN ('1', '3', '4') |
|||
</select> |
|||
<select id="getZCList" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
workshop_code, |
|||
region_code, |
|||
CASE |
|||
vehicle_qty |
|||
WHEN 0 THEN 0 |
|||
WHEN 1 THEN 3 ELSE 0 |
|||
END AS move, |
|||
point_code AS device_code, |
|||
row_num |
|||
FROM |
|||
`sch_base_point` |
|||
where is_used =1 |
|||
and region_code in ('HCQ1','HCQ2','HCQ3','HCQ4','HCQ5','HCQ6','HCQ7') |
|||
order by row_num |
|||
</select> |
|||
<select id="getKJList" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT CAST(point_status - 1 AS SIGNED) AS move, |
|||
point_code AS device_code, |
|||
vehicle_type, |
|||
point_name AS device_name |
|||
FROM `sch_base_point` |
|||
WHERE region_code = 'KJW' |
|||
</select> |
|||
<select id="getError" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT * |
|||
FROM das_device_fault |
|||
WHERE failure_time LIKE CONCAT(CURDATE(), '%'); |
|||
</select> |
|||
<select id="getProductTarget" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
COUNT(*) AS await_curing, |
|||
SUM(plan_qty) AS expected_production, |
|||
SUM(real_qty) AS actual_production, |
|||
ROUND(SUM(real_qty) * 1.0 / NULLIF(SUM(plan_qty), 0)) AS percentage |
|||
FROM |
|||
pdm_bd_workorder |
|||
WHERE |
|||
workorder_status = 3; |
|||
</select> |
|||
<select id="getZcMaterialmsg" resultType="java.util.HashMap"> |
|||
SELECT |
|||
m.material_name AS item_name, |
|||
m.standard_qty AS item_qty |
|||
FROM `sch_base_point` p |
|||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.vehicle_code = g.vehicle_code |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE p.region_code = 'ZC' |
|||
AND p.vehicle_code IS NOT NULL |
|||
</select> |
|||
<select id="getProductionsummary" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
SUM(CASE WHEN region_code LIKE 'TBX%' THEN real_qty ELSE 0 END) AS '1', |
|||
SUM(CASE WHEN region_code LIKE 'GH%' THEN real_qty ELSE 0 END) AS '2', |
|||
SUM(CASE WHEN region_code LIKE 'ZC%' THEN real_qty ELSE 0 END) AS '3' |
|||
FROM |
|||
`pdm_bd_workorder` |
|||
WHERE |
|||
workorder_status = 3 |
|||
AND DATE(create_time) = CURDATE(); |
|||
</select> |
|||
<select id="getTdWorkmsg" resultType="java.util.HashMap"> |
|||
SELECT |
|||
w.workorder_code, |
|||
m.material_name AS material_name, |
|||
w.plan_qty, |
|||
w.real_qty, |
|||
w.point_name , |
|||
w.point_code as device_code, |
|||
w.workorder_status |
|||
FROM `pdm_bd_workorder` w |
|||
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
|||
WHERE DATE(w.update_time) = CURDATE() |
|||
</select> |
|||
<select id="getTxQty" resultType="java.util.HashMap"> |
|||
SELECT |
|||
DATE_FORMAT(create_time,'%Y-%m-%d') AS date, |
|||
SUM(real_qty) AS total_qty, |
|||
#{region} AS region_name |
|||
FROM |
|||
pdm_bd_workorder |
|||
WHERE |
|||
create_time >= CURDATE() - INTERVAL #{days} DAY |
|||
AND region_code=#{region} |
|||
GROUP BY |
|||
DATE_FORMAT(create_time,'%Y-%m-%d') |
|||
ORDER BY |
|||
date; |
|||
</select> |
|||
<select id="getGhsQty" resultType="java.util.HashMap"> |
|||
SELECT |
|||
DATE_FORMAT(create_time,'%Y-%m-%d') AS date, |
|||
SUM(material_qty) AS total_qty, |
|||
'GHS' AS region_name |
|||
FROM |
|||
sch_base_vehiclematerialgroup |
|||
WHERE |
|||
create_time >= CURDATE() - INTERVAL #{days} DAY |
|||
AND region_code='GH' |
|||
GROUP BY |
|||
DATE_FORMAT(create_time,'%Y-%m-%d') |
|||
ORDER BY |
|||
date; |
|||
</select> |
|||
<select id="getTbxMonthlyStatistics" resultType="java.util.HashMap"> |
|||
SELECT |
|||
DATE_FORMAT( create_time, '%m-%d' ) AS date, |
|||
SUM( real_qty ) AS total_qty, |
|||
'LT' AS region_name |
|||
FROM |
|||
pdm_bd_workorder |
|||
WHERE |
|||
create_time >= CURDATE() - INTERVAL 30 DAY |
|||
AND point_code LIKE 'LT%' |
|||
GROUP BY |
|||
DATE_FORMAT( create_time, '%Y-%m-%d' ) UNION ALL |
|||
SELECT |
|||
DATE_FORMAT( create_time, '%m-%d' ) AS DATE, |
|||
SUM( real_qty ) AS total_qty, |
|||
'PT' AS region_name |
|||
FROM |
|||
pdm_bd_workorder |
|||
WHERE |
|||
create_time >= CURDATE() - INTERVAL 30 DAY |
|||
AND point_code LIKE 'PT%' |
|||
GROUP BY |
|||
DATE_FORMAT( create_time, '%Y-%m-%d' ) |
|||
ORDER BY |
|||
DATE; |
|||
</select> |
|||
<select id="getDeviceWorker" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT * |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
WHERE |
|||
w.workorder_status=3 |
|||
And w.point_code= #{devicecode} |
|||
</select> |
|||
<select id="getMaterialName" resultType="java.lang.String"> |
|||
SELECT |
|||
material_name |
|||
FROM |
|||
`md_base_material` m |
|||
WHERE |
|||
m.material_id= #{material_id} |
|||
</select> |
|||
<select id="getProductionDay" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
w.plan_qty, |
|||
w.real_qty, |
|||
(w.plan_qty - w.real_qty) AS remain_qty, |
|||
CASE |
|||
WHEN w.plan_qty = 0 AND w.real_qty = 0 THEN 0 |
|||
WHEN w.plan_qty = 0 THEN 100 |
|||
ELSE ROUND((w.real_qty * 1.0 / w.plan_qty) * 100, 0) |
|||
END AS percentage, |
|||
m.material_spec, |
|||
m.material_name, |
|||
g.pcsn |
|||
FROM |
|||
pdm_bd_workorder w |
|||
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
|||
LEFT JOIN ( |
|||
SELECT p1.workorder_code, p1.pcsn |
|||
FROM sch_base_vehiclematerialgroup p1 |
|||
INNER JOIN ( |
|||
SELECT workorder_code, MIN(group_id) AS min_group_id |
|||
FROM sch_base_vehiclematerialgroup |
|||
GROUP BY workorder_code |
|||
) p2 ON p1.workorder_code = p2.workorder_code AND p1.group_id = p2.min_group_id |
|||
) g ON g.workorder_code = w.workorder_code |
|||
WHERE |
|||
w.point_code = #{devicecode}; |
|||
# AND DATE(w.create_time) = CURDATE() |
|||
</select> |
|||
<select id="getProductionTeam" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
w.plan_qty, |
|||
w.real_qty, |
|||
(w.plan_qty - w.real_qty) AS remain_qty, |
|||
CASE |
|||
WHEN w.plan_qty = 0 AND w.real_qty = 0 THEN 0 |
|||
WHEN w.plan_qty = 0 THEN 100 |
|||
ELSE ROUND((w.real_qty * 1.0 / w.plan_qty) * 100, 0) |
|||
END AS percentage, |
|||
m.material_spec, |
|||
m.material_name, |
|||
g.pcsn |
|||
FROM |
|||
pdm_bd_workorder w |
|||
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
|||
LEFT JOIN ( |
|||
SELECT p1.workorder_code, p1.pcsn |
|||
FROM sch_base_vehiclematerialgroup p1 |
|||
INNER JOIN ( |
|||
SELECT workorder_code, MIN(group_id) AS min_group_id |
|||
FROM sch_base_vehiclematerialgroup |
|||
GROUP BY workorder_code |
|||
) p2 ON p1.workorder_code = p2.workorder_code AND p1.group_id = p2.min_group_id |
|||
) g ON g.workorder_code = w.workorder_code |
|||
WHERE |
|||
w.point_code = #{deviceCode} |
|||
AND <choose> |
|||
<when test="dateType == 1"> |
|||
w.create_time BETWEEN CONCAT(DATE(NOW()), ' 07:00:00') AND CONCAT(DATE(NOW()), ' 18:00:00') |
|||
</when> |
|||
<when test="dateType == 2"> |
|||
w.create_time BETWEEN CONCAT(DATE(NOW()), ' 18:30:00') AND CONCAT(DATE_ADD(DATE(NOW()), INTERVAL 1 DAY), ' 06:30:00') |
|||
</when> |
|||
<otherwise> |
|||
1 = 1 |
|||
</otherwise> |
|||
</choose> |
|||
</select> |
|||
<select id="ltProduction" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
SUM(w.plan_qty) AS plan_production, |
|||
SUM(w.real_qty) AS actual_production, |
|||
ROUND(SUM(w.real_qty) / SUM(w.plan_qty) * 100) AS percentage |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
WHERE |
|||
w.workorder_status = 3 |
|||
AND DATE(w.create_time) = CURDATE() |
|||
AND point_code LIKE 'LT%'; |
|||
</select> |
|||
|
|||
<select id="getProductionHistory" resultType="java.util.HashMap"> |
|||
SELECT |
|||
SUM(w.plan_qty) AS plan_production, |
|||
SUM(w.real_qty) AS actual_production, |
|||
ROUND(SUM(w.real_qty) / SUM(w.plan_qty) * 100) AS percentage |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
WHERE |
|||
w.workorder_status = 3 |
|||
AND DATE(w.create_time) = CURDATE() |
|||
AND point_code LIKE 'LT%'; |
|||
</select> |
|||
<select id="ptProduction" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
SUM(w.plan_qty) AS plan_production, |
|||
SUM(w.real_qty) AS actual_production, |
|||
ROUND(SUM(w.real_qty) / SUM(w.plan_qty) * 100) AS percentage |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
WHERE |
|||
w.workorder_status=3 |
|||
And DATE(w.create_time)=CURDATE() |
|||
And point_code LIKE 'PT%' |
|||
</select> |
|||
<select id="todayTbTask" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
w.workorder_code, |
|||
m.material_name, |
|||
w.plan_qty, |
|||
w.real_qty, |
|||
w.point_name, |
|||
w.point_code as device_code, |
|||
w.workorder_status |
|||
FROM |
|||
`pdm_bd_workorder` w |
|||
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
|||
WHERE |
|||
w.workorder_status=3 |
|||
And DATE(w.create_time)=CURDATE() |
|||
</select> |
|||
<select id="FaultTime1" resultType="java.util.HashMap"> |
|||
SELECT |
|||
d1.device_code, |
|||
d1.failure_info AS fault_cause, |
|||
d1.failure_time AS alarm_time |
|||
FROM |
|||
das_device_fault d1 |
|||
WHERE |
|||
d1.failure_time = ( |
|||
SELECT MAX(d2.failure_time) |
|||
FROM das_device_fault d2 |
|||
WHERE d2.device_code = d1.device_code |
|||
AND d2.region_code = #{region_code} |
|||
) |
|||
AND d1.region_code = #{region_code} |
|||
And d1.current_status=1 |
|||
</select> |
|||
<select id="FaultTime" resultType="java.util.HashMap"> |
|||
SELECT |
|||
d1.device_code, |
|||
d1.failure_info AS fault_cause, |
|||
d1.failure_time AS alarm_time |
|||
FROM |
|||
das_device_fault d1 |
|||
JOIN |
|||
(SELECT |
|||
device_code, |
|||
MAX(failure_time) AS max_failure_time |
|||
FROM |
|||
das_device_fault |
|||
WHERE |
|||
region_code = #{region_code} GROUP BY device_code) d2 |
|||
ON d1.device_code = d2.device_code AND d1.failure_time = d2.max_failure_time |
|||
WHERE |
|||
d1.region_code = #{region_code} |
|||
AND d1.current_status = 1; |
|||
</select> |
|||
<select id="FaultTotal" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
device_code, |
|||
COUNT(*) AS alarm_qty |
|||
FROM |
|||
das_device_fault |
|||
WHERE |
|||
region_code = #{region_code} |
|||
And current_status=1 |
|||
GROUP BY |
|||
device_code; |
|||
</select> |
|||
|
|||
<select id="curingSummary" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
CASE |
|||
WHEN p.point_status = 1 THEN '待机' |
|||
WHEN p.point_status = 2 THEN '工艺进行中' |
|||
WHEN p.point_status = 3 THEN '进板中' |
|||
WHEN p.point_status = 4 THEN '出板中' |
|||
WHEN p.point_status = 5 THEN '故障' |
|||
END AS item_name, |
|||
COUNT(*) AS item_qty |
|||
FROM |
|||
`sch_base_point` p |
|||
WHERE |
|||
p.region_code = 'GH' |
|||
AND p.point_type = 1 |
|||
GROUP BY |
|||
p.point_status; |
|||
</select> |
|||
|
|||
<select id="temporaryStorage" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
SUM( CASE WHEN region_code = 'ZC' THEN 1 ELSE 0 END ) AS total, |
|||
SUM( CASE WHEN point_status = 2 THEN 1 ELSE 0 END ) AS free, |
|||
SUM( CASE WHEN region_code = 'KJW' AND point_status = 0 THEN 1 ELSE 0 END ) AS empty_num, |
|||
ROUND( SUM( CASE WHEN point_status = 2 THEN 1 ELSE 0 END ) * 1.0 / NULLIF( SUM( CASE WHEN region_code = 'ZC' THEN 1 ELSE 0 END ), 0 ) * 100, 0) |
|||
AS percentage |
|||
FROM |
|||
sch_base_point |
|||
WHERE |
|||
region_code = 'ZC' |
|||
OR region_code = 'KJW'; |
|||
</select> |
|||
<select id="percent" resultType="java.lang.String"> |
|||
SELECT |
|||
ROUND(SUM(CASE WHEN point_status = 2 THEN 1 ELSE 0 END) * 1.0 / |
|||
NULLIF(SUM(CASE WHEN region_code = 'ZC' THEN 1 ELSE 0 END), 0) * 100, 0) AS percentage |
|||
FROM |
|||
sch_base_point |
|||
WHERE |
|||
region_code = 'ZC'; |
|||
</select> |
|||
<select id="statusInfo" resultType="java.util.HashMap"> |
|||
SELECT |
|||
CASE |
|||
WHEN p.is_used = true THEN 1 |
|||
ELSE 0 |
|||
END AS item_name, |
|||
COUNT(*) AS item_qty |
|||
FROM |
|||
`sch_base_point` p |
|||
GROUP BY |
|||
item_name; |
|||
</select> |
|||
<select id="storageInfo" resultType="java.util.HashMap"> |
|||
SELECT |
|||
p.point_status AS item_name, |
|||
COUNT(*) AS item_qty |
|||
FROM |
|||
`sch_base_point` p |
|||
WHERE p.region_code = 'GH' |
|||
AND p.point_type=2 |
|||
GROUP BY |
|||
p.point_status; |
|||
</select> |
|||
<select id="faultAlarm1" resultType="java.util.HashMap"> |
|||
WITH RankedFaults AS ( |
|||
SELECT |
|||
device_code AS device_name, |
|||
failure_info AS fault_cause, |
|||
failure_time AS alarm_time, |
|||
ROW_NUMBER() OVER (PARTITION BY device_code ORDER BY failure_time DESC) AS rn |
|||
FROM das_device_fault |
|||
WHERE current_status = 1 |
|||
) |
|||
SELECT |
|||
device_name, |
|||
fault_cause, |
|||
alarm_time |
|||
FROM RankedFaults |
|||
WHERE rn = 1; |
|||
</select> |
|||
|
|||
<select id="faultAlarm" resultType="java.util.HashMap"> |
|||
SELECT |
|||
CASE |
|||
d.failure_info |
|||
WHEN '1024' THEN |
|||
'过载' |
|||
WHEN '1' THEN |
|||
'网络超时' |
|||
WHEN '512' THEN |
|||
'信号丢失' |
|||
ELSE '其他' |
|||
END AS fault_cause, |
|||
d.device_code AS device_name, |
|||
d.failure_time AS alarm_time |
|||
FROM |
|||
das_device_fault d |
|||
INNER JOIN ( |
|||
SELECT |
|||
device_code, |
|||
MAX(failure_time) AS max_time |
|||
FROM |
|||
das_device_fault |
|||
WHERE |
|||
current_status = 1 |
|||
GROUP BY |
|||
device_code |
|||
) m ON d.device_code = m.device_code |
|||
AND d.failure_time = m.max_time |
|||
WHERE |
|||
d.current_status = 1; |
|||
</select> |
|||
|
|||
<select id="monthlyFaultStatistics" resultType="com.alibaba.fastjson.JSONObject"> |
|||
SELECT |
|||
region_code AS region_name, |
|||
COUNT(*) AS alarm_qty |
|||
FROM |
|||
das_device_fault |
|||
GROUP BY |
|||
region_code; |
|||
</select> |
|||
<select id="ghStatistics" resultType="java.util.HashMap"> |
|||
SELECT |
|||
device_name, |
|||
error_number |
|||
FROM ( |
|||
SELECT |
|||
device_code AS device_name, |
|||
COUNT(*) AS error_number |
|||
FROM |
|||
das_device_fault |
|||
GROUP BY |
|||
device_code |
|||
) AS device_errors |
|||
ORDER BY |
|||
error_number DESC |
|||
LIMIT 10; |
|||
</select> |
|||
<select id="inventory" resultType="com.alibaba.fastjson.JSONObject"> |
|||
<![CDATA[ |
|||
SELECT |
|||
m.material_name AS material_name, |
|||
SUM(g.material_qty) AS quantity |
|||
FROM |
|||
sch_base_point p |
|||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.vehicle_code = g.vehicle_code |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE |
|||
p.region_code = 'ZC' |
|||
AND p.point_status = 2 |
|||
AND p.vehicle_code IS NOT NULL |
|||
AND p.vehicle_code <> '' |
|||
GROUP BY |
|||
m.material_name; |
|||
]]> |
|||
</select> |
|||
<select id="taskInfo" resultType="com.alibaba.fastjson.JSONObject"> |
|||
<![CDATA[ |
|||
SELECT |
|||
p.point_code AS device_code, |
|||
m.material_name AS material_name, |
|||
m.material_spec AS material_spec, |
|||
p.vehicle_type, |
|||
p.vehicle_code, |
|||
m.standard_qty AS qty, |
|||
g.pcsn |
|||
FROM |
|||
sch_base_point p |
|||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.vehicle_code = g.vehicle_code |
|||
LEFT JOIN md_base_material m ON g.material_id = m.material_id |
|||
WHERE |
|||
p.region_code = 'ZC' |
|||
AND p.point_status = 2 |
|||
AND p.vehicle_code IS NOT NULL |
|||
AND p.vehicle_code <> '' |
|||
]]> |
|||
</select> |
|||
</mapper> |
Loading…
Reference in new issue