diff --git a/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java b/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
index 71c7b90..759c823 100644
--- a/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
+++ b/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
@@ -22,6 +22,7 @@ public enum HttpErrorResponseEnum implements NcHttpErrorResponseInterface {
MATERIAL_ID_INVALID("材料 id 无效", 400, HttpStatus.SC_NOT_FOUND),
MATERIAL_PARENT_ID_INVALID("材料 parent_id 无效", 400, HttpStatus.SC_NOT_FOUND),
MATERIAL_TASK_NOT_FOUND("找不到指定材料采集任务", 400, HttpStatus.SC_NOT_FOUND),
+ MATERIAL_RESULT_NOT_FOUND("找不到指定材料采集结果", 400, HttpStatus.SC_NOT_FOUND),
;
private String message;
diff --git a/src/main/java/mjkf/xinke/main/controller/MaterialResultController.java b/src/main/java/mjkf/xinke/main/controller/MaterialResultController.java
new file mode 100644
index 0000000..7461196
--- /dev/null
+++ b/src/main/java/mjkf/xinke/main/controller/MaterialResultController.java
@@ -0,0 +1,59 @@
+package mjkf.xinke.main.controller;
+
+import com.jgy.xxs.core.http.exp.NcHttpException;
+import com.jgy.xxs.core.http.resp.HttpResponse;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import mjkf.xinke.main.common.http.FuHttpResponse;
+import mjkf.xinke.main.constant.HttpErrorResponseEnum;
+import mjkf.xinke.main.service.MaterialResultService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ *
+ * 材料结果 前端控制器
+ *
+ *
+ * @author han0
+ * @since 2023-11-09
+ */
+@RestController
+@RequestMapping("/material-result")
+public class MaterialResultController {
+ @Resource
+ MaterialResultService materialResultService;
+
+ @ApiOperation("获取材料结果列表")
+ @GetMapping("/")
+ public HttpResponse list (
+ @ApiParam("关键字") @RequestParam(value="key_word", required=false) String keyWord,
+ @ApiParam("年份") @RequestParam("year") Integer year,
+ @ApiParam("月份") @RequestParam(value="month") Integer month,
+ @ApiParam("类型") @RequestParam("type") Integer type,
+ @ApiParam("材料编号") @RequestParam(value="material_id", required=false) String materialId,
+ @ApiParam("名称") @RequestParam(value="name", required=false) String name
+ ) throws Exception{
+ var query = materialResultService.getQuery(keyWord, year, month, type, materialId, name);
+ query = materialResultService.filterQuery(query, type);
+ var result = materialResultService.listStatistics(query, type);
+ return FuHttpResponse.Builder().dataResponse(result).build();
+ }
+
+ @ApiOperation("获取材料结果趋势")
+ @GetMapping("/{id}/trend")
+ public HttpResponse getTrend (
+ @PathVariable String id,
+ @ApiParam("类型") @RequestParam("type") Integer type,
+ @ApiParam("年份") @RequestParam("year") Integer year,
+ @ApiParam("月份") @RequestParam(value="month") Integer month
+ ) throws Exception{
+ var data = materialResultService.getById(id, type);
+ if (data == null) {
+ throw new NcHttpException(HttpErrorResponseEnum.MATERIAL_RESULT_NOT_FOUND);
+ }
+ var result = materialResultService.getTrend(data, year, month, type);
+ return FuHttpResponse.Builder().dataResponse(result).build();
+ }
+}
diff --git a/src/main/java/mjkf/xinke/main/model/db/SteelPlate.java b/src/main/java/mjkf/xinke/main/model/db/SteelPlate.java
index 5bbefbe..fcce084 100644
--- a/src/main/java/mjkf/xinke/main/model/db/SteelPlate.java
+++ b/src/main/java/mjkf/xinke/main/model/db/SteelPlate.java
@@ -71,4 +71,8 @@ public class SteelPlate extends SteelEntity {
public SteelPlate(Row row) {
this.fromRow(row);
}
+
+ public void update(SteelPlate data) {
+ super.update(data);
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/model/db/SteelRebar.java b/src/main/java/mjkf/xinke/main/model/db/SteelRebar.java
index e69caf9..8048f24 100644
--- a/src/main/java/mjkf/xinke/main/model/db/SteelRebar.java
+++ b/src/main/java/mjkf/xinke/main/model/db/SteelRebar.java
@@ -1,9 +1,7 @@
package mjkf.xinke.main.model.db;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -70,4 +68,8 @@ public class SteelRebar extends SteelEntity {
public SteelRebar(Row row) {
this.fromRow(row);
}
+
+ public void update(SteelRebar data) {
+ super.update(data);
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/model/db/SteelSection.java b/src/main/java/mjkf/xinke/main/model/db/SteelSection.java
index 337d32e..1a49037 100644
--- a/src/main/java/mjkf/xinke/main/model/db/SteelSection.java
+++ b/src/main/java/mjkf/xinke/main/model/db/SteelSection.java
@@ -70,4 +70,8 @@ public class SteelSection extends SteelEntity{
public SteelSection(Row row) {
this.fromRow(row);
}
+
+ public void update(SteelSection data) {
+ super.update(data);
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/model/db/SteelStrand.java b/src/main/java/mjkf/xinke/main/model/db/SteelStrand.java
new file mode 100644
index 0000000..0f808a9
--- /dev/null
+++ b/src/main/java/mjkf/xinke/main/model/db/SteelStrand.java
@@ -0,0 +1,78 @@
+package mjkf.xinke.main.model.db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.poi.ss.usermodel.Row;
+
+/**
+ *
+ * 钢绞线
+ *
+ *
+ * @author han0
+ * @since 2023-11-08
+ */
+@Getter
+@Setter
+@TableName("STEEL_STRAND")
+@ApiModel(value = "SteelStrand对象", description = "钢绞线")
+public class SteelStrand extends SteelEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "ID", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("名称")
+ @TableField("`NAME`")
+ private String name;
+
+ @ApiModelProperty("规格")
+ @TableField("SPEC")
+ private String spec;
+
+ @ApiModelProperty("材质")
+ @TableField("MATERIAL")
+ private String material;
+
+ @ApiModelProperty("产地")
+ @TableField("`SOURCE`")
+ private String source;
+
+ @ApiModelProperty("价格")
+ @TableField("PRICE")
+ private BigDecimal price;
+
+ @ApiModelProperty("浮动")
+ @TableField("FLUCTUATING")
+ private BigDecimal fluctuating;
+
+ @ApiModelProperty("日期")
+ @TableField("`DATE`")
+ private LocalDate date;
+
+ @Override
+ public Serializable pkVal() {
+ return this.id;
+ }
+
+ public SteelStrand() {}
+
+ public SteelStrand(Row row) {
+ this.fromRow(row);
+ }
+
+ public void update(SteelStrand data) {
+ super.update(data);
+ }
+}
diff --git a/src/main/java/mjkf/xinke/main/service/ApiService.java b/src/main/java/mjkf/xinke/main/service/ApiService.java
index 01b08c4..03ca844 100644
--- a/src/main/java/mjkf/xinke/main/service/ApiService.java
+++ b/src/main/java/mjkf/xinke/main/service/ApiService.java
@@ -2,7 +2,6 @@ package mjkf.xinke.main.service;
import com.jgy.xxs.core.http.exp.NcHttpException;
import mjkf.xinke.main.constant.HttpErrorResponseEnum;
-import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
diff --git a/src/main/java/mjkf/xinke/main/service/AsphaltDomesticService.java b/src/main/java/mjkf/xinke/main/service/AsphaltDomesticService.java
index d33b806..68f2a94 100644
--- a/src/main/java/mjkf/xinke/main/service/AsphaltDomesticService.java
+++ b/src/main/java/mjkf/xinke/main/service/AsphaltDomesticService.java
@@ -3,38 +3,73 @@ package mjkf.xinke.main.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import mjkf.xinke.main.model.db.AsphaltDomestic;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Service;
+import java.time.LocalDate;
import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Map;
+
@Service
-public class AsphaltDomesticService extends ServiceImpl, AsphaltDomestic> {
- public boolean saveOrUpdateByIndex(AsphaltDomestic data) {
- var result = this.getOne(this.indexQuery(data));
- if (result == null) {
- return this.save(data);
- } else {
- result.update(data);
- return this.updateById(result);
- }
- }
-
- public List saveOrUpdateByIndexBatch(List rows) {
- var list = rows.stream().map(item -> new AsphaltDomestic(item)).collect(Collectors.toList());
- for (AsphaltDomestic item : list) {
- this.saveOrUpdateByIndex(item);
- }
- return list;
- }
-
- private LambdaQueryWrapper indexQuery(AsphaltDomestic data) {
+public class AsphaltDomesticService extends DataService, AsphaltDomestic> {
+ public LambdaQueryWrapper indexQuery(AsphaltDomestic data) {
LambdaQueryWrapper query = new LambdaQueryWrapper<>();
query.eq(AsphaltDomestic::getName, data.getName());
query.eq(AsphaltDomestic::getDate, data.getDate());
return query;
}
+
+ public LambdaQueryWrapper trendQuery(Object obj, Integer year, Integer month) {
+ var data = (AsphaltDomestic) obj;
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ query.eq(AsphaltDomestic::getName, data.getName());
+ query.between(AsphaltDomestic::getDate, LocalDate.of(year, month, 1), LocalDate.of(year, month + 1, 1));
+ return query;
+ }
+
+ public LambdaQueryWrapper getQuery(String keyWord, Integer year, Integer month, String materialId, String name) {
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ if (keyWord != null) {
+ query.and(e -> e
+ .like(AsphaltDomestic::getName, keyWord).or()
+ );
+ }
+ if (year != null) {
+ query.between(AsphaltDomestic::getDate,
+ LocalDate.of(year, 1, 1),
+ LocalDate.of(year + 1, 1, 1)
+ );
+ }
+ if (month != null) {
+ query.between(AsphaltDomestic::getDate,
+ LocalDate.of(year, month, 1),
+ LocalDate.of(year, month + 1, 1)
+ );
+ }
+ if (name != null) {
+ query.like(AsphaltDomestic::getName, name);
+ }
+ if (materialId != null) {
+ // todo
+ // query.eq(SteelSection::getMaterialId, materialId);
+ }
+ return query;
+ }
+
+ public LambdaQueryWrapper filterQuery(LambdaQueryWrapper query) {
+ query.in(AsphaltDomestic::getName, List.of(
+ "浙江省—镇海炼化(70#,90#,A级)",
+ "福建省—联合石化(70#,A级)",
+ "广东省—茂名石化(70#,90#,A级)",
+ "广东省—中油高富(70#,90#,A级)华南公司"
+ ));
+ return query;
+ }
+
+ public AsphaltDomestic getMapGroupingBy(Map item) {
+ var o = new AsphaltDomestic();
+ o.setName(item.get("name").toString());
+ return o;
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/service/AsphaltImportedService.java b/src/main/java/mjkf/xinke/main/service/AsphaltImportedService.java
index c10d389..56b0e4f 100644
--- a/src/main/java/mjkf/xinke/main/service/AsphaltImportedService.java
+++ b/src/main/java/mjkf/xinke/main/service/AsphaltImportedService.java
@@ -3,38 +3,72 @@ package mjkf.xinke.main.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import mjkf.xinke.main.model.db.AsphaltImported;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Service;
+import java.time.LocalDate;
import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Map;
+
@Service
-public class AsphaltImportedService extends ServiceImpl, AsphaltImported> {
- public boolean saveOrUpdateByIndex(AsphaltImported data) {
- var result = this.getOne(this.indexQuery(data));
- if (result == null) {
- return this.save(data);
- } else {
- result.update(data);
- return this.updateById(result);
- }
- }
-
- public List saveOrUpdateByIndexBatch(List rows) {
- var list = rows.stream().map(item -> new AsphaltImported(item)).collect(Collectors.toList());
- for (AsphaltImported item : list) {
- this.saveOrUpdateByIndex(item);
- }
- return list;
- }
-
- private LambdaQueryWrapper indexQuery(AsphaltImported data) {
+public class AsphaltImportedService extends DataService, AsphaltImported> {
+ public LambdaQueryWrapper indexQuery(AsphaltImported data) {
LambdaQueryWrapper query = new LambdaQueryWrapper<>();
query.eq(AsphaltImported::getName, data.getName());
query.eq(AsphaltImported::getDate, data.getDate());
return query;
}
+
+ public LambdaQueryWrapper trendQuery(Object obj, Integer year, Integer month) {
+ var data = (AsphaltImported) obj;
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ query.eq(AsphaltImported::getName, data.getName());
+ query.between(AsphaltImported::getDate, LocalDate.of(year, month, 1), LocalDate.of(year, month + 1, 1));
+ return query;
+ }
+
+ public LambdaQueryWrapper getQuery(String keyWord, Integer year, Integer month, String materialId, String name) {
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ if (keyWord != null) {
+ query.and(e -> e
+ .like(AsphaltImported::getName, keyWord).or()
+ );
+ }
+ if (year != null) {
+ query.between(AsphaltImported::getDate,
+ LocalDate.of(year, 1, 1),
+ LocalDate.of(year + 1, 1, 1)
+ );
+ }
+ if (month != null) {
+ query.between(AsphaltImported::getDate,
+ LocalDate.of(year, month, 1),
+ LocalDate.of(year, month + 1, 1)
+ );
+ }
+ if (name != null) {
+ query.like(AsphaltImported::getName, name);
+ }
+ if (materialId != null) {
+ // todo
+ // query.eq(SteelSection::getMaterialId, materialId);
+ }
+ return query;
+ }
+
+ public LambdaQueryWrapper filterQuery(LambdaQueryWrapper query) {
+ query.in(AsphaltImported::getName, List.of(
+ "新加坡—华东",
+ "韩国—华东",
+ "泰国—华东"
+ ));
+ return query;
+ }
+
+ public AsphaltImported getMapGroupingBy(Map item) {
+ var o = new AsphaltImported();
+ o.setName(item.get("name").toString());
+ return o;
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/service/CementService.java b/src/main/java/mjkf/xinke/main/service/CementService.java
index 12283b8..fea6932 100644
--- a/src/main/java/mjkf/xinke/main/service/CementService.java
+++ b/src/main/java/mjkf/xinke/main/service/CementService.java
@@ -3,34 +3,16 @@ package mjkf.xinke.main.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import mjkf.xinke.main.model.db.Cement;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Service;
+import java.time.LocalDate;
import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Map;
@Service
-public class CementService extends ServiceImpl, Cement> {
- public boolean saveOrUpdateByIndex(Cement data) {
- var result = this.getOne(this.indexQuery(data));
- if (result == null) {
- return this.save(data);
- } else {
- result.update(data);
- return this.updateById(result);
- }
- }
+public class CementService extends DataService, Cement> {
- public List saveOrUpdateByIndexBatch(List rows) {
- var list = rows.stream().map(item -> new Cement(item)).collect(Collectors.toList());
- for (Cement item : list) {
- this.saveOrUpdateByIndex(item);
- }
- return list;
- }
-
- private LambdaQueryWrapper indexQuery(Cement data) {
+ public LambdaQueryWrapper indexQuery(Cement data) {
LambdaQueryWrapper query = new LambdaQueryWrapper<>();
query.eq(Cement::getName, data.getName());
query.eq(Cement::getSpec, data.getSpec());
@@ -39,5 +21,64 @@ public class CementService extends ServiceImpl, Cement> {
query.eq(Cement::getDate, data.getDate());
return query;
}
+
+ public LambdaQueryWrapper trendQuery(Object obj, Integer year, Integer month) {
+ var data = (Cement) obj;
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ query.eq(Cement::getName, data.getName());
+ query.eq(Cement::getSpec, data.getSpec());
+ query.eq(Cement::getPack, data.getPack());
+ query.eq(Cement::getSource, data.getSource());
+ query.between(Cement::getDate, LocalDate.of(year, month, 1), LocalDate.of(year, month + 1, 1));
+ return query;
+ }
+
+ public LambdaQueryWrapper getQuery(String keyWord, Integer year, Integer month, String materialId, String name) {
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ if (keyWord != null) {
+ query.and(e -> e
+ .like(Cement::getName, keyWord).or()
+ .like(Cement::getSpec, keyWord).or()
+ .like(Cement::getPack, keyWord).or()
+ .like(Cement::getSource, keyWord)
+ );
+ }
+ if (year != null) {
+ query.between(Cement::getDate,
+ LocalDate.of(year, 1, 1),
+ LocalDate.of(year + 1, 1, 1)
+ );
+ }
+ if (month != null) {
+ query.between(Cement::getDate,
+ LocalDate.of(year, month, 1),
+ LocalDate.of(year, month + 1, 1)
+ );
+ }
+ if (name != null) {
+ query.like(Cement::getName, name);
+ }
+ if (materialId != null) {
+ // todo
+ // query.eq(SteelSection::getMaterialId, materialId);
+ }
+ return query;
+ }
+
+ public LambdaQueryWrapper filterQuery(LambdaQueryWrapper query) {
+ query.in(Cement::getName, List.of("P.S.A32.5", "M32.5", "P.P32.5R", "P.O42.5"));
+ query.in(Cement::getPack, List.of("散装"));
+ // query.in(Cement::getSource, List.of("金牛","台泥","炼石牌"));
+ return query;
+ }
+
+ public Cement getMapGroupingBy(Map item) {
+ var o = new Cement();
+ o.setName(item.get("name").toString());
+ o.setSpec(item.get("spec").toString());
+ o.setPack(item.get("pack").toString());
+ o.setSource(item.get("source").toString());
+ return o;
+ }
}
diff --git a/src/main/java/mjkf/xinke/main/service/DataService.java b/src/main/java/mjkf/xinke/main/service/DataService.java
new file mode 100644
index 0000000..7dbbbd0
--- /dev/null
+++ b/src/main/java/mjkf/xinke/main/service/DataService.java
@@ -0,0 +1,95 @@
+package mjkf.xinke.main.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.poi.ss.usermodel.Row;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public abstract class DataService, T> extends ServiceImpl {
+ public boolean saveOrUpdateByIndex(T data) throws Exception {
+ var result = this.getOne(this.indexQuery(data));
+ if (result == null) {
+ return this.save(data);
+ } else {
+ Method update = result.getClass().getMethod("update", this.getEntityClass());
+ update.invoke(result, data);
+ return this.updateById(result);
+ }
+ }
+
+ abstract LambdaQueryWrapper indexQuery(T data);
+
+ abstract LambdaQueryWrapper filterQuery(LambdaQueryWrapper query);
+
+ public List saveOrUpdateByIndexBatch(List rows) throws Exception {
+ var list = rows.stream().map(item -> {
+ try {
+ return (T) this.getEntityClass().getConstructor(Row.class).newInstance(item);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }).collect(Collectors.toList());
+ for (T item : list) {
+ this.saveOrUpdateByIndex(item);
+ }
+ return list;
+ }
+
+ public Class getEntityClass() {
+ ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
+ Class clazz = (Class) pt.getActualTypeArguments()[1];
+ return clazz;
+ }
+
+ public List