YYC
2023-10-12 537a57d5e81d4c6da8a0eca1690f61644a1dc462
igds-inout/src/main/java/com/ld/igds/inout/service/JInoutReportService.java
@@ -24,812 +24,798 @@
 */
@Slf4j
@Component(JInoutReportService.BEAN_ID)
public class JInoutReportService extends JdbcDao  {
   public static final String BEAN_ID = "jdbcInoutReportServiceImpl";
public class JInoutReportService extends JdbcDao {
   @Autowired
   private HDepotService depotService;
    public static final String BEAN_ID = "jdbcInoutReportServiceImpl";
   public List<ReportInoutDepotData> getInoutDepotData(
         Map<String, Object> parameter) {
      // 时间条件必须
      Date start = (Date) parameter.get("start");
      Date end = (Date) parameter.get("end");
      String deptId = (String) parameter.get("deptId");
    @Autowired
    private HDepotService depotService;
      if (start == null || end == null || StringUtils.isEmpty(deptId))
         return null;
    public List<ReportInoutDepotData> getInoutDepotData(
            Map<String, Object> parameter) {
        // 时间条件必须
        Date start = (Date) parameter.get("start");
        Date end = (Date) parameter.get("end");
        String deptId = (String) parameter.get("deptId");
      StringBuffer sql = new StringBuffer();
      sql.append("SELECT ");
      sql.append("d.ID_ AS depotId, ");
      sql.append("d.NAME_ AS depotName, ");
      sql.append("d.FOOD_TYPE_ AS foodType, ");
      sql.append("d.FOOD_VARIETY_ AS foodVariety, ");
      sql.append("0 as cqkc, ");
      sql.append("d.STORAGE_REAL_ as qmkc, ");
      sql.append("a.inNum, ");
      sql.append("a.outNum, ");
      sql.append("a.lossNum, ");
      sql.append("a.overNum, ");
      sql.append("( ");
      sql.append("IFNULL(a.inNum, 0) + IFNULL(a.overNum, 0) ");
      sql.append(") AS inSum, ");
      sql.append("( ");
      sql.append("IFNULL(a.outNum, 0) + IFNULL(a.lossNum, 0) ");
      sql.append(") AS outSum ");
      sql.append("FROM ");
      sql.append("d_depot d ");
      sql.append("LEFT JOIN ( ");
      sql.append("SELECT ");
      sql.append("a.DEPOT_ID_, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ = :typeIn, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS inNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ = :typeOut, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS outNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ = :typeLoss, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS lossNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ = :typeOver, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS overNum ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ = :companyId ");
      sql.append("AND PROGRESS_ = :progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel  ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND COMPLETE_TIME_ >= :start ");
      sql.append("AND COMPLETE_TIME_ <= :end ");
      sql.append("AND DEPT_ID_  = :deptId ");
      sql.append(") a ");
      sql.append("GROUP BY a.DEPOT_ID_ ");
      sql.append(") a ON d.ID_ = a.DEPOT_ID_ ");
      sql.append("WHERE d.COMPANY_ID_ = :companyId ");
      sql.append("AND d.DEPOT_TYPE_ <> :depotTypeOther ");
      sql.append("AND d.DEPT_ID_  = :deptId ");
      sql.append("ORDER BY d.ID_");
        if (start == null || end == null || StringUtils.isEmpty(deptId))
            return null;
      Map<String, Object> args = new HashMap<>();
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("typeIn", InoutConstant.TYPE_IN);
      args.put("typeOut", InoutConstant.TYPE_OUT);
      args.put("typeLoss", Constant.LOSS_OVER_LOSS);
      args.put("typeOver", Constant.LOSS_OVER_OVER);
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT ");
        sql.append("d.ID_ AS depotId, ");
        sql.append("d.NAME_ AS depotName, ");
        sql.append("d.FOOD_TYPE_ AS foodType, ");
        sql.append("d.FOOD_VARIETY_ AS foodVariety, ");
        sql.append("0 as cqkc, ");
        sql.append("d.STORAGE_REAL_ as qmkc, ");
        sql.append("a.inNum, ");
        sql.append("a.outNum, ");
        sql.append("a.lossNum, ");
        sql.append("a.overNum, ");
        sql.append("( ");
        sql.append("IFNULL(a.inNum, 0) + IFNULL(a.overNum, 0) ");
        sql.append(") AS inSum, ");
        sql.append("( ");
        sql.append("IFNULL(a.outNum, 0) + IFNULL(a.lossNum, 0) ");
        sql.append(") AS outSum ");
        sql.append("FROM ");
        sql.append("d_depot d ");
        sql.append("LEFT JOIN ( ");
        sql.append("SELECT ");
        sql.append("a.DEPOT_ID_, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ = :typeIn, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS inNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ = :typeOut, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS outNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ = :typeLoss, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS lossNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ = :typeOver, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS overNum ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ = :companyId ");
        sql.append("AND PROGRESS_ = :progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel  ");
        sql.append("AND COMPLETE_TIME_ >= :start ");
        sql.append("AND COMPLETE_TIME_ <= :end ");
        sql.append("AND DEPT_ID_  = :deptId ");
        sql.append(") a ");
        sql.append("GROUP BY a.DEPOT_ID_ ");
        sql.append(") a ON d.ID_ = a.DEPOT_ID_ ");
        sql.append("WHERE d.COMPANY_ID_ = :companyId ");
        sql.append("AND d.DEPOT_TYPE_ <> :depotTypeOther ");
        sql.append("AND d.DEPT_ID_  = :deptId ");
        sql.append("ORDER BY d.ID_");
      args.put("start", DateUtil.getCurZero(start));
      args.put("end", DateUtil.getNextZero(end));
      args.put("depotTypeOther", DepotType.TYPE_99.getCode());
        Map<String, Object> args = new HashMap<>();
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("typeIn", InoutConstant.TYPE_IN);
        args.put("typeOut", InoutConstant.TYPE_OUT);
        args.put("typeLoss", Constant.LOSS_OVER_LOSS);
        args.put("typeOver", Constant.LOSS_OVER_OVER);
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      log.debug("====执行SLQ1={}", sql.toString());
        args.put("start", DateUtil.getCurZero(start));
        args.put("end", DateUtil.getNextZero(end));
        args.put("depotTypeOther", DepotType.TYPE_99.getCode());
      List<ReportInoutDepotData> data = this.getNamedParameterJdbcTemplate()
            .query(sql.toString(), args, new ReportInoutDepotRowMapper());
        log.debug("====执行SLQ1={}", sql.toString());
      if (null == data || data.isEmpty())
         return data;
        List<ReportInoutDepotData> data = this.getNamedParameterJdbcTemplate()
                .query(sql.toString(), args, new ReportInoutDepotRowMapper());
      // 根据开始时间获取距离最近的车辆信息,获取初期库存
      sql = new StringBuffer();
      args = new HashMap<>();
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("COMPANY_ID_, ");
      sql.append("PROGRESS_, ");
      sql.append("RECORD_STATUS_, ");
      sql.append("DEPT_ID_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ =:companyId ");
      sql.append("AND PROGRESS_ =:progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND DEPT_ID_ = :deptId ");
      sql.append("AND COMPLETE_TIME_ < :start ");
      sql.append("ORDER BY COMPLETE_TIME_ DESC ");
      sql.append("LIMIT 9999 ");
      sql.append(") AS a ");
      sql.append("GROUP BY ");
      sql.append("a.DEPOT_ID_ ");
        if (null == data || data.isEmpty())
            return data;
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      // 获取距离开始时间久最近的数据,当前天的第五分钟
      Date date = DateUtil.getCurZero(start);
      args.put("start", DateUtils.addMinutes(date, 5));
        // 根据开始时间获取距离最近的车辆信息,获取初期库存
        sql = new StringBuffer();
        args = new HashMap<>();
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("COMPANY_ID_, ");
        sql.append("PROGRESS_, ");
        sql.append("RECORD_STATUS_, ");
        sql.append("DEPT_ID_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ =:companyId ");
        sql.append("AND PROGRESS_ =:progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND DEPT_ID_ = :deptId ");
        sql.append("AND COMPLETE_TIME_ < :start ");
        sql.append("ORDER BY COMPLETE_TIME_ DESC ");
        sql.append("LIMIT 9999 ");
        sql.append(") AS a ");
        sql.append("GROUP BY ");
        sql.append("a.DEPOT_ID_ ");
      log.debug("====执行SLQ2={}", sql.toString());
      List<ReportInoutStorageData> list1 = this
            .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                  new ReportInoutStorageRowMapper());
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        // 获取距离开始时间久最近的数据,当前天的第五分钟
        Date date = DateUtil.getCurZero(start);
        args.put("start", DateUtils.addMinutes(date, 5));
      // 获取期末库存,获取距离结束时间最近的一条数据
      sql = new StringBuffer();
      args = new HashMap<>();
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("COMPANY_ID_, ");
      sql.append("PROGRESS_, ");
      sql.append("RECORD_STATUS_, ");
      sql.append("DEPT_ID_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ =:companyId ");
      sql.append("AND PROGRESS_ =:progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND DEPT_ID_ = :deptId ");
      sql.append("AND COMPLETE_TIME_ <:end ");
      sql.append("ORDER BY COMPLETE_TIME_ DESC ");
      sql.append("LIMIT 9999 ");
      sql.append(") AS a ");
      sql.append("GROUP BY ");
      sql.append("a.DEPOT_ID_ ");
        log.debug("====执行SLQ2={}", sql.toString());
        List<ReportInoutStorageData> list1 = this
                .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                        new ReportInoutStorageRowMapper());
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      args.put("end", DateUtil.getNextZero(end));
        // 获取期末库存,获取距离结束时间最近的一条数据
        sql = new StringBuffer();
        args = new HashMap<>();
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("COMPANY_ID_, ");
        sql.append("PROGRESS_, ");
        sql.append("RECORD_STATUS_, ");
        sql.append("DEPT_ID_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ =:companyId ");
        sql.append("AND PROGRESS_ =:progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND DEPT_ID_ = :deptId ");
        sql.append("AND COMPLETE_TIME_ <:end ");
        sql.append("ORDER BY COMPLETE_TIME_ DESC ");
        sql.append("LIMIT 9999 ");
        sql.append(") AS a ");
        sql.append("GROUP BY ");
        sql.append("a.DEPOT_ID_ ");
      log.debug("====执行SLQ3={}", sql.toString());
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        args.put("end", DateUtil.getNextZero(end));
      List<ReportInoutStorageData> list2 = this
            .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                  new ReportInoutStorageRowMapper());
        log.debug("====执行SLQ3={}", sql.toString());
      // 调整期末库存和初期库存以及合计信息
      updateDepotReport(data, list1, list2);
        List<ReportInoutStorageData> list2 = this
                .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                        new ReportInoutStorageRowMapper());
      return data;
   }
        // 调整期末库存和初期库存以及合计信息
        updateDepotReport(data, list1, list2);
   private void updateDepotReport(List<ReportInoutDepotData> data,
         List<ReportInoutStorageData> list1,
         List<ReportInoutStorageData> list2) {
      ReportInoutDepotData sum = new ReportInoutDepotData();
      int index = 1;
      for (ReportInoutDepotData d : data) {
         // 设置序号
         d.setRemarks(String.valueOf(index));
         // 当前数据添加初期库存
         d = this.updateDepotReportCqkc(d, list1);
        return data;
    }
    private void updateDepotReport(List<ReportInoutDepotData> data,
                                   List<ReportInoutStorageData> list1,
                                   List<ReportInoutStorageData> list2) {
        ReportInoutDepotData sum = new ReportInoutDepotData();
        int index = 1;
        for (ReportInoutDepotData d : data) {
            // 设置序号
            d.setRemarks(String.valueOf(index));
            // 当前数据添加初期库存
            d = this.updateDepotReportCqkc(d, list1);
//         d = this.updateDepotReportQmkc(d, list2);
         // 合计信息
         sum.setCqkc(sum.getCqkc() + d.getCqkc());
         sum.setInNum(sum.getInNum() + d.getInNum());
         sum.setOverNum(sum.getOverNum() + d.getOverNum());
         sum.setInSum(sum.getInSum() + d.getInSum());
         sum.setOutNum(sum.getOutNum() + d.getOutNum());
         sum.setLossNum(sum.getLossNum() + d.getLossNum());
         sum.setOutSum(sum.getOutSum() + d.getOutSum());
         sum.setQmkc(sum.getQmkc() + d.getQmkc());
         index++;
      }
      sum.setDepotName("合计");
      data.add(sum);
   }
            // 合计信息
            sum.setCqkc(sum.getCqkc() + d.getCqkc());
            sum.setInNum(sum.getInNum() + d.getInNum());
            sum.setOverNum(sum.getOverNum() + d.getOverNum());
            sum.setInSum(sum.getInSum() + d.getInSum());
            sum.setOutNum(sum.getOutNum() + d.getOutNum());
            sum.setLossNum(sum.getLossNum() + d.getLossNum());
            sum.setOutSum(sum.getOutSum() + d.getOutSum());
            sum.setQmkc(sum.getQmkc() + d.getQmkc());
            index++;
        }
        sum.setDepotName("合计");
        data.add(sum);
    }
   // 注意:如果期末库存没有临近数据,则表示获取最新的库存
   private ReportInoutDepotData updateDepotReportQmkc(ReportInoutDepotData d,
         List<ReportInoutStorageData> list2) {
      ReportInoutStorageData inoutStorageData = null;
      for (ReportInoutStorageData storageData : list2) {
         if (storageData.getDepotId().equals(d.getDepotId())) {
            inoutStorageData = storageData;
            break;
         }
      }
      if (null == inoutStorageData) {
         Depot depot = depotService.getDepotById(ContextUtil.getCompanyId(),
               d.getDepotId());
         d.setQmkc(null == depot.getStorageReal() ? 0.0 : depot
               .getStorageReal());
         return d;
      }
    // 注意:如果期末库存没有临近数据,则表示获取最新的库存
    public ReportInoutDepotData updateDepotReportQmkc(ReportInoutDepotData d,
                                                       List<ReportInoutStorageData> list2) {
        ReportInoutStorageData inoutStorageData = null;
        for (ReportInoutStorageData storageData : list2) {
            if (storageData.getDepotId().equals(d.getDepotId())) {
                inoutStorageData = storageData;
                break;
            }
        }
        if (null == inoutStorageData) {
            Depot depot = depotService.getDepotById(ContextUtil.getCompanyId(),
                    d.getDepotId());
            d.setQmkc(null == depot.getStorageReal() ? 0.0 : depot
                    .getStorageReal());
            return d;
        }
      double cmkc = inoutStorageData.getCurStorage();
      if (InoutConstant.TYPE_IN.equals(inoutStorageData.getType())) {
         cmkc = inoutStorageData.getCurStorage()
               + inoutStorageData.getSettleWeight();
      }
      if (InoutConstant.TYPE_OUT.equals(inoutStorageData.getType())) {
         cmkc = inoutStorageData.getCurStorage()
               - inoutStorageData.getSettleWeight();
      }
      if (Constant.LOSS_OVER_OVER.equals(inoutStorageData.getType())) {
         cmkc = inoutStorageData.getCurStorage()
               + inoutStorageData.getSettleWeight();
      }
      if (Constant.LOSS_OVER_LOSS.equals(inoutStorageData.getType())) {
         cmkc = inoutStorageData.getCurStorage()
               - inoutStorageData.getSettleWeight();
      }
      d.setQmkc(cmkc);
        double cmkc = inoutStorageData.getCurStorage();
        if (InoutConstant.TYPE_IN.equals(inoutStorageData.getType())) {
            cmkc = inoutStorageData.getCurStorage()
                    + inoutStorageData.getSettleWeight();
        }
        if (InoutConstant.TYPE_OUT.equals(inoutStorageData.getType())) {
            cmkc = inoutStorageData.getCurStorage()
                    - inoutStorageData.getSettleWeight();
        }
        if (Constant.LOSS_OVER_OVER.equals(inoutStorageData.getType())) {
            cmkc = inoutStorageData.getCurStorage()
                    + inoutStorageData.getSettleWeight();
        }
        if (Constant.LOSS_OVER_LOSS.equals(inoutStorageData.getType())) {
            cmkc = inoutStorageData.getCurStorage()
                    - inoutStorageData.getSettleWeight();
        }
        d.setQmkc(cmkc);
      return d;
   }
        return d;
    }
   private ReportInoutDepotData updateDepotReportCqkc(ReportInoutDepotData d,
         List<ReportInoutStorageData> list1) {
      ReportInoutStorageData inoutStorageData = null;
      for (ReportInoutStorageData storageData : list1) {
         if (storageData.getDepotId().equals(d.getDepotId())) {
            inoutStorageData = storageData;
            break;
         }
      }
      if (null == inoutStorageData) {
         d.setCqkc(0.0);
         return d;
      }
    private ReportInoutDepotData updateDepotReportCqkc(ReportInoutDepotData d,
                                                       List<ReportInoutStorageData> list1) {
        ReportInoutStorageData inoutStorageData = null;
        for (ReportInoutStorageData storageData : list1) {
            if (storageData.getDepotId().equals(d.getDepotId())) {
                inoutStorageData = storageData;
                break;
            }
        }
        if (null == inoutStorageData) {
            d.setCqkc(0.0);
            return d;
        }
      double cqkc = inoutStorageData.getCurStorage();
      if (InoutConstant.TYPE_IN.equals(inoutStorageData.getType())) {
         cqkc = inoutStorageData.getCurStorage()
               + inoutStorageData.getSettleWeight();
      }
        double cqkc = inoutStorageData.getCurStorage();
        if (InoutConstant.TYPE_IN.equals(inoutStorageData.getType())) {
            cqkc = inoutStorageData.getCurStorage()
                    + inoutStorageData.getSettleWeight();
        }
      if (InoutConstant.TYPE_OUT.equals(inoutStorageData.getType())) {
         cqkc = inoutStorageData.getCurStorage()
               - inoutStorageData.getSettleWeight();
      }
        if (InoutConstant.TYPE_OUT.equals(inoutStorageData.getType())) {
            cqkc = inoutStorageData.getCurStorage()
                    - inoutStorageData.getSettleWeight();
        }
      if (Constant.LOSS_OVER_OVER.equals(inoutStorageData.getType())) {
         cqkc = inoutStorageData.getCurStorage()
               + inoutStorageData.getSettleWeight();
      }
        if (Constant.LOSS_OVER_OVER.equals(inoutStorageData.getType())) {
            cqkc = inoutStorageData.getCurStorage()
                    + inoutStorageData.getSettleWeight();
        }
      if (Constant.LOSS_OVER_LOSS.equals(inoutStorageData.getType())) {
         cqkc = inoutStorageData.getCurStorage()
               - inoutStorageData.getSettleWeight();
      }
      d.setCqkc(cqkc);
      if (StringUtils.isEmpty(d.getFoodVarietyName()) && d.getCqkc() > 0) {
         d.setFoodVarietyName(FoodVariety.getMsg(inoutStorageData
               .getFoodVariety()));
         d.setFoodVariety(inoutStorageData.getFoodVariety());
      }
      return d;
   }
        if (Constant.LOSS_OVER_LOSS.equals(inoutStorageData.getType())) {
            cqkc = inoutStorageData.getCurStorage()
                    - inoutStorageData.getSettleWeight();
        }
        d.setCqkc(cqkc);
        if (StringUtils.isEmpty(d.getFoodVarietyName()) && d.getCqkc() > 0) {
            d.setFoodVarietyName(FoodVariety.getMsg(inoutStorageData
                    .getFoodVariety()));
            d.setFoodVariety(inoutStorageData.getFoodVariety());
        }
        return d;
    }
   public List<ReportInoutDepotData> getFoodVarietyData(
         Map<String, Object> parameter) {
    public List<ReportInoutDepotData> getFoodVarietyData(
            Map<String, Object> parameter) {
      // 时间条件必须
      Date start = (Date) parameter.get("start");
      Date end = (Date) parameter.get("end");
      String deptId = (String) parameter.get("deptId");
        // 时间条件必须
        Date start = (Date) parameter.get("start");
        Date end = (Date) parameter.get("end");
        String deptId = (String) parameter.get("deptId");
      if (start == null || end == null)
         return null;
        if (start == null || end == null)
            return null;
      StringBuffer sql = new StringBuffer();
      sql.append("SELECT ");
      sql.append("'NONE' as foodType, ");
      sql.append("0 as cqkc, ");
      sql.append("0 as qmkc, ");
      sql.append("0 as inSum, ");
      sql.append("0 as outSum, ");
      sql.append("a.FOOD_VARIETY_ as foodVariety, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ =:typeIn, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS inNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ =:typeOut, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS outNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ =:typeLoss, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS lossNum, ");
      sql.append("SUM( ");
      sql.append("IF ( ");
      sql.append("a.TYPE_ =:typeOver, ");
      sql.append("a.SETTLE_WEIGHT_, ");
      sql.append("0 ");
      sql.append(") ");
      sql.append(") AS overNum ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ =:companyId ");
      sql.append("AND PROGRESS_ =:progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND COMPLETE_TIME_ >= :start ");
      sql.append("AND COMPLETE_TIME_ <= :end ");
      sql.append("AND DEPT_ID_  = :deptId ");
      sql.append("ORDER BY COMPLETE_TIME_ DESC ");
      sql.append(") a ");
      sql.append("GROUP BY a.FOOD_VARIETY_ ");
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT ");
        sql.append("'NONE' as foodType, ");
        sql.append("0 as cqkc, ");
        sql.append("0 as qmkc, ");
        sql.append("0 as inSum, ");
        sql.append("0 as outSum, ");
        sql.append("a.FOOD_VARIETY_ as foodVariety, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ =:typeIn, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS inNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ =:typeOut, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS outNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ =:typeLoss, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS lossNum, ");
        sql.append("SUM( ");
        sql.append("IF ( ");
        sql.append("a.TYPE_ =:typeOver, ");
        sql.append("a.SETTLE_WEIGHT_, ");
        sql.append("0 ");
        sql.append(") ");
        sql.append(") AS overNum ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ =:companyId ");
        sql.append("AND PROGRESS_ =:progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND COMPLETE_TIME_ >= :start ");
        sql.append("AND COMPLETE_TIME_ <= :end ");
        sql.append("AND DEPT_ID_  = :deptId ");
        sql.append("ORDER BY COMPLETE_TIME_ DESC ");
        sql.append(") a ");
        sql.append("GROUP BY a.FOOD_VARIETY_ ");
      Map<String, Object> args = new HashMap<>();
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("typeIn", InoutConstant.TYPE_IN);
      args.put("typeOut", InoutConstant.TYPE_OUT);
      args.put("typeLoss", Constant.LOSS_OVER_LOSS);
      args.put("typeOver", Constant.LOSS_OVER_OVER);
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      args.put("start", DateUtil.getCurZero(start));
      args.put("end", DateUtil.getNextZero(end));
        Map<String, Object> args = new HashMap<>();
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("typeIn", InoutConstant.TYPE_IN);
        args.put("typeOut", InoutConstant.TYPE_OUT);
        args.put("typeLoss", Constant.LOSS_OVER_LOSS);
        args.put("typeOver", Constant.LOSS_OVER_OVER);
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        args.put("start", DateUtil.getCurZero(start));
        args.put("end", DateUtil.getNextZero(end));
      log.debug("====执行SLQ1={},参数={}", sql.toString(),args);
        log.debug("====执行SLQ1={},参数={}", sql.toString(), args);
      List<ReportInoutDepotData> data = this.getNamedParameterJdbcTemplate()
            .query(sql.toString(), args, new ReportFoodVarietyRowMapper());
        List<ReportInoutDepotData> data = this.getNamedParameterJdbcTemplate()
                .query(sql.toString(), args, new ReportFoodVarietyRowMapper());
      // 根据开始时间获取距离最近的车辆信息,获取初期库存
      sql = new StringBuffer();
      args = new HashMap<>();
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("COMPANY_ID_, ");
      sql.append("PROGRESS_, ");
      sql.append("RECORD_STATUS_, ");
      sql.append("DEPT_ID_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ =:companyId ");
      sql.append("AND PROGRESS_ =:progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND DEPT_ID_ = :deptId ");
      sql.append("AND COMPLETE_TIME_ < :start ");
      sql.append("ORDER BY COMPLETE_TIME_ DESC ");
      sql.append("LIMIT 9999 ");
      sql.append(") AS a ");
      sql.append("GROUP BY ");
      sql.append("a.DEPOT_ID_ ");
        // 根据开始时间获取距离最近的车辆信息,获取初期库存
        sql = new StringBuffer();
        args = new HashMap<>();
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("COMPANY_ID_, ");
        sql.append("PROGRESS_, ");
        sql.append("RECORD_STATUS_, ");
        sql.append("DEPT_ID_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ =:companyId ");
        sql.append("AND PROGRESS_ =:progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND DEPT_ID_ = :deptId ");
        sql.append("AND COMPLETE_TIME_ < :start ");
        sql.append("ORDER BY COMPLETE_TIME_ DESC ");
        sql.append("LIMIT 9999 ");
        sql.append(") AS a ");
        sql.append("GROUP BY ");
        sql.append("a.DEPOT_ID_ ");
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      // 获取距离开始时间久最近的数据,当前天的第五分钟
      Date date = DateUtil.getCurZero(start);
      args.put("start", DateUtils.addMinutes(date, 5));
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        // 获取距离开始时间久最近的数据,当前天的第五分钟
        Date date = DateUtil.getCurZero(start);
        args.put("start", DateUtils.addMinutes(date, 5));
      log.debug("====执行SLQ2={}", sql.toString());
        log.debug("====执行SLQ2={}", sql.toString());
      List<ReportInoutStorageData> list1 = this
            .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                  new ReportInoutStorageRowMapper());
        List<ReportInoutStorageData> list1 = this
                .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                        new ReportInoutStorageRowMapper());
      // 获取期末库存,获取距离结束时间最近的一条数据
      sql = new StringBuffer();
      args = new HashMap<>();
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("( ");
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("TYPE_, ");
      sql.append("CUR_STORAGE_, ");
      sql.append("COMPANY_ID_, ");
      sql.append("PROGRESS_, ");
      sql.append("RECORD_STATUS_, ");
      sql.append("DEPT_ID_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("COMPANY_ID_ =:companyId ");
      sql.append("AND PROGRESS_ =:progress ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND DEPT_ID_ = :deptId ");
      sql.append("AND COMPLETE_TIME_ < :end ");
      sql.append("ORDER BY COMPLETE_TIME_ DESC ");
      sql.append("LIMIT 9999 ");
      sql.append(") AS a ");
      sql.append("GROUP BY ");
      sql.append("a.DEPOT_ID_ ");
        // 获取期末库存,获取距离结束时间最近的一条数据
        sql = new StringBuffer();
        args = new HashMap<>();
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("( ");
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("TYPE_, ");
        sql.append("CUR_STORAGE_, ");
        sql.append("COMPANY_ID_, ");
        sql.append("PROGRESS_, ");
        sql.append("RECORD_STATUS_, ");
        sql.append("DEPT_ID_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("COMPANY_ID_ =:companyId ");
        sql.append("AND PROGRESS_ =:progress ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND DEPT_ID_ = :deptId ");
        sql.append("AND COMPLETE_TIME_ < :end ");
        sql.append("ORDER BY COMPLETE_TIME_ DESC ");
        sql.append("LIMIT 9999 ");
        sql.append(") AS a ");
        sql.append("GROUP BY ");
        sql.append("a.DEPOT_ID_ ");
      args.put("deptId", deptId);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("progress", InoutConstant.PROGRESS_RECORD);
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      args.put("end", DateUtil.getNextZero(end));
        args.put("deptId", deptId);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("progress", InoutConstant.PROGRESS_RECORD);
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        args.put("end", DateUtil.getNextZero(end));
      log.debug("====执行SLQ3={}", sql.toString());
        log.debug("====执行SLQ3={}", sql.toString());
      List<ReportInoutStorageData> list2 = this
            .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                  new ReportInoutStorageRowMapper());
        List<ReportInoutStorageData> list2 = this
                .getNamedParameterJdbcTemplate().query(sql.toString(), args,
                        new ReportInoutStorageRowMapper());
      return updateFoodVarietySum(data, list1, list2);
        return updateFoodVarietySum(data, list1, list2);
   }
    }
   @SuppressWarnings("unused")
   private List<ReportInoutDepotData> updateFoodVarietySum(
         List<ReportInoutDepotData> datas,
         List<ReportInoutStorageData> list1,
         List<ReportInoutStorageData> list2) {
    @SuppressWarnings("unused")
    private List<ReportInoutDepotData> updateFoodVarietySum(
            List<ReportInoutDepotData> datas,
            List<ReportInoutStorageData> list1,
            List<ReportInoutStorageData> list2) {
      // 调整初期库存
      Map<String, Double> map1 = new HashMap<>();
      if (null != list1) {
         for (ReportInoutStorageData data : list1) {
            if (null == map1.get(data.getFoodVariety())) {
               map1.put(data.getFoodVariety(), 0.0);
            }
            double cqkc = data.getCurStorage();
            if (InoutConstant.TYPE_IN.equals(data.getType())) {
               cqkc = data.getCurStorage() + data.getSettleWeight();
            }
            if (InoutConstant.TYPE_OUT.equals(data.getType())) {
               cqkc = data.getCurStorage() - data.getSettleWeight();
            }
            if (Constant.LOSS_OVER_OVER.equals(data.getType())) {
               cqkc = data.getCurStorage() + data.getSettleWeight();
            }
            if (Constant.LOSS_OVER_LOSS.equals(data.getType())) {
               cqkc = data.getCurStorage() - data.getSettleWeight();
            }
            map1.put(data.getFoodVariety(), map1.get(data.getFoodVariety())
                  + cqkc);
         }
      }
        // 调整初期库存
        Map<String, Double> map1 = new HashMap<>();
        if (null != list1) {
            for (ReportInoutStorageData data : list1) {
                if (null == map1.get(data.getFoodVariety())) {
                    map1.put(data.getFoodVariety(), 0.0);
                }
                double cqkc = data.getCurStorage();
                if (InoutConstant.TYPE_IN.equals(data.getType())) {
                    cqkc = data.getCurStorage() + data.getSettleWeight();
                }
                if (InoutConstant.TYPE_OUT.equals(data.getType())) {
                    cqkc = data.getCurStorage() - data.getSettleWeight();
                }
                if (Constant.LOSS_OVER_OVER.equals(data.getType())) {
                    cqkc = data.getCurStorage() + data.getSettleWeight();
                }
                if (Constant.LOSS_OVER_LOSS.equals(data.getType())) {
                    cqkc = data.getCurStorage() - data.getSettleWeight();
                }
                map1.put(data.getFoodVariety(), map1.get(data.getFoodVariety())
                        + cqkc);
            }
        }
      // 调整期末库存
      Map<String, Double> map2 = new HashMap<String, Double>();
      if (null != list2) {
         Depot depot = null;
         for (ReportInoutStorageData data : list2) {
            if (null == map2.get(data.getFoodVariety())) {
               map2.put(data.getFoodVariety(), 0.0);
            }
            double cmkc = data.getCurStorage();
            if (InoutConstant.TYPE_IN.equals(data.getType())) {
               cmkc = data.getCurStorage() + data.getSettleWeight();
            }
            if (InoutConstant.TYPE_OUT.equals(data.getType())) {
               cmkc = data.getCurStorage() - data.getSettleWeight();
            }
            if (Constant.LOSS_OVER_OVER.equals(data.getType())) {
               cmkc = data.getCurStorage() + data.getSettleWeight();
            }
            if (Constant.LOSS_OVER_LOSS.equals(data.getType())) {
               cmkc = data.getCurStorage() - data.getSettleWeight();
            }
            map2.put(data.getFoodVariety(), map2.get(data.getFoodVariety())
                  + cmkc);
         }
      }
        // 调整期末库存
        Map<String, Double> map2 = new HashMap<String, Double>();
        if (null != list2) {
            Depot depot = null;
            for (ReportInoutStorageData data : list2) {
                if (null == map2.get(data.getFoodVariety())) {
                    map2.put(data.getFoodVariety(), 0.0);
                }
                double cmkc = data.getCurStorage();
                if (InoutConstant.TYPE_IN.equals(data.getType())) {
                    cmkc = data.getCurStorage() + data.getSettleWeight();
                }
                if (InoutConstant.TYPE_OUT.equals(data.getType())) {
                    cmkc = data.getCurStorage() - data.getSettleWeight();
                }
                if (Constant.LOSS_OVER_OVER.equals(data.getType())) {
                    cmkc = data.getCurStorage() + data.getSettleWeight();
                }
                if (Constant.LOSS_OVER_LOSS.equals(data.getType())) {
                    cmkc = data.getCurStorage() - data.getSettleWeight();
                }
                map2.put(data.getFoodVariety(), map2.get(data.getFoodVariety())
                        + cmkc);
            }
        }
      //判断初期库存粮食种类数是否跟出入库粮食种类数相等
      if(datas.size() != map1.size()){
         ReportInoutDepotData report;
         for (String s : map1.keySet()) {
            boolean flag = true;
            for (ReportInoutDepotData data : datas) {
               if(StringUtils.isNotEmpty(data.getFoodVariety()) && data.getFoodVariety().equals(s)){
                  flag = false;
                  break;
               }
            }
            if (flag){
               report = new ReportInoutDepotData();
               report.setFoodType("NONE");
               report.setFoodVariety(s);
               report.setFoodVarietyName(FoodVariety.getMsg(s));
               datas.add(report);
            }
         }
      }
        //判断初期库存粮食种类数是否跟出入库粮食种类数相等
        if (datas.size() != map1.size()) {
            ReportInoutDepotData report;
            for (String s : map1.keySet()) {
                boolean flag = true;
                for (ReportInoutDepotData data : datas) {
                    if (StringUtils.isNotEmpty(data.getFoodVariety()) && data.getFoodVariety().equals(s)) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    report = new ReportInoutDepotData();
                    report.setFoodType("NONE");
                    report.setFoodVariety(s);
                    report.setFoodVarietyName(FoodVariety.getMsg(s));
                    datas.add(report);
                }
            }
        }
      if (null == datas || datas.isEmpty()){
         return datas;
      }
        if (null == datas || datas.isEmpty()) {
            return datas;
        }
      ReportInoutDepotData sum = new ReportInoutDepotData();
      sum.setFoodVarietyName("合计");
      int index = 1;
      for (ReportInoutDepotData data : datas) {
         if(StringUtils.isNotEmpty(data.getFoodVariety())){
            // 设置序号
            data.setRemarks(String.valueOf(index));
            index++;
            data.setOutSum(data.getOutNum() + data.getLossNum());
            data.setInSum(data.getInNum() + data.getOverNum());
        ReportInoutDepotData sum = new ReportInoutDepotData();
        sum.setFoodVarietyName("合计");
        int index = 1;
        for (ReportInoutDepotData data : datas) {
            if (StringUtils.isNotEmpty(data.getFoodVariety())) {
                // 设置序号
                data.setRemarks(String.valueOf(index));
                index++;
                data.setOutSum(data.getOutNum() + data.getLossNum());
                data.setInSum(data.getInNum() + data.getOverNum());
            // 调整期末库存和期初库存
            data.setCqkc(map1.get(data.getFoodVariety()) == null ? 0.0:map1.get(data.getFoodVariety()));
            data.setQmkc(map2.get(data.getFoodVariety()) == null ? 0.0:map2.get(data.getFoodVariety()));
                // 调整期末库存和期初库存
                data.setCqkc(map1.get(data.getFoodVariety()) == null ? 0.0 : map1.get(data.getFoodVariety()));
                data.setQmkc(map2.get(data.getFoodVariety()) == null ? 0.0 : map2.get(data.getFoodVariety()));
            // 初期库存
            sum.setCqkc(sum.getCqkc() + data.getCqkc());
            // 期末库存
            sum.setQmkc(sum.getQmkc() + data.getQmkc());
            sum.setInNum(sum.getInNum() + data.getInNum());
            sum.setOutNum(sum.getOutNum() + data.getOutNum());
            sum.setInSum(sum.getInSum() + data.getInSum());
            sum.setOutSum(sum.getOutSum() + data.getOutSum());
            sum.setLossNum(sum.getLossNum() + data.getLossNum());
            sum.setOverNum(sum.getOverNum() + data.getOverNum());
         }
      }
      datas.add(sum);
                // 初期库存
                sum.setCqkc(sum.getCqkc() + data.getCqkc());
                // 期末库存
                sum.setQmkc(sum.getQmkc() + data.getQmkc());
                sum.setInNum(sum.getInNum() + data.getInNum());
                sum.setOutNum(sum.getOutNum() + data.getOutNum());
                sum.setInSum(sum.getInSum() + data.getInSum());
                sum.setOutSum(sum.getOutSum() + data.getOutSum());
                sum.setLossNum(sum.getLossNum() + data.getLossNum());
                sum.setOverNum(sum.getOverNum() + data.getOverNum());
            }
        }
        datas.add(sum);
      return datas;
   }
        return datas;
    }
   public List<ReportInoutShipData> listShipDetail(Map<String, Object> parameter) {
    public List<ReportInoutShipData> listShipDetail(Map<String, Object> parameter) {
      // 时间条件必须
      Date start = (Date) parameter.get("start");
      Date end = (Date) parameter.get("end");
      if (start == null || end == null){
         return null;
      }
        // 时间条件必须
        Date start = (Date) parameter.get("start");
        Date end = (Date) parameter.get("end");
        if (start == null || end == null) {
            return null;
        }
      StringBuffer sql = new StringBuffer();
      sql.append("SELECT ");
      sql.append("ID_, ");
      sql.append("PLATE_NUM_, ");
      sql.append("CUSTOMER_ID_, ");
      sql.append("CUSTOMER_NAME_, ");
      sql.append("FOOD_VARIETY_, ");
      sql.append("DEPOT_ID_, ");
      sql.append("TYPE_, ");
      sql.append("PROGRESS_, ");
      sql.append("FULL_WEIGHT_, ");
      sql.append("EMPTY_WEIGHT_, ");
      sql.append("NET_WEIGHT_, ");
      sql.append("DE_SUM_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record ");
      sql.append("WHERE ");
      sql.append("TRANS_TYPE_ =:transType ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND RECORD_STATUS_ <> :recordStatusError ");
      sql.append("AND TYPE_ <> :typeNone ");
      sql.append("AND TYPE_ <> :typeLoss ");
      sql.append("AND TYPE_ <> :typeOver ");
      sql.append("AND COMPANY_ID_ =:companyId ");
      sql.append("AND REGISTER_TIME_ >= :start ");
      sql.append("AND REGISTER_TIME_ <= :end ");
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT ");
        sql.append("ID_, ");
        sql.append("PLATE_NUM_, ");
        sql.append("CUSTOMER_ID_, ");
        sql.append("CUSTOMER_NAME_, ");
        sql.append("FOOD_VARIETY_, ");
        sql.append("DEPOT_ID_, ");
        sql.append("TYPE_, ");
        sql.append("PROGRESS_, ");
        sql.append("FULL_WEIGHT_, ");
        sql.append("EMPTY_WEIGHT_, ");
        sql.append("NET_WEIGHT_, ");
        sql.append("DE_SUM_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record ");
        sql.append("WHERE ");
        sql.append("TRANS_TYPE_ =:transType ");
        sql.append("AND RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND TYPE_ <> :typeNone ");
        sql.append("AND TYPE_ <> :typeLoss ");
        sql.append("AND TYPE_ <> :typeOver ");
        sql.append("AND COMPANY_ID_ =:companyId ");
        sql.append("AND REGISTER_TIME_ >= :start ");
        sql.append("AND REGISTER_TIME_ <= :end ");
      Map<String, Object> args = new HashMap<>();
      args.put("transType", TransType.TYPE_3.getCode());
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("recordStatusError", InoutConstant.RECORD_STATUS_ERROR);
      args.put("typeNone", InoutConstant.TYPE_NONE);
      args.put("typeLoss", Constant.LOSS_OVER_LOSS);
      args.put("typeOver", Constant.LOSS_OVER_OVER);
      args.put("companyId", ContextUtil.getCompanyId());
      args.put("start", DateUtil.getCurZero(start));
      args.put("end", DateUtil.getNextZero(end));
        Map<String, Object> args = new HashMap<>();
        args.put("transType", TransType.TYPE_3.getCode());
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        args.put("typeNone", InoutConstant.TYPE_NONE);
        args.put("typeLoss", Constant.LOSS_OVER_LOSS);
        args.put("typeOver", Constant.LOSS_OVER_OVER);
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("start", DateUtil.getCurZero(start));
        args.put("end", DateUtil.getNextZero(end));
      String str = (String) parameter.get("deptId");
      if(StringUtils.isNotEmpty(str)){
         sql.append("AND DEPT_ID_ =:deptId ");
         args.put("deptId", str);
      }
      str = (String) parameter.get("type");
      if(StringUtils.isNotEmpty(str)){
         sql.append("AND TYPE_ =:type ");
         args.put("type", str);
      }
      str = (String) parameter.get("customerId");
      if(StringUtils.isNotEmpty(str)){
         sql.append("AND CUSTOMER_ID_ =:customerId ");
         args.put("customerId", str);
      }
      str = (String) parameter.get("plateNum");
      if(StringUtils.isNotEmpty(str)){
         sql.append("AND PLATE_NUM_ like:plateNum ");
         args.put("plateNum", "%" + str + "%");
      }
      sql.append("ORDER BY ID_ DESC ");
        String str = (String) parameter.get("deptId");
        if (StringUtils.isNotEmpty(str)) {
            sql.append("AND DEPT_ID_ =:deptId ");
            args.put("deptId", str);
        }
        str = (String) parameter.get("type");
        if (StringUtils.isNotEmpty(str)) {
            sql.append("AND TYPE_ =:type ");
            args.put("type", str);
        }
        str = (String) parameter.get("customerId");
        if (StringUtils.isNotEmpty(str)) {
            sql.append("AND CUSTOMER_ID_ =:customerId ");
            args.put("customerId", str);
        }
        str = (String) parameter.get("plateNum");
        if (StringUtils.isNotEmpty(str)) {
            sql.append("AND PLATE_NUM_ like:plateNum ");
            args.put("plateNum", "%" + str + "%");
        }
        sql.append("ORDER BY ID_ DESC ");
      log.debug("====执行SLQ,查询流水主表信息={},参数={}", sql.toString(),args);
        log.debug("====执行SLQ,查询流水主表信息={},参数={}", sql.toString(), args);
      List<ReportInoutShipData> list1 = this.getNamedParameterJdbcTemplate().query(sql.toString(), args, new ReportInoutShipRowMapper1());
        List<ReportInoutShipData> list1 = this.getNamedParameterJdbcTemplate().query(sql.toString(), args, new ReportInoutShipRowMapper1());
      if (null == list1 || list1.isEmpty()){
         return null;
      }
      String depotId = (String) parameter.get("depotId");
      String carNum = (String) parameter.get("carNum");
      List<ReportInoutShipData> list = new ArrayList<>();
      List<ReportInoutShipData> list2;
      int index = 1;
      //合计信息
      ReportInoutShipData hj = new ReportInoutShipData();
      hj.setId("合计");
      for (ReportInoutShipData shipData : list1) {
         list2 = this.listShipRecordItem(shipData.getId(), depotId, carNum);
         if(null == list2 || list2.isEmpty()){
            continue;
         }
         if(!InoutConstant.PROGRESS_RECORD.equals(shipData.getProgress())){
            //流程未完成,统计重量信息
            for (ReportInoutShipData shipItem : list2) {
               shipData.setFullWeight(shipData.getFullWeight() + shipItem.getFullWeight());
               shipData.setEmptyWeight(shipData.getEmptyWeight() + shipItem.getEmptyWeight());
               shipData.setNetWeight(shipData.getNetWeight() + shipItem.getNetWeight());
               shipData.setDeSum(shipData.getDeSum() + shipItem.getDeSum());
               shipData.setSettleWeight(shipData.getSettleWeight() + shipItem.getSettleWeight());
            }
         }
        if (null == list1 || list1.isEmpty()) {
            return null;
        }
        String depotId = (String) parameter.get("depotId");
        String carNum = (String) parameter.get("carNum");
        List<ReportInoutShipData> list = new ArrayList<>();
        List<ReportInoutShipData> list2;
        int index = 1;
        //合计信息
        ReportInoutShipData hj = new ReportInoutShipData();
        hj.setId("合计");
        for (ReportInoutShipData shipData : list1) {
            list2 = this.listShipRecordItem(shipData.getId(), depotId, carNum);
            if (null == list2 || list2.isEmpty()) {
                continue;
            }
            if (!InoutConstant.PROGRESS_RECORD.equals(shipData.getProgress())) {
                //流程未完成,统计重量信息
                for (ReportInoutShipData shipItem : list2) {
                    shipData.setFullWeight(shipData.getFullWeight() + shipItem.getFullWeight());
                    shipData.setEmptyWeight(shipData.getEmptyWeight() + shipItem.getEmptyWeight());
                    shipData.setNetWeight(shipData.getNetWeight() + shipItem.getNetWeight());
                    shipData.setDeSum(shipData.getDeSum() + shipItem.getDeSum());
                    shipData.setSettleWeight(shipData.getSettleWeight() + shipItem.getSettleWeight());
                }
            }
         list.addAll(list2);
         shipData.setIndex(index + "");
         list.add(shipData);
         index ++;
            list.addAll(list2);
            shipData.setIndex(index + "");
            list.add(shipData);
            index++;
         //统计合计信息
         hj.setFullWeight(hj.getFullWeight() + shipData.getFullWeight());
         hj.setEmptyWeight(hj.getEmptyWeight() + shipData.getEmptyWeight());
         hj.setNetWeight(hj.getNetWeight() + shipData.getNetWeight());
         hj.setDeSum(hj.getDeSum() + shipData.getDeSum());
         hj.setSettleWeight(hj.getSettleWeight() + shipData.getSettleWeight());
      }
      list.add(hj);
      return list;
   }
            //统计合计信息
            hj.setFullWeight(hj.getFullWeight() + shipData.getFullWeight());
            hj.setEmptyWeight(hj.getEmptyWeight() + shipData.getEmptyWeight());
            hj.setNetWeight(hj.getNetWeight() + shipData.getNetWeight());
            hj.setDeSum(hj.getDeSum() + shipData.getDeSum());
            hj.setSettleWeight(hj.getSettleWeight() + shipData.getSettleWeight());
        }
        list.add(hj);
        return list;
    }
   public List<ReportInoutShipData> listShipRecordItem(String recordId, String depotId, String carNum) {
    public List<ReportInoutShipData> listShipRecordItem(String recordId, String depotId, String carNum) {
      if (StringUtils.isEmpty(recordId)){
         return null;
      }
        if (StringUtils.isEmpty(recordId)) {
            return null;
        }
      StringBuffer sql = new StringBuffer();
      sql.append("SELECT ");
      sql.append("DEPOT_ID_, ");
      sql.append("CAR_NUM_, ");
      sql.append("CAR_NAME_, ");
      sql.append("TYPE_, ");
      sql.append("PROGRESS_, ");
      sql.append("FULL_WEIGHT_, ");
      sql.append("EMPTY_WEIGHT_, ");
      sql.append("NET_WEIGHT_, ");
      sql.append("DE_, ");
      sql.append("SETTLE_WEIGHT_, ");
      sql.append("CREATE_TIME_ AS COMPLETE_TIME_ ");
      sql.append("FROM ");
      sql.append("d_inout_record_item ");
      sql.append("WHERE RECORD_STATUS_ <> :recordStatusDel ");
      sql.append("AND PROGRESS_ =:progressRecord ");
      Map<String, Object> args = new HashMap<>();
      args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
      args.put("progressRecord", InoutConstant.PROGRESS_RECORD);
      if(StringUtils.isNotEmpty(recordId)){
         sql.append("AND RECORD_ID_ =:recordId ");
         args.put("recordId", recordId);
      }
      if(StringUtils.isNotEmpty(depotId)){
         sql.append("AND DEPOT_ID_ =:depotId ");
         args.put("depotId", depotId);
      }
      if(StringUtils.isNotEmpty(carNum)){
         sql.append("AND CAR_NUM_ like:carNum ");
         args.put("carNum", "%" + carNum + "%");
      }
      sql.append("ORDER BY CREATE_TIME_ ASC ");
      log.debug("====执行SLQ1={},参数={}", sql.toString(),args);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT ");
        sql.append("DEPOT_ID_, ");
        sql.append("CAR_NUM_, ");
        sql.append("CAR_NAME_, ");
        sql.append("TYPE_, ");
        sql.append("PROGRESS_, ");
        sql.append("FULL_WEIGHT_, ");
        sql.append("EMPTY_WEIGHT_, ");
        sql.append("NET_WEIGHT_, ");
        sql.append("DE_, ");
        sql.append("SETTLE_WEIGHT_, ");
        sql.append("CREATE_TIME_ AS COMPLETE_TIME_ ");
        sql.append("FROM ");
        sql.append("d_inout_record_item ");
        sql.append("WHERE RECORD_STATUS_ <> :recordStatusDel ");
        sql.append("AND PROGRESS_ =:progressRecord ");
        Map<String, Object> args = new HashMap<>();
        args.put("recordStatusDel", InoutConstant.RECORD_STATUS_DEL);
        args.put("progressRecord", InoutConstant.PROGRESS_RECORD);
        if (StringUtils.isNotEmpty(recordId)) {
            sql.append("AND RECORD_ID_ =:recordId ");
            args.put("recordId", recordId);
        }
        if (StringUtils.isNotEmpty(depotId)) {
            sql.append("AND DEPOT_ID_ =:depotId ");
            args.put("depotId", depotId);
        }
        if (StringUtils.isNotEmpty(carNum)) {
            sql.append("AND CAR_NUM_ like:carNum ");
            args.put("carNum", "%" + carNum + "%");
        }
        sql.append("ORDER BY CREATE_TIME_ ASC ");
        log.debug("====执行SLQ1={},参数={}", sql.toString(), args);
      List<ReportInoutShipData> data = this.getNamedParameterJdbcTemplate()
            .query(sql.toString(), args, new ReportInoutShipRowMapper2());
        List<ReportInoutShipData> data = this.getNamedParameterJdbcTemplate()
                .query(sql.toString(), args, new ReportInoutShipRowMapper2());
      return data;
   }
        return data;
    }
}