Browse Source

产品销售单、财务对账单、销售出库、手持机扫码出库功能接口

xuezizhuo 1 year ago
parent
commit
a47688d947
29 changed files with 2877 additions and 28 deletions
  1. 1 1
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductCodeListController.java
  2. 127 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductHandsetOutboundRecordController.java
  3. 10 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInventoryController.java
  4. 122 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInvoiceController.java
  5. 10 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductOutboundRecordController.java
  6. 449 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductHandsetOutboundRecord.java
  7. 387 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductInvoice.java
  8. 12 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductOutboundRecord.java
  9. 573 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInvoiceVO.java
  10. 77 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductHandsetOutboundRecordMapper.java
  11. 5 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInventoryMapper.java
  12. 70 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInvoiceMapper.java
  13. 10 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordMapper.java
  14. 5 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/SaleOrderMapper.java
  15. 9 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/SaleProductsMapper.java
  16. 79 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductHandsetOutboundRecordService.java
  17. 8 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInventoryService.java
  18. 79 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInvoiceService.java
  19. 1 1
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductOutboundRecordService.java
  20. 136 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductHandsetOutboundRecordServiceImpl.java
  21. 67 9
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java
  22. 185 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInvoiceServiceImpl.java
  23. 217 0
      zkqy-custom-business/src/main/resources/mapper/business/ProductHandsetOutboundRecordMapper.xml
  24. 5 0
      zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml
  25. 176 0
      zkqy-custom-business/src/main/resources/mapper/business/ProductInvoiceMapper.xml
  26. 13 14
      zkqy-custom-business/src/main/resources/mapper/business/ProductOutboundRecordMapper.xml
  27. 2 1
      zkqy-custom-business/src/main/resources/mapper/business/ProductWarehousingRecordMapper.xml
  28. 12 0
      zkqy-custom-business/src/main/resources/mapper/business/SaleOrderMapper.xml
  29. 30 2
      zkqy-custom-business/src/main/resources/mapper/business/SaleProductsMapper.xml

+ 1 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductCodeListController.java

@@ -115,7 +115,7 @@ public class ProductCodeListController extends BaseController
         productWarehousingRecord.setQrCode(vo.getQrCode());
         List<ProductWarehousingRecord> productWarehousingRecordList = productWarehousingRecordService.selectProductWarehousingRecordList(productWarehousingRecord);
         if(productWarehousingRecordList.size() > 0){
-            return AjaxResult.error("该码单已入库,不能修改!");
+            return AjaxResult.warn("该码单已入库,不能修改!");
         }
 
         return toAjax(productCodeListService.updateProductCodeList(vo));

+ 127 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductHandsetOutboundRecordController.java

@@ -0,0 +1,127 @@
+package com.zkqy.business.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.business.domain.vo.ProductCodeListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.business.domain.ProductHandsetOutboundRecord;
+import com.zkqy.business.service.IProductHandsetOutboundRecordService;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import com.zkqy.common.core.page.TableDataInfo;
+
+/**
+ * 成品手持机出库记录Controller
+ *
+ * @author zkqy
+ * @date 2024-04-12
+ */
+@RestController
+@RequestMapping("/system/ProductHandsetOutboundRecord")
+@Api(value = "/system/ProductHandsetOutboundRecord", description = "成品手持机出库记录-接口")
+public class ProductHandsetOutboundRecordController extends BaseController
+{
+    @Autowired
+    private IProductHandsetOutboundRecordService productHandsetOutboundRecordService;
+
+/**
+ * 查询成品手持机出库记录列表
+ */
+@PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:list')")
+@GetMapping("/list")
+@ApiOperation(value = "查询成品手持机出库记录列表")
+    public TableDataInfo list(ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        startPage();
+        List<ProductHandsetOutboundRecord> list = productHandsetOutboundRecordService.selectProductHandsetOutboundRecordList(productHandsetOutboundRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出成品手持机出库记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:export')")
+    @Log(title = "成品手持机出库记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ApiOperation(value = "导出成品手持机出库记录列表")
+    public void export(HttpServletResponse response, ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        List<ProductHandsetOutboundRecord> list = productHandsetOutboundRecordService.selectProductHandsetOutboundRecordList(productHandsetOutboundRecord);
+        ExcelUtil<ProductHandsetOutboundRecord> util = new ExcelUtil<ProductHandsetOutboundRecord>(ProductHandsetOutboundRecord.class);
+        util.exportExcel(response, list, "成品手持机出库记录数据");
+    }
+
+    /**
+     * 获取成品手持机出库记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取成品手持机出库记录详细信息")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(productHandsetOutboundRecordService.selectProductHandsetOutboundRecordById(id));
+    }
+
+    /**
+     * 新增成品手持机出库记录
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:add')")
+    @Log(title = "成品手持机出库记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "新增成品手持机出库记录")
+    public AjaxResult add(@RequestBody ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        return toAjax(productHandsetOutboundRecordService.insertProductHandsetOutboundRecord(productHandsetOutboundRecord));
+    }
+
+    /**
+     * 修改成品手持机出库记录
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:edit')")
+    @Log(title = "成品手持机出库记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "修改成品手持机出库记录")
+    public AjaxResult edit(@RequestBody ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        return toAjax(productHandsetOutboundRecordService.updateProductHandsetOutboundRecord(productHandsetOutboundRecord));
+    }
+
+    /**
+     * 删除成品手持机出库记录
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductHandsetOutboundRecord:remove')")
+    @Log(title = "成品手持机出库记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    @ApiOperation(value = "删除成品手持机出库记录")
+    public AjaxResult remove(@PathVariable List<Long> ids)
+    {
+        return toAjax(productHandsetOutboundRecordService.deleteProductHandsetOutboundRecordByIds(ids));
+    }
+
+    /**
+     * 手持机出库记录
+     * @param productCodeListVOList
+     * @return
+     */
+    @PostMapping("/productHandsetOutStorage")
+    public AjaxResult productHandsetOutStorage(@RequestBody List<ProductCodeListVO> productCodeListVOList){
+        productHandsetOutboundRecordService.productHandsetOutStorage(productCodeListVOList);
+        return AjaxResult.success();
+    }
+
+}

+ 10 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInventoryController.java

@@ -3,6 +3,7 @@ package com.zkqy.business.controller;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.zkqy.business.domain.ProductInvoice;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -131,5 +132,14 @@ public class ProductInventoryController extends BaseController
         return AjaxResult.success();
     }
 
+    /**
+     * 通知单出库接口
+     */
+    @PostMapping("/noticeOutStorage")
+    public AjaxResult noticeOutStorage(@RequestBody ProductInvoice productInvoice){
+        productInventoryService.noticeOutStorage(productInvoice);
+        return AjaxResult.success();
+    }
+
 
 }

+ 122 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInvoiceController.java

@@ -0,0 +1,122 @@
+package com.zkqy.business.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.business.domain.ProductInvoice;
+import com.zkqy.business.service.IProductInvoiceService;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import com.zkqy.common.core.page.TableDataInfo;
+
+/**
+ * 产品发货单Controller
+ *
+ * @author zkqy
+ * @date 2024-04-11
+ */
+@RestController
+@RequestMapping("/system/ProductInvoice")
+@Api(value = "/system/ProductInvoice", description = "产品发货单-接口")
+public class ProductInvoiceController extends BaseController
+{
+    @Autowired
+    private IProductInvoiceService productInvoiceService;
+
+/**
+ * 查询产品发货单列表
+ */
+@PreAuthorize("@ss.hasPermi('system:ProductInvoice:list')")
+@GetMapping("/list")
+@ApiOperation(value = "查询产品发货单列表")
+    public TableDataInfo list(ProductInvoice productInvoice)
+    {
+        startPage();
+        List<ProductInvoice> list = productInvoiceService.selectProductInvoiceList(productInvoice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出产品发货单列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductInvoice:export')")
+    @Log(title = "产品发货单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ApiOperation(value = "导出产品发货单列表")
+    public void export(HttpServletResponse response, ProductInvoice productInvoice)
+    {
+        List<ProductInvoice> list = productInvoiceService.selectProductInvoiceList(productInvoice);
+        ExcelUtil<ProductInvoice> util = new ExcelUtil<ProductInvoice>(ProductInvoice.class);
+        util.exportExcel(response, list, "产品发货单数据");
+    }
+
+    /**
+     * 获取产品发货单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductInvoice:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取产品发货单详细信息")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(productInvoiceService.selectProductInvoiceById(id));
+    }
+
+    /**
+     * 新增产品发货单
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductInvoice:add')")
+    @Log(title = "产品发货单", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "新增产品发货单")
+    public AjaxResult add(@RequestBody ProductInvoice productInvoice)
+    {
+        return toAjax(productInvoiceService.insertProductInvoice(productInvoice));
+    }
+
+    /**
+     * 修改产品发货单
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductInvoice:edit')")
+    @Log(title = "产品发货单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "修改产品发货单")
+    public AjaxResult edit(@RequestBody ProductInvoice productInvoice)
+    {
+        return toAjax(productInvoiceService.updateProductInvoice(productInvoice));
+    }
+
+    /**
+     * 删除产品发货单
+     */
+    @PreAuthorize("@ss.hasPermi('system:ProductInvoice:remove')")
+    @Log(title = "产品发货单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    @ApiOperation(value = "删除产品发货单")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(productInvoiceService.deleteProductInvoiceByIds(ids));
+    }
+
+    /**
+     * 查询发货单货品信息
+     */
+    @GetMapping("/productInvoiceInfo")
+    public AjaxResult productInvoiceInfo(@RequestParam("saleOrderNo") String saleOrderNo)
+    {
+        return success(productInvoiceService.productInvoiceInfo(saleOrderNo));
+    }
+
+    @GetMapping("/saleStorageDetails")
+    public AjaxResult saleStorageDetails(@RequestParam("id") Long id)
+    {
+        return success(productInvoiceService.saleStorageDetails(id));
+    }
+
+}

+ 10 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductOutboundRecordController.java

@@ -3,8 +3,10 @@ package com.zkqy.business.controller;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.zkqy.business.domain.ProductHandsetOutboundRecord;
 import com.zkqy.business.domain.ProductWarehousingRecord;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.business.service.IProductHandsetOutboundRecordService;
 import com.zkqy.business.service.IProductWarehousingRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,6 +39,9 @@ public class ProductOutboundRecordController extends BaseController
     @Autowired
     private IProductWarehousingRecordService productWarehousingRecordService;
 
+    @Autowired
+    private IProductHandsetOutboundRecordService productHandsetOutboundRecordService;
+
     /**
      * 查询成品出库记录列表
      */
@@ -126,6 +131,11 @@ public class ProductOutboundRecordController extends BaseController
         if(productOutboundRecord != null){
             return AjaxResult.success("当前货品已出库,不能重复出库!",false);
         }
+        //查看手持机上当前码单是否已出库
+        ProductHandsetOutboundRecord productHandsetOutboundRecord = productHandsetOutboundRecordService.whetherStorage(qrCode, qrCodeId);
+        if(productHandsetOutboundRecord != null){
+            return AjaxResult.success("当前货品已在出库列表中,不能重复出库!",false);
+        }
         return success(true);
     }
 

+ 449 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductHandsetOutboundRecord.java

@@ -0,0 +1,449 @@
+package com.zkqy.business.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zkqy.common.annotation.Excel;
+
+/**
+ * 成品手持机出库记录对象 product_handset_outbound_record
+ * 
+ * @author zkqy
+ * @date 2024-04-12
+ */
+public class ProductHandsetOutboundRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 编号 */
+    private Long id;
+
+    /** 码单号 */
+    @Excel(name = "码单号")
+    private String qrCode;
+
+    /** 码单唯一标识 */
+    @Excel(name = "码单唯一标识")
+    private String qrCodeId;
+
+    /** 批号 */
+    @Excel(name = "批号")
+    private String lotNum;
+
+    /** 货品编号 */
+    @Excel(name = "货品编号")
+    private Long productId;
+
+    /** 等级 */
+    @Excel(name = "等级")
+    private String levels;
+
+    /** 筒数 */
+    @Excel(name = "筒数")
+    private Integer canisterNum;
+
+    /** 箱数 */
+    @Excel(name = "箱数")
+    private Integer boxNum;
+
+    /** 净重 */
+    @Excel(name = "净重")
+    private Double suttle;
+
+    /** 生产日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date productionDate;
+
+    /** 机台 */
+    @Excel(name = "机台")
+    private String machineTool;
+
+    /** 毛重 */
+    @Excel(name = "毛重")
+    private Double grossWeight;
+
+    /** 包装 */
+    @Excel(name = "包装")
+    private String packaging;
+
+    /** 班次 */
+    @Excel(name = "班次")
+    private String workShifts;
+
+    /** 外贸号 */
+    @Excel(name = "外贸号")
+    private String foreignTradeNumber;
+
+    /** 筒重 */
+    @Excel(name = "筒重")
+    private Double canisterWeight;
+
+    /** 箱重/车重 */
+    @Excel(name = "箱重/车重")
+    private Double boxWeight;
+
+    /** 管色 */
+    @Excel(name = "管色")
+    private String tubeColor;
+
+    /** 端口(usb端口号) */
+    @Excel(name = "端口", readConverterExp = "u=sb端口号")
+    private String comPort;
+
+    /** 打印格式(打印二维码格式) */
+    @Excel(name = "打印格式", readConverterExp = "打=印二维码格式")
+    private String printFormat;
+
+    /** 包装类型(暂未使用) */
+    @Excel(name = "包装类型", readConverterExp = "暂=未使用")
+    private String packagingType;
+
+    /** 库位(暂未使用) */
+    @Excel(name = "库位", readConverterExp = "暂=未使用")
+    private String storageLocation;
+
+    /** 区域编号(暂未使用) */
+    @Excel(name = "区域编号", readConverterExp = "暂=未使用")
+    private Long warehouseregionId;
+
+    /** 删除标志(0:否;2:是) */
+    private String delFlag;
+
+    /** 创建者编号 */
+    private Long createById;
+
+    /** 更新者编号 */
+    private Long updateById;
+
+    /** 出库时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "出库时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date warehousingTime;
+
+    /** 出库人 */
+    @Excel(name = "出库人")
+    private String depositor;
+
+    /** 仓库编号 */
+    @Excel(name = "仓库编号")
+    private Long warehouseId;
+
+    /** 通知单号 */
+    @Excel(name = "通知单号")
+    private String noticeNumber;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setQrCode(String qrCode) 
+    {
+        this.qrCode = qrCode;
+    }
+
+    public String getQrCode() 
+    {
+        return qrCode;
+    }
+    public void setQrCodeId(String qrCodeId) 
+    {
+        this.qrCodeId = qrCodeId;
+    }
+
+    public String getQrCodeId() 
+    {
+        return qrCodeId;
+    }
+    public void setLotNum(String lotNum) 
+    {
+        this.lotNum = lotNum;
+    }
+
+    public String getLotNum() 
+    {
+        return lotNum;
+    }
+    public void setProductId(Long productId) 
+    {
+        this.productId = productId;
+    }
+
+    public Long getProductId() 
+    {
+        return productId;
+    }
+    public void setLevels(String levels) 
+    {
+        this.levels = levels;
+    }
+
+    public String getLevels() 
+    {
+        return levels;
+    }
+    public void setCanisterNum(Integer canisterNum)
+    {
+        this.canisterNum = canisterNum;
+    }
+
+    public Integer getCanisterNum()
+    {
+        return canisterNum;
+    }
+    public void setBoxNum(Integer boxNum)
+    {
+        this.boxNum = boxNum;
+    }
+
+    public Integer getBoxNum()
+    {
+        return boxNum;
+    }
+    public void setSuttle(Double suttle)
+    {
+        this.suttle = suttle;
+    }
+
+    public Double getSuttle()
+    {
+        return suttle;
+    }
+    public void setProductionDate(Date productionDate) 
+    {
+        this.productionDate = productionDate;
+    }
+
+    public Date getProductionDate() 
+    {
+        return productionDate;
+    }
+    public void setMachineTool(String machineTool) 
+    {
+        this.machineTool = machineTool;
+    }
+
+    public String getMachineTool() 
+    {
+        return machineTool;
+    }
+    public void setGrossWeight(Double grossWeight)
+    {
+        this.grossWeight = grossWeight;
+    }
+
+    public Double getGrossWeight()
+    {
+        return grossWeight;
+    }
+    public void setPackaging(String packaging) 
+    {
+        this.packaging = packaging;
+    }
+
+    public String getPackaging() 
+    {
+        return packaging;
+    }
+    public void setWorkShifts(String workShifts) 
+    {
+        this.workShifts = workShifts;
+    }
+
+    public String getWorkShifts() 
+    {
+        return workShifts;
+    }
+    public void setForeignTradeNumber(String foreignTradeNumber) 
+    {
+        this.foreignTradeNumber = foreignTradeNumber;
+    }
+
+    public String getForeignTradeNumber() 
+    {
+        return foreignTradeNumber;
+    }
+    public void setCanisterWeight(Double canisterWeight)
+    {
+        this.canisterWeight = canisterWeight;
+    }
+
+    public Double getCanisterWeight()
+    {
+        return canisterWeight;
+    }
+    public void setBoxWeight(Double boxWeight)
+    {
+        this.boxWeight = boxWeight;
+    }
+
+    public Double getBoxWeight()
+    {
+        return boxWeight;
+    }
+    public void setTubeColor(String tubeColor) 
+    {
+        this.tubeColor = tubeColor;
+    }
+
+    public String getTubeColor() 
+    {
+        return tubeColor;
+    }
+    public void setComPort(String comPort) 
+    {
+        this.comPort = comPort;
+    }
+
+    public String getComPort() 
+    {
+        return comPort;
+    }
+    public void setPrintFormat(String printFormat) 
+    {
+        this.printFormat = printFormat;
+    }
+
+    public String getPrintFormat() 
+    {
+        return printFormat;
+    }
+    public void setPackagingType(String packagingType) 
+    {
+        this.packagingType = packagingType;
+    }
+
+    public String getPackagingType() 
+    {
+        return packagingType;
+    }
+    public void setStorageLocation(String storageLocation) 
+    {
+        this.storageLocation = storageLocation;
+    }
+
+    public String getStorageLocation() 
+    {
+        return storageLocation;
+    }
+    public void setWarehouseregionId(Long warehouseregionId) 
+    {
+        this.warehouseregionId = warehouseregionId;
+    }
+
+    public Long getWarehouseregionId() 
+    {
+        return warehouseregionId;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+    public void setWarehousingTime(Date warehousingTime) 
+    {
+        this.warehousingTime = warehousingTime;
+    }
+
+    public Date getWarehousingTime() 
+    {
+        return warehousingTime;
+    }
+    public void setDepositor(String depositor) 
+    {
+        this.depositor = depositor;
+    }
+
+    public String getDepositor() 
+    {
+        return depositor;
+    }
+    public void setWarehouseId(Long warehouseId) 
+    {
+        this.warehouseId = warehouseId;
+    }
+
+    public Long getWarehouseId() 
+    {
+        return warehouseId;
+    }
+    public void setNoticeNumber(String noticeNumber) 
+    {
+        this.noticeNumber = noticeNumber;
+    }
+
+    public String getNoticeNumber() 
+    {
+        return noticeNumber;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("qrCode", getQrCode())
+            .append("qrCodeId", getQrCodeId())
+            .append("lotNum", getLotNum())
+            .append("productId", getProductId())
+            .append("levels", getLevels())
+            .append("canisterNum", getCanisterNum())
+            .append("boxNum", getBoxNum())
+            .append("suttle", getSuttle())
+            .append("productionDate", getProductionDate())
+            .append("machineTool", getMachineTool())
+            .append("grossWeight", getGrossWeight())
+            .append("packaging", getPackaging())
+            .append("workShifts", getWorkShifts())
+            .append("foreignTradeNumber", getForeignTradeNumber())
+            .append("canisterWeight", getCanisterWeight())
+            .append("boxWeight", getBoxWeight())
+            .append("tubeColor", getTubeColor())
+            .append("comPort", getComPort())
+            .append("printFormat", getPrintFormat())
+            .append("packagingType", getPackagingType())
+            .append("storageLocation", getStorageLocation())
+            .append("warehouseregionId", getWarehouseregionId())
+            .append("remark", getRemark())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createById", getCreateById())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateById", getUpdateById())
+            .append("updateTime", getUpdateTime())
+            .append("warehousingTime", getWarehousingTime())
+            .append("depositor", getDepositor())
+            .append("warehouseId", getWarehouseId())
+            .append("noticeNumber", getNoticeNumber())
+            .toString();
+    }
+}

+ 387 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductInvoice.java

@@ -0,0 +1,387 @@
+package com.zkqy.business.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zkqy.common.annotation.Excel;
+
+/**
+ * 产品发货单对象 product_invoice
+ * 
+ * @author zkqy
+ * @date 2024-04-11
+ */
+public class ProductInvoice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 编号 */
+    private Long id;
+
+    /** 通知单号 */
+    @Excel(name = "通知单号")
+    private String noticeNumber;
+
+    /** 通知日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "通知日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date noticeDate;
+
+    /** 销售员 */
+    @Excel(name = "销售员")
+    private String salesman;
+
+    /** 客户编号 */
+    @Excel(name = "客户编号")
+    private Long customerId;
+
+    /** 客户名称 */
+    private String customerName;
+
+    /** 开票员 */
+    @Excel(name = "开票员")
+    private String drawer;
+
+    /** 发货单备注 */
+    @Excel(name = "发货单备注")
+    private String dispatchNoteRemark;
+
+    /** 开票类型 */
+    @Excel(name = "开票类型")
+    private String billingType;
+
+    /** 货车登记 */
+    @Excel(name = "货车登记")
+    private String truckRegistration;
+
+    /** 单据类型 */
+    @Excel(name = "单据类型")
+    private String documentType;
+
+    /** 售货单位 */
+    @Excel(name = "售货单位")
+    private String sellingUnit;
+
+    /** 计算类型(未启用) */
+    @Excel(name = "计算类型", readConverterExp = "未=启用")
+    private String calculationType;
+
+    /** 审核意见 */
+    @Excel(name = "审核意见")
+    private String auditOpinion;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 销售单合同号 */
+    @Excel(name = "销售单合同号")
+    private String saleOrderNo;
+
+    /** 备用列 */
+    @Excel(name = "备用列")
+    private String spare1;
+
+    /** 备用列 */
+    @Excel(name = "备用列")
+    private String spare2;
+
+    /** 备用列 */
+    @Excel(name = "备用列")
+    private String spare3;
+
+    /** 备用列 */
+    @Excel(name = "备用列")
+    private String spare4;
+
+    /** 删除标志(0:否;2:是) */
+    private String delFlag;
+
+    /** 创建者ID */
+    private Long createById;
+
+    /** 修改者ID */
+    private Long updateById;
+
+    /** 发货仓库 */
+    private Long deliveryWarehouse;
+
+    /** 调拨仓库 */
+    private Long transferWarehouse;
+
+    /** 发货日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date deliveryDate;
+
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setNoticeNumber(String noticeNumber) 
+    {
+        this.noticeNumber = noticeNumber;
+    }
+
+    public String getNoticeNumber() 
+    {
+        return noticeNumber;
+    }
+    public void setNoticeDate(Date noticeDate) 
+    {
+        this.noticeDate = noticeDate;
+    }
+
+    public Date getNoticeDate() 
+    {
+        return noticeDate;
+    }
+    public void setSalesman(String salesman) 
+    {
+        this.salesman = salesman;
+    }
+
+    public String getSalesman() 
+    {
+        return salesman;
+    }
+    public void setCustomerId(Long customerId) 
+    {
+        this.customerId = customerId;
+    }
+
+    public Long getCustomerId() 
+    {
+        return customerId;
+    }
+    public void setDrawer(String drawer) 
+    {
+        this.drawer = drawer;
+    }
+
+    public String getDrawer() 
+    {
+        return drawer;
+    }
+    public void setDispatchNoteRemark(String dispatchNoteRemark) 
+    {
+        this.dispatchNoteRemark = dispatchNoteRemark;
+    }
+
+    public String getDispatchNoteRemark() 
+    {
+        return dispatchNoteRemark;
+    }
+    public void setBillingType(String billingType) 
+    {
+        this.billingType = billingType;
+    }
+
+    public String getBillingType() 
+    {
+        return billingType;
+    }
+    public void setTruckRegistration(String truckRegistration) 
+    {
+        this.truckRegistration = truckRegistration;
+    }
+
+    public String getTruckRegistration() 
+    {
+        return truckRegistration;
+    }
+    public void setDocumentType(String documentType) 
+    {
+        this.documentType = documentType;
+    }
+
+    public String getDocumentType() 
+    {
+        return documentType;
+    }
+    public void setSellingUnit(String sellingUnit) 
+    {
+        this.sellingUnit = sellingUnit;
+    }
+
+    public String getSellingUnit() 
+    {
+        return sellingUnit;
+    }
+    public void setCalculationType(String calculationType) 
+    {
+        this.calculationType = calculationType;
+    }
+
+    public String getCalculationType() 
+    {
+        return calculationType;
+    }
+    public void setAuditOpinion(String auditOpinion) 
+    {
+        this.auditOpinion = auditOpinion;
+    }
+
+    public String getAuditOpinion() 
+    {
+        return auditOpinion;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setSaleOrderNo(String saleOrderNo) 
+    {
+        this.saleOrderNo = saleOrderNo;
+    }
+
+    public String getSaleOrderNo() 
+    {
+        return saleOrderNo;
+    }
+    public void setSpare1(String spare1) 
+    {
+        this.spare1 = spare1;
+    }
+
+    public String getSpare1() 
+    {
+        return spare1;
+    }
+    public void setSpare2(String spare2) 
+    {
+        this.spare2 = spare2;
+    }
+
+    public String getSpare2() 
+    {
+        return spare2;
+    }
+    public void setSpare3(String spare3) 
+    {
+        this.spare3 = spare3;
+    }
+
+    public String getSpare3() 
+    {
+        return spare3;
+    }
+    public void setSpare4(String spare4) 
+    {
+        this.spare4 = spare4;
+    }
+
+    public String getSpare4() 
+    {
+        return spare4;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+
+    public Long getDeliveryWarehouse() {
+        return deliveryWarehouse;
+    }
+
+    public void setDeliveryWarehouse(Long deliveryWarehouse) {
+        this.deliveryWarehouse = deliveryWarehouse;
+    }
+
+    public Long getTransferWarehouse() {
+        return transferWarehouse;
+    }
+
+    public void setTransferWarehouse(Long transferWarehouse) {
+        this.transferWarehouse = transferWarehouse;
+    }
+
+    public Date getDeliveryDate() {
+        return deliveryDate;
+    }
+
+    public void setDeliveryDate(Date deliveryDate) {
+        this.deliveryDate = deliveryDate;
+    }
+
+    public String getCustomerName() {
+        return customerName;
+    }
+
+    public void setCustomerName(String customerName) {
+        this.customerName = customerName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("noticeNumber", getNoticeNumber())
+            .append("noticeDate", getNoticeDate())
+            .append("salesman", getSalesman())
+            .append("customerId", getCustomerId())
+            .append("customerName", getCustomerName())
+            .append("drawer", getDrawer())
+            .append("dispatchNoteRemark", getDispatchNoteRemark())
+            .append("billingType", getBillingType())
+            .append("truckRegistration", getTruckRegistration())
+            .append("documentType", getDocumentType())
+            .append("sellingUnit", getSellingUnit())
+            .append("calculationType", getCalculationType())
+            .append("auditOpinion", getAuditOpinion())
+            .append("status", getStatus())
+            .append("saleOrderNo", getSaleOrderNo())
+            .append("spare1", getSpare1())
+            .append("spare2", getSpare2())
+            .append("spare3", getSpare3())
+            .append("spare4", getSpare4())
+            .append("remark", getRemark())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createById", getCreateById())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateById", getUpdateById())
+            .append("updateTime", getUpdateTime())
+            .append("deliveryWarehouse", getDeliveryWarehouse())
+            .append("transferWarehouse", getTransferWarehouse())
+            .append("deliveryDate", getDeliveryDate())
+            .toString();
+    }
+}

+ 12 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductOutboundRecord.java

@@ -131,6 +131,9 @@ public class ProductOutboundRecord extends BaseEntity
     @Excel(name = "仓库编号")
     private Long warehouseId;
 
+    /** 通知单号 */
+    private String noticeNumber;
+
     public void setId(Long id) 
     {
         this.id = id;
@@ -393,6 +396,14 @@ public class ProductOutboundRecord extends BaseEntity
         return warehouseId;
     }
 
+    public String getNoticeNumber() {
+        return noticeNumber;
+    }
+
+    public void setNoticeNumber(String noticeNumber) {
+        this.noticeNumber = noticeNumber;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -430,6 +441,7 @@ public class ProductOutboundRecord extends BaseEntity
             .append("warehousingTime", getWarehousingTime())
             .append("depositor", getDepositor())
             .append("warehouseId", getWarehouseId())
+            .append("noticeNumber", getNoticeNumber())
             .toString();
     }
 }

+ 573 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInvoiceVO.java

@@ -0,0 +1,573 @@
+package com.zkqy.business.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 产品发货单对象 product_invoice
+ * 
+ * @author zkqy
+ * @date 2024-04-11
+ */
+public class ProductInvoiceVO extends BaseEntity
+{
+
+    /** 编号 */
+    private Long id;
+
+    /** 通知单号 */
+    private String noticeNumber;
+
+    /** 通知日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date noticeDate;
+
+    /** 销售员 */
+    private String salesman;
+
+    /** 客户编号 */
+    private Long customerId;
+
+    /** 开票员 */
+    private String drawer;
+
+    /** 发货单备注 */
+    private String dispatchNoteRemark;
+
+    /** 开票类型 */
+    private String billingType;
+
+    /** 货车登记 */
+    private String truckRegistration;
+
+    /** 单据类型 */
+    private String documentType;
+
+    /** 售货单位 */
+    private String sellingUnit;
+
+    /** 计算类型(未启用) */
+    private String calculationType;
+
+    /** 审核意见 */
+    private String auditOpinion;
+
+    /** 状态 */
+    private String status;
+
+    /** 销售单合同号 */
+    private String saleOrderNo;
+
+    /** 备用列 */
+    private String spare1;
+
+    /** 备用列 */
+    private String spare2;
+
+    /** 备用列 */
+    private String spare3;
+
+    /** 备用列 */
+    private String spare4;
+
+    /** 删除标志(0:否;2:是) */
+    private String delFlag;
+
+    /** 创建者ID */
+    private Long createById;
+
+    /** 修改者ID */
+    private Long updateById;
+
+    /** 库存箱数 */
+    private Integer inventoryBoxNum;
+
+    /** 库存重量 */
+    private Double inventoryWeight;
+
+    /** 销售单货品信息 */
+    private List<SaleProductInfo> saleProductInfoList;
+
+    /** 发货仓库 */
+    private Long deliveryWarehouse;
+
+    /** 调拨仓库 */
+    private Long transferWarehouse;
+
+    /** 发货日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date deliveryDate;
+
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setNoticeNumber(String noticeNumber) 
+    {
+        this.noticeNumber = noticeNumber;
+    }
+
+    public String getNoticeNumber() 
+    {
+        return noticeNumber;
+    }
+    public void setNoticeDate(Date noticeDate) 
+    {
+        this.noticeDate = noticeDate;
+    }
+
+    public Date getNoticeDate() 
+    {
+        return noticeDate;
+    }
+    public void setSalesman(String salesman) 
+    {
+        this.salesman = salesman;
+    }
+
+    public String getSalesman() 
+    {
+        return salesman;
+    }
+    public void setCustomerId(Long customerId) 
+    {
+        this.customerId = customerId;
+    }
+
+    public Long getCustomerId() 
+    {
+        return customerId;
+    }
+    public void setDrawer(String drawer) 
+    {
+        this.drawer = drawer;
+    }
+
+    public String getDrawer() 
+    {
+        return drawer;
+    }
+    public void setDispatchNoteRemark(String dispatchNoteRemark) 
+    {
+        this.dispatchNoteRemark = dispatchNoteRemark;
+    }
+
+    public String getDispatchNoteRemark() 
+    {
+        return dispatchNoteRemark;
+    }
+    public void setBillingType(String billingType) 
+    {
+        this.billingType = billingType;
+    }
+
+    public String getBillingType() 
+    {
+        return billingType;
+    }
+    public void setTruckRegistration(String truckRegistration) 
+    {
+        this.truckRegistration = truckRegistration;
+    }
+
+    public String getTruckRegistration() 
+    {
+        return truckRegistration;
+    }
+    public void setDocumentType(String documentType) 
+    {
+        this.documentType = documentType;
+    }
+
+    public String getDocumentType() 
+    {
+        return documentType;
+    }
+    public void setSellingUnit(String sellingUnit) 
+    {
+        this.sellingUnit = sellingUnit;
+    }
+
+    public String getSellingUnit() 
+    {
+        return sellingUnit;
+    }
+    public void setCalculationType(String calculationType) 
+    {
+        this.calculationType = calculationType;
+    }
+
+    public String getCalculationType() 
+    {
+        return calculationType;
+    }
+    public void setAuditOpinion(String auditOpinion) 
+    {
+        this.auditOpinion = auditOpinion;
+    }
+
+    public String getAuditOpinion() 
+    {
+        return auditOpinion;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setSaleOrderNo(String saleOrderNo) 
+    {
+        this.saleOrderNo = saleOrderNo;
+    }
+
+    public String getSaleOrderNo() 
+    {
+        return saleOrderNo;
+    }
+    public void setSpare1(String spare1) 
+    {
+        this.spare1 = spare1;
+    }
+
+    public String getSpare1() 
+    {
+        return spare1;
+    }
+    public void setSpare2(String spare2) 
+    {
+        this.spare2 = spare2;
+    }
+
+    public String getSpare2() 
+    {
+        return spare2;
+    }
+    public void setSpare3(String spare3) 
+    {
+        this.spare3 = spare3;
+    }
+
+    public String getSpare3() 
+    {
+        return spare3;
+    }
+    public void setSpare4(String spare4) 
+    {
+        this.spare4 = spare4;
+    }
+
+    public String getSpare4() 
+    {
+        return spare4;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+
+    public Integer getInventoryBoxNum() {
+        return inventoryBoxNum;
+    }
+
+    public void setInventoryBoxNum(Integer inventoryBoxNum) {
+        this.inventoryBoxNum = inventoryBoxNum;
+    }
+
+    public Double getInventoryWeight() {
+        return inventoryWeight;
+    }
+
+    public void setInventoryWeight(Double inventoryWeight) {
+        this.inventoryWeight = inventoryWeight;
+    }
+
+    public List<SaleProductInfo> getSaleProductInfoList() {
+        return saleProductInfoList;
+    }
+
+    public void setSaleProductInfoList(List<SaleProductInfo> saleProductInfoList) {
+        this.saleProductInfoList = saleProductInfoList;
+    }
+
+    public Long getDeliveryWarehouse() {
+        return deliveryWarehouse;
+    }
+
+    public void setDeliveryWarehouse(Long deliveryWarehouse) {
+        this.deliveryWarehouse = deliveryWarehouse;
+    }
+
+    public Long getTransferWarehouse() {
+        return transferWarehouse;
+    }
+
+    public void setTransferWarehouse(Long transferWarehouse) {
+        this.transferWarehouse = transferWarehouse;
+    }
+
+    public Date getDeliveryDate() {
+        return deliveryDate;
+    }
+
+    public void setDeliveryDate(Date deliveryDate) {
+        this.deliveryDate = deliveryDate;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("noticeNumber", getNoticeNumber())
+            .append("noticeDate", getNoticeDate())
+            .append("salesman", getSalesman())
+            .append("customerId", getCustomerId())
+            .append("drawer", getDrawer())
+            .append("dispatchNoteRemark", getDispatchNoteRemark())
+            .append("billingType", getBillingType())
+            .append("truckRegistration", getTruckRegistration())
+            .append("documentType", getDocumentType())
+            .append("sellingUnit", getSellingUnit())
+            .append("calculationType", getCalculationType())
+            .append("auditOpinion", getAuditOpinion())
+            .append("status", getStatus())
+            .append("saleOrderNo", getSaleOrderNo())
+            .append("spare1", getSpare1())
+            .append("spare2", getSpare2())
+            .append("spare3", getSpare3())
+            .append("spare4", getSpare4())
+            .append("remark", getRemark())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createById", getCreateById())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateById", getUpdateById())
+            .append("updateTime", getUpdateTime())
+            .append("inventoryBoxNum", getInventoryBoxNum())
+            .append("inventoryWeight", getInventoryWeight())
+            .append("deliveryWarehouse", getDeliveryWarehouse())
+            .append("transferWarehouse", getTransferWarehouse())
+            .append("deliveryDate", getDeliveryDate())
+            .toString();
+    }
+
+    public static class SaleProductInfo{
+
+        /** 货品编号 */
+        private Long productId;
+
+        /** 编码 */
+        private String productCode;
+
+        /** 品名 */
+        private String productName;
+
+        /** 规格 */
+        private String productSpecifications;
+
+        /** 批号 */
+        private String lotNum;
+
+        /** 等级 */
+        private String levels;
+
+        /** 箱数 */
+        private Integer boxNum;
+
+        /** 重量 */
+        private Double weight;
+
+        /** 单价 */
+        private Double unitPrice;
+
+        /** 销售金额 */
+        private Double saleAmount;
+
+        /** 色泽 */
+        private String productColor;
+
+        /** 类型 */
+        private String productType;
+
+        /** 底价 */
+        private Double bottomPrice;
+
+        /** 备注 */
+        private String productRemark;
+
+        /** 实发箱数 */
+        private Integer actualBoxNum;
+
+        /** 实发重量 */
+        private Double actualWeight;
+
+        public String getProductCode() {
+            return productCode;
+        }
+
+        public void setProductCode(String productCode) {
+            this.productCode = productCode;
+        }
+
+        public String getProductName() {
+            return productName;
+        }
+
+        public void setProductName(String productName) {
+            this.productName = productName;
+        }
+
+        public String getProductSpecifications() {
+            return productSpecifications;
+        }
+
+        public void setProductSpecifications(String productSpecifications) {
+            this.productSpecifications = productSpecifications;
+        }
+
+        public String getLotNum() {
+            return lotNum;
+        }
+
+        public void setLotNum(String lotNum) {
+            this.lotNum = lotNum;
+        }
+
+        public String getLevels() {
+            return levels;
+        }
+
+        public void setLevels(String levels) {
+            this.levels = levels;
+        }
+
+        public Integer getBoxNum() {
+            return boxNum;
+        }
+
+        public void setBoxNum(Integer boxNum) {
+            this.boxNum = boxNum;
+        }
+
+        public Double getWeight() {
+            return weight;
+        }
+
+        public void setWeight(Double weight) {
+            this.weight = weight;
+        }
+
+        public Double getUnitPrice() {
+            return unitPrice;
+        }
+
+        public void setUnitPrice(Double unitPrice) {
+            this.unitPrice = unitPrice;
+        }
+
+        public Double getSaleAmount() {
+            return saleAmount;
+        }
+
+        public void setSaleAmount(Double saleAmount) {
+            this.saleAmount = saleAmount;
+        }
+
+        public String getProductColor() {
+            return productColor;
+        }
+
+        public void setProductColor(String productColor) {
+            this.productColor = productColor;
+        }
+
+        public String getProductType() {
+            return productType;
+        }
+
+        public void setProductType(String productType) {
+            this.productType = productType;
+        }
+
+        public Double getBottomPrice() {
+            return bottomPrice;
+        }
+
+        public void setBottomPrice(Double bottomPrice) {
+            this.bottomPrice = bottomPrice;
+        }
+
+        public String getProductRemark() {
+            return productRemark;
+        }
+
+        public void setProductRemark(String productRemark) {
+            this.productRemark = productRemark;
+        }
+
+        public Long getProductId() {
+            return productId;
+        }
+
+        public void setProductId(Long productId) {
+            this.productId = productId;
+        }
+
+        public Integer getActualBoxNum() {
+            return actualBoxNum;
+        }
+
+        public void setActualBoxNum(Integer actualBoxNum) {
+            this.actualBoxNum = actualBoxNum;
+        }
+
+        public Double getActualWeight() {
+            return actualWeight;
+        }
+
+        public void setActualWeight(Double actualWeight) {
+            this.actualWeight = actualWeight;
+        }
+    }
+
+}

+ 77 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductHandsetOutboundRecordMapper.java

@@ -0,0 +1,77 @@
+package com.zkqy.business.mapper;
+
+import java.util.List;
+import com.zkqy.business.domain.ProductHandsetOutboundRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 成品手持机出库记录Mapper接口
+ * 
+ * @author zkqy
+ * @date 2024-04-12
+ */
+public interface ProductHandsetOutboundRecordMapper 
+{
+    /**
+     * 查询成品手持机出库记录
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 成品手持机出库记录
+     */
+    public ProductHandsetOutboundRecord selectProductHandsetOutboundRecordById(Long id);
+
+    /**
+     * 查询成品手持机出库记录列表
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 成品手持机出库记录集合
+     */
+    public List<ProductHandsetOutboundRecord> selectProductHandsetOutboundRecordList(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 新增成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    int insertProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 修改成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    public int updateProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 删除成品手持机出库记录
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 结果
+     */
+    public int deleteProductHandsetOutboundRecordById(Long id);
+
+    /**
+     * 批量删除成品手持机出库记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteProductHandsetOutboundRecordByIds(List<Long> ids);
+
+    /**
+     * 查询是否已出库
+     * @param qrCode
+     * @param qrCodeId
+     * @return
+     */
+    ProductHandsetOutboundRecord selectWhetherExist(@Param("qrCode") String qrCode, @Param("qrCodeId") String qrCodeId);
+
+    /**
+     * 查询实发箱数、重量
+     */
+    ProductHandsetOutboundRecord selectBoxNumSuttle(@Param("productId") Long productId,@Param("noticeNumber") String noticeNumber);
+
+
+}

+ 5 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInventoryMapper.java

@@ -66,4 +66,9 @@ public interface ProductInventoryMapper
      */
     ProductInventory selectProductInventoryByQrCode(String qrCode);
 
+    /**
+     * 根据批次货品货品编号查询库存货品箱数净重
+     */
+    ProductInventory selectProductInventoryByLotNumAndProductId(ProductInventory productInventory);
+
 }

+ 70 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInvoiceMapper.java

@@ -0,0 +1,70 @@
+package com.zkqy.business.mapper;
+
+import java.util.List;
+import com.zkqy.business.domain.ProductInvoice;
+
+/**
+ * 产品发货单Mapper接口
+ * 
+ * @author zkqy
+ * @date 2024-04-11
+ */
+public interface ProductInvoiceMapper 
+{
+    /**
+     * 查询产品发货单
+     * 
+     * @param id 产品发货单主键
+     * @return 产品发货单
+     */
+    public ProductInvoice selectProductInvoiceById(Long id);
+
+    /**
+     * 查询产品发货单列表
+     * 
+     * @param productInvoice 产品发货单
+     * @return 产品发货单集合
+     */
+    public List<ProductInvoice> selectProductInvoiceList(ProductInvoice productInvoice);
+
+    /**
+     * 新增产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    public int insertProductInvoice(ProductInvoice productInvoice);
+
+    /**
+     * 修改产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    public int updateProductInvoice(ProductInvoice productInvoice);
+
+    /**
+     * 删除产品发货单
+     * 
+     * @param id 产品发货单主键
+     * @return 结果
+     */
+    public int deleteProductInvoiceById(Long id);
+
+    /**
+     * 批量删除产品发货单
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteProductInvoiceByIds(Long[] ids);
+
+    /**
+     * 查询产品发货单
+     *
+     * @param saleOrderNo 产品发货单主键
+     * @return 产品发货单
+     */
+    ProductInvoice selectProductInvoiceBySaleOrderNo(String saleOrderNo);
+
+}

+ 10 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordMapper.java

@@ -1,6 +1,8 @@
 package com.zkqy.business.mapper;
 
 import java.util.List;
+import java.util.Map;
+
 import com.zkqy.business.domain.ProductOutboundRecord;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
 import org.apache.ibatis.annotations.Param;
@@ -74,4 +76,12 @@ public interface ProductOutboundRecordMapper
      * @return
      */
     ProductOutboundRecord selectProductOutboundRecordWhetherExist(@Param("qrCode") String qrCode, @Param("qrCodeId") String qrCodeId);
+
+    /**
+     * 统计箱数和净重
+     * @param productId
+     * @param noticeNumber
+     * @return
+     */
+    ProductOutboundRecord statisticsBoxNumSuttle(@Param("productId") Long productId,@Param("noticeNumber") String noticeNumber);
 }

+ 5 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/SaleOrderMapper.java

@@ -86,4 +86,9 @@ public interface SaleOrderMapper
      * @return 结果
      */
     int batchUpdateSaleOrder(SaleOrderVO vo);
+
+    /***
+     * 根据销售单合同号查询当前用户编号
+     */
+    Long selectCustomerIdBySaleNo(String saleNo);
 }

+ 9 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/SaleProductsMapper.java

@@ -1,7 +1,10 @@
 package com.zkqy.business.mapper;
 
 import java.util.List;
+
+import com.zkqy.business.domain.ProductInvoice;
 import com.zkqy.business.domain.SaleProducts;
+import com.zkqy.business.domain.vo.ProductInvoiceVO;
 import com.zkqy.business.domain.vo.SaleProductsVo;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -80,4 +83,10 @@ public interface SaleProductsMapper
      * @return
      */
     List<Long> selectSaleProductsIds(String saleOrderNo);
+
+    /**
+     * 查询销售单货品信息
+     */
+    List<ProductInvoiceVO.SaleProductInfo> selectSaleProductsInfo(String saleOrderNo);
+
 }

+ 79 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductHandsetOutboundRecordService.java

@@ -0,0 +1,79 @@
+package com.zkqy.business.service;
+
+import java.util.List;
+import com.zkqy.business.domain.ProductHandsetOutboundRecord;
+import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.common.core.domain.AjaxResult;
+
+/**
+ * 成品手持机出库记录Service接口
+ * 
+ * @author zkqy
+ * @date 2024-04-12
+ */
+public interface IProductHandsetOutboundRecordService 
+{
+    /**
+     * 查询成品手持机出库记录
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 成品手持机出库记录
+     */
+    public ProductHandsetOutboundRecord selectProductHandsetOutboundRecordById(Long id);
+
+    /**
+     * 查询成品手持机出库记录列表
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 成品手持机出库记录集合
+     */
+    public List<ProductHandsetOutboundRecord> selectProductHandsetOutboundRecordList(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 新增成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    public int insertProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 修改成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    public int updateProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord);
+
+    /**
+     * 批量删除成品手持机出库记录
+     * 
+     * @param ids 需要删除的成品手持机出库记录主键集合
+     * @return 结果
+     */
+    public int deleteProductHandsetOutboundRecordByIds(List<Long> ids);
+
+    /**
+     * 删除成品手持机出库记录信息
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 结果
+     */
+    public int deleteProductHandsetOutboundRecordById(Long id);
+
+    /**
+     * 查询货品是否已出库
+     * @param qrCode
+     * @param qrCodeId
+     * @return
+     */
+    ProductHandsetOutboundRecord whetherStorage(String qrCode, String qrCodeId);
+
+    /**
+     * 手持机出库记录
+     * @param productCodeListVOList
+     * @return
+     */
+    void productHandsetOutStorage(List<ProductCodeListVO> productCodeListVOList);
+
+}

+ 8 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInventoryService.java

@@ -2,6 +2,7 @@ package com.zkqy.business.service;
 
 import java.util.List;
 import com.zkqy.business.domain.ProductInventory;
+import com.zkqy.business.domain.ProductInvoice;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
 import com.zkqy.common.core.domain.AjaxResult;
 
@@ -70,4 +71,11 @@ public interface IProductInventoryService
      * 成品出库
      */
     AjaxResult productOutStorage(List<ProductCodeListVO> productCodeListVOList);
+
+    /**
+     * 通知单出库
+     * @param productInvoice
+     * @return
+     */
+    AjaxResult noticeOutStorage(ProductInvoice productInvoice);
 }

+ 79 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInvoiceService.java

@@ -0,0 +1,79 @@
+package com.zkqy.business.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.zkqy.business.domain.ProductInvoice;
+import com.zkqy.business.domain.vo.ProductInvoiceVO;
+
+/**
+ * 产品发货单Service接口
+ * 
+ * @author zkqy
+ * @date 2024-04-11
+ */
+public interface IProductInvoiceService 
+{
+    /**
+     * 查询产品发货单
+     * 
+     * @param id 产品发货单主键
+     * @return 产品发货单
+     */
+    public ProductInvoice selectProductInvoiceById(Long id);
+
+    /**
+     * 查询产品发货单列表
+     * 
+     * @param productInvoice 产品发货单
+     * @return 产品发货单集合
+     */
+    public List<ProductInvoice> selectProductInvoiceList(ProductInvoice productInvoice);
+
+    /**
+     * 新增产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    public int insertProductInvoice(ProductInvoice productInvoice);
+
+    /**
+     * 修改产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    public int updateProductInvoice(ProductInvoice productInvoice);
+
+    /**
+     * 批量删除产品发货单
+     * 
+     * @param ids 需要删除的产品发货单主键集合
+     * @return 结果
+     */
+    public int deleteProductInvoiceByIds(Long[] ids);
+
+    /**
+     * 删除产品发货单信息
+     * 
+     * @param id 产品发货单主键
+     * @return 结果
+     */
+    public int deleteProductInvoiceById(Long id);
+
+    /**
+     * 查询发货单详情
+     * @param saleOrderNo 销售单编号
+     * @return
+     */
+    ProductInvoiceVO productInvoiceInfo(String saleOrderNo);
+
+    /**
+     * 查询通知单货品信息
+     * @param id 通知单编号
+     * @return
+     */
+    ProductInvoiceVO saleStorageDetails(Long id);
+
+}

+ 1 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductOutboundRecordService.java

@@ -61,7 +61,7 @@ public interface IProductOutboundRecordService
     public int deleteProductOutboundRecordById(Long id);
 
     /**
-     * 查询是否已
+     * 查询是否已
      * @param qrCode
      * @param qrCodeId
      * @return

+ 136 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductHandsetOutboundRecordServiceImpl.java

@@ -0,0 +1,136 @@
+package com.zkqy.business.service.impl;
+
+import java.util.List;
+
+import com.zkqy.business.domain.ProductCodeList;
+import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.business.mapper.ProductCodeListMapper;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.utils.DateUtils;
+import com.zkqy.common.utils.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.business.mapper.ProductHandsetOutboundRecordMapper;
+import com.zkqy.business.domain.ProductHandsetOutboundRecord;
+import com.zkqy.business.service.IProductHandsetOutboundRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 成品手持机出库记录Service业务层处理
+ * 
+ * @author zkqy
+ * @date 2024-04-12
+ */
+@Service
+public class ProductHandsetOutboundRecordServiceImpl implements IProductHandsetOutboundRecordService 
+{
+    @Autowired
+    private ProductHandsetOutboundRecordMapper productHandsetOutboundRecordMapper;
+
+    @Autowired
+    private ProductCodeListMapper productCodeListMapper;
+
+    /**
+     * 查询成品手持机出库记录
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 成品手持机出库记录
+     */
+    @Override
+    public ProductHandsetOutboundRecord selectProductHandsetOutboundRecordById(Long id)
+    {
+        return productHandsetOutboundRecordMapper.selectProductHandsetOutboundRecordById(id);
+    }
+
+    /**
+     * 查询成品手持机出库记录列表
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 成品手持机出库记录
+     */
+    @Override
+    public List<ProductHandsetOutboundRecord> selectProductHandsetOutboundRecordList(ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        return productHandsetOutboundRecordMapper.selectProductHandsetOutboundRecordList(productHandsetOutboundRecord);
+    }
+
+    /**
+     * 新增成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    @Override
+    public int insertProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        productHandsetOutboundRecord.setCreateTime(DateUtils.getNowDate());
+        return productHandsetOutboundRecordMapper.insertProductHandsetOutboundRecord(productHandsetOutboundRecord);
+    }
+
+    /**
+     * 修改成品手持机出库记录
+     * 
+     * @param productHandsetOutboundRecord 成品手持机出库记录
+     * @return 结果
+     */
+    @Override
+    public int updateProductHandsetOutboundRecord(ProductHandsetOutboundRecord productHandsetOutboundRecord)
+    {
+        productHandsetOutboundRecord.setUpdateTime(DateUtils.getNowDate());
+        return productHandsetOutboundRecordMapper.updateProductHandsetOutboundRecord(productHandsetOutboundRecord);
+    }
+
+    /**
+     * 批量删除成品手持机出库记录
+     * 
+     * @param ids 需要删除的成品手持机出库记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProductHandsetOutboundRecordByIds(List<Long> ids)
+    {
+        return productHandsetOutboundRecordMapper.deleteProductHandsetOutboundRecordByIds(ids);
+    }
+
+    /**
+     * 删除成品手持机出库记录信息
+     * 
+     * @param id 成品手持机出库记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProductHandsetOutboundRecordById(Long id)
+    {
+        return productHandsetOutboundRecordMapper.deleteProductHandsetOutboundRecordById(id);
+    }
+
+    @Override
+    public ProductHandsetOutboundRecord whetherStorage(String qrCode, String qrCodeId) {
+        return productHandsetOutboundRecordMapper.selectWhetherExist(qrCode,qrCodeId);
+    }
+
+    @Override
+    @Transactional
+    public void productHandsetOutStorage(List<ProductCodeListVO> productCodeListVOList) {
+        for (ProductCodeListVO vo : productCodeListVOList){
+            //手持机出库日志
+            ProductCodeList productCodeList = productCodeListMapper.selectProductCodeListById(vo.getId());
+            ProductHandsetOutboundRecord productHandsetOutboundRecord = new ProductHandsetOutboundRecord();
+            BeanUtils.copyProperties(productCodeList,productHandsetOutboundRecord);
+            productHandsetOutboundRecord.setQrCodeId(vo.getQrCodeId());// 码单号唯一标识
+            productHandsetOutboundRecord.setCanisterNum(vo.getCanisterNum()); //筒数
+            productHandsetOutboundRecord.setSuttle(vo.getSuttle());//净重
+            productHandsetOutboundRecord.setGrossWeight(vo.getGrossWeight());//毛重
+            productHandsetOutboundRecord.setDepositor(vo.getDepositor());//出库人
+            productHandsetOutboundRecord.setWarehousingTime(vo.getWarehousingTime());
+            productHandsetOutboundRecord.setRemark(productCodeList.getRemark());
+            productHandsetOutboundRecord.setCreateBy(SecurityUtils.getUsername());
+            productHandsetOutboundRecord.setCreateTime(DateUtils.getNowDate());
+            productHandsetOutboundRecord.setCreateById(SecurityUtils.getUserId());
+            productHandsetOutboundRecordMapper.insertProductHandsetOutboundRecord(productHandsetOutboundRecord);
+        }
+    }
+
+
+}

+ 67 - 9
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java

@@ -3,21 +3,15 @@ package com.zkqy.business.service.impl;
 import java.text.DecimalFormat;
 import java.util.List;
 
-import com.zkqy.business.domain.ProductCodeList;
-import com.zkqy.business.domain.ProductOutboundRecord;
-import com.zkqy.business.domain.ProductWarehousingRecord;
+import com.zkqy.business.domain.*;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
-import com.zkqy.business.mapper.ProductCodeListMapper;
-import com.zkqy.business.mapper.ProductOutboundRecordMapper;
-import com.zkqy.business.mapper.ProductWarehousingRecordMapper;
+import com.zkqy.business.mapper.*;
 import com.zkqy.common.core.domain.AjaxResult;
 import com.zkqy.common.utils.DateUtils;
 import com.zkqy.common.utils.SecurityUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.zkqy.business.mapper.ProductInventoryMapper;
-import com.zkqy.business.domain.ProductInventory;
 import com.zkqy.business.service.IProductInventoryService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -42,6 +36,12 @@ public class ProductInventoryServiceImpl implements IProductInventoryService
     @Autowired
     private ProductOutboundRecordMapper productOutboundRecordMapper;
 
+    @Autowired
+    private ProductHandsetOutboundRecordMapper productHandsetOutboundRecordMapper;
+
+    @Autowired
+    private ProductInvoiceMapper productInvoiceMapper;
+
 
     /**
      * 查询产品库存
@@ -179,7 +179,6 @@ public class ProductInventoryServiceImpl implements IProductInventoryService
     public AjaxResult productOutStorage(List<ProductCodeListVO> productCodeListVOList) {
 
         for (ProductCodeListVO vo : productCodeListVOList){
-            //查看当前码单是否已经入库
             // 出库日志
             ProductCodeList productCodeList = productCodeListMapper.selectProductCodeListById(vo.getId());
             ProductOutboundRecord productOutboundRecord = new ProductOutboundRecord();
@@ -231,6 +230,65 @@ public class ProductInventoryServiceImpl implements IProductInventoryService
         return AjaxResult.success();
     }
 
+    @Override
+    @Transactional
+    public AjaxResult noticeOutStorage(ProductInvoice productInvoice) {
+        //修改通知单、发货日期、发货仓库、调拨仓库
+        ProductInvoice productInvoice1 = new ProductInvoice();
+        productInvoice1.setId(productInvoice.getId());
+        productInvoice1.setDeliveryDate(productInvoice.getDeliveryDate());
+        productInvoice1.setDeliveryWarehouse(productInvoice.getDeliveryWarehouse());
+        productInvoice1.setTransferWarehouse(productInvoice.getTransferWarehouse());
+        productInvoiceMapper.updateProductInvoice(productInvoice1);
+
+
+        //根据通知单号查询手持机待出库货品
+        ProductHandsetOutboundRecord productHandsetOutboundRecord = new ProductHandsetOutboundRecord();
+        productHandsetOutboundRecord.setNoticeNumber(productInvoice.getNoticeNumber());
+        List<ProductHandsetOutboundRecord> productHandsetOutboundRecords =
+                productHandsetOutboundRecordMapper.selectProductHandsetOutboundRecordList(productHandsetOutboundRecord);
+        // 循环插入出库记录
+        for (ProductHandsetOutboundRecord productHandsetOutboundRecord1 : productHandsetOutboundRecords){
+
+            ProductOutboundRecord productOutboundRecord = new ProductOutboundRecord();
+            BeanUtils.copyProperties(productHandsetOutboundRecord1,productOutboundRecord);
+
+            productOutboundRecordMapper.insertProductOutboundRecord(productOutboundRecord);
+
+            //出库 减库存、箱数、筒数、净重、毛重
+            ProductInventory productInventory = productInventoryMapper.selectProductInventoryByQrCode(productHandsetOutboundRecord1.getQrCode());
+            ProductInventory editProductInventory = new ProductInventory();
+            editProductInventory.setId(productInventory.getId());
+            //筒数
+            if(productInventory.getTotalCanisterNum() - productHandsetOutboundRecord1.getCanisterNum() < 0){
+                return AjaxResult.error("当前库存筒数不足");
+            }else {
+                editProductInventory.setTotalCanisterNum(productInventory.getTotalCanisterNum() - productHandsetOutboundRecord1.getCanisterNum());
+            }
+            //箱数
+            if(productInventory.getTotalBoxNum() - 1 < 0){
+                return AjaxResult.error("当前库存箱数不足");
+            }else {
+                editProductInventory.setTotalBoxNum(productInventory.getTotalBoxNum() - 1);
+            }
+            //净重
+            if(productInventory.getTotalSuttle() - productHandsetOutboundRecord1.getSuttle() < 0){
+                return AjaxResult.error("当前库存净重不足");
+            }else {
+                editProductInventory.setTotalSuttle(handlingWeight(productInventory.getTotalSuttle() - productHandsetOutboundRecord1.getSuttle()));
+            }
+            //毛重
+            if (productInventory.getTotalGrossWeight() - productHandsetOutboundRecord1.getGrossWeight() < 0){
+                return AjaxResult.error("当前库存毛重不足");
+            }else {
+                editProductInventory.setTotalGrossWeight(handlingWeight(productInventory.getTotalGrossWeight() - productHandsetOutboundRecord1.getGrossWeight()));
+            }
+            productInventoryMapper.updateProductInventory(editProductInventory);
+
+        }
+        return AjaxResult.success();
+    }
+
     //保留两位小数
     public Double handlingWeight(Double weight){
         DecimalFormat df = new DecimalFormat("0.00");

+ 185 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInvoiceServiceImpl.java

@@ -0,0 +1,185 @@
+package com.zkqy.business.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import com.zkqy.business.domain.*;
+import com.zkqy.business.domain.vo.ProductInvoiceVO;
+import com.zkqy.business.mapper.*;
+import com.zkqy.common.utils.DateUtils;
+import com.zkqy.common.utils.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.business.service.IProductInvoiceService;
+
+/**
+ * 产品发货单Service业务层处理
+ * 
+ * @author zkqy
+ * @date 2024-04-11
+ */
+@Service
+public class ProductInvoiceServiceImpl implements IProductInvoiceService 
+{
+    @Autowired
+    private ProductInvoiceMapper productInvoiceMapper;
+
+    @Autowired
+    private SaleProductsMapper saleProductsMapper;
+
+    @Autowired
+    private ProductOutboundRecordMapper productOutboundRecordMapper;
+
+    @Autowired
+    private ProductInventoryMapper productInventoryMapper;
+
+    @Autowired
+    private SaleOrderMapper saleOrderMapper;
+
+    @Autowired
+    private ProductHandsetOutboundRecordMapper productHandsetOutboundRecordMapper;
+
+    /**
+     * 查询产品发货单
+     * 
+     * @param id 产品发货单主键
+     * @return 产品发货单
+     */
+    @Override
+    public ProductInvoice selectProductInvoiceById(Long id)
+    {
+        return productInvoiceMapper.selectProductInvoiceById(id);
+    }
+
+    /**
+     * 查询产品发货单列表
+     * 
+     * @param productInvoice 产品发货单
+     * @return 产品发货单
+     */
+    @Override
+    public List<ProductInvoice> selectProductInvoiceList(ProductInvoice productInvoice)
+    {
+        return productInvoiceMapper.selectProductInvoiceList(productInvoice);
+    }
+
+    /**
+     * 新增产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    @Override
+    public int insertProductInvoice(ProductInvoice productInvoice)
+    {
+        productInvoice.setCreateTime(DateUtils.getNowDate());
+        productInvoice.setCreateBy(SecurityUtils.getUsername());
+        productInvoice.setCreateById(SecurityUtils.getUserId());
+        return productInvoiceMapper.insertProductInvoice(productInvoice);
+    }
+
+    /**
+     * 修改产品发货单
+     * 
+     * @param productInvoice 产品发货单
+     * @return 结果
+     */
+    @Override
+    public int updateProductInvoice(ProductInvoice productInvoice)
+    {
+        productInvoice.setUpdateTime(DateUtils.getNowDate());
+        productInvoice.setUpdateById(SecurityUtils.getUserId());
+        productInvoice.setUpdateBy(SecurityUtils.getUsername());
+        return productInvoiceMapper.updateProductInvoice(productInvoice);
+    }
+
+    /**
+     * 批量删除产品发货单
+     * 
+     * @param ids 需要删除的产品发货单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProductInvoiceByIds(Long[] ids)
+    {
+        return productInvoiceMapper.deleteProductInvoiceByIds(ids);
+    }
+
+    /**
+     * 删除产品发货单信息
+     * 
+     * @param id 产品发货单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProductInvoiceById(Long id)
+    {
+        return productInvoiceMapper.deleteProductInvoiceById(id);
+    }
+
+
+    @Override
+    public ProductInvoiceVO productInvoiceInfo(String saleOrderNo) {
+        ProductInvoiceVO vo = new ProductInvoiceVO();
+        // 顶部数据回显
+        ProductInvoice productInvoice = productInvoiceMapper.selectProductInvoiceBySaleOrderNo(saleOrderNo);
+        if(productInvoice != null){
+            BeanUtils.copyProperties(productInvoice, vo);
+        }
+        //表格数据
+        //根据销售单编号查询货品信息
+        List<ProductInvoiceVO.SaleProductInfo> saleProductInfoList = saleProductsMapper.selectSaleProductsInfo(saleOrderNo);
+        if(productInvoice != null){
+            for (ProductInvoiceVO.SaleProductInfo saleProductInfo : saleProductInfoList){
+                //获取箱数重量
+                ProductOutboundRecord productOutboundRecord = productOutboundRecordMapper.statisticsBoxNumSuttle(saleProductInfo.getProductId(), productInvoice.getNoticeNumber());
+                if(productOutboundRecord != null){
+                    saleProductInfo.setBoxNum(productOutboundRecord.getBoxNum());
+                    saleProductInfo.setWeight(productOutboundRecord.getSuttle() == null ? 0 : productOutboundRecord.getSuttle());
+                }
+            }
+        }
+        //查询当前批号库存箱数,重量
+        ProductInventory productInventory1 = new ProductInventory();
+        productInventory1.setId(saleProductInfoList.get(0).getProductId());
+        productInventory1.setLotNum(saleProductInfoList.get(0).getLotNum());
+        ProductInventory productInventory = productInventoryMapper.selectProductInventoryByLotNumAndProductId(productInventory1);
+        if(productInventory != null){
+            vo.setInventoryBoxNum(productInventory.getTotalBoxNum());
+            vo.setInventoryWeight(productInventory.getTotalSuttle());
+        }else {
+            vo.setInventoryBoxNum(0);
+            vo.setInventoryWeight(0.0);
+        }
+
+        //客户编号
+        vo.setCustomerId(saleOrderMapper.selectCustomerIdBySaleNo(saleOrderNo));
+        vo.setSaleProductInfoList(saleProductInfoList);
+        return vo;
+    }
+
+    @Override
+    public ProductInvoiceVO saleStorageDetails(Long id) {
+        ProductInvoiceVO vo = new ProductInvoiceVO();
+        //查询发货通知单详情
+        ProductInvoice productInvoice = productInvoiceMapper.selectProductInvoiceById(id);
+        BeanUtils.copyProperties(productInvoice, vo);
+        //查询发货单货品详情,循环得到货品实发箱数、重量
+        List<ProductInvoiceVO.SaleProductInfo> saleProductInfoList = saleProductsMapper.selectSaleProductsInfo(productInvoice.getSaleOrderNo());
+        for (ProductInvoiceVO.SaleProductInfo saleProductInfo : saleProductInfoList){
+            //实发箱数、重量
+            ProductHandsetOutboundRecord productHandsetOutboundRecord =
+                    productHandsetOutboundRecordMapper.selectBoxNumSuttle(saleProductInfo.getProductId(), productInvoice.getNoticeNumber());
+            if(productHandsetOutboundRecord != null){
+                saleProductInfo.setBoxNum(productHandsetOutboundRecord.getBoxNum());
+                saleProductInfo.setWeight(productHandsetOutboundRecord.getSuttle() == null ? 0 : productHandsetOutboundRecord.getSuttle());
+            }
+        }
+
+        //客户编号
+        vo.setCustomerId(saleOrderMapper.selectCustomerIdBySaleNo(productInvoice.getSaleOrderNo()));
+        vo.setSaleProductInfoList(saleProductInfoList);
+        return vo;
+    }
+}

+ 217 - 0
zkqy-custom-business/src/main/resources/mapper/business/ProductHandsetOutboundRecordMapper.xml

@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zkqy.business.mapper.ProductHandsetOutboundRecordMapper">
+    
+    <resultMap type="com.zkqy.business.domain.ProductHandsetOutboundRecord" id="ProductHandsetOutboundRecordResult">
+        <result property="id"    column="id"    />
+        <result property="qrCode"    column="qr_code"    />
+        <result property="qrCodeId"    column="qr_code_id"    />
+        <result property="lotNum"    column="lot_num"    />
+        <result property="productId"    column="product_id"    />
+        <result property="levels"    column="levels"    />
+        <result property="canisterNum"    column="canister_num"    />
+        <result property="boxNum"    column="box_num"    />
+        <result property="suttle"    column="suttle"    />
+        <result property="productionDate"    column="production_date"    />
+        <result property="machineTool"    column="machine_tool"    />
+        <result property="grossWeight"    column="gross_weight"    />
+        <result property="packaging"    column="packaging"    />
+        <result property="workShifts"    column="work_shifts"    />
+        <result property="foreignTradeNumber"    column="foreign_trade_number"    />
+        <result property="canisterWeight"    column="canister_weight"    />
+        <result property="boxWeight"    column="box_weight"    />
+        <result property="tubeColor"    column="tube_color"    />
+        <result property="comPort"    column="com_port"    />
+        <result property="printFormat"    column="print_format"    />
+        <result property="packagingType"    column="packaging_type"    />
+        <result property="storageLocation"    column="storage_location"    />
+        <result property="warehouseregionId"    column="warehouseregion_id"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="warehousingTime"    column="warehousing_time"    />
+        <result property="depositor"    column="depositor"    />
+        <result property="warehouseId"    column="warehouse_id"    />
+        <result property="noticeNumber"    column="notice_number"    />
+    </resultMap>
+
+    <sql id="selectProductHandsetOutboundRecordVo">
+        select id, qr_code, qr_code_id, lot_num, product_id, levels, canister_num, box_num, suttle, production_date, machine_tool, gross_weight, packaging, work_shifts, foreign_trade_number, canister_weight, box_weight, tube_color, com_port, print_format, packaging_type, storage_location, warehouseregion_id, remark, del_flag, create_by, create_by_id, create_time, update_by, update_by_id, update_time, warehousing_time, depositor, warehouse_id, notice_number from {DBNAME}.product_handset_outbound_record
+    </sql>
+
+    <select id="selectProductHandsetOutboundRecordList" parameterType="com.zkqy.business.domain.ProductHandsetOutboundRecord" resultMap="ProductHandsetOutboundRecordResult">
+        <include refid="selectProductHandsetOutboundRecordVo"/>
+        where del_flag = '0'
+            <if test="qrCode != null  and qrCode != ''"> and qr_code = #{qrCode}</if>
+            <if test="qrCodeId != null  and qrCodeId != ''"> and qr_code_id = #{qrCodeId}</if>
+            <if test="lotNum != null  and lotNum != ''"> and lot_num = #{lotNum}</if>
+            <if test="productId != null "> and product_id = #{productId}</if>
+            <if test="levels != null  and levels != ''"> and levels = #{levels}</if>
+            <if test="canisterNum != null "> and canister_num = #{canisterNum}</if>
+            <if test="boxNum != null "> and box_num = #{boxNum}</if>
+            <if test="suttle != null "> and suttle = #{suttle}</if>
+            <if test="productionDate != null "> and production_date = #{productionDate}</if>
+            <if test="machineTool != null  and machineTool != ''"> and machine_tool = #{machineTool}</if>
+            <if test="grossWeight != null "> and gross_weight = #{grossWeight}</if>
+            <if test="packaging != null  and packaging != ''"> and packaging = #{packaging}</if>
+            <if test="workShifts != null  and workShifts != ''"> and work_shifts = #{workShifts}</if>
+            <if test="foreignTradeNumber != null  and foreignTradeNumber != ''"> and foreign_trade_number = #{foreignTradeNumber}</if>
+            <if test="canisterWeight != null "> and canister_weight = #{canisterWeight}</if>
+            <if test="boxWeight != null "> and box_weight = #{boxWeight}</if>
+            <if test="tubeColor != null  and tubeColor != ''"> and tube_color = #{tubeColor}</if>
+            <if test="comPort != null  and comPort != ''"> and com_port = #{comPort}</if>
+            <if test="printFormat != null  and printFormat != ''"> and print_format = #{printFormat}</if>
+            <if test="packagingType != null  and packagingType != ''"> and packaging_type = #{packagingType}</if>
+            <if test="storageLocation != null  and storageLocation != ''"> and storage_location = #{storageLocation}</if>
+            <if test="warehouseregionId != null "> and warehouseregion_id = #{warehouseregionId}</if>
+            <if test="remark != null  and remark != ''"> and remark = #{remark}</if>
+            <if test="warehousingTime != null "> and warehousing_time = #{warehousingTime}</if>
+            <if test="depositor != null  and depositor != ''"> and depositor = #{depositor}</if>
+            <if test="warehouseId != null "> and warehouse_id = #{warehouseId}</if>
+            <if test="noticeNumber != null  and noticeNumber != ''"> and notice_number = #{noticeNumber}</if>
+    </select>
+    
+    <select id="selectProductHandsetOutboundRecordById" parameterType="Long" resultMap="ProductHandsetOutboundRecordResult">
+        <include refid="selectProductHandsetOutboundRecordVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertProductHandsetOutboundRecord" parameterType="com.zkqy.business.domain.ProductHandsetOutboundRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into {DBNAME}.product_handset_outbound_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="qrCode != null">qr_code,</if>
+            <if test="qrCodeId != null">qr_code_id,</if>
+            <if test="lotNum != null">lot_num,</if>
+            <if test="productId != null">product_id,</if>
+            <if test="levels != null">levels,</if>
+            <if test="canisterNum != null">canister_num,</if>
+            <if test="boxNum != null">box_num,</if>
+            <if test="suttle != null">suttle,</if>
+            <if test="productionDate != null">production_date,</if>
+            <if test="machineTool != null">machine_tool,</if>
+            <if test="grossWeight != null">gross_weight,</if>
+            <if test="packaging != null">packaging,</if>
+            <if test="workShifts != null">work_shifts,</if>
+            <if test="foreignTradeNumber != null">foreign_trade_number,</if>
+            <if test="canisterWeight != null">canister_weight,</if>
+            <if test="boxWeight != null">box_weight,</if>
+            <if test="tubeColor != null">tube_color,</if>
+            <if test="comPort != null">com_port,</if>
+            <if test="printFormat != null">print_format,</if>
+            <if test="packagingType != null">packaging_type,</if>
+            <if test="storageLocation != null">storage_location,</if>
+            <if test="warehouseregionId != null">warehouseregion_id,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="warehousingTime != null">warehousing_time,</if>
+            <if test="depositor != null">depositor,</if>
+            <if test="warehouseId != null">warehouse_id,</if>
+            <if test="noticeNumber != null">notice_number,</if>
+            del_flag
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="qrCode != null">#{qrCode},</if>
+            <if test="qrCodeId != null">#{qrCodeId},</if>
+            <if test="lotNum != null">#{lotNum},</if>
+            <if test="productId != null">#{productId},</if>
+            <if test="levels != null">#{levels},</if>
+            <if test="canisterNum != null">#{canisterNum},</if>
+            <if test="boxNum != null">#{boxNum},</if>
+            <if test="suttle != null">#{suttle},</if>
+            <if test="productionDate != null">#{productionDate},</if>
+            <if test="machineTool != null">#{machineTool},</if>
+            <if test="grossWeight != null">#{grossWeight},</if>
+            <if test="packaging != null">#{packaging},</if>
+            <if test="workShifts != null">#{workShifts},</if>
+            <if test="foreignTradeNumber != null">#{foreignTradeNumber},</if>
+            <if test="canisterWeight != null">#{canisterWeight},</if>
+            <if test="boxWeight != null">#{boxWeight},</if>
+            <if test="tubeColor != null">#{tubeColor},</if>
+            <if test="comPort != null">#{comPort},</if>
+            <if test="printFormat != null">#{printFormat},</if>
+            <if test="packagingType != null">#{packagingType},</if>
+            <if test="storageLocation != null">#{storageLocation},</if>
+            <if test="warehouseregionId != null">#{warehouseregionId},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="warehousingTime != null">#{warehousingTime},</if>
+            <if test="depositor != null">#{depositor},</if>
+            <if test="warehouseId != null">#{warehouseId},</if>
+            <if test="noticeNumber != null">#{noticeNumber},</if>
+            '0'
+         </trim>
+    </insert>
+
+    <update id="updateProductHandsetOutboundRecord" parameterType="com.zkqy.business.domain.ProductHandsetOutboundRecord">
+        update {DBNAME}.product_handset_outbound_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="qrCode != null">qr_code = #{qrCode},</if>
+            <if test="qrCodeId != null">qr_code_id = #{qrCodeId},</if>
+            <if test="lotNum != null">lot_num = #{lotNum},</if>
+            <if test="productId != null">product_id = #{productId},</if>
+            <if test="levels != null">levels = #{levels},</if>
+            <if test="canisterNum != null">canister_num = #{canisterNum},</if>
+            <if test="boxNum != null">box_num = #{boxNum},</if>
+            <if test="suttle != null">suttle = #{suttle},</if>
+            <if test="productionDate != null">production_date = #{productionDate},</if>
+            <if test="machineTool != null">machine_tool = #{machineTool},</if>
+            <if test="grossWeight != null">gross_weight = #{grossWeight},</if>
+            <if test="packaging != null">packaging = #{packaging},</if>
+            <if test="workShifts != null">work_shifts = #{workShifts},</if>
+            <if test="foreignTradeNumber != null">foreign_trade_number = #{foreignTradeNumber},</if>
+            <if test="canisterWeight != null">canister_weight = #{canisterWeight},</if>
+            <if test="boxWeight != null">box_weight = #{boxWeight},</if>
+            <if test="tubeColor != null">tube_color = #{tubeColor},</if>
+            <if test="comPort != null">com_port = #{comPort},</if>
+            <if test="printFormat != null">print_format = #{printFormat},</if>
+            <if test="packagingType != null">packaging_type = #{packagingType},</if>
+            <if test="storageLocation != null">storage_location = #{storageLocation},</if>
+            <if test="warehouseregionId != null">warehouseregion_id = #{warehouseregionId},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="warehousingTime != null">warehousing_time = #{warehousingTime},</if>
+            <if test="depositor != null">depositor = #{depositor},</if>
+            <if test="warehouseId != null">warehouse_id = #{warehouseId},</if>
+            <if test="noticeNumber != null">notice_number = #{noticeNumber},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteProductHandsetOutboundRecordById" parameterType="Long">
+        delete from product_handset_outbound_record where id = #{id}
+    </delete>
+
+    <delete id="deleteProductHandsetOutboundRecordByIds" parameterType="String">
+        update {DBNAME}.product_handset_outbound_record set del_flag = '2' where id in
+        <foreach item="id" collection="list" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectWhetherExist" resultType="com.zkqy.business.domain.ProductHandsetOutboundRecord">
+        <include refid="selectProductHandsetOutboundRecordVo"/>
+        where del_flag = '0' and qr_code = #{qrCode} and qr_code_id = #{qrCodeId}
+    </select>
+
+    <select id="selectBoxNumSuttle" resultType="com.zkqy.business.domain.ProductHandsetOutboundRecord">
+        select count(1) as boxNum , sum(suttle) as suttle from {DBNAME}.product_handset_outbound_record where product_id = #{productId} and notice_number = #{noticeNumber}
+    </select>
+
+</mapper>

+ 5 - 0
zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml

@@ -215,4 +215,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectProductInventoryVo"/>
         where del_flag = '0' and qr_code = #{qrCode}
     </select>
+
+    <select id="selectProductInventoryByLotNumAndProductId" resultType="com.zkqy.business.domain.ProductInventory">
+        select sum(total_box_num) as totalBoxNum,sum(total_suttle) as totalSuttle  from {DBNAME}.product_inventory where lot_num = #{lotNum} and product_id = #{productId}
+    </select>
+
 </mapper>

+ 176 - 0
zkqy-custom-business/src/main/resources/mapper/business/ProductInvoiceMapper.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zkqy.business.mapper.ProductInvoiceMapper">
+    
+    <resultMap type="com.zkqy.business.domain.ProductInvoice" id="ProductInvoiceResult">
+        <result property="id"    column="id"    />
+        <result property="noticeNumber"    column="notice_number"    />
+        <result property="noticeDate"    column="notice_date"    />
+        <result property="salesman"    column="salesman"    />
+        <result property="customerId"    column="customer_id"    />
+        <result property="customerName" column="custom_name"/>
+        <result property="drawer"    column="drawer"    />
+        <result property="dispatchNoteRemark"    column="dispatch_note_remark"    />
+        <result property="billingType"    column="billing_type"    />
+        <result property="truckRegistration"    column="truck_registration"    />
+        <result property="documentType"    column="document_type"    />
+        <result property="sellingUnit"    column="selling_unit"    />
+        <result property="calculationType"    column="calculation_type"    />
+        <result property="auditOpinion"    column="audit_opinion"    />
+        <result property="status"    column="status"    />
+        <result property="saleOrderNo"    column="sale_order_no"    />
+        <result property="spare1"    column="spare1"    />
+        <result property="spare2"    column="spare2"    />
+        <result property="spare3"    column="spare3"    />
+        <result property="spare4"    column="spare4"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="deliveryWarehouse" column="delivery_warehouse"/>
+        <result property="transferWarehouse" column="transfer_warehouse"/>
+        <result property="deliveryDate" column="deliveryDate"/>
+    </resultMap>
+
+    <sql id="selectProductInvoiceVo">
+        select id, notice_number, notice_date, salesman, customer_id, drawer, dispatch_note_remark, billing_type, truck_registration, document_type, selling_unit, calculation_type, audit_opinion, status, sale_order_no, spare1, spare2, spare3, spare4, remark, del_flag, create_by, create_by_id, create_time, update_by, update_by_id, update_time, delivery_warehouse, transfer_warehouse, delivery_date from {DBNAME}.product_invoice
+    </sql>
+
+    <select id="selectProductInvoiceList" parameterType="com.zkqy.business.domain.ProductInvoice" resultMap="ProductInvoiceResult">
+        SELECT
+            pi.id,
+            pi.notice_number,
+            pi.notice_date,
+            pi.STATUS,
+            c.custom_name,
+            pi.sale_order_no
+            FROM
+            {DBNAME}.product_invoice pi
+            LEFT JOIN {DBNAME}.customer c ON pi.customer_id = c.id
+            WHERE
+            pi.del_flag = '0'
+            AND c.del_flag = '0'
+            <if test="noticeNumber != null  and noticeNumber != ''"> and pi.notice_number = #{noticeNumber}</if>
+            <if test="noticeDate != null "> and pi.notice_date = #{noticeDate}</if>
+            <if test="customerId != null "> and p.customer_id = #{customerId}</if>
+    </select>
+    
+    <select id="selectProductInvoiceById" parameterType="Long" resultMap="ProductInvoiceResult">
+        <include refid="selectProductInvoiceVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertProductInvoice" parameterType="com.zkqy.business.domain.ProductInvoice">
+        insert into {DBNAME}.product_invoice
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="noticeNumber != null">notice_number,</if>
+            <if test="noticeDate != null">notice_date,</if>
+            <if test="salesman != null">salesman,</if>
+            <if test="customerId != null">customer_id,</if>
+            <if test="drawer != null">drawer,</if>
+            <if test="dispatchNoteRemark != null">dispatch_note_remark,</if>
+            <if test="billingType != null">billing_type,</if>
+            <if test="truckRegistration != null">truck_registration,</if>
+            <if test="documentType != null">document_type,</if>
+            <if test="sellingUnit != null">selling_unit,</if>
+            <if test="calculationType != null">calculation_type,</if>
+            <if test="auditOpinion != null">audit_opinion,</if>
+            <if test="status != null">status,</if>
+            <if test="saleOrderNo != null">sale_order_no,</if>
+            <if test="spare1 != null">spare1,</if>
+            <if test="spare2 != null">spare2,</if>
+            <if test="spare3 != null">spare3,</if>
+            <if test="spare4 != null">spare4,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="deliveryWarehouse != null">delivery_warehouse,</if>
+            <if test="transferWarehouse != null">transfer_warehouse,</if>
+            <if test="deliveryDate != null">deliveryDate,</if>
+            del_flag
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="noticeNumber != null">#{noticeNumber},</if>
+            <if test="noticeDate != null">#{noticeDate},</if>
+            <if test="salesman != null">#{salesman},</if>
+            <if test="customerId != null">#{customerId},</if>
+            <if test="drawer != null">#{drawer},</if>
+            <if test="dispatchNoteRemark != null">#{dispatchNoteRemark},</if>
+            <if test="billingType != null">#{billingType},</if>
+            <if test="truckRegistration != null">#{truckRegistration},</if>
+            <if test="documentType != null">#{documentType},</if>
+            <if test="sellingUnit != null">#{sellingUnit},</if>
+            <if test="calculationType != null">#{calculationType},</if>
+            <if test="auditOpinion != null">#{auditOpinion},</if>
+            <if test="status != null">#{status},</if>
+            <if test="saleOrderNo != null">#{saleOrderNo},</if>
+            <if test="spare1 != null">#{spare1},</if>
+            <if test="spare2 != null">#{spare2},</if>
+            <if test="spare3 != null">#{spare3},</if>
+            <if test="spare4 != null">#{spare4},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="deliveryWarehouse != null">#{deliveryWarehouse},</if>
+            <if test="transferWarehouse != null">#{transferWarehouse},</if>
+            <if test="deliveryDate != null">#{deliveryDate},</if>
+            '0'
+         </trim>
+    </insert>
+
+    <update id="updateProductInvoice" parameterType="com.zkqy.business.domain.ProductInvoice">
+        update {DBNAME}.product_invoice
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="noticeNumber != null">notice_number = #{noticeNumber},</if>
+            <if test="noticeDate != null">notice_date = #{noticeDate},</if>
+            <if test="salesman != null">salesman = #{salesman},</if>
+            <if test="customerId != null">customer_id = #{customerId},</if>
+            <if test="drawer != null">drawer = #{drawer},</if>
+            <if test="dispatchNoteRemark != null">dispatch_note_remark = #{dispatchNoteRemark},</if>
+            <if test="billingType != null">billing_type = #{billingType},</if>
+            <if test="truckRegistration != null">truck_registration = #{truckRegistration},</if>
+            <if test="documentType != null">document_type = #{documentType},</if>
+            <if test="sellingUnit != null">selling_unit = #{sellingUnit},</if>
+            <if test="calculationType != null">calculation_type = #{calculationType},</if>
+            <if test="auditOpinion != null">audit_opinion = #{auditOpinion},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="saleOrderNo != null">sale_order_no = #{saleOrderNo},</if>
+            <if test="spare1 != null">spare1 = #{spare1},</if>
+            <if test="spare2 != null">spare2 = #{spare2},</if>
+            <if test="spare3 != null">spare3 = #{spare3},</if>
+            <if test="spare4 != null">spare4 = #{spare4},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="deliveryWarehouse != null">delivery_warehouse = #{deliveryWarehouse},</if>
+            <if test="transferWarehouse != null">transfer_warehouse = #{transferWarehouse},</if>
+            <if test="deliveryDate != null">deliveryDate = #{deliveryDate},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteProductInvoiceById" parameterType="Long">
+        delete from product_invoice where id = #{id}
+    </delete>
+
+    <delete id="deleteProductInvoiceByIds" parameterType="String">
+        delete from product_invoice where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectProductInvoiceBySaleOrderNo" resultType="com.zkqy.business.domain.ProductInvoice">
+        <include refid="selectProductInvoiceVo"/>
+        where sale_order_no = #{saleOrderNo} and del_flag = '0'
+    </select>
+</mapper>

+ 13 - 14
zkqy-custom-business/src/main/resources/mapper/business/ProductOutboundRecordMapper.xml

@@ -39,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="warehousingTime"    column="warehousing_time"    />
         <result property="depositor"    column="depositor"    />
         <result property="warehouseId"    column="warehouse_id"    />
+        <result property="noticeNumber" column="notice_number"/>
     </resultMap>
 
     <resultMap type="com.zkqy.business.domain.vo.ProductCodeListVO" id="ProductCodeListResultVO">
@@ -85,7 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectProductOutboundRecordVo">
-        select id, qr_code, qr_code_id, lot_num, product_id, levels, canister_num, box_num, suttle, production_date, machine_tool, gross_weight, packaging, work_shifts, foreign_trade_number, canister_weight, box_weight, tube_color, com_port, print_format, packaging_type, storage_location, warehouseregion_id, remark, del_flag, create_by, create_by_id, create_time, update_by, update_by_id, update_time, warehousing_time, depositor, warehouse_id from {DBNAME}.product_outbound_record
+        select id, qr_code, qr_code_id, lot_num, product_id, levels, canister_num, box_num, suttle, production_date, machine_tool, gross_weight, packaging, work_shifts, foreign_trade_number, canister_weight, box_weight, tube_color, com_port, print_format, packaging_type, storage_location, warehouseregion_id, remark, del_flag, create_by, create_by_id, create_time, update_by, update_by_id, update_time, warehousing_time, depositor, warehouse_id,notice_number from {DBNAME}.product_outbound_record
     </sql>
 
     <select id="selectProductOutboundRecordList" parameterType="com.zkqy.business.domain.ProductOutboundRecord" resultMap="ProductOutboundRecordResult">
@@ -150,16 +151,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="storageLocation != null">storage_location,</if>
             <if test="warehouseregionId != null">warehouseregion_id,</if>
             <if test="remark != null">remark,</if>
-            <if test="delFlag != null">del_flag,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createById != null">create_by_id,</if>
             <if test="createTime != null">create_time,</if>
-            <if test="updateBy != null">update_by,</if>
-            <if test="updateById != null">update_by_id,</if>
-            <if test="updateTime != null">update_time,</if>
             <if test="warehousingTime != null">warehousing_time,</if>
             <if test="depositor != null">depositor,</if>
             <if test="warehouseId != null">warehouse_id,</if>
+            <if test="noticeNumber != null">notice_number,</if>
+            del_flag
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="qrCode != null">#{qrCode},</if>
@@ -185,16 +184,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="storageLocation != null">#{storageLocation},</if>
             <if test="warehouseregionId != null">#{warehouseregionId},</if>
             <if test="remark != null">#{remark},</if>
-            <if test="delFlag != null">#{delFlag},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createById != null">#{createById},</if>
             <if test="createTime != null">#{createTime},</if>
-            <if test="updateBy != null">#{updateBy},</if>
-            <if test="updateById != null">#{updateById},</if>
-            <if test="updateTime != null">#{updateTime},</if>
             <if test="warehousingTime != null">#{warehousingTime},</if>
             <if test="depositor != null">#{depositor},</if>
             <if test="warehouseId != null">#{warehouseId},</if>
+            <if test="noticeNumber != null">#{noticeNumber},</if>
+            '0'
          </trim>
     </insert>
 
@@ -224,16 +221,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="storageLocation != null">storage_location = #{storageLocation},</if>
             <if test="warehouseregionId != null">warehouseregion_id = #{warehouseregionId},</if>
             <if test="remark != null">remark = #{remark},</if>
-            <if test="delFlag != null">del_flag = #{delFlag},</if>
-            <if test="createBy != null">create_by = #{createBy},</if>
-            <if test="createById != null">create_by_id = #{createById},</if>
-            <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateById != null">update_by_id = #{updateById},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="warehousingTime != null">warehousing_time = #{warehousingTime},</if>
             <if test="depositor != null">depositor = #{depositor},</if>
             <if test="warehouseId != null">warehouse_id = #{warehouseId},</if>
+            <if test="noticeNumber != null">notice_number = #{noticeNumber},</if>
         </trim>
         where id = #{id}
     </update>
@@ -263,7 +257,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         count( r.id ) AS total_box_num,
         sum( r.gross_weight ) AS total_gross_weight,
         r.work_shifts,
-        r.production_date
+        r.production_date,
+        r.remark
         FROM
         {DBNAME}.product_outbound_record r
         LEFT JOIN {DBNAME}.production p ON r.product_id = p.id
@@ -282,4 +277,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where del_flag = '0' and qr_code = #{qrCode} and qr_code_id = #{qrCodeId}
     </select>
 
+    <select id="statisticsBoxNumSuttle" resultType="com.zkqy.business.domain.ProductOutboundRecord">
+        select count(1) as boxNum , sum(suttle) as suttle from {DBNAME}.product_outbound_record where product_id = #{productId} and notice_number = #{noticeNumber}
+    </select>
+
 </mapper>

+ 2 - 1
zkqy-custom-business/src/main/resources/mapper/business/ProductWarehousingRecordMapper.xml

@@ -255,7 +255,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             count( r.id ) AS total_box_num,
             sum( r.gross_weight ) AS total_gross_weight,
             r.work_shifts,
-            r.production_date
+            r.production_date,
+            r.remark
         FROM
         {DBNAME}.product_warehousing_record r
                 LEFT JOIN {DBNAME}.production p ON r.product_id = p.id

+ 12 - 0
zkqy-custom-business/src/main/resources/mapper/business/SaleOrderMapper.xml

@@ -236,4 +236,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where sale_no = #{saleNo}
     </update>
 
+    <select id="selectCustomerIdBySaleNo" resultType="long">
+        SELECT
+            c.id
+        FROM
+            {DBNAME}.sale_order so
+                LEFT JOIN {DBNAME}.customer c ON so.sale_custom_no = c.custom_no
+        WHERE
+            so.sale_no = #{saleNo}
+          AND so.del_flag = '0'
+          AND c.del_flag = '0'
+    </select>
+
 </mapper>

+ 30 - 2
zkqy-custom-business/src/main/resources/mapper/business/SaleProductsMapper.xml

@@ -100,7 +100,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         INNER JOIN {DBNAME}.sale_order AS so ON sp.sale_order_no = so.sale_no
         Inner Join {DBNAME}.customer as cs ON so.sale_custom_no= cs.custom_no
         inner join   {DBNAME}.materiel as m on sp.colour_number= m.materiel_code
-        <where>
+        where sp.del_flag = '0' and cs.del_flag = '0' and m.del_flag = '0'
             <if test="saleProductNo != null  and saleProductNo != ''"> and sale_product_no = #{saleProductNo}</if>
             <if test="saleOrderNo != null  and saleOrderNo != ''"> and sale_order_no = #{saleOrderNo}</if>
             <if test="productNo != null  and productNo != ''"> and product_no = #{productNo}</if>
@@ -120,7 +120,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sliceType != null  and sliceType != ''"> and slice_type = #{sliceType}</if>
             <if test="colourNumber != null  and colourNumber != ''"> and colour_number = #{colourNumber}</if>
             <if test="lotNumber != null  and lotNumber != ''"> and lot_number = #{lotNumber}</if>
-        </where>
     </select>
 
     <select id="selectSaleProductsById" parameterType="Long" resultMap="SaleProductsResult">
@@ -238,4 +237,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectSaleProductsIds" resultType="long">
         select id from {DBNAME}.sale_products where sale_order_no = #{saleOrderNo}
     </select>
+
+    <select id="selectSaleProductsInfo" resultType="com.zkqy.business.domain.vo.ProductInvoiceVO$SaleProductInfo">
+        SELECT
+            a.*,
+            pi.levels
+        FROM
+            (
+                SELECT
+                    pt.id AS productId,
+                    pt.product_no AS productCode,
+                    pt.product_name AS productName,
+                    pt.product_specifications AS productSpecifications,
+                    sp.lot_number AS lotNum,
+                    sp.product_unit_price AS unitPrice,
+                    pt.product_color AS productColor,
+                    pt.product_type AS productType,
+                    sp.remark,
+                    sp.product_number AS actualWeight
+                FROM
+                    {DBNAME}.sale_products sp
+                        LEFT JOIN {DBNAME}.production pt ON sp.product_no = pt.product_no
+                WHERE
+                    sp.del_flag = '0'
+                  AND pt.del_flag = '0'
+                  AND sp.sale_order_no = #{saleOrderNo}
+            ) AS a
+                LEFT JOIN {DBNAME}.product_inventory pi ON a.productId = pi.product_id
+                AND a.lotNum = pi.lot_num AND pi.del_flag = '0'
+    </select>
 </mapper>