Compare commits
209 Commits
5f5e5cacb4
...
0.8.X
| Author | SHA1 | Date | |
|---|---|---|---|
| 0355f68bc6 | |||
| f21101e5e0 | |||
| 16462daf7b | |||
| 61385818d0 | |||
| 6a01fb3576 | |||
| c39fc25a1a | |||
| 7da3e62ee5 | |||
| 3511a85416 | |||
| 34418f14ca | |||
| 94b2a55d0a | |||
| a5280923e1 | |||
| b129dd8f13 | |||
| 89a079e49f | |||
| d71b1c4959 | |||
| bb97d0d2a7 | |||
| 484d16017d | |||
| 2068c412b0 | |||
| 5950118c86 | |||
| d26f98440f | |||
| 268995e8e2 | |||
| abc7682e6f | |||
| bc2e42b110 | |||
| 2f5c799143 | |||
| 5605445c19 | |||
| 54adbd532e | |||
| 8c1ba2bf07 | |||
| fa198181ee | |||
| 723ccc9e58 | |||
| 28755f77c7 | |||
| b1c9bc5e81 | |||
| ea884b9096 | |||
| 68fc8c4261 | |||
| fa39c038de | |||
| 99b04de630 | |||
| 292e9df47d | |||
| 945c3560eb | |||
| 12b3f0556d | |||
| 9967d8be46 | |||
| b1a997fde8 | |||
| 89867e8d70 | |||
| 634adccce8 | |||
| 788f5d2b7c | |||
| 6c1a15b952 | |||
| 7d4d2282fe | |||
| bbe451cb23 | |||
| 73c461f0e4 | |||
|
|
5a56094e4f | ||
| dde947516d | |||
| 0f0e0f3ae2 | |||
| b12d7679d8 | |||
| 419fcb6c62 | |||
| 674859504f | |||
| b7161e9541 | |||
| 5b38ef734a | |||
| b85971d532 | |||
| dc170c77d9 | |||
| 702de37397 | |||
| 81252ccb2d | |||
| 0c3382d6db | |||
| 3746175b24 | |||
| b3d33f4368 | |||
| 3c5c71408b | |||
| bfb253ee1b | |||
| 74d0cfedf4 | |||
| 9e03dbe9de | |||
| 43ace2f91e | |||
| fe048ff91f | |||
| 3e0859d4ce | |||
| db18d4dc34 | |||
| dd4ca3d380 | |||
| 8c0126d7f8 | |||
| 73b65962f2 | |||
| ffc73689a1 | |||
| 7fa0a7d38f | |||
| a1be1bf5ad | |||
| bf44909686 | |||
| 0cfffc3adb | |||
| 5729f2ee1a | |||
| 511d5b7385 | |||
| 01a06566ee | |||
| 865c00b5b4 | |||
| 133817883d | |||
| 668af2140a | |||
| c5fa84df98 | |||
| 594a921880 | |||
| e4028effc7 | |||
| 2aaa991516 | |||
| c7cf377358 | |||
| f6c365d60e | |||
| a17969e5e2 | |||
| 7803c38c27 | |||
| a1b2a3b6bb | |||
| 9e32a34f62 | |||
| c84000059f | |||
| b7dade8ce1 | |||
| 323d90db92 | |||
| b4bd96147f | |||
| 595d4839f3 | |||
| cae3f0e14a | |||
| 2d1f4eb281 | |||
| 84c26a2990 | |||
| b840574286 | |||
| a553b8ddc4 | |||
| 98eee1785f | |||
| 8897a2ad9f | |||
| ce71fc937b | |||
| 18f5931b62 | |||
| 1d4fbc6d3f | |||
| 1259a33664 | |||
| 19dad696a7 | |||
| fc203acd68 | |||
| c60ed8eb86 | |||
| 7229b23fcd | |||
| 54bdf600df | |||
| a8e667a69b | |||
| ba613bb88d | |||
| e44235abd8 | |||
| fecfb977e8 | |||
| bd9beb32eb | |||
| c571b12463 | |||
| a2067815a9 | |||
| b160b86838 | |||
| 626aca5b85 | |||
| e22648bff0 | |||
| 5adc316854 | |||
|
|
d61a2c795b | ||
|
|
f501994da6 | ||
|
|
62b594026b | ||
| ee199388d5 | |||
| d69e445e82 | |||
| 3d7fd09c60 | |||
| 5634964002 | |||
| 9f7870c63b | |||
| 29d0303247 | |||
| c3bef9615e | |||
| d398c2e4fc | |||
| 2dbf4a042e | |||
| be59e4cc79 | |||
| 14e28a0169 | |||
| a26089ce15 | |||
| 2d3caa65bc | |||
| bd4d591934 | |||
| f7a8b3df22 | |||
| 4fefc68bbc | |||
| cdcf5e2428 | |||
| deb684ce27 | |||
| 3f300e05e9 | |||
| af002b84d3 | |||
| 143764f7f8 | |||
| 0822ca7cc8 | |||
| 5b452bad31 | |||
| 4f259c5aba | |||
| 34dd8004c4 | |||
| 254dada485 | |||
| ee2bb280b6 | |||
| 96082b9124 | |||
| ddb1beb629 | |||
| 67cf5aa7cb | |||
| e1cc0fda34 | |||
| 4e5e1bbca1 | |||
| 2e363f9ad8 | |||
| f158830abf | |||
| 843512ab7e | |||
| dd27069b4c | |||
| b95bd5b93d | |||
| 4d588985e8 | |||
| 3ad3fd2fee | |||
| 79ee9d572d | |||
| c9742b08cf | |||
| 6bd5d2ded3 | |||
| da1813e65a | |||
| 8dbb7d1113 | |||
| ae77c529ae | |||
| edcbf7a5f1 | |||
| 28622a2b16 | |||
| 44303cb1c7 | |||
| c0f7c699a8 | |||
| e69dc5e76e | |||
| ec0660acba | |||
| 110597657e | |||
| 50670b64d8 | |||
|
|
823afd7a00 | ||
|
|
344488f08e | ||
| c2da7640c3 | |||
| e99d7709d2 | |||
| 623e78629d | |||
| c1938e29a4 | |||
| 54d426984b | |||
|
|
440e70ee82 | ||
|
|
220a24da78 | ||
| c31dc4948e | |||
| 7b55f358b4 | |||
| 2fcc7b3279 | |||
|
|
8e5ce5c119 | ||
|
|
ee275d3ea5 | ||
|
|
5e80208d61 | ||
| 05f0933514 | |||
| ec5da2a7ca | |||
| 7d6957165d | |||
| 31648431c8 | |||
|
|
36ff376c55 | ||
|
|
f68167b102 | ||
| 671a7e129f | |||
| 84a0cb43ee | |||
|
|
d15f57ae6d | ||
|
|
b32f826488 | ||
|
|
a99126a9a3 | ||
| 6e5b9fc962 | |||
| c9a93fe942 |
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"java.configuration.updateBuildConfiguration": "interactive"
|
||||
}
|
||||
@@ -0,0 +1,428 @@
|
||||
package com.klp.framework.client;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.klp.framework.config.SqlServerApiProperties;
|
||||
import org.springframework.http.HttpEntity;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* sql-server-api 统一调用客户端。
|
||||
* <p>
|
||||
* 对齐 {@code sql-server-api/app.py} 的接口规范:
|
||||
* <ul>
|
||||
* <li>GET /health</li>
|
||||
* <li>GET /heartbeat</li>
|
||||
* <li>POST /table-schema</li>
|
||||
* <li>POST /execute-sql</li>
|
||||
* </ul>
|
||||
*/
|
||||
@Component
|
||||
public class SqlServerApiClient {
|
||||
|
||||
private final RestTemplate restTemplate;
|
||||
private final SqlServerApiProperties properties;
|
||||
|
||||
public SqlServerApiClient(RestTemplate sqlServerApiRestTemplate, SqlServerApiProperties properties) {
|
||||
this.restTemplate = sqlServerApiRestTemplate;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
public String getBaseUrl() {
|
||||
return normalizeBaseUrl();
|
||||
}
|
||||
|
||||
public Map<String, Object> health() {
|
||||
return getForMap("/health");
|
||||
}
|
||||
|
||||
public Map<String, Object> heartbeat() {
|
||||
return getForMap("/heartbeat");
|
||||
}
|
||||
|
||||
public TableSchemaResponse tableSchema(String tableType, String tableName) {
|
||||
return postForObject("/table-schema", new TableSchemaRequest(tableType, tableName), TableSchemaResponse.class);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse executeSql(String tableType, String sql, Map<String, Object> params) {
|
||||
return postForObject("/execute-sql", new ExecuteSqlRequest(tableType, sql, params), ExecuteSqlResponse.class);
|
||||
}
|
||||
|
||||
public <T> T get(String path, Class<T> responseType) {
|
||||
return restTemplate.getForObject(buildUri(path), responseType);
|
||||
}
|
||||
|
||||
public <T> T get(String path, Map<String, ?> queryParams, Class<T> responseType) {
|
||||
URI uri = UriComponentsBuilder.fromHttpUrl(normalizeBaseUrl())
|
||||
.path(normalizePath(path))
|
||||
.queryParams(convertToQueryParams(queryParams))
|
||||
.build(true)
|
||||
.toUri();
|
||||
return restTemplate.getForObject(uri, responseType);
|
||||
}
|
||||
|
||||
public <T, R> T post(String path, R requestBody, Class<T> responseType) {
|
||||
return restTemplate.postForObject(buildUri(path), requestBody, responseType);
|
||||
}
|
||||
|
||||
public static class TableSchemaRequest {
|
||||
@JsonProperty("table_type")
|
||||
private String tableType;
|
||||
@JsonProperty("table_name")
|
||||
private String tableName;
|
||||
|
||||
public TableSchemaRequest() {
|
||||
}
|
||||
|
||||
public TableSchemaRequest(String tableType, String tableName) {
|
||||
this.tableType = tableType;
|
||||
this.tableName = tableName;
|
||||
}
|
||||
|
||||
public String getTableType() {
|
||||
return tableType;
|
||||
}
|
||||
|
||||
public void setTableType(String tableType) {
|
||||
this.tableType = tableType;
|
||||
}
|
||||
|
||||
public String getTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
public void setTableName(String tableName) {
|
||||
this.tableName = tableName;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ExecuteSqlRequest {
|
||||
@JsonProperty("table_type")
|
||||
private String tableType;
|
||||
private String sql;
|
||||
private Map<String, Object> params;
|
||||
|
||||
public ExecuteSqlRequest() {
|
||||
}
|
||||
|
||||
public ExecuteSqlRequest(String tableType, String sql, Map<String, Object> params) {
|
||||
this.tableType = tableType;
|
||||
this.sql = sql;
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
public String getTableType() {
|
||||
return tableType;
|
||||
}
|
||||
|
||||
public void setTableType(String tableType) {
|
||||
this.tableType = tableType;
|
||||
}
|
||||
|
||||
public String getSql() {
|
||||
return sql;
|
||||
}
|
||||
|
||||
public void setSql(String sql) {
|
||||
this.sql = sql;
|
||||
}
|
||||
|
||||
public Map<String, Object> getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public void setParams(Map<String, Object> params) {
|
||||
this.params = params;
|
||||
}
|
||||
}
|
||||
|
||||
public static class TableSchemaResponse {
|
||||
private String tableType;
|
||||
private String tableName;
|
||||
private Schema schema;
|
||||
|
||||
public String getTableType() {
|
||||
return tableType;
|
||||
}
|
||||
|
||||
public void setTableType(String tableType) {
|
||||
this.tableType = tableType;
|
||||
}
|
||||
|
||||
public String getTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
public void setTableName(String tableName) {
|
||||
this.tableName = tableName;
|
||||
}
|
||||
|
||||
public Schema getSchema() {
|
||||
return schema;
|
||||
}
|
||||
|
||||
public void setSchema(Schema schema) {
|
||||
this.schema = schema;
|
||||
}
|
||||
|
||||
public static class Schema {
|
||||
private List<Column> columns = Collections.emptyList();
|
||||
|
||||
public List<Column> getColumns() {
|
||||
return columns;
|
||||
}
|
||||
|
||||
public void setColumns(List<Column> columns) {
|
||||
this.columns = columns;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Column {
|
||||
private String name;
|
||||
private String type;
|
||||
private boolean nullable;
|
||||
private Object defaultValue;
|
||||
private boolean primaryKey;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isNullable() {
|
||||
return nullable;
|
||||
}
|
||||
|
||||
public void setNullable(boolean nullable) {
|
||||
this.nullable = nullable;
|
||||
}
|
||||
|
||||
public Object getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
public void setDefaultValue(Object defaultValue) {
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public boolean isPrimaryKey() {
|
||||
return primaryKey;
|
||||
}
|
||||
|
||||
public void setPrimaryKey(boolean primaryKey) {
|
||||
this.primaryKey = primaryKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class ExecuteSqlResponse {
|
||||
private String tableType;
|
||||
private String resultType;
|
||||
private Integer rowCount;
|
||||
private Object result;
|
||||
|
||||
public String getTableType() {
|
||||
return tableType;
|
||||
}
|
||||
|
||||
public void setTableType(String tableType) {
|
||||
this.tableType = tableType;
|
||||
}
|
||||
|
||||
public String getResultType() {
|
||||
return resultType;
|
||||
}
|
||||
|
||||
public void setResultType(String resultType) {
|
||||
this.resultType = resultType;
|
||||
}
|
||||
|
||||
public Integer getRowCount() {
|
||||
return rowCount;
|
||||
}
|
||||
|
||||
public void setRowCount(Integer rowCount) {
|
||||
this.rowCount = rowCount;
|
||||
}
|
||||
|
||||
public Object getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(Object result) {
|
||||
this.result = result;
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> getForMap(String path) {
|
||||
ResponseEntity<Map> responseEntity = restTemplate.exchange(buildUri(path), HttpMethod.GET, HttpEntity.EMPTY, Map.class);
|
||||
Map<String, Object> body = responseEntity.getBody();
|
||||
return body == null ? Collections.emptyMap() : body;
|
||||
}
|
||||
|
||||
private <T> T postForObject(String path, Object requestBody, Class<T> responseType) {
|
||||
return restTemplate.postForObject(buildUri(path), requestBody, responseType);
|
||||
}
|
||||
|
||||
private URI buildUri(String path) {
|
||||
return UriComponentsBuilder.fromHttpUrl(normalizeBaseUrl())
|
||||
.path(normalizePath(path))
|
||||
.build(true)
|
||||
.toUri();
|
||||
}
|
||||
|
||||
private String normalizeBaseUrl() {
|
||||
if (properties.getBaseUrl() != null && properties.getBaseUrl().trim().length() > 0) {
|
||||
return properties.getBaseUrl();
|
||||
}
|
||||
if (properties.getHost() == null || properties.getHost().trim().length() == 0 || properties.getPort() == null) {
|
||||
throw new IllegalStateException("sql-server-api 配置缺失,请检查 host/port/base-url");
|
||||
}
|
||||
return "http://" + properties.getHost() + ":" + properties.getPort();
|
||||
}
|
||||
|
||||
private String normalizePath(String path) {
|
||||
if (path == null || path.trim().length() == 0) {
|
||||
return "";
|
||||
}
|
||||
return path.startsWith("/") ? path : "/" + path;
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanByCoilId(String coilId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PDI_PLAN where COILID = :coilId",
|
||||
singletonParam("coilId", coilId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanList(int page, int pageSize) {
|
||||
int endRow = page * pageSize;
|
||||
int startRow = endRow - pageSize;
|
||||
Map<String, Object> params = new java.util.HashMap<>();
|
||||
params.put("startRow", startRow);
|
||||
params.put("endRow", endRow);
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from (select t.*, ROWNUM rn from (select * from JXPLTCM.PLTCM_PDI_PLAN order by INSDATE desc) t where ROWNUM <= :endRow) where rn > :startRow",
|
||||
params
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanCount() {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select count(*) as total from JXPLTCM.PLTCM_PDI_PLAN",
|
||||
emptyParams()
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanListByProcessCode(String processCode) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PDI_PLAN where PROCESS_CODE = :processCode order by INSDATE desc",
|
||||
singletonParam("processCode", processCode)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanListByStatus(String status) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PDI_PLAN where STATUS = :status order by INSDATE desc",
|
||||
singletonParam("status", status)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryPlanByHotCoilId(String hotCoilId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PDI_PLAN where HOT_COILID = :hotCoilId",
|
||||
singletonParam("hotCoilId", hotCoilId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryProSegByEncoilId(String encoilId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PRO_SEG where ENCOILID = :encoilId order by SEGNO",
|
||||
singletonParam("encoilId", encoilId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryProSegByExcoilId(String excoilId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.PLTCM_PRO_SEG where EXCOILID = :excoilId order by SEGNO",
|
||||
singletonParam("excoilId", excoilId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryQualityByExcoilId(String excoilId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.V_PLTCM_PDO_QUALITY where EXCOILID = :excoilId order by END_DATE desc",
|
||||
singletonParam("excoilId", excoilId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryGaugeByMatId(String matId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.V_VBDA_GAUGE where MATID = :matId order by XTIME asc",
|
||||
singletonParam("matId", matId)
|
||||
);
|
||||
}
|
||||
|
||||
public ExecuteSqlResponse queryShapeByMatId(String matId) {
|
||||
return executeSql(
|
||||
"oracle",
|
||||
"select * from JXPLTCM.V_VBDA_SHAPE where MATID = :matId order by XTIME asc",
|
||||
singletonParam("matId", matId)
|
||||
);
|
||||
}
|
||||
|
||||
private org.springframework.util.MultiValueMap<String, String> convertToQueryParams(Map<String, ?> queryParams) {
|
||||
org.springframework.util.LinkedMultiValueMap<String, String> multiValueMap = new org.springframework.util.LinkedMultiValueMap<>();
|
||||
if (queryParams == null || queryParams.isEmpty()) {
|
||||
return multiValueMap;
|
||||
}
|
||||
for (Map.Entry<String, ?> entry : queryParams.entrySet()) {
|
||||
Object value = entry.getValue();
|
||||
if (value != null) {
|
||||
multiValueMap.add(entry.getKey(), String.valueOf(value));
|
||||
}
|
||||
}
|
||||
return multiValueMap;
|
||||
}
|
||||
|
||||
private Map<String, Object> singletonParam(String key, Object value) {
|
||||
java.util.HashMap<String, Object> params = new java.util.HashMap<String, Object>();
|
||||
if (value != null) {
|
||||
params.put(key, value);
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
private Map<String, Object> emptyParams() {
|
||||
return new java.util.HashMap<String, Object>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.klp.framework.config;
|
||||
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
/**
|
||||
* sql-server-api HTTP 客户端配置
|
||||
*/
|
||||
@Configuration
|
||||
public class SqlServerApiClientConfig {
|
||||
|
||||
@Bean
|
||||
public RestTemplate sqlServerApiRestTemplate(RestTemplateBuilder builder) {
|
||||
return builder
|
||||
.setConnectTimeout(Duration.ofSeconds(5))
|
||||
.setReadTimeout(Duration.ofSeconds(60))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.klp.framework.config;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* sql-server-api 中间件配置
|
||||
*/
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "sql-server-api")
|
||||
public class SqlServerApiProperties {
|
||||
|
||||
/**
|
||||
* 请求地址
|
||||
*/
|
||||
private String host;
|
||||
|
||||
/**
|
||||
* 请求端口
|
||||
*/
|
||||
private Integer port;
|
||||
|
||||
/**
|
||||
* 基础访问地址
|
||||
*/
|
||||
private String baseUrl;
|
||||
|
||||
public String getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public void setHost(String host) {
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
public Integer getPort() {
|
||||
return port;
|
||||
}
|
||||
|
||||
public void setPort(Integer port) {
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public String getBaseUrl() {
|
||||
return baseUrl;
|
||||
}
|
||||
|
||||
public void setBaseUrl(String baseUrl) {
|
||||
this.baseUrl = baseUrl;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,318 @@
|
||||
package com.klp.framework.service;
|
||||
|
||||
import com.klp.framework.client.SqlServerApiClient;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 面向业务场景的 sql-server-api 查询服务。
|
||||
* <p>
|
||||
* 当前抽象为三个功能:
|
||||
* <ol>
|
||||
* <li>计划查询</li>
|
||||
* <li>钢卷实际 / SEG 查询</li>
|
||||
* <li>实时数据(Gauge / Shape)查询</li>
|
||||
* </ol>
|
||||
*/
|
||||
@Service
|
||||
public class SqlServerApiBusinessService {
|
||||
|
||||
private final SqlServerApiClient client;
|
||||
|
||||
public SqlServerApiBusinessService(SqlServerApiClient client) {
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划列表(分页):按时间倒序,page 从 1 开始。
|
||||
*/
|
||||
public PlanListView getPlanList(int page, int pageSize) {
|
||||
return PlanListView.fromExecuteSqlResponse(client.queryPlanList(page, pageSize));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划总数。
|
||||
*/
|
||||
public long getPlanCount() {
|
||||
SqlServerApiClient.ExecuteSqlResponse resp = client.queryPlanCount();
|
||||
List<Map<String, Object>> rows = asRowList(resp);
|
||||
if (rows.isEmpty()) {
|
||||
return 0L;
|
||||
}
|
||||
Object total = rows.get(0).get("total");
|
||||
Number n = asNumber(total);
|
||||
return n == null ? 0L : n.longValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划列表:按工艺流程编码筛选。
|
||||
*/
|
||||
public PlanListView getPlanListByProcessCode(String processCode) {
|
||||
return PlanListView.fromExecuteSqlResponse(client.queryPlanListByProcessCode(processCode));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划列表:按状态筛选。
|
||||
*/
|
||||
public PlanListView getPlanListByStatus(String status) {
|
||||
return PlanListView.fromExecuteSqlResponse(client.queryPlanListByStatus(status));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划详情:按成品卷号查询单条计划。
|
||||
*/
|
||||
public PlanDetailView getPlanByCoilId(String coilId) {
|
||||
return PlanDetailView.fromExecuteSqlResponse(coilId, client.queryPlanByCoilId(coilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划详情:按热卷号查询。
|
||||
*/
|
||||
public PlanDetailView getPlanByHotCoilId(String hotCoilId) {
|
||||
return PlanDetailView.fromExecuteSqlResponse(hotCoilId, client.queryPlanByHotCoilId(hotCoilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 钢卷实际 SEG 查询:按入口卷号查询。
|
||||
* <p>
|
||||
* 返回的是按 SEGNO 排序后的原始行数据。
|
||||
*/
|
||||
public SegSeriesView getSegByEncoilId(String encoilId) {
|
||||
return SegSeriesView.fromExecuteSqlResponse(encoilId, client.queryProSegByEncoilId(encoilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 钢卷实际 SEG 查询:按出口卷号查询。
|
||||
*/
|
||||
public SegSeriesView getSegByExcoilId(String excoilId) {
|
||||
return SegSeriesView.fromExecuteSqlResponse(excoilId, client.queryProSegByExcoilId(excoilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 钢卷 SEG 视图数据:把同一钢卷下按 SEGNO 排序的多行数据,整理成“一个钢卷 id + 一个属性对应一个列表”的结构。
|
||||
* <p>
|
||||
* 例如:厚度、张力、速度都会被整理成数组,方便前端直接画表或曲线。
|
||||
*/
|
||||
public SegSeriesView getSegSeriesViewByEncoilId(String encoilId) {
|
||||
return getSegByEncoilId(encoilId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时数据:厚度/仪表数据。
|
||||
*/
|
||||
public SqlServerApiClient.ExecuteSqlResponse getRealtimeGaugeByMatId(String matId) {
|
||||
return client.queryGaugeByMatId(matId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时数据:板形/形状数据。
|
||||
*/
|
||||
public SqlServerApiClient.ExecuteSqlResponse getRealtimeShapeByMatId(String matId) {
|
||||
return client.queryShapeByMatId(matId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时数据总入口:一次性返回厚度与板形两类数据。
|
||||
*/
|
||||
public RealtimeDataBundle getRealtimeData(String matId) {
|
||||
return new RealtimeDataBundle(
|
||||
getRealtimeGaugeByMatId(matId),
|
||||
getRealtimeShapeByMatId(matId)
|
||||
);
|
||||
}
|
||||
|
||||
private static PlanListView toPlanListView(SqlServerApiClient.ExecuteSqlResponse response) {
|
||||
return PlanListView.fromExecuteSqlResponse(response);
|
||||
}
|
||||
|
||||
private static List<Map<String, Object>> asRowList(SqlServerApiClient.ExecuteSqlResponse response) {
|
||||
if (response == null || response.getResult() == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Object result = response.getResult();
|
||||
if (result instanceof List) {
|
||||
List<?> list = (List<?>) result;
|
||||
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
|
||||
for (Object item : list) {
|
||||
if (item instanceof Map) {
|
||||
rows.add((Map<String, Object>) item);
|
||||
}
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
private static Number asNumber(Object value) {
|
||||
if (value instanceof Number) {
|
||||
return (Number) value;
|
||||
}
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return new BigDecimal(String.valueOf(value));
|
||||
} catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static String asString(Object value) {
|
||||
return value == null ? null : String.valueOf(value);
|
||||
}
|
||||
|
||||
public static class PlanListView {
|
||||
private final List<String> coilIds;
|
||||
private final List<Map<String, Object>> rows;
|
||||
|
||||
public PlanListView(List<String> coilIds, List<Map<String, Object>> rows) {
|
||||
this.coilIds = coilIds;
|
||||
this.rows = rows;
|
||||
}
|
||||
|
||||
public List<String> getCoilIds() {
|
||||
return coilIds;
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
public static PlanListView fromExecuteSqlResponse(SqlServerApiClient.ExecuteSqlResponse response) {
|
||||
List<Map<String, Object>> rows = asRowList(response);
|
||||
List<String> coilIds = rows.stream()
|
||||
.map(row -> asString(row.get("COILID")))
|
||||
.filter(value -> value != null && value.trim().length() > 0)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
return new PlanListView(coilIds, rows);
|
||||
}
|
||||
}
|
||||
|
||||
public static class PlanDetailView {
|
||||
private final String coilId;
|
||||
private final List<Map<String, Object>> rows;
|
||||
private final Map<String, Object> firstRow;
|
||||
|
||||
public PlanDetailView(String coilId, List<Map<String, Object>> rows, Map<String, Object> firstRow) {
|
||||
this.coilId = coilId;
|
||||
this.rows = rows;
|
||||
this.firstRow = firstRow;
|
||||
}
|
||||
|
||||
public String getCoilId() {
|
||||
return coilId;
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
public Map<String, Object> getFirstRow() {
|
||||
return firstRow;
|
||||
}
|
||||
|
||||
public static PlanDetailView fromExecuteSqlResponse(String coilId, SqlServerApiClient.ExecuteSqlResponse response) {
|
||||
List<Map<String, Object>> rows = asRowList(response);
|
||||
Map<String, Object> firstRow = rows.isEmpty() ? Collections.<String, Object>emptyMap() : rows.get(0);
|
||||
return new PlanDetailView(coilId, rows, firstRow);
|
||||
}
|
||||
}
|
||||
|
||||
public static class SegSeriesView {
|
||||
private final String coilId;
|
||||
private final List<Integer> segNo;
|
||||
private final Map<String, List<Object>> series;
|
||||
private final List<Map<String, Object>> rows;
|
||||
|
||||
public SegSeriesView(String coilId, List<Integer> segNo, Map<String, List<Object>> series, List<Map<String, Object>> rows) {
|
||||
this.coilId = coilId;
|
||||
this.segNo = segNo;
|
||||
this.series = series;
|
||||
this.rows = rows;
|
||||
}
|
||||
|
||||
public String getCoilId() {
|
||||
return coilId;
|
||||
}
|
||||
|
||||
public List<Integer> getSegNo() {
|
||||
return segNo;
|
||||
}
|
||||
|
||||
public Map<String, List<Object>> getSeries() {
|
||||
return series;
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static SegSeriesView fromExecuteSqlResponse(String coilId, SqlServerApiClient.ExecuteSqlResponse response) {
|
||||
List<Map<String, Object>> rows = asRowList(response);
|
||||
Collections.sort(rows, new Comparator<Map<String, Object>>() {
|
||||
@Override
|
||||
public int compare(Map<String, Object> left, Map<String, Object> right) {
|
||||
Number leftSeg = asNumber(left.get("SEGNO"));
|
||||
Number rightSeg = asNumber(right.get("SEGNO"));
|
||||
int leftValue = leftSeg == null ? Integer.MAX_VALUE : leftSeg.intValue();
|
||||
int rightValue = rightSeg == null ? Integer.MAX_VALUE : rightSeg.intValue();
|
||||
if (leftValue > rightValue) {
|
||||
return 1;
|
||||
}
|
||||
if (leftValue < rightValue) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
|
||||
List<Integer> segNo = new ArrayList<Integer>();
|
||||
for (Map<String, Object> row : rows) {
|
||||
Number seg = asNumber(row.get("SEGNO"));
|
||||
segNo.add(seg == null ? null : seg.intValue());
|
||||
}
|
||||
|
||||
Map<String, List<Object>> series = new LinkedHashMap<String, List<Object>>();
|
||||
for (Map<String, Object> row : rows) {
|
||||
for (Map.Entry<String, Object> entry : row.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
if ("SEGNO".equalsIgnoreCase(key)) {
|
||||
continue;
|
||||
}
|
||||
series.computeIfAbsent(key, ignored -> new ArrayList<>()).add(entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
return new SegSeriesView(coilId, segNo, series, rows);
|
||||
}
|
||||
}
|
||||
|
||||
public static class RealtimeDataBundle {
|
||||
private final SqlServerApiClient.ExecuteSqlResponse gauge;
|
||||
private final SqlServerApiClient.ExecuteSqlResponse shape;
|
||||
|
||||
public RealtimeDataBundle(SqlServerApiClient.ExecuteSqlResponse gauge,
|
||||
SqlServerApiClient.ExecuteSqlResponse shape) {
|
||||
this.gauge = gauge;
|
||||
this.shape = shape;
|
||||
}
|
||||
|
||||
public SqlServerApiClient.ExecuteSqlResponse getGauge() {
|
||||
return gauge;
|
||||
}
|
||||
|
||||
public SqlServerApiClient.ExecuteSqlResponse getShape() {
|
||||
return shape;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.klp.framework.sqlserver;
|
||||
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.framework.service.SqlServerApiBusinessService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* sql-server-api 业务查询接口。
|
||||
* <p>
|
||||
* 提供计划、SEG、实时数据三个入口,方便前端联动展示。
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/sql-server-api")
|
||||
public class SqlServerApiController {
|
||||
|
||||
private final SqlServerApiBusinessService businessService;
|
||||
|
||||
/**
|
||||
* 计划列表(分页)。
|
||||
* page 从 1 开始,默认第 1 页,每页 20 条。
|
||||
*/
|
||||
@GetMapping("/plans")
|
||||
public R<SqlServerApiBusinessService.PlanListView> planList(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
return R.ok(businessService.getPlanList(page, pageSize));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划总数,用于前端分页器。
|
||||
*/
|
||||
@GetMapping("/plans/count")
|
||||
public R<Map<String, Long>> planCount() {
|
||||
Map<String, Long> result = new HashMap<>();
|
||||
result.put("total", businessService.getPlanCount());
|
||||
return R.ok(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计划详情。
|
||||
*/
|
||||
@GetMapping("/plans/{coilId}")
|
||||
public R<SqlServerApiBusinessService.PlanDetailView> planDetail(@PathVariable String coilId) {
|
||||
return R.ok(businessService.getPlanByCoilId(coilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 钢卷实际 SEG,按入口卷号查询。
|
||||
*/
|
||||
@GetMapping("/seg/{encoilId}")
|
||||
public R<SqlServerApiBusinessService.SegSeriesView> segByEncoilId(@PathVariable String encoilId) {
|
||||
return R.ok(businessService.getSegSeriesViewByEncoilId(encoilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 钢卷实际 SEG,按出口卷号查询。
|
||||
*/
|
||||
@GetMapping("/seg-by-excoil/{excoilId}")
|
||||
public R<SqlServerApiBusinessService.SegSeriesView> segByExcoilId(@PathVariable String excoilId) {
|
||||
return R.ok(businessService.getSegByExcoilId(excoilId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时数据:厚度、板形。
|
||||
*/
|
||||
@GetMapping("/realtime/{matId}")
|
||||
public R<SqlServerApiBusinessService.RealtimeDataBundle> realtime(@PathVariable String matId) {
|
||||
return R.ok(businessService.getRealtimeData(matId));
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,6 @@ public class SysConfigController extends BaseController {
|
||||
/**
|
||||
* 根据参数键名修改参数配置
|
||||
*/
|
||||
@SaCheckPermission("system:config:edit")
|
||||
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
|
||||
@PutMapping("/updateByKey")
|
||||
public R<Void> updateByKey(@RequestBody SysConfig config) {
|
||||
|
||||
@@ -11,7 +11,6 @@ import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.system.service.ISysDictDataService;
|
||||
import com.klp.system.service.ISysDictTypeService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@@ -32,7 +31,6 @@ import java.util.List;
|
||||
public class SysDictDataController extends BaseController {
|
||||
|
||||
private final ISysDictDataService dictDataService;
|
||||
private final ISysDictTypeService dictTypeService;
|
||||
|
||||
/**
|
||||
* 查询字典数据列表
|
||||
@@ -72,7 +70,7 @@ public class SysDictDataController extends BaseController {
|
||||
*/
|
||||
@GetMapping(value = "/type/{dictType}")
|
||||
public R<List<SysDictData>> dictType(@PathVariable("dictType") String dictType) {
|
||||
List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
|
||||
List<SysDictData> data = dictDataService.selectDictDataByTypeRealtime(dictType);
|
||||
if (ObjectUtil.isNull(data)) {
|
||||
data = new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -50,6 +50,14 @@ public class SysDictTypeController extends BaseController {
|
||||
ExcelUtil.exportExcel(list, "字典类型", SysDictType.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按字典类型编码精确查询(避免 /list 条件对 dict_type 使用 LIKE 时下划线通配问题;供页内齿轮等使用)
|
||||
*/
|
||||
@GetMapping("/byType/{dictType}")
|
||||
public R<SysDictType> getByDictType(@PathVariable String dictType) {
|
||||
return R.ok(dictTypeService.selectDictTypeByType(dictType));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询字典类型详细
|
||||
*
|
||||
|
||||
@@ -7,6 +7,12 @@ klp:
|
||||
# 开发环境文件存储目录
|
||||
directory-path: testDirectory
|
||||
|
||||
--- # sql-server-api 中间件配置(开发/测试环境)
|
||||
sql-server-api:
|
||||
host: 140.143.206.120
|
||||
port: 15000
|
||||
base-url: http://${sql-server-api.host}:${sql-server-api.port}
|
||||
|
||||
--- # OEE 聚合(klp-da)多服务地址配置
|
||||
da:
|
||||
oee:
|
||||
@@ -92,14 +98,17 @@ spring:
|
||||
url: jdbc:mysql://140.143.206.120:3306/cgldb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||
username: klp
|
||||
password: KeLunPu123@
|
||||
# oracle:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: oracle.jdbc.OracleDriver
|
||||
# url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||
# username: ROOT
|
||||
# password: root
|
||||
# hikari:
|
||||
# connectionTestQuery: SELECT 1 FROM DUAL
|
||||
# Oracle 数据源
|
||||
acid-l2:
|
||||
lazy: true
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: oracle.jdbc.OracleDriver
|
||||
# 示例:jdbc:oracle:thin:@//localhost:1521/XE
|
||||
url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||
username: ROOT
|
||||
password: root
|
||||
hikari:
|
||||
connectionTestQuery: SELECT 1 FROM DUAL
|
||||
# postgres:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: org.postgresql.Driver
|
||||
|
||||
@@ -7,6 +7,12 @@ klp:
|
||||
# 生产环境文件存储目录
|
||||
directory-path: /home/ubuntu/oa/folder
|
||||
|
||||
--- # sql-server-api 中间件配置(生产环境)
|
||||
sql-server-api:
|
||||
host: 140.143.206.120
|
||||
port: 15000
|
||||
base-url: http://${sql-server-api.host}:${sql-server-api.port}
|
||||
|
||||
--- # OEE 聚合(klp-da)多服务地址配置
|
||||
da:
|
||||
oee:
|
||||
@@ -86,14 +92,17 @@ spring:
|
||||
url: jdbc:mysql://140.143.206.120:3306/cgldb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||
username: klp
|
||||
password: KeLunPu123@
|
||||
# oracle:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: oracle.jdbc.OracleDriver
|
||||
# url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||
# username: ROOT
|
||||
# password: root
|
||||
# hikari:
|
||||
# connectionTestQuery: SELECT 1 FROM DUAL
|
||||
# Oracle 数据源
|
||||
acid-l2:
|
||||
lazy: true
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: oracle.jdbc.OracleDriver
|
||||
# 示例:jdbc:oracle:thin:@//localhost:1521/XE
|
||||
url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||
username: ROOT
|
||||
password: root
|
||||
hikari:
|
||||
connectionTestQuery: SELECT 1 FROM DUAL
|
||||
# postgres:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: org.postgresql.Driver
|
||||
|
||||
@@ -53,7 +53,7 @@ server:
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.klp: @logging.level@
|
||||
com.klp: warn
|
||||
org.springframework: warn
|
||||
config: classpath:logback-plus.xml
|
||||
|
||||
@@ -65,6 +65,7 @@ user:
|
||||
# 密码锁定时间(默认10分钟)
|
||||
lockTime: 10
|
||||
|
||||
# sql-server-api 中间件配置
|
||||
# Spring配置
|
||||
spring:
|
||||
application:
|
||||
@@ -154,7 +155,7 @@ security:
|
||||
- /test/**
|
||||
- /klp/generateRecord
|
||||
- /klp/generateRecord/**
|
||||
|
||||
- /wms/coilPendingAction/**
|
||||
# 测接口
|
||||
# - /ems/energyConsumption
|
||||
# - /ems/energyConsumption/**
|
||||
@@ -260,8 +261,8 @@ springdoc:
|
||||
xss:
|
||||
# 过滤开关
|
||||
enabled: true
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice,/system/dict/data
|
||||
# 匹配链接
|
||||
urlPatterns: /system/*,/monitor/*,/tool/*
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 冷轧涂镀数智运营 - 规程主表
|
||||
CREATE TABLE wms_process_spec (
|
||||
spec_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
spec_code VARCHAR(64) NOT NULL COMMENT '规程编号',
|
||||
spec_name VARCHAR(200) NOT NULL COMMENT '规程名称',
|
||||
spec_type VARCHAR(32) NOT NULL DEFAULT 'PROCESS' COMMENT '类型(PROCESS=工艺规程,STANDARD=标准)',
|
||||
line_id BIGINT NOT NULL COMMENT '产线ID',
|
||||
product_type VARCHAR(100) NULL COMMENT '产品类型',
|
||||
is_enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用(0否1是)',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除,与全局逻辑删除配置一致)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (spec_id),
|
||||
UNIQUE KEY uk_wms_process_spec_code (spec_code),
|
||||
KEY idx_wms_process_spec_line (line_id),
|
||||
KEY idx_wms_process_spec_type (spec_type)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规程主表';
|
||||
@@ -0,0 +1,39 @@
|
||||
-- 规程版本表
|
||||
CREATE TABLE wms_process_spec_version (
|
||||
version_id BIGINT NOT NULL COMMENT '主键',
|
||||
spec_id BIGINT NOT NULL COMMENT '规程主表ID',
|
||||
version_code VARCHAR(64) NOT NULL COMMENT '版本号',
|
||||
is_active TINYINT NOT NULL DEFAULT 0 COMMENT '是否当前生效(0否1是)',
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '状态(DRAFT草稿/PUBLISHED已发布/OBSOLETE作废等)',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (version_id),
|
||||
UNIQUE KEY uk_spec_version_code (spec_id, version_code),
|
||||
KEY idx_spec_version_spec (spec_id),
|
||||
KEY idx_spec_version_active (spec_id, is_active)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规程版本表';
|
||||
|
||||
-- 方案点位表
|
||||
CREATE TABLE wms_process_plan (
|
||||
plan_id BIGINT NOT NULL COMMENT '主键',
|
||||
version_id BIGINT NOT NULL COMMENT '规程版本ID',
|
||||
segment_type VARCHAR(32) NOT NULL COMMENT '段类型(INLET/PROCESS/OUTLET)',
|
||||
segment_name VARCHAR(100) NULL COMMENT '段名称',
|
||||
point_name VARCHAR(200) NOT NULL COMMENT '点位名称',
|
||||
point_code VARCHAR(64) NOT NULL COMMENT '点位编码',
|
||||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (plan_id),
|
||||
UNIQUE KEY uk_plan_version_point_code (version_id, point_code),
|
||||
KEY idx_plan_version (version_id),
|
||||
KEY idx_plan_sort (version_id, sort_order)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案点位表';
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 方案参数表
|
||||
CREATE TABLE wms_process_plan_param (
|
||||
param_id BIGINT NOT NULL COMMENT '主键',
|
||||
plan_id BIGINT NOT NULL COMMENT '方案点位ID',
|
||||
param_code VARCHAR(64) NOT NULL COMMENT '参数编码',
|
||||
param_name VARCHAR(200) NOT NULL COMMENT '参数名称',
|
||||
target_value DECIMAL(24, 6) NULL COMMENT '设定值',
|
||||
lower_limit DECIMAL(24, 6) NULL COMMENT '下限',
|
||||
upper_limit DECIMAL(24, 6) NULL COMMENT '上限',
|
||||
unit VARCHAR(32) NULL COMMENT '单位',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (param_id),
|
||||
UNIQUE KEY uk_plan_param_code (plan_id, param_code),
|
||||
KEY idx_plan_param_plan (plan_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案参数表';
|
||||
@@ -21,6 +21,7 @@ import com.klp.aps.domain.vo.ApsPlanDetailVo;
|
||||
import com.klp.aps.domain.bo.ApsPlanDetailBo;
|
||||
import com.klp.aps.service.IApsPlanDetailService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
|
||||
/**
|
||||
* 排产单明细
|
||||
@@ -96,4 +97,11 @@ public class ApsPlanDetailController extends BaseController {
|
||||
@PathVariable Long[] planDetailIds) {
|
||||
return toAjax(iApsPlanDetailService.deleteWithValidByIds(Arrays.asList(planDetailIds), true));
|
||||
}
|
||||
|
||||
// 根据排产单ID查询排产日期以及明细绑定的orderId,再根据这个orderId和排查时间查询返回钢卷
|
||||
@GetMapping("/coils/{planSheetId}")
|
||||
public R<List<WmsMaterialCoilVo>> getCoilsByPlanSheetId(@NotNull(message = "排产单ID不能为空")
|
||||
@PathVariable Long planSheetId) {
|
||||
return R.ok(iApsPlanDetailService.queryCoilsByPlanSheetId(planSheetId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
@@ -31,6 +32,11 @@ public class ApsPlanDetailBo extends BaseEntity {
|
||||
*/
|
||||
private Long planSheetId;
|
||||
|
||||
/**
|
||||
* 关联排产单ID列表(用于批量查询)
|
||||
*/
|
||||
private List<Long> planSheetIds;
|
||||
|
||||
/**
|
||||
* 内容序号
|
||||
*/
|
||||
|
||||
@@ -18,5 +18,5 @@ import java.util.List;
|
||||
*/
|
||||
public interface ApsPlanSheetMapper extends BaseMapperPlus<ApsPlanSheetMapper, ApsPlanSheet, ApsPlanSheetVo> {
|
||||
|
||||
List<ApsPlanSheetRowVo> selectList(ApsPlanSheetQueryReq req);
|
||||
List<ApsPlanSheetRowVo> selectListByReq(ApsPlanSheetQueryReq req);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import com.klp.common.core.domain.PageQuery;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
|
||||
/**
|
||||
* 排产单明细Service接口
|
||||
*
|
||||
@@ -31,6 +33,11 @@ public interface IApsPlanDetailService {
|
||||
*/
|
||||
List<ApsPlanDetailVo> queryList(ApsPlanDetailBo bo);
|
||||
|
||||
/**
|
||||
* 根据排产单ID列表查询明细
|
||||
*/
|
||||
List<ApsPlanDetailVo> queryListByPlanSheetIds(List<Long> planSheetIds);
|
||||
|
||||
/**
|
||||
* 新增排产单明细
|
||||
*/
|
||||
@@ -50,4 +57,12 @@ public interface IApsPlanDetailService {
|
||||
* 根据排产单ID删除明细
|
||||
*/
|
||||
int deleteByPlanSheetIds(Collection<Long> planSheetIds);
|
||||
|
||||
/**
|
||||
* 根据排产单ID查询关联的钢卷列表(根据计划日期筛选钢卷创建时间)
|
||||
*
|
||||
* @param planSheetId 排产单ID
|
||||
* @return 钢卷列表
|
||||
*/
|
||||
List<WmsMaterialCoilVo> queryCoilsByPlanSheetId(Long planSheetId);
|
||||
}
|
||||
|
||||
@@ -8,17 +8,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.domain.vo.WmsCoilContractRelVo;
|
||||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||||
import com.klp.mapper.WmsCoilContractRelMapper;
|
||||
import com.klp.service.IWmsMaterialCoilService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.aps.domain.bo.ApsPlanDetailBo;
|
||||
import com.klp.aps.domain.vo.ApsPlanDetailVo;
|
||||
import com.klp.aps.domain.vo.ApsPlanSheetVo;
|
||||
import com.klp.aps.domain.entity.ApsPlanDetail;
|
||||
import com.klp.aps.mapper.ApsPlanDetailMapper;
|
||||
import com.klp.aps.mapper.ApsPlanSheetMapper;
|
||||
import com.klp.aps.service.IApsPlanDetailService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 排产单明细Service业务层处理
|
||||
@@ -31,6 +38,9 @@ import java.util.Collection;
|
||||
public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
|
||||
|
||||
private final ApsPlanDetailMapper baseMapper;
|
||||
private final ApsPlanSheetMapper planSheetMapper;
|
||||
private final WmsCoilContractRelMapper coilContractRelMapper;
|
||||
private final IWmsMaterialCoilService materialCoilService;
|
||||
|
||||
/**
|
||||
* 查询排产单明细
|
||||
@@ -105,6 +115,19 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据排产单ID列表查询明细
|
||||
*/
|
||||
@Override
|
||||
public List<ApsPlanDetailVo> queryListByPlanSheetIds(List<Long> planSheetIds) {
|
||||
if (planSheetIds == null || planSheetIds.isEmpty()) {
|
||||
return new java.util.ArrayList<>();
|
||||
}
|
||||
LambdaQueryWrapper<ApsPlanDetail> lqw = Wrappers.lambdaQuery();
|
||||
lqw.in(ApsPlanDetail::getPlanSheetId, planSheetIds);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ApsPlanDetail> buildQueryWrapper(ApsPlanDetailBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ApsPlanDetail> lqw = Wrappers.lambdaQuery();
|
||||
@@ -194,4 +217,84 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
|
||||
public int deleteByPlanSheetIds(Collection<Long> planSheetIds) {
|
||||
return baseMapper.deleteByPlanSheetIds(planSheetIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WmsMaterialCoilVo> queryCoilsByPlanSheetId(Long planSheetId) {
|
||||
if (planSheetId == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
ApsPlanSheetVo planSheet = planSheetMapper.selectVoById(planSheetId);
|
||||
if (planSheet == null || planSheet.getPlanDate() == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Date planDate = planSheet.getPlanDate();
|
||||
|
||||
LambdaQueryWrapper<ApsPlanDetail> detailQw = Wrappers.lambdaQuery();
|
||||
detailQw.eq(ApsPlanDetail::getPlanSheetId, planSheetId);
|
||||
detailQw.eq(ApsPlanDetail::getDelFlag, 0);
|
||||
List<ApsPlanDetailVo> details = baseMapper.selectVoList(detailQw);
|
||||
|
||||
List<Long> orderIds = details.stream()
|
||||
.map(ApsPlanDetailVo::getOrderId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (orderIds.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<WmsCoilContractRel> relQw = Wrappers.lambdaQuery();
|
||||
relQw.in(WmsCoilContractRel::getContractId, orderIds);
|
||||
relQw.eq(WmsCoilContractRel::getDelFlag, 0);
|
||||
List<WmsCoilContractRelVo> coilRels = coilContractRelMapper.selectVoList(relQw);
|
||||
|
||||
Map<Long, List<Long>> coilIdMap = coilRels.stream()
|
||||
.filter(rel -> rel.getContractId() != null && rel.getCoilId() != null)
|
||||
.collect(Collectors.groupingBy(
|
||||
WmsCoilContractRelVo::getContractId,
|
||||
Collectors.mapping(WmsCoilContractRelVo::getCoilId, Collectors.toList())
|
||||
));
|
||||
|
||||
Set<Long> allCoilIds = coilIdMap.values().stream()
|
||||
.flatMap(List::stream)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (allCoilIds.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(allCoilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||
coilBo.setByCreateTimeStart(getStartOfDay(planDate));
|
||||
coilBo.setByCreateTimeEnd(getEndOfDay(planDate));
|
||||
|
||||
return materialCoilService.queryList(coilBo);
|
||||
}
|
||||
|
||||
private Date getStartOfDay(Date date) {
|
||||
if (date == null) {
|
||||
return null;
|
||||
}
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(date);
|
||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||
cal.set(Calendar.MINUTE, 0);
|
||||
cal.set(Calendar.SECOND, 0);
|
||||
cal.set(Calendar.MILLISECOND, 0);
|
||||
return cal.getTime();
|
||||
}
|
||||
|
||||
private Date getEndOfDay(Date date) {
|
||||
if (date == null) {
|
||||
return null;
|
||||
}
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(date);
|
||||
cal.set(Calendar.HOUR_OF_DAY, 23);
|
||||
cal.set(Calendar.MINUTE, 59);
|
||||
cal.set(Calendar.SECOND, 59);
|
||||
cal.set(Calendar.MILLISECOND, 999);
|
||||
return cal.getTime();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ public class ApsPlanSheetServiceImpl implements IApsPlanSheetService {
|
||||
|
||||
// ================== 【核心:前7列自动合并】 ==================
|
||||
int dataEndRow = r - 1;
|
||||
if (dataStartRow <= dataEndRow) {
|
||||
if (dataStartRow <= dataEndRow && dataEndRow > dataStartRow) {
|
||||
for (int col = 0; col < 7; col++) { // 0~6 共7列
|
||||
CellRangeAddress region = new CellRangeAddress(
|
||||
dataStartRow,
|
||||
@@ -318,7 +318,7 @@ public class ApsPlanSheetServiceImpl implements IApsPlanSheetService {
|
||||
}
|
||||
|
||||
private List<ApsPlanSheetRowVo> queryListAll(ApsPlanSheetQueryReq req) {
|
||||
return baseMapper.selectList(req);
|
||||
return baseMapper.selectListByReq(req);
|
||||
}
|
||||
|
||||
private String nvl(Object v, Object fallback) {
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
<select id="selectList" parameterType="com.klp.aps.domain.dto.ApsPlanSheetQueryReq" resultType="com.klp.aps.domain.vo.ApsPlanSheetRowVo">
|
||||
<select id="selectListByReq" parameterType="com.klp.aps.domain.dto.ApsPlanSheetQueryReq" resultType="com.klp.aps.domain.vo.ApsPlanSheetRowVo">
|
||||
SELECT
|
||||
d.plan_detail_id AS detailSheetId,
|
||||
s.plan_date AS planDate,
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
@@ -43,5 +43,9 @@
|
||||
<groupId>com.klp</groupId>
|
||||
<artifactId>klp-wms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.klp</groupId>
|
||||
<artifactId>klp-aps</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
package com.klp.crm.controller;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
|
||||
import com.klp.aps.domain.bo.ApsPlanDetailBo;
|
||||
import com.klp.aps.domain.bo.ApsPlanSheetBo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
@@ -21,6 +26,10 @@ import com.klp.crm.domain.vo.CrmOrderVo;
|
||||
import com.klp.crm.domain.bo.CrmOrderBo;
|
||||
import com.klp.crm.service.ICrmOrderService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.aps.domain.vo.ApsPlanSheetVo;
|
||||
import com.klp.aps.domain.vo.ApsPlanDetailVo;
|
||||
import com.klp.aps.service.IApsPlanSheetService;
|
||||
import com.klp.aps.service.IApsPlanDetailService;
|
||||
|
||||
/**
|
||||
* 正式订单主
|
||||
@@ -35,6 +44,8 @@ import com.klp.common.core.page.TableDataInfo;
|
||||
public class CrmOrderController extends BaseController {
|
||||
|
||||
private final ICrmOrderService iCrmOrderService;
|
||||
private final IApsPlanSheetService iApsPlanSheetService;
|
||||
private final IApsPlanDetailService iApsPlanDetailService;
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
@@ -96,4 +107,54 @@ public class CrmOrderController extends BaseController {
|
||||
@PathVariable String[] orderIds) {
|
||||
return toAjax(iCrmOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询每日订单(根据排产计划获取今天的订单)
|
||||
*
|
||||
* @param planDate 排产日期,默认今天
|
||||
*/
|
||||
@GetMapping("/daily")
|
||||
public R<List<CrmOrderVo>> getDailyOrders(
|
||||
@RequestParam(value = "planDate", required = false)
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd") Date planDate) {
|
||||
if (planDate == null) {
|
||||
planDate = new Date();
|
||||
}
|
||||
// 将日期设置为当天的开始时间 00:00:00
|
||||
java.util.Calendar calendar = java.util.Calendar.getInstance();
|
||||
calendar.setTime(planDate);
|
||||
calendar.set(java.util.Calendar.HOUR_OF_DAY, 0);
|
||||
calendar.set(java.util.Calendar.MINUTE, 0);
|
||||
calendar.set(java.util.Calendar.SECOND, 0);
|
||||
calendar.set(java.util.Calendar.MILLISECOND, 0);
|
||||
planDate = calendar.getTime();
|
||||
|
||||
ApsPlanSheetBo bo = new ApsPlanSheetBo();
|
||||
bo.setPlanDate(planDate);
|
||||
List<ApsPlanSheetVo> planSheetList = iApsPlanSheetService.queryList(bo);
|
||||
if (planSheetList == null || planSheetList.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<Long> planSheetIds = new ArrayList<>();
|
||||
for (ApsPlanSheetVo sheet : planSheetList) {
|
||||
planSheetIds.add(sheet.getPlanSheetId());
|
||||
}
|
||||
ApsPlanDetailBo detailBo = new ApsPlanDetailBo();
|
||||
detailBo.setPlanSheetIds(planSheetIds);
|
||||
List<ApsPlanDetailVo> detailList = iApsPlanDetailService.queryListByPlanSheetIds(planSheetIds);
|
||||
if (detailList == null || detailList.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<Long> orderIds = new ArrayList<>();
|
||||
for (ApsPlanDetailVo detail : detailList) {
|
||||
if (detail.getOrderId() != null) {
|
||||
orderIds.add(detail.getOrderId());
|
||||
}
|
||||
}
|
||||
if (orderIds.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<CrmOrderVo> orders = iCrmOrderService.queryByIds(orderIds);
|
||||
return R.ok(orders);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,6 +185,26 @@ public class CrmOrder extends BaseEntity {
|
||||
*/
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
@@ -206,4 +226,9 @@ public class CrmOrder extends BaseEntity {
|
||||
@TableLogic
|
||||
private Long delFlag;
|
||||
|
||||
/**
|
||||
* 是否置顶 0-否 1-是
|
||||
*/
|
||||
private Integer isTop;
|
||||
|
||||
}
|
||||
|
||||
@@ -72,11 +72,15 @@ public class CrmOrderItem extends BaseEntity {
|
||||
/**
|
||||
* 宽度公差
|
||||
*/
|
||||
private BigDecimal widthTolerance;
|
||||
private String widthTolerance;
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
private BigDecimal thicknessTolerance;
|
||||
private String thicknessTolerance;
|
||||
/**
|
||||
* 表面质量
|
||||
*/
|
||||
private String surfaceQuality;
|
||||
/**
|
||||
* 合同定价
|
||||
*/
|
||||
@@ -93,6 +97,30 @@ public class CrmOrderItem extends BaseEntity {
|
||||
* 排产批次
|
||||
*/
|
||||
private String productionBatch;
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
private String surfaceTreatment;
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
private String edgeCuttingReq;
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
private String packagingReq;
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
private String width;
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
private String thickness;
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
private String purpose;
|
||||
/**
|
||||
* 删除标识 0正常 2删除
|
||||
*/
|
||||
|
||||
@@ -200,6 +200,26 @@ public class CrmOrderBo extends BaseEntity {
|
||||
*/
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
@@ -215,6 +235,11 @@ public class CrmOrderBo extends BaseEntity {
|
||||
*/
|
||||
private String annexFiles;
|
||||
|
||||
/**
|
||||
* 是否置顶 0-否 1-是
|
||||
*/
|
||||
private Integer isTop;
|
||||
|
||||
/**
|
||||
* 关键字搜索
|
||||
*/
|
||||
|
||||
@@ -81,12 +81,17 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
/**
|
||||
* 宽度公差
|
||||
*/
|
||||
private BigDecimal widthTolerance;
|
||||
private String widthTolerance;
|
||||
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
private BigDecimal thicknessTolerance;
|
||||
private String thicknessTolerance;
|
||||
|
||||
/**
|
||||
* 表面质量
|
||||
*/
|
||||
private String surfaceQuality;
|
||||
|
||||
/**
|
||||
* 合同定价
|
||||
@@ -108,5 +113,34 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
*/
|
||||
private String productionBatch;
|
||||
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
private String surfaceTreatment;
|
||||
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
private String edgeCuttingReq;
|
||||
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
private String packagingReq;
|
||||
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
private String width;
|
||||
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
private String thickness;
|
||||
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
private String purpose;
|
||||
|
||||
}
|
||||
|
||||
@@ -99,13 +99,19 @@ public class CrmOrderItemVo {
|
||||
* 宽度公差
|
||||
*/
|
||||
@ExcelProperty(value = "宽度公差")
|
||||
private BigDecimal widthTolerance;
|
||||
private String widthTolerance;
|
||||
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
@ExcelProperty(value = "厚度公差")
|
||||
private BigDecimal thicknessTolerance;
|
||||
private String thicknessTolerance;
|
||||
|
||||
/**
|
||||
* 表面质量
|
||||
*/
|
||||
@ExcelProperty(value = "表面质量")
|
||||
private String surfaceQuality;
|
||||
|
||||
/**
|
||||
* 合同定价
|
||||
@@ -131,5 +137,40 @@ public class CrmOrderItemVo {
|
||||
@ExcelProperty(value = "排产批次")
|
||||
private String productionBatch;
|
||||
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
@ExcelProperty(value = "表面处理")
|
||||
private String surfaceTreatment;
|
||||
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
@ExcelProperty(value = "切边要求")
|
||||
private String edgeCuttingReq;
|
||||
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
@ExcelProperty(value = "包装要求")
|
||||
private String packagingReq;
|
||||
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
@ExcelProperty(value = "宽度")
|
||||
private String width;
|
||||
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
@ExcelProperty(value = "厚度")
|
||||
private String thickness;
|
||||
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
@ExcelProperty(value = "用途")
|
||||
private String purpose;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,12 +2,15 @@ package com.klp.crm.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
@@ -234,6 +237,30 @@ public class CrmOrderVo extends BaseEntity {
|
||||
@ExcelProperty(value = "排产函")
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
@ExcelProperty(value = "算单价备注")
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
@ExcelProperty(value = "应付定金(万元)")
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
@ExcelProperty(value = "已付定金(万元)")
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
@ExcelProperty(value = "定金比例(%)")
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
@@ -252,6 +279,12 @@ public class CrmOrderVo extends BaseEntity {
|
||||
@ExcelProperty(value = "附件")
|
||||
private String annexFiles;
|
||||
|
||||
/**
|
||||
* 是否置顶 0-否 1-是
|
||||
*/
|
||||
@ExcelProperty(value = "是否置顶")
|
||||
private Integer isTop;
|
||||
|
||||
|
||||
// @ExcelProperty(value = "客户编号")
|
||||
private String customerCode;
|
||||
@@ -268,4 +301,8 @@ public class CrmOrderVo extends BaseEntity {
|
||||
private String createByName;
|
||||
//更新人
|
||||
private String updateByName;
|
||||
/**
|
||||
* 关联的钢卷列表
|
||||
*/
|
||||
private List<WmsMaterialCoilVo> coilList;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,11 @@ public interface ICrmOrderService {
|
||||
*/
|
||||
CrmOrderVo queryById(String orderId);
|
||||
|
||||
/**
|
||||
* 根据ID列表查询正式订单
|
||||
*/
|
||||
List<CrmOrderVo> queryByIds(List<Long> orderIds);
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
*/
|
||||
|
||||
@@ -95,12 +95,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), CrmOrderItem::getMaterial, bo.getMaterial());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getGrade()), CrmOrderItem::getGrade, bo.getGrade());
|
||||
lqw.eq(bo.getWeight() != null, CrmOrderItem::getWeight, bo.getWeight());
|
||||
lqw.eq(bo.getWidthTolerance() != null, CrmOrderItem::getWidthTolerance, bo.getWidthTolerance());
|
||||
lqw.eq(bo.getThicknessTolerance() != null, CrmOrderItem::getThicknessTolerance, bo.getThicknessTolerance());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getWidthTolerance()), CrmOrderItem::getWidthTolerance, bo.getWidthTolerance());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getThicknessTolerance()), CrmOrderItem::getThicknessTolerance, bo.getThicknessTolerance());
|
||||
lqw.eq(bo.getContractPrice() != null, CrmOrderItem::getContractPrice, bo.getContractPrice());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomizer()), CrmOrderItem::getCustomizer, bo.getCustomizer());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getShipper()), CrmOrderItem::getShipper, bo.getShipper());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductionBatch()), CrmOrderItem::getProductionBatch, bo.getProductionBatch());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatment()), CrmOrderItem::getSurfaceTreatment, bo.getSurfaceTreatment());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSurfaceQuality()), CrmOrderItem::getSurfaceQuality, bo.getSurfaceQuality());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getEdgeCuttingReq()), CrmOrderItem::getEdgeCuttingReq, bo.getEdgeCuttingReq());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPackagingReq()), CrmOrderItem::getPackagingReq, bo.getPackagingReq());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getWidth()), CrmOrderItem::getWidth, bo.getWidth());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getThickness()), CrmOrderItem::getThickness, bo.getThickness());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPurpose()), CrmOrderItem::getPurpose, bo.getPurpose());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
|
||||
import com.klp.mapper.WmsCoilContractRelMapper;
|
||||
import com.klp.system.service.ISysUserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -17,6 +18,11 @@ import com.klp.crm.domain.vo.CrmOrderVo;
|
||||
import com.klp.crm.domain.CrmOrder;
|
||||
import com.klp.crm.mapper.CrmOrderMapper;
|
||||
import com.klp.crm.service.ICrmOrderService;
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.service.IWmsCoilContractRelService;
|
||||
import com.klp.service.IWmsMaterialCoilService;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -35,6 +41,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
|
||||
private final ISysUserService userService;
|
||||
|
||||
private final WmsCoilContractRelMapper coilContractRelMapper;
|
||||
|
||||
private final IWmsMaterialCoilService materialCoilService;
|
||||
|
||||
/**
|
||||
* 查询正式订单主
|
||||
*/
|
||||
@@ -43,6 +53,19 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
return baseMapper.selectVoById(orderId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID列表查询正式订单
|
||||
*/
|
||||
@Override
|
||||
public List<CrmOrderVo> queryByIds(List<Long> orderIds) {
|
||||
if (orderIds == null || orderIds.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
LambdaQueryWrapper<CrmOrder> lqw = Wrappers.lambdaQuery();
|
||||
lqw.in(CrmOrder::getOrderId, orderIds);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
*/
|
||||
@@ -76,6 +99,57 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 查询订单关联的钢卷ID列表
|
||||
List<Long> contractIds = records.stream()
|
||||
.map(CrmOrderVo::getOrderId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!contractIds.isEmpty()) {
|
||||
// 批量查询钢卷与合同关联关系
|
||||
LambdaQueryWrapper<WmsCoilContractRel> coilQw = Wrappers.lambdaQuery();
|
||||
coilQw.in(WmsCoilContractRel::getContractId, contractIds);
|
||||
coilQw.eq(WmsCoilContractRel::getDelFlag, 0);
|
||||
List<WmsCoilContractRel> coilRels = coilContractRelMapper.selectList(coilQw);
|
||||
|
||||
// 按contractId分组,收集coilId列表
|
||||
Map<Long, List<Long>> coilIdMap = coilRels.stream()
|
||||
.filter(rel -> rel.getContractId() != null && rel.getCoilId() != null)
|
||||
.collect(Collectors.groupingBy(
|
||||
WmsCoilContractRel::getContractId,
|
||||
Collectors.mapping(WmsCoilContractRel::getCoilId, Collectors.toList())
|
||||
));
|
||||
|
||||
// 查询所有相关钢卷的详细信息
|
||||
Set<Long> allCoilIds = coilIdMap.values().stream()
|
||||
.flatMap(List::stream)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
Map<Long, WmsMaterialCoilVo> coilVoMap = Collections.emptyMap();
|
||||
if (!allCoilIds.isEmpty()) {
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(allCoilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||
List<WmsMaterialCoilVo> allCoils = materialCoilService.queryList(coilBo);
|
||||
coilVoMap = allCoils.stream()
|
||||
.collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, c -> c, (a, b) -> a));
|
||||
}
|
||||
|
||||
// 设置到每个订单的coilIds和coilList字段
|
||||
for (CrmOrderVo vo : records) {
|
||||
if (vo.getOrderId() != null && coilIdMap.containsKey(vo.getOrderId())) {
|
||||
List<Long> coilIdList = coilIdMap.get(vo.getOrderId());
|
||||
// 设置coilList(钢卷详细信息列表)
|
||||
List<WmsMaterialCoilVo> coilList = coilIdList.stream()
|
||||
.map(coilVoMap::get)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
vo.setCoilList(coilList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
@@ -127,14 +201,23 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
qw.like(StringUtils.isNotBlank(bo.getTechAnnex()), "co.tech_annex", bo.getTechAnnex());
|
||||
qw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), "co.business_annex", bo.getBusinessAnnex());
|
||||
qw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), "co.production_schedule", bo.getProductionSchedule());
|
||||
qw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), "co.unit_price_remark", bo.getUnitPriceRemark());
|
||||
qw.eq(bo.getDepositPayable() != null, "co.deposit_payable", bo.getDepositPayable());
|
||||
qw.eq(bo.getDepositPaid() != null, "co.deposit_paid", bo.getDepositPaid());
|
||||
qw.eq(bo.getDepositRatio() != null, "co.deposit_ratio", bo.getDepositRatio());
|
||||
qw.eq(bo.getStatus() != null, "co.status", bo.getStatus());
|
||||
qw.eq(bo.getContractId() != null, "co.contract_id", bo.getContractId());
|
||||
qw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), "co.annex_files", bo.getAnnexFiles());
|
||||
qw.eq(bo.getIsTop() != null, "co.is_top", bo.getIsTop());
|
||||
//逻辑删除
|
||||
qw.eq("co.del_flag", 0);
|
||||
//根据orderType排序预订单是0 正是订单是1 0排在前面 1排在后面 升序
|
||||
qw.orderByAsc("co.order_type");
|
||||
qw.orderByDesc("co.create_time");
|
||||
//排序规则:
|
||||
// 1. 置顶优先 (is_top=1 排在前面)
|
||||
// 2. 状态为1(已生效)的排在前面
|
||||
// 3. 创建时间倒序
|
||||
qw.orderByDesc("co.is_top")
|
||||
.orderByDesc("CASE WHEN co.status = 1 THEN 1 ELSE 0 END")
|
||||
.orderByDesc("co.create_time");
|
||||
return qw;
|
||||
}
|
||||
|
||||
@@ -183,9 +266,21 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
lqw.like(StringUtils.isNotBlank(bo.getTechAnnex()), CrmOrder::getTechAnnex, bo.getTechAnnex());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), CrmOrder::getBusinessAnnex, bo.getBusinessAnnex());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), CrmOrder::getProductionSchedule, bo.getProductionSchedule());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), CrmOrder::getUnitPriceRemark, bo.getUnitPriceRemark());
|
||||
lqw.eq(bo.getDepositPayable() != null, CrmOrder::getDepositPayable, bo.getDepositPayable());
|
||||
lqw.eq(bo.getDepositPaid() != null, CrmOrder::getDepositPaid, bo.getDepositPaid());
|
||||
lqw.eq(bo.getDepositRatio() != null, CrmOrder::getDepositRatio, bo.getDepositRatio());
|
||||
lqw.eq(bo.getStatus() != null, CrmOrder::getStatus, bo.getStatus());
|
||||
lqw.eq(bo.getContractId() != null, CrmOrder::getContractId, bo.getContractId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), CrmOrder::getAnnexFiles, bo.getAnnexFiles());
|
||||
lqw.eq(bo.getIsTop() != null, CrmOrder::getIsTop, bo.getIsTop());
|
||||
//逻辑删除
|
||||
lqw.eq(CrmOrder::getDelFlag, 0);
|
||||
//排序规则:
|
||||
// 1. 置顶优先 (is_top=1 排在前面)
|
||||
// 2. 状态为1(已生效)的排在前面
|
||||
// 3. 创建时间倒序
|
||||
lqw.last("ORDER BY is_top DESC, CASE WHEN status = 1 THEN 1 ELSE 0 END DESC, create_time DESC");
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="customizer" column="customizer"/>
|
||||
<result property="shipper" column="shipper"/>
|
||||
<result property="productionBatch" column="production_batch"/>
|
||||
<result property="surfaceTreatment" column="surface_treatment"/>
|
||||
<result property="surfaceQuality" column="surface_quality"/>
|
||||
<result property="edgeCuttingReq" column="edge_cutting_req"/>
|
||||
<result property="packagingReq" column="packaging_req"/>
|
||||
<result property="width" column="width"/>
|
||||
<result property="thickness" column="thickness"/>
|
||||
<result property="purpose" column="purpose"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
@@ -50,6 +57,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
customizer,
|
||||
shipper,
|
||||
production_batch,
|
||||
surface_treatment,
|
||||
surface_quality,
|
||||
edge_cutting_req,
|
||||
packaging_req,
|
||||
width,
|
||||
thickness,
|
||||
purpose,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
@@ -65,4 +79,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
</mapper>
|
||||
|
||||
@@ -40,6 +40,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="techAnnex" column="tech_annex"/>
|
||||
<result property="businessAnnex" column="business_annex"/>
|
||||
<result property="productionSchedule" column="production_schedule"/>
|
||||
<result property="unitPriceRemark" column="unit_price_remark"/>
|
||||
<result property="depositPayable" column="deposit_payable"/>
|
||||
<result property="depositPaid" column="deposit_paid"/>
|
||||
<result property="depositRatio" column="deposit_ratio"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="contractId" column="contract_id"/>
|
||||
<result property="annexFiles" column="annex_files"/>
|
||||
@@ -48,6 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="isTop" column="is_top"/>
|
||||
</resultMap>
|
||||
<select id="selectVoPagePlus" resultType="com.klp.crm.domain.vo.CrmOrderVo">
|
||||
SELECT
|
||||
@@ -86,10 +91,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
co.tech_annex AS techAnnex,
|
||||
co.business_annex AS businessAnnex,
|
||||
co.production_schedule AS productionSchedule,
|
||||
co.unit_price_remark AS unitPriceRemark,
|
||||
co.deposit_payable AS depositPayable,
|
||||
co.deposit_paid AS depositPaid,
|
||||
co.deposit_ratio AS depositRatio,
|
||||
co.status,
|
||||
co.contract_id AS contractId,
|
||||
co.annex_files AS annexFiles,
|
||||
co.create_by AS createBy,
|
||||
co.annex_files AS annexFiles,
|
||||
co.is_top AS isTop,
|
||||
co.create_by AS createBy,
|
||||
co.create_time AS createTime,
|
||||
co.update_by AS updateBy,
|
||||
co.update_time AS updateTime,
|
||||
@@ -141,10 +151,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
co.tech_annex AS techAnnex,
|
||||
co.business_annex AS businessAnnex,
|
||||
co.production_schedule AS productionSchedule,
|
||||
co.unit_price_remark AS unitPriceRemark,
|
||||
co.deposit_payable AS depositPayable,
|
||||
co.deposit_paid AS depositPaid,
|
||||
co.deposit_ratio AS depositRatio,
|
||||
co.status,
|
||||
co.contract_id AS contractId,
|
||||
co.annex_files AS annexFiles,
|
||||
co.create_by AS createBy,
|
||||
co.annex_files AS annexFiles,
|
||||
co.is_top AS isTop,
|
||||
co.create_by AS createBy,
|
||||
co.create_time AS createTime,
|
||||
co.update_by AS updateBy,
|
||||
co.update_time AS updateTime,
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.ems.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.ems.service.IEmsEnergyRecordService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 能源消耗记录
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ems/energyRecord")
|
||||
public class EmsEnergyRecordController extends BaseController {
|
||||
|
||||
private final IEmsEnergyRecordService iEmsEnergyRecordService;
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<EmsEnergyRecordVo> list(EmsEnergyRecordBo bo, PageQuery pageQuery) {
|
||||
return iEmsEnergyRecordService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出能源消耗记录列表
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(EmsEnergyRecordBo bo, HttpServletResponse response) {
|
||||
List<EmsEnergyRecordVo> list = iEmsEnergyRecordService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "能源消耗记录", EmsEnergyRecordVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取能源消耗记录详细信息
|
||||
*
|
||||
* @param energyRecordId 主键
|
||||
*/
|
||||
@GetMapping("/{energyRecordId}")
|
||||
public R<EmsEnergyRecordVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long energyRecordId) {
|
||||
return R.ok(iEmsEnergyRecordService.queryById(energyRecordId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Long> add(@Validated(AddGroup.class) @RequestBody EmsEnergyRecordBo bo) {
|
||||
return R.ok(iEmsEnergyRecordService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsEnergyRecordBo bo) {
|
||||
return toAjax(iEmsEnergyRecordService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除能源消耗记录
|
||||
*
|
||||
* @param energyRecordIds 主键串
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{energyRecordIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] energyRecordIds) {
|
||||
return toAjax(iEmsEnergyRecordService.deleteWithValidByIds(Arrays.asList(energyRecordIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.klp.ems.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 能源消耗记录对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("ems_energy_record")
|
||||
public class EmsEnergyRecord extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
@TableId(value = "energy_record_id")
|
||||
private Long energyRecordId;
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
private Long meterId;
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
private Long energyId;
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consumption;
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
private Date recordDate;
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
private Long recordedBy;
|
||||
/**
|
||||
* 删除标志(0=存在 2=删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -72,5 +72,13 @@ public class EmsMeter extends BaseEntity {
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
/**
|
||||
* 产线(如:S1、S2、组装线、包装线等)
|
||||
*/
|
||||
private String productionLine;
|
||||
/**
|
||||
* 是否总表:0=否,1=是
|
||||
*/
|
||||
private Integer isTotalMeter;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.ems.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
/**
|
||||
* 能源消耗记录业务对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class EmsEnergyRecordBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
private Long energyRecordId;
|
||||
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
private Long meterId;
|
||||
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
private Long energyId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consumption;
|
||||
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 统计日期开始时间(yyyy-MM-dd,不含时分秒)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordStartDate;
|
||||
|
||||
/**
|
||||
* 统计日期结束时间(yyyy-MM-dd,不含时分秒)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordEndDate;
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
private Long recordedBy;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 表计编号(模糊查询)
|
||||
*/
|
||||
private String meterCode;
|
||||
|
||||
/**
|
||||
* 能源名称(模糊查询)
|
||||
*/
|
||||
private String energyName;
|
||||
|
||||
/**
|
||||
* 设备型号(模糊查询)
|
||||
*/
|
||||
private String model;
|
||||
|
||||
/**
|
||||
* 制造商(模糊查询)
|
||||
*/
|
||||
private String manufacturer;
|
||||
|
||||
/**
|
||||
* 设备状态:0=在用,1=停用,2=维护
|
||||
*/
|
||||
private Integer meterStatus;
|
||||
|
||||
}
|
||||
@@ -75,5 +75,15 @@ public class EmsMeterBo extends BaseEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 产线(如:S1、S2、组装线、包装线等)
|
||||
*/
|
||||
private String productionLine;
|
||||
|
||||
/**
|
||||
* 是否总表:0=否,1=是
|
||||
*/
|
||||
private Integer isTotalMeter;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
package com.klp.ems.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
|
||||
/**
|
||||
* 能源消耗记录视图对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class EmsEnergyRecordVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "能耗记录主键ID")
|
||||
private Long energyRecordId;
|
||||
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
@ExcelProperty(value = "表计ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "关=联计量设备表")
|
||||
private Long meterId;
|
||||
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
@ExcelProperty(value = "能源ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "关=联能源类型表:电/水/气/暖等")
|
||||
private Long energyId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
@ExcelProperty(value = "消耗量")
|
||||
private BigDecimal consumption;
|
||||
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
@ExcelProperty(value = "统计日期", converter = ExcelDictConvert.class)
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
@ExcelProperty(value = "记录人ID")
|
||||
private Long recordedBy;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 表计编号
|
||||
*/
|
||||
private String meterCode;
|
||||
|
||||
/**
|
||||
* 设备型号
|
||||
*/
|
||||
private String meterModel;
|
||||
|
||||
/**
|
||||
* 制造商
|
||||
*/
|
||||
private String meterManufacturer;
|
||||
|
||||
/**
|
||||
* 设备状态:0=在用,1=停用,2=维护
|
||||
*/
|
||||
private Integer meterStatus;
|
||||
|
||||
|
||||
/**
|
||||
* 能源名称
|
||||
*/
|
||||
private String energyName;
|
||||
|
||||
|
||||
/**
|
||||
* 能源单位
|
||||
*/
|
||||
private String energyUnit;
|
||||
|
||||
/**
|
||||
* 能源编号
|
||||
*/
|
||||
private String energyCode;
|
||||
|
||||
/**
|
||||
* 能源描述
|
||||
*/
|
||||
private String energyDescription;
|
||||
|
||||
}
|
||||
@@ -89,6 +89,18 @@ public class EmsMeterVo {
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 产线(如:S1、S2、组装线、包装线等)
|
||||
*/
|
||||
@ExcelProperty(value = "产线")
|
||||
private String productionLine;
|
||||
|
||||
/**
|
||||
* 是否总表:0=否,1=是
|
||||
*/
|
||||
@ExcelProperty(value = "是否总表")
|
||||
private Integer isTotalMeter;
|
||||
|
||||
/**
|
||||
* 库区ID
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.klp.ems.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
public interface EmsEnergyRecordMapper extends BaseMapperPlus<EmsEnergyRecordMapper, EmsEnergyRecord, EmsEnergyRecordVo> {
|
||||
|
||||
Page<EmsEnergyRecordVo> selectVoPagePlus(Page<Object> build,@Param("ew") QueryWrapper<EmsEnergyRecord> qw);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.ems.service;
|
||||
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
public interface IEmsEnergyRecordService {
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录
|
||||
*/
|
||||
EmsEnergyRecordVo queryById(Long energyRecordId);
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
TableDataInfo<EmsEnergyRecordVo> queryPageList(EmsEnergyRecordBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
List<EmsEnergyRecordVo> queryList(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
Long insertByBo(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
Boolean updateByBo(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除能源消耗记录信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
package com.klp.ems.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.mapper.EmsEnergyRecordMapper;
|
||||
import com.klp.ems.service.IEmsEnergyRecordService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class EmsEnergyRecordServiceImpl implements IEmsEnergyRecordService {
|
||||
|
||||
private final EmsEnergyRecordMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public EmsEnergyRecordVo queryById(Long energyRecordId){
|
||||
return baseMapper.selectVoById(energyRecordId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<EmsEnergyRecordVo> queryPageList(EmsEnergyRecordBo bo, PageQuery pageQuery) {
|
||||
QueryWrapper<EmsEnergyRecord> qw = buildQueryWrapperPlus(bo);
|
||||
Page<EmsEnergyRecordVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
private QueryWrapper<EmsEnergyRecord> buildQueryWrapperPlus(EmsEnergyRecordBo bo) {
|
||||
QueryWrapper<EmsEnergyRecord> qw = Wrappers.query();
|
||||
|
||||
// 主表字段查询(使用别名 er)
|
||||
qw.eq(bo.getMeterId() != null, "er.meter_id", bo.getMeterId());
|
||||
qw.eq(bo.getEnergyId() != null, "er.energy_id", bo.getEnergyId());
|
||||
qw.eq(bo.getConsumption() != null, "er.consumption", bo.getConsumption());
|
||||
qw.eq(bo.getRecordDate() != null, "er.record_date", bo.getRecordDate());
|
||||
qw.eq(bo.getRecordedBy() != null, "er.recorded_by", bo.getRecordedBy());
|
||||
|
||||
// 时间段筛选:recordStartDate <= recordDate <= recordEndDate
|
||||
qw.ge(bo.getRecordStartDate() != null, "er.record_date", bo.getRecordStartDate());
|
||||
qw.le(bo.getRecordEndDate() != null, "er.record_date", bo.getRecordEndDate());
|
||||
// 逻辑删除
|
||||
qw.eq("er.del_flag", "0");
|
||||
// 默认排序:按统计日期倒序
|
||||
qw.orderByDesc("er.record_date");
|
||||
|
||||
return qw;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public List<EmsEnergyRecordVo> queryList(EmsEnergyRecordBo bo) {
|
||||
LambdaQueryWrapper<EmsEnergyRecord> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<EmsEnergyRecord> buildQueryWrapper(EmsEnergyRecordBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<EmsEnergyRecord> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getMeterId() != null, EmsEnergyRecord::getMeterId, bo.getMeterId());
|
||||
lqw.eq(bo.getEnergyId() != null, EmsEnergyRecord::getEnergyId, bo.getEnergyId());
|
||||
lqw.eq(bo.getConsumption() != null, EmsEnergyRecord::getConsumption, bo.getConsumption());
|
||||
lqw.eq(bo.getRecordDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordDate());
|
||||
// 时间段筛选:recordDateStart <= recordDate <= recordDateEnd
|
||||
lqw.ge(bo.getRecordStartDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordStartDate());
|
||||
lqw.le(bo.getRecordEndDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordEndDate());
|
||||
lqw.eq(bo.getRecordedBy() != null, EmsEnergyRecord::getRecordedBy, bo.getRecordedBy());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Long insertByBo(EmsEnergyRecordBo bo) {
|
||||
EmsEnergyRecord add = BeanUtil.toBean(bo, EmsEnergyRecord.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setEnergyRecordId(add.getEnergyRecordId());
|
||||
}
|
||||
return add.getEnergyRecordId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(EmsEnergyRecordBo bo) {
|
||||
EmsEnergyRecord update = BeanUtil.toBean(bo, EmsEnergyRecord.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(EmsEnergyRecord entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -93,6 +93,8 @@ public class EmsMeterServiceImpl implements IEmsMeterService {
|
||||
lqw.eq(bo.getStatus() != null, EmsMeter::getStatus, bo.getStatus());
|
||||
lqw.eq(bo.getLastCalibrationDate() != null, EmsMeter::getLastCalibrationDate, bo.getLastCalibrationDate());
|
||||
lqw.eq(bo.getThresholdValue() != null, EmsMeter::getThresholdValue, bo.getThresholdValue());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProductionLine()), EmsMeter::getProductionLine, bo.getProductionLine());
|
||||
lqw.eq(bo.getIsTotalMeter() != null, EmsMeter::getIsTotalMeter, bo.getIsTotalMeter());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
45
klp-ems/src/main/resources/mapper/EmsEnergyRecordMapper.xml
Normal file
45
klp-ems/src/main/resources/mapper/EmsEnergyRecordMapper.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.ems.mapper.EmsEnergyRecordMapper">
|
||||
|
||||
<resultMap type="com.klp.ems.domain.EmsEnergyRecord" id="EmsEnergyRecordResult">
|
||||
<result property="energyRecordId" column="energy_record_id"/>
|
||||
<result property="meterId" column="meter_id"/>
|
||||
<result property="energyId" column="energy_id"/>
|
||||
<result property="consumption" column="consumption"/>
|
||||
<result property="recordDate" column="record_date"/>
|
||||
<result property="recordedBy" column="recorded_by"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
<select id="selectVoPagePlus" resultType="com.klp.ems.domain.vo.EmsEnergyRecordVo">
|
||||
SELECT
|
||||
er.energy_record_id,
|
||||
er.meter_id,
|
||||
er.energy_id,
|
||||
er.consumption,
|
||||
er.record_date,
|
||||
er.recorded_by,
|
||||
er.remark,
|
||||
m.meter_code AS meterCode,
|
||||
m.model AS meterModel,
|
||||
m.manufacturer AS meterManufacturer,
|
||||
m.status AS meterStatus,
|
||||
et.name AS energyName,
|
||||
et.unit AS energyUnit,
|
||||
et.code AS energyCode,
|
||||
et.description AS energyDescription
|
||||
FROM ems_energy_record er
|
||||
LEFT JOIN ems_meter m ON er.meter_id = m.meter_id AND m.del_flag = '0'
|
||||
LEFT JOIN ems_energy_type et ON er.energy_id = et.energy_type_id AND et.del_flag = '0'
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -21,6 +21,8 @@
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="productionLine" column="production_line"/>
|
||||
<result property="isTotalMeter" column="is_total_meter"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap type="com.klp.ems.domain.vo.EmsMeterVo" id="EmsMeterVoResult">
|
||||
@@ -35,6 +37,8 @@
|
||||
<result property="lastCalibrationDate" column="last_calibration_date"/>
|
||||
<result property="thresholdValue" column="threshold_value"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="productionLine" column="production_line"/>
|
||||
<result property="isTotalMeter" column="is_total_meter"/>
|
||||
<result property="warehouseId" column="warehouse_id"/>
|
||||
<result property="warehouseName" column="warehouse_name"/>
|
||||
</resultMap>
|
||||
@@ -77,6 +81,8 @@
|
||||
m.last_calibration_date,
|
||||
m.threshold_value,
|
||||
m.remark,
|
||||
m.production_line,
|
||||
m.is_total_meter,
|
||||
COALESCE(w.warehouse_id, 0) as warehouse_id,
|
||||
COALESCE(w.warehouse_name, '') as warehouse_name
|
||||
FROM ems_meter m
|
||||
@@ -95,6 +101,12 @@
|
||||
<if test="status != null">
|
||||
AND m.status = #{status}
|
||||
</if>
|
||||
<if test="productionLine != null and productionLine != ''">
|
||||
AND m.production_line LIKE CONCAT('%', #{productionLine}, '%')
|
||||
</if>
|
||||
<if test="isTotalMeter != null">
|
||||
AND m.is_total_meter = #{isTotalMeter}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectMeterIds" parameterType="com.klp.ems.domain.bo.MeterFilterBo" resultType="java.lang.Long">
|
||||
|
||||
@@ -76,4 +76,80 @@ public class ErpPurchaseOrder extends BaseEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 单据类型
|
||||
*/
|
||||
private String billType;
|
||||
|
||||
/**
|
||||
* 收发类别
|
||||
*/
|
||||
private String receiveType;
|
||||
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 业务员
|
||||
*/
|
||||
private String salesman;
|
||||
|
||||
/**
|
||||
* 供货单位ID
|
||||
*/
|
||||
private Long supplyUnitId;
|
||||
|
||||
/**
|
||||
* 制单人
|
||||
*/
|
||||
private String maker;
|
||||
|
||||
/**
|
||||
* 审核人
|
||||
*/
|
||||
private String auditor;
|
||||
|
||||
/**
|
||||
* 记账人
|
||||
*/
|
||||
private String bookkeeper;
|
||||
|
||||
/**
|
||||
* 审核日期
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date auditDate;
|
||||
|
||||
/**
|
||||
* 存货编码
|
||||
*/
|
||||
private String stockCode;
|
||||
|
||||
/**
|
||||
* 存货名称
|
||||
*/
|
||||
private String stockName;
|
||||
|
||||
/**
|
||||
* 规格型号
|
||||
*/
|
||||
private String specModel;
|
||||
|
||||
/**
|
||||
* 主计量单位
|
||||
*/
|
||||
private String mainUnit;
|
||||
|
||||
/**
|
||||
* 入库数量
|
||||
*/
|
||||
private String stockQuantity;
|
||||
|
||||
/**
|
||||
* 仓库ID
|
||||
*/
|
||||
private Long warehouseId;
|
||||
|
||||
}
|
||||
|
||||
@@ -83,5 +83,80 @@ public class ErpPurchaseOrderBo extends BaseEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 单据类型
|
||||
*/
|
||||
private String billType;
|
||||
|
||||
/**
|
||||
* 收发类别
|
||||
*/
|
||||
private String receiveType;
|
||||
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 业务员
|
||||
*/
|
||||
private String salesman;
|
||||
|
||||
/**
|
||||
* 供货单位ID
|
||||
*/
|
||||
private Long supplyUnitId;
|
||||
|
||||
/**
|
||||
* 制单人
|
||||
*/
|
||||
private String maker;
|
||||
|
||||
/**
|
||||
* 审核人
|
||||
*/
|
||||
private String auditor;
|
||||
|
||||
/**
|
||||
* 记账人
|
||||
*/
|
||||
private String bookkeeper;
|
||||
|
||||
/**
|
||||
* 审核日期
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date auditDate;
|
||||
|
||||
/**
|
||||
* 存货编码
|
||||
*/
|
||||
private String stockCode;
|
||||
|
||||
/**
|
||||
* 存货名称
|
||||
*/
|
||||
private String stockName;
|
||||
|
||||
/**
|
||||
* 规格型号
|
||||
*/
|
||||
private String specModel;
|
||||
|
||||
/**
|
||||
* 主计量单位
|
||||
*/
|
||||
private String mainUnit;
|
||||
|
||||
/**
|
||||
* 入库数量
|
||||
*/
|
||||
private String stockQuantity;
|
||||
|
||||
/**
|
||||
* 仓库ID
|
||||
*/
|
||||
private Long warehouseId;
|
||||
|
||||
}
|
||||
|
||||
@@ -90,5 +90,95 @@ public class ErpPurchaseOrderVo implements Serializable {
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 单据类型
|
||||
*/
|
||||
@ExcelProperty(value = "单据类型")
|
||||
private String billType;
|
||||
|
||||
/**
|
||||
* 收发类别
|
||||
*/
|
||||
@ExcelProperty(value = "收发类别")
|
||||
private String receiveType;
|
||||
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
@ExcelProperty(value = "部门")
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 业务员
|
||||
*/
|
||||
@ExcelProperty(value = "业务员")
|
||||
private String salesman;
|
||||
|
||||
/**
|
||||
* 供货单位ID
|
||||
*/
|
||||
@ExcelProperty(value = "供货单位ID")
|
||||
private Long supplyUnitId;
|
||||
|
||||
/**
|
||||
* 制单人
|
||||
*/
|
||||
@ExcelProperty(value = "制单人")
|
||||
private String maker;
|
||||
|
||||
/**
|
||||
* 审核人
|
||||
*/
|
||||
@ExcelProperty(value = "审核人")
|
||||
private String auditor;
|
||||
|
||||
/**
|
||||
* 记账人
|
||||
*/
|
||||
@ExcelProperty(value = "记账人")
|
||||
private String bookkeeper;
|
||||
|
||||
/**
|
||||
* 审核日期
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@ExcelProperty(value = "审核日期")
|
||||
private Date auditDate;
|
||||
|
||||
/**
|
||||
* 存货编码
|
||||
*/
|
||||
@ExcelProperty(value = "存货编码")
|
||||
private String stockCode;
|
||||
|
||||
/**
|
||||
* 存货名称
|
||||
*/
|
||||
@ExcelProperty(value = "存货名称")
|
||||
private String stockName;
|
||||
|
||||
/**
|
||||
* 规格型号
|
||||
*/
|
||||
@ExcelProperty(value = "规格型号")
|
||||
private String specModel;
|
||||
|
||||
/**
|
||||
* 主计量单位
|
||||
*/
|
||||
@ExcelProperty(value = "主计量单位")
|
||||
private String mainUnit;
|
||||
|
||||
/**
|
||||
* 入库数量
|
||||
*/
|
||||
@ExcelProperty(value = "入库数量")
|
||||
private String stockQuantity;
|
||||
|
||||
/**
|
||||
* 仓库ID
|
||||
*/
|
||||
@ExcelProperty(value = "仓库ID")
|
||||
private Long warehouseId;
|
||||
|
||||
}
|
||||
|
||||
@@ -78,6 +78,21 @@ public class ErpPurchaseOrderServiceImpl implements IErpPurchaseOrderService {
|
||||
lqw.eq(bo.getTotalAmount() != null, ErpPurchaseOrder::getTotalAmount, bo.getTotalAmount());
|
||||
lqw.eq(bo.getOrderStatus() != null, ErpPurchaseOrder::getOrderStatus, bo.getOrderStatus());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getConfirmBy()), ErpPurchaseOrder::getConfirmBy, bo.getConfirmBy());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getBillType()), ErpPurchaseOrder::getBillType, bo.getBillType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getReceiveType()), ErpPurchaseOrder::getReceiveType, bo.getReceiveType());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), ErpPurchaseOrder::getDeptName, bo.getDeptName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSalesman()), ErpPurchaseOrder::getSalesman, bo.getSalesman());
|
||||
lqw.eq(bo.getSupplyUnitId() != null, ErpPurchaseOrder::getSupplyUnitId, bo.getSupplyUnitId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getMaker()), ErpPurchaseOrder::getMaker, bo.getMaker());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getAuditor()), ErpPurchaseOrder::getAuditor, bo.getAuditor());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBookkeeper()), ErpPurchaseOrder::getBookkeeper, bo.getBookkeeper());
|
||||
lqw.eq(bo.getAuditDate() != null, ErpPurchaseOrder::getAuditDate, bo.getAuditDate());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getStockCode()), ErpPurchaseOrder::getStockCode, bo.getStockCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getStockName()), ErpPurchaseOrder::getStockName, bo.getStockName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSpecModel()), ErpPurchaseOrder::getSpecModel, bo.getSpecModel());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getMainUnit()), ErpPurchaseOrder::getMainUnit, bo.getMainUnit());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getStockQuantity()), ErpPurchaseOrder::getStockQuantity, bo.getStockQuantity());
|
||||
lqw.eq(bo.getWarehouseId() != null, ErpPurchaseOrder::getWarehouseId, bo.getWarehouseId());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="billType" column="bill_type"/>
|
||||
<result property="receiveType" column="receive_type"/>
|
||||
<result property="deptName" column="dept_name"/>
|
||||
<result property="salesman" column="salesman"/>
|
||||
<result property="supplyUnitId" column="supply_unit_id"/>
|
||||
<result property="maker" column="maker"/>
|
||||
<result property="auditor" column="auditor"/>
|
||||
<result property="bookkeeper" column="bookkeeper"/>
|
||||
<result property="auditDate" column="audit_date"/>
|
||||
<result property="stockCode" column="stock_code"/>
|
||||
<result property="stockName" column="stock_name"/>
|
||||
<result property="specModel" column="spec_model"/>
|
||||
<result property="mainUnit" column="main_unit"/>
|
||||
<result property="stockQuantity" column="stock_quantity"/>
|
||||
<result property="warehouseId" column="warehouse_id"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ gen:
|
||||
# 作者
|
||||
author: klp
|
||||
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
|
||||
packageName: com.klp.system
|
||||
packageName: com.klp
|
||||
# 自动去除表前缀,默认是false
|
||||
autoRemovePre: false
|
||||
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.mes.eqp.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryConsumeVo;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryConsumeBo;
|
||||
import com.klp.mes.eqp.service.IEqpAuxiliaryConsumeService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/eqp/auxiliaryConsume")
|
||||
public class EqpAuxiliaryConsumeController extends BaseController {
|
||||
|
||||
private final IEqpAuxiliaryConsumeService iEqpAuxiliaryConsumeService;
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<EqpAuxiliaryConsumeVo> list(EqpAuxiliaryConsumeBo bo, PageQuery pageQuery) {
|
||||
return iEqpAuxiliaryConsumeService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出公辅消耗记录列表
|
||||
*/
|
||||
@Log(title = "公辅消耗记录", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(EqpAuxiliaryConsumeBo bo, HttpServletResponse response) {
|
||||
List<EqpAuxiliaryConsumeVo> list = iEqpAuxiliaryConsumeService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "公辅消耗记录", EqpAuxiliaryConsumeVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取公辅消耗记录详细信息
|
||||
*
|
||||
* @param consumeId 主键
|
||||
*/
|
||||
@GetMapping("/{consumeId}")
|
||||
public R<EqpAuxiliaryConsumeVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long consumeId) {
|
||||
return R.ok(iEqpAuxiliaryConsumeService.queryById(consumeId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增公辅消耗记录
|
||||
*/
|
||||
@Log(title = "公辅消耗记录", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Long> add(@Validated(AddGroup.class) @RequestBody EqpAuxiliaryConsumeBo bo) {
|
||||
return R.ok(iEqpAuxiliaryConsumeService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改公辅消耗记录
|
||||
*/
|
||||
@Log(title = "公辅消耗记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EqpAuxiliaryConsumeBo bo) {
|
||||
return toAjax(iEqpAuxiliaryConsumeService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除公辅消耗记录
|
||||
*
|
||||
* @param consumeIds 主键串
|
||||
*/
|
||||
@Log(title = "公辅消耗记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{consumeIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] consumeIds) {
|
||||
return toAjax(iEqpAuxiliaryConsumeService.deleteWithValidByIds(Arrays.asList(consumeIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.mes.eqp.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryTypeVo;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryTypeBo;
|
||||
import com.klp.mes.eqp.service.IEqpAuxiliaryTypeService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 公辅类型
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/eqp/auxiliaryType")
|
||||
public class EqpAuxiliaryTypeController extends BaseController {
|
||||
|
||||
private final IEqpAuxiliaryTypeService iEqpAuxiliaryTypeService;
|
||||
|
||||
/**
|
||||
* 查询公辅类型列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<EqpAuxiliaryTypeVo> list(EqpAuxiliaryTypeBo bo, PageQuery pageQuery) {
|
||||
return iEqpAuxiliaryTypeService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出公辅类型列表
|
||||
*/
|
||||
@Log(title = "公辅类型", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(EqpAuxiliaryTypeBo bo, HttpServletResponse response) {
|
||||
List<EqpAuxiliaryTypeVo> list = iEqpAuxiliaryTypeService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "公辅类型", EqpAuxiliaryTypeVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取公辅类型详细信息
|
||||
*
|
||||
* @param typeId 主键
|
||||
*/
|
||||
@GetMapping("/{typeId}")
|
||||
public R<EqpAuxiliaryTypeVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long typeId) {
|
||||
return R.ok(iEqpAuxiliaryTypeService.queryById(typeId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增公辅类型
|
||||
*/
|
||||
@Log(title = "公辅类型", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody EqpAuxiliaryTypeBo bo) {
|
||||
return toAjax(iEqpAuxiliaryTypeService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改公辅类型
|
||||
*/
|
||||
@Log(title = "公辅类型", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EqpAuxiliaryTypeBo bo) {
|
||||
return toAjax(iEqpAuxiliaryTypeService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除公辅类型
|
||||
*
|
||||
* @param typeIds 主键串
|
||||
*/
|
||||
@Log(title = "公辅类型", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{typeIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] typeIds) {
|
||||
return toAjax(iEqpAuxiliaryTypeService.deleteWithValidByIds(Arrays.asList(typeIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.klp.mes.eqp.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录对象 eqp_auxiliary_consume
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("eqp_auxiliary_consume")
|
||||
public class EqpAuxiliaryConsume extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 消耗记录ID
|
||||
*/
|
||||
@TableId(value = "consume_id")
|
||||
private Long consumeId;
|
||||
/**
|
||||
* 记录日期
|
||||
*/
|
||||
private Date recordDate;
|
||||
/**
|
||||
* 公辅类型ID(关联ems_auxiliary_type)
|
||||
*/
|
||||
private Long typeId;
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consume;
|
||||
/**
|
||||
* 删除标志(0=存在 2=删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.klp.mes.eqp.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
|
||||
/**
|
||||
* 公辅类型对象 eqp_auxiliary_type
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("eqp_auxiliary_type")
|
||||
public class EqpAuxiliaryType extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 公辅类型ID
|
||||
*/
|
||||
@TableId(value = "type_id")
|
||||
private Long typeId;
|
||||
/**
|
||||
* 公辅类型名称
|
||||
*/
|
||||
private String typeName;
|
||||
/**
|
||||
* 产线名称
|
||||
*/
|
||||
private String lineName;
|
||||
/**
|
||||
* 删除标志(0=存在 2=删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.klp.mes.eqp.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录业务对象 eqp_auxiliary_consume
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class EqpAuxiliaryConsumeBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 消耗记录ID
|
||||
*/
|
||||
private Long consumeId;
|
||||
|
||||
/**
|
||||
* 记录日期
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 公辅类型ID(关联ems_auxiliary_type)
|
||||
*/
|
||||
private Long typeId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consume;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.klp.mes.eqp.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
|
||||
/**
|
||||
* 公辅类型业务对象 eqp_auxiliary_type
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class EqpAuxiliaryTypeBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 公辅类型ID
|
||||
*/
|
||||
private Long typeId;
|
||||
|
||||
/**
|
||||
* 公辅类型名称
|
||||
*/
|
||||
private String typeName;
|
||||
|
||||
/**
|
||||
* 产线名称
|
||||
*/
|
||||
private String lineName;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.klp.mes.eqp.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 公辅消耗记录视图对象 eqp_auxiliary_consume
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class EqpAuxiliaryConsumeVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 消耗记录ID
|
||||
*/
|
||||
@ExcelProperty(value = "消耗记录ID")
|
||||
private Long consumeId;
|
||||
|
||||
/**
|
||||
* 记录日期
|
||||
*/
|
||||
@ExcelProperty(value = "记录日期")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 公辅类型ID(关联ems_auxiliary_type)
|
||||
*/
|
||||
@ExcelProperty(value = "公辅类型ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "关=联ems_auxiliary_type")
|
||||
private Long typeId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
@ExcelProperty(value = "消耗量")
|
||||
private BigDecimal consume;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.klp.mes.eqp.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 公辅类型视图对象 eqp_auxiliary_type
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class EqpAuxiliaryTypeVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 公辅类型ID
|
||||
*/
|
||||
@ExcelProperty(value = "公辅类型ID")
|
||||
private Long typeId;
|
||||
|
||||
/**
|
||||
* 公辅类型名称
|
||||
*/
|
||||
@ExcelProperty(value = "公辅类型名称")
|
||||
private String typeName;
|
||||
|
||||
/**
|
||||
* 产线名称
|
||||
*/
|
||||
@ExcelProperty(value = "产线名称")
|
||||
private String lineName;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.klp.mes.eqp.mapper;
|
||||
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryConsume;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryConsumeVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
public interface EqpAuxiliaryConsumeMapper extends BaseMapperPlus<EqpAuxiliaryConsumeMapper, EqpAuxiliaryConsume, EqpAuxiliaryConsumeVo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.klp.mes.eqp.mapper;
|
||||
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryType;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryTypeVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 公辅类型Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
public interface EqpAuxiliaryTypeMapper extends BaseMapperPlus<EqpAuxiliaryTypeMapper, EqpAuxiliaryType, EqpAuxiliaryTypeVo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.mes.eqp.service;
|
||||
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryConsume;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryConsumeVo;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryConsumeBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
public interface IEqpAuxiliaryConsumeService {
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录
|
||||
*/
|
||||
EqpAuxiliaryConsumeVo queryById(Long consumeId);
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录列表
|
||||
*/
|
||||
TableDataInfo<EqpAuxiliaryConsumeVo> queryPageList(EqpAuxiliaryConsumeBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录列表
|
||||
*/
|
||||
List<EqpAuxiliaryConsumeVo> queryList(EqpAuxiliaryConsumeBo bo);
|
||||
|
||||
/**
|
||||
* 新增公辅消耗记录
|
||||
*/
|
||||
Long insertByBo(EqpAuxiliaryConsumeBo bo);
|
||||
|
||||
/**
|
||||
* 修改公辅消耗记录
|
||||
*/
|
||||
Boolean updateByBo(EqpAuxiliaryConsumeBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除公辅消耗记录信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.mes.eqp.service;
|
||||
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryType;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryTypeVo;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryTypeBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 公辅类型Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
public interface IEqpAuxiliaryTypeService {
|
||||
|
||||
/**
|
||||
* 查询公辅类型
|
||||
*/
|
||||
EqpAuxiliaryTypeVo queryById(Long typeId);
|
||||
|
||||
/**
|
||||
* 查询公辅类型列表
|
||||
*/
|
||||
TableDataInfo<EqpAuxiliaryTypeVo> queryPageList(EqpAuxiliaryTypeBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询公辅类型列表
|
||||
*/
|
||||
List<EqpAuxiliaryTypeVo> queryList(EqpAuxiliaryTypeBo bo);
|
||||
|
||||
/**
|
||||
* 新增公辅类型
|
||||
*/
|
||||
Boolean insertByBo(EqpAuxiliaryTypeBo bo);
|
||||
|
||||
/**
|
||||
* 修改公辅类型
|
||||
*/
|
||||
Boolean updateByBo(EqpAuxiliaryTypeBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除公辅类型信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package com.klp.mes.eqp.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryConsumeBo;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryConsumeVo;
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryConsume;
|
||||
import com.klp.mes.eqp.mapper.EqpAuxiliaryConsumeMapper;
|
||||
import com.klp.mes.eqp.service.IEqpAuxiliaryConsumeService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 公辅消耗记录Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class EqpAuxiliaryConsumeServiceImpl implements IEqpAuxiliaryConsumeService {
|
||||
|
||||
private final EqpAuxiliaryConsumeMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录
|
||||
*/
|
||||
@Override
|
||||
public EqpAuxiliaryConsumeVo queryById(Long consumeId){
|
||||
return baseMapper.selectVoById(consumeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<EqpAuxiliaryConsumeVo> queryPageList(EqpAuxiliaryConsumeBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<EqpAuxiliaryConsume> lqw = buildQueryWrapper(bo);
|
||||
Page<EqpAuxiliaryConsumeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询公辅消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public List<EqpAuxiliaryConsumeVo> queryList(EqpAuxiliaryConsumeBo bo) {
|
||||
LambdaQueryWrapper<EqpAuxiliaryConsume> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<EqpAuxiliaryConsume> buildQueryWrapper(EqpAuxiliaryConsumeBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<EqpAuxiliaryConsume> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getRecordDate() != null, EqpAuxiliaryConsume::getRecordDate, bo.getRecordDate());
|
||||
lqw.eq(bo.getTypeId() != null, EqpAuxiliaryConsume::getTypeId, bo.getTypeId());
|
||||
lqw.eq(bo.getConsume() != null, EqpAuxiliaryConsume::getConsume, bo.getConsume());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增公辅消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Long insertByBo(EqpAuxiliaryConsumeBo bo) {
|
||||
EqpAuxiliaryConsume add = BeanUtil.toBean(bo, EqpAuxiliaryConsume.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setConsumeId(add.getConsumeId());
|
||||
}
|
||||
return add.getConsumeId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改公辅消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(EqpAuxiliaryConsumeBo bo) {
|
||||
EqpAuxiliaryConsume update = BeanUtil.toBean(bo, EqpAuxiliaryConsume.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(EqpAuxiliaryConsume entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除公辅消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package com.klp.mes.eqp.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryTypeBo;
|
||||
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryTypeVo;
|
||||
import com.klp.mes.eqp.domain.EqpAuxiliaryType;
|
||||
import com.klp.mes.eqp.mapper.EqpAuxiliaryTypeMapper;
|
||||
import com.klp.mes.eqp.service.IEqpAuxiliaryTypeService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 公辅类型Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-29
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class EqpAuxiliaryTypeServiceImpl implements IEqpAuxiliaryTypeService {
|
||||
|
||||
private final EqpAuxiliaryTypeMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询公辅类型
|
||||
*/
|
||||
@Override
|
||||
public EqpAuxiliaryTypeVo queryById(Long typeId){
|
||||
return baseMapper.selectVoById(typeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询公辅类型列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<EqpAuxiliaryTypeVo> queryPageList(EqpAuxiliaryTypeBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<EqpAuxiliaryType> lqw = buildQueryWrapper(bo);
|
||||
Page<EqpAuxiliaryTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询公辅类型列表
|
||||
*/
|
||||
@Override
|
||||
public List<EqpAuxiliaryTypeVo> queryList(EqpAuxiliaryTypeBo bo) {
|
||||
LambdaQueryWrapper<EqpAuxiliaryType> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<EqpAuxiliaryType> buildQueryWrapper(EqpAuxiliaryTypeBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<EqpAuxiliaryType> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(bo.getTypeName()), EqpAuxiliaryType::getTypeName, bo.getTypeName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getLineName()), EqpAuxiliaryType::getLineName, bo.getLineName());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增公辅类型
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(EqpAuxiliaryTypeBo bo) {
|
||||
EqpAuxiliaryType add = BeanUtil.toBean(bo, EqpAuxiliaryType.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setTypeId(add.getTypeId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改公辅类型
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(EqpAuxiliaryTypeBo bo) {
|
||||
EqpAuxiliaryType update = BeanUtil.toBean(bo, EqpAuxiliaryType.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(EqpAuxiliaryType entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除公辅类型
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.klp.mes.roll.controller;
|
||||
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.mes.roll.domain.bo.MesRollChangeBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollChangeVo;
|
||||
import com.klp.mes.roll.service.IMesRollChangeService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 换辊记录
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/mes/rollChange")
|
||||
public class MesRollChangeController extends BaseController {
|
||||
|
||||
private final IMesRollChangeService iMesRollChangeService;
|
||||
|
||||
/** 分页列表(支持按机架、换辊类型、时间筛选) */
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<MesRollChangeVo> list(MesRollChangeBo bo, PageQuery pageQuery) {
|
||||
return iMesRollChangeService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询指定机架当前在机轧辊(最近一次换辊记录)
|
||||
* GET /mes/rollChange/current?standNo=1%23
|
||||
*/
|
||||
@GetMapping("/current")
|
||||
public R<MesRollChangeVo> current(@RequestParam String standNo) {
|
||||
return R.ok(iMesRollChangeService.queryCurrentByStand(standNo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询指定机架当前轧辊的实时工作长度(m)
|
||||
* GET /mes/rollChange/workLength?standNo=1%23
|
||||
*/
|
||||
@GetMapping("/workLength")
|
||||
public R<BigDecimal> workLength(@RequestParam String standNo) {
|
||||
return R.ok(iMesRollChangeService.queryRealtimeWorkLength(standNo));
|
||||
}
|
||||
|
||||
/** 详情 */
|
||||
@GetMapping("/{changeId}")
|
||||
public R<MesRollChangeVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long changeId) {
|
||||
return R.ok(iMesRollChangeService.queryById(changeId));
|
||||
}
|
||||
|
||||
/** 新增换辊记录 */
|
||||
@Log(title = "换辊记录", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit
|
||||
@PostMapping
|
||||
public R<Long> add(@Validated @RequestBody MesRollChangeBo bo) {
|
||||
return R.ok(iMesRollChangeService.addChange(bo));
|
||||
}
|
||||
|
||||
/** 修改换辊记录 */
|
||||
@Log(title = "换辊记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit
|
||||
@PutMapping
|
||||
public R<Void> edit(@Validated @RequestBody MesRollChangeBo bo) {
|
||||
return toAjax(iMesRollChangeService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/** 删除换辊记录 */
|
||||
@Log(title = "换辊记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{changeIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] changeIds) {
|
||||
return toAjax(iMesRollChangeService.deleteWithValidByIds(Arrays.asList(changeIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package com.klp.mes.roll.controller;
|
||||
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.mes.roll.domain.bo.MesRollInfoBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollInfoVo;
|
||||
import com.klp.mes.roll.service.IMesRollInfoService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 轧辊库(轧辊总览页)
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/mes/rollInfo")
|
||||
public class MesRollInfoController extends BaseController {
|
||||
|
||||
private final IMesRollInfoService iMesRollInfoService;
|
||||
|
||||
/** 分页列表 */
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<MesRollInfoVo> list(MesRollInfoBo bo, PageQuery pageQuery) {
|
||||
return iMesRollInfoService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/** 状态统计卡片数据 */
|
||||
@GetMapping("/stats")
|
||||
public R<Map<String, Object>> stats() {
|
||||
return R.ok(iMesRollInfoService.queryStatusStats());
|
||||
}
|
||||
|
||||
/** 轧辊编号下拉列表(按辊型 + 状态过滤,均可为空) */
|
||||
@GetMapping("/options")
|
||||
public R<List<String>> options(String rollType, String status) {
|
||||
return R.ok(iMesRollInfoService.queryRollNoList(rollType, status));
|
||||
}
|
||||
|
||||
/** 详情 */
|
||||
@GetMapping("/{rollId}")
|
||||
public R<MesRollInfoVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long rollId) {
|
||||
return R.ok(iMesRollInfoService.queryById(rollId));
|
||||
}
|
||||
|
||||
/** 新增 */
|
||||
@Log(title = "轧辊库", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit
|
||||
@PostMapping
|
||||
public R<Long> add(@Validated(AddGroup.class) @RequestBody MesRollInfoBo bo) {
|
||||
return R.ok(iMesRollInfoService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/** 修改 */
|
||||
@Log(title = "轧辊库", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit
|
||||
@PutMapping
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MesRollInfoBo bo) {
|
||||
return toAjax(iMesRollInfoService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/** 删除 */
|
||||
@Log(title = "轧辊库", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{rollIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] rollIds) {
|
||||
return toAjax(iMesRollInfoService.deleteWithValidByIds(Arrays.asList(rollIds), true));
|
||||
}
|
||||
|
||||
/** 封闭轧辊(状态改为 Scrapped / 报废) */
|
||||
@Log(title = "轧辊库-封闭", businessType = BusinessType.UPDATE)
|
||||
@PutMapping("/{rollId}/scrap")
|
||||
public R<Void> scrap(@NotNull(message = "主键不能为空") @PathVariable Long rollId) {
|
||||
return toAjax(iMesRollInfoService.scrapRoll(rollId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 从换辊记录同步在线状态
|
||||
* 将当前各机架在机轧辊的状态强制修正为 Online,解决状态数据不一致问题
|
||||
*/
|
||||
@Log(title = "轧辊库-状态同步", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/syncStatus")
|
||||
public R<Void> syncStatus() {
|
||||
iMesRollInfoService.syncStatusFromChange();
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/** 导出 */
|
||||
@Log(title = "轧辊库", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(MesRollInfoBo bo, HttpServletResponse response) {
|
||||
List<MesRollInfoVo> list = iMesRollInfoService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "轧辊数据", MesRollInfoVo.class, response);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.klp.mes.roll.controller;
|
||||
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.mes.roll.domain.bo.MesRollStandbyBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollStandbyVo;
|
||||
import com.klp.mes.roll.service.IMesRollStandbyService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 下批轧辊(备用辊)
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/mes/rollStandby")
|
||||
public class MesRollStandbyController extends BaseController {
|
||||
|
||||
private final IMesRollStandbyService iMesRollStandbyService;
|
||||
|
||||
/**
|
||||
* 查询指定机架的下批轧辊列表
|
||||
* GET /mes/rollStandby/list?standNo=1%23
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public R<List<MesRollStandbyVo>> list(@RequestParam String standNo) {
|
||||
return R.ok(iMesRollStandbyService.queryByStand(standNo));
|
||||
}
|
||||
|
||||
/** 详情 */
|
||||
@GetMapping("/{standbyId}")
|
||||
public R<MesRollStandbyVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long standbyId) {
|
||||
return R.ok(iMesRollStandbyService.queryById(standbyId));
|
||||
}
|
||||
|
||||
/** 新增下批轧辊 */
|
||||
@Log(title = "下批轧辊", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit
|
||||
@PostMapping
|
||||
public R<Long> add(@Validated(AddGroup.class) @RequestBody MesRollStandbyBo bo) {
|
||||
return R.ok(iMesRollStandbyService.addStandby(bo));
|
||||
}
|
||||
|
||||
/** 修改下批轧辊 */
|
||||
@Log(title = "下批轧辊", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit
|
||||
@PutMapping
|
||||
public R<Void> edit(@Validated @RequestBody MesRollStandbyBo bo) {
|
||||
return toAjax(iMesRollStandbyService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/** 删除单条下批轧辊,同时将辊状态恢复为 Offline */
|
||||
@Log(title = "下批轧辊", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{standbyId}")
|
||||
public R<Void> remove(@NotNull(message = "主键不能为空") @PathVariable Long standbyId) {
|
||||
return toAjax(iMesRollStandbyService.deleteById(standbyId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空指定机架的全部下批轧辊
|
||||
* DELETE /mes/rollStandby/clear?standNo=1%23
|
||||
*/
|
||||
@Log(title = "下批轧辊", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/clear")
|
||||
public R<Void> clear(@RequestParam String standNo) {
|
||||
return toAjax(iMesRollStandbyService.clearByStand(standNo));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.klp.mes.roll.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 换辊记录 mes_roll_change
|
||||
* 四辊轧机,双机架(1# / 2#)
|
||||
* 每次换辊记录 4 支辊:上工作辊、下工作辊、上支撑辊、下支撑辊
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("mes_roll_change")
|
||||
public class MesRollChange extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "change_id")
|
||||
private Long changeId;
|
||||
|
||||
/** 换辊编号 */
|
||||
private String changeNo;
|
||||
|
||||
/** 换辊时间 */
|
||||
private Date changeTime;
|
||||
|
||||
/** 机架号:1# / 2# */
|
||||
private String standNo;
|
||||
|
||||
/** 换辊类型: 计划换辊 / 紧急换辊 */
|
||||
private String changeType;
|
||||
|
||||
/** 换辊状态 */
|
||||
private String changeStatus;
|
||||
|
||||
/** 操作人 */
|
||||
private String operator;
|
||||
|
||||
/** 上工作辊 */
|
||||
private String upperWrNo;
|
||||
private BigDecimal upperWrDia;
|
||||
|
||||
/** 下工作辊 */
|
||||
private String lowerWrNo;
|
||||
private BigDecimal lowerWrDia;
|
||||
|
||||
/** 上支撑辊 */
|
||||
private String upperBrNo;
|
||||
private BigDecimal upperBrDia;
|
||||
|
||||
/** 下支撑辊 */
|
||||
private String lowerBrNo;
|
||||
private BigDecimal lowerBrDia;
|
||||
|
||||
@TableLogic
|
||||
private Integer delFlag;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.klp.mes.roll.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 轧辊库 mes_roll_info
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("mes_roll_info")
|
||||
public class MesRollInfo extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "roll_id")
|
||||
private Long rollId;
|
||||
|
||||
/** 轧辊编号 */
|
||||
private String rollNo;
|
||||
|
||||
/** 辊型: WR=工作辊 / IR=中间辊 / BR=支撑辊 */
|
||||
private String rollType;
|
||||
|
||||
/** 状态: Offline / Standby / Online / Scrapped */
|
||||
private String status;
|
||||
|
||||
/** 初始辊径(mm) */
|
||||
private BigDecimal initialDia;
|
||||
|
||||
/** 当前辊径(mm) */
|
||||
private BigDecimal currentDia;
|
||||
|
||||
/** 最小可用辊径(mm) */
|
||||
private BigDecimal minDia;
|
||||
|
||||
/** 粗糙度 Ra(μm) */
|
||||
private BigDecimal roughness;
|
||||
|
||||
/** 凸度(mm) */
|
||||
private BigDecimal crown;
|
||||
|
||||
/** 材质 */
|
||||
private String material;
|
||||
|
||||
/** 磨削次数 */
|
||||
private Integer grindCount;
|
||||
|
||||
/** 累计轧制重量(t) */
|
||||
private BigDecimal totalRolledWeight;
|
||||
|
||||
/** 累计轧制长度(m) */
|
||||
private BigDecimal totalRolledLength;
|
||||
|
||||
/** 累计轧制卷数 */
|
||||
private Integer totalRolledCount;
|
||||
|
||||
/** 制造日期 */
|
||||
private Date manufactureDate;
|
||||
|
||||
@TableLogic
|
||||
private Integer delFlag;
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.klp.mes.roll.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 下批轧辊(备用辊,等待换上) mes_roll_standby
|
||||
*
|
||||
* 每条记录代表一个具体辊位的备用辊,例如:
|
||||
* 机架 1#、上工作辊位、辊号 WR-020
|
||||
*
|
||||
* 辊型(rollType):WR = 工作辊,BR = 支撑辊
|
||||
* 辊位(position):UP = 上,DOWN = 下
|
||||
* 机架(standNo):1# / 2#
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("mes_roll_standby")
|
||||
public class MesRollStandby extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "standby_id")
|
||||
private Long standbyId;
|
||||
|
||||
/** 机架号:1# / 2# */
|
||||
private String standNo;
|
||||
|
||||
/** 轧辊编号(关联 mes_roll_info.roll_no) */
|
||||
private String rollNo;
|
||||
|
||||
/** 辊型:WR(工作辊)/ BR(支撑辊) */
|
||||
private String rollType;
|
||||
|
||||
/** 辊位:UP(上)/ DOWN(下) */
|
||||
private String position;
|
||||
|
||||
/** 当前直径 */
|
||||
private BigDecimal diameter;
|
||||
|
||||
/** 粗糙度 */
|
||||
private BigDecimal roughness;
|
||||
|
||||
/** 凸度 */
|
||||
private BigDecimal crown;
|
||||
|
||||
/** 备用就绪时间 */
|
||||
private Date readyTime;
|
||||
|
||||
@TableLogic
|
||||
private Integer delFlag;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.klp.mes.roll.domain.bo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 换辊记录 业务对象
|
||||
* 四辊轧机,双机架(1# / 2#)
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class MesRollChangeBo extends BaseEntity {
|
||||
|
||||
private Long changeId;
|
||||
|
||||
private String changeNo;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date changeTime;
|
||||
|
||||
/** 机架号:1# / 2#,列表筛选用 */
|
||||
private String standNo;
|
||||
|
||||
/** 换辊类型(列表筛选用) */
|
||||
private String changeType;
|
||||
|
||||
private String changeStatus;
|
||||
|
||||
private String operator;
|
||||
|
||||
/** 上工作辊 */
|
||||
private String upperWrNo;
|
||||
private BigDecimal upperWrDia;
|
||||
|
||||
/** 下工作辊 */
|
||||
private String lowerWrNo;
|
||||
private BigDecimal lowerWrDia;
|
||||
|
||||
/** 上支撑辊 */
|
||||
private String upperBrNo;
|
||||
private BigDecimal upperBrDia;
|
||||
|
||||
/** 下支撑辊 */
|
||||
private String lowerBrNo;
|
||||
private BigDecimal lowerBrDia;
|
||||
|
||||
private String remark;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.klp.mes.roll.domain.bo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 轧辊库 业务对象
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class MesRollInfoBo extends BaseEntity {
|
||||
|
||||
@NotNull(message = "轧辊ID不能为空", groups = EditGroup.class)
|
||||
private Long rollId;
|
||||
|
||||
@NotBlank(message = "轧辊编号不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String rollNo;
|
||||
|
||||
@NotBlank(message = "辊型不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String rollType;
|
||||
|
||||
private String status;
|
||||
|
||||
private BigDecimal initialDia;
|
||||
|
||||
private BigDecimal currentDia;
|
||||
|
||||
private BigDecimal minDia;
|
||||
|
||||
private BigDecimal roughness;
|
||||
|
||||
private BigDecimal crown;
|
||||
|
||||
private String material;
|
||||
|
||||
private Integer grindCount;
|
||||
|
||||
private BigDecimal totalRolledWeight;
|
||||
|
||||
private BigDecimal totalRolledLength;
|
||||
|
||||
private Integer totalRolledCount;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date manufactureDate;
|
||||
|
||||
private String remark;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.klp.mes.roll.domain.bo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 下批轧辊 业务对象
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class MesRollStandbyBo extends BaseEntity {
|
||||
|
||||
private Long standbyId;
|
||||
|
||||
/** 机架号:1# / 2# */
|
||||
@NotBlank(message = "机架号不能为空", groups = AddGroup.class)
|
||||
private String standNo;
|
||||
|
||||
/** 轧辊编号 */
|
||||
@NotBlank(message = "轧辊编号不能为空", groups = AddGroup.class)
|
||||
private String rollNo;
|
||||
|
||||
/** 辊型:WR / BR */
|
||||
@NotBlank(message = "辊型不能为空", groups = AddGroup.class)
|
||||
private String rollType;
|
||||
|
||||
/** 辊位:UP / DOWN */
|
||||
@NotBlank(message = "辊位不能为空", groups = AddGroup.class)
|
||||
private String position;
|
||||
|
||||
private BigDecimal diameter;
|
||||
|
||||
private BigDecimal roughness;
|
||||
|
||||
private BigDecimal crown;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date readyTime;
|
||||
|
||||
private String remark;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.klp.mes.roll.domain.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 换辊记录 视图对象
|
||||
* 四辊轧机,双机架(1# / 2#)
|
||||
*/
|
||||
@Data
|
||||
public class MesRollChangeVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Long changeId;
|
||||
|
||||
private String changeNo;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date changeTime;
|
||||
|
||||
/** 机架号:1# / 2# */
|
||||
private String standNo;
|
||||
|
||||
private String changeType;
|
||||
|
||||
private String changeStatus;
|
||||
|
||||
private String operator;
|
||||
|
||||
/** 上工作辊 */
|
||||
private String upperWrNo;
|
||||
private BigDecimal upperWrDia;
|
||||
|
||||
/** 下工作辊 */
|
||||
private String lowerWrNo;
|
||||
private BigDecimal lowerWrDia;
|
||||
|
||||
/** 上支撑辊 */
|
||||
private String upperBrNo;
|
||||
private BigDecimal upperBrDia;
|
||||
|
||||
/** 下支撑辊 */
|
||||
private String lowerBrNo;
|
||||
private BigDecimal lowerBrDia;
|
||||
|
||||
private String remark;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTime;
|
||||
|
||||
/** 本次换辊方案的累计工作长度(m),由 WMS 卷料数据计算得出 */
|
||||
private BigDecimal workLength;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.klp.mes.roll.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 轧辊库 视图对象
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class MesRollInfoVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@ExcelProperty("轧辊ID")
|
||||
private Long rollId;
|
||||
|
||||
@ExcelProperty("轧辊编号")
|
||||
private String rollNo;
|
||||
|
||||
@ExcelProperty("辊型")
|
||||
private String rollType;
|
||||
|
||||
@ExcelProperty("状态")
|
||||
private String status;
|
||||
|
||||
@ExcelProperty("初始辊径(mm)")
|
||||
private BigDecimal initialDia;
|
||||
|
||||
@ExcelProperty("当前辊径(mm)")
|
||||
private BigDecimal currentDia;
|
||||
|
||||
@ExcelProperty("最小辊径(mm)")
|
||||
private BigDecimal minDia;
|
||||
|
||||
@ExcelProperty("粗糙度")
|
||||
private BigDecimal roughness;
|
||||
|
||||
@ExcelProperty("凸度(mm)")
|
||||
private BigDecimal crown;
|
||||
|
||||
@ExcelProperty("材质")
|
||||
private String material;
|
||||
|
||||
@ExcelProperty("磨削次数")
|
||||
private Integer grindCount;
|
||||
|
||||
@ExcelProperty("累计重量(t)")
|
||||
private BigDecimal totalRolledWeight;
|
||||
|
||||
@ExcelProperty("累计长度(m)")
|
||||
private BigDecimal totalRolledLength;
|
||||
|
||||
@ExcelProperty("累计卷数")
|
||||
private Integer totalRolledCount;
|
||||
|
||||
@ExcelProperty("制造日期")
|
||||
private Date manufactureDate;
|
||||
|
||||
@ExcelProperty("备注")
|
||||
private String remark;
|
||||
|
||||
private Date createTime;
|
||||
|
||||
private Date updateTime;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.klp.mes.roll.domain.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 下批轧辊 视图对象
|
||||
*/
|
||||
@Data
|
||||
public class MesRollStandbyVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Long standbyId;
|
||||
|
||||
/** 机架号:1# / 2# */
|
||||
private String standNo;
|
||||
|
||||
/** 轧辊编号 */
|
||||
private String rollNo;
|
||||
|
||||
/** 辊型:WR(工作辊)/ BR(支撑辊) */
|
||||
private String rollType;
|
||||
|
||||
/** 辊位:UP(上)/ DOWN(下) */
|
||||
private String position;
|
||||
|
||||
/** 辊位中文展示:上工作辊 / 下工作辊 / 上支撑辊 / 下支撑辊 */
|
||||
private String positionLabel;
|
||||
|
||||
private BigDecimal diameter;
|
||||
|
||||
private BigDecimal roughness;
|
||||
|
||||
private BigDecimal crown;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date readyTime;
|
||||
|
||||
private String remark;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTime;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.klp.mes.roll.mapper;
|
||||
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import com.klp.mes.roll.domain.MesRollChange;
|
||||
import com.klp.mes.roll.domain.vo.MesRollChangeVo;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 换辊记录 Mapper
|
||||
*/
|
||||
public interface MesRollChangeMapper extends BaseMapperPlus<MesRollChangeMapper, MesRollChange, MesRollChangeVo> {
|
||||
|
||||
/** 查询指定机架最新一次换辊记录(当前在机轧辊) */
|
||||
MesRollChangeVo selectLatestByStand(@Param("standNo") String standNo);
|
||||
|
||||
/**
|
||||
* 查询同机架下一次换辊时间(用于确定本次换辊的服务结束时刻)
|
||||
* 返回 null 表示该辊仍在机
|
||||
*/
|
||||
Date selectNextChangeTime(@Param("standNo") String standNo, @Param("changeTime") Date changeTime);
|
||||
|
||||
/**
|
||||
* 统计指定时间区间内的卷料实测长度之和(mm→调用方除以1000转m)
|
||||
* endTime 为 null 时统计到当前时刻
|
||||
*/
|
||||
BigDecimal selectWorkLength(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.klp.mes.roll.mapper;
|
||||
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import com.klp.mes.roll.domain.MesRollInfo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollInfoVo;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 轧辊库 Mapper
|
||||
*/
|
||||
public interface MesRollInfoMapper extends BaseMapperPlus<MesRollInfoMapper, MesRollInfo, MesRollInfoVo> {
|
||||
|
||||
/**
|
||||
* 按状态统计数量(用于总览卡片)
|
||||
*/
|
||||
List<Map<String, Object>> selectStatusStats();
|
||||
|
||||
/**
|
||||
* 查询轧辊编号列表(用于下拉选择,可按辊型和状态过滤)
|
||||
*/
|
||||
List<String> selectRollNoList(@Param("rollType") String rollType, @Param("status") String status);
|
||||
|
||||
/**
|
||||
* 按轧辊编号查询(用于换辊时同步状态)
|
||||
*/
|
||||
MesRollInfo selectByRollNo(@Param("rollNo") String rollNo);
|
||||
|
||||
/**
|
||||
* 更新轧辊状态
|
||||
*/
|
||||
int updateStatusByRollNo(@Param("rollNo") String rollNo, @Param("status") String status);
|
||||
|
||||
/**
|
||||
* 条件更新:仅当辊当前状态等于 onlyIfStatus 时才更新(用于避免误覆盖已 Online 的辊)
|
||||
*/
|
||||
int updateStatusByRollNoIfStatus(@Param("rollNo") String rollNo,
|
||||
@Param("status") String status,
|
||||
@Param("onlyIfStatus") String onlyIfStatus);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.klp.mes.roll.mapper;
|
||||
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import com.klp.mes.roll.domain.MesRollStandby;
|
||||
import com.klp.mes.roll.domain.vo.MesRollStandbyVo;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 下批轧辊 Mapper
|
||||
*/
|
||||
public interface MesRollStandbyMapper extends BaseMapperPlus<MesRollStandbyMapper, MesRollStandby, MesRollStandbyVo> {
|
||||
|
||||
/** 按机架查询下批轧辊列表 */
|
||||
List<MesRollStandbyVo> selectByStand(@Param("standNo") String standNo);
|
||||
|
||||
/** 清空某机架的下批轧辊 */
|
||||
int clearByStand(@Param("standNo") String standNo);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.klp.mes.roll.service;
|
||||
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.mes.roll.domain.bo.MesRollChangeBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollChangeVo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 换辊记录 Service 接口
|
||||
*/
|
||||
public interface IMesRollChangeService {
|
||||
|
||||
MesRollChangeVo queryById(Long changeId);
|
||||
|
||||
/** 查询指定机架当前在机轧辊(最新一次换辊记录) */
|
||||
MesRollChangeVo queryCurrentByStand(String standNo);
|
||||
|
||||
TableDataInfo<MesRollChangeVo> queryPageList(MesRollChangeBo bo, PageQuery pageQuery);
|
||||
|
||||
/** 新增换辊记录,同步将涉及的轧辊状态更新为 Online */
|
||||
Long addChange(MesRollChangeBo bo);
|
||||
|
||||
Boolean updateByBo(MesRollChangeBo bo);
|
||||
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 查询指定机架当前在机轧辊的实时工作长度(m)
|
||||
* 从最近一次换辊时间到现在,统计 WMS 卷料实测长度之和
|
||||
*/
|
||||
BigDecimal queryRealtimeWorkLength(String standNo);
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.klp.mes.roll.service;
|
||||
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.mes.roll.domain.bo.MesRollInfoBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollInfoVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 轧辊库 Service 接口
|
||||
*/
|
||||
public interface IMesRollInfoService {
|
||||
|
||||
MesRollInfoVo queryById(Long rollId);
|
||||
|
||||
TableDataInfo<MesRollInfoVo> queryPageList(MesRollInfoBo bo, PageQuery pageQuery);
|
||||
|
||||
List<MesRollInfoVo> queryList(MesRollInfoBo bo);
|
||||
|
||||
/** 按状态统计(总览卡片) */
|
||||
Map<String, Object> queryStatusStats();
|
||||
|
||||
/** 轧辊编号下拉列表(status 为 null 时不过滤状态) */
|
||||
List<String> queryRollNoList(String rollType, String status);
|
||||
|
||||
Long insertByBo(MesRollInfoBo bo);
|
||||
|
||||
Boolean updateByBo(MesRollInfoBo bo);
|
||||
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/** 封闭轧辊:状态设为 Scrapped */
|
||||
Boolean scrapRoll(Long rollId);
|
||||
|
||||
/**
|
||||
* 从换辊记录同步在线状态:
|
||||
* 每个机架最新一次换辊记录中的 4 支辊 → Online;
|
||||
* 下批辊列表中的辊 → Standby(已由 addStandby 维护,此处不重复处理);
|
||||
* 其余不变,仅修正当前在机辊的状态数据不一致问题。
|
||||
*/
|
||||
void syncStatusFromChange();
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.klp.mes.roll.service;
|
||||
|
||||
import com.klp.mes.roll.domain.bo.MesRollStandbyBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollStandbyVo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 下批轧辊 Service 接口
|
||||
*/
|
||||
public interface IMesRollStandbyService {
|
||||
|
||||
MesRollStandbyVo queryById(Long standbyId);
|
||||
|
||||
/** 查询指定机架的下批轧辊列表 */
|
||||
List<MesRollStandbyVo> queryByStand(String standNo);
|
||||
|
||||
/** 新增下批轧辊,同步将该辊状态更新为 Standby */
|
||||
Long addStandby(MesRollStandbyBo bo);
|
||||
|
||||
/** 修改下批轧辊 */
|
||||
Boolean updateByBo(MesRollStandbyBo bo);
|
||||
|
||||
/** 删除某条下批轧辊,同步将该辊状态恢复为 Offline */
|
||||
Boolean deleteById(Long standbyId);
|
||||
|
||||
/** 清空指定机架的全部下批轧辊,并将对应辊状态恢复为 Offline */
|
||||
Boolean clearByStand(String standNo);
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
package com.klp.mes.roll.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.helper.LoginHelper;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.mes.roll.domain.MesRollChange;
|
||||
import com.klp.mes.roll.domain.bo.MesRollChangeBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollChangeVo;
|
||||
import com.klp.mes.roll.mapper.MesRollChangeMapper;
|
||||
import com.klp.mes.roll.mapper.MesRollInfoMapper;
|
||||
import com.klp.mes.roll.service.IMesRollChangeService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 换辊记录 Service 实现
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class MesRollChangeServiceImpl implements IMesRollChangeService {
|
||||
|
||||
private final MesRollChangeMapper baseMapper;
|
||||
private final MesRollInfoMapper rollInfoMapper;
|
||||
|
||||
@Override
|
||||
public MesRollChangeVo queryById(Long changeId) {
|
||||
return baseMapper.selectVoById(changeId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MesRollChangeVo queryCurrentByStand(String standNo) {
|
||||
return baseMapper.selectLatestByStand(standNo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableDataInfo<MesRollChangeVo> queryPageList(MesRollChangeBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<MesRollChange> lqw = buildQueryWrapper(bo);
|
||||
Page<MesRollChangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
// 为每条换辊记录计算工作长度(上辊时间 → 下辊时间,下辊时间为 null 时统计到 NOW())
|
||||
for (MesRollChangeVo vo : result.getRecords()) {
|
||||
Date endTime = baseMapper.selectNextChangeTime(vo.getStandNo(), vo.getChangeTime());
|
||||
BigDecimal lengthMm = baseMapper.selectWorkLength(vo.getChangeTime(), endTime);
|
||||
// mm 转 m,保留 2 位小数
|
||||
vo.setWorkLength(lengthMm == null ? BigDecimal.ZERO
|
||||
: lengthMm.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP));
|
||||
}
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigDecimal queryRealtimeWorkLength(String standNo) {
|
||||
MesRollChangeVo latest = baseMapper.selectLatestByStand(standNo);
|
||||
if (latest == null || latest.getChangeTime() == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
BigDecimal lengthMm = baseMapper.selectWorkLength(latest.getChangeTime(), null);
|
||||
return lengthMm == null ? BigDecimal.ZERO
|
||||
: lengthMm.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<MesRollChange> buildQueryWrapper(MesRollChangeBo bo) {
|
||||
LambdaQueryWrapper<MesRollChange> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getStandNo()), MesRollChange::getStandNo, bo.getStandNo());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), MesRollChange::getChangeType, bo.getChangeType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getChangeStatus()), MesRollChange::getChangeStatus, bo.getChangeStatus());
|
||||
if (bo.getChangeTime() != null) {
|
||||
lqw.ge(MesRollChange::getChangeTime, bo.getChangeTime());
|
||||
}
|
||||
lqw.orderByDesc(MesRollChange::getChangeTime, MesRollChange::getChangeId);
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long addChange(MesRollChangeBo bo) {
|
||||
MesRollChange add = BeanUtil.toBean(bo, MesRollChange.class);
|
||||
if (StringUtils.isBlank(add.getChangeNo())) {
|
||||
add.setChangeNo("RC" + IdUtil.fastSimpleUUID().substring(0, 8).toUpperCase());
|
||||
}
|
||||
// 换辊时间强制使用服务器当前时间
|
||||
add.setChangeTime(new Date());
|
||||
// 操作人取当前登录用户昵称
|
||||
add.setOperator(LoginHelper.getNickName());
|
||||
// 换辊类型固定为"计划换辊"(通过页面触发)
|
||||
if (StringUtils.isBlank(add.getChangeType())) {
|
||||
add.setChangeType("三级换辊");
|
||||
}
|
||||
// 换辊前:将上一批在机轧辊状态改为 Offline
|
||||
MesRollChangeVo prev = baseMapper.selectLatestByStand(add.getStandNo());
|
||||
if (prev != null) {
|
||||
for (String rollNo : Arrays.asList(
|
||||
prev.getUpperWrNo(), prev.getLowerWrNo(),
|
||||
prev.getUpperBrNo(), prev.getLowerBrNo())) {
|
||||
if (StringUtils.isNotBlank(rollNo)) {
|
||||
rollInfoMapper.updateStatusByRollNo(rollNo, "Offline");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
baseMapper.insert(add);
|
||||
|
||||
// 将本次换上的 4 支辊状态同步为 Online
|
||||
List<String> rollNos = Arrays.asList(
|
||||
add.getUpperWrNo(), add.getLowerWrNo(),
|
||||
add.getUpperBrNo(), add.getLowerBrNo()
|
||||
);
|
||||
for (String rollNo : rollNos) {
|
||||
if (StringUtils.isNotBlank(rollNo)) {
|
||||
rollInfoMapper.updateStatusByRollNo(rollNo, "Online");
|
||||
}
|
||||
}
|
||||
|
||||
return add.getChangeId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateByBo(MesRollChangeBo bo) {
|
||||
MesRollChange update = BeanUtil.toBean(bo, MesRollChange.class);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
package com.klp.mes.roll.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.mes.roll.domain.MesRollInfo;
|
||||
import com.klp.mes.roll.domain.bo.MesRollInfoBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollInfoVo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollChangeVo;
|
||||
import com.klp.mes.roll.mapper.MesRollChangeMapper;
|
||||
import com.klp.mes.roll.mapper.MesRollInfoMapper;
|
||||
import com.klp.mes.roll.service.IMesRollInfoService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 轧辊库 Service 实现
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class MesRollInfoServiceImpl implements IMesRollInfoService {
|
||||
|
||||
private final MesRollInfoMapper baseMapper;
|
||||
private final MesRollChangeMapper rollChangeMapper;
|
||||
|
||||
@Override
|
||||
public MesRollInfoVo queryById(Long rollId) {
|
||||
return baseMapper.selectVoById(rollId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableDataInfo<MesRollInfoVo> queryPageList(MesRollInfoBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<MesRollInfo> lqw = buildQueryWrapper(bo);
|
||||
Page<MesRollInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MesRollInfoVo> queryList(MesRollInfoBo bo) {
|
||||
LambdaQueryWrapper<MesRollInfo> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> queryStatusStats() {
|
||||
List<Map<String, Object>> rows = baseMapper.selectStatusStats();
|
||||
Map<String, Object> result = new HashMap<String, Object>(8);
|
||||
int total = 0;
|
||||
for (Map<String, Object> row : rows) {
|
||||
String status = (String) row.get("status");
|
||||
Number cnt = (Number) row.get("cnt");
|
||||
result.put(status, cnt.intValue());
|
||||
total += cnt.intValue();
|
||||
}
|
||||
result.put("total", total);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> queryRollNoList(String rollType, String status) {
|
||||
return baseMapper.selectRollNoList(rollType, status);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<MesRollInfo> buildQueryWrapper(MesRollInfoBo bo) {
|
||||
LambdaQueryWrapper<MesRollInfo> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(bo.getRollNo()), MesRollInfo::getRollNo, bo.getRollNo());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getRollType()), MesRollInfo::getRollType, bo.getRollType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), MesRollInfo::getStatus, bo.getStatus());
|
||||
lqw.orderByAsc(MesRollInfo::getRollType, MesRollInfo::getRollId);
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long insertByBo(MesRollInfoBo bo) {
|
||||
MesRollInfo add = BeanUtil.toBean(bo, MesRollInfo.class);
|
||||
if (StringUtils.isBlank(add.getStatus())) {
|
||||
add.setStatus("Offline");
|
||||
}
|
||||
if (add.getGrindCount() == null) {
|
||||
add.setGrindCount(0);
|
||||
}
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setRollId(add.getRollId());
|
||||
}
|
||||
return add.getRollId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateByBo(MesRollInfoBo bo) {
|
||||
MesRollInfo update = BeanUtil.toBean(bo, MesRollInfo.class);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean scrapRoll(Long rollId) {
|
||||
MesRollInfo current = baseMapper.selectById(rollId);
|
||||
if (current == null || !"Offline".equals(current.getStatus())) {
|
||||
throw new RuntimeException("只有离线状态的轧辊才可封闭");
|
||||
}
|
||||
MesRollInfo update = new MesRollInfo();
|
||||
update.setRollId(rollId);
|
||||
update.setStatus("Scrapped");
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncStatusFromChange() {
|
||||
// 从每个机架最新换辊记录中取出在机辊号,更新为 Online
|
||||
for (String standNo : Arrays.asList("1#", "2#")) {
|
||||
MesRollChangeVo latest = rollChangeMapper.selectLatestByStand(standNo);
|
||||
if (latest == null) continue;
|
||||
for (String rollNo : Arrays.asList(
|
||||
latest.getUpperWrNo(), latest.getLowerWrNo(),
|
||||
latest.getUpperBrNo(), latest.getLowerBrNo())) {
|
||||
if (StringUtils.isNotBlank(rollNo)) {
|
||||
baseMapper.updateStatusByRollNo(rollNo, "Online");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.klp.mes.roll.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.mes.roll.domain.MesRollStandby;
|
||||
import com.klp.mes.roll.domain.bo.MesRollStandbyBo;
|
||||
import com.klp.mes.roll.domain.vo.MesRollStandbyVo;
|
||||
import com.klp.mes.roll.mapper.MesRollInfoMapper;
|
||||
import com.klp.mes.roll.mapper.MesRollStandbyMapper;
|
||||
import com.klp.mes.roll.service.IMesRollStandbyService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 下批轧辊 Service 实现
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class MesRollStandbyServiceImpl implements IMesRollStandbyService {
|
||||
|
||||
private final MesRollStandbyMapper baseMapper;
|
||||
private final MesRollInfoMapper rollInfoMapper;
|
||||
|
||||
@Override
|
||||
public MesRollStandbyVo queryById(Long standbyId) {
|
||||
return baseMapper.selectVoById(standbyId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MesRollStandbyVo> queryByStand(String standNo) {
|
||||
return baseMapper.selectByStand(standNo);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long addStandby(MesRollStandbyBo bo) {
|
||||
MesRollStandby add = BeanUtil.toBean(bo, MesRollStandby.class);
|
||||
if (add.getReadyTime() == null) {
|
||||
add.setReadyTime(new Date());
|
||||
}
|
||||
baseMapper.insert(add);
|
||||
// 将该辊状态更新为 Standby(下批待用)
|
||||
if (StringUtils.isNotBlank(add.getRollNo())) {
|
||||
rollInfoMapper.updateStatusByRollNo(add.getRollNo(), "Standby");
|
||||
}
|
||||
return add.getStandbyId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateByBo(MesRollStandbyBo bo) {
|
||||
MesRollStandby update = BeanUtil.toBean(bo, MesRollStandby.class);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean deleteById(Long standbyId) {
|
||||
MesRollStandbyVo vo = baseMapper.selectVoById(standbyId);
|
||||
boolean ok = baseMapper.deleteById(standbyId) > 0;
|
||||
// 只有仍处于 Standby 状态时才回退为 Offline(若已换上变 Online 则不干涉)
|
||||
if (ok && vo != null && StringUtils.isNotBlank(vo.getRollNo())) {
|
||||
rollInfoMapper.updateStatusByRollNoIfStatus(vo.getRollNo(), "Offline", "Standby");
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean clearByStand(String standNo) {
|
||||
// 先查出所有辊号再清空
|
||||
List<MesRollStandbyVo> list = baseMapper.selectByStand(standNo);
|
||||
int rows = baseMapper.clearByStand(standNo);
|
||||
for (MesRollStandbyVo vo : list) {
|
||||
if (StringUtils.isNotBlank(vo.getRollNo())) {
|
||||
// 只有仍处于 Standby 状态时才回退为 Offline(换辊后已变 Online 的不动)
|
||||
rollInfoMapper.updateStatusByRollNoIfStatus(vo.getRollNo(), "Offline", "Standby");
|
||||
}
|
||||
}
|
||||
return rows > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.mes.eqp.mapper.EqpAuxiliaryConsumeMapper">
|
||||
|
||||
<resultMap type="com.klp.mes.eqp.domain.EqpAuxiliaryConsume" id="EqpAuxiliaryConsumeResult">
|
||||
<result property="consumeId" column="consume_id"/>
|
||||
<result property="recordDate" column="record_date"/>
|
||||
<result property="typeId" column="type_id"/>
|
||||
<result property="consume" column="consume"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.mes.eqp.mapper.EqpAuxiliaryTypeMapper">
|
||||
|
||||
<resultMap type="com.klp.mes.eqp.domain.EqpAuxiliaryType" id="EqpAuxiliaryTypeResult">
|
||||
<result property="typeId" column="type_id"/>
|
||||
<result property="typeName" column="type_name"/>
|
||||
<result property="lineName" column="line_name"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.mes.roll.mapper.MesRollChangeMapper">
|
||||
|
||||
<!-- 查询指定机架最新一次换辊记录(即当前在机轧辊) -->
|
||||
<select id="selectLatestByStand" resultType="com.klp.mes.roll.domain.vo.MesRollChangeVo">
|
||||
SELECT change_id, change_no, change_time, stand_no, change_type, change_status, operator,
|
||||
upper_wr_no, upper_wr_dia, lower_wr_no, lower_wr_dia,
|
||||
upper_br_no, upper_br_dia, lower_br_no, lower_br_dia,
|
||||
remark, create_time
|
||||
FROM mes_roll_change
|
||||
WHERE del_flag = 0
|
||||
AND stand_no = #{standNo}
|
||||
ORDER BY change_time DESC, change_id DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 查询同机架在本次换辊之后最近一次换辊的时间 -->
|
||||
<select id="selectNextChangeTime" resultType="java.util.Date">
|
||||
SELECT MIN(change_time)
|
||||
FROM mes_roll_change
|
||||
WHERE del_flag = 0
|
||||
AND stand_no = #{standNo}
|
||||
AND change_time > #{changeTime}
|
||||
</select>
|
||||
|
||||
<!--
|
||||
统计 [startTime, endTime) 时间段内,
|
||||
符合条件的 wms_coil_pending_action 记录关联的卷料实测长度之和(mm)。
|
||||
endTime 为 null 时取 NOW() 作为上界。
|
||||
processed_coil_ids 存储逗号分隔的 material_id 列表,使用 FIND_IN_SET 关联。
|
||||
-->
|
||||
<select id="selectWorkLength" resultType="java.math.BigDecimal">
|
||||
SELECT IFNULL(SUM(mc.actual_length), 0)
|
||||
FROM wms_coil_pending_action cpa
|
||||
INNER JOIN wms_material_coil mc
|
||||
ON FIND_IN_SET(mc.coil_id, cpa.processed_coil_ids) > 0
|
||||
WHERE cpa.del_flag = 0
|
||||
AND cpa.action_status = 2
|
||||
AND cpa.action_type IN (205, 504, 524)
|
||||
AND cpa.create_time >= #{startTime}
|
||||
AND cpa.create_time < IFNULL(#{endTime}, NOW())
|
||||
AND mc.create_time >= #{startTime}
|
||||
AND mc.create_time < IFNULL(#{endTime}, NOW())
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
45
klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml
Normal file
45
klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.mes.roll.mapper.MesRollInfoMapper">
|
||||
|
||||
<select id="selectStatusStats" resultType="map">
|
||||
SELECT status, COUNT(*) AS cnt
|
||||
FROM mes_roll_info
|
||||
WHERE del_flag = 0
|
||||
GROUP BY status
|
||||
</select>
|
||||
|
||||
<select id="selectRollNoList" resultType="string">
|
||||
SELECT roll_no FROM mes_roll_info
|
||||
WHERE del_flag = 0
|
||||
AND status != 'Scrapped'
|
||||
<if test="rollType != null and rollType != ''">
|
||||
AND roll_type = #{rollType}
|
||||
</if>
|
||||
<if test="status != null and status != ''">
|
||||
AND status = #{status}
|
||||
</if>
|
||||
ORDER BY roll_no ASC
|
||||
</select>
|
||||
|
||||
<select id="selectByRollNo" resultType="com.klp.mes.roll.domain.MesRollInfo">
|
||||
SELECT * FROM mes_roll_info
|
||||
WHERE del_flag = 0 AND roll_no = #{rollNo}
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<update id="updateStatusByRollNo">
|
||||
UPDATE mes_roll_info
|
||||
SET status = #{status}, update_time = NOW()
|
||||
WHERE del_flag = 0 AND roll_no = #{rollNo}
|
||||
</update>
|
||||
|
||||
<update id="updateStatusByRollNoIfStatus">
|
||||
UPDATE mes_roll_info
|
||||
SET status = #{status}, update_time = NOW()
|
||||
WHERE del_flag = 0 AND roll_no = #{rollNo} AND status = #{onlyIfStatus}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.mes.roll.mapper.MesRollStandbyMapper">
|
||||
|
||||
<!-- 按机架查询下批轧辊,附带辊位中文标签 -->
|
||||
<select id="selectByStand" resultType="com.klp.mes.roll.domain.vo.MesRollStandbyVo">
|
||||
SELECT
|
||||
standby_id, stand_no, roll_no, roll_type, position,
|
||||
CASE
|
||||
WHEN roll_type = 'BR' AND position = 'UP' THEN '上支撑辊'
|
||||
WHEN roll_type = 'WR' AND position = 'UP' THEN '上工作辊'
|
||||
WHEN roll_type = 'WR' AND position = 'DOWN' THEN '下工作辊'
|
||||
WHEN roll_type = 'BR' AND position = 'DOWN' THEN '下支撑辊'
|
||||
ELSE CONCAT(position, roll_type)
|
||||
END AS position_label,
|
||||
diameter, roughness, crown, ready_time, remark, create_time
|
||||
FROM mes_roll_standby
|
||||
WHERE del_flag = 0
|
||||
AND stand_no = #{standNo}
|
||||
ORDER BY
|
||||
FIELD(roll_type, 'BR', 'WR', 'WR', 'BR'),
|
||||
FIELD(position, 'UP', 'UP', 'DOWN', 'DOWN')
|
||||
</select>
|
||||
|
||||
<!-- 逻辑删除指定机架所有下批轧辊(清空) -->
|
||||
<update id="clearByStand">
|
||||
UPDATE mes_roll_standby
|
||||
SET del_flag = 1
|
||||
WHERE del_flag = 0
|
||||
AND stand_no = #{standNo}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -41,6 +41,11 @@ public interface ISysDictDataService {
|
||||
*/
|
||||
SysDictData selectDictDataById(Long dictCode);
|
||||
|
||||
/**
|
||||
* 按字典类型查询字典数据(直查库)。用于 HTTP `/dict/data/type/{type}`,避免 Spring Cache 在无界面操作灌数后仍返回空。
|
||||
*/
|
||||
List<SysDictData> selectDictDataByTypeRealtime(String dictType);
|
||||
|
||||
/**
|
||||
* 批量删除字典数据信息
|
||||
*
|
||||
|
||||
@@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.cache.annotation.CachePut;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -81,6 +82,18 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
|
||||
return baseMapper.selectById(dictCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按类型查字典数据(直查数据库,不走 {@link com.klp.system.service.impl.SysDictTypeServiceImpl#selectDictDataByType} 的 Spring Cache)。
|
||||
* SQL 脚本直插或外部改表后,仍需立即在「按类型」HTTP 接口中可见,避免长期使用空缓存。
|
||||
*/
|
||||
@Override
|
||||
public List<SysDictData> selectDictDataByTypeRealtime(String dictType) {
|
||||
if (StringUtils.isBlank(dictType)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return baseMapper.selectDictDataByType(dictType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除字典数据信息
|
||||
*
|
||||
|
||||
@@ -119,7 +119,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
|
||||
@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
|
||||
@Override
|
||||
public SysDictType selectDictTypeByType(String dictType) {
|
||||
return baseMapper.selectById(new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getDictType, dictType));
|
||||
return baseMapper.selectOne(new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getDictType, dictType));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,3 +42,11 @@ export function delPlanDetail(planDetailId) {
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询排产单对应的钢卷列表
|
||||
export function listPlanCoils(planSheetId) {
|
||||
return request({
|
||||
url: '/aps/planDetail/coils/' + planSheetId,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
@@ -52,3 +52,14 @@ export function listOrderPackaging(orderId) {
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询今日订单
|
||||
*/
|
||||
export function listTodayOrder(query) {
|
||||
return request({
|
||||
url: '/crm/order/daily',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
44
klp-ui/src/api/ems/energyRecord.js
Normal file
44
klp-ui/src/api/ems/energyRecord.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询能源消耗记录列表
|
||||
export function listEnergyRecord(query) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询能源消耗记录详细
|
||||
export function getEnergyRecord(energyRecordId) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/' + energyRecordId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增能源消耗记录
|
||||
export function addEnergyRecord(data) {
|
||||
return request({
|
||||
url: '/ems/energyRecord',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改能源消耗记录
|
||||
export function updateEnergyRecord(data) {
|
||||
return request({
|
||||
url: '/ems/energyRecord',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除能源消耗记录
|
||||
export function delEnergyRecord(energyRecordId) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/' + energyRecordId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user