From e600b7c39d7edac799315217e3bf8be6585724f5 Mon Sep 17 00:00:00 2001 From: qiankanghui Date: Wed, 29 Apr 2026 17:00:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E6=B7=BB=E5=8A=A0PO=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增PODetailMapper.xml映射文件,包含基础查询、分页查询和批量更新功能 - 实现PODetailServiceImpl业务逻辑层,提供保存、查询等核心服务方法 - 集成供应商和订单头信息关联查询功能 - 添加Excel导入导出支持 - 实现基于用户权限的站点数据隔离机制 - 提供完整的CRUD操作接口支持 --- .../xujie/modules/order/entity/POHeader.java | 3 + .../service/Impl/PODetailServiceImpl.java | 261 ++++++++++-------- .../service/Impl/POHeaderServiceImpl.java | 28 +- .../xujie/modules/order/vo/PODetailVo.java | 2 + .../resources/mapper/order/PODetailMapper.xml | 160 +++++------ 5 files changed, 249 insertions(+), 205 deletions(-) diff --git a/src/main/java/com/xujie/modules/order/entity/POHeader.java b/src/main/java/com/xujie/modules/order/entity/POHeader.java index 683e24c..4efa052 100644 --- a/src/main/java/com/xujie/modules/order/entity/POHeader.java +++ b/src/main/java/com/xujie/modules/order/entity/POHeader.java @@ -1,6 +1,8 @@ package com.xujie.modules.order.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.xujie.common.utils.QueryPage; @@ -31,6 +33,7 @@ public class POHeader extends QueryPage { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "采购订单号") + @TableId(value = "order_no", type = IdType.INPUT) private String orderNo; @ApiModelProperty(value = "工厂编码") diff --git a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java index 3994c00..ad9c1f9 100644 --- a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java +++ b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java @@ -161,145 +161,164 @@ public class PODetailServiceImpl extends ServiceImpl i // 用于收集重复数据的信息 List duplicateItems = new ArrayList<>(); + // 用于收集错误信息 + List errorMessages = new ArrayList<>(); + // 转换并保存每条数据 + int rowNum = 1; // Excel行号(从1开始,第1行是标题) for (PODetailExcelDTO excelDTO : excelList) { + rowNum++; + try { - // ========== 1. 保存 POHeader ========== - POHeader poHeader = new POHeader(); - - poHeader.setSite(site); - poHeader.setCustomer(excelDTO.getCustomer()); - poHeader.setPoNo(excelDTO.getPoNo()); - poHeader.setDeparture(excelDTO.getDeparture()); - poHeader.setDestination(excelDTO.getDestination()); - poHeader.setShipVia(excelDTO.getShipVia()); - poHeader.setBuyer(excelDTO.getBuyer()); - - // 设置默认值 - poHeader.setCurrency("USA"); - poHeader.setCurrencyRate(1.0); - - // 供应商 - if (excelDTO.getSupplierName() != null && !excelDTO.getSupplierName().isEmpty()) { - SrmSupplierEntity supplier = srmSupplierMapper.selectBySupplierName(excelDTO.getSupplierName()); - if (supplier != null) { - poHeader.setSupplierNo(supplier.getSupplierNo()); - } else { - throw new RuntimeException("未找到供应商: " + excelDTO.getSupplierName()); + // ========== 1. 保存 POHeader ========== + POHeader poHeader = new POHeader(); + + poHeader.setSite(site); + poHeader.setCustomer(excelDTO.getCustomer()); + poHeader.setPoNo(excelDTO.getPoNo()); + poHeader.setDeparture(excelDTO.getDeparture()); + poHeader.setDestination(excelDTO.getDestination()); + poHeader.setShipVia(excelDTO.getShipVia()); + poHeader.setBuyer(excelDTO.getBuyer()); + + // 设置默认值 + poHeader.setCurrency("USA"); + poHeader.setCurrencyRate(1.0); + + // 供应商 + if (excelDTO.getSupplierName() != null && !excelDTO.getSupplierName().isEmpty()) { + SrmSupplierEntity supplier = srmSupplierMapper.selectBySupplierName(excelDTO.getSupplierName()); + if (supplier != null) { + poHeader.setSupplierNo(supplier.getSupplierNo()); + } else { + throw new RuntimeException("未找到供应商: " + excelDTO.getSupplierName()); + } } - } - try { - if (excelDTO.getOrderDate() != null && !excelDTO.getOrderDate().isEmpty()) { - poHeader.setOrderDate(sdf.parse(excelDTO.getOrderDate())); - } - if (excelDTO.getEnquiry() != null && !excelDTO.getEnquiry().isEmpty()) { - poHeader.setEnquiry(sdf.parse(excelDTO.getEnquiry())); + try { + if (excelDTO.getOrderDate() != null && !excelDTO.getOrderDate().isEmpty()) { + poHeader.setOrderDate(sdf.parse(excelDTO.getOrderDate())); + } + if (excelDTO.getEnquiry() != null && !excelDTO.getEnquiry().isEmpty()) { + poHeader.setEnquiry(sdf.parse(excelDTO.getEnquiry())); + } + if (excelDTO.getConfirmed() != null && !excelDTO.getConfirmed().isEmpty()) { + poHeader.setConfirmed(sdf.parse(excelDTO.getConfirmed())); + } + } catch (Exception e) { + throw new RuntimeException("日期格式错误,请使用 yyyy-MM-dd 格式: " + e.getMessage()); } - if (excelDTO.getConfirmed() != null && !excelDTO.getConfirmed().isEmpty()) { - poHeader.setConfirmed(sdf.parse(excelDTO.getConfirmed())); - } - } catch (Exception e) { - throw new RuntimeException("日期格式错误,请使用 yyyy-MM-dd 格式: " + e.getMessage()); - } - // 保存 POHeader(先检查是否已存在) - POHeader existingHeader = poHeaderMapper.selectByPoNo(excelDTO.getPoNo()); - POHeader savedHeader; - - if (existingHeader != null) { - // 如果已存在,使用现有的 - savedHeader = existingHeader; - } else { - // 不存在则新增 - poHeaderService.saveModel(poHeader); - savedHeader = poHeaderMapper.selectByPoNo(excelDTO.getPoNo()); - if (savedHeader == null) { - throw new RuntimeException("保存 POHeader 失败,订单号: " + excelDTO.getPoNo()); - } - } + // 保存 POHeader(先检查是否已存在) + POHeader existingHeader = poHeaderMapper.selectByPoNo(excelDTO.getPoNo()); + POHeader savedHeader; - // ========== 2. 检查是否重复 ========== - String poNo = excelDTO.getPoNo(); - String item = excelDTO.getItem(); - - // 检查数据库中是否已存在相同的订单号+款号 - Integer existCount = baseMapper.countByOrderAndItem(poNo, site, item); - if (existCount != null && existCount > 0) { - duplicateItems.add("订单号: " + poNo + ", 款号: " + item); - continue; // 跳过重复数据,继续处理下一条 - } - - // ========== 3. 生成 item_no(核心) ========== - Integer maxItemNo = baseMapper.getMaxItemNo(poNo, site); - int lineNo = (maxItemNo == null ? 0 : maxItemNo) + 1; - orderLineMap.put(poNo, lineNo); - - // ========== 4. 保存 PODetail ========== - PODetailVo poDetailVo = new PODetailVo(); - - // 主键字段(必须) - poDetailVo.setOrderNo(poNo); - poDetailVo.setSite(site); - poDetailVo.setItemNo(lineNo); - - // 关联 - poDetailVo.setPoHeaderId(savedHeader.getId()); - - // 业务字段 - poDetailVo.setItem(excelDTO.getItem()); - poDetailVo.setPrice(excelDTO.getPrice()); - poDetailVo.setQty(excelDTO.getQty()); - poDetailVo.setShipQty(excelDTO.getShipQty()); - poDetailVo.setPlanner(excelDTO.getPlanner()); - poDetailVo.setRemark(excelDTO.getRemark()); - - // char(1) 字段转换:支持多种输入格式(是/否、Y/N、Yes/No) - String advancePaymentInput = excelDTO.getAdvancePayment(); - boolean needAdvance = false; - if (advancePaymentInput != null && !advancePaymentInput.trim().isEmpty()) { - String trimmed = advancePaymentInput.trim(); - // 支持中文"是"、英文"Y"或"Yes"(不区分大小写) - needAdvance = "是".equals(trimmed) - || "Y".equalsIgnoreCase(trimmed) - || "YES".equalsIgnoreCase(trimmed); - } - poDetailVo.setAdvancePayment(needAdvance ? "Y" : "N"); + if (existingHeader != null) { + // 如果已存在,使用现有的 + savedHeader = existingHeader; + } else { + // 不存在则新增 + poHeaderService.saveModel(poHeader); + savedHeader = poHeaderMapper.selectByPoNo(excelDTO.getPoNo()); + if (savedHeader == null) { + throw new RuntimeException("保存 POHeader 失败,订单号: " + excelDTO.getPoNo()); + } + } - try { - if (excelDTO.getWantReceiveDate() != null && !excelDTO.getWantReceiveDate().isEmpty()) { - poDetailVo.setWantReceiveDate(sdf.parse(excelDTO.getWantReceiveDate())); + // ========== 2. 检查是否重复 ========== + String poNo = excelDTO.getPoNo(); + String item = excelDTO.getItem(); + + // 检查数据库中是否已存在相同的订单号+款号(使用part_no字段) + Integer existCount = baseMapper.countByOrderAndItem(poNo, site, item); + if (existCount != null && existCount > 0) { + duplicateItems.add("第" + rowNum + "行 - 订单号: " + poNo + ", 款号: " + item); + continue; // 跳过重复数据,继续处理下一条 } - if (excelDTO.getCrd() != null && !excelDTO.getCrd().isEmpty()) { - poDetailVo.setCrd(sdf.parse(excelDTO.getCrd())); + + // ========== 3. 生成 item_no(核心) ========== + Integer maxItemNo = baseMapper.getMaxItemNo(poNo, site); + int lineNo = (maxItemNo == null ? 0 : maxItemNo) + 1; + orderLineMap.put(poNo, lineNo); + + // ========== 4. 保存 PODetail ========== + PODetailVo poDetailVo = new PODetailVo(); + + // 主键字段(必须) + poDetailVo.setOrderNo(poNo); + poDetailVo.setSite(site); + poDetailVo.setItemNo(lineNo); + + // 关联 + poDetailVo.setPoHeaderId(savedHeader.getId()); + + // 业务字段 - 款号保存到 part_no 字段 + poDetailVo.setPartNo(excelDTO.getItem()); + poDetailVo.setPrice(excelDTO.getPrice()); + poDetailVo.setQty(excelDTO.getQty()); + poDetailVo.setShipQty(excelDTO.getShipQty()); + poDetailVo.setPlanner(excelDTO.getPlanner()); + poDetailVo.setRemark(excelDTO.getRemark()); + + // char(1) 字段转换:支持多种输入格式(是/否、Y/N、Yes/No) + String advancePaymentInput = excelDTO.getAdvancePayment(); + boolean needAdvance = false; + if (advancePaymentInput != null && !advancePaymentInput.trim().isEmpty()) { + String trimmed = advancePaymentInput.trim(); + // 支持中文"是"、英文"Y"或"Yes"(不区分大小写) + needAdvance = "是".equals(trimmed) + || "Y".equalsIgnoreCase(trimmed) + || "YES".equalsIgnoreCase(trimmed); + } + poDetailVo.setAdvancePayment(needAdvance ? "Y" : "N"); + + try { + if (excelDTO.getWantReceiveDate() != null && !excelDTO.getWantReceiveDate().isEmpty()) { + poDetailVo.setWantReceiveDate(sdf.parse(excelDTO.getWantReceiveDate())); + } + if (excelDTO.getCrd() != null && !excelDTO.getCrd().isEmpty()) { + poDetailVo.setCrd(sdf.parse(excelDTO.getCrd())); + } + } catch (Exception e) { + throw new RuntimeException("日期格式错误,请使用 yyyy-MM-dd 格式: " + e.getMessage()); } - } catch (Exception e) { - throw new RuntimeException("日期格式错误,请使用 yyyy-MM-dd 格式: " + e.getMessage()); - } - - System.out.println("[DEBUG] 准备保存PODetail:"); - System.out.println(" orderNo: " + poDetailVo.getOrderNo()); - System.out.println(" site: " + poDetailVo.getSite()); - System.out.println(" itemNo: " + poDetailVo.getItemNo()); - System.out.println(" poHeaderId: " + poDetailVo.getPoHeaderId()); - System.out.println(" item: " + poDetailVo.getItem()); - try { - saveModel(poDetailVo); - System.out.println("[DEBUG] PODetail保存成功!"); + System.out.println("[DEBUG] 准备保存PODetail:"); + System.out.println(" orderNo: " + poDetailVo.getOrderNo()); + System.out.println(" site: " + poDetailVo.getSite()); + System.out.println(" itemNo: " + poDetailVo.getItemNo()); + System.out.println(" poHeaderId: " + poDetailVo.getPoHeaderId()); + System.out.println(" partNo: " + poDetailVo.getPartNo()); + + try { + saveModel(poDetailVo); + System.out.println("[DEBUG] PODetail保存成功!"); + } catch (Exception e) { + System.err.println("[ERROR] PODetail保存失败!"); + System.err.println("[ERROR] 异常类型: " + e.getClass().getName()); + System.err.println("[ERROR] 异常信息: " + e.getMessage()); + e.printStackTrace(); + throw new RuntimeException("保存PODetail失败: " + e.getMessage()); + } } catch (Exception e) { - System.err.println("[ERROR] PODetail保存失败!"); - System.err.println("[ERROR] 异常类型: " + e.getClass().getName()); - System.err.println("[ERROR] 异常信息: " + e.getMessage()); - e.printStackTrace(); - throw new RuntimeException("保存PODetail失败: " + e.getMessage()); + // 捕获每一行的异常,记录错误信息 + String errorMsg = "第" + rowNum + "行数据处理失败: " + e.getMessage(); + System.err.println("[ERROR] " + errorMsg); + errorMessages.add(errorMsg); + // 继续处理下一行,不中断整个导入流程 } } + // 如果有错误数据,抛出异常并提示 + if (!errorMessages.isEmpty()) { + String errorMsg = "导入过程中发现 " + errorMessages.size() + " 个错误:\n" + String.join("\n", errorMessages); + throw new RuntimeException(errorMsg); + } + // 如果有重复数据,抛出异常并提示 if (!duplicateItems.isEmpty()) { - String duplicateMsg = String.join("; ", duplicateItems); - throw new RuntimeException("以下数据已存在,跳过保存: " + duplicateMsg); + String duplicateMsg = "以下数据已存在,跳过保存:\n" + String.join("\n", duplicateItems); + throw new RuntimeException(duplicateMsg); } } catch (IOException e) { diff --git a/src/main/java/com/xujie/modules/order/service/Impl/POHeaderServiceImpl.java b/src/main/java/com/xujie/modules/order/service/Impl/POHeaderServiceImpl.java index 80e6c7b..b4875f3 100644 --- a/src/main/java/com/xujie/modules/order/service/Impl/POHeaderServiceImpl.java +++ b/src/main/java/com/xujie/modules/order/service/Impl/POHeaderServiceImpl.java @@ -9,7 +9,11 @@ import com.xujie.common.utils.PageUtils; import com.xujie.modules.order.dao.POHeaderMapper; import com.xujie.modules.order.entity.POHeader; import com.xujie.modules.order.service.Iface.IPOHeaderService; +import com.xujie.modules.srm.mapper.SrmSupplierMapper; +import com.xujie.modules.sys.entity.SysUserEntity; import org.apache.commons.collections4.CollectionUtils; +import org.apache.shiro.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,21 +31,37 @@ import java.util.List; @Service public class POHeaderServiceImpl extends ServiceImpl implements IPOHeaderService { + @Autowired + private SrmSupplierMapper srmSupplierMapper; @Override @Transactional public void saveModel(POHeader model){ + if(model.getId() != null){ baseMapper.updateById(model); return; } - //PONO生成规则(PO2026-0001) - String orderNo = "PO" + LocalDate.now().getYear() + "-" + baseMapper.getMaxPO(); - model.setOrderNo(orderNo+1); - + + // 如果 site 为空,默认使用当前用户的 site + if(model.getSite() == null || model.getSite().isEmpty()){ + SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); + if(currentUser == null || currentUser.getSite() == null){ + throw new RuntimeException("无法获取当前用户站点信息"); + } + model.setSite(currentUser.getSite()); + } + + String orderNo = generatePoNo(model.getSite()); + model.setOrderNo(orderNo); baseMapper.insert(model); } + private String generatePoNo(String site) { + srmSupplierMapper.updateTransNo(site, "PO"); + return srmSupplierMapper.getTransNo(site, "PO"); + } + @Override public List getListByModel(POHeader query){ return baseMapper.getListByModel(query); diff --git a/src/main/java/com/xujie/modules/order/vo/PODetailVo.java b/src/main/java/com/xujie/modules/order/vo/PODetailVo.java index 3f10dc5..3a38dcd 100644 --- a/src/main/java/com/xujie/modules/order/vo/PODetailVo.java +++ b/src/main/java/com/xujie/modules/order/vo/PODetailVo.java @@ -1,6 +1,7 @@ package com.xujie.modules.order.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.xujie.common.utils.QueryPage; import io.swagger.annotations.ApiModel; @@ -259,6 +260,7 @@ public class PODetailVo extends QueryPage { private Double invNotifyQty; + @TableField(value = "po_header_id", jdbcType = org.apache.ibatis.type.JdbcType.INTEGER) private Integer poHeaderId; diff --git a/src/main/resources/mapper/order/PODetailMapper.xml b/src/main/resources/mapper/order/PODetailMapper.xml index 0d0076f..ad7f514 100644 --- a/src/main/resources/mapper/order/PODetailMapper.xml +++ b/src/main/resources/mapper/order/PODetailMapper.xml @@ -394,85 +394,85 @@ INNER JOIN ( SELECT - #{item.id} AS id, - #{item.orderNo} AS order_no, - #{item.site} AS site, - #{item.itemNo} AS item_no, - #{item.partNo} AS part_no, - #{item.status} AS status, - #{item.qty} AS qty, - #{item.umid} AS umid, - #{item.convertFactor} AS convert_factor, - #{item.price} AS price, - #{item.basePrice} AS base_price, - #{item.wantReceiveDate} AS want_receive_date, - #{item.taxRate} AS tax_rate, - #{item.tax} AS tax, - #{item.additionalCost} AS additional_cost, - #{item.freight} AS freight, - #{item.duty} AS duty, - #{item.arriveQty} AS arrive_qty, - #{item.receiveQty} AS receive_qty, - #{item.qtyReturned} AS qty_returned, - #{item.qtyReplace} AS qty_replace, - #{item.qtyScrapt} AS qty_scrapt, - #{item.invoiceQty} AS invoice_qty, - #{item.approveResult} AS approve_result, - #{item.needInspectFlag} AS need_inspect_flag, - #{item.remark} AS remark, - #{item.iqcQty} AS iqc_qty, - #{item.lastUpdateBy} AS last_update_by, - #{item.prConvertNote} AS pr_convert_note, - #{item.inspectTypeDb} AS inspect_type_db, - #{item.inspectType} AS inspect_type, - #{item.inspectQty} AS inspect_qty, - #{item.inspectPercent} AS inspect_percent, - #{item.inspectionLevelNo} AS inspection_level_no, - #{item.closeTolerance} AS close_tolerance, - #{item.overReceiveTolerance} AS over_receive_tolerance, - #{item.item} AS item, - #{item.value} AS c_value, - #{item.shipQty} AS c_ship_qty, - #{item.sumPrice} AS c_sum_price, - #{item.narrival} AS c_narrival, - #{item.crd} AS c_crd, - #{item.inspection} AS c_inspection, - #{item.realCrd} AS c_real_crd, - #{item.eta} AS c_eta, - #{item.flexid} AS c_flexid, - #{item.obd} AS c_obd, - #{item.docSent} AS c_doc_sent, - #{item.telexRelease} AS c_telex_release, - #{item.advancePayment} AS c_advance_payment, - #{item.advancePaid} AS c_advance_paid, - #{item.createTime} AS create_time, - #{item.planner} AS c_planner, - #{item.edit} AS c_edit, - #{item.endPlanner} AS c_end_planner, - #{item.remarkDelay} AS c_remark_delay, - #{item.qtyCancelled} AS qty_cancelled, - #{item.inspectMethodDb} AS inspect_method_db, - #{item.toInvNofityQty} AS to_inv_nofity_qty, - #{item.uploadDate} AS upload_date, - #{item.orderRef1} AS order_ref1, - #{item.orderRef5} AS order_ref5, - #{item.batchNo} AS batch_no, - #{item.orderRef4} AS order_ref4, - #{item.prePayAmount} AS pre_pay_amount, - #{item.uploadBy} AS upload_by, - #{item.purLeadTime} AS pur_lead_time, - #{item.orderRefType} AS order_ref_type, - #{item.orderRef3} AS order_ref3, - #{item.needReceiveFlag} AS need_receive_flag, - #{item.uploadFlag} AS upload_flag, - #{item.prePayReverseAmount} AS pre_pay_reverse_amount, - #{item.outWorkOrderFlag} AS out_work_order_flag, - #{item.orderRef2} AS order_ref2, - #{item.qtyRbjs} AS qty_rbjs, - #{item.prePayPayAmount} AS pre_pay_pay_amount, - #{item.needDate} AS need_date, - #{item.inspectMethod} AS inspect_method, - #{item.invNotifyQty} AS inv_notify_qty + CAST(#{item.id} AS INT) AS id, + CAST(#{item.orderNo} AS VARCHAR(15)) AS order_no, + CAST(#{item.site} AS VARCHAR(4)) AS site, + CAST(#{item.itemNo} AS INT) AS item_no, + CAST(#{item.partNo} AS VARCHAR(30)) AS part_no, + CAST(#{item.status} AS VARCHAR(10)) AS status, + CAST(#{item.qty} AS DECIMAL(20,6)) AS qty, + CAST(#{item.umid} AS VARCHAR(8)) AS umid, + CAST(#{item.convertFactor} AS DECIMAL(20,6)) AS convert_factor, + CAST(#{item.price} AS DECIMAL(20,6)) AS price, + CAST(#{item.basePrice} AS DECIMAL(20,6)) AS base_price, + CAST(#{item.wantReceiveDate} AS DATETIME) AS want_receive_date, + CAST(#{item.taxRate} AS DECIMAL(20,6)) AS tax_rate, + CAST(#{item.tax} AS DECIMAL(20,6)) AS tax, + CAST(#{item.additionalCost} AS DECIMAL(20,6)) AS additional_cost, + CAST(#{item.freight} AS DECIMAL(20,6)) AS freight, + CAST(#{item.duty} AS DECIMAL(20,6)) AS duty, + CAST(#{item.arriveQty} AS DECIMAL(20,6)) AS arrive_qty, + CAST(#{item.receiveQty} AS DECIMAL(20,6)) AS receive_qty, + CAST(#{item.qtyReturned} AS DECIMAL(20,6)) AS qty_returned, + CAST(#{item.qtyReplace} AS DECIMAL(20,6)) AS qty_replace, + CAST(#{item.qtyScrapt} AS DECIMAL(20,6)) AS qty_scrapt, + CAST(#{item.invoiceQty} AS DECIMAL(20,6)) AS invoice_qty, + CAST(#{item.approveResult} AS CHAR(1)) AS approve_result, + CAST(#{item.needInspectFlag} AS CHAR(1)) AS need_inspect_flag, + CAST(#{item.remark} AS VARCHAR(400)) AS remark, + CAST(#{item.iqcQty} AS DECIMAL(20,6)) AS iqc_qty, + CAST(#{item.lastUpdateBy} AS VARCHAR(20)) AS last_update_by, + CAST(#{item.prConvertNote} AS VARCHAR(200)) AS pr_convert_note, + CAST(#{item.inspectTypeDb} AS CHAR(1)) AS inspect_type_db, + CAST(#{item.inspectType} AS VARCHAR(40)) AS inspect_type, + CAST(#{item.inspectQty} AS DECIMAL(20,6)) AS inspect_qty, + CAST(#{item.inspectPercent} AS DECIMAL(20,6)) AS inspect_percent, + CAST(#{item.inspectionLevelNo} AS VARCHAR(20)) AS inspection_level_no, + CAST(#{item.closeTolerance} AS DECIMAL(20,6)) AS close_tolerance, + CAST(#{item.overReceiveTolerance} AS DECIMAL(20,6)) AS over_receive_tolerance, + CAST(#{item.item} AS VARCHAR(64)) AS item, + CAST(#{item.value} AS VARCHAR(50)) AS c_value, + CAST(#{item.shipQty} AS INT) AS c_ship_qty, + CAST(#{item.sumPrice} AS DECIMAL(20,6)) AS c_sum_price, + CAST(#{item.narrival} AS DATETIME) AS c_narrival, + CAST(#{item.crd} AS DATETIME) AS c_crd, + CAST(#{item.inspection} AS DATETIME) AS c_inspection, + CAST(#{item.realCrd} AS DATETIME) AS c_real_crd, + CAST(#{item.eta} AS DATETIME) AS c_eta, + CAST(#{item.flexid} AS VARCHAR(50)) AS c_flexid, + CAST(#{item.obd} AS DATETIME) AS c_obd, + CAST(#{item.docSent} AS CHAR(1)) AS c_doc_sent, + CAST(#{item.telexRelease} AS CHAR(1)) AS c_telex_release, + CAST(#{item.advancePayment} AS CHAR(1)) AS c_advance_payment, + CAST(#{item.advancePaid} AS CHAR(1)) AS c_advance_paid, + CAST(#{item.createTime} AS DATETIME) AS create_time, + CAST(#{item.planner} AS VARCHAR(50)) AS c_planner, + CAST(#{item.edit} AS DATETIME) AS c_edit, + CAST(#{item.endPlanner} AS VARCHAR(50)) AS c_end_planner, + CAST(#{item.remarkDelay} AS VARCHAR(255)) AS c_remark_delay, + CAST(#{item.qtyCancelled} AS DECIMAL(20,6)) AS qty_cancelled, + CAST(#{item.inspectMethodDb} AS CHAR(1)) AS inspect_method_db, + CAST(#{item.toInvNofityQty} AS DECIMAL(20,6)) AS to_inv_nofity_qty, + CAST(#{item.uploadDate} AS DATETIME) AS upload_date, + CAST(#{item.orderRef1} AS VARCHAR(20)) AS order_ref1, + CAST(#{item.orderRef5} AS VARCHAR(20)) AS order_ref5, + CAST(#{item.batchNo} AS VARCHAR(18)) AS batch_no, + CAST(#{item.orderRef4} AS VARCHAR(20)) AS order_ref4, + CAST(#{item.prePayAmount} AS DECIMAL(20,6)) AS pre_pay_amount, + CAST(#{item.uploadBy} AS VARCHAR(50)) AS upload_by, + CAST(#{item.purLeadTime} AS DECIMAL(20,6)) AS pur_lead_time, + CAST(#{item.orderRefType} AS VARCHAR(20)) AS order_ref_type, + CAST(#{item.orderRef3} AS VARCHAR(20)) AS order_ref3, + CAST(#{item.needReceiveFlag} AS CHAR(1)) AS need_receive_flag, + CAST(#{item.uploadFlag} AS CHAR(1)) AS upload_flag, + CAST(#{item.prePayReverseAmount} AS DECIMAL(20,6)) AS pre_pay_reverse_amount, + CAST(#{item.outWorkOrderFlag} AS CHAR(1)) AS out_work_order_flag, + CAST(#{item.orderRef2} AS VARCHAR(20)) AS order_ref2, + CAST(#{item.qtyRbjs} AS DECIMAL(20,6)) AS qty_rbjs, + CAST(#{item.prePayPayAmount} AS DECIMAL(20,6)) AS pre_pay_pay_amount, + CAST(#{item.needDate} AS DATETIME) AS need_date, + CAST(#{item.inspectMethod} AS VARCHAR(20)) AS inspect_method, + CAST(#{item.invNotifyQty} AS DECIMAL(20,6)) AS inv_notify_qty ) t ON pd.id = t.id @@ -499,5 +499,5 @@ AND site = #{site} AND item = #{item} - +