许鹏程
2024-01-15 36dc14af5a78be3b3eb941ddc13a22d3aaf1fe3a
product-server-data-center/src/main/java/com/product/data/center/service/TraceToSourceService.java
@@ -35,49 +35,46 @@
/**
 *    SN追溯查询
 * @author du
 * SN追溯查询
 *
 * @author du
 */
@Service
public class TraceToSourceService extends AbstractBaseService{
public class TraceToSourceService extends AbstractBaseService {
   @Autowired
   BaseDao baseDao;
   /**
    *   物料SN反追溯历史查询
    * @param querySNSN   主件SN
    * 物料SN反追溯历史查询
    *
    * @param querySNSN  主件SN
    * @param isBakTable 是否BAK表
    * @return
    */
   public JSONObject antitraceReport(String querySN, String isBakTable) {
      JSONObject jsonInfo=new JSONObject();
      JSONObject jsonInfo = new JSONObject();
      //查询关键件,获取机号SN
      String currentSql = "";
      if ("1".equals(isBakTable)) {
         currentSql = "SELECT DISTINCT pk_product_sn FROM [={da_t_wip_product_keyp_bak}{}{WHERE pk_keyp_sn = '"+querySN+"' }=]";
      }else {
         currentSql = "SELECT DISTINCT pk_product_sn FROM [={da_t_wip_product_keyp}{}{WHERE pk_keyp_sn = '"+querySN+"' }=]";
      }
      String currentSql = "SELECT DISTINCT pk_product_sn FROM [={da_t_wip_product_keyp}{}{WHERE pk_keyp_sn = '" + querySN + "' }=]";
      String parseSql = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), currentSql);
      FieldSetEntity fse=baseDao.getFieldSetBySQL(parseSql, new Object[] {}, false);
      if (fse!=null) {
         jsonInfo=traceReport(fse.getString(CmnConst.PK_PRODUCT_SN), isBakTable);
      FieldSetEntity fse = baseDao.getFieldSetBySQL(parseSql, new Object[]{}, false);
      if (fse != null) {
         jsonInfo = traceReport(fse.getString(CmnConst.PK_PRODUCT_SN), isBakTable);
      }
      return jsonInfo;
   }
   /**
    *   SN追溯历史查询
    * @param 机器SN   机器序列号
    * SN追溯历史查询
    *
    * @param 机器SN       机器序列号
    * @param isBakTable 是否BAK表
    * @return
    */
   public JSONObject traceReport(String querySN, String isBakTable) {
      JSONObject jsonInfo=new JSONObject();
      JSONObject jsonInfo = new JSONObject();
      jsonInfo.set("orderInfo", BaseUtil.fieldSetEntityToJson(getManufacturingOrderInformation(querySN, isBakTable)));
      jsonInfo.set("materialInfo", BaseUtil.dataTableEntityToJson(getWorkCenterOperationInfomation(querySN, isBakTable)));
@@ -89,7 +86,8 @@
   }
   /**
    *    获取制令单信息
    * 获取制令单信息
    *
    * @param querySN
    * @param isBakTable 是否BAK表
    * @return
@@ -98,33 +96,29 @@
      //订单信息
      StringBuilder sb1 = new StringBuilder(1024);
      sb1.append("SELECT ")
      .append(" t.mo_number,t.model_name,t.area_name,t.container_sn, ")
      .append(" t.next_station,t.station_name,t.display_group, ")
      .append(" t.old_begin_time,t.old_end_time,w.pi_sn, ")
      .append(" DATE_FORMAT(p.mo_start_date, '%Y-%m-%d %H:%i:%s') mo_start_date, ")
      .append(" DATE_FORMAT(t.in_station_time, '%Y-%m-%d %H:%i:%s') in_station_time, ")
      .append(" (CASE t.group_name WHEN 'N/A' THEN t.next_station ELSE t.group_name END) group_name, ")
      .append(" (CASE t.error_flag WHEN '0' THEN '正常' WHEN '1' THEN '不良' WHEN '3' THEN '报废' ELSE 'N/A' END) error_flag ")
      .append("")
      .append(" FROM [=da_t_pm_mo_base=] p,[={");
      if ("1".equals(isBakTable)) {
         sb1.append("da_t_wip_tracking_bak");
      }else {
         sb1.append("da_t_wip_tracking");
      }
            .append(" t.mo_number,t.model_name,t.area_name,t.container_sn, ")
            .append(" t.next_station,t.station_name,t.display_group, ")
            .append(" t.old_begin_time,t.old_end_time,w.pi_sn, ")
            .append(" DATE_FORMAT(p.mo_start_date, '%Y-%m-%d %H:%i:%s') mo_start_date, ")
            .append(" DATE_FORMAT(t.in_station_time, '%Y-%m-%d %H:%i:%s') in_station_time, ")
            .append(" (CASE t.group_name WHEN 'N/A' THEN t.next_station ELSE t.group_name END) group_name, ")
            .append(" (CASE t.error_flag WHEN '0' THEN '正常' WHEN '1' THEN '不良' WHEN '3' THEN '报废' ELSE 'N/A' END) error_flag ")
            .append("")
            .append(" FROM [=da_t_pm_mo_base=] p,[={");
      sb1.append("da_t_wip_tracking");
      sb1.append("}{}{WHERE serial_number = '")
      .append(querySN)
      .append("'}=] t ")
      .append(" LEFT JOIN [={da_t_wip_packaging_infor}{}{WHERE pi_product_sn='")
      .append(querySN)
      .append("'}=] w ON t.serial_number = w.pi_product_sn ")
      .append(" WHERE p.mo_number = t.mo_number AND t.serial_number = ?");
            .append(querySN)
            .append("'}=] t ")
            .append(" LEFT JOIN [={da_t_wip_packaging_infor}{}{WHERE pi_product_sn='")
            .append(querySN)
            .append("'}=] w ON t.serial_number = w.pi_product_sn ")
            .append(" WHERE p.mo_number = t.mo_number AND t.serial_number = ?");
      //报表解析SQL,生成WITH
      String finalSql = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), sb1.toString());
      FieldSetEntity orderInfo=baseDao.getFieldSetEntityBySQL(finalSql, new Object[] {querySN} , false);
      if (orderInfo!=null) {
      FieldSetEntity orderInfo = baseDao.getFieldSetEntityBySQL(finalSql, new Object[]{querySN}, false);
      if (orderInfo != null) {
         orderInfo.setValue("outPack", this.getOutermostContainer(querySN));
      }
      return orderInfo;
@@ -132,7 +126,8 @@
   /**
    *    获取最外层容器SN
    * 获取最外层容器SN
    *
    * @param querySN
    * @return
    */
@@ -140,12 +135,12 @@
      //单独查询包装信息
      StringBuilder sb = new StringBuilder();
      sb.append("SELECT pi_sn,pi_pack_level,pi_child_sn")
      .append(" FROM [={da_t_wip_packaging_infor}{pi_sn,ROUND(pi_pack_level)pi_pack_level,pi_child_sn}{WHERE pi_product_sn='")
      .append(querySN)
      .append("'}=] ");
            .append(" FROM [={da_t_wip_packaging_infor}{pi_sn,ROUND(pi_pack_level)pi_pack_level,pi_child_sn}{WHERE pi_product_sn='")
            .append(querySN)
            .append("'}=] ");
//      .append(" WHERE pi_product_sn=? ");
      String finalSql = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), sb.toString());
      DataTableEntity dtPackingInfo=baseDao.listTable(finalSql, new Object[] {});
      DataTableEntity dtPackingInfo = baseDao.listTable(finalSql, new Object[]{});
      if (!BaseUtil.dataTableIsEmpty(dtPackingInfo)) {
         //目标SN集合(索引等于深度,索引对应值等于同深度的任意一个SN,即索引最大的SN为目标SN)
@@ -153,18 +148,18 @@
         for (int i = 0; i < dtPackingInfo.getRows(); i++) {
            FieldSetEntity fseBaseData = dtPackingInfo.getFieldSetEntity(i);
            //cheng 2022年12月29日14:16:52
            int level= NumberUtil.parseInt(fseBaseData.getString("pi_pack_level"));
            String ID=fseBaseData.getString("pi_sn");
            while (listLevel.size()<level) {
            int level = NumberUtil.parseInt(fseBaseData.getString("pi_pack_level"));
            String ID = fseBaseData.getString("pi_sn");
            while (listLevel.size() < level) {
               listLevel.add(new HashMap<>());
            }
            listLevel.get(level-1).put(ID, fseBaseData);
            listLevel.get(level - 1).put(ID, fseBaseData);
         }
         //双循环遍历去掉非上下级的包装数据
         for (int i = 1; i < listLevel.size(); i++) {
            Map<String, FieldSetEntity> mapPreCommonLevel=listLevel.get(i-1);
            Map<String, FieldSetEntity> mapCommonLevel=listLevel.get(i);
            Map<String, FieldSetEntity> mapPreCommonLevel = listLevel.get(i - 1);
            Map<String, FieldSetEntity> mapCommonLevel = listLevel.get(i);
            for (Map.Entry<String, FieldSetEntity> entry : mapCommonLevel.entrySet()) {
               String key = entry.getKey();
               FieldSetEntity val = entry.getValue();
@@ -173,14 +168,14 @@
               }
            }
            if (mapCommonLevel.isEmpty()) {
               listLevel.remove(listLevel.subList(i, listLevel.size()-1));
               listLevel.remove(listLevel.subList(i, listLevel.size() - 1));
            }
         }
         //返回最外层包装条码
         for (Map.Entry<String, FieldSetEntity> entry : listLevel.get(listLevel.size()-1).entrySet()) {
            String key=entry.getKey();
            if (key!=null) {
         for (Map.Entry<String, FieldSetEntity> entry : listLevel.get(listLevel.size() - 1).entrySet()) {
            String key = entry.getKey();
            if (key != null) {
               return key;
            }
         }
@@ -190,7 +185,8 @@
   /**
    *    获取工作中心物料作业信息
    * 获取工作中心物料作业信息
    *
    * @param querySN
    * @param isBakTable 是否BAK表
    * @return
@@ -199,33 +195,30 @@
      //物料作业信息
      StringBuilder sb2 = new StringBuilder(1024);
      sb2.append("SELECT ")
      .append(" DISTINCT pk_station_name AS stationName, ")
      .append(" l.pk_product_lot AS lot_number,l.pk_item_code AS keyPartNo, ")
      .append(" c.co_item_name AS assistantToolName,c.co_item_spec AS itemSpec, ")
      .append(" pk_keyp_sn AS itemSN,pk_keyp_sn_qty AS itemCount, ")
      .append(" DATE_FORMAT(pk_loadtime,'%Y-%m-%d %H:%i:%s') AS loadTime, ")
      .append(" (SELECT d.emp_name FROM da_t_co_emp_desc d WHERE d.emp_no=l.pk_empno)empName, ")
      .append(" (CASE 0 WHEN 0 THEN '上料' WHEN '1' THEN '下料' WHEN '2' THEN '换料' WHEN '3' THEN '异常换料' ELSE '' END) actionType ")
      .append(" FROM [={");
      if ("1".equals(isBakTable)) {
         sb2.append("da_t_wip_product_keyp_bak");
      }else {
         sb2.append("da_t_wip_product_keyp");
      }
            .append(" DISTINCT pk_station_name AS stationName, ")
            .append(" l.pk_product_lot AS lot_number,l.pk_item_code AS keyPartNo, ")
            .append(" c.co_item_name AS assistantToolName,c.co_item_spec AS itemSpec, ")
            .append(" pk_keyp_sn AS itemSN,pk_keyp_sn_qty AS itemCount, ")
            .append(" DATE_FORMAT(pk_loadtime,'%Y-%m-%d %H:%i:%s') AS loadTime, ")
            .append(" (SELECT d.emp_name FROM da_t_co_emp_desc d WHERE d.emp_no=l.pk_empno)empName, ")
            .append(" (CASE 0 WHEN 0 THEN '上料' WHEN '1' THEN '下料' WHEN '2' THEN '换料' WHEN '3' THEN '异常换料' ELSE '' END) actionType ")
            .append(" FROM [={");
      sb2.append("da_t_wip_product_keyp");
      sb2.append("}{}{ WHERE pk_replace_flag='N' AND pk_product_sn='")
      .append(querySN)
      .append("'}=] l ")
      .append(" LEFT JOIN [=da_t_co_item=] c ON c.co_item_code=l.pk_item_code ")
      .append(" WHERE l.pk_replace_flag='N' AND l.pk_product_sn=? ")
      .append(" ORDER BY loadtime ");
            .append(querySN)
            .append("'}=] l ")
            .append(" LEFT JOIN [=da_t_co_item=] c ON c.co_item_code=l.pk_item_code ")
            .append(" WHERE l.pk_replace_flag='N' AND l.pk_product_sn=? ")
            .append(" ORDER BY loadtime ");
      //报表解析SQL,生成WITH
      String finalSql2 = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), sb2.toString());
      DataTableEntity materialInfo=baseDao.listTable(finalSql2, new Object[] {querySN});
      DataTableEntity materialInfo = baseDao.listTable(finalSql2, new Object[]{querySN});
      return materialInfo;
   }
   /**
    *    获取历史过站信息
    * 获取历史过站信息
    *
    * @param querySN
    * @param isBakTable 是否BAK表
    * @return
@@ -234,41 +227,38 @@
      //过站信息
      StringBuilder sb3 = new StringBuilder();
      sb3.append(" SELECT ")
      .append(" t.mo_number,t.lot_number,t.model_name,t.area_name, ")
      .append(" t.group_name,t.next_station,t.station_name, ")
      .append(" t.customer_no,t.emp_no,c.emp_name,t.item_count,t.serial_number, ")
      .append(" DATE_FORMAT(t.in_station_time, '%Y-%m-%d %H:%i:%s') AS in_station_time, ")
      .append(" (CASE t.error_flag WHEN '0' THEN '正常' WHEN '1' THEN '不良' WHEN '3' THEN '报废' ELSE 'N/A' END) error_flag ")
      .append(" FROM [={");
      if ("1".equals(isBakTable)) {
         sb3.append("da_t_wip_detail_bak");
      }else {
         sb3.append("da_t_wip_detail");
      }
            .append(" t.mo_number,t.lot_number,t.model_name,t.area_name, ")
            .append(" t.group_name,t.next_station,t.station_name, ")
            .append(" t.customer_no,t.emp_no,c.emp_name,t.item_count,t.serial_number, ")
            .append(" DATE_FORMAT(t.in_station_time, '%Y-%m-%d %H:%i:%s') AS in_station_time, ")
            .append(" (CASE t.error_flag WHEN '0' THEN '正常' WHEN '1' THEN '不良' WHEN '3' THEN '报废' ELSE 'N/A' END) error_flag ")
            .append(" FROM [={");
      sb3.append("da_t_wip_detail");
      sb3.append("}{}{")
      .append(" WHERE serial_number = ( ")
      .append(" SELECT '")
      .append(querySN)
      .append("' old_sn ")
      .append(" UNION ")
      .append(" SELECT DISTINCT old_sn  ")
      .append(" FROM da_t_co_sn_relation ")
      .append(" WHERE new_sn = '")
      .append(querySN)
      .append("' ")
      .append(" ) ")
      .append("}=] t ")
      .append(" LEFT JOIN da_t_co_emp_desc c ON t.emp_no = c.emp_no ")
      .append(" ORDER BY t.in_station_time ");
            .append(" WHERE serial_number = ( ")
            .append(" SELECT '")
            .append(querySN)
            .append("' old_sn ")
            .append(" UNION ")
            .append(" SELECT DISTINCT old_sn  ")
            .append(" FROM da_t_co_sn_relation ")
            .append(" WHERE new_sn = '")
            .append(querySN)
            .append("' ")
            .append(" ) ")
            .append("}=] t ")
            .append(" LEFT JOIN da_t_co_emp_desc c ON t.emp_no = c.emp_no ")
            .append(" ORDER BY t.in_station_time ");
      //报表解析SQL,生成WITH
      String finalSql3 = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), sb3.toString());
      DataTableEntity crossInfo=baseDao.listTable(finalSql3, new Object[] {});
      DataTableEntity crossInfo = baseDao.listTable(finalSql3, new Object[]{});
      return crossInfo;
   }
   /**
    *    获取历史维修记录
    * 获取历史维修记录
    *
    * @param querySN
    * @return
    */
@@ -276,47 +266,48 @@
      //维修记录
      StringBuilder sb4 = new StringBuilder();
      sb4.append(" SELECT ")
      .append(" c.error_desc,d.reason_desc,m.repair_moth, ")
      .append(" e.test_code,e.ng_count,e.test_point, ")
      .append(" r.reason_code,r.duty_type,r.repair_station, ")
      .append(" r.repair_group,r.error_item,r.item_desc, ")
      .append(" r.date_code,r.repair_desc,r.repairer, ")
      .append(" r.repair_time,s.emp_name,t.duty_desc ")
      .append(" FROM [=da_t_wip_repair=] r ")
      .append(" LEFT JOIN [={da_t_wip_error}{test_code,ng_count,test_point,ng_record_id,serial_number}{WHERE serial_number='")
      .append(querySN)
      .append("'}=] e ON e.ng_record_id = r.ng_record_id ")
      .append(" LEFT JOIN da_t_co_error_code c ON e.test_code = c.error_code ")
      .append(" LEFT JOIN da_t_co_repair_moth m ON r.repair_month_code = m.repair_code ")
      .append(" LEFT JOIN da_t_co_reason_code d ON r.reason_code = d.reason_code ")
      .append(" LEFT JOIN da_t_co_duty t ON r.duty_type = t.duty_type ")
      .append(" LEFT JOIN da_t_co_emp_desc s ON r.repairer = s.emp_no ")
      .append(" WHERE e.serial_number= ?");
            .append(" c.error_desc,d.reason_desc,m.repair_moth, ")
            .append(" e.test_code,e.ng_count,e.test_point, ")
            .append(" r.reason_code,r.duty_type,r.repair_station, ")
            .append(" r.repair_group,r.error_item,r.item_desc, ")
            .append(" r.date_code,r.repair_desc,r.repairer, ")
            .append(" r.repair_time,s.emp_name,t.duty_desc ")
            .append(" FROM [=da_t_wip_repair=] r ")
            .append(" LEFT JOIN [={da_t_wip_error}{test_code,ng_count,test_point,ng_record_id,serial_number}{WHERE serial_number='")
            .append(querySN)
            .append("'}=] e ON e.ng_record_id = r.ng_record_id ")
            .append(" LEFT JOIN da_t_co_error_code c ON e.test_code = c.error_code ")
            .append(" LEFT JOIN da_t_co_repair_moth m ON r.repair_month_code = m.repair_code ")
            .append(" LEFT JOIN da_t_co_reason_code d ON r.reason_code = d.reason_code ")
            .append(" LEFT JOIN da_t_co_duty t ON r.duty_type = t.duty_type ")
            .append(" LEFT JOIN da_t_co_emp_desc s ON r.repairer = s.emp_no ")
            .append(" WHERE e.serial_number= ?");
      //报表解析SQL,生成WITH
      String finalSql4 = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), sb4.toString());
      DataTableEntity repairInfo=baseDao.listTable(finalSql4, new Object[] {querySN});
      DataTableEntity repairInfo = baseDao.listTable(finalSql4, new Object[]{querySN});
      return repairInfo;
   }
   /**
    *    生成EXCEL数据
    * 生成EXCEL数据
    *
    * @param request
    * @param response
    * @throws IOException
    * @throws IOException
    */
   public void getReportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
      //获取机号查询信息
      FieldSetEntity fse = BaseUtil.getFieldSetEntity(request);
      DataTableEntity workCenterOperationInfomationSheet = this.getWorkCenterOperationInfomation(fse.getString(CmnConst.SERIAL_NUMBER), fse.getString(CmnConst.IS_BAK_TABLE));
      //初始EXCEL信息
      response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        //这里URLEncoder.encode可以防止中文乱码
        String fileName = URLEncoder.encode("SN历史追溯" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
      response.setCharacterEncoding("utf-8");
      //这里URLEncoder.encode可以防止中文乱码
      String fileName = URLEncoder.encode("SN历史追溯" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".xlsx", "UTF-8");
      response.setHeader("Content-disposition", "attachment;filename=" + fileName);
      List<TraceSNItemEntity> traceSNItemEntityList = new ArrayList<>();
      for (int i = 0; i < workCenterOperationInfomationSheet.getRows(); i++) {
         FieldSetEntity fieldSetEntity = workCenterOperationInfomationSheet.getFieldSetEntity(i);
@@ -329,7 +320,7 @@
      ExcelWriter excelWriter = EasyExcel.write(outputStream, TraceSNItemEntity.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
      try {
         WriteSheet writeSheet = EasyExcel.writerSheet(1, "物料作业信息").build();
          excelWriter.write(traceSNItemEntityList, writeSheet);
         excelWriter.write(traceSNItemEntityList, writeSheet);
      } catch (Exception e) {
         throw e;
      } finally {