XSSFWorkbook Excel导出导入

【界面】:
在这里插入图片描述
在这里插入图片描述

【一些说明】:
在这里插入图片描述

【提示用户是否覆盖数据】:
//对于订单明细表,假如价格相关的一系列字段是NULL,则直接填入;如果已经有数据了,就提示给用户,是否覆盖掉原数据呢?YES—调后台接口给盖掉,NO—前台取消掉;
在这里插入图片描述

【可以限制用户导出的数据】:
在这里插入图片描述

【外协商】:

//后台会根据Excel中外协商的名字去数据库中查询,所以填写的外协商名字,必须得是之前录入数据库的。

【所有非空判断格式】:
在这里插入图片描述
//所有必填项目的非空校验都类似上图的格式;

【去数据库中检验的字段】:
在这里插入图片描述

【非法的数据格式】:
【交期】:
不填写,则不会检验,一旦填写之后,将采用easyExcel的检验格式;
在这里插入图片描述

【具体流程】:
【1】:query(查询)

  this.$ajax.post('oeOemCheck/queryOrderCheck', this.formData).then( )

后台接口
【前端对象】:
custId-----------
checkDate-----
【总结】:
将 checkDate 拆分成当天最初时间,和最末时间,一拆二查当天 。
custId用了好几次 。
custId + 2个日期 查到一个List 。

     @RequestMapping(value="/queryOrderCheck", method = RequestMethod.POST) 
     public ResultInfo queryOrderCheck(@RequestBody JSONObject data, HttpServletRequest request){
     
         JSONObject retObj = new JSONObject();
         
         Long custId = data.getLong("custId");
         if(custId == null)
             return ResultInfo.error("vmes.parameter.isNotNull", new String[] { "custId" });
         
         Date checkDate = data.getDate("checkDate");
         if(checkDate == null)
             return ResultInfo.error("vmes.parameter.isNotNull", new String[] { "checkDate" });
         
         CoOemCustomer coOemCustomer = coOemCustomerService.getByKey(custId);
         //co_oem_customer  外协商资料( 其主键是custId )
         //
         
         Date startTime = DateTime.getFirstDayOfMonth(checkDate);
         //checkDate所在月份的第一天,时间并不重置;
         
         Date endTime = DateTime.getLastDayOfMonth(checkDate);
         //checkDate所在月份的最后一天,时间并不重置;
         
         List<OeOemOrderDetail> oodList = oeOemOrderDetailService.oemOrderCheck(startTime, endTime, custId);
         //oe_oem_order_detail  外协订单明细表。
         
         //【分析】:根据两个时间,外协商ID 来查询出 OeOemOrderDetail 并组成一个集合。
         
         
         Double initMoney = coOemCustomer.getInitMoney();    //初始应付;
         Double payMoney = plOemPayService.getPayedMoney(custId);
         //获取供应商付款总金额;
         Double totalMoney = oeOemOrderDetailService.getTotalMoney(custId);
         //获取供应商总金额;
         
         retObj.put("oodList", oodList);         //根据2日期和外协商ID 查到的外协订单明细集合;
         retObj.put("initMoney", initMoney);     //初始应付金额;
         retObj.put("payMoney", payMoney);       //供应商付款总金额;
         retObj.put("totalMoney", totalMoney);   //供应商总金额;
         
         return ResultInfo.ok(retObj).addExclude(PrWorkPlan.class, "previewWorkPlan", "nextWorkPlan");
     }


【oemOrderCheck】:

     public List<OeOemOrderDetail> oemOrderCheck(Date startTime, Date endTime, Long custId) {StringBuffer hql = new StringBuffer();
 ​
         hql.append("select a  from OeOemOrderDetail a where a.curStatus >= ").append(OeOemOrderDetail.CUR_STATUS_SH);
     
      // [ 收回 , 送检 , 验收 , 返工 , 报废 ]
         
      /**
      * 已收回
      */
 //    public static Short CUR_STATUS_SH = 1;
 //   * 已送检
      */
  //   public static Short CUR_STATUS_SJ = 2;
     /**
      * 已验收
      */
 //public static Short CUR_STATUS_YS = 3;
     /**
      * 需返工
      */
    // public static Short CUR_STATUS_FG = 4;
     /**
      * 已报废
      */
   //  public static Short CUR_STATUS_BF = 5;if (startTime != null) {
             String start = DateTime.date2String(DateTime.getDateWithoutTime(startTime), true, true);
             //年月日时分秒全部设置为0;
             
             hql.append(" and a.factDeliveryDate >= '" + start + "'");
             
             //实际到货日期 >= start
         }if (endTime != null) {
             String end = DateTime.date2String(DateTime.getDateWithMaxTime(endTime), true, true);
             //当日最后一毫秒;
             
             hql.append(" and a.factDeliveryDate < '" + end + "'");
             
             //实际到货日期 < end
         }if (custId != null)
             hql.append(" and a.oeOemOrder.coOemCustomer.custId=").append(custId);//detail 下的外协订单 oeOemOrder( oe_oem_order )的 外协商 的 主键。
         
         
         hql.append(" order by a.oeOemOrder.ooDate asc ");
         //外协日期----按照外协日期来升序。Query<OeOemOrderDetail> query = this.getSession().createQuery(hql.toString(), OeOemOrderDetail.class);return query.list();
     }

【 getPayedMoney 】:

     public Double getPayedMoney(Long custId) {
         
         String hql="select sum(a.totalMoney) from PlOemPay a where a.coOemCustomer.custId = :custId ";
         
         Query<Double> query = this.getSession().createQuery(hql, Double.class);
         query.setParameter("custId", custId);
         
         return query.uniqueResult()==null ? 0d : query.uniqueResult();
     }

PlOemPay ( pl_oem_pay ) #外协付款;

sum(a.totalMoney) #对 付款金额 进行累加求和;

/**
* @Fields totalMoney : 付款金额
*/
@Column(name = “total_money”)
private Double totalMoney;
【总结】:
根据custID来查出该ID下的所有付款金额。
【 getTotalMoney 】:
public Double getTotalMoney(Long custId) {
// ifnull只适用于mysql
String hql = "select sum(ifnull(a.factMoney,0)+ifnull(a.taxMoney,0)) from OeOemOrderDetail a where a.oeOemOrder.coOemCustomer.custId = :custId ";

     Query<Double> query = this.getSession().createQuery(hql, Double.class);
     query.setParameter("custId", custId);

     return query.uniqueResult() == null ? 0d : query.uniqueResult();
 }

【 总结 】:

factMoney : 实际费用

taxMoney : 税金

【2】:editCheckageDate(对账)
【前端】:
this.$ajax.post(‘oeOemCheck/editCheckageDate’, {
oodIdList: this.oodIdList
}).then()…
【后台接口】:
@RequestMapping(value=“/editCheckageDate”, method = RequestMethod.POST)
public ResultInfo editCheckageDate(@RequestBody JSONObject data){

     Object oodIdListObj = data.get("oodIdList"); //拿出前端传过来的对象。
     
     List<Long> oodIdList = JSONArray.parseArray(oodIdListObj.toString(), Long.class);
     //将前端对象解析成一个  List<Long>  .
     
     if(oodIdList == null || oodIdList.size() == 0){
         return ResultInfo.error("vmes.parameter.isNotNull", new String[] { "oodIdList" });
     }
     oeOemOrderDetailService.editCheckageDate(oodIdList);
     
     return ResultInfo.ok();
 }

【 editCheckageDate 】:
public void editCheckageDate(List oodIdList) {
for (Long oodId : oodIdList) {
OeOemOrderDetail ood = oeOemOrderDetailDao.getByKey(oodId);
if (ood.getCheckageDate() == null) {
ood.setCheckageDate(new Date()); //重新去数据库设置上了日期;

             //不点击【对账】:这个字段好像一直都是 null
         }
     }
 }

【3】:exportExcel
exportExcel
【I.测试用】:
【1】:前端接口
if (data.oodList.length > 0) {
for(var i=0;i<this.oodList.length;i++){
this.oodId.push(data.oodList[i].oeOemOrder.ooCode) //把订单号全插入到 ooId数组,传给后台;
}
}

exportExcel() {
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …fileName: this.t(“design.helpOrder”, [this.mcode]),
data: { ooId: this.oodId },
});
},
【2】:ExcelModel类
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import java.util.Date;

/**

  • @author YGY
  • @version 1.0
  • @date 2022/7/7 10:41
    /
    public class OeOemOrderDetailExcelImport {

    /
    *
    • *******模具号
      /
      @ExcelProperty(index = 1)
      private String pjMoldMcode;

      /

    • *******球标号
      /
      @ExcelProperty(index = 2)
      private String dsPartMcode ;

      /

      物料名称
      /
      @ExcelProperty(index = 3)
      private String goodsName ;

      /

    • ******件数
      /
      @ExcelProperty(index = 4)
      private String quantity;

      /

      计价方式
      /
      @ExcelProperty(index = 5)
      private String priceType;

      /

    • *******计价数量
      /
      @ExcelProperty(index = 6)
      private String priceNum;

      /

      规格
      /
      @ExcelProperty(index = 7)
      private String goodsType;

      /

      材质
      /
      @ExcelProperty(index = 8)
      private String gcName;

      /

      加工要求
      /
      @ExcelProperty(index = 9)
      private String memo;

      /

    • *******单价(含税)
      /
      @ExcelProperty(index = 10)
      private String containsTax;

      /

      单价(未税)
      /
      @ExcelProperty(index = 11)
      private String noContainsTax;

      /

    • *******小计价格
      /
      @ExcelProperty(index = 12)
      private String minPrice;

      /

      交期
      /
      @ExcelProperty(index = 13)
      @DateTimeFormat(“yyyy/MM/dd”)
      private Date deliveryDate;


      /

      外协单号
      /
      private String ooCode;

      /

      外协日期
      /
      private String ooDate;

      /

      工序类型
      /
      private String processName;

      /

      *外协商
      */
      private String coOemCustomer;

      //【 下面是一堆不值钱的GETTER / SETTER方法 】:
      }
      【3】:后端接口
      @RequestMapping(value = “/excelReconciliation” , method = RequestMethod.POST)
      public void excelReconciliation(@RequestBody JSONObject data, HttpServletResponse response) throws IOException, BusinessException {
      List list= data.getJSONArray(“ooId”).toJavaList(String.class);
      HashSet hashSet=new HashSet(list);
      ArrayList arrayList=new ArrayList();

      hashSet.stream().forEach( e->{
      arrayList.add(e);
      }
      );

      Collections.sort(arrayList); // Integer , String 类型的可以不添加比较器直接进行比较~~~!!!

      // arrayList.stream().forEach(e->{
      // System.out.println( e );
      // });

      //将按照升序的List传下去:
      exportBomService.excelReconciliation(arrayList, response);
      }
      【4】:Service中的抽象方法
      //此接口勿要删除,导出测试数据用,否则手输逆天麻烦!!!
      void excelReconciliation(ArrayList ooId, HttpServletResponse response) throws IOException;
      【5】:Impl
      @Override
      public void excelReconciliation(ArrayList ooCode, HttpServletResponse response) throws IOException {
      response.setCharacterEncoding(“UTF-8”);
      response.setContentType(“application/vnd.ms-excel”);

      ArrayList longArrayList=new ArrayList<>();

      ooCode.stream().forEach(e->{
      Long detail = iOeOemOrderService.queryByooCode(e);
      longArrayList.add(detail);
      });

      List list=new ArrayList<>();
      longArrayList.stream().forEach(e->{
      list.addAll( iOeOemOrderDetailService.listOemOrderDetail( e ) );
      });

      response.addHeader(“Content-Disposition”,
      “attachment;filename=” + URLEncoder.encode(“GYY测试d????????????????” + “的BOM清单.xlsx”, “UTF-8”));

      XSSFWorkbook wb = new XSSFWorkbook();

      ExcelUtil eu = new ExcelUtil();
      File tmpF = eu.getCutomerLogo();

      if (list != null && list.size() > 0) {
      XSSFCellStyle titleStyle = ExcelUtil.twoRowTitleStyle(wb);
      XSSFCellStyle contextStyle = ExcelUtil.contextStyle(wb);
      Short fontSize14 = 14;
      XSSFCellStyle contextStyle14 = ExcelUtil.contextStyleFontSizeDiy(wb, fontSize14, false);
      XSSFCellStyle contextStyle14Cu = ExcelUtil.contextStyleFontSizeDiy(wb, fontSize14, true);
      XSSFCellStyle contextStyle14Red = ExcelUtil.contextStyleRedDiy(wb,fontSize14,false);
      XSSFCellStyle contextStyle14CuRed = ExcelUtil.contextStyleRedDiy(wb,fontSize14,true);
      XSSFCellStyle contextStyleOnlyYellow = ExcelUtil.contextTitleOnlyYellow(wb);
      XSSFCellStyle contextTitle = ExcelUtil.redContextTitle(wb);

      // 模具原材料清单
      XSSFSheet sheet1 = wb.createSheet(“《外协对账》格式模板”);
      writeExcelReconciliation(sheet1, titleStyle, contextTitle, contextStyle,
      contextStyle14, contextStyle14Cu, contextStyle14Red, contextStyle14CuRed,
      contextStyleOnlyYellow,tmpF, wb,list);
      }
      OutputStream outputStream = response.getOutputStream();
      wb.write(outputStream);
      outputStream.close();
      wb.close();
      }

      【6】:Excel精确到每一格
      private void writeExcelReconciliation(XSSFSheet sheet,
      XSSFCellStyle titleStyle, XSSFCellStyle contextTitle,
      XSSFCellStyle contextStyle, XSSFCellStyle contextStyle14,
      XSSFCellStyle contextStyle14Cu, XSSFCellStyle contextStyle14Red,
      XSSFCellStyle contextStyle14CuRed, XSSFCellStyle contextStyleOnlyYellow,
      File custLogoFile, XSSFWorkbook wb,List detailListlist)
      throws IOException {

      int newRow = 0;
      Row row = sheet.createRow(newRow);
      Cell cell = null;

      row.setHeight((short) 500);
      cell = row.createCell(newRow);
      cell.setCellValue(“委外加工订单”);
      cell.setCellStyle(titleStyle);


      newRow++;
      Row row2 = sheet.createRow(newRow);
      row2.setHeight((short) 400);

      newRow++;
      Row row3 = sheet.createRow(newRow);
      row3.setHeight((short) 400);

      newRow++;
      Row row4 = sheet.createRow(newRow);
      row4.setHeight((short) 400);

      newRow++;
      Row row5 = sheet.createRow(newRow);
      row4.setHeight((short) 400);

      newRow++;
      Row row6 = sheet.createRow(newRow);
      row4.setHeight((short) 400);

      newRow++;
      Row row7 = sheet.createRow(newRow);
      row4.setHeight((short) 400);

      CellRangeAddress region = new CellRangeAddress(0, 1, 0, 13);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row3.createCell(0);
      cell.setCellValue(“外协单号 :”);
      cell.setCellStyle(contextStyle14CuRed);
      region = new CellRangeAddress(2, 2, 0, 1);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row3.createCell(2);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(2, 2, 2, 8);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      // sheet.setColumnWidth(1, 17 * 256);


      cell = row3.createCell(9);
      cell.setCellValue(“外协日期 :”);
      cell.setCellStyle(contextStyle14Cu);
      region = new CellRangeAddress(2, 2, 9, 10);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);

      cell = row3.createCell(11);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(2, 2, 11, 13);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row4.createCell(0);
      cell.setCellValue(“工序类型 :”);
      cell.setCellStyle(contextStyle14Cu);
      region = new CellRangeAddress(3, 3, 0, 1);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row4.createCell(2);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(3, 3, 2, 8);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row4.createCell(9);
      cell.setCellValue(“外协商 :”);
      cell.setCellStyle(contextStyle14Cu);
      region = new CellRangeAddress(3, 3, 9, 10);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row4.createCell(11);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(3, 3, 11, 13);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(0);
      cell.setCellValue(“序号”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 0, 0);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(1);
      cell.setCellValue(“项目号(模具、\n检具或备件)”);
      cell.setCellStyle(contextStyle);
      cell.setCellStyle(contextTitle);
      region = new CellRangeAddress(4, 6, 1, 1);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(1, 19* 256);

      cell = row5.createCell(2);
      cell.setCellValue(“球标号”);
      cell.setCellStyle(contextStyle14Red);
      region = new CellRangeAddress(4, 6, 2, 2);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(2, 23 * 256);


      cell = row5.createCell(3);
      cell.setCellValue(“物料名称”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 3, 3);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(3, 23 * 256);


      cell = row5.createCell(4);
      cell.setCellValue(“件数”);
      cell.setCellStyle(contextStyle14Red);
      region = new CellRangeAddress(4, 6, 4, 4);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(5);
      cell.setCellValue(“计价方式(\n/重量/面积\n/工时/数量 )”);
      cell.setCellStyle(contextStyle);
      region = new CellRangeAddress(4, 6, 5, 5);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(5, 16 * 256);


      cell = row5.createCell(6);
      cell.setCellValue(“计价数量”);
      cell.setCellStyle(contextTitle);
      region = new CellRangeAddress(4, 6, 6, 6);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(7);
      cell.setCellValue(“规格”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 7, 7);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(7, 12* 256);

      cell = row5.createCell(8);
      cell.setCellValue(“材质”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 8, 8);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(9);
      cell.setCellValue(“加工要求”);
      cell.setCellStyle(contextStyle);
      region = new CellRangeAddress(4, 6, 9, 9);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);


      cell = row5.createCell(10);
      cell.setCellValue(“单价(含税)”);
      cell.setCellStyle(contextStyle14Red);
      region = new CellRangeAddress(4, 6, 10, 10);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(10, 17 * 256);


      cell = row5.createCell(11);
      cell.setCellValue(“单价(未税)”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 11, 11);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(11, 17 * 256);


      cell = row5.createCell(12);
      cell.setCellValue(“小计价格”);
      cell.setCellStyle(contextStyle14Red);
      region = new CellRangeAddress(4, 6, 12, 12);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(12, 18 * 256);

      cell = row5.createCell(13);
      cell.setCellValue(“交期”);
      cell.setCellStyle(contextStyle14);
      region = new CellRangeAddress(4, 6, 13, 13);
      sheet.addMergedRegion(region);
      ExcelUtil.regionCellBorder(region, sheet);
      sheet.setColumnWidth(13, 14 * 256);


      HashSet gongXuSet=new HashSet();

      int countt=1; //序号
      boolean flag=true;
      String onlyOneProcess = null;
      boolean ifQuan = false;
      //【此时遍历list】:
      for (OeOemOrderDetail o : detailListlist){
      //上来先判断外协类型
      if ( o.getOeOemOrder().getComeFrom()==1 ){
      ifQuan=true;
      }


      newRow++;
      Row newRoww = sheet.createRow(newRow);
      newRoww.setHeight((short) 400);
      cell = newRoww.createCell(0);
      cell.setCellValue(countt);
      countt++;

      cell = newRoww.createCell(1);
      cell.setCellValue(o.getPjMold().getMcode());

      cell = newRoww.createCell(2);
      cell.setCellValue(o.getPrWorkpiece().getDsPart().getMcode());

      cell = newRoww.createCell(3);
      cell.setCellValue(o.getPrWorkpiece().getDsPart().getCoGoods().getGoodsCode());

      cell = newRoww.createCell(4);
      cell.setCellValue( o.getQuantity() );

      cell = newRoww.createCell(5);
      cell.setCellValue( o.getPrWorkPlan().getCoProcess().getPriceTypeTitle() );

      cell = newRoww.createCell(7);
      cell.setCellValue( o.getPrWorkpiece().getDsPart().getCoGoods().getGoodsType() );

      cell = newRoww.createCell(8);
      cell.setCellValue(o.getPrWorkpiece().getDsPart().getCoGoods().getGoodsName());

      cell = newRoww.createCell(9);
      cell.setCellValue(o.getPrWorkpiece().getDsPart().getMemo());
      //加工要求



      cell = newRoww.createCell(13);
      cell.setCellValue( DateTime.date2String(o.getDeliveryDate(),false,false,“/”) );



      gongXuSet.add(o.getPrWorkPlan().getCoProcess().getPname());


      if (flag) {
      onlyOneProcess=o.getPrWorkPlan().getCoProcess().getPname();

      //在这里把其他的地方都给补充完整
      cell = row3.getCell(2);
      cell.setCellValue(o.getOeOemOrder().getOoCode());
      flag = false;

      cell = row3.getCell(11);
      cell.setCellValue(DateTime.date2String(o.getOeOemOrder().getOoDate(),true,true,“/”));



      cell = row4.getCell(11);
      cell.setCellValue(o.getOeOemOrder().getCoOemCustomer().getCustName());
      }
      }

      cell = row4.getCell(2);

      //SET自身具有去重特性,如果SET的长度大于1,多工序
      if (gongXuSet.size()>1){
      cell.setCellValue(“多工序”);
      }else {
      cell.setCellValue(onlyOneProcess);
      }

      if ( ifQuan ){
      cell.setCellValue(“全工序”);
      }


      newRow++;
      Row row12 = sheet.createRow(newRow);
      row12.setHeight((short) 400);
      cell = row12.createCell(0);
      cell.setCellValue(“合计”);
      cell.setCellStyle(contextStyleOnlyYellow);

      for (int i = 1; i <= 13 ; i++) {
      cell = row12.createCell(i);
      cell.setCellStyle(contextStyleOnlyYellow);
      }

      ExcelUtil.regionCellBorder(region, sheet);
      }

【II.导出空模板】:
【1】:前端接口
exportExcel() {
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …fileName: this.t(“design.helpOrder”, [this.mcode]),
});
}
【2】:ExcelModel类同上同上同上

【3】:后端接口
    @RequestMapping(value = "/nullExcelExport" , method = RequestMethod.POST)
    public void nullExcelExport(HttpServletResponse response) throws IOException, BusinessException {
        exportBomService.nullExcelExport( response);
    }
【4】:Service中的抽象方法
  void nullExcelExport(HttpServletResponse response) throws IOException;
【5】:Impl
    @Override
    public void nullExcelExport(HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel");

        response.addHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode("GYY测试d????????????????" + "的BOM清单.xlsx", "UTF-8"));

        XSSFWorkbook wb = new XSSFWorkbook();

        ExcelUtil eu = new ExcelUtil();
        File tmpF = eu.getCutomerLogo();

            XSSFCellStyle titleStyle = ExcelUtil.twoRowTitleStyle(wb);
            XSSFCellStyle contextStyle = ExcelUtil.contextStyle(wb);
            Short fontSize14 = 14;
            XSSFCellStyle contextStyle14 = ExcelUtil.contextStyleFontSizeDiy(wb, fontSize14, false);
            XSSFCellStyle contextStyle14Cu = ExcelUtil.contextStyleFontSizeDiy(wb, fontSize14, true);
            XSSFCellStyle contextStyle14Red = ExcelUtil.contextStyleRedDiy(wb,fontSize14,false);
            XSSFCellStyle contextStyle14CuRed = ExcelUtil.contextStyleRedDiy(wb,fontSize14,true);
            XSSFCellStyle contextStyleOnlyYellow = ExcelUtil.contextTitleOnlyYellow(wb);
            XSSFCellStyle contextTitle = ExcelUtil.redContextTitle(wb);

            // 模具原材料清单
            XSSFSheet sheet1 = wb.createSheet("《外协对账》格式模板");
            writeExcelReconciliation(sheet1, titleStyle, contextTitle, contextStyle,
                    contextStyle14, contextStyle14Cu, contextStyle14Red, contextStyle14CuRed,
                    contextStyleOnlyYellow,tmpF, wb);

        OutputStream outputStream = response.getOutputStream();
        wb.write(outputStream);
        outputStream.close();
        wb.close();
    }

【6】:Excel精确到每一格
     private void writeExcelReconciliation(XSSFSheet sheet,
                                           XSSFCellStyle titleStyle, XSSFCellStyle contextTitle,
                                           XSSFCellStyle contextStyle, XSSFCellStyle contextStyle14,
                                           XSSFCellStyle contextStyle14Cu, XSSFCellStyle contextStyle14Red,
                                           XSSFCellStyle contextStyle14CuRed, XSSFCellStyle contextStyleOnlyYellow,
                                           File custLogoFile, XSSFWorkbook wb)
             throws IOException {
 ​
         int newRow = 0;
         Row row = sheet.createRow(newRow);
         Cell cell = null;
 ​
         row.setHeight((short) 500);
         cell = row.createCell(newRow);
         cell.setCellValue("委外加工订单");
         cell.setCellStyle(titleStyle);
 ​
 ​
         newRow++;
         Row row2 = sheet.createRow(newRow);
         row2.setHeight((short) 400);
 ​
         newRow++;
         Row row3 = sheet.createRow(newRow);
         row3.setHeight((short) 400);
 ​
         newRow++;
         Row row4 = sheet.createRow(newRow);
         row4.setHeight((short) 400);
 ​
         newRow++;
         Row row5 = sheet.createRow(newRow);
         row4.setHeight((short) 400);
 ​
         newRow++;
         Row row6 = sheet.createRow(newRow);
         row4.setHeight((short) 400);
 ​
         newRow++;
         Row row7 = sheet.createRow(newRow);
         row4.setHeight((short) 400);
 ​
         CellRangeAddress region = new CellRangeAddress(0, 1, 0, 13);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row3.createCell(0);
         cell.setCellValue("外协单号 :");
         cell.setCellStyle(contextStyle14CuRed);
         region = new CellRangeAddress(2, 2, 0, 1);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row3.createCell(2);
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(2, 2, 2, 8);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row3.createCell(9);
         cell.setCellValue("外协日期 :");
         cell.setCellStyle(contextStyle14Cu);
         region = new CellRangeAddress(2, 2, 9, 10);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
         cell = row3.createCell(11);
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(2, 2, 11, 13);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row4.createCell(0);
         cell.setCellValue("工序类型 :");
         cell.setCellStyle(contextStyle14Cu);
         region = new CellRangeAddress(3, 3, 0, 1);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row4.createCell(2);
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(3, 3, 2, 8);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row4.createCell(9);
         cell.setCellValue("外协商 :");
         cell.setCellStyle(contextStyle14Cu);
         region = new CellRangeAddress(3, 3, 9, 10);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row4.createCell(11);
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(3, 3, 11, 13);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(0);
         cell.setCellValue("序号");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 0, 0);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(1);
         cell.setCellValue("项目号(模具、\n检具或备件)");
         cell.setCellStyle(contextStyle);
         cell.setCellStyle(contextTitle);
         region = new CellRangeAddress(4, 6, 1, 1);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(1, 19* 256);
 ​
         cell = row5.createCell(2);
         cell.setCellValue("球标号");
         cell.setCellStyle(contextStyle14Red);
         region = new CellRangeAddress(4, 6, 2, 2);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(2, 23 * 256);
 ​
 ​
         cell = row5.createCell(3);
         cell.setCellValue("物料名称");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 3, 3);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(3, 23 * 256);
 ​
 ​
         cell = row5.createCell(4);
         cell.setCellValue("件数");
         cell.setCellStyle(contextStyle14Red);
         region = new CellRangeAddress(4, 6, 4, 4);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(5);
         cell.setCellValue("计价方式(\n/重量/面积\n/工时/数量 )");
         cell.setCellStyle(contextStyle);
         region = new CellRangeAddress(4, 6, 5, 5);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(5, 16 * 256);
 ​
 ​
         cell = row5.createCell(6);
         cell.setCellValue("计价数量");
         cell.setCellStyle(contextTitle);
         region = new CellRangeAddress(4, 6, 6, 6);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(7);
         cell.setCellValue("规格");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 7, 7);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(7, 12* 256);
 ​
         cell = row5.createCell(8);
         cell.setCellValue("材质");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 8, 8);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(9);
         cell.setCellValue("加工要求");
         cell.setCellStyle(contextStyle);
         region = new CellRangeAddress(4, 6, 9, 9);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
 ​
 ​
         cell = row5.createCell(10);
         cell.setCellValue("单价(含税)");
         cell.setCellStyle(contextStyle14Red);
         region = new CellRangeAddress(4, 6, 10, 10);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(10, 17 * 256);
 ​
 ​
         cell = row5.createCell(11);
         cell.setCellValue("单价(未税)");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 11, 11);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(11, 17 * 256);
 ​
 ​
         cell = row5.createCell(12);
         cell.setCellValue("小计价格");
         cell.setCellStyle(contextStyle14Red);
         region = new CellRangeAddress(4, 6, 12, 12);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(12, 18 * 256);
 ​
         cell = row5.createCell(13);
         cell.setCellValue("交期");
         cell.setCellStyle(contextStyle14);
         region = new CellRangeAddress(4, 6, 13, 13);
         sheet.addMergedRegion(region);
         ExcelUtil.regionCellBorder(region, sheet);
         sheet.setColumnWidth(13, 14 * 256);
 ​
 ​
         for (int i = 1; i <=5 ; i++) {
             newRow++;
             Row newRoww = sheet.createRow(newRow);
             newRoww.setHeight((short) 400);
             cell = newRoww.createCell(0);
             cell.setCellValue(i);
         }
 ​
 ​
         newRow++;
         Row row12 = sheet.createRow(newRow);
         row12.setHeight((short) 400);
         cell = row12.createCell(0);
         cell.setCellValue("合计");
         cell.setCellStyle(contextStyleOnlyYellow);
 ​
         for (int i = 1; i <= 13 ; i++) {
             cell = row12.createCell(i);
             cell.setCellStyle(contextStyleOnlyYellow);
         }
 ​
         ExcelUtil.regionCellBorder(region, sheet);
     }
 ​


【4】:importHandle
:http-request="importHandle"
【1】:前端接口
    importHandle(item) {
      const fileObj = item.file;

      // 获取文件名称
      const fileNameArr = fileObj.name.split('.');
      if (
        fileNameArr[fileNameArr.length - 1] !== 'xlsx' &&
        fileNameArr[fileNameArr.length - 1] !== 'xls'
      ) {
        return this.$message.error('请导入excel文件!');
      }

      // 通过FormData将文件转成二进制数据
      const formData = new FormData();
      formData.append('file', fileObj);

      // 上传文件之前的钩子
      this.dataListLoading = true;

      this.$ajax
        .post('bom/helpOrderExcelImport',formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        })
        .then(res => {
          if (res.code !== 0) {
            this.dataListLoading = false;
            // this.$message.error('导入失败' + res.message);
            this.$refs.upload.clearFiles();
          } else {
            this.dataListLoading = false;
            this.$message.success('导入成功');
            item.onSuccess();
            // this.queryTree();  //原先craftTree文件里自己写的一个函数~ ~ ~ ! ! !
          }
        })
        .catch(() => {
          // 文件上传成功时的钩子
          this.dataListLoading = false;
        });
    }
【2】:后端接口
     @ApiOperation(value = "外协对账excel导入")
     @RequestMapping(value = "/helpOrderExcelImport", method = RequestMethod.POST)
     public ResultInfo helpOrderExcelImport( @ApiIgnore @RequestParam("file") MultipartFile uploadFile, HttpServletRequest request) throws Exception {
         PfUserInfo pfUserInfo = (PfUserInfo) ControllerUtils.getCurUserInfo(request);
 ​
         InputStream inputStream = null;
         inputStream = uploadFile.getInputStream();  //#################获取用户上传的文件;
 ​
         //获取数据
         List<OeOemOrderDetailExcelImport> list = EasyExcel.read(inputStream)
                 .registerConverter(new DoubleConverter())
                 .registerReadListener(new EventListener())
                 .head(OeOemOrderDetailExcelImport.class)
                 .sheet()
                 .headRowNumber(7)    //从 ( n+1 ) 行开始读取;
                 .doReadSync();
 ​
         //EasyExcel会自动关闭IO流。
 ​
         oeOemOrderDetailService.insertInfo(list ,uploadFile, pfUserInfo);
 ​
         return ResultInfo.ok();
     }
【3】:insertInfo
接口
 void insertInfo(List<OeOemOrderDetailExcelImport> list, MultipartFile uploadFile, PfUserInfo pfUserInfo) throws Exception;
具体实现
     @Override
     public void insertInfo(List<OeOemOrderDetailExcelImport> list, MultipartFile uploadFile,PfUserInfo pfUserInfo) throws Exception{
         OeOemOrderDetailExcelImport oeOemOrderDetailExcelImport = null;
 ​
         InputStream gyystream=uploadFile.getInputStream();
 ​
         XSSFWorkbook wb = new XSSFWorkbook(gyystream);
         XSSFSheet sheet = wb.getSheetAt(0);
 ​
         Row row2=sheet.getRow(2);
         Row row3=sheet.getRow(3);
 ​
         //【1】:外协单号
         Cell cell = row2.getCell(2);
         String cell11=cell.getStringCellValue();
 ​
         if (StringUtils.isBlank( cell11 )) {
             throw new BusinessException("请填写外协单号!!!");
         }
 ​
 ​
         //【2】:外协日期
         cell = row2.getCell(11);
         cell.setCellType(CellType.STRING);
         String cell12 = cell.getStringCellValue();
 ​
         //【3】:工序类型
         cell = row3.getCell(2);
         String cell21 = cell.getStringCellValue();
 ​
         //【4】:外协商
         cell = row3.getCell(11);
         String cell22 = cell.getStringCellValue();
 ​
 ​
         gyystream.close();  //关闭IO流,减少与内核交互。
 ​
 ​
         list.remove(list.size()-1);   //必须拿掉最后一行标注的全都是黄色的那一行!!!
 ​
 ​
         //首先看一下有多少条数据重复,有重复数据应当告知用户,防止用户多次导入一张表!!!
         // 【将三个序号作为唯一标识~~~!!!】:
         //首先告知用户的修改成本;
 ​
         String message="";
         int numAllRepeat=0;
         for (int i = 0; i <list.size() ; i++) {
             oeOemOrderDetailExcelImport = list.get(i);
             String pjMoldMcode = oeOemOrderDetailExcelImport.getPjMoldMcode();  //模具号(**必填**)
             String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();  //球标号(**必填**)
             //  if ( 记录是重复的----三号作为唯一标识~ ~ ~ ){
             if ( oeOemOrderDetailDao.ifThreeIdRepeat(cell11,pjMoldMcode,dsPartMcode)){
                 numAllRepeat++;
             }
         }
 ​
         if (numAllRepeat>0){
             message=(" , 本次导入共有 【 " + ( numAllRepeat ) + " 】 条数据重复。");
         }
 ​
 ​
         int count=0;
         //【未填写检验】 : ----这个for循环只起检验必填项作用,不进行存储!!!
         for (int i = 0; i <list.size() ; i++) {
             count++;  //计数器得放在外面标记行数
             OeOemOrderDetail oeOemOrderDetail = new OeOemOrderDetail();
             oeOemOrderDetailExcelImport = list.get(i);
 ​
 ​
             String pjMoldMcode = oeOemOrderDetailExcelImport.getPjMoldMcode();  //模具号(**必填**)
             if (StringUtils.isBlank( pjMoldMcode )) {
                 throw new BusinessException("第【"+(count+7)+"】行 B 列的项目号(模具号)未填,请填写该数据。 ");
             }
 ​
 ​
             String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();  //球标号(**必填**)
             if (StringUtils.isBlank( dsPartMcode )) {
                 throw new BusinessException("第【"+(count+7)+"】行 C 列的球标号未填,请填写该数据。 ");
             }
 ​
 ​
             // if ( 记录是重复的----三号作为唯一标识~ ~ ~ ){
             if ( oeOemOrderDetailDao.ifThreeIdRepeat(cell11,pjMoldMcode,dsPartMcode)){
                 throw new BusinessException("第【"+(count+7)+"】行已经录入过数据库了,请核对数据 "+message);
             }
 ​
 ​
             String quantity=oeOemOrderDetailExcelImport.getQuantity();
             if (StringUtils.isBlank( quantity )) {
                 throw new BusinessException("第【"+(count+7)+"】行 E 列的件数未填,请填写该数据。 ");
             }
 ​
             //【计价数量】:
             String priceNum=oeOemOrderDetailExcelImport.getPriceNum();
             if (StringUtils.isBlank( priceNum )) {
                 throw new BusinessException("第【"+(count+7)+"】行 G 列的计价数量未填,请填写该数据。 ");
             }
 ​
             //【单价(含税)】:
             String containsTax = oeOemOrderDetailExcelImport.getContainsTax();
             if (StringUtils.isBlank( containsTax )) {
                 throw new BusinessException("第【"+(count+7)+"】行 K 列的单价(含税)未填,请填写该数据。 ");
             }
 ​
             //【小计价格】:
             String minPrice = oeOemOrderDetailExcelImport.getMinPrice();
             if (StringUtils.isBlank( minPrice )) {
                 throw new BusinessException("第【"+(count+7)+"】行 M 列的小计价格未填,请填写该数据。 ");
             }
         }
         
 ​
         //【进行拦截操作!!!】 :- - - - 如果存在重复导入的情况,必须得告知用户!!!
         //得让用户先修改掉重复的信息才能进行导入~~~!!!
         //如果数据出现错误,是不会出现重复导入的情况的!!!
 ​
 ​
         List<OeOemOrderDetail > orderDetailList =new ArrayList<>();
         int numCount=0;
         if (StringUtils.isNotBlank( cell11 )) {
             //然后再进行插入操作
             for (int i = 0; i < list.size(); i++) {
                 //单独写的一个保存方法。
                 numCount++;
 ​
                 this.checkHelpOrder(list.get(i), cell11, cell12, cell21, cell22,numCount,orderDetailList);
             }
 ​
             this.saveHelpOrder(orderDetailList);
         }
     }
【4】:checkHelpOrder
到数据库中进行检验,是否重复;
     //进行检验;
     public void checkHelpOrder(OeOemOrderDetailExcelImport oeOemOrderDetailExcelImport
             ,String oneCell,String twoCell,String threeCell,String fourCell,Integer count,List<OeOemOrderDetail> orderDetailList) throws Exception {
 ​
         OeOemOrderDetail oeOemOrderDetail = new OeOemOrderDetail();
 ​
         //(一)【外协单号】:
         String orderCode = oneCell;
 ​
         if (StringUtils.isNotBlank(orderCode)){
             OeOemOrder oeOemOrder = iOeOemOrderService.queryByooooCode(orderCode);
 ​
             if ( oeOemOrder == null ){
                 throw new BusinessException("外协单号在数据库中不存在。 ");
             }
 ​
             oeOemOrderDetail.setOeOemOrder( oeOemOrder );
         }
 ​
         //(1)【项目号】:
         String pjMoldmcode = oeOemOrderDetailExcelImport.getPjMoldMcode();
         PjMold pjMold=null;
         if ( StringUtils.isNotBlank( pjMoldmcode ) ){
             //进行存储;
             pjMold = pjMoldService.getByMcode(pjMoldmcode);
             if ( pjMold==null ){
                 throw new BusinessException("第"+(count+7)+"行B列的项目号(模具号)在数据库中不存在。 ");
             }
         }
         if (pjMold!=null){
             oeOemOrderDetail.setPjMold(pjMold);
         }
 ​
 ​
         //(2)【球标号】:
         String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();
         DsPart dsPart=null;
         if ( StringUtils.isNotBlank( dsPartMcode ) ){
             //进行存储;
 ​
             dsPart=dsPartService.getByPartsCode(dsPartMcode);
 ​
             if (dsPart==null){
                 throw new BusinessException("第"+(count+7)+"行C列的球标号在数据库中不存在。 ");
             }
             //能运行到这一行说明在数据库中找到了~~~!!!
             PrWorkpiece prWorkpiece=prWorkpieceService.getByPartId(dsPart.getPartId());
 ​
             if (prWorkpiece == null){
                 throw new BusinessException("第"+(count+7)+"行C列的球标号无对应的工件信息。 ");
             }
 ​
             oeOemOrderDetail.setPrWorkpiece(prWorkpiece);
             oeOemOrderDetail.getPrWorkpiece().setDsPart(dsPart);
         }
 ​
 ​
         //(二)【外协日期】:----Date
         Date ooDate=null;
         if ( StringUtils.isNotBlank(twoCell) ){
             try {
                  ooDate=DateTime.parse( ExcelUtils.excelStr2NormString( twoCell ) );
 ​
             } catch (Exception e) {
                 throw new BusinessException("第【3】行 L 列的外协日期格式有误,请修改该数据的格式。 ");
             }
         }
         if (ooDate!=null){
             oeOemOrderDetail.getOeOemOrder().setOoDate( ooDate );
         }
 ​
 ​
         //(三)【工序类型】:
         if ( StringUtils.isNotBlank( threeCell ) ){
             if ( !"全工序".equals(threeCell) && !"多工序".equals(threeCell)){
                 oeOemOrderDetail.getPjMold().setPcode( threeCell );
             }
         }
 ​
 ​
         //(四)【外协商】:
         if ( StringUtils.isNotBlank( fourCell ) ){
             //首先需要根据外协商来进行查找
             CoOemCustomer customer = coOemCustomerService.queryByCustomerName(fourCell);
 ​
             if ( customer == null ){
                 throw new BusinessException("外协商 在数据库中不存在,请检查该项数据。 ");
             }
 ​
             if (customer!=null){
                 oeOemOrderDetail.getOeOemOrder().setCoOemCustomer(customer);
             }
         }
 ​
 ​
         //(3)【物料名称】:
         String goodsName = oeOemOrderDetailExcelImport.getGoodsName();
         if ( StringUtils.isNotBlank( goodsName ) ){
             //进行存储;
             oeOemOrderDetail.getPrWorkpiece().getDsPart().getCoGoods().setGoodsName( goodsName );
         }
 ​
 ​
         //(4)【件数】:
         String quantityStr = oeOemOrderDetailExcelImport.getQuantity();
         Double quantity = null;
         try {
             quantity = Double.valueOf( quantityStr );
         } catch (NumberFormatException e) {
             throw new BusinessException(" 第"+(count+7)+"行, E列件数的数字格式有误!!! ");
         }
         if ( quantity!=null ){
             //对qqquantity 进行存储————存储到数据库里;
             oeOemOrderDetail.setQuantity( quantity );
         }
 ​
 ​
         //(5)【计价方式】:
         String priceTypeStr=oeOemOrderDetailExcelImport.getPriceType();
         if (StringUtils.isNotBlank( priceTypeStr )){
             //进行存储;
 ​
 //            需要进行一下转换 ===》 该字段是设置数字的,而用户传过来的是文字~ ~ ~
 //            oeOemOrderDetail.getPrWorkPlan().getCoProcess().setPriceType();
         }
 ​
 ​
         //(6)【计价数量】:
         String priceNum = oeOemOrderDetailExcelImport.getPriceNum();
         Double priceNumCount = null;
         try {
             priceNumCount = Double.valueOf( priceNum );
         } catch (NumberFormatException e) {
             throw new BusinessException(" 第"+(count+7)+"行, G列 计价数量 的数字格式有误!!! ");
         }
         if ( priceNumCount!=null ){
             //priceNumCount 进行存储————存储到数据库里;
             oeOemOrderDetail.setCalculateNum( priceNumCount );
         }
 ​
 ​
         //(7)【规格】:
         String goodsType = oeOemOrderDetailExcelImport.getGoodsType();
         if (StringUtils.isNotBlank( goodsType )){
             //进行存储;
             oeOemOrderDetail.getPrWorkpiece().getDsPart().getCoGoods().setGoodsType( goodsType );
         }
 ​
 ​
         //(8)【材质】:
         String gcName = oeOemOrderDetailExcelImport.getGcName();
         if (StringUtils.isNotBlank( gcName )){
             //进行存储;
             oeOemOrderDetail.getPrWorkpiece().getDsPart().getCoGoods().getCoGoodsClass().setGcName(gcName);
 ​
         }
 ​
 ​
         //(9)【加工要求】:
         String memo = oeOemOrderDetailExcelImport.getMemo();
         if (StringUtils.isNotBlank( memo )){
             //进行存储;
             oeOemOrderDetail.getPrWorkpiece().getDsPart().setMemo( memo );
         }
 ​
 ​
         //(10)【单价(含税)】:
         String containsTaxStr = oeOemOrderDetailExcelImport.getContainsTax();
         Double containsTax = null;
         try {
             containsTax= Double.valueOf(containsTaxStr);
         } catch (NumberFormatException e) {
             throw new BusinessException(" 第"+(count+7)+"行, K列 单价(含税) 的数字格式有误!!! ");
         }
         if ( containsTax!=null ){
             //containsTax 进行存储————存储到数据库里;
             oeOemOrderDetail.setTaxPrice( containsTax );
         }
 ​
 ​
         //(11)【单价(未税)】:
         String noContainsTaxStr = oeOemOrderDetailExcelImport.getNoContainsTax();
         Double noContainsTax = null;
 ​
         if (StringUtils.isNotBlank( noContainsTaxStr )){
 ​
             try {
                 noContainsTax=Double.valueOf( noContainsTaxStr );
             } catch (NumberFormatException e) {
                 throw new BusinessException(" 第"+(count+7)+"行, L列 单价(未税) 的数字格式有误!!! ");
             }
             if ( noContainsTax!=null ){
                 //noContainsTax 进行存储————存储到数据库里;
                 oeOemOrderDetail.setNotaxPrice( noContainsTax );
             }
         }
 ​
         //(12)【小计价格】:
         String minPriceStr = oeOemOrderDetailExcelImport.getMinPrice();
         Double minPrice = null;
         if ( StringUtils.isNotBlank(minPriceStr) ){
             try {
                 minPrice=Double.valueOf( minPriceStr );
             } catch (NumberFormatException e) {
                 throw new BusinessException(" 第"+(count+7)+"行, K列 单价(含税) 的数字格式有误!!! ");
             }
         }
         if ( minPrice!=null ){
             //minPrice 进行存储————存储到数据库里;
             oeOemOrderDetail.setSubtotalPrice( minPrice );
         }
 ​
 ​
         //(13)【交期】:
         Date deliveryDate=oeOemOrderDetailExcelImport.getDeliveryDate();
         //如果用户未填写的话,这一个格子会装上null
         if ( deliveryDate!=null ){
             //不空且数据格式正确,才能够进行存储;
             oeOemOrderDetail.setDeliveryDate( deliveryDate );
         }
 ​
         orderDetailList.add(oeOemOrderDetail);
         //先把ExcelModel类中的数据过一遍,确保全部没问题;---> 再一口气进行存储!!!
     }
【5】:saveHelpOrder
保存到数据库中;
     //进行存储;
     public void saveHelpOrder(List<OeOemOrderDetail> orderDetailList) throws Exception {
         orderDetailList.stream().forEach(e->{
             try {
                 this.save(e);          //框架自带的保存方法;
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
         });
     }

【最终版】:
【导入功能】:
【1】:前端接口
  importHandle(item) {
       this.fileData = item;
       const fileObj = item.file;
 ​
       // 获取文件名称
       const fileNameArr = fileObj.name.split(".");
       if (
         fileNameArr[fileNameArr.length - 1] !== "xlsx" &&
         fileNameArr[fileNameArr.length - 1] !== "xls"
       ) {
         return this.$message.error("请导入excel文件!");
       }
 ​
       // 通过FormData将文件转成二进制数据
       const formData = new FormData();
       formData.append("file", fileObj);
 ​
       const houtai = {
         excel: formData,
         flag: true,
       };
 ​
       // 上传文件之前的钩子
       this.dataListLoading = true;
 ​
       // formData
 ​
       this.$ajax
         .post("bom/helpOrderExcelImport", formData, {
           headers: {
             "Content-Type": "multipart/form-data",
           },
         })
         .then((res) => {
           // if( res.code == 0 ){
 ​
           if (res.data && res.data.ifDialog) {
             const rowMessage = res.data.dialogMessage;
 ​
             this.$confirm(
               "数据库中之前存在数据 , 是否覆盖 ? Excel产生覆盖的行数为 :" +
                 rowMessage,
               "提示",
               {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
                 type: "warning",
               }
             )
               .then(() => {
                     this.$ajax.post("bom/helpOrderExcelImport22", formData, {
                       headers: {
                         "Content-Type": "multipart/form-data",
                       },
                     });
 ​
                 this.$message({
                   type: "success",
                   message: "覆盖成功!",
                 });
                 // this.importHandle(this.fileData)
               })
               .catch(() => {
                 //删除
 ​
                 this.$message({
                   type: "info",
                   message: "已取消插入",
                 });
               });
 ​
             return;
           }
 ​
           if (res.code !== 0) {
             this.dataListLoading = false;
             // this.$message.error('导入失败' + res.message);
             this.$refs.upload.clearFiles();
           } else {
             this.dataListLoading = false;
             this.$message.success("导入成功");
             item.onSuccess();
             // this.queryTree();  //原先craftTree文件里自己写的一个函数~ ~ ~ ! ! !
           }
         })
         .catch(() => {
           // 文件上传成功时的钩子
           this.dataListLoading = false;
         });
     },
【2】:(后端接口一) helpOrderExcelImport
    @ApiOperation(value = "外协对账excel导入")
     @RequestMapping(value = "/helpOrderExcelImport", method = RequestMethod.POST)
 public ResultInfo helpOrderExcelImport(@ApiIgnore @RequestParam("file") MultipartFile uploadFile, HttpServletRequest request) throws Exception {
         PfUserInfo pfUserInfo = (PfUserInfo) ControllerUtils.getCurUserInfo(request);
 ​
         InputStream inputStream = null;
         inputStream = uploadFile.getInputStream();
 ​
         //获取数据
         List<OeOemOrderDetailExcelImport> list = EasyExcel.read(inputStream)
                 .registerConverter(new DoubleConverter())
                 .registerReadListener(new EventListener())
                 .head(OeOemOrderDetailExcelImport.class)
                 .sheet()
                 .headRowNumber(7)    //从 ( n+1 ) 行开始读取;
                 .doReadSync();
 ​
         //EasyExcel会自动关闭IO流。
 ​
         OeOemOrderDetailDto dto = oeOemOrderDetailService.checkInfo(list ,uploadFile, pfUserInfo,1);
 ​
         JSONObject object=new JSONObject();
         if (dto.getIfCheck()){       //------------dto的一个开关 ==> 要到前台提示用户 ~ ~ ~
             object.put("ifDialog",true);
             object.put("dialogMessage",dto.getMessageHashmap().get(2));   //EXCEL 中哪些行导致的数据覆盖,提示给用户~~~
             return ResultInfo.ok( object );
         }
 ​
         //【程序运行到这里】:说明通过了检验关卡,可以全部将数据导入数据库,无须提示用户;
         //下面将数据直接插入数据库即可~~~
 ​
         List<OeOemOrderDetailExcelDto> excelDtoList = dto.getDetailDtoList( );
 ​
         if (excelDtoList!=null && excelDtoList.size()>0){
             oeOemOrderDetailService.insertInfo( dto );
         }
 ​
         object.put("ifDialog",false);  //不让用户做选择题了 ~ ~ ~
 ​
         return ResultInfo.ok( object );
     }
【3】:(后端接口二) helpOrderExcelImport22
     @ApiOperation(value = "外协对账excel导入第二次")
     @RequestMapping(value = "/helpOrderExcelImport22", method = RequestMethod.POST)
     public ResultInfo helpOrderExcelImport22( @ApiIgnore @RequestParam("file") MultipartFile uploadFile, HttpServletRequest request) throws Exception {
         PfUserInfo pfUserInfo = (PfUserInfo) ControllerUtils.getCurUserInfo(request);
         InputStream inputStream = null;
         inputStream = uploadFile.getInputStream();
 ​
         //获取数据
         List<OeOemOrderDetailExcelImport> list = EasyExcel.read(inputStream)
                 .registerConverter(new DoubleConverter())
                 .registerReadListener(new EventListener())
                 .head(OeOemOrderDetailExcelImport.class)
                 .sheet()
                 .headRowNumber(7)    //从 ( n+1 ) 行开始读取;
                 .doReadSync();
 ​
         OeOemOrderDetailDto dto = oeOemOrderDetailService.checkInfo(list ,uploadFile, pfUserInfo,2);
 ​
 ​
         JSONObject object=new JSONObject();
         object.put("ifDialog",false);
 ​
         //【程序运行到这里】:说明 ---> 要直接覆盖掉!!!!!!
         //【程序运行到这里】:说明 ---> 要直接覆盖掉!!!!!!
         //【程序运行到这里】:说明 ---> 要直接覆盖掉!!!!!!
         List<OeOemOrderDetailExcelDto> excelDtoList = dto.getDetailDtoList( );
 ​
         if (excelDtoList!=null && excelDtoList.size()>0){
             oeOemOrderDetailService.insertInfo( dto );
         }
 ​
         object.put("ifDialog",false);  //不让用户做选择题了 ~ ~ ~
 ​
         return ResultInfo.ok( object );
     }
【4】:checkInfo
     @Override
     public OeOemOrderDetailDto checkInfo(List<OeOemOrderDetailExcelImport> list, MultipartFile uploadFile, PfUserInfo pfUserInfo, Integer integer) throws Exception {
         OeOemOrderDetailDto dto = new OeOemOrderDetailDto();
         dto.setPfUserInfo(pfUserInfo);
         dto.setExcelList(list);
 ​
         OeOemOrderDetailExcelImport oeOemOrderDetailExcelImport = null;
 ​
         String cell11 = null;
         String cell12 = null;
         String cell21 = null;
         String cell22 = null;
 ​
         InputStream excelStream = uploadFile.getInputStream();
 ​
         XSSFWorkbook wb = new XSSFWorkbook(excelStream);        //BOOK需要用stream流来构建!!!
         XSSFSheet sheet = wb.getSheetAt(0);
 ​
         Row row2 = sheet.getRow(2);
         Row row3 = sheet.getRow(3);
 ​
         //【1】:外协单号
         Cell cell = row2.getCell(2);
         cell11 = cell.getStringCellValue();
 ​
         if (integer == 1) {
             if (StringUtils.isBlank(cell11)) {
                 throw new BusinessException("请填写外协单号!!!");
             }
         }
         //【2】:外协日期
         cell = row2.getCell(11);
         cell.setCellType(CellType.STRING);
         cell12 = cell.getStringCellValue();
 ​
         //【3】:工序类型
         cell = row3.getCell(2);
         cell21 = cell.getStringCellValue();
 ​
         //【4】:外协商
         cell = row3.getCell(11);
         cell22 = cell.getStringCellValue();
 ​
         excelStream.close();  //关闭IO流,减少与内核交互。
 ​
         list.remove(list.size() - 1);   //必须拿掉最后一行标注的全都是黄色的那一行!!!
 ​
         HashSet<String> partCodeSet = new HashSet<>();
 ​
         int numAllRepeat = 0;
         for (int i = 0; i < list.size(); i++) {//List<OeOemOrderDetailExcelImport> list------遍历excel类
 ​
             oeOemOrderDetailExcelImport = list.get(i);
             //球标号(零件编码)不能够重复!!!
             String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();  //球标号(**必填**)
 ​
             partCodeSet.add(dsPartMcode);
 ​
             numAllRepeat++;
 ​
             if (integer == 1) {
                 if (partCodeSet.size() < numAllRepeat) {
                     throw new BusinessException("第【 " + (numAllRepeat + 7) + " 】行 C 列的球标号存在重复 ,请核对该数据。 ");
                 }
             }
             //【!!!球标号验重成功!!!】
         }
 ​
         int count = 0;
         for (int i = 0; i < list.size(); i++) {
             count++;  //计数器得放在外面标记行数
             OeOemOrderDetail oeOemOrderDetail = new OeOemOrderDetail();
             oeOemOrderDetailExcelImport = list.get(i);
 ​
 ​
             String pjMoldMcode = oeOemOrderDetailExcelImport.getPjMoldMcode();  //模具号(**必填**)
 ​
             if (integer == 1) {
                 if (StringUtils.isBlank(pjMoldMcode)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 B 列的项目号(模具号)未填,请填写该数据。 ");
                 }
             }
 ​
 ​
             String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();  //球标号(**必填**)
             if (integer == 1) {
                 if (StringUtils.isBlank(dsPartMcode)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 C 列的球标号未填,请填写该数据。 ");
                 }
             }
 ​
 ​
             String quantity = oeOemOrderDetailExcelImport.getQuantity();
             if (integer == 1) {
                 if (StringUtils.isBlank(quantity)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 E 列的件数未填,请填写该数据。 ");
                 }
             }
 ​
             //【计价数量】:
             String priceNum = oeOemOrderDetailExcelImport.getPriceNum();
             if (integer == 1) {
                 if (StringUtils.isBlank(priceNum)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 G 列的计价数量未填,请填写该数据。 ");
                 }
             }
 ​
             //【单价(含税)】:
             String containsTax = oeOemOrderDetailExcelImport.getContainsTax();
             if (integer == 1) {
                 if (StringUtils.isBlank(containsTax)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 K 列的单价(含税)未填,请填写该数据。 ");
                 }
             }
 ​
             //【小计价格】:
             String minPrice = oeOemOrderDetailExcelImport.getMinPrice();
             if (integer == 1) {
                 if (StringUtils.isBlank(minPrice)) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 M 列的小计价格未填,请填写该数据。 ");
                 }
             }
         }
 ​
         List<OeOemOrderDetailExcelDto> detailDtoList = new ArrayList<>();
         HashMap<Integer, String> stringHashMap = new HashMap<>();
         HashMap<String, List<OeOemOrderDetail>> dspartMap = new HashMap<>();
 ​
         int numCount = 0;
         //然后再进行插入操作
         for (int i = 0; i < list.size(); i++) {
             //单独写的一个保存方法。
             numCount++;
 ​
             stringHashMap = this.secondcheckHelpOrder(list.get(i), cell11, cell12, cell21, cell22, numCount, detailDtoList, integer, stringHashMap, dto, dspartMap);
         }
 ​
         if (stringHashMap.size() > 1) {
             dto.setIfCheck(true);
         }
         return dto;
     }
【  secondcheckHelpOrder  】:
     //进行检验;
     public HashMap<Integer, String> secondcheckHelpOrder(OeOemOrderDetailExcelImport oeOemOrderDetailExcelImport
             , String oneCell, String twoCell, String threeCell, String fourCell,
                                                          Integer count,                                 //EXCEL中第几条数据;
                                                          List<OeOemOrderDetailExcelDto> ddtoList,       //为插入方法作准备;
                                                          Integer integer,                               //第几次进入;
                                                          HashMap<Integer, String> strhashMap,           //给前台信息;
                                                          OeOemOrderDetailDto dto,
                                                          HashMap<String, List<OeOemOrderDetail>> dspartMap //为插入作准备
     ) throws Exception {
         //一旦出现重复的情况----返回true!!!!
 ​
         Long ooId = null;
         Long mid = null;
         Long wppId = null;
         PjMold pjMold = null;
         DsPart dsPart = null;
         PrWorkpiece prWorkpiece = null;
         Date ooDate = null;
         CoOemCustomer customer = null;
         String goodsName = null;
         Double quantity = null;
         Short type = null;
         Double priceNumCount = null;
         Double containsTax = null;
         String goodsType = null;
         String gcName = null;
         String memo = null;
         Double noContainsTax = null;
         Double minPrice = null;
         Date deliveryDate = null;
         OeOemOrderDetailExcelDto oeOemOrderDetailExcelDto = new OeOemOrderDetailExcelDto();
 ​
 ​
         //(一)【外协单号】:
         String orderCode = oneCell;
         OeOemOrder oeOemOrder = null;
         if (StringUtils.isNotBlank(orderCode)) {
             oeOemOrder = iOeOemOrderService.queryByooooCode(orderCode);
 ​
             if (integer == 1) {
                 if (oeOemOrder == null) {
                     throw new BusinessException("外协单号在数据库中不存在。 ");
                 }
             }
             ooId = oeOemOrder.getOoId();
         }
 ​
 ​
         //(1)【项目号】:
         String pjMoldmcode = oeOemOrderDetailExcelImport.getPjMoldMcode();
 ​
         if (StringUtils.isNotBlank(pjMoldmcode)) {
             //进行存储;
             pjMold = pjMoldService.getByMcode(pjMoldmcode);
             if (integer == 1) {
                 if (pjMold == null) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 B 列的项目号(模具号)在数据库中不存在。 ");
                 }
             }
         }
         if (pjMold != null) {
             mid = pjMold.getMid();
         }
 ​
 ​
         //(2)【球标号】:
         String dsPartMcode = oeOemOrderDetailExcelImport.getDsPartMcode();
         if (StringUtils.isNotBlank(dsPartMcode)) {
             //进行存储;
             dsPart = dsPartService.getByPartsCode(dsPartMcode);
 ​
             if (integer == 1) {
                 if (dsPart == null) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 C 列的球标号在数据库中不存在。 ");
                 }
             }
             oeOemOrderDetailExcelDto.setDsPartMcode(dsPartMcode);  //DTO中设置好球标号~~~
 ​
             //能运行到这一行说明在数据库中找到了~~~!!!
             prWorkpiece = prWorkpieceService.getByPartId(dsPart.getPartId());
 ​
             if (integer == 1) {
                 if (prWorkpiece == null) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行 C 列的球标号无对应的工件信息。 ");
                 }
             }
             //防止出现空指针异常~~~!!!
 ​
             wppId = prWorkpiece.getWppId();
         }
 ​
         //(二)【外协日期】:----Date
         if (StringUtils.isNotBlank(twoCell)) {
             try {
                 ooDate = DateTime.parse(ExcelUtils.excelStr2NormString(twoCell));
 ​
                 oeOemOrderDetailExcelDto.setOoDate(ooDate);
             } catch (Exception e) {
                 throw new BusinessException("第【 3 】行 L 列的外协日期格式有误,请修改该数据的格式。 ");
             }
         }
 ​
         //[TODO]: 工序类型没有完全利用
 ​
         //(三)【工序类型】:
 //        if (StringUtils.isNotBlank(threeCell)) {
 //            if (!"全工序".equals(threeCell) && !"多工序".equals(threeCell)) {
                 oeOemOrderDetail.getPjMold().setPcode( threeCell );
 //            }
 //        }
 ​
         //(四)【外协商】:
         if (StringUtils.isNotBlank(fourCell)) {
             //首先需要根据外协商来进行查找
             customer = coOemCustomerService.queryByCustomerName(fourCell);
 ​
             if (integer == 1) {
                 if (customer == null) {
                     throw new BusinessException("外协商 在数据库中不存在,请检查该项数据。 ");
                 }
             }
 ​
             oeOemOrderDetailExcelDto.setCoOemCustomer(customer);
         }
 ​
 ​
         //(3)【物料名称】:
         goodsName = oeOemOrderDetailExcelImport.getGoodsName();
 ​
         if (goodsName != null) {
             oeOemOrderDetailExcelDto.setGoodsName(goodsName);
         }
 ​
 ​
         //(4)【件数】:
         String quantityStr = oeOemOrderDetailExcelImport.getQuantity();
         try {
             quantity = Double.valueOf(quantityStr);
 ​
             if (quantity != null) {
                 oeOemOrderDetailExcelDto.setQuantity(quantity);
             }
 ​
         } catch (NumberFormatException e) {
             throw new BusinessException(" 第【 " + (count + 7) + " 】行, E 列件数的数字格式有误!!! ");
         }
 ​
 ​
         //(5)【计价方式】:
         String priceTypeStr = oeOemOrderDetailExcelImport.getPriceType();
         if (StringUtils.isNotBlank(priceTypeStr)) {
             // 需要进行一下转换 ===》 该字段是设置数字的,而用户传过来的是文字~ ~ ~
 ​
             HashMap<String, Short> hashMap = new HashMap<>();
             CoProcess.priceTypeMap.forEach((k, v) -> {
                 hashMap.put(v, k);
             });
 ​
             type = hashMap.get(priceTypeStr);
 ​
             if (integer == 1) {
                 if (type == null) {
                     throw new BusinessException("第【 " + (count + 7) + " 】行, F 列 计价方式 的格式有误!!! ");
                 }
             }
 ​
             oeOemOrderDetailExcelDto.setPriceType(type);
         }
 ​
 ​
         //(6)【计价数量】:
         String priceNum = oeOemOrderDetailExcelImport.getPriceNum();
         try {
             priceNumCount = Double.valueOf(priceNum);
 ​
             if (priceNumCount != null) {
                 oeOemOrderDetailExcelDto.setCalculateNum(priceNumCount);
             }
         } catch (NumberFormatException e) {
             throw new BusinessException("第【 " + (count + 7) + " 】行, G 列 计价数量 的数字格式有误!!! ");
         }
 ​
 ​
         //(7)【规格】:
         goodsType = oeOemOrderDetailExcelImport.getGoodsType();
         if (goodsType != null) {
             oeOemOrderDetailExcelDto.setGoodsType(goodsType);
         }
 ​
 ​
         //(8)【材质】:
         gcName = oeOemOrderDetailExcelImport.getGcName();
         if (gcName != null) {
             oeOemOrderDetailExcelDto.setGcName(gcName);
         }
 ​
 ​
         //(9)【加工要求】:
         memo = oeOemOrderDetailExcelImport.getMemo();
         if (memo != null) {
             oeOemOrderDetailExcelDto.setMemo(memo);
         }
 ​
         //(10)【单价(含税)】:
         String containsTaxStr = oeOemOrderDetailExcelImport.getContainsTax();
         try {
             containsTax = Double.valueOf(containsTaxStr);
             if (containsTax != null) {
                 oeOemOrderDetailExcelDto.setContainsTax(containsTax);
             }
 ​
         } catch (NumberFormatException e) {
             throw new BusinessException("第【 " + (count + 7) + " 】行, K 列 单价(含税) 的数字格式有误!!! ");
         }
 ​
 ​
         //(11)【单价(未税)】:
         String noContainsTaxStr = oeOemOrderDetailExcelImport.getNoContainsTax();
         if (StringUtils.isNotBlank(noContainsTaxStr)) {
 ​
             try {
                 noContainsTax = Double.valueOf(noContainsTaxStr);
                 if (noContainsTax != null) {
                     oeOemOrderDetailExcelDto.setNoContainsTax(noContainsTax);
                 }
             } catch (NumberFormatException e) {
                 throw new BusinessException("第【 " + (count + 7) + " 】行, L 列 单价(未税) 的数字格式有误!!! ");
             }
         }
 ​
 ​
         //(12)【小计价格】:
         String minPriceStr = oeOemOrderDetailExcelImport.getMinPrice();
 ​
         if (StringUtils.isNotBlank(minPriceStr)) {
             try {
                 minPrice = Double.valueOf(minPriceStr);
                 if (minPrice != null) {
                     oeOemOrderDetailExcelDto.setMinPrice(minPrice);
                 }
             } catch (NumberFormatException e) {
                 throw new BusinessException("第【 " + (count + 7) + " 】行, M 列 小计价格 的数字格式有误!!! ");
             }
         }
 ​
         //(13)【交期】:
 ​
         deliveryDate = oeOemOrderDetailExcelImport.getDeliveryDate();
         if (deliveryDate != null) {
             oeOemOrderDetailExcelDto.setDeliveryDate(deliveryDate);
         }
         //如果用户未填写的话,这一个格子会装上null
 ​
 ​
         ddtoList.add(oeOemOrderDetailExcelDto);
 ​
 ​
         List<OeOemOrderDetail> oeOemOrderDetailList = ooOemOrderDetailService.listByThreeId(ooId, mid, wppId);
 ​
         Collections.sort(oeOemOrderDetailList, new Comparator<OeOemOrderDetail>() {
             @Override
             public int compare(OeOemOrderDetail o1, OeOemOrderDetail o2) {
                 return o2.getPrWorkPlan().getOrders() - o1.getPrWorkPlan().getOrders();
             }
         });
         //如此一来,第一条一定是最大的(orders);
 ​
         dspartMap.put(dsPartMcode, oeOemOrderDetailList);
 ​
         //第一条仍然是工序号最大的,第一条设置上价格,其余全设置0即可~ ~ ~
 ​
         strhashMap.put(1, "F");
 ​
         int ifSaved = 0;
 ​
         if (integer == 1) {     //第二次进来就不用这个检验了~ ~ ~ !!!
             StringBuilder message = new StringBuilder("[ ");
             for (int i = 0; i < oeOemOrderDetailList.size(); i++) {
 ​
                 OeOemOrderDetail orderDetail = oeOemOrderDetailList.get(i);
                 if (orderDetail.getTaxPrice() != null || orderDetail.getNotaxPrice() != null || orderDetail.getSubtotalPrice() != null
                         || orderDetail.getCalculateNum() != null) {
                     ifSaved++;
                 }
             }
             if (ifSaved > 0) {
                 message.append(count + 7);
                 message.append(",");
             }
             String beforeStr = " ";
 ​
 ​
             //数据库全是NULL的话 , 这一段就不进去~ ~ ~ ! ! !
             if (ifSaved > 0 && strhashMap != null) {
 ​
                 if (strhashMap.size() > 1) {
                     beforeStr = strhashMap.get(2);
                     beforeStr += " , " + (count + 7);
                 } else {
                     beforeStr += (count + 7);
                 }
 ​
                 strhashMap.put(2, beforeStr);
             }
         }
 ​
         //先把ExcelModel类中的数据过一遍,确保全部没问题;---> 再一口气进行存储!!!
 ​
         dto.setDspartKeyMap(dspartMap);
         dto.setMessageHashmap(strhashMap);
         dto.setDetailDtoList(ddtoList);
 ​
         return strhashMap;
     }
【5】:insertInfo
根据dto的两个属性 , set完成即可 ~
     @Override
     public void insertInfo(OeOemOrderDetailDto dto) throws Exception {
         List<OeOemOrderDetailExcelDto> excelList = dto.getDetailDtoList();
         Map<String, List<OeOemOrderDetail>> dspartKeyMap = dto.getDspartKeyMap();
         PfUserInfo priceAddMan = dto.getPfUserInfo();
         Date priceAddDate = new Date(System.currentTimeMillis());
 ​
         Date ooDate = null;
         CoOemCustomer customer = null;
         String goodsName = null;
         Double quantity = null;
         Short priceType = null;
         Double calculateNum = null;
         Double containsTax = null;
         String goodsType = null;
         String gcName = null;
         String memo = null;
         Double noContainsTax = null;
         Double minPrice = null;
         Date deliveryDate = null;
 ​
 ​
         for (int i = 0; i < excelList.size(); i++) {
             OeOemOrderDetailExcelDto excelDto = excelList.get(i);
             //【1】:  ooDate
             //【2】:  customer
             //【3】:  goodsName
             //【4】:  quantity
             //【5】:  priceType
             //【6】:   calculateNum
             //【7】:  goodsType
             //【8】:  gcName
             //【9】:  memo
             //【10】:  deliveryDate
 ​
             ooDate = excelDto.getOoDate();
             customer = excelDto.getCoOemCustomer();
             goodsName = excelDto.getGoodsName();
             quantity = excelDto.getQuantity();
             priceType = excelDto.getPriceType();
             calculateNum = excelDto.getCalculateNum();
             goodsType = excelDto.getGoodsType();
             gcName = excelDto.getGcName();
             memo = excelDto.getMemo();
             deliveryDate = excelDto.getDeliveryDate();
 ​
             minPrice = excelDto.getMinPrice();
             containsTax = excelDto.getContainsTax();
             noContainsTax = excelDto.getNoContainsTax();
 ​
             String dspartCode = excelList.get(i).getDsPartMcode();
 ​
 ​
             List<OeOemOrderDetail> list = dspartKeyMap.get(dspartCode);
             for (int j = 0; j < list.size(); j++) {
                 OeOemOrderDetail orderDetail = list.get(j);
 ​
                 if (ooDate != null) {
                     orderDetail.getOeOemOrder().setOoDate(ooDate);
                 }
 ​
                 if (customer != null) {
                     orderDetail.getOeOemOrder().setCoOemCustomer(customer);
                 }
 ​
                 if (goodsName != null) {
                     orderDetail.getPrWorkpiece().getDsPart().getCoGoods().setGoodsName(goodsName);
                 }
 ​
                 if (quantity != null) {
                     orderDetail.setQuantity(quantity);
                 }
 ​
                 if (calculateNum != null) {
                     orderDetail.setCalculateNum(calculateNum);
                 }
 ​
 ​
                 if (priceType != null) {
                     orderDetail.getPrWorkPlan().getCoProcess().setPriceType(priceType);
                 }
 ​
                 if (goodsType != null) {
                     orderDetail.getPrWorkpiece().getDsPart().getCoGoods().setGoodsType(goodsType);
                 }
 ​
                 
                 if (gcName != null) {
                     orderDetail.getPrWorkpiece().getDsPart().getCoGoods().getCoGoodsClass().setGcName(gcName);
                 }
 ​
                 if (memo != null) {
                     orderDetail.getPrWorkpiece().getDsPart().setMemo(memo);
                 }
 ​
                 if (deliveryDate != null) {
                     orderDetail.setDeliveryDate(deliveryDate);
                 }
 ​
                 if (minPrice != null) {
                     orderDetail.setSubtotalPrice(minPrice);
                 }
 ​
                 if (j == 0) {   //第一条数据是工序号最大的,这个时候设置上价格,其余的数据全部设置为0即可;
                     //(10)【单价(含税)】:
                     if (containsTax != null) {
                         //containsTax 进行存储————存储到数据库里;
                         orderDetail.setTaxPrice(containsTax);
                     }
 ​
                     //(11)【单价(未税)】:
                     if (noContainsTax != null) {
                         //noContainsTax 进行存储————存储到数据库里;
                         orderDetail.setNotaxPrice(noContainsTax);
                     }
                 } else {
                     orderDetail.setTaxPrice(0.0);
                     orderDetail.setNotaxPrice(0.0);
                 }
                 
                 if (  priceAddMan != null  ){
                     orderDetail.setPriceAddMan( priceAddMan );
                 }
                 orderDetail.setPriceAddDate( priceAddDate );
                 
                 this.update(orderDetail);
             }
         }
     }
【 END 】:DTO
【OODExcelImport】:
 /**
  * @author YGY
  * @version 1.0
  * @date 2022/7/7 10:41
  */
 public class OeOemOrderDetailExcelImport {
     /**
      * ********模具号
      */
     @ExcelProperty(index = 1)
     private String pjMoldMcode;
     /**
      * ********球标号
      */
     @ExcelProperty(index = 2)
     private String dsPartMcode ;
     /**
      *物料名称
      */
     @ExcelProperty(index = 3)
     private String goodsName ;
     /**
      * *******件数
      */
     @ExcelProperty(index = 4)
     private String quantity;
     /**
      *计价方式
      */
     @ExcelProperty(index = 5)
     private String  priceType;
     /**
      * ********计价数量
      */
     @ExcelProperty(index = 6)
     private String  priceNum;
     /**
      *规格
      */
     @ExcelProperty(index = 7)
     private String  goodsType;
     /**
      *材质
      */
     @ExcelProperty(index = 8)
     private String  gcName;
     /**
      *加工要求
      */
     @ExcelProperty(index = 9)
     private String  memo;
     /**
      * ********单价(含税)
      */
     @ExcelProperty(index = 10)
     private String  containsTax;
     /**
      *单价(未税)
      */
     @ExcelProperty(index = 11)
     private String  noContainsTax;
     /**
      * ********小计价格
      */
     @ExcelProperty(index = 12)
     private String  minPrice;
     /**
      *交期
      */
     @ExcelProperty(index = 13)
     @DateTimeFormat("yyyy/MM/dd")
     private Date deliveryDate;
     /**
      *外协单号
      */
     private String ooCode;
     /**
      *外协日期
      */
     private String ooDate;
     /**
      *工序类型
      */
     private String processName;
     /**
      *外协商
      */
     private String coOemCustomer;
 ​
 ​
     public String getPjMoldMcode() {
         return pjMoldMcode;
     }
     public void setPjMoldMcode(String pjMoldMcode) {
         this.pjMoldMcode = pjMoldMcode;
     }
     public String getDsPartMcode() {
         return dsPartMcode;
     }
     public void setDsPartMcode(String dsPartMcode) {
         this.dsPartMcode = dsPartMcode;
     }
     public String getGoodsName() {
         return goodsName;
     }
     public void setGoodsName(String goodsName) {
         this.goodsName = goodsName;
     }
     public String getQuantity() {
         return quantity;
     }
     public void setQuantity(String quantity) {
         this.quantity = quantity;
     }
     public String getPriceType() {
         return priceType;
     }
     public void setPriceType(String priceType) {
         this.priceType = priceType;
     }
     public String getPriceNum() {
         return priceNum;
     }
     public void setPriceNum(String priceNum) {
         this.priceNum = priceNum;
     }
     public String getGoodsType() {
         return goodsType;
     }
     public void setGoodsType(String goodsType) {
         this.goodsType = goodsType;
     }
     public String getGcName() {
         return gcName;
     }
     public void setGcName(String gcName) {
         this.gcName = gcName;
     }
     public String getMemo() {
         return memo;
     }
     public void setMemo(String memo) {
         this.memo = memo;
     }
     public String getContainsTax() {
         return containsTax;
     }
     public void setContainsTax(String containsTax) {
         this.containsTax = containsTax;
     }
     public String getNoContainsTax() {
         return noContainsTax;
     }
     public void setNoContainsTax(String noContainsTax) {
         this.noContainsTax = noContainsTax;
     }
     public String getMinPrice() {
         return minPrice;
     }
     public void setMinPrice(String minPrice) {
         this.minPrice = minPrice;
     }
     public Date getDeliveryDate() {
         return deliveryDate;
     }
     public void setDeliveryDate(Date deliveryDate) {
         this.deliveryDate = deliveryDate;
     }
     public String getOoCode() {
         return ooCode;
     }
     public void setOoCode(String ooCode) {
         this.ooCode = ooCode;
     }
     public String getOoDate() {
         return ooDate;
     }
     public void setOoDate(String ooDate) {
         this.ooDate = ooDate;
     }
     public String getProcessName() {
         return processName;
     }
     public void setProcessName(String processName) {
         this.processName = processName;
     }
     public String getCoOemCustomer() {
         return coOemCustomer;
     }
     public void setCoOemCustomer(String coOemCustomer) {
         this.coOemCustomer = coOemCustomer;
     }
 }
【OODExcelDto】:
 /**
  * @author YGY
  * @version 1.0
  * @date 2022/7/13 16:52
  */
 public class OeOemOrderDetailExcelDto {
     /**
      *外协日期
      */
     private Date ooDate=null;
     /**
      *外协商
      */
     private CoOemCustomer coOemCustomer=null;
     /**
      * ********球标号
      */
     private String dsPartMcode =null;
     /**
      *物料名称
      */
     private String goodsName =null;
     /**
      * *******件数
      */
     private Double quantity=null;
     /**
      *计价方式
      */
     private Short  priceType=null;
     /**
      * ********计价数量
      */
     private Double calculateNum=null;
     /**
      *规格
      */
     private String  goodsType=null;
     /**
      *材质
      */
     private String  gcName=null;
     /**
      *加工要求
      */
     private String  memo=null;
     /**
      * ********单价(含税)
      */
     private Double  containsTax=null;
     /**
      *单价(未税)
      */
     private Double  noContainsTax=null;
     /**
      * ********小计价格
      */
     private Double  minPrice=null;
     /**
      *交期
      */
     private Date deliveryDate=null;
 ​
     
     /**
      *get / set
      */
     public Date getOoDate() {
         return ooDate;
     }
     public void setOoDate(Date ooDate) {
         this.ooDate = ooDate;
     }
     public CoOemCustomer getCoOemCustomer() {
         return coOemCustomer;
     }
     public void setCoOemCustomer(CoOemCustomer coOemCustomer) {
         this.coOemCustomer = coOemCustomer;
     }
     public String getDsPartMcode() {
         return dsPartMcode;
     }
     public void setDsPartMcode(String dsPartMcode) {
         this.dsPartMcode = dsPartMcode;
     }
     public String getGoodsName() {
         return goodsName;
     }
     public void setGoodsName(String goodsName) {
         this.goodsName = goodsName;
     }
     public Double getQuantity() {
         return quantity;
     }
     public void setQuantity(Double quantity) {
         this.quantity = quantity;
     }
     public Short getPriceType() {
         return priceType;
     }
     public void setPriceType(Short priceType) {
         this.priceType = priceType;
     }
     public Double getCalculateNum() {
         return calculateNum;
     }
     public void setCalculateNum(Double calculateNum) {
         this.calculateNum = calculateNum;
     }
     public String getGoodsType() {
         return goodsType;
     }
     public void setGoodsType(String goodsType) {
         this.goodsType = goodsType;
     }
     public String getGcName() {
         return gcName;
     }
     public void setGcName(String gcName) {
         this.gcName = gcName;
     }
     public String getMemo() {
         return memo;
     }
     public void setMemo(String memo) {
         this.memo = memo;
     }
     public Double getContainsTax() {
         return containsTax;
     }
     public void setContainsTax(Double containsTax) {
         this.containsTax = containsTax;
     }
     public Double getNoContainsTax() {
         return noContainsTax;
     }
     public void setNoContainsTax(Double noContainsTax) {
         this.noContainsTax = noContainsTax;
     }
     public Double getMinPrice() {
         return minPrice;
     }
     public void setMinPrice(Double minPrice) {
         this.minPrice = minPrice;
     }
     public Date getDeliveryDate() {
         return deliveryDate;
     }
     public void setDeliveryDate(Date deliveryDate) {
         this.deliveryDate = deliveryDate;
     }
 }
【OOODDto】:
package com.videasoft.vmes.m.design.model.spec;

import com.videasoft.vmes.m.oem.model.OeOemOrderDetail;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author YGY
 * @version 1.0
 * @date 2022/7/13 13:49
 */
public class OeOemOrderDetailDto {

    private boolean ifCheck = false;    
    //控制前台是否弹出弹框;

    private List<OeOemOrderDetailExcelDto> detailDtoList = new ArrayList<>();  
    //为后面插入方法做准备;
    //(将EXCEL模板类 ==> 稍微做浅一层的封装  )

    private  List<OeOemOrderDetailExcelImport> excelList = new ArrayList<>();  
    //原EXCEL模型类List;

    private HashMap<Integer,String> messageHashmap = new HashMap<>();  
    //如果将要覆盖==》前台提示用户;

    private HashMap<String , List<OeOemOrderDetail>> dspartKeyMap = new HashMap<>();  
    //零件码为KEY;

    
    public List<OeOemOrderDetailExcelImport> getExcelList() {
        return excelList;
    }
    public void setExcelList(List<OeOemOrderDetailExcelImport> excelList) {
        this.excelList = excelList;
    }
    public HashMap<String, List<OeOemOrderDetail>> getDspartKeyMap() {
        return dspartKeyMap;
    }
    public void setDspartKeyMap(HashMap<String, List<OeOemOrderDetail>> dapartKeyMap) {
        this.dspartKeyMap = dapartKeyMap;
    }
    public boolean getIfCheck() {
        return ifCheck;
    }
    public OeOemOrderDetailDto() {
    }
    public void setIfCheck(boolean ifCheck) {
        this.ifCheck = ifCheck;
    }
    public List<OeOemOrderDetailExcelDto> getDetailDtoList() {
        return detailDtoList;
    }
    public void setDetailDtoList(List<OeOemOrderDetailExcelDto> detailDtoList) {
        this.detailDtoList = detailDtoList;
    }
    public HashMap<Integer, String> getMessageHashmap() {
        return messageHashmap;
    }
    public void setMessageHashmap(HashMap<Integer, String> messageHashmap) {
        this.messageHashmap = messageHashmap;
    }
}
【OOOD】: Model类
 package com.videasoft.vmes.m.oem.model;
 ​
 import com.alibaba.fastjson.annotation.JSONField;
 import com.videasoft.utils.date.DateTime;
 import com.videasoft.vmes.m.produce.model.PrWorkPlan;
 import com.videasoft.vmes.m.produce.model.PrWorkpiece;
 import com.videasoft.sysmgr.model.PfUserInfo;
 import com.videasoft.vmes.m.project.model.PjMold;
 import com.videasoft.webframework.based.HBaseModel;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
 import javax.persistence.*;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 ​
 @Entity
 @Cache(usage = CacheConcurrencyStrategy.NONE)
 @Table(name = "oe_oem_order_detail")
 @DynamicUpdate
 @DynamicInsert
 public class OeOemOrderDetail extends HBaseModel {
 ​
     /**
      * @Fields
      */
     private static final long serialVersionUID = -8064962066129297649L;
 ​
     /**
      * @Fields bcId : 流水号
      */
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "ood_id")
     private Long oodId;
 ​
     /**
      * @Fields oeOemOrder : 外协订单
      */
     @ManyToOne
     @JoinColumn(name = "oo_id")
     private OeOemOrder oeOemOrder;
 ​
     /**
      * @Fields oeOemTask : 外协任务
      */
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "ot_id")
     private OeOemTask oeOemTask;
 ​
     /**
      * @Fields pjMold : 模具
      */
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "mid")
     private PjMold pjMold;
 ​
     /**
      * @Fields prWorkpiece : 工件
      */
     @ManyToOne
     @JoinColumn(name = "wpp_id")
     private PrWorkpiece prWorkpiece;
 ​
     /**
      * @Fields prWorkpiece : 工件
      */
     // @ManyToOne(fetch=FetchType.LAZY)
     // @JoinColumn(name = "wpp_id")
     // private PrOtherWork prOtherWork;
 ​
     /**
      * @Fields prWorkPlan : 生产作业计划
      */
     @ManyToOne
     @JoinColumn(name = "wp_id")
     private PrWorkPlan prWorkPlan;
 ​
     /**
      * @Fields quantity : 数量
      */
     @Column(name = "quantity", precision = 18, scale = 6, nullable = false)
     private Double quantity;
 ​
     /**
      * @Fields quantity : 计价数量
      */
     @Column(name = "calculate_num", precision = 18, scale = 6, nullable = false)
     private Double calculateNum;
 ​
     /**
      * @Fields deliveryDate : 要求交货日期
      */
     @Column(name = "delivery_date")
     @JSONField(format = "yyyy-MM-dd")
     private Date deliveryDate;
 ​
     /**
      * @Fields allWeight : 估计总重
      */
     @Column(name = "all_weight", precision = 18, scale = 6)
     private Double allWeight;
 ​
     /**
      * @Fields allHour : 估计总工时
      */
     @Column(name = "all_hour", precision = 18, scale = 6)
     private Double allHour;
 ​
     /**
      * @Fields allMoney : 估计费用
      */
     @Column(name = "all_money", precision = 18, scale = 6)
     private Double allMoney;
 ​
     /**
      * @Fields factDeliveryDate : 实际到货日期
      */
     @Column(name = "fact_delivery_date")
     @JSONField(format = DATEFORMAT_DATE)
     private Date factDeliveryDate;
 ​
     /**
      * @Fields factWeight : 实际总重
      */
     @Column(name = "fact_weight", precision = 18, scale = 6)
     private Double factWeight;
 ​
     /**
      * @Fields factHour : 实际总工时
      */
     @Column(name = "fact_hour", precision = 18, scale = 6)
     private Double factHour;
 ​
     /**
      * @Fields factMoney : 实际费用
      */
     @Column(name = "fact_money", precision = 18, scale = 6)
     private Double factMoney;
 ​
     /**
      * @Fields factMoney : 单价(含税)
      */
     @Column(name = "tax_price", precision = 18, scale = 6)
     private Double taxPrice;
 ​
     /**
      * @Fields factMoney : 单价(未税)
      */
     @Column(name = "notax_price", precision = 18, scale = 6)
     private Double notaxPrice;
 ​
     /**
      * @Fields factMoney : 小计价格
      */
     @Column(name = "subtotal_price", precision = 18, scale = 6)
     private Double subtotalPrice;
     /**
      * @Fields curStatus : 状态
      */
     @Column(name = "cur_status")
     private Short curStatus;
 ​
     /**
      * @Fields checkageDate : 对账日期
      */
     @Column(name = "checkage_date")
     @JSONField(format = DATEFORMAT_DATE)
     private Date checkageDate;
     /**
      * @Fields sendDate : 送出日期
      */
     @Column(name = "send_date")
     @JSONField(format = DATEFORMAT_DATE)
     private Date sendDate;
 ​
     /**
      * @Fields sendCheckDate :送检日期
      */
     @Column(name = "send_check_date")
     @JSONField(format = DATEFORMAT_DATE)
     private Date sendCheckDate;
 ​
     /**
      * @Fields taxMoney : 税金
      */
     @Column(name = "tax_money", precision = 18, scale = 6)
     private Double taxMoney;
 ​
     /**
      * @Fields continueSend : 继续送出
      */
     @Column(name = "continue_send", precision = 18, scale = 6)
     private Boolean continueSend;
 ​
     /**
      * @Fields weight : 重量
      */
     @Column(name = "weight", precision = 18, scale = 6)
     private Double weight;
 ​
     /**
      * @Fields area : 面积
      */
     @Column(name = "area", precision = 18, scale = 6)
     private Double area;
 ​
     /**
      * @Fields proTime : 加工工时
      */
     @Column(name = "pro_time", precision = 18, scale = 6)
     private Double proTime;
 ​
     /**
      * @Fields signRed : 在订单跟踪时是否标红
      */
     @Transient
     private boolean signRed = false;
 ​
     /**
      * @Fields state:生产退料状态
      */
     @Column(name = "state")
     private Boolean state = false;
 ​
     /**
      * @Fields picstate:生产领料状态
      */
     @Column(name = "picstate")
     private Boolean picState = false;
 ​
     /**
      * @Fields repState:生产超耗领料状态
      */
     @Column(name = "repState")
     private Boolean repState = false;
 ​
     /**
      * @Fields deliveryMan:收回人员
      */
     @ManyToOne
     @JoinColumn(name = "delivery_man")
     private PfUserInfo deliveryMan;
 ​
     public static Map<Short, String> curStatusMap = new HashMap<Short, String>();
 ​
     /**
      * 未送出
      */
     public static Short CUR_STATUS_CREATE = -1;
     /**
      * 已送出
      */
     public static Short CUR_STATUS_SC = 0;
     /**
      * 已收回
      */
     public static Short CUR_STATUS_SH = 1;
     /**
      * 已送检
      */
     public static Short CUR_STATUS_SJ = 2;
     /**
      * 已验收
      */
     public static Short CUR_STATUS_YS = 3;
     /**
      * 需返工
      */
     public static Short CUR_STATUS_FG = 4;
     /**
      * 已报废
      */
     public static Short CUR_STATUS_BF = 5;
 ​
     static {
         curStatusMap.put(CUR_STATUS_SC, "已送出");
         curStatusMap.put(CUR_STATUS_SH, "已收回");
         curStatusMap.put(CUR_STATUS_SJ, "已送检");
         curStatusMap.put(CUR_STATUS_YS, "已验收");
         curStatusMap.put(CUR_STATUS_FG, "需返工");
         curStatusMap.put(CUR_STATUS_BF, "已报废");
     }
 ​
     // Constructors
 ​
 ​
     public Double getCalculateNum() {
         return calculateNum;
     }
 ​
     public void setCalculateNum(Double calculateNum) {
         this.calculateNum = calculateNum;
     }
 ​
     public Double getTaxPrice() {
         return taxPrice;
     }
 ​
     public void setTaxPrice(Double taxPrice) {
         this.taxPrice = taxPrice;
     }
 ​
     public Double getNotaxPrice() {
         return notaxPrice;
     }
 ​
     public void setNotaxPrice(Double notaxPrice) {
         this.notaxPrice = notaxPrice;
     }
 ​
     public Double getSubtotalPrice() {
         return subtotalPrice;
     }
 ​
     public void setSubtotalPrice(Double subtotalPrice) {
         this.subtotalPrice = subtotalPrice;
     }
 ​
     /**
      * default constructor
      */
     public OeOemOrderDetail() {
     }
 ​
     public Boolean getRepState() {
         return repState;
     }
 ​
     public void setRepState(Boolean repState) {
         this.repState = repState;
     }
 ​
     public Boolean getPicState() {
         return picState;
     }
 ​
     public void setPicState(Boolean picState) {
         this.picState = picState;
     }
 ​
     public Boolean getState() {
         return state;
     }
 ​
     public void setState(Boolean state) {
         this.state = state;
     }
 ​
     public String getCurStatusTitle() {
         String curStatusTitle = curStatusMap.get(this.curStatus);
         if (CUR_STATUS_SC.equals(curStatus)) {
             return curStatusTitle += "(" + DateTime.date2String(sendDate) + ")";
         }
         return curStatusTitle;
     }
 ​
     public Long getOodId() {
         return oodId;
     }
 ​
     public void setOodId(Long oodId) {
         this.oodId = oodId;
     }
 ​
     public OeOemOrder getOeOemOrder() {
         return oeOemOrder;
     }
 ​
     public void setOeOemOrder(OeOemOrder oeOemOrder) {
         this.oeOemOrder = oeOemOrder;
     }
 ​
     public OeOemTask getOeOemTask() {
         return oeOemTask;
     }
 ​
     public void setOeOemTask(OeOemTask oeOemTask) {
         this.oeOemTask = oeOemTask;
     }
 ​
     public PjMold getPjMold() {
         return pjMold;
     }
 ​
     public void setPjMold(PjMold pjMold) {
         this.pjMold = pjMold;
     }
 ​
     public PrWorkpiece getPrWorkpiece() {
         return prWorkpiece;
     }
 ​
     public void setPrWorkpiece(PrWorkpiece prWorkpiece) {
         this.prWorkpiece = prWorkpiece;
     }
 ​
     public Double getQuantity() {
         return quantity;
     }
 ​
     public void setQuantity(Double quantity) {
         this.quantity = quantity;
     }
 ​
     public Date getDeliveryDate() {
         return deliveryDate;
     }
 ​
     public void setDeliveryDate(Date deliveryDate) {
         this.deliveryDate = deliveryDate;
     }
 ​
     public Double getAllWeight() {
         return allWeight;
     }
 ​
     public void setAllWeight(Double allWeight) {
         this.allWeight = allWeight;
     }
 ​
     public Double getAllHour() {
         return allHour;
     }
 ​
     public void setAllHour(Double allHour) {
         this.allHour = allHour;
     }
 ​
     public Double getAllMoney() {
         return allMoney;
     }
 ​
     public void setAllMoney(Double allMoney) {
         this.allMoney = allMoney;
     }
 ​
     public Date getFactDeliveryDate() {
         return factDeliveryDate;
     }
 ​
     public void setFactDeliveryDate(Date factDeliveryDate) {
         this.factDeliveryDate = factDeliveryDate;
     }
 ​
     public Double getFactWeight() {
         return factWeight;
     }
 ​
     public void setFactWeight(Double factWeight) {
         this.factWeight = factWeight;
     }
 ​
     public Double getFactHour() {
         return factHour;
     }
 ​
     public void setFactHour(Double factHour) {
         this.factHour = factHour;
     }
 ​
     public Double getFactMoney() {
         return factMoney;
     }
 ​
     public void setFactMoney(Double factMoney) {
         this.factMoney = factMoney;
     }
 ​
     public Short getCurStatus() {
         return curStatus;
     }
 ​
     public void setCurStatus(Short curStatus) {
         this.curStatus = curStatus;
     }
 ​
     public Date getCheckageDate() {
         return checkageDate;
     }
 ​
     public void setCheckageDate(Date checkageDate) {
         this.checkageDate = checkageDate;
     }
 ​
     public Date getSendDate() {
         return sendDate;
     }
 ​
     public void setSendDate(Date sendDate) {
         this.sendDate = sendDate;
     }
 ​
     public Date getSendCheckDate() {
         return sendCheckDate;
     }
 ​
     public void setSendCheckDate(Date sendCheckDate) {
         this.sendCheckDate = sendCheckDate;
     }
 ​
     public Double getTaxMoney() {
         return taxMoney;
     }
 ​
     public Double getNoTaxMoney() {
         if (this.factMoney == null) {
             return 0d;
         }
 ​
         if (this.taxMoney == null) {
             return this.factMoney;
         }
 ​
         return this.factMoney - this.taxMoney;
     }
 ​
     public void setTaxMoney(Double taxMoney) {
         this.taxMoney = taxMoney;
     }
 ​
     public Boolean getContinueSend() {
         return continueSend;
     }
 ​
     public void setContinueSend(Boolean continueSend) {
         this.continueSend = continueSend;
     }
 ​
     public PrWorkPlan getPrWorkPlan() {
         return prWorkPlan;
     }
 ​
     public void setPrWorkPlan(PrWorkPlan prWorkPlan) {
         this.prWorkPlan = prWorkPlan;
     }
 ​
     public String getProcessName() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return this.prWorkPlan.getCoProcess().getPname();
         } else if (this.pjMold != null) {
             return "模具【" + this.pjMold.getMcode() + "】";
         }
         return "整体外协";
     }
 ​
     public boolean isSignRed() {
         return signRed;
     }
 ​
     public void setSignRed(boolean signRed) {
         this.signRed = signRed;
     }
 ​
     // 用于前端导出内容展示
     public String getExeclWppCode() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return prWorkPlan.getPrWorkpiece().getWppCode();
         } else if (this.prWorkpiece != null && this.prWorkpiece.getWppId() != null) {
             return prWorkpiece.getWppCode();
         }
         return "";
     }
 ​
     // 用于前端导出内容展示
     public String getExeclPartMname() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return prWorkPlan.getPrWorkpiece().getDsPart().getMname();
         } else if (this.prWorkpiece != null && this.prWorkpiece.getWppId() != null) {
             return prWorkpiece.getDsPart().getMname();
         }
         return "";
     }
 ​
     // 用于前端导出内容展示
     public String getExeclPartMcode() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return prWorkPlan.getPrWorkpiece().getDsPart().getMcode();
         } else if (this.prWorkpiece != null && this.prWorkpiece.getWppId() != null) {
             return prWorkpiece.getDsPart().getMcode();
         }
         return "";
     }
 ​
     // 用于前端导出内容展示
     public String getExeclMoldMcode() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return prWorkPlan.getPrWorkpiece().getDsPart().getPjMold().getMcode();
         } else if (this.prWorkpiece != null && this.prWorkpiece.getWppId() != null) {
             return prWorkpiece.getDsPart().getPjMold().getMcode();
         }
         return "";
     }
 ​
     // 用于前端导出内容展示
     public String getExeclDesignSize() {
         if (this.prWorkPlan != null && this.prWorkPlan.getWpId() != null) {
             return prWorkPlan.getPrWorkpiece().getDsPart().getDesignSize();
         } else if (this.prWorkpiece != null && this.prWorkpiece.getWppId() != null) {
             return prWorkpiece.getDsPart().getDesignSize();
         }
         return "";
     }
     public Double getWeight() {
         return weight;
     }
     public void setWeight(Double weight) {
         this.weight = weight;
     }
     public Double getArea() {
         return area;
     }
     public void setArea(Double area) {
         this.area = area;
     }
     public Double getProTime() {
         return proTime;
     }
     public void setProTime(Double proTime) {
         this.proTime = proTime;
     }
     public PfUserInfo getDeliveryMan() {
         return deliveryMan;
     }
     public void setDeliveryMan(PfUserInfo deliveryMan) {
         this.deliveryMan = deliveryMan;
     }
 }

【注意】:
【 计价方式 】:
每小时
每千克
无
要增加新的计价方式,就得去修改 公司封装类CoProcess 中的 静态Map信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值