From caa8eecb005e807675d493924573e47e91fe64cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Tue, 14 Jul 2026 16:36:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=96=99=E5=A4=A7=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SupplierPartMoqPriceController.java | 97 ++++ .../data/SupplierPartMoqPriceQueryVo.java | 23 + .../supplier/data/SupplierPartMoqPriceVo.java | 34 ++ ...lierPartTierPriceHistoryDetailQueryVo.java | 16 + ...pplierPartTierPriceHistoryMainQueryVo.java | 24 + .../SupplierPartTierPriceHistoryMainVo.java | 51 ++ .../SupplierPartTierPriceHistoryQueryVo.java | 24 + .../data/SupplierPartTierPriceHistoryVo.java | 47 ++ .../data/SupplierPartTierPriceItemVo.java | 31 ++ .../data/SupplierPartTierPriceQueryVo.java | 18 + .../data/SupplierPartTierPriceSaveVo.java | 31 ++ .../SupplierPartTierPriceUploadErrorVo.java | 16 + ...ierPartTierPriceUploadPreviewResultVo.java | 23 + .../SupplierPartTierPriceUploadPreviewVo.java | 27 ++ .../mapper/SupplierPartMoqPriceMapper.java | 91 ++++ .../service/ISupplierPartMoqPriceService.java | 44 ++ .../impl/SupplierPartMoqPriceServiceImpl.java | 437 ++++++++++++++++++ .../supplier/SupplierPartMoqPriceMapper.xml | 340 ++++++++++++++ 18 files changed, 1374 insertions(+) create mode 100644 src/main/java/com/xujie/modules/supplier/controller/SupplierPartMoqPriceController.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryDetailQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceItemVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceSaveVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadErrorVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewResultVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/mapper/SupplierPartMoqPriceMapper.java create mode 100644 src/main/java/com/xujie/modules/supplier/service/ISupplierPartMoqPriceService.java create mode 100644 src/main/java/com/xujie/modules/supplier/service/impl/SupplierPartMoqPriceServiceImpl.java create mode 100644 src/main/resources/mapper/supplier/SupplierPartMoqPriceMapper.xml diff --git a/src/main/java/com/xujie/modules/supplier/controller/SupplierPartMoqPriceController.java b/src/main/java/com/xujie/modules/supplier/controller/SupplierPartMoqPriceController.java new file mode 100644 index 0000000..12bc876 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/controller/SupplierPartMoqPriceController.java @@ -0,0 +1,97 @@ +package com.xujie.modules.supplier.controller; + +import com.xujie.common.utils.R; +import com.xujie.modules.supplier.data.SupplierPartMoqPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartMoqPriceVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryDetailQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceSaveVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadPreviewVo; +import com.xujie.modules.supplier.service.ISupplierPartMoqPriceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description 供应商物料MOQ与阶梯价维护Controller - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Api(tags = "供应商物料MOQ与阶梯价") +@RestController +@RequestMapping("/supplier/supplierPartMoqPrice") +public class SupplierPartMoqPriceController { + + @Autowired + private ISupplierPartMoqPriceService supplierPartMoqPriceService; + + @PostMapping("/listSupplierPart") + @ApiOperation("查询供应商可供物料与MOQ") + public R listSupplierPart(@RequestBody SupplierPartMoqPriceQueryVo query) { + return R.ok().put("rows", supplierPartMoqPriceService.listSupplierPartMoq(query)); + } + + @PostMapping("/saveSupplierPart") + @ApiOperation("保存供应商可供物料与MOQ") + public R saveSupplierPart(@RequestBody SupplierPartMoqPriceVo data) { + supplierPartMoqPriceService.saveSupplierPartMoq(data); + return R.ok(); + } + + @PostMapping("/addSupplierPart") + @ApiOperation("新增供应商可供物料") + public R addSupplierPart(@RequestBody SupplierPartMoqPriceVo data) { + supplierPartMoqPriceService.addSupplierPartMoq(data); + return R.ok(); + } + + @PostMapping("/listCurrentTierPrice") + @ApiOperation("查询当前生效阶梯价") + public R listCurrentTierPrice(@RequestBody SupplierPartTierPriceQueryVo query) { + return R.ok().put("rows", supplierPartMoqPriceService.listCurrentTierPrice(query)); + } + + @PostMapping("/saveTierPrice") + @ApiOperation("保存阶梯价(先历史后当前)") + public R saveTierPrice(@RequestBody SupplierPartTierPriceSaveVo data) { + supplierPartMoqPriceService.saveTierPrice(data); + return R.ok(); + } + + @PostMapping("/uploadPreview") + @ApiOperation("上传阶梯价预校验") + public R uploadPreview(@RequestBody SupplierPartTierPriceUploadPreviewVo data) { + return R.ok().put("row", supplierPartMoqPriceService.uploadPreview(data)); + } + + @PostMapping("/uploadConfirm") + @ApiOperation("上传阶梯价确认落库") + public R uploadConfirm(@RequestBody SupplierPartTierPriceSaveVo data) { + supplierPartMoqPriceService.uploadConfirm(data); + return R.ok(); + } + + @PostMapping("/listTierPriceHistory") + @ApiOperation("查询阶梯价历史") + public R listTierPriceHistory(@RequestBody SupplierPartTierPriceHistoryQueryVo query) { + return R.ok().put("rows", supplierPartMoqPriceService.listTierPriceHistory(query)); + } + + @PostMapping("/listTierPriceHistoryMain") + @ApiOperation("查询阶梯价历史主记录") + public R listTierPriceHistoryMain(@RequestBody SupplierPartTierPriceHistoryMainQueryVo query) { + return R.ok().put("rows", supplierPartMoqPriceService.listTierPriceHistoryMain(query)); + } + + @PostMapping("/listTierPriceHistoryDetail") + @ApiOperation("按主记录查询阶梯价历史明细") + public R listTierPriceHistoryDetail(@RequestBody SupplierPartTierPriceHistoryDetailQueryVo query) { + return R.ok().put("rows", supplierPartMoqPriceService.listTierPriceHistoryDetail(query)); + } +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceQueryVo.java new file mode 100644 index 0000000..4db153b --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceQueryVo.java @@ -0,0 +1,23 @@ +package com.xujie.modules.supplier.data; + +import com.xujie.common.utils.QueryPage; +import lombok.Data; + +/** + * @Description 供应商物料MOQ查询入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartMoqPriceQueryVo extends QueryPage { + + private String site; + + private String supplierCode; + + private String partNo; + + private String partDesc; + + private String active; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceVo.java new file mode 100644 index 0000000..bdd5dbc --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartMoqPriceVo.java @@ -0,0 +1,34 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Description 供应商可供物料与MOQ数据 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartMoqPriceVo { + + private Integer id; + + private String site; + + private String supplierCode; + + private String supplierName; + + private String partNo; + + private String partDesc; + + private BigDecimal moq; + + private String currency; + + private String currencyDesc; + + private String active; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryDetailQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryDetailQueryVo.java new file mode 100644 index 0000000..df751f5 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryDetailQueryVo.java @@ -0,0 +1,16 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +/** + * @Description 阶梯价历史明细查询入参(按主记录) - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceHistoryDetailQueryVo { + + private String site; + + private Long historyMainId; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainQueryVo.java new file mode 100644 index 0000000..84e6fe2 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainQueryVo.java @@ -0,0 +1,24 @@ +package com.xujie.modules.supplier.data; + +import com.xujie.common.utils.QueryPage; +import lombok.Data; + +/** + * @Description 阶梯价历史主记录查询入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceHistoryMainQueryVo extends QueryPage { + + private String site; + + private String supplierCode; + + private String partNo; + + /** + * 价格日期(yyyy-MM-dd) + */ + private String priceDate; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainVo.java new file mode 100644 index 0000000..7747884 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryMainVo.java @@ -0,0 +1,51 @@ +package com.xujie.modules.supplier.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @Description 阶梯价历史主记录 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceHistoryMainVo { + + private Long id; + + private String site; + + private String supplierCode; + + private String supplierName; + + private String partNo; + + private String partDesc; + + private String versionNo; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date submitDate; + + /** + * 上传日期(yyyy-MM-dd,不带时分秒) + */ + private String submitDateOnly; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date priceDate; + + private String submitBy; + + private String attachmentRefs; + + private String currency; + + private String currencyDesc; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryQueryVo.java new file mode 100644 index 0000000..e499850 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryQueryVo.java @@ -0,0 +1,24 @@ +package com.xujie.modules.supplier.data; + +import com.xujie.common.utils.QueryPage; +import lombok.Data; + +/** + * @Description 阶梯价历史查询入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceHistoryQueryVo extends QueryPage { + + private String site; + + private String supplierCode; + + private String partNo; + + /** + * 价格日期(yyyy-MM-dd) + */ + private String priceDate; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryVo.java new file mode 100644 index 0000000..b723833 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceHistoryVo.java @@ -0,0 +1,47 @@ +package com.xujie.modules.supplier.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Description 阶梯价历史明细 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceHistoryVo { + + private Long historyMainId; + + private String versionNo; + + private String site; + + private String supplierCode; + + private String partNo; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date submitDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date priceDate; + + private String submitBy; + + private String attachmentRefs; + + private BigDecimal qtyStart; + + private BigDecimal qtyEnd; + + private BigDecimal unitPrice; + + private String remark; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceItemVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceItemVo.java new file mode 100644 index 0000000..57c7d90 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceItemVo.java @@ -0,0 +1,31 @@ +package com.xujie.modules.supplier.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Description 供应商物料阶梯价行数据 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceItemVo { + + private BigDecimal qtyStart; + + private BigDecimal qtyEnd; + + private BigDecimal unitPrice; + + private String remark; + + private String attachmentRefs; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date priceDate; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceQueryVo.java new file mode 100644 index 0000000..36166f8 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceQueryVo.java @@ -0,0 +1,18 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +/** + * @Description 供应商物料当前阶梯价查询入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceQueryVo { + + private String site; + + private String supplierCode; + + private String partNo; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceSaveVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceSaveVo.java new file mode 100644 index 0000000..f41eff4 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceSaveVo.java @@ -0,0 +1,31 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +import java.util.List; + +/** + * @Description 供应商物料阶梯价保存入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceSaveVo { + + private String site; + + private String supplierCode; + + private String partNo; + + /** + * 价格日期(yyyy-MM-dd) + */ + private String priceDate; + + private String attachmentRefs; + + private String submitBy; + + private List tierPriceList; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadErrorVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadErrorVo.java new file mode 100644 index 0000000..01bec95 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadErrorVo.java @@ -0,0 +1,16 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +/** + * @Description 阶梯价上传行错误信息 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceUploadErrorVo { + + private Integer rowNo; + + private String message; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewResultVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewResultVo.java new file mode 100644 index 0000000..572f269 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewResultVo.java @@ -0,0 +1,23 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description 阶梯价上传预校验结果 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceUploadPreviewResultVo { + + private Integer successCount = 0; + + private Integer failCount = 0; + + private List rows = new ArrayList<>(); + + private List rowErrors = new ArrayList<>(); +} diff --git a/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewVo.java b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewVo.java new file mode 100644 index 0000000..aef9e38 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/SupplierPartTierPriceUploadPreviewVo.java @@ -0,0 +1,27 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +import java.util.List; + +/** + * @Description 阶梯价上传预校验入参 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Data +public class SupplierPartTierPriceUploadPreviewVo { + + private String site; + + private String supplierCode; + + private String partNo; + + /** + * 价格日期(yyyy-MM-dd) + */ + private String priceDate; + + private List rows; +} diff --git a/src/main/java/com/xujie/modules/supplier/mapper/SupplierPartMoqPriceMapper.java b/src/main/java/com/xujie/modules/supplier/mapper/SupplierPartMoqPriceMapper.java new file mode 100644 index 0000000..6598e23 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/mapper/SupplierPartMoqPriceMapper.java @@ -0,0 +1,91 @@ +package com.xujie.modules.supplier.mapper; + +import com.xujie.modules.supplier.data.SupplierPartMoqPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartMoqPriceVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryDetailQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceItemVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * @Description 供应商物料MOQ与阶梯价Mapper - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Mapper +public interface SupplierPartMoqPriceMapper { + + List listSupplierPartMoq(@Param("query") SupplierPartMoqPriceQueryVo query); + + Integer countSupplierPart(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo); + + Integer countSupplierByNo(@Param("site") String site, + @Param("supplierCode") String supplierCode); + + Integer countPartByNo(@Param("site") String site, + @Param("partNo") String partNo); + + String getSupplierCurrency(@Param("site") String site, + @Param("supplierCode") String supplierCode); + + String getSupplierPartCurrency(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo); + + int updateSupplierPartMoq(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo, + @Param("moq") BigDecimal moq, + @Param("active") String active); + + int insertSupplierPartMoq(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo, + @Param("moq") BigDecimal moq, + @Param("active") String active, + @Param("currency") String currency); + + List listCurrentTierPrice(@Param("query") SupplierPartTierPriceQueryVo query); + + int deleteCurrentTierPrice(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo); + + int insertCurrentTierPriceBatch(@Param("site") String site, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo, + @Param("priceDate") String priceDate, + @Param("attachmentRefs") String attachmentRefs, + @Param("submitBy") String submitBy, + @Param("list") List list); + + int insertHistoryTierPriceMain(SupplierPartTierPriceHistoryMainVo mainVo); + + int insertHistoryTierPriceBatch(@Param("site") String site, + @Param("historyMainId") Long historyMainId, + @Param("supplierCode") String supplierCode, + @Param("partNo") String partNo, + @Param("versionNo") String versionNo, + @Param("submitDate") Date submitDate, + @Param("priceDate") String priceDate, + @Param("attachmentRefs") String attachmentRefs, + @Param("submitBy") String submitBy, + @Param("list") List list); + + List listTierPriceHistory(@Param("query") SupplierPartTierPriceHistoryQueryVo query); + + List listTierPriceHistoryMain(@Param("query") SupplierPartTierPriceHistoryMainQueryVo query); + + List listTierPriceHistoryDetail(@Param("query") SupplierPartTierPriceHistoryDetailQueryVo query); +} diff --git a/src/main/java/com/xujie/modules/supplier/service/ISupplierPartMoqPriceService.java b/src/main/java/com/xujie/modules/supplier/service/ISupplierPartMoqPriceService.java new file mode 100644 index 0000000..c9f848c --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/service/ISupplierPartMoqPriceService.java @@ -0,0 +1,44 @@ +package com.xujie.modules.supplier.service; + +import com.xujie.modules.supplier.data.SupplierPartMoqPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartMoqPriceVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryDetailQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceItemVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceSaveVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadPreviewResultVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadPreviewVo; + +import java.util.List; + +/** + * @Description 供应商物料MOQ与阶梯价服务接口 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +public interface ISupplierPartMoqPriceService { + + List listSupplierPartMoq(SupplierPartMoqPriceQueryVo query); + + void addSupplierPartMoq(SupplierPartMoqPriceVo data); + + void saveSupplierPartMoq(SupplierPartMoqPriceVo data); + + List listCurrentTierPrice(SupplierPartTierPriceQueryVo query); + + void saveTierPrice(SupplierPartTierPriceSaveVo data); + + SupplierPartTierPriceUploadPreviewResultVo uploadPreview(SupplierPartTierPriceUploadPreviewVo data); + + void uploadConfirm(SupplierPartTierPriceSaveVo data); + + List listTierPriceHistory(SupplierPartTierPriceHistoryQueryVo query); + + List listTierPriceHistoryMain(SupplierPartTierPriceHistoryMainQueryVo query); + + List listTierPriceHistoryDetail(SupplierPartTierPriceHistoryDetailQueryVo query); +} diff --git a/src/main/java/com/xujie/modules/supplier/service/impl/SupplierPartMoqPriceServiceImpl.java b/src/main/java/com/xujie/modules/supplier/service/impl/SupplierPartMoqPriceServiceImpl.java new file mode 100644 index 0000000..03956ad --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/service/impl/SupplierPartMoqPriceServiceImpl.java @@ -0,0 +1,437 @@ +package com.xujie.modules.supplier.service.impl; + +import com.xujie.modules.supplier.data.SupplierPartMoqPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartMoqPriceVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryMainVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceHistoryDetailQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceItemVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceQueryVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceSaveVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadErrorVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadPreviewResultVo; +import com.xujie.modules.supplier.data.SupplierPartTierPriceUploadPreviewVo; +import com.xujie.modules.supplier.mapper.SupplierPartMoqPriceMapper; +import com.xujie.modules.supplier.service.ISupplierPartMoqPriceService; +import com.xujie.modules.sys.entity.SysUserEntity; +import lombok.extern.slf4j.Slf4j; +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; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +/** + * @Description 供应商物料MOQ与阶梯价服务实现 - rqrq + * @author rqrq + * @date 2026/07/14 + */ +@Slf4j +@Service +public class SupplierPartMoqPriceServiceImpl implements ISupplierPartMoqPriceService { + + @Autowired + private SupplierPartMoqPriceMapper supplierPartMoqPriceMapper; + + @Override + public List listSupplierPartMoq(SupplierPartMoqPriceQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + validateSite(query.getSite()); + if (!StringUtils.hasText(query.getSupplierCode())) { + throw new RuntimeException("供应商编码不能为空"); + } + query.setSite(query.getSite().trim()); + query.setSupplierCode(normalizeCode(query.getSupplierCode())); + if (StringUtils.hasText(query.getPartNo())) { + query.setPartNo(normalizeCode(query.getPartNo())); + } + if (StringUtils.hasText(query.getPartDesc())) { + query.setPartDesc(query.getPartDesc().trim()); + } + return supplierPartMoqPriceMapper.listSupplierPartMoq(query); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addSupplierPartMoq(SupplierPartMoqPriceVo data) { + if (data == null) { + throw new RuntimeException("保存参数不能为空"); + } + validateSite(data.getSite()); + if (!StringUtils.hasText(data.getSupplierCode())) { + throw new RuntimeException("供应商编码不能为空"); + } + if (!StringUtils.hasText(data.getPartNo())) { + throw new RuntimeException("物料编码不能为空"); + } + BigDecimal moq = data.getMoq() == null ? BigDecimal.ZERO : data.getMoq(); + if (moq.compareTo(BigDecimal.ZERO) < 0) { + throw new RuntimeException("MOQ不能小于0"); + } + String active = StringUtils.hasText(data.getActive()) ? data.getActive().trim() : "Y"; + String site = data.getSite().trim(); + String supplierCode = normalizeCode(data.getSupplierCode()); + String partNo = normalizeCode(data.getPartNo()); + Integer supplierCount = supplierPartMoqPriceMapper.countSupplierByNo(site, supplierCode); + if (supplierCount == null || supplierCount <= 0) { + throw new RuntimeException("供应商不存在"); + } + Integer partCount = supplierPartMoqPriceMapper.countPartByNo(site, partNo); + if (partCount == null || partCount <= 0) { + throw new RuntimeException("物料不存在"); + } + String supplierCurrency = normalizeCurrency(supplierPartMoqPriceMapper.getSupplierCurrency(site, supplierCode)); + if (!StringUtils.hasText(supplierCurrency)) { + supplierCurrency = "CNY"; + } + Integer relationCount = supplierPartMoqPriceMapper.countSupplierPart(site, supplierCode, partNo); + if (relationCount != null && relationCount > 0) { + throw new RuntimeException("供应商+物料已存在,请勿重复新增"); + } + supplierPartMoqPriceMapper.insertSupplierPartMoq(site, supplierCode, partNo, moq, active, supplierCurrency); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveSupplierPartMoq(SupplierPartMoqPriceVo data) { + if (data == null) { + throw new RuntimeException("保存参数不能为空"); + } + validateSite(data.getSite()); + if (!StringUtils.hasText(data.getSupplierCode())) { + throw new RuntimeException("供应商编码不能为空"); + } + if (!StringUtils.hasText(data.getPartNo())) { + throw new RuntimeException("物料编码不能为空"); + } + if (data.getMoq() == null) { + throw new RuntimeException("MOQ不能为空"); + } + if (data.getMoq().compareTo(BigDecimal.ZERO) < 0) { + throw new RuntimeException("MOQ不能小于0"); + } + String active = StringUtils.hasText(data.getActive()) ? data.getActive().trim() : "Y"; + String site = data.getSite().trim(); + String supplierCode = normalizeCode(data.getSupplierCode()); + String partNo = normalizeCode(data.getPartNo()); + Integer relationCount = supplierPartMoqPriceMapper.countSupplierPart(site, supplierCode, partNo); + if (relationCount == null || relationCount <= 0) { + throw new RuntimeException("供应商+物料不存在,请先新增"); + } + supplierPartMoqPriceMapper.updateSupplierPartMoq(site, supplierCode, partNo, data.getMoq(), active); + } + + @Override + public List listCurrentTierPrice(SupplierPartTierPriceQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + validateTierPriceBase(query.getSite(), query.getSupplierCode(), query.getPartNo()); + query.setSite(query.getSite().trim()); + query.setSupplierCode(query.getSupplierCode().trim()); + query.setPartNo(query.getPartNo().trim()); + return supplierPartMoqPriceMapper.listCurrentTierPrice(query); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveTierPrice(SupplierPartTierPriceSaveVo data) { + if (data == null) { + throw new RuntimeException("保存参数不能为空"); + } + validateTierPriceBase(data.getSite(), data.getSupplierCode(), data.getPartNo()); + if (!StringUtils.hasText(data.getPriceDate())) { + throw new RuntimeException("价格日期不能为空"); + } + List normalizedRows = normalizeTierPriceList(data.getTierPriceList()); + String site = data.getSite().trim(); + String supplierCode = data.getSupplierCode().trim(); + String partNo = data.getPartNo().trim(); + String submitBy = resolveSubmitBy(data.getSubmitBy()); + String attachmentRefs = StringUtils.hasText(data.getAttachmentRefs()) ? data.getAttachmentRefs().trim() : ""; + String versionNo = generateVersionNo(); + Date submitDate = new Date(); + String historyCurrency = normalizeCurrency(supplierPartMoqPriceMapper.getSupplierPartCurrency(site, supplierCode, partNo)); + if (!StringUtils.hasText(historyCurrency)) { + historyCurrency = normalizeCurrency(supplierPartMoqPriceMapper.getSupplierCurrency(site, supplierCode)); + } + + // 先写历史,再替换当前 - rqrq + SupplierPartTierPriceHistoryMainVo historyMainVo = new SupplierPartTierPriceHistoryMainVo(); + historyMainVo.setSite(site); + historyMainVo.setSupplierCode(supplierCode); + historyMainVo.setPartNo(partNo); + historyMainVo.setVersionNo(versionNo); + historyMainVo.setSubmitDate(submitDate); + historyMainVo.setPriceDate(parseDate(data.getPriceDate().trim())); + historyMainVo.setSubmitBy(submitBy); + historyMainVo.setAttachmentRefs(attachmentRefs); + historyMainVo.setCurrency(historyCurrency); + supplierPartMoqPriceMapper.insertHistoryTierPriceMain(historyMainVo); + if (historyMainVo.getId() == null) { + throw new RuntimeException("历史主记录写入失败"); + } + supplierPartMoqPriceMapper.insertHistoryTierPriceBatch( + site, + historyMainVo.getId(), + supplierCode, + partNo, + versionNo, + submitDate, + data.getPriceDate().trim(), + attachmentRefs, + submitBy, + normalizedRows + ); + supplierPartMoqPriceMapper.deleteCurrentTierPrice(site, supplierCode, partNo); + supplierPartMoqPriceMapper.insertCurrentTierPriceBatch( + site, + supplierCode, + partNo, + data.getPriceDate().trim(), + attachmentRefs, + submitBy, + normalizedRows + ); + } + + @Override + public SupplierPartTierPriceUploadPreviewResultVo uploadPreview(SupplierPartTierPriceUploadPreviewVo data) { + if (data == null) { + throw new RuntimeException("上传参数不能为空"); + } + validateTierPriceBase(data.getSite(), data.getSupplierCode(), data.getPartNo()); + if (!StringUtils.hasText(data.getPriceDate())) { + throw new RuntimeException("价格日期不能为空"); + } + if (CollectionUtils.isEmpty(data.getRows())) { + throw new RuntimeException("上传内容不能为空"); + } + SupplierPartTierPriceUploadPreviewResultVo result = new SupplierPartTierPriceUploadPreviewResultVo(); + List successRows = new ArrayList<>(); + List successRowNos = new ArrayList<>(); + for (int i = 0; i < data.getRows().size(); i++) { + SupplierPartTierPriceItemVo row = data.getRows().get(i); + Integer rowNo = i + 1; + String errMsg = validateUploadRow(row); + if (StringUtils.hasText(errMsg)) { + SupplierPartTierPriceUploadErrorVo errorVo = new SupplierPartTierPriceUploadErrorVo(); + errorVo.setRowNo(rowNo); + errorVo.setMessage(errMsg); + result.getRowErrors().add(errorVo); + continue; + } + SupplierPartTierPriceItemVo normalizedRow = normalizeTierRow(row); + String overlapMsg = validateRangeOverlapForPreview(normalizedRow, successRows, successRowNos); + if (StringUtils.hasText(overlapMsg)) { + SupplierPartTierPriceUploadErrorVo errorVo = new SupplierPartTierPriceUploadErrorVo(); + errorVo.setRowNo(rowNo); + errorVo.setMessage(overlapMsg); + result.getRowErrors().add(errorVo); + continue; + } + successRows.add(normalizedRow); + successRowNos.add(rowNo); + } + successRows.sort(Comparator.comparing(SupplierPartTierPriceItemVo::getQtyStart) + .thenComparing(SupplierPartTierPriceItemVo::getQtyEnd)); + result.setRows(successRows); + result.setSuccessCount(successRows.size()); + result.setFailCount(result.getRowErrors().size()); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void uploadConfirm(SupplierPartTierPriceSaveVo data) { + saveTierPrice(data); + } + + @Override + public List listTierPriceHistory(SupplierPartTierPriceHistoryQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + validateTierPriceBase(query.getSite(), query.getSupplierCode(), query.getPartNo()); + query.setSite(query.getSite().trim()); + query.setSupplierCode(query.getSupplierCode().trim()); + query.setPartNo(query.getPartNo().trim()); + if (StringUtils.hasText(query.getPriceDate())) { + query.setPriceDate(query.getPriceDate().trim()); + } + return supplierPartMoqPriceMapper.listTierPriceHistory(query); + } + + @Override + public List listTierPriceHistoryMain(SupplierPartTierPriceHistoryMainQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + validateSite(query.getSite()); + query.setSite(query.getSite().trim()); + if (StringUtils.hasText(query.getSupplierCode())) { + query.setSupplierCode(normalizeCode(query.getSupplierCode())); + } + if (StringUtils.hasText(query.getPartNo())) { + query.setPartNo(normalizeCode(query.getPartNo())); + } + if (StringUtils.hasText(query.getPriceDate())) { + query.setPriceDate(query.getPriceDate().trim()); + } + return supplierPartMoqPriceMapper.listTierPriceHistoryMain(query); + } + + @Override + public List listTierPriceHistoryDetail(SupplierPartTierPriceHistoryDetailQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + validateSite(query.getSite()); + if (query.getHistoryMainId() == null) { + throw new RuntimeException("历史主记录ID不能为空"); + } + query.setSite(query.getSite().trim()); + return supplierPartMoqPriceMapper.listTierPriceHistoryDetail(query); + } + + private List normalizeTierPriceList(List rows) { + if (CollectionUtils.isEmpty(rows)) { + throw new RuntimeException("阶梯价格不能为空"); + } + List normalizedRows = new ArrayList<>(); + for (SupplierPartTierPriceItemVo row : rows) { + String errMsg = validateUploadRow(row); + if (StringUtils.hasText(errMsg)) { + throw new RuntimeException(errMsg); + } + normalizedRows.add(normalizeTierRow(row)); + } + normalizedRows.sort(Comparator.comparing(SupplierPartTierPriceItemVo::getQtyStart) + .thenComparing(SupplierPartTierPriceItemVo::getQtyEnd)); + validateRangeOverlapForSave(normalizedRows); + return normalizedRows; + } + + private String validateUploadRow(SupplierPartTierPriceItemVo row) { + if (row == null) { + return "数据行不能为空"; + } + if (row.getQtyStart() == null) { + return "开始数量不能为空"; + } + if (row.getQtyEnd() == null) { + return "结束数量不能为空"; + } + if (row.getQtyStart().compareTo(BigDecimal.ZERO) < 0) { + return "开始数量不能小于0"; + } + if (row.getQtyEnd().compareTo(BigDecimal.ZERO) < 0) { + return "结束数量不能小于0"; + } + if (row.getQtyStart().compareTo(row.getQtyEnd()) > 0) { + return "开始数量不能大于结束数量"; + } + if (row.getUnitPrice() == null) { + return "单价不能为空"; + } + if (row.getUnitPrice().compareTo(BigDecimal.ZERO) < 0) { + return "单价不能小于0"; + } + return ""; + } + + private SupplierPartTierPriceItemVo normalizeTierRow(SupplierPartTierPriceItemVo row) { + SupplierPartTierPriceItemVo normalizedRow = new SupplierPartTierPriceItemVo(); + normalizedRow.setQtyStart(row.getQtyStart()); + normalizedRow.setQtyEnd(row.getQtyEnd()); + normalizedRow.setUnitPrice(row.getUnitPrice()); + normalizedRow.setRemark(StringUtils.hasText(row.getRemark()) ? row.getRemark().trim() : ""); + return normalizedRow; + } + + private String validateRangeOverlapForPreview(SupplierPartTierPriceItemVo currentRow, + List existsRows, + List existsRowNos) { + for (int i = 0; i < existsRows.size(); i++) { + if (isRangeOverlap(currentRow, existsRows.get(i))) { + return "数量区间与第" + existsRowNos.get(i) + "行重叠"; + } + } + return ""; + } + + private void validateRangeOverlapForSave(List rows) { + for (int i = 1; i < rows.size(); i++) { + SupplierPartTierPriceItemVo previous = rows.get(i - 1); + SupplierPartTierPriceItemVo current = rows.get(i); + if (isRangeOverlap(previous, current)) { + throw new RuntimeException("数量区间存在重叠,请检查开始数量和结束数量"); + } + } + } + + private boolean isRangeOverlap(SupplierPartTierPriceItemVo left, SupplierPartTierPriceItemVo right) { + return left.getQtyStart().compareTo(right.getQtyEnd()) <= 0 + && right.getQtyStart().compareTo(left.getQtyEnd()) <= 0; + } + + private String resolveSubmitBy(String submitBy) { + if (StringUtils.hasText(submitBy)) { + return submitBy.trim(); + } + Object principal = SecurityUtils.getSubject().getPrincipal(); + if (principal instanceof SysUserEntity) { + return ((SysUserEntity) principal).getUsername(); + } + return "system"; + } + + private String generateVersionNo() { + return "TP" + DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now()); + } + + private Date parseDate(String dateStr) { + try { + return java.sql.Date.valueOf(dateStr); + } catch (Exception e) { + throw new RuntimeException("价格日期格式错误,应为yyyy-MM-dd"); + } + } + + private void validateTierPriceBase(String site, String supplierCode, String partNo) { + validateSite(site); + if (!StringUtils.hasText(supplierCode)) { + throw new RuntimeException("供应商编码不能为空"); + } + if (!StringUtils.hasText(partNo)) { + throw new RuntimeException("物料编码不能为空"); + } + } + + private void validateSite(String site) { + if (!StringUtils.hasText(site)) { + throw new RuntimeException("请前端传site"); + } + } + + private String normalizeCode(String value) { + return StringUtils.hasText(value) ? value.trim().toUpperCase() : ""; + } + + private String normalizeCurrency(String value) { + return StringUtils.hasText(value) ? value.trim().toUpperCase() : ""; + } +} diff --git a/src/main/resources/mapper/supplier/SupplierPartMoqPriceMapper.xml b/src/main/resources/mapper/supplier/SupplierPartMoqPriceMapper.xml new file mode 100644 index 0000000..5011cb7 --- /dev/null +++ b/src/main/resources/mapper/supplier/SupplierPartMoqPriceMapper.xml @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE SupplierforPart + SET [minOrderQty] = #{moq}, + active = #{active} + WHERE site = #{site} + AND supplier_no = #{supplierCode} + AND part_no = #{partNo} + + + + + INSERT INTO SupplierforPart + ( + site, + supplier_no, + part_no, + [minOrderQty], + active, + currency + ) + VALUES + ( + #{site}, + #{supplierCode}, + #{partNo}, + #{moq}, + #{active}, + #{currency} + ) + + + + + + + + DELETE FROM sp_current_tier_price + WHERE site = #{site} + AND supplier_code = #{supplierCode} + AND part_no = #{partNo} + + + + + INSERT INTO sp_current_tier_price + ( + site, + supplier_code, + part_no, + qty_start, + qty_end, + unit_price, + price_date, + attachment_refs, + remark, + create_by, + create_date, + update_by, + update_date + ) + VALUES + + ( + #{site}, + #{supplierCode}, + #{partNo}, + #{item.qtyStart}, + #{item.qtyEnd}, + #{item.unitPrice}, + CAST(#{priceDate} AS DATETIME), + #{attachmentRefs}, + #{item.remark}, + #{submitBy}, + GETDATE(), + #{submitBy}, + GETDATE() + ) + + + + + + INSERT INTO sp_tier_price_history_main + ( + site, + supplier_code, + part_no, + version_no, + submit_date, + price_date, + submit_by, + currency, + attachment_refs, + create_by, + create_date + ) + VALUES + ( + #{site}, + #{supplierCode}, + #{partNo}, + #{versionNo}, + #{submitDate}, + #{priceDate}, + #{submitBy}, + #{currency}, + #{attachmentRefs}, + #{submitBy}, + GETDATE() + ) + + + + + INSERT INTO sp_tier_price_history + ( + history_main_id, + site, + supplier_code, + part_no, + version_no, + submit_date, + submit_by, + qty_start, + qty_end, + unit_price, + price_date, + attachment_refs, + remark, + create_by, + create_date + ) + VALUES + + ( + #{historyMainId}, + #{site}, + #{supplierCode}, + #{partNo}, + #{versionNo}, + #{submitDate}, + #{submitBy}, + #{item.qtyStart}, + #{item.qtyEnd}, + #{item.unitPrice}, + CAST(#{priceDate} AS DATETIME), + #{attachmentRefs}, + #{item.remark}, + #{submitBy}, + GETDATE() + ) + + + + + + + + + + + + +