diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/ReportController.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/ReportController.java index c78821dd..9494dcfc 100644 --- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/ReportController.java +++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/ReportController.java @@ -300,6 +300,88 @@ public class ReportController { return R.failed(e.getMessage()); } } + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + @GetMapping("/weekDeliveryRateReport") + public R weekDeliveryRateReport(@RequestParam(required = false) Map paramMap){ + try{ + return R.ok(reportService.weekDeliveryRateReport(paramMap)); + }catch (Exception e){ + return R.failed(e.getMessage()); + } + } + + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + @GetMapping("/monthDeliveryRateReport") + public R monthDeliveryRateReport(@RequestParam(required = false) Map paramMap){ + try{ + return R.ok(reportService.monthDeliveryRateReport(paramMap)); + }catch (Exception e){ + return R.failed(e.getMessage()); + } + } + + /** + * 项目生产加工周期报表 + * @param paramMap + * @return + */ + @GetMapping("/itemProductProgressReport") + public R itemProductProgressReport(@RequestParam(required = false) Map paramMap){ + try{ + return R.ok(reportService.itemProductProgressReport(paramMap)); + }catch (Exception e){ + return R.failed(e.getMessage()); + } + } + /** + * 质量检验响应时间报表 + * @param paramMap + * @return + */ + @GetMapping("/qualityInspectionResponseReport") + public R qualityInspectionResponseReport(@RequestParam(required = false) Map paramMap){ + try{ + return R.ok(reportService.qualityInspectionResponseReport(paramMap)); + }catch (Exception e){ + return R.failed(e.getMessage()); + } + } + + /** + * 项目生产加工周期看板 + * @param + * @return + */ + @GetMapping("/projectPlanningProgress") + public R projectPlanningProgress(String user){ + try { + return R.ok(reportService.projectPlanningProgress(user)); + } catch (Exception e) { + return R.failed(e.getMessage()); + } + } + + /** + * 设备产能负荷看板 + * @param + * @return + */ + @GetMapping("/capacityLoad") + public R capacityLoad(String user){ + try { + return R.ok(reportService.capacityLoad(user)); + } catch (Exception e) { + return R.failed(e.getMessage()); + } + } } diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/ReportMapper.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/ReportMapper.java index 61939735..328e769f 100644 --- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/ReportMapper.java +++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/ReportMapper.java @@ -105,6 +105,8 @@ public interface ReportMapper { List> projectScheduleShow(@Param("user") String user); + List> projectPlanningProgress(@Param("user") String user); + /** * 质量返修报表 * @param paramMap @@ -117,7 +119,7 @@ public interface ReportMapper { * @param paramMap * @return */ - List> weekLoadRateReport(Map paramMap); + List> weekLoadRateReport(Map paramMap); /** * 资源负荷率报表(月维度) @@ -125,4 +127,35 @@ public interface ReportMapper { * @return */ List> monthLoadRateReport(Map paramMap); + + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + List> weekDeliveryRateReport(Map paramMap); + + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + List> monthDeliveryRateReport(Map paramMap); + + List> itemProductProgressReport(Map paramMap); + + /** + * 质量检验响应时间报表 + * @param paramMap + * @return + */ + List> qualityInspectionResponseReport(Map paramMap); + + /** + * 设备产能负荷看板 + * @param workCenter + * @return + */ + List> capacityLoad(String workCenter); + } diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/ReportService.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/ReportService.java index cd7a37e2..b3665852 100644 --- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/ReportService.java +++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/ReportService.java @@ -123,7 +123,7 @@ public interface ReportService { * @param paramMap * @return */ - List> weekLoadRateReport(Map paramMap); + List> weekLoadRateReport(Map paramMap); /** * 资源负荷率报表(周维度) @@ -131,4 +131,46 @@ public interface ReportService { * @return */ List> monthLoadRateReport(Map paramMap); + + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + List> weekDeliveryRateReport(Map paramMap); + + /** + * 交付及时率报表(月维度) + * @param paramMap + * @return + */ + List> monthDeliveryRateReport(Map paramMap); + + /** + * 项目生产加工周期报表 + * @param paramMap + * @return + */ + List> itemProductProgressReport(Map paramMap); + + /** + * 质量检验响应时间报表 + * @param paramMap + * @return + */ + List> qualityInspectionResponseReport(Map paramMap); + + /** + * 项目生产加工周期看板 + * @param userGroup + * @return + */ + Map projectPlanningProgress(String userGroup); + + /** + * 设备产能负荷看板 + * @param workCenter + * @return + */ + Map capacityLoad(String workCenter); } diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/ReportServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/ReportServiceImpl.java index 7ed67f5e..70c0a6ee 100644 --- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/ReportServiceImpl.java +++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/ReportServiceImpl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.foreverwin.mesnac.anomaly.dto.IntegrationLogDto; import com.foreverwin.mesnac.anomaly.mapper.ReportMapper; import com.foreverwin.mesnac.anomaly.service.ReportService; +import com.foreverwin.mesnac.anomaly.utils.DateReportUtils; import com.foreverwin.mesnac.common.enums.HandleEnum; import com.foreverwin.mesnac.common.util.DateUtil; import com.foreverwin.mesnac.meapi.mapper.DataFieldListMapper; @@ -21,6 +22,10 @@ import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -510,10 +515,22 @@ public class ReportServiceImpl implements ReportService { * @return */ @Override - public List> weekLoadRateReport(Map paramMap) { + public List> weekLoadRateReport(Map paramMap) { String site = CommonMethods.getSite(); paramMap.put("site", site); paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); + if (!StringUtils.isBlank(String.valueOf(paramMap.get("week")))){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + int dayOfWeek = now.getDayOfWeek().getValue(); + LocalDateTime weekStart = now.minusDays(dayOfWeek - 1).with(LocalTime.MIN); + LocalDateTime weekEnd = now.plusDays(7 * 8 - dayOfWeek).with(LocalTime.MAX); + System.out.println("当前周的开始时间:" + weekStart.format(fmt)); + System.out.println("当前周的结束时间:" + weekEnd.format(fmt)); + List> weekOfDate = DateReportUtils.getWeekOfDate3(weekStart.format(fmt), weekEnd.format(fmt)); + return weekOfDate; + } return reportMapper.weekLoadRateReport(paramMap); } @@ -527,12 +544,260 @@ public class ReportServiceImpl implements ReportService { String site = CommonMethods.getSite(); paramMap.put("site", site); paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); - if (StringUtils.isBlank((String) paramMap.get("month"))){ - paramMap.put("month",(Integer)paramMap.get("month")); + if (!StringUtils.isBlank(String.valueOf(paramMap.get("month")))){ + paramMap.put("month",Integer.valueOf(String.valueOf(paramMap.get("month")))); } return reportMapper.monthLoadRateReport(paramMap); } + /** + * 交付及时率报表(周维度) + * @param paramMap + * @return + */ + @Override + public List> weekDeliveryRateReport(Map paramMap) { + String site = CommonMethods.getSite(); + paramMap.put("site", site); + paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); + HashMap>> result = new HashMap<>(); + +/* QueryWrapper wrapper = new QueryWrapper<>(); + //columnData + ArrayList> columnDataList = new ArrayList<>(); + HashMap columnMap0 = new LinkedHashMap<>(); + columnMap0.put("colName","序号"); + columnMap0.put("width","30"); + columnDataList.add(columnMap0); + HashMap columnMap1 = new LinkedHashMap<>(); + columnMap1.put("colName","车间描述"); + columnDataList.add(columnMap1); + HashMap columnMap2 = new LinkedHashMap<>(); + columnMap2.put("colName","资源编号"); + columnDataList.add(columnMap2); + HashMap columnMap3 = new LinkedHashMap<>(); + columnMap3.put("colName","工序描述"); + columnDataList.add(columnMap3); + HashMap columnMap4 = new LinkedHashMap<>(); + columnMap4.put("colName","资源描述"); + columnDataList.add(columnMap4); + List> weekOfDate = DateReportUtils.getWeekOfDate(String.valueOf(paramMap.get("startDate")), String.valueOf(paramMap.get("endDate"))); + + //rowData + ArrayList> rowDataList = new ArrayList<>(); + int week = 1; + for (Map weekOfDateMap : weekOfDate) { + HashMap columnMap5 = new LinkedHashMap<>(); + columnMap5.put("colName",week + "计划数量"); + columnDataList.add(columnMap5); + HashMap columnMap6 = new LinkedHashMap<>(); + columnMap6.put("colName",week + "按期完工数量"); + columnDataList.add(columnMap6); + HashMap columnMap7 = new LinkedHashMap<>(); + columnMap7.put("colName",week + "零件交付及时率"); + columnDataList.add(columnMap7); + HashMap columnMap8 = new LinkedHashMap<>(); + columnMap8.put("colName",week + "工时量"); + columnDataList.add(columnMap8); + HashMap columnMap9 = new LinkedHashMap<>(); + columnMap9.put("colName",week + "按期完工工时"); + columnDataList.add(columnMap9); + HashMap columnMap10 = new LinkedHashMap<>(); + columnMap10.put("colName",week + "工时交付及时率"); + columnDataList.add(columnMap10); + + + + paramMap.put("startDate",weekOfDateMap.get("start")); + paramMap.put("endDate",weekOfDateMap.get("end")); + List> weekList = reportMapper.weekDeliveryRateReport(paramMap); + + int i = 1; + for (Map weekResultMap : weekList) { + HashMap rowMap = new LinkedHashMap<>(); + rowMap.put("序号",String.valueOf(i)); + rowMap.put("车间描述",weekResultMap.get("workCenter")); + rowMap.put("资源编号",weekResultMap.get("resrceCode")); + rowMap.put("工序描述",weekResultMap.get("operationDescription")); + rowMap.put("资源描述",weekResultMap.get("resrceDescription")); + rowMap.put(week + "计划数量",weekResultMap.get("sumQTY")); + rowMap.put(week + "按期完工数量",weekResultMap.get("sumDoneQTY")); + rowMap.put(week + "零件交付及时率",weekResultMap.get("QTYrate")); + rowMap.put(week + "工时量",weekResultMap.get("sumHours")); + rowMap.put(week + "按期完工工时",weekResultMap.get("sumDoneHours")); + rowMap.put(week + "工时交付及时率",weekResultMap.get("HOURSrate")); + + i++; + rowDataList.add(rowMap); + } + week++; + } + + result.put("columnData",columnDataList); + result.put("rowData",rowDataList);*/ + return reportMapper.weekDeliveryRateReport(paramMap); + } + + /** + * 交付及时率报表(月维度) + * @param paramMap + * @return + */ + @Override + public List> monthDeliveryRateReport(Map paramMap) { + String site = CommonMethods.getSite(); + paramMap.put("site", site); + paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); + return reportMapper.monthDeliveryRateReport(paramMap); + } + + /** + * 项目生产加工周期报表 + * @param paramMap + * @return + */ + @Override + public List> itemProductProgressReport(Map paramMap) { + String site = CommonMethods.getSite(); + paramMap.put("site", site); + paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); + List> mapList = reportMapper.itemProductProgressReport(paramMap); + + for (Map objectMap : mapList) { + String workOrder = String.valueOf(objectMap.get("workOrder")); + if (workOrder.indexOf("/") != -1){ + if (workOrder.split("/").length > 2){ + objectMap.put("career",workOrder.split("/")[1]); + }else { + objectMap.put("career",""); + } + }else { + objectMap.put("career",""); + } + } + return mapList; + } + + /** + * 质量检验响应时间报表 + * @param paramMap + * @return + */ + @Override + public List> qualityInspectionResponseReport(Map paramMap) { + String site = CommonMethods.getSite(); + paramMap.put("site", site); + paramMap.put("locale", LocaleContextHolder.getLocale().getLanguage()); + return reportMapper.qualityInspectionResponseReport(paramMap); + } + + /** + * 项目生产加工周期看板 + * @param userGroup + * @return + */ + @Override + public Map projectPlanningProgress(String userGroup) { + List> abnormalQualityList = reportMapper.projectPlanningProgress(userGroup); + Map result = new HashMap<>(); + Map>> workOrderMap = abnormalQualityList.stream() + .collect(Collectors.groupingBy(e -> { + String career =e.get("workOrder"); + try { + if (career.indexOf("硫化") != -1) { + return "硫化"; + }else if (career.indexOf("全钢") != -1) { + return "全钢"; + }else if (career.indexOf("半钢") != -1) { + return "半钢"; + }else if (career.indexOf("鼓") != -1) { + return "鼓"; + }else if (career.indexOf("裁断") != -1) { + return "裁断"; + }else if (career.indexOf("检测") != -1) { + return "检测"; + }else if (career.indexOf("橡塑") != -1) { + return "橡塑"; + } else if (career.indexOf("非公路") != -1) { + return "非公路"; + } else if (career.indexOf("塞班") != -1) { + return "塞班"; + } else { + return "外部"; + } + } catch (Exception exception) { + exception.printStackTrace(); + } + return ""; + })); + + for (String workOrder : workOrderMap.keySet()) { + HashMap resultMap = new HashMap<>(); + ArrayList items = new ArrayList<>(); + ArrayList shopOrderQTYs = new ArrayList<>(); + ArrayList doneQTY = new ArrayList<>(); + ArrayList rate = new ArrayList<>(); + List> maps = workOrderMap.get(workOrder); + maps.forEach(e -> { + items.add(e.get("item")); + shopOrderQTYs.add(e.get("shopOrderQTY")); + doneQTY.add(e.get("doneQTY")); + rate.add(e.get("rate")); + }); + resultMap.put("items",items); + resultMap.put("shopOrderQTY",shopOrderQTYs); + resultMap.put("doneQTY",doneQTY); + resultMap.put("rate",rate); + result.put(workOrder,resultMap); + } + return result; + } + + /** + * 设备产能负荷看板 + * @param workCenter + * @return + */ + @Override + public Map capacityLoad(String workCenter) { + List> capacityLoadList = reportMapper.capacityLoad(workCenter); + HashMap result = new HashMap<>(); + /*Map>> resourceListMap = capacityLoadList.stream(). + collect(Collectors.groupingBy(e -> e.get("resourceDescription")));*/ + //八个柱状图:计划工时list、计划产能、未完成工时、设备描述 + /*for (String resource : resourceListMap.keySet()) { + HashMap resourceMap = new HashMap<>(); + //计划工时 + ArrayList planList = new ArrayList<>(); + List> mapList = resourceListMap.get(resource); + mapList.forEach(e -> { + e. + });*/ + capacityLoadList.forEach(e -> { + HashMap resourceMap = new HashMap<>(); + //计划工时 + ArrayList planList = new ArrayList<>(); + planList.add(e.get("planCapacity1")); + planList.add(e.get("planCapacity2")); + planList.add(e.get("planCapacity3")); + planList.add(e.get("planCapacity4")); + planList.add(e.get("planCapacity5")); + planList.add(e.get("planCapacity6")); + planList.add(e.get("planCapacity7")); + planList.add(e.get("planCapacity8")); + resourceMap.put("planCapacity",planList); + //计划产能 + resourceMap.put("standardWeekCapacity",e.get("standardWeekCapacity")); + //未完成工时 + resourceMap.put("tardinessWork",e.get("tardinessWork")); + // + }); + + + + + return null; + } /** * 事业部质量看板数据接口 diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/utils/DateReportUtils.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/utils/DateReportUtils.java new file mode 100644 index 00000000..a8d8b262 --- /dev/null +++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/utils/DateReportUtils.java @@ -0,0 +1,191 @@ +package com.foreverwin.mesnac.anomaly.utils; + +import org.apache.commons.lang.time.DateUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Author YinQ + * @create 2022-08-25 12:40 + */ +public class DateReportUtils { + + public static final String sdf2 = "yyyy-MM-dd"; + public static final String sdf3 = "yyyy.MM.dd"; + + /** + * 指定时间计算有几周,并返回每周起止日期 + * + * @param start 开始时间 + * @param end 结束时间 + * @return week:第几周 start:每周开始时间 end:每周结束时间 + */ + public static List> getWeekOfDate(String start, String end) { + List> list = new ArrayList<>(); + Map map; + Date startDate = stringToDate(start, sdf2); + Date endDate = stringToDate(end, sdf2); + + assert endDate != null; + assert startDate != null; + long howLong = howLong("d", startDate, endDate); + int weekNum = Math.toIntExact(howLong / 7); + if (howLong % 7 > 0) { + weekNum++; + } + + Calendar cal = Calendar.getInstance(); + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + cal.setTime(startDate); + // 获得当前日期是一个星期的第几天 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK); + if (1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + for (int i = 1; i <= weekNum; i++) { + map = new HashMap<>(); + map.put("week", String.valueOf(i)); + + if (i == 1) {//第一周以 start 开始 + map.put("start", dateFormat(startDate, sdf2)); + }else { + map.put("start",dateFormat(cal.getTime(),sdf2)); + } + + if (i == weekNum) {//最后一周以 end 结束 + map.put("end", dateFormat(endDate, sdf2)); + }else { + //设置这周的周日日期,1代表周日,取值范围1~7,设置1~7之外会从周日开始往前后推算,负前正后,DAY_OF_WEEK的日期变更范围只会是在当前日期的周 + cal.set(Calendar.DAY_OF_WEEK,1); + map.put("end",dateFormat(cal.getTime(),sdf2)); + } + list.add(map); + + //调用 org.apache.commons.lang.time.DateUtils 包下的方法 + //新增一天到下一周的开始日期 + cal.setTime(DateUtils.addDays(cal.getTime(), 1)); + } + + return list; + } + + public static List> getWeekOfDate3(String start, String end) { + List> list = new ArrayList<>(); + Map map; + Date startDate = stringToDate(start, sdf2); + Date endDate = stringToDate(end, sdf2); + + assert endDate != null; + assert startDate != null; + long howLong = howLong("d", startDate, endDate); + int weekNum = Math.toIntExact(howLong / 7); + if (howLong % 7 > 0) { + weekNum++; + } + + Calendar cal = Calendar.getInstance(); + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + cal.setTime(startDate); + // 获得当前日期是一个星期的第几天 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK); + if (1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + for (int i = 1; i <= weekNum; i++) { + map = new HashMap<>(); + map.put("week", String.valueOf(i)); + + if (i == 1) {//第一周以 start 开始 + map.put("start", dateFormat(startDate, sdf3)); + }else { + map.put("start",dateFormat(cal.getTime(),sdf3)); + } + + if (i == weekNum) {//最后一周以 end 结束 + map.put("end", dateFormat(endDate, sdf3)); + }else { + //设置这周的周日日期,1代表周日,取值范围1~7,设置1~7之外会从周日开始往前后推算,负前正后,DAY_OF_WEEK的日期变更范围只会是在当前日期的周 + cal.set(Calendar.DAY_OF_WEEK,1); + map.put("end",dateFormat(cal.getTime(),sdf3)); + } + list.add(map); + + //调用 org.apache.commons.lang.time.DateUtils 包下的方法 + //新增一天到下一周的开始日期 + cal.setTime(DateUtils.addDays(cal.getTime(), 1)); + } + + return list; + } + + /** + * 将date类型转为String类型 + * + * @param date 时间 + * @param type 格式 + * @return + */ + public static String dateFormat(Date date, String type) { + if (date == null) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(type); + return sdf.format(date); + } + + + /** + * 将Sting类型转为date类型 + * + * @param str 待转换的字符 + * @param date 时间类型,如:yyyy-MM-dd HH:mm:ss + * @return + * @throws ParseException + */ + public static Date stringToDate(String str, String date) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(date); + return sdf.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 计算时间差 (时间单位,开始时间,结束时间) + * + * @param unit 时间单位 s - 秒,m - 分,h - 时,d - 天 ,M - 月 y - 年 + * @param begin 开始时间 + * @param end 结束时间 + * @return + */ + public static long howLong(String unit, Date begin, Date end) { + long ltime = begin.getTime() - end.getTime() < 0 ? end.getTime() - begin.getTime() + : begin.getTime() - end.getTime(); + if (unit.equals("s")) { + return ltime / 1000;// 返回秒 + } else if (unit.equals("m")) { + return ltime / 60000;// 返回分钟 + } else if (unit.equals("h")) { + return ltime / 3600000;// 返回小时 + } else if (unit.equals("d")) { + return ltime / 86400000;// 返回天数 + } else if (unit.equals("y")) { + long res = ltime / 86400000; + return res / 365; + } else if (unit.equals("M")) { + long res = ltime / 86400000; + return res / 30; + } else { + return 0; + } + } + +} + diff --git a/anomaly/src/main/resources/mapper/ReportMapper.xml b/anomaly/src/main/resources/mapper/ReportMapper.xml index 61292008..e4e32c15 100644 --- a/anomaly/src/main/resources/mapper/ReportMapper.xml +++ b/anomaly/src/main/resources/mapper/ReportMapper.xml @@ -1205,6 +1205,7 @@ LEFT JOIN ROUTER r ON zsd.ROUTER_BO = R.HANDLE LEFT JOIN ROUTER_STEP rs ON rs.ROUTER_BO = r.HANDLE AND rs.STEP_ID = zsd.STEP_ID WHERE zsd.SITE = '1000' + AND zsd.DISPATCH_STATUS != 'CANCEL' AND cf.VALUE IS NOT NULL AND cf2.VALUE IS NOT NULL GROUP BY zsd.SITE, cf.VALUE, cf2.VALUE, zsd.SHOP_ORDER, zsd.SFC, it.DESCRIPTION, rs.REWORK @@ -1284,7 +1285,7 @@ + + + + + + \ No newline at end of file