|
|
@@ -1,36 +1,62 @@
|
|
|
package com.jeesite.modules.mes.web;
|
|
|
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+
|
|
|
import com.alibaba.fastjson.JSONValidator;
|
|
|
import com.jeesite.common.codec.EncodeUtils;
|
|
|
-import com.jeesite.common.collect.ListUtils;
|
|
|
-import com.jeesite.common.config.Global;
|
|
|
-import com.jeesite.common.entity.Page;
|
|
|
+import com.jeesite.common.entity.DataEntity;
|
|
|
import com.jeesite.common.lang.DateUtils;
|
|
|
-import com.jeesite.common.service.ServiceException;
|
|
|
+import com.jeesite.common.lang.StringUtils;
|
|
|
+import com.jeesite.common.mybatis.mapper.query.QueryType;
|
|
|
import com.jeesite.common.utils.excel.ExcelExport;
|
|
|
-import com.jeesite.common.utils.excel.ExcelImport;
|
|
|
-import com.jeesite.common.utils.excel.annotation.ExcelField;
|
|
|
-import com.jeesite.common.validator.ValidatorUtils;
|
|
|
-import com.jeesite.common.web.BaseController;
|
|
|
-import com.jeesite.modules.mes.entity.MesMaterial;
|
|
|
-import com.jeesite.modules.mes.service.MesMaterialService;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialBfRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialBlpRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialCheckRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialCkLog;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialKcLog;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialLlRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialReport;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialRkLog;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialRkRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterialThRecord;
|
|
|
+import com.jeesite.modules.mes.entity.MesNg;
|
|
|
+import com.jeesite.modules.mes.resp.CommonResp;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialBfRecordService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialBlpRecordService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialCheckRecordService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialCkLogService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialKcLogService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialLlRecordService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialReportService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialRkLogService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialRkRecordService;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialThRecordService;
|
|
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.ui.Model;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
-import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
-import javax.servlet.http.HttpServletRequest;
|
|
|
-import javax.servlet.http.HttpServletResponse;
|
|
|
-import javax.validation.ConstraintViolation;
|
|
|
-import javax.validation.ConstraintViolationException;
|
|
|
-import java.util.List;
|
|
|
+import com.jeesite.common.config.Global;
|
|
|
+import com.jeesite.common.entity.Page;
|
|
|
+import com.jeesite.common.web.BaseController;
|
|
|
+import com.jeesite.modules.mes.entity.MesMaterial;
|
|
|
+import com.jeesite.modules.mes.service.MesMaterialService;
|
|
|
|
|
|
/**
|
|
|
* 物料表Controller
|
|
|
@@ -43,6 +69,26 @@ public class MesMaterialController extends BaseController {
|
|
|
|
|
|
@Autowired
|
|
|
private MesMaterialService mesMaterialService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialKcLogService mesMaterialKcLogService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialRkLogService mesMaterialRkLogService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialCkLogService mesMaterialCkLogService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialReportService mesMaterialReportService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialCheckRecordService mesMaterialCheckRecordService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialRkRecordService mesMaterialRkRecordService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialLlRecordService mesMaterialLlRecordService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialBlpRecordService mesMaterialBlpRecordService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialThRecordService mesMaterialThRecordService;
|
|
|
+ @Autowired
|
|
|
+ private MesMaterialBfRecordService mesMaterialBfRecordService;
|
|
|
|
|
|
/**
|
|
|
* 获取数据
|
|
|
@@ -133,12 +179,559 @@ public class MesMaterialController extends BaseController {
|
|
|
/**
|
|
|
* 导出数据
|
|
|
*/
|
|
|
+ @RequestMapping(value = "materialScreen")
|
|
|
+ public String materialScreen(Model model) {
|
|
|
+ return "modules/mes/mesMaterialScreen";
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping(value = "materialScreenData")
|
|
|
+ @ResponseBody
|
|
|
+ public CommonResp materialScreenData() {
|
|
|
+ CommonResp<Map<String, Object>> resp = new CommonResp<>();
|
|
|
+ Map<String, Object> data = new LinkedHashMap<>();
|
|
|
+ Date now = new Date();
|
|
|
+ Date todayStart = dayStart(now);
|
|
|
+ Date weekStart = dayStart(addDays(now, -6));
|
|
|
+ Date warningDate = addDays(todayStart, 30);
|
|
|
+
|
|
|
+ List<MesMaterial> materialList = mesMaterialService.findList(new MesMaterial());
|
|
|
+ List<MesMaterialKcLog> stockList = mesMaterialKcLogService.findList(new MesMaterialKcLog());
|
|
|
+ List<MesMaterialKcLog> validStockList = filterPositiveStock(stockList);
|
|
|
+ List<MesMaterialRkLog> rkLogList = findRkLogs(weekStart, now);
|
|
|
+ List<MesMaterialCkLog> ckLogList = findCkLogs(weekStart, now);
|
|
|
+ List<MesMaterialReport> reportList = findReports(weekStart, now);
|
|
|
+ List<MesMaterialCheckRecord> checkList = findCheckRecords(weekStart, now);
|
|
|
+ List<MesMaterialRkRecord> rkRecordList = findRkRecords(weekStart, now);
|
|
|
+ List<MesMaterialLlRecord> llRecordList = findLlRecords(weekStart, now);
|
|
|
+ List<MesMaterialBlpRecord> blpRecordList = findBlpRecords(weekStart, now);
|
|
|
+ List<MesMaterialThRecord> thRecordList = findThRecords(weekStart, now);
|
|
|
+ List<MesMaterialBfRecord> bfRecordList = findBfRecords(weekStart, now);
|
|
|
+
|
|
|
+ Map<String, Object> summary = new LinkedHashMap<>();
|
|
|
+ summary.put("materialCount", materialList.size());
|
|
|
+ summary.put("stockBatchCount", validStockList.size());
|
|
|
+ summary.put("stockTotal", sumKc(validStockList));
|
|
|
+ summary.put("todayInbound", sumRk(filterByDate(rkLogList, todayStart, now)));
|
|
|
+ summary.put("todayOutbound", sumCk(filterByDate(ckLogList, todayStart, now)));
|
|
|
+ summary.put("todayReport", filterByDate(reportList, todayStart, now).size());
|
|
|
+ summary.put("pendingReport", countReportState(reportList, "0"));
|
|
|
+ summary.put("todayAbnormal", filterByDate(blpRecordList, todayStart, now).size()
|
|
|
+ + filterByDate(thRecordList, todayStart, now).size()
|
|
|
+ + filterByDate(bfRecordList, todayStart, now).size());
|
|
|
+ summary.put("expireWarning", countExpireWarning(validStockList, todayStart, warningDate));
|
|
|
+ data.put("summary", summary);
|
|
|
+
|
|
|
+ data.put("days", buildDayLabels(weekStart));
|
|
|
+ data.put("trend", buildTrend(weekStart, rkLogList, ckLogList, reportList, blpRecordList, thRecordList, bfRecordList));
|
|
|
+ data.put("reportStatus", toChartData(countReports(reportList)));
|
|
|
+ data.put("checkStatus", toChartData(countChecks(checkList)));
|
|
|
+ data.put("blpStatus", toChartData(countBlp(blpRecordList)));
|
|
|
+ data.put("rkType", toChartData(countRkType(rkRecordList)));
|
|
|
+ data.put("llStatus", toChartData(countLl(llRecordList)));
|
|
|
+ data.put("stockByLocation", toChartData(top(countStockByLocation(validStockList), 8)));
|
|
|
+ data.put("stockByMaterial", toChartData(top(countStockByMaterial(validStockList), 8)));
|
|
|
+ data.put("stockList", topStockRows(validStockList, 20));
|
|
|
+ data.put("expireList", expireRows(validStockList, todayStart, warningDate, 12));
|
|
|
+ data.put("latestActions", latestActions(reportList, checkList, rkLogList, ckLogList, blpRecordList, thRecordList, bfRecordList, 14));
|
|
|
+
|
|
|
+ resp.setData(data);
|
|
|
+ resp.setResult(Global.TRUE);
|
|
|
+ return resp;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialRkLog> findRkLogs(Date start, Date end) {
|
|
|
+ MesMaterialRkLog query = new MesMaterialRkLog();
|
|
|
+ query.getSqlMap().getWhere().and("create_date", QueryType.GTE, start);
|
|
|
+ query.getSqlMap().getWhere().and("create_date", QueryType.LTE, end);
|
|
|
+ return mesMaterialRkLogService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialCkLog> findCkLogs(Date start, Date end) {
|
|
|
+ MesMaterialCkLog query = new MesMaterialCkLog();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialCkLogService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialReport> findReports(Date start, Date end) {
|
|
|
+ MesMaterialReport query = new MesMaterialReport();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialReportService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialCheckRecord> findCheckRecords(Date start, Date end) {
|
|
|
+ MesMaterialCheckRecord query = new MesMaterialCheckRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialCheckRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialRkRecord> findRkRecords(Date start, Date end) {
|
|
|
+ MesMaterialRkRecord query = new MesMaterialRkRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialRkRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialLlRecord> findLlRecords(Date start, Date end) {
|
|
|
+ MesMaterialLlRecord query = new MesMaterialLlRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialLlRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialBlpRecord> findBlpRecords(Date start, Date end) {
|
|
|
+ MesMaterialBlpRecord query = new MesMaterialBlpRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialBlpRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialThRecord> findThRecords(Date start, Date end) {
|
|
|
+ MesMaterialThRecord query = new MesMaterialThRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialThRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialBfRecord> findBfRecords(Date start, Date end) {
|
|
|
+ MesMaterialBfRecord query = new MesMaterialBfRecord();
|
|
|
+ query.setCreateDate_gte(start);
|
|
|
+ query.setCreateDate_lte(end);
|
|
|
+ return mesMaterialBfRecordService.findList(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesMaterialKcLog> filterPositiveStock(List<MesMaterialKcLog> list) {
|
|
|
+ List<MesMaterialKcLog> result = new ArrayList<>();
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ if (item.getNums() != null && item.getNums() > 0) {
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private <T extends DataEntity<T>> List<T> filterByDate(List<T> list, Date start, Date end) {
|
|
|
+ List<T> result = new ArrayList<>();
|
|
|
+ for (T item : list) {
|
|
|
+ Date createDate = item.getCreateDate();
|
|
|
+ if (createDate != null && !createDate.before(start) && !createDate.after(end)) {
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private long sumKc(List<MesMaterialKcLog> list) {
|
|
|
+ long total = 0;
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ total += item.getNums() == null ? 0 : item.getNums();
|
|
|
+ }
|
|
|
+ return total;
|
|
|
+ }
|
|
|
+
|
|
|
+ private long sumRk(List<MesMaterialRkLog> list) {
|
|
|
+ long total = 0;
|
|
|
+ for (MesMaterialRkLog item : list) {
|
|
|
+ total += item.getNums() == null ? 0 : item.getNums();
|
|
|
+ }
|
|
|
+ return total;
|
|
|
+ }
|
|
|
+
|
|
|
+ private long sumCk(List<MesMaterialCkLog> list) {
|
|
|
+ long total = 0;
|
|
|
+ for (MesMaterialCkLog item : list) {
|
|
|
+ total += item.getNums() == null ? 0 : item.getNums();
|
|
|
+ }
|
|
|
+ return total;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int countReportState(List<MesMaterialReport> list, String state) {
|
|
|
+ int count = 0;
|
|
|
+ for (MesMaterialReport item : list) {
|
|
|
+ if (state.equals(item.getState())) {
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int countExpireWarning(List<MesMaterialKcLog> list, Date start, Date end) {
|
|
|
+ int count = 0;
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ Date expire = parseDate(item.getExpireDate());
|
|
|
+ if (expire != null && !expire.before(start) && expire.before(end)) {
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> buildTrend(Date start, List<MesMaterialRkLog> rkLogs, List<MesMaterialCkLog> ckLogs,
|
|
|
+ List<MesMaterialReport> reports, List<MesMaterialBlpRecord> blpRecords,
|
|
|
+ List<MesMaterialThRecord> thRecords, List<MesMaterialBfRecord> bfRecords) {
|
|
|
+ Map<String, Object> trend = new LinkedHashMap<>();
|
|
|
+ trend.put("inbound", buildDailyQty(start, rkLogs, "rk"));
|
|
|
+ trend.put("outbound", buildDailyQty(start, ckLogs, "ck"));
|
|
|
+ trend.put("report", buildDailyCount(start, reports));
|
|
|
+ trend.put("abnormal", buildDailyAbnormal(start, blpRecords, thRecords, bfRecords));
|
|
|
+ return trend;
|
|
|
+ }
|
|
|
+
|
|
|
+ private <T extends DataEntity<T>> List<Integer> buildDailyCount(Date start, List<T> list) {
|
|
|
+ List<Integer> counts = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ Date s = dayStart(addDays(start, i));
|
|
|
+ Date e = addDays(s, 1);
|
|
|
+ counts.add(filterByDate(list, s, e).size());
|
|
|
+ }
|
|
|
+ return counts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Long> buildDailyQty(Date start, List<?> list, String type) {
|
|
|
+ List<Long> counts = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ Date s = dayStart(addDays(start, i));
|
|
|
+ Date e = addDays(s, 1);
|
|
|
+ long total = 0;
|
|
|
+ for (Object item : list) {
|
|
|
+ if (item instanceof MesMaterialRkLog) {
|
|
|
+ MesMaterialRkLog log = (MesMaterialRkLog)item;
|
|
|
+ if ("rk".equals(type) && log.getCreateDate() != null && !log.getCreateDate().before(s) && log.getCreateDate().before(e)) {
|
|
|
+ total += log.getNums() == null ? 0 : log.getNums();
|
|
|
+ }
|
|
|
+ } else if (item instanceof MesMaterialCkLog) {
|
|
|
+ MesMaterialCkLog log = (MesMaterialCkLog)item;
|
|
|
+ if ("ck".equals(type) && log.getCreateDate() != null && !log.getCreateDate().before(s) && log.getCreateDate().before(e)) {
|
|
|
+ total += log.getNums() == null ? 0 : log.getNums();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ counts.add(total);
|
|
|
+ }
|
|
|
+ return counts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Integer> buildDailyAbnormal(Date start, List<MesMaterialBlpRecord> blpRecords,
|
|
|
+ List<MesMaterialThRecord> thRecords, List<MesMaterialBfRecord> bfRecords) {
|
|
|
+ List<Integer> counts = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ Date s = dayStart(addDays(start, i));
|
|
|
+ Date e = addDays(s, 1);
|
|
|
+ counts.add(filterByDate(blpRecords, s, e).size() + filterByDate(thRecords, s, e).size() + filterByDate(bfRecords, s, e).size());
|
|
|
+ }
|
|
|
+ return counts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Integer> countReports(List<MesMaterialReport> list) {
|
|
|
+ Map<String, Integer> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialReport item : list) {
|
|
|
+ increase(result, "1".equals(item.getState()) ? "已检查" : "未检查");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Integer> countChecks(List<MesMaterialCheckRecord> list) {
|
|
|
+ Map<String, Integer> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialCheckRecord item : list) {
|
|
|
+ increase(result, "2".equals(item.getState()) ? "不合格" : "合格");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Integer> countBlp(List<MesMaterialBlpRecord> list) {
|
|
|
+ Map<String, Integer> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialBlpRecord item : list) {
|
|
|
+ increase(result, blpStateLabel(item.getState()));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Integer> countRkType(List<MesMaterialRkRecord> list) {
|
|
|
+ Map<String, Integer> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialRkRecord item : list) {
|
|
|
+ increase(result, rkTypeLabel(item.getType()));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Integer> countLl(List<MesMaterialLlRecord> list) {
|
|
|
+ Map<String, Integer> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialLlRecord item : list) {
|
|
|
+ increase(result, "2".equals(item.getState()) ? "已领料" : "待领料");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Long> countStockByLocation(List<MesMaterialKcLog> list) {
|
|
|
+ Map<String, Long> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ increaseLong(result, safeText(item.getKwTitle(), "未记录库位"), item.getNums());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Long> countStockByMaterial(List<MesMaterialKcLog> list) {
|
|
|
+ Map<String, Long> result = new LinkedHashMap<>();
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ increaseLong(result, safeText(item.getMaterialTitle(), "未记录物料"), item.getNums());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> topStockRows(List<MesMaterialKcLog> list, int limit) {
|
|
|
+ List<MesMaterialKcLog> copy = new ArrayList<>(list);
|
|
|
+ Collections.sort(copy, new Comparator<MesMaterialKcLog>() {
|
|
|
+ @Override
|
|
|
+ public int compare(MesMaterialKcLog o1, MesMaterialKcLog o2) {
|
|
|
+ return Long.valueOf(o2.getNums() == null ? 0 : o2.getNums()).compareTo(o1.getNums() == null ? 0 : o1.getNums());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ List<Map<String, Object>> rows = new ArrayList<>();
|
|
|
+ for (int i = 0; i < Math.min(limit, copy.size()); i++) {
|
|
|
+ MesMaterialKcLog item = copy.get(i);
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("material", safeText(item.getMaterialTitle(), "-"));
|
|
|
+ row.put("erpSn", safeText(item.getErpSn(), "-"));
|
|
|
+ row.put("batchSn", safeText(item.getBatchSn(), "-"));
|
|
|
+ row.put("kw", safeText(item.getKwTitle(), "-"));
|
|
|
+ row.put("nums", item.getNums() == null ? 0 : item.getNums());
|
|
|
+ row.put("expireDate", safeText(item.getExpireDate(), "-"));
|
|
|
+ rows.add(row);
|
|
|
+ }
|
|
|
+ return rows;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> expireRows(List<MesMaterialKcLog> list, Date start, Date end, int limit) {
|
|
|
+ List<MesMaterialKcLog> warning = new ArrayList<>();
|
|
|
+ for (MesMaterialKcLog item : list) {
|
|
|
+ Date expire = parseDate(item.getExpireDate());
|
|
|
+ if (expire != null && !expire.before(start) && expire.before(end)) {
|
|
|
+ warning.add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collections.sort(warning, new Comparator<MesMaterialKcLog>() {
|
|
|
+ @Override
|
|
|
+ public int compare(MesMaterialKcLog o1, MesMaterialKcLog o2) {
|
|
|
+ Date d1 = parseDate(o1.getExpireDate());
|
|
|
+ Date d2 = parseDate(o2.getExpireDate());
|
|
|
+ if (d1 == null && d2 == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (d1 == null) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (d2 == null) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return d1.compareTo(d2);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ List<Map<String, Object>> rows = new ArrayList<>();
|
|
|
+ for (int i = 0; i < Math.min(limit, warning.size()); i++) {
|
|
|
+ MesMaterialKcLog item = warning.get(i);
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("material", safeText(item.getMaterialTitle(), "-"));
|
|
|
+ row.put("batchSn", safeText(item.getBatchSn(), "-"));
|
|
|
+ row.put("kw", safeText(item.getKwTitle(), "-"));
|
|
|
+ row.put("nums", item.getNums() == null ? 0 : item.getNums());
|
|
|
+ row.put("expireDate", safeText(item.getExpireDate(), "-"));
|
|
|
+ rows.add(row);
|
|
|
+ }
|
|
|
+ return rows;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> latestActions(List<MesMaterialReport> reports, List<MesMaterialCheckRecord> checks,
|
|
|
+ List<MesMaterialRkLog> rkLogs, List<MesMaterialCkLog> ckLogs, List<MesMaterialBlpRecord> blpRecords,
|
|
|
+ List<MesMaterialThRecord> thRecords, List<MesMaterialBfRecord> bfRecords, int limit) {
|
|
|
+ List<Map<String, Object>> rows = new ArrayList<>();
|
|
|
+ for (MesMaterialReport item : reports) {
|
|
|
+ rows.add(actionRow("来料报检", item.getTitle(), item.getSn(), reportStateLabel(item.getState()), item.getNums(), item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialCheckRecord item : checks) {
|
|
|
+ rows.add(actionRow("来料检查", item.getMaterialTitle(), item.getSn(), checkStateLabel(item.getState()), item.getNums(), item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialRkLog item : rkLogs) {
|
|
|
+ rows.add(actionRow("入库", item.getMaterialTitle(), item.getBatchSn(), safeText(item.getKwTitle(), "-"), item.getNums(), item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialCkLog item : ckLogs) {
|
|
|
+ rows.add(actionRow("出库", item.getMaterialTitle(), item.getBatchSn(), safeText(item.getRemark(), "-"), item.getNums(), item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialBlpRecord item : blpRecords) {
|
|
|
+ rows.add(actionRow("不良品", item.getTitle(), "-", blpStateLabel(item.getState()), parseLong(item.getNums()), item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialThRecord item : thRecords) {
|
|
|
+ rows.add(actionRow("退货", "-", "-", blpStateLabel(item.getState()), null, item.getCreateDate()));
|
|
|
+ }
|
|
|
+ for (MesMaterialBfRecord item : bfRecords) {
|
|
|
+ rows.add(actionRow("报废", "-", "-", blpStateLabel(item.getState()), null, item.getCreateDate()));
|
|
|
+ }
|
|
|
+ Collections.sort(rows, new Comparator<Map<String, Object>>() {
|
|
|
+ @Override
|
|
|
+ public int compare(Map<String, Object> o1, Map<String, Object> o2) {
|
|
|
+ Date d1 = (Date)o1.get("_date");
|
|
|
+ Date d2 = (Date)o2.get("_date");
|
|
|
+ if (d1 == null && d2 == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (d1 == null) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (d2 == null) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return d2.compareTo(d1);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ List<Map<String, Object>> result = new ArrayList<>();
|
|
|
+ for (int i = 0; i < Math.min(limit, rows.size()); i++) {
|
|
|
+ Map<String, Object> row = rows.get(i);
|
|
|
+ row.remove("_date");
|
|
|
+ result.add(row);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> actionRow(String type, String material, String batch, String state, Long nums, Date date) {
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("type", type);
|
|
|
+ row.put("material", safeText(material, "-"));
|
|
|
+ row.put("batch", safeText(batch, "-"));
|
|
|
+ row.put("state", safeText(state, "-"));
|
|
|
+ row.put("nums", nums == null ? "-" : nums);
|
|
|
+ row.put("time", date == null ? "" : new SimpleDateFormat("MM-dd HH:mm").format(date));
|
|
|
+ row.put("_date", date);
|
|
|
+ return row;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> toChartData(Map<String, ? extends Number> source) {
|
|
|
+ List<Map<String, Object>> result = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, ? extends Number> entry : source.entrySet()) {
|
|
|
+ Map<String, Object> item = new LinkedHashMap<>();
|
|
|
+ item.put("name", entry.getKey());
|
|
|
+ item.put("value", entry.getValue());
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private <N extends Number> Map<String, N> top(Map<String, N> source, int limit) {
|
|
|
+ List<Map.Entry<String, N>> entries = new ArrayList<>(source.entrySet());
|
|
|
+ Collections.sort(entries, new Comparator<Map.Entry<String, N>>() {
|
|
|
+ @Override
|
|
|
+ public int compare(Map.Entry<String, N> o1, Map.Entry<String, N> o2) {
|
|
|
+ return Long.valueOf(o2.getValue().longValue()).compareTo(o1.getValue().longValue());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ Map<String, N> result = new LinkedHashMap<>();
|
|
|
+ for (int i = 0; i < Math.min(limit, entries.size()); i++) {
|
|
|
+ result.put(entries.get(i).getKey(), entries.get(i).getValue());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Date dayStart(Date date) {
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.setTime(date);
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ calendar.set(Calendar.MINUTE, 0);
|
|
|
+ calendar.set(Calendar.SECOND, 0);
|
|
|
+ calendar.set(Calendar.MILLISECOND, 0);
|
|
|
+ return calendar.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Date addDays(Date date, int days) {
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.setTime(date);
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, days);
|
|
|
+ return calendar.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<String> buildDayLabels(Date start) {
|
|
|
+ List<String> labels = new ArrayList<>();
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("MM-dd");
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ labels.add(formatter.format(addDays(start, i)));
|
|
|
+ }
|
|
|
+ return labels;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Date parseDate(String text) {
|
|
|
+ if (StringUtils.isBlank(text)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String value = text.trim();
|
|
|
+ String[] patterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd"};
|
|
|
+ for (String pattern : patterns) {
|
|
|
+ try {
|
|
|
+ return new SimpleDateFormat(pattern).parse(value);
|
|
|
+ } catch (ParseException ignored) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void increase(Map<String, Integer> map, String key) {
|
|
|
+ map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void increaseLong(Map<String, Long> map, String key, Long value) {
|
|
|
+ long current = map.containsKey(key) ? map.get(key) : 0;
|
|
|
+ map.put(key, current + (value == null ? 0 : value));
|
|
|
+ }
|
|
|
+
|
|
|
+ private Long parseLong(String value) {
|
|
|
+ if (StringUtils.isBlank(value)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return Long.valueOf(value);
|
|
|
+ } catch (NumberFormatException ex) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String reportStateLabel(String value) {
|
|
|
+ return "1".equals(value) ? "已检查" : "未检查";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String checkStateLabel(String value) {
|
|
|
+ return "2".equals(value) ? "不合格" : "合格";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String blpStateLabel(String value) {
|
|
|
+ if ("1".equals(value)) {
|
|
|
+ return "待审核";
|
|
|
+ } else if ("2".equals(value)) {
|
|
|
+ return "通过";
|
|
|
+ } else if ("3".equals(value)) {
|
|
|
+ return "未通过";
|
|
|
+ }
|
|
|
+ return "未知";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String rkTypeLabel(String value) {
|
|
|
+ if ("1".equals(value)) {
|
|
|
+ return "正常入库";
|
|
|
+ } else if ("2".equals(value)) {
|
|
|
+ return "让步入库";
|
|
|
+ } else if ("3".equals(value)) {
|
|
|
+ return "余料入库";
|
|
|
+ }
|
|
|
+ return "未知";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String safeText(String text, String fallback) {
|
|
|
+ return StringUtils.isBlank(text) ? fallback : text;
|
|
|
+ }
|
|
|
+
|
|
|
@RequiresPermissions("mes:mesMaterial:view")
|
|
|
@RequestMapping(value = "exportData")
|
|
|
public void exportData(MesMaterial mesMaterial, HttpServletResponse response) {
|
|
|
List<MesMaterial> list = mesMaterialService.findList(mesMaterial);
|
|
|
String fileName = "物料表" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
|
|
|
- try(ExcelExport ee = new ExcelExport("物料表", MesMaterial.class)){
|
|
|
+ try(ExcelExport ee = new ExcelExport("物料表", MesNg.class)){
|
|
|
ee.setDataList(list).write(response, fileName);
|
|
|
}
|
|
|
}
|
|
|
@@ -153,75 +746,4 @@ public class MesMaterialController extends BaseController {
|
|
|
model.addAttribute("warehouse", mesMaterial);
|
|
|
return "modules/mes/mesMaterialSelect";
|
|
|
}
|
|
|
- /**
|
|
|
- * 下载模板
|
|
|
- */
|
|
|
- @RequestMapping(value = "importTemplate")
|
|
|
- public void importTemplate(HttpServletResponse response) {
|
|
|
- MesMaterial mesDeviceCate = new MesMaterial();
|
|
|
- List<MesMaterial> list = ListUtils.newArrayList(mesDeviceCate);
|
|
|
- String fileName = "物料表.xlsx";
|
|
|
- try(ExcelExport ee = new ExcelExport("物料表", MesMaterial.class, ExcelField.Type.IMPORT)){
|
|
|
- ee.setDataList(list).write(response, fileName);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 导入数据
|
|
|
- */
|
|
|
- @ResponseBody
|
|
|
- @PostMapping(value = "importData")
|
|
|
- public String importData(MultipartFile file) {
|
|
|
- try {
|
|
|
- String message = importData1(file);
|
|
|
- return renderResult(Global.TRUE, "posfull:"+message);
|
|
|
- } catch (Exception ex) {
|
|
|
- return renderResult(Global.FALSE, "posfull:"+ex.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- @Transactional
|
|
|
- public String importData1(MultipartFile file) {
|
|
|
- if (file == null){
|
|
|
- throw new ServiceException(text("请选择导入的数据文件!"));
|
|
|
- }
|
|
|
- int successNum = 0; int failureNum = 0;
|
|
|
- StringBuilder successMsg = new StringBuilder();
|
|
|
- StringBuilder failureMsg = new StringBuilder();
|
|
|
- try(ExcelImport ei = new ExcelImport(file, 2, 0)){
|
|
|
- List<MesMaterial> list = ei.getDataList(MesMaterial.class);
|
|
|
- for (MesMaterial mesDeviceCheck : list) {
|
|
|
- try{
|
|
|
- ValidatorUtils.validateWithException(mesDeviceCheck);
|
|
|
- this.save(mesDeviceCheck);
|
|
|
- successNum++;
|
|
|
- successMsg.append("<br/>" + successNum + "、编号 " + mesDeviceCheck.getId() + " 导入成功");
|
|
|
- } catch (Exception e) {
|
|
|
- failureNum++;
|
|
|
- String msg = "<br/>" + failureNum + "、编号 " + mesDeviceCheck.getId() + " 导入失败:";
|
|
|
- if (e instanceof ConstraintViolationException){
|
|
|
- ConstraintViolationException cve = (ConstraintViolationException)e;
|
|
|
- for (ConstraintViolation<?> violation : cve.getConstraintViolations()) {
|
|
|
- msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")";
|
|
|
- }
|
|
|
- }else{
|
|
|
- msg += e.getMessage();
|
|
|
- }
|
|
|
- failureMsg.append(msg);
|
|
|
- logger.error(msg, e);
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- logger.error(e.getMessage(), e);
|
|
|
- failureMsg.append(e.getMessage());
|
|
|
- return failureMsg.toString();
|
|
|
- }
|
|
|
- if (failureNum > 0) {
|
|
|
- failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
|
|
|
- throw new ServiceException(failureMsg.toString());
|
|
|
- }else{
|
|
|
- successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
|
|
|
- }
|
|
|
- return successMsg.toString();
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
+}
|