Parcourir la source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductCodeListController.java
#	zkqy-ui/src/views/login.vue
hmc il y a 9 mois
Parent
commit
15aaf841e4
30 fichiers modifiés avec 3209 ajouts et 221 suppressions
  1. 6 1
      zkqy-admin/src/main/resources/mybatis/mybatis-config.xml
  2. 190 175
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductCodeListController.java
  3. 7 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInventoryController.java
  4. 155 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/RequisitionOrdersController.java
  5. 1 3
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductCodeList.java
  6. 238 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/RequisitionItems.java
  7. 265 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/RequisitionOrders.java
  8. 8 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInvoiceMapper.java
  9. 112 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/RequisitionOrdersMapper.java
  10. 16 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductCodeListService.java
  11. 8 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInventoryService.java
  12. 99 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IRequisitionOrdersService.java
  13. 46 1
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductCodeListServiceImpl.java
  14. 140 18
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java
  15. 229 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/RequisitionOrdersServiceImpl.java
  16. 3 3
      zkqy-custom-business/src/main/resources/mapper/business/CustomerMapper.xml
  17. 3 2
      zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml
  18. 4 0
      zkqy-custom-business/src/main/resources/mapper/business/ProductInvoiceMapper.xml
  19. 382 0
      zkqy-custom-business/src/main/resources/mapper/business/RequisitionOrdersMapper.xml
  20. 2 3
      zkqy-custom-business/src/main/resources/mapper/business/SaleAccountsReceivableDetailMapper.xml
  21. 1 1
      zkqy-ui/src/api/bpmprocess/process.js
  22. 70 0
      zkqy-ui/src/api/huaxian/requisitionOrders.js
  23. 6 5
      zkqy-ui/src/views/login.vue
  24. 1 0
      zkqy-ui/src/views/orderMange/components/dialogForm/OutStockDetail.vue
  25. 3 2
      zkqy-ui/src/views/orderMange/comprehensiveInventory/index.vue
  26. 1 1
      zkqy-ui/src/views/orderMange/index.vue
  27. 478 0
      zkqy-ui/src/views/orderMange/requisitionOrders/approval.vue
  28. 723 0
      zkqy-ui/src/views/orderMange/requisitionOrders/index.vue
  29. 1 0
      zkqy-ui/src/views/orderMange/retailMange/index.vue
  30. 11 6
      zkqy-ui/src/views/system/financialManage/invoiceDetail.vue

+ 6 - 1
zkqy-admin/src/main/resources/mybatis/mybatis-config.xml

@@ -13,13 +13,18 @@
         <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
         <setting name="defaultExecutorType" value="SIMPLE"/>
         <!-- 指定 MyBatis 所用日志的具体实现 -->
-        <setting name="logImpl" value="SLF4J"/>
+         <setting name="logImpl" value="SLF4J"/>
+        <!--        调试-->
+        <!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
+        <!--        <setting name="lazyLoadingEnabled" value="false"/>-->
+        <!--        <setting name="aggressiveLazyLoading" value="true"/>-->
         <!-- 使用驼峰命名法转换字段 -->
         <setting name="mapUnderscoreToCamelCase" value="true"/>
         <!-- value为空时显示key -->
         <setting name="callSettersOnNulls" value="true"/>
         <!--驼峰转换-->
         <setting name="mapUnderscoreToCamelCase" value="true"/>
+
     </settings>
 
     <!-- 类型处理器-->

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

@@ -3,7 +3,7 @@ package com.zkqy.business.controller;
 import java.util.List;
 
 import com.zkqy.business.domain.ProductWarehousingRecord;
-//import com.zkqy.business.domain.vo.NewOldProductCodeListVO;
+import com.zkqy.business.domain.vo.NewOldProductCodeListVO;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
 import com.zkqy.business.service.IProductOutboundRecordService;
 import com.zkqy.business.service.IProductWarehousingRecordService;
@@ -46,180 +46,195 @@ public class ProductCodeListController extends BaseController {
     @Autowired // 出库记录
     private IProductOutboundRecordService productOutboundRecordService;
 
-//    /**
-//     * 查询产品码单列表
-//     */
-//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:list')")
-//    @GetMapping("/list")
-//    @ApiOperation(value = "查询产品码单列表")
-//    public TableDataInfo list(ProductCodeListVO vo) {
-//        startPage();
-//        List<ProductCodeListVO> list = productCodeListService.selectProductCodeListList(vo);
-//        return getDataTable(list);
-//    }
-//
-//    @GetMapping("/listBySaleProductID")
-//    @ApiOperation(value = "接续操作")
-//    public TableDataInfo list(ProductCodeList productCodeList) {
-//        startPage();
-//        List<ProductCodeListVO> list = productCodeListService.selectProductCodeListBySaleProductId(productCodeList);
-//        return getDataTable(list);
-//    }
-//    /**
-//     * 导出产品码单列表
-//     */
-////    //@PreAuthorize("@ss.hasPermi('system:productCodeList:export')")
-////    @Log(title = "产品码单", businessType = BusinessType.EXPORT)
-////    @PostMapping("/export")
-////    @ApiOperation(value = "导出产品码单列表")
-////    public void export(HttpServletResponse response, ProductCodeList productCodeList)
-////    {
-////        ProductCodeListVO vo = new ProductCodeListVO();
-////        BeanUtils.copyProperties(productCodeList,vo);
-////        List<ProductCodeList> list = productCodeListService.selectProductCodeListList(vo);
-////        ExcelUtil<ProductCodeList> util = new ExcelUtil<ProductCodeList>(ProductCodeList.class);
-////        util.exportExcel(response, list, "产品码单数据");
-////    }
-//
-//    /**
-//     * 获取产品码单详细信息
-//     */
-//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:query')")
-//    @GetMapping(value = "/{id}")
-//    @ApiOperation(value = "获取产品码单详细信息")
-//    public AjaxResult getInfo(@PathVariable("id") Long id) {
-//        return success(productCodeListService.selectProductCodeListById(id));
-//    }
-//
-//    /***
-//     * 根据父级查询产品码单信息
-//     */
-//    @GetMapping("/queryCodeListByParentCode/{parentCode}")
-//    public AjaxResult queryCodeListByQrCode(@PathVariable("parentCode") String parentCode) {
-//        return success(productCodeListService.selectProductCodeInfoByParentCode(parentCode));
-//    }
-//
-//    /**
-//     * 新增产品码单
-//     */
-//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:add')")
-//    @Log(title = "产品码单", businessType = BusinessType.INSERT)
-//    @PostMapping
-//    @ApiOperation(value = "新增产品码单")
-//    public AjaxResult add(@RequestBody ProductCodeListVO vo) {
-//        return AjaxResult.success(productCodeListService.insertProductCodeList(vo));
-//    }
-//
-//    /**
-//     * 修改产品码单
-//     */
-//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:edit')")
-//    @Log(title = "产品码单", businessType = BusinessType.UPDATE)
-//    @PutMapping
-//    @ApiOperation(value = "修改产品码单")
-//    @Transactional
-//    public AjaxResult edit(@RequestBody NewOldProductCodeListVO newOldProductCodeListVO) {
-//
-//        //查询成品库存表,查看当前码单是否已经入库,入库则不能修改
-//        // ProductWarehousingRecord productWarehousingRecord = new ProductWarehousingRecord();
-//        // productWarehousingRecord.setQrCode(vo.getQrCode());
-//        // List<ProductWarehousingRecord> productWarehousingRecordList = productWarehousingRecordService.selectProductWarehousingRecordList(productWarehousingRecord);
-//        // if (productWarehousingRecordList.size() > 0) {
-//        //      return AjaxResult.warn("该码单已入库,不能修改!");
-//        // }
-//
-//        // 查询出库记录、如果当前码单已经出库,则不能修改
-//        ProductCodeListVO productCodeListVO = new ProductCodeListVO();
-//        productCodeListVO.setQrCode(newOldProductCodeListVO.getOldVo().getQrCode());
-//        productCodeListVO.setLotNum(newOldProductCodeListVO.getOldVo().getLotNum());
-//        productCodeListVO.setQrCodeId(newOldProductCodeListVO.getOldVo().getQrCodeId());
-//        int out = productOutboundRecordService.selectProductOutboundRecordList(productCodeListVO).size();
-//        if (out != 0) {
-//            return AjaxResult.warn("该码单已出库,不能修改!");
-//        }
-//        try {
-//            // 删除原码单数据
-//            productCodeListService.deleteProductCodeListById(newOldProductCodeListVO.getOldVo().getId());
-//            // 新增码单
-//            // productCodeListService.insertProductCodeList(newVo);
-//            // 修改入库记录码单信息(删除后新增 同时删除对应库存)
-//            // productWarehousingRecordService.updateProductWarehousingRecordRecord(newVo);
-//            productWarehousingRecordService.deleteProductWarehousingRecordByQrCode(newOldProductCodeListVO.getNewVo());
-//            // 更新库存数据(重新入库)
-//            productCodeListService.insertProductCodeList(newOldProductCodeListVO.getNewVo());
-//            return toAjax(true);
-//        } catch (Exception e) {
-//            return toAjax(false);
-//        }
-//    }
-//
-//    /**
-//     * 修改总码单信息
-//     */
-//    @Log(title = "产品码单", businessType = BusinessType.UPDATE)
-//    @PutMapping("/updateAssembleProductCode")
-//    @ApiOperation(value = "修改产品码单")
-//    @Transactional
-//    public AjaxResult editById(@RequestBody ProductCodeListVO vo) {
-//        return AjaxResult.success(productCodeListService.updateProductCodeList(vo));
-//    }
-//
-//
-//    /**
-//     * 删除产品码单
-//     */
-//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:remove')")
-//    @Log(title = "产品码单", businessType = BusinessType.DELETE)
-//    @DeleteMapping("/{ids}")
-//    @ApiOperation(value = "删除产品码单")
-//    public AjaxResult remove(@PathVariable String[] ids) {
-//        return toAjax(productCodeListService.deleteProductCodeListByIds(ids));
-//    }
-//
-//    /**
-//     * 生产完成产品列表
-//     */
-//    @GetMapping("/finishedProductList")
-//    public AjaxResult finishedProductList(ProductCodeList productCodeList) {
-//        return AjaxResult.success(productCodeListService.selectFinishedProduct(productCodeList));
-//    }
-//
-//    /**
-//     * 获取码单号
-//     */
-//    @GetMapping("/getQrCode")
-//    public AjaxResult getQrCode() {
-//        return AjaxResult.success(productCodeListService.selectMaxCodeList());
-//    }
-//
-//
-//    /**
-//     * 获取当前码单完整信息
-//     */
-//    @GetMapping("/getProductCodeListById/{id}")
-//    public AjaxResult getProductCodeListById(@PathVariable("id") Long id) {
-//        return AjaxResult.success(productCodeListService.getProductCodeListById(id));
-//    }
-//
-//    /**
-//     * 删除二维码信息、更新库存、入库记录等
-//     *
-//     * @param productCodeListVO
-//     * @return
-//     */
-//    @DeleteMapping("/removeProductCodeASInventory")
-//    @ApiOperation(value = "删除产品码单详情")
-//    public AjaxResult removeInventory(@RequestBody ProductCodeListVO productCodeListVO) {
-//        return productCodeListService.deleteProductCodeListInfoByInfo(productCodeListVO);
-//    }
-//
-//
-//    /**
-//     * 得到当前总码单中所包含的码单信息
-//     */
-//    @GetMapping("/getOutProductCodeList")
-//    public AjaxResult getOutProductCodeList(String parentCode) {
-//        return AjaxResult.success(productCodeListService.selectProductCodeListByParentCode(parentCode));
+    /**
+     * 查询产品码单列表
+     */
+    //@PreAuthorize("@ss.hasPermi('system:productCodeList:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "查询产品码单列表")
+    public TableDataInfo list(ProductCodeListVO vo) {
+        startPage();
+        List<ProductCodeListVO> list = productCodeListService.selectProductCodeListList(vo);
+        return getDataTable(list);
+    }
+
+    @GetMapping("/listBySaleProductID")
+    @ApiOperation(value = "接续操作")
+    public TableDataInfo list(ProductCodeList productCodeList) {
+        startPage();
+        List<ProductCodeListVO> list = productCodeListService.selectProductCodeListBySaleProductId(productCodeList);
+        return getDataTable(list);
+    }
+    /**
+     * 导出产品码单列表
+     */
+//    //@PreAuthorize("@ss.hasPermi('system:productCodeList:export')")
+//    @Log(title = "产品码单", businessType = BusinessType.EXPORT)
+//    @PostMapping("/export")
+//    @ApiOperation(value = "导出产品码单列表")
+//    public void export(HttpServletResponse response, ProductCodeList productCodeList)
+//    {
+//        ProductCodeListVO vo = new ProductCodeListVO();
+//        BeanUtils.copyProperties(productCodeList,vo);
+//        List<ProductCodeList> list = productCodeListService.selectProductCodeListList(vo);
+//        ExcelUtil<ProductCodeList> util = new ExcelUtil<ProductCodeList>(ProductCodeList.class);
+//        util.exportExcel(response, list, "产品码单数据");
 //    }
 
+    /**
+     * 获取产品码单详细信息
+     */
+    //@PreAuthorize("@ss.hasPermi('system:productCodeList:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取产品码单详细信息")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(productCodeListService.selectProductCodeListById(id));
+    }
+
+    /***
+     * 根据父级查询产品码单信息
+     */
+    @GetMapping("/queryCodeListByParentCode/{parentCode}")
+    public AjaxResult queryCodeListByQrCode(@PathVariable("parentCode") String parentCode) {
+        return success(productCodeListService.selectProductCodeInfoByParentCode(parentCode));
+    }
+
+    /**
+     * 新增产品码单
+     */
+    //@PreAuthorize("@ss.hasPermi('system:productCodeList:add')")
+    @Log(title = "产品码单", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "新增产品码单")
+    public AjaxResult add(@RequestBody ProductCodeListVO vo) {
+        return AjaxResult.success(productCodeListService.insertProductCodeList(vo));
+    }
+
+    /**
+     * 修改产品码单
+     */
+    //@PreAuthorize("@ss.hasPermi('system:productCodeList:edit')")
+    @Log(title = "产品码单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "修改产品码单")
+    @Transactional
+    public AjaxResult edit(@RequestBody NewOldProductCodeListVO newOldProductCodeListVO) {
+
+        //查询成品库存表,查看当前码单是否已经入库,入库则不能修改
+        // ProductWarehousingRecord productWarehousingRecord = new ProductWarehousingRecord();
+        // productWarehousingRecord.setQrCode(vo.getQrCode());
+        // List<ProductWarehousingRecord> productWarehousingRecordList = productWarehousingRecordService.selectProductWarehousingRecordList(productWarehousingRecord);
+        // if (productWarehousingRecordList.size() > 0) {
+        //      return AjaxResult.warn("该码单已入库,不能修改!");
+        // }
+
+        // 查询出库记录、如果当前码单已经出库,则不能修改
+        ProductCodeListVO productCodeListVO = new ProductCodeListVO();
+        productCodeListVO.setQrCode(newOldProductCodeListVO.getOldVo().getQrCode());
+        productCodeListVO.setLotNum(newOldProductCodeListVO.getOldVo().getLotNum());
+        productCodeListVO.setQrCodeId(newOldProductCodeListVO.getOldVo().getQrCodeId());
+        int out = productOutboundRecordService.selectProductOutboundRecordList(productCodeListVO).size();
+        if (out != 0) {
+            return AjaxResult.warn("该码单已出库,不能修改!");
+        }
+        try {
+            // 删除原码单数据
+            productCodeListService.deleteProductCodeListById(newOldProductCodeListVO.getOldVo().getId());
+            // 新增码单
+            // productCodeListService.insertProductCodeList(newVo);
+            // 修改入库记录码单信息(删除后新增 同时删除对应库存)
+            // productWarehousingRecordService.updateProductWarehousingRecordRecord(newVo);
+            productWarehousingRecordService.deleteProductWarehousingRecordByQrCode(newOldProductCodeListVO.getNewVo());
+            // 更新库存数据(重新入库)
+            productCodeListService.insertProductCodeList(newOldProductCodeListVO.getNewVo());
+            return toAjax(true);
+        } catch (Exception e) {
+            return toAjax(false);
+        }
+    }
+
+    /**
+     * 修改总码单信息
+     */
+    @Log(title = "产品码单", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateAssembleProductCode")
+    @ApiOperation(value = "修改产品码单")
+    @Transactional
+    public AjaxResult editById(@RequestBody ProductCodeListVO vo) {
+        return AjaxResult.success(productCodeListService.updateProductCodeList(vo));
+    }
+
+
+    /**
+     * 删除产品码单
+     */
+    //@PreAuthorize("@ss.hasPermi('system:productCodeList:remove')")
+    @Log(title = "产品码单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    @ApiOperation(value = "删除产品码单")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(productCodeListService.deleteProductCodeListByIds(ids));
+    }
+
+    /**
+     * 生产完成产品列表
+     */
+    @GetMapping("/finishedProductList")
+    public AjaxResult finishedProductList(ProductCodeList productCodeList) {
+        return AjaxResult.success(productCodeListService.selectFinishedProduct(productCodeList));
+    }
+
+    /**
+     * 获取码单号
+     */
+    @GetMapping("/getQrCode")
+    public AjaxResult getQrCode() {
+        return AjaxResult.success(productCodeListService.selectMaxCodeList());
+    }
+
+
+    /**
+     * 获取当前码单完整信息
+     */
+    @GetMapping("/getProductCodeListById/{id}")
+    public AjaxResult getProductCodeListById(@PathVariable("id") Long id) {
+        return AjaxResult.success(productCodeListService.getProductCodeListById(id));
+    }
+
+    /**
+     * 删除二维码信息、更新库存、入库记录等
+     *
+     * @param productCodeListVO
+     * @return
+     */
+    @DeleteMapping("/removeProductCodeASInventory")
+    @ApiOperation(value = "删除产品码单详情")
+    public AjaxResult removeInventory(@RequestBody ProductCodeListVO productCodeListVO) {
+        return productCodeListService.deleteProductCodeListInfoByInfo(productCodeListVO);
+    }
+
+    /**
+     * 得到当前总码单中所包含的码单信息
+     */
+    @GetMapping("/getOutProductCodeList")
+    public AjaxResult getOutProductCodeList(String parentCode) {
+        return AjaxResult.success(productCodeListService.selectProductCodeListByParentCode(parentCode));
+    }
+
+    /**
+     * 退库码单
+     * 得到当前总码单中所包含的码单信息
+     */
+    @GetMapping("/getStockReturnProductCodeList")
+    public AjaxResult getStockReturnProductCodeList(String parentCode) {
+        return productCodeListService.getStockReturnProductCodeListByParentCode(parentCode);
+    }
+
+    /**
+     * 校验当前码单是否可以进行退库
+     */
+    @PostMapping("/checkProductCode")
+    public AjaxResult checkProductCode(@RequestBody ProductCodeListVO productCodeListVO) {
+        return productCodeListService.checkProductCode(productCodeListVO);
+    }
 }

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

@@ -239,6 +239,13 @@ public class ProductInventoryController extends BaseController {
         return productInventoryService.returnStorage(productCodeListVOList);
     }
 
+    /**
+     * 报废
+     */
+    @PostMapping("/invalidated")
+    public AjaxResult invalidated(@RequestBody List<ProductCodeListVO> productCodeListVOList) {
+        return productInventoryService.invalidated(productCodeListVOList);
+    }
 
     /**
      * 通知单出库接口(老库存)

+ 155 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/RequisitionOrdersController.java

@@ -0,0 +1,155 @@
+package com.zkqy.business.controller;
+
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.RequisitionOrders;
+import com.zkqy.business.service.IRequisitionOrdersService;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import com.zkqy.common.core.page.TableDataInfo;
+
+/**
+ * 领料单Controller
+ *
+ * @author hzh
+ * @date 2024-08-22
+ */
+@RestController
+@RequestMapping("/business/requisitionOrders")
+@Api(value = "/business/requisitionOrders", description = "领料单-接口")
+public class RequisitionOrdersController extends BaseController {
+    @Autowired
+    private IRequisitionOrdersService requisitionOrdersService;
+
+    /**
+     * 查询领料单列表
+     */
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询领料单列表")
+    public TableDataInfo list(RequisitionOrders requisitionOrders) {
+        startPage();
+        List<RequisitionOrders> list = requisitionOrdersService.selectRequisitionOrdersList(requisitionOrders);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出领料单列表
+     */
+
+    @Log(title = "领料单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ApiOperation(value = "导出领料单列表")
+    public void export(HttpServletResponse response, RequisitionOrders requisitionOrders) {
+        List<RequisitionOrders> list = requisitionOrdersService.selectRequisitionOrdersList(requisitionOrders);
+        ExcelUtil<RequisitionOrders> util = new ExcelUtil<RequisitionOrders>(RequisitionOrders.class);
+        util.exportExcel(response, list, "领料单数据");
+    }
+
+    /**
+     * 获取领料单详细信息
+     */
+
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取领料单详细信息")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        RequisitionOrders requisitionOrders = requisitionOrdersService.selectRequisitionOrdersById(id);
+        return success(requisitionOrders);
+    }
+
+    /**
+     * 退料单据回显数据
+     */
+    @GetMapping(value = "/taskCode/{taskCode}")
+    @ApiOperation(value = "获取领料单详细信息")
+    public AjaxResult getTaskInfo(@PathVariable("taskCode") String taskCode) {
+        RequisitionOrders requisitionOrders = requisitionOrdersService.selectRequisitionOrdersByTaskCode(taskCode);
+        return success(requisitionOrders);
+    }
+
+    /**
+     * 新增领料单
+     */
+
+    @Log(title = "领料单", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "新增领料单")
+    public AjaxResult add(@RequestBody RequisitionOrders requisitionOrders) {
+        return toAjax(requisitionOrdersService.insertRequisitionOrders(requisitionOrders));
+    }
+
+    /**
+     * 修改领料单
+     */
+
+    @Log(title = "领料单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "修改领料单")
+    public AjaxResult edit(@RequestBody RequisitionOrders requisitionOrders) {
+        if (requisitionOrders.isRequistionState()) {
+            // 实际领料 -》减物料库存
+            Map<String, Map<String, Object>> retMap = requisitionOrdersService.reduceMaterialInventory(requisitionOrders);
+            requisitionOrdersService.updateRequisitionOrders(requisitionOrders);
+            if (retMap.keySet().size() != 0) {
+                return AjaxResult.warn("部分物料无法完整领取", retMap);
+            }
+            return AjaxResult.success("领料成功");
+        } else {
+            return toAjax(requisitionOrdersService.updateRequisitionOrders(requisitionOrders));
+        }
+    }
+
+    /**
+     * 审批领料单
+     */
+
+    @Log(title = "领料单", businessType = BusinessType.UPDATE)
+    @PutMapping("/approval")
+    @ApiOperation(value = "审批领料单")
+    public AjaxResult approvalEdit(@RequestBody RequisitionOrders requisitionOrders) {
+        // 退料 审批通过
+        if (requisitionOrders.getRequistionOrdersType() == 1 && requisitionOrders.getDataApprovalStatus().equals("1")) {
+            // 更新库存
+            requisitionOrdersService.increaseMaterialInventory(requisitionOrders);
+        }
+        return toAjax(requisitionOrdersService.approvalOrders(requisitionOrders));
+    }
+
+    /**
+     * 删除领料单
+     */
+
+    @Log(title = "领料单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    @ApiOperation(value = "删除领料单")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(requisitionOrdersService.deleteRequisitionOrdersByIds(ids));
+    }
+
+    /**
+     * 查询可以领料任务
+     */
+    @GetMapping("/materialRequisitionTaskList")
+    @ApiOperation(value = "查询领料单列表")
+    public TableDataInfo selectMaterialRequisitionTask(RequisitionOrders requisitionOrders) {
+        startPage();
+        List<Map<String, Object>> list = requisitionOrdersService.selectMaterialRequisitionTask(requisitionOrders);
+        return getDataTable(list);
+    }
+}

+ 1 - 3
zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductCodeList.java

@@ -179,7 +179,7 @@ public class ProductCodeList extends BaseEntity {
     private String qrCodeId;
 
     /**
-     * 退库标识
+     * 退库标识 0:未退库 1:已退库 2:已报废
      */
     private String withdrawingFlag;
 
@@ -199,8 +199,6 @@ public class ProductCodeList extends BaseEntity {
     private int otherStates;
 
 
-
-
     public String getParentCode() {
         return parentCode;
     }

+ 238 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/RequisitionItems.java

@@ -0,0 +1,238 @@
+package com.zkqy.business.domain;
+
+import com.zkqy.common.core.domain.BaseEntity;
+import com.zkqy.common.core.domain.BaseEntityPlus;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zkqy.common.annotation.Excel;
+
+/**
+ * 领料明细对象 requisition_items
+ * 
+ * @author hzh
+ * @date 2024-08-22
+ */
+public class RequisitionItems extends BaseEntityPlus
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 领料单明细ID */
+    private Long id;
+
+    /** 领料单编码 */
+    @Excel(name = "领料单编码")
+    private String requisitionCode;
+
+    /** 物料ID */
+    @Excel(name = "物料ID")
+    private String materialId;
+
+    /** 预计领用数量/重量 */
+    @Excel(name = "预计领用数量/重量")
+    private String quantity;
+
+    /** 实际领用数量/重量 */
+    @Excel(name = "实际领用数量/重量")
+    private String actualQuantity;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String state;
+
+    /** 规格 */
+    @Excel(name = "规格")
+    private String specifications;
+
+    /** 色号 */
+    @Excel(name = "色号")
+    private String colorCode;
+
+    /** 创建者id */
+    @Excel(name = "创建者id")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 数据条审批状态(默认字段 0:已提交、1:已通过、2:不通过、3:未提交、4:驳回、5:审批中) */
+    @Excel(name = "数据条审批状态", readConverterExp = "默=认字段,0=:已提交、1:已通过、2:不通过、3:未提交、4:驳回、5:审批中")
+    private String dataApprovalStatus;
+
+    /** 流程编号 */
+    @Excel(name = "流程编号")
+    private String processKey;
+
+    /** 任务编码 */
+    @Excel(name = "任务编码")
+    private String taskProcessKey;
+
+    /** 任务节点编码 */
+    @Excel(name = "任务节点编码")
+    private String taskNodeKey;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setRequisitionCode(String requisitionCode) 
+    {
+        this.requisitionCode = requisitionCode;
+    }
+
+    public String getRequisitionCode() 
+    {
+        return requisitionCode;
+    }
+    public void setMaterialId(String materialId) 
+    {
+        this.materialId = materialId;
+    }
+
+    public String getMaterialId() 
+    {
+        return materialId;
+    }
+    public void setQuantity(String quantity) 
+    {
+        this.quantity = quantity;
+    }
+
+    public String getQuantity() 
+    {
+        return quantity;
+    }
+    public void setActualQuantity(String actualQuantity) 
+    {
+        this.actualQuantity = actualQuantity;
+    }
+
+    public String getActualQuantity() 
+    {
+        return actualQuantity;
+    }
+    public void setState(String state) 
+    {
+        this.state = state;
+    }
+
+    public String getState() 
+    {
+        return state;
+    }
+    public void setSpecifications(String specifications) 
+    {
+        this.specifications = specifications;
+    }
+
+    public String getSpecifications() 
+    {
+        return specifications;
+    }
+    public void setColorCode(String colorCode) 
+    {
+        this.colorCode = colorCode;
+    }
+
+    public String getColorCode() 
+    {
+        return colorCode;
+    }
+    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 setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setDataApprovalStatus(String dataApprovalStatus) 
+    {
+        this.dataApprovalStatus = dataApprovalStatus;
+    }
+
+    public String getDataApprovalStatus() 
+    {
+        return dataApprovalStatus;
+    }
+    public void setProcessKey(String processKey) 
+    {
+        this.processKey = processKey;
+    }
+
+    public String getProcessKey() 
+    {
+        return processKey;
+    }
+    public void setTaskProcessKey(String taskProcessKey) 
+    {
+        this.taskProcessKey = taskProcessKey;
+    }
+
+    public String getTaskProcessKey() 
+    {
+        return taskProcessKey;
+    }
+    public void setTaskNodeKey(String taskNodeKey) 
+    {
+        this.taskNodeKey = taskNodeKey;
+    }
+
+    public String getTaskNodeKey() 
+    {
+        return taskNodeKey;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("requisitionCode", getRequisitionCode())
+            .append("materialId", getMaterialId())
+            .append("quantity", getQuantity())
+            .append("actualQuantity", getActualQuantity())
+            .append("state", getState())
+            .append("specifications", getSpecifications())
+            .append("colorCode", getColorCode())
+            .append("remark", getRemark())
+            .append("createById", getCreateById())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateById", getUpdateById())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("delFlag", getDelFlag())
+            .append("dataApprovalStatus", getDataApprovalStatus())
+            .append("processKey", getProcessKey())
+            .append("taskProcessKey", getTaskProcessKey())
+            .append("taskNodeKey", getTaskNodeKey())
+            .toString();
+    }
+}

+ 265 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/RequisitionOrders.java

@@ -0,0 +1,265 @@
+package com.zkqy.business.domain;
+
+import java.util.List;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zkqy.common.core.domain.BaseEntityPlus;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zkqy.common.annotation.Excel;
+
+/**
+ * 领料单对象 requisition_orders
+ *
+ * @author hzh
+ * @date 2024-08-22
+ */
+public class RequisitionOrders extends BaseEntityPlus {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 领料单ID
+     */
+    private Long id;
+
+    /**
+     * 任务编码
+     */
+    @Excel(name = "任务编码")
+    private String taskCode;
+
+    /**
+     * 领料单编号
+     */
+    @Excel(name = "领料单编号")
+    private String requisitionNumber;
+
+    /**
+     * 订单编号
+     */
+    @Excel(name = "订单编号")
+    private String saleOrderNo;
+
+    /**
+     * 领料日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "领料日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date requisitionDate;
+
+    /**
+     * 领料状态(0:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成)
+     */
+    @Excel(name = "领料状态", readConverterExp = "0=:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成")
+    private String state;
+
+    /**
+     * 创建者id
+     */
+    @Excel(name = "创建者id")
+    private Long createById;
+
+    /**
+     * 更新者id
+     */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 数据条审批状态(默认字段 0:已提交、1:已通过、2:不通过、3:未提交、4:驳回、5:审批中)
+     */
+    @Excel(name = "数据条审批状态", readConverterExp = "默=认字段,0=:已提交、1:已通过、2:不通过、3:未提交、4:驳回、5:审批中")
+    private String dataApprovalStatus;
+
+    /**
+     * 流程编号
+     */
+    @Excel(name = "流程编号")
+    private String processKey;
+
+    /**
+     * 任务编码
+     */
+    @Excel(name = "任务编码")
+    private String taskProcessKey;
+
+    /**
+     * 任务节点编码
+     */
+    @Excel(name = "任务节点编码")
+    private String taskNodeKey;
+
+    /**
+     * 是否实际领料
+     */
+    private boolean isRequistionState;
+
+    /**
+     * 单据类型(0领料,1退料)
+     */
+    private int requistionOrdersType;
+
+    /**
+     * 领料明细信息
+     */
+    private List<RequisitionItems> requisitionItemsList;
+
+    public int getRequistionOrdersType() {
+        return requistionOrdersType;
+    }
+
+    public void setRequistionOrdersType(int requistionOrdersType) {
+        this.requistionOrdersType = requistionOrdersType;
+    }
+
+    public boolean isRequistionState() {
+        return isRequistionState;
+    }
+
+    public void setRequistionState(boolean requistionState) {
+        isRequistionState = requistionState;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setTaskCode(String taskCode) {
+        this.taskCode = taskCode;
+    }
+
+    public String getTaskCode() {
+        return taskCode;
+    }
+
+    public void setRequisitionNumber(String requisitionNumber) {
+        this.requisitionNumber = requisitionNumber;
+    }
+
+    public String getRequisitionNumber() {
+        return requisitionNumber;
+    }
+
+    public void setSaleOrderNo(String saleOrderNo) {
+        this.saleOrderNo = saleOrderNo;
+    }
+
+    public String getSaleOrderNo() {
+        return saleOrderNo;
+    }
+
+    public void setRequisitionDate(Date requisitionDate) {
+        this.requisitionDate = requisitionDate;
+    }
+
+    public Date getRequisitionDate() {
+        return requisitionDate;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    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 setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDataApprovalStatus(String dataApprovalStatus) {
+        this.dataApprovalStatus = dataApprovalStatus;
+    }
+
+    public String getDataApprovalStatus() {
+        return dataApprovalStatus;
+    }
+
+    public void setProcessKey(String processKey) {
+        this.processKey = processKey;
+    }
+
+    public String getProcessKey() {
+        return processKey;
+    }
+
+    public void setTaskProcessKey(String taskProcessKey) {
+        this.taskProcessKey = taskProcessKey;
+    }
+
+    public String getTaskProcessKey() {
+        return taskProcessKey;
+    }
+
+    public void setTaskNodeKey(String taskNodeKey) {
+        this.taskNodeKey = taskNodeKey;
+    }
+
+    public String getTaskNodeKey() {
+        return taskNodeKey;
+    }
+
+    public List<RequisitionItems> getRequisitionItemsList() {
+        return requisitionItemsList;
+    }
+
+    public void setRequisitionItemsList(List<RequisitionItems> requisitionItemsList) {
+        this.requisitionItemsList = requisitionItemsList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("taskCode", getTaskCode())
+                .append("requisitionNumber", getRequisitionNumber())
+                .append("saleOrderNo", getSaleOrderNo())
+                .append("requisitionDate", getRequisitionDate())
+                .append("state", getState())
+                .append("remark", getRemark())
+                .append("createById", getCreateById())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateById", getUpdateById())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("delFlag", getDelFlag())
+                .append("dataApprovalStatus", getDataApprovalStatus())
+                .append("processKey", getProcessKey())
+                .append("taskProcessKey", getTaskProcessKey())
+                .append("taskNodeKey", getTaskNodeKey())
+                .append("requisitionItemsList", getRequisitionItemsList())
+                .toString();
+    }
+}

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

@@ -76,6 +76,14 @@ public interface ProductInvoiceMapper {
      */
     ProductInvoice selectProductInvoiceBySaleOrderNo(String saleOrderNo);
 
+    /**
+     * 查询产品发货单
+     *
+     * @param noticeNumber 通知单号
+     * @return 产品发货单
+     */
+    ProductInvoice selectProductInvoiceByNoticeNumber(String noticeNumber);
+
     /**
      * 根据销售单号删除产品发货单
      *

+ 112 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/RequisitionOrdersMapper.java

@@ -0,0 +1,112 @@
+package com.zkqy.business.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.zkqy.business.domain.RequisitionOrders;
+import com.zkqy.business.domain.RequisitionItems;
+
+/**
+ * 领料单Mapper接口
+ *
+ * @author hzh
+ * @date 2024-08-22
+ */
+public interface RequisitionOrdersMapper {
+    /**
+     * 查询领料单
+     *
+     * @param id 领料单主键
+     * @return 领料单
+     */
+    public RequisitionOrders selectRequisitionOrdersById(Long id);
+
+    /**
+     * 查询领料单列表
+     *
+     * @param requisitionOrders 领料单
+     * @return 领料单集合
+     */
+    public List<RequisitionOrders> selectRequisitionOrdersList(RequisitionOrders requisitionOrders);
+
+    /**
+     * 新增领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public int insertRequisitionOrders(RequisitionOrders requisitionOrders);
+
+    /**
+     * 修改领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public int updateRequisitionOrders(RequisitionOrders requisitionOrders);
+
+    /**
+     * 删除领料单
+     *
+     * @param id 领料单主键
+     * @return 结果
+     */
+    public int deleteRequisitionOrdersById(Long id);
+
+    /**
+     * 批量删除领料单
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRequisitionOrdersByIds(Long[] ids);
+
+    /**
+     * 批量删除领料明细
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRequisitionItemsByRequisitionCodes(Long[] ids);
+
+    /**
+     * 批量新增领料明细
+     *
+     * @param requisitionItemsList 领料明细列表
+     * @return 结果
+     */
+    public int batchRequisitionItems(List<RequisitionItems> requisitionItemsList);
+
+
+    /**
+     * 通过领料单主键删除领料明细信息
+     *
+     * @param id 领料单ID
+     * @return 结果
+     */
+    public int deleteRequisitionItemsByRequisitionCode(Long id);
+
+    /**
+     * 查询可以领料任务
+     *
+     * @param requisitionOrders 领料单
+     * @return 领料单集合
+     */
+    public List<Map<String, Object>> selectMaterialRequisitionTask(RequisitionOrders requisitionOrders);
+
+    /**
+     * 查询领料单
+     *
+     * @param taskCode 任务主键
+     * @return 领料单
+     */
+    public RequisitionOrders selectRequisitionOrdersByTaskCode(String taskCode);
+
+    /**
+     * 查询领料单
+     *
+     * @param taskCode 任务主键
+     * @return 领料单
+     */
+    public RequisitionOrders selectRequisitionOrdersByTaskCode1(String taskCode);
+}

+ 16 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductCodeListService.java

@@ -38,6 +38,22 @@ public interface IProductCodeListService {
     public List<ProductCodeListVO> selectProductCodeListByParentCode(String parentCode);
 
 
+    /**
+     * 查询退库产品码单
+     *
+     * @param parentCode 总码单编码
+     * @return 产品码单
+     */
+    public AjaxResult getStockReturnProductCodeListByParentCode(String parentCode);
+
+    /**
+     * 校验当前码单是否可以进行退库
+     *
+     * @param vo 产品码单
+     * @return 产品码单集合
+     */
+    public AjaxResult checkProductCode(ProductCodeListVO vo);
+
     /**
      * 查询产品码单列表
      *

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

@@ -126,6 +126,14 @@ public interface IProductInventoryService {
      */
     AjaxResult returnStorage(List<ProductCodeListVO> productCodeListVOList);
 
+    /**
+     * 报废
+     *
+     * @param productCodeListVOList
+     * @return
+     */
+    AjaxResult invalidated(List<ProductCodeListVO> productCodeListVOList);
+
     /**
      * 老库存出库
      *

+ 99 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IRequisitionOrdersService.java

@@ -0,0 +1,99 @@
+package com.zkqy.business.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.zkqy.business.domain.RequisitionOrders;
+
+/**
+ * 领料单Service接口
+ *
+ * @author hzh
+ * @date 2024-08-22
+ */
+public interface IRequisitionOrdersService {
+    /**
+     * 查询领料单
+     *
+     * @param id 领料单主键
+     * @return 领料单
+     */
+    public RequisitionOrders selectRequisitionOrdersById(Long id);
+
+    /**
+     * 查询领料单列表
+     *
+     * @param requisitionOrders 领料单
+     * @return 领料单集合
+     */
+    public List<RequisitionOrders> selectRequisitionOrdersList(RequisitionOrders requisitionOrders);
+
+    /**
+     * 新增领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public int insertRequisitionOrders(RequisitionOrders requisitionOrders);
+
+    /**
+     * 修改领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public int updateRequisitionOrders(RequisitionOrders requisitionOrders);
+
+    /**
+     * 更新减少物料库存
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public Map<String, Map<String, Object>> reduceMaterialInventory(RequisitionOrders requisitionOrders);
+
+
+    /**
+     * 更新增加物料库存
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public void increaseMaterialInventory(RequisitionOrders requisitionOrders);
+    /**
+     * 审批领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    public int approvalOrders(RequisitionOrders requisitionOrders);
+
+    /**
+     * 批量删除领料单
+     *
+     * @param ids 需要删除的领料单主键集合
+     * @return 结果
+     */
+    public int deleteRequisitionOrdersByIds(Long[] ids);
+
+    /**
+     * 删除领料单信息
+     *
+     * @param id 领料单主键
+     * @return 结果
+     */
+    public int deleteRequisitionOrdersById(Long id);
+
+    /**
+     * 查询可以领料任务
+     *
+     * @param requisitionOrders 领料单
+     * @return 领料单集合
+     */
+    public List<Map<String, Object>> selectMaterialRequisitionTask(RequisitionOrders requisitionOrders);
+
+    /**
+     * 退料详情
+     */
+    public RequisitionOrders selectRequisitionOrdersByTaskCode(String taskCode);
+}

+ 46 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductCodeListServiceImpl.java

@@ -4,7 +4,6 @@ import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
@@ -113,6 +112,52 @@ public class ProductCodeListServiceImpl implements IProductCodeListService {
         return endProductCodeListVOList;
     }
 
+    @Override
+    public AjaxResult getStockReturnProductCodeListByParentCode(String parentCode) {
+        // 得到当前总码单中的所有码单信息
+        List<ProductCodeListVO> productCodeListVOList = productCodeListMapper.selectProductCodeListByParentCode(parentCode);
+        // 只要得到当前总码单中未出库的码单
+        List<ProductCodeListVO> endProductCodeListVOList = new ArrayList<>();
+        productCodeListVOList.forEach(item -> {
+            //查看当前码单是否已入库
+            ProductWarehousingRecord productWarehousingRecord = productWarehousingRecordService.selectProductWarehousingRecordWhetherExist(item.getQrCode(), item.getQrCodeId());
+            //查看当前码单是否已出库
+            ProductOutboundRecord productOutboundRecord = productOutboundRecordService.whetherStorage(item.getQrCode(), item.getQrCodeId());
+            //查看手持机上当前码单是否已出库
+            ProductHandsetOutboundRecord productHandsetOutboundRecord = productHandsetOutboundRecordService.whetherStorage(item.getQrCode(), item.getQrCodeId());
+
+            // 只有已经入库过并且出库的码单才可以进行退库
+            if (productWarehousingRecord != null && productOutboundRecord != null && productHandsetOutboundRecord != null) {
+                endProductCodeListVOList.add(item);
+            }
+        });
+        if (endProductCodeListVOList.size() == 0) {
+            return AjaxResult.warn("不符退库条件!");
+        } else {
+            return AjaxResult.success("扫描成功!", endProductCodeListVOList);
+        }
+    }
+
+    @Override
+    public AjaxResult checkProductCode(ProductCodeListVO vo) {
+        //查看当前码单是否已入库
+        ProductWarehousingRecord productWarehousingRecord = productWarehousingRecordService.selectProductWarehousingRecordWhetherExist(vo.getQrCode(), vo.getQrCodeId());
+        //查看当前码单是否已出库
+        ProductOutboundRecord productOutboundRecord = productOutboundRecordService.whetherStorage(vo.getQrCode(), vo.getQrCodeId());
+        //查看手持机上当前码单是否已出库
+        ProductHandsetOutboundRecord productHandsetOutboundRecord = productHandsetOutboundRecordService.whetherStorage(vo.getQrCode(), vo.getQrCodeId());
+        if (productWarehousingRecord == null) {
+            return AjaxResult.warn("未入库!");
+        }
+        if (productOutboundRecord == null) {
+            return AjaxResult.warn("未出库!");
+        }
+        if (productHandsetOutboundRecord == null) {
+            return AjaxResult.warn("未出库!");
+        }
+        return AjaxResult.success("扫描成功!");
+    }
+
 
     /**
      * 查询产品码单列表

+ 140 - 18
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java

@@ -11,6 +11,8 @@ import com.zkqy.business.domain.vo.ProductCodeListVO;
 import com.zkqy.business.domain.vo.ProductInvoiceVO;
 import com.zkqy.business.mapper.*;
 import com.zkqy.business.service.IOldProductOutboundRecordService;
+import com.zkqy.business.service.IProductOutboundRecordService;
+import com.zkqy.business.service.ISaleAccountsReceivableDetailService;
 import com.zkqy.common.core.domain.AjaxResult;
 import com.zkqy.common.utils.DateUtils;
 import com.zkqy.common.utils.SecurityUtils;
@@ -32,7 +34,7 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
     @Autowired
     private ProductInventoryMapper productInventoryMapper;
 
-    @Autowired
+    @Autowired // 码单
     private ProductCodeListMapper productCodeListMapper;
 
     @Autowired
@@ -56,6 +58,12 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
     @Autowired  // 出库批次
     private ProductOutboundRecordBatchMapper productOutboundRecordBatchMapper;
 
+    @Autowired // 应收账明细
+    private ISaleAccountsReceivableDetailService saleAccountsReceivableDetailService;
+
+    @Autowired
+    private IProductOutboundRecordService productOutboundRecordService;
+
     /**
      * 查询产品库存
      *
@@ -533,9 +541,14 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
 
     @Override
     public List<ProductCodeListVO> comprehensiveInventoryList(ProductCodeListVO productCodeListVO) {
+        // 查询老库存
         if (productCodeListVO.getInventoryType() != null && productCodeListVO.getInventoryType().equals("2")) {
             return productInventoryMapper.selectComprehensiveInventoryListTwo(productCodeListVO);
         }
+        // 查询报废库存
+        if (productCodeListVO.getInventoryType() != null && productCodeListVO.getInventoryType().equals("3")) {
+            return productInventoryMapper.selectComprehensiveInventoryListTwo(productCodeListVO);
+        }
         if (productCodeListVO.getIsLotNum()) {  // 是否累加批次库存
             return productInventoryMapper.selectComprehensiveInventoryListTwo(productCodeListVO);
         } else {
@@ -572,34 +585,140 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
     @Transactional
     @Override
     public AjaxResult returnStorage(List<ProductCodeListVO> productCodeListVOList) {
-        /**
-         * 如果当前产品已经登账
-         */
+        List<ProductCodeListVO> retList = new ArrayList<>();
+        // 循环处理当前退库操作
         for (ProductCodeListVO productCodeListVO : productCodeListVOList) {
-            // 判断当前货品是否已出库,出库删除出库记录
-            ProductOutboundRecord productOutboundRecord = productOutboundRecordMapper.selectProductOutboundRecordByQrCodeId(productCodeListVO.getQrCodeId());
-            if (productOutboundRecord == null) {
-                return AjaxResult.warn("当前货品未出库");
+            /**
+             * 如果当前产品已经登账->只有当前是撤销登账状态才可以进行退库
+             *
+             *
+             * 根据当前出库的码单信息定位到订单信息-》定位应收明细(如若可以定位那么不可以进行退库操作)
+             */
+
+
+//            productCodeListVO.getQrCodeId();
+//            productCodeListVO.getQrCode();
+
+            // 得到当前码单出库信息
+            ProductOutboundRecord productOutboundRecord = productOutboundRecordMapper.selectProductOutboundRecordWhetherExist(productCodeListVO.getQrCodeId(), productCodeListVO.getQrCode());
+            productOutboundRecord.getNoticeNumber(); // 通知单号
+
+            // 根据通知单号查询出库单信息
+            ProductInvoice productInvoice = productInvoiceMapper.selectProductInvoiceByNoticeNumber(productOutboundRecord.getNoticeNumber());
+            productInvoice.getSaleOrderNo(); // 订单编号
+
+            // 查询应收明细根据通知单号、销售单号
+//            SaleAccountsReceivableDetail saleAccountsReceivableDetail = new SaleAccountsReceivableDetail();
+//            saleAccountsReceivableDetail.setSaleNo(productInvoice.getSaleOrderNo());
+//            saleAccountsReceivableDetail.setNoticeNumber(productOutboundRecord.getNoticeNumber());
+//            List<SaleAccountsReceivableDetail> saleAccountsReceivableDetailList = saleAccountsReceivableDetailService.selectSaleAccountsReceivableDetailList(saleAccountsReceivableDetail);
+
+            // 查询批次表
+            ProductOutboundRecordBatch productOutboundRecordBatch = new ProductOutboundRecordBatch();
+            productOutboundRecordBatch.setSaleNo(productInvoice.getSaleOrderNo());
+            productOutboundRecordBatch.setNoticeNumber(productOutboundRecord.getNoticeNumber());
+            List<ProductOutboundRecordBatch> productOutboundRecordBatchList = productOutboundRecordBatchMapper.selectProductOutboundRecordBatchList(productOutboundRecordBatch);
+
+            ProductOutboundRecordBatch find = productOutboundRecordBatchList
+                    .stream()
+                    .filter(item -> item.getOutboundRecordId() == productOutboundRecord.getId())
+                    .findFirst()
+                    .orElse(null);
+
+            // getBatchState() 0 表示正常登账状态不可以退库 1表示撤销登账状态可以退库
+            if (find != null && find.getBatchState() == 1) {
+                retList.add(productCodeListVO);
+                continue;
             }
+
+//            // 判断当前货品是否已出库,出库删除出库记录
+//            ProductOutboundRecord productOutboundRecord = productOutboundRecordMapper.selectProductOutboundRecordByQrCodeId(productCodeListVO.getQrCodeId());
+//            if (productOutboundRecord == null) {
+//                return AjaxResult.warn("当前货品未出库");
+//            }
             // 库存累加
-            ProductInventory productInventory = productInventoryMapper.selectProductInventoryByQrCode(productCodeListVO.getQrCode());
-            ProductInventory editProductInventory = new ProductInventory();
-            editProductInventory.setId(productInventory.getId());//编号
-            editProductInventory.setTotalCanisterNum(productInventory.getTotalCanisterNum() + productOutboundRecord.getCanisterNum());//合计筒数
-            editProductInventory.setTotalBoxNum(productInventory.getTotalBoxNum() + 1);//合计箱数
-            editProductInventory.setTotalSuttle(handlingWeight(productInventory.getTotalSuttle() + productOutboundRecord.getSuttle()));//合计净重
-            editProductInventory.setTotalGrossWeight(handlingWeight(productInventory.getTotalGrossWeight() + productOutboundRecord.getGrossWeight()));//合计毛重
-            productInventoryMapper.updateProductInventory(editProductInventory);
+//            ProductInventory productInventory = productInventoryMapper.selectProductInventoryByQrCode(productCodeListVO.getQrCode());
+//            ProductInventory editProductInventory = new ProductInventory();
+//            editProductInventory.setId(productInventory.getId());//编号
+//            editProductInventory.setTotalCanisterNum(productInventory.getTotalCanisterNum() + productOutboundRecord.getCanisterNum());//合计筒数
+//            editProductInventory.setTotalBoxNum(productInventory.getTotalBoxNum() + 1);//合计箱数
+//            editProductInventory.setTotalSuttle(handlingWeight(productInventory.getTotalSuttle() + productOutboundRecord.getSuttle()));//合计净重
+//            editProductInventory.setTotalGrossWeight(handlingWeight(productInventory.getTotalGrossWeight() + productOutboundRecord.getGrossWeight()));//合计毛重
+//            productInventoryMapper.updateProductInventory(editProductInventory);
 
             // 修改码单标识为已退库
             ProductCodeList productCodeList = productCodeListMapper.selectProductCodeListById(productCodeListVO.getId());
             productCodeList.setWithdrawingFlag("1");
             productCodeListMapper.updateProductCodeList(productCodeList);
 
+            // 进行退库操作
+            productOutboundRecordService.removeErrorOutboundRecord(productInvoice.getId());
             // 删除出库记录
-            productOutboundRecordMapper.deleteProductOutboundRecordById(productOutboundRecord.getId());
+//            productOutboundRecordMapper.deleteProductOutboundRecordById(productOutboundRecord.getId());
         }
-        return AjaxResult.success();
+        if (retList.size() == 0) {
+            return AjaxResult.success();
+        } else {
+            return AjaxResult.warn("已登账!无法退库", retList);
+        }
+    }
+
+    @Override
+    public AjaxResult invalidated(List<ProductCodeListVO> productCodeListVOList) {
+
+        //返回无法报废库存
+        List<ProductCodeListVO> retList = new ArrayList<>();
+
+        // 可以进行报废处理的码单
+        List<ProductCodeListVO> invalidatedList = new ArrayList<>();
+
+        // 循环处理当前退库操作
+        for (ProductCodeListVO productCodeListVO : productCodeListVOList) {
+            // 得到当前码单出库信息
+            ProductOutboundRecord productOutboundRecord = productOutboundRecordMapper.selectProductOutboundRecordWhetherExist(productCodeListVO.getQrCodeId(), productCodeListVO.getQrCode());
+            productOutboundRecord.getNoticeNumber(); // 通知单号
+
+            // 根据通知单号查询出库单信息
+            ProductInvoice productInvoice = productInvoiceMapper.selectProductInvoiceByNoticeNumber(productOutboundRecord.getNoticeNumber());
+            productInvoice.getSaleOrderNo(); // 订单编号
+
+            // 查询批次表
+            ProductOutboundRecordBatch productOutboundRecordBatch = new ProductOutboundRecordBatch();
+            productOutboundRecordBatch.setSaleNo(productInvoice.getSaleOrderNo());
+            productOutboundRecordBatch.setNoticeNumber(productOutboundRecord.getNoticeNumber());
+            List<ProductOutboundRecordBatch> productOutboundRecordBatchList = productOutboundRecordBatchMapper.selectProductOutboundRecordBatchList(productOutboundRecordBatch);
+
+            ProductOutboundRecordBatch find = productOutboundRecordBatchList
+                    .stream()
+                    .filter(item -> item.getOutboundRecordId() == productOutboundRecord.getId())
+                    .findFirst()
+                    .orElse(null);
+
+            // getBatchState() 0 表示正常登账状态不可以退库 1表示撤销登账状态可以退库
+            if (find != null && find.getBatchState() == 1) {
+                retList.add(productCodeListVO);
+                continue;
+            }
+            // 修改码单标识为报废
+            ProductCodeList productCodeList = productCodeListMapper.selectProductCodeListById(productCodeListVO.getId());
+            // 报废状态
+            productCodeList.setWithdrawingFlag("2");
+            productCodeListMapper.updateProductCodeList(productCodeList);
+            // 进行退库操作
+            productOutboundRecordService.removeErrorOutboundRecord(productInvoice.getId());
+            // 报废状态
+            productCodeListVO.setInventoryType("3");
+            // 添加报废库存List
+            invalidatedList.add(productCodeListVO);
+        }
+        // 增加报废库存 inventory_type:3 报废类型库存
+        if (productCodeListVOList.size() != 0) this.productStorage(productCodeListVOList);
+        if (retList.size() == 0) {
+            return AjaxResult.success();
+        } else {
+            return AjaxResult.warn("已登账!无法报废", retList);
+        }
+
     }
 
     @Override
@@ -747,4 +866,7 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
         DecimalFormat df = new DecimalFormat("0.00");
         return Double.parseDouble(df.format(weight));
     }
+
+    // find
+
 }

+ 229 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/RequisitionOrdersServiceImpl.java

@@ -0,0 +1,229 @@
+package com.zkqy.business.service.impl;
+
+import java.util.*;
+
+import com.zkqy.business.domain.MaterialInventory;
+import com.zkqy.business.service.IMaterialInventoryService;
+import com.zkqy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.zkqy.common.utils.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+import com.zkqy.business.domain.RequisitionItems;
+import com.zkqy.business.mapper.RequisitionOrdersMapper;
+import com.zkqy.business.domain.RequisitionOrders;
+import com.zkqy.business.service.IRequisitionOrdersService;
+
+/**
+ * 领料单Service业务层处理
+ *
+ * @author hzh
+ * @date 2024-08-22
+ */
+@Service
+public class RequisitionOrdersServiceImpl implements IRequisitionOrdersService {
+    @Autowired
+    private RequisitionOrdersMapper requisitionOrdersMapper;
+
+    @Autowired // 物料库存
+    private IMaterialInventoryService materialInventoryService;
+
+    /**
+     * 查询领料单
+     *
+     * @param id 领料单主键
+     * @return 领料单
+     */
+    @Override
+    public RequisitionOrders selectRequisitionOrdersById(Long id) {
+        return requisitionOrdersMapper.selectRequisitionOrdersById(id);
+    }
+
+    /**
+     * 查询领料单列表
+     *
+     * @param requisitionOrders 领料单
+     * @return 领料单
+     */
+    @Override
+    public List<RequisitionOrders> selectRequisitionOrdersList(RequisitionOrders requisitionOrders) {
+//        // 查询未审批
+//        if (StringUtils.isNull(requisitionOrders.getDataApprovalStatus())) {
+//            // 7表示查询已审批数据
+//            if (requisitionOrders.getDataApprovalStatus().equals("7")) {
+//                requisitionOrdersMapper.selectRequisitionOrdersList(requisitionOrders);
+//            }
+//        }
+        return requisitionOrdersMapper.selectRequisitionOrdersList(requisitionOrders);
+    }
+
+    /**
+     * 新增领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int insertRequisitionOrders(RequisitionOrders requisitionOrders) {
+        requisitionOrders.setCreateTime(DateUtils.getNowDate());
+        int rows = requisitionOrdersMapper.insertRequisitionOrders(requisitionOrders);
+        insertRequisitionItems(requisitionOrders);
+        return rows;
+    }
+
+    /**
+     * 修改领料单
+     *
+     * @param requisitionOrders 领料单
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int updateRequisitionOrders(RequisitionOrders requisitionOrders) {
+        requisitionOrders.setUpdateTime(DateUtils.getNowDate());
+        requisitionOrdersMapper.deleteRequisitionItemsByRequisitionCode(requisitionOrders.getId());
+        insertRequisitionItems(requisitionOrders);
+        return requisitionOrdersMapper.updateRequisitionOrders(requisitionOrders);
+    }
+
+    @Override
+    public int approvalOrders(RequisitionOrders requisitionOrders) {
+        return requisitionOrdersMapper.updateRequisitionOrders(requisitionOrders);
+    }
+
+    /**
+     * 批量删除领料单
+     *
+     * @param ids 需要删除的领料单主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteRequisitionOrdersByIds(Long[] ids) {
+        requisitionOrdersMapper.deleteRequisitionItemsByRequisitionCodes(ids);
+        return requisitionOrdersMapper.deleteRequisitionOrdersByIds(ids);
+    }
+
+    /**
+     * 删除领料单信息
+     *
+     * @param id 领料单主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteRequisitionOrdersById(Long id) {
+        requisitionOrdersMapper.deleteRequisitionItemsByRequisitionCode(id);
+        return requisitionOrdersMapper.deleteRequisitionOrdersById(id);
+    }
+
+    @Override
+    public List<Map<String, Object>> selectMaterialRequisitionTask(RequisitionOrders requisitionOrders) {
+        return requisitionOrdersMapper.selectMaterialRequisitionTask(requisitionOrders);
+    }
+
+    @Override
+    public RequisitionOrders selectRequisitionOrdersByTaskCode(String taskCode) {
+
+        // 领料
+        RequisitionOrders requisitionOrders = requisitionOrdersMapper.selectRequisitionOrdersByTaskCode(taskCode);
+
+        // 退料
+        RequisitionOrders requisitionOrders1 = requisitionOrdersMapper.selectRequisitionOrdersByTaskCode1(taskCode);
+        if (requisitionOrders1 != null)
+
+            requisitionOrders1.getRequisitionItemsList().forEach(item1 -> {
+//                Double asd1 =
+//                        Double.valueOf(requisitionOrders.getRequisitionItemsList().stream()
+//                                .filter(item -> item.getMaterialId().equals(item1.getMaterialId()))
+//                                .findFirst()
+//                                .get().getQuantity());
+//                Double asd2 = Double.valueOf(item1.getQuantity());
+//                System.out.println(asd1 - asd2);
+                requisitionOrders.getRequisitionItemsList().stream()
+                        .filter(item -> item.getMaterialId().equals(item1.getMaterialId()))
+                        .findFirst()
+                        .get()
+                        .setQuantity(
+                                String.valueOf(Double.valueOf(requisitionOrders.getRequisitionItemsList().stream()
+                                        .filter(item -> item.getMaterialId().equals(item1.getMaterialId()))
+                                        .findFirst()
+                                        .get().getQuantity()) -
+                                        Double.valueOf(item1.getQuantity()))
+                        );
+            });
+        return requisitionOrders;
+    }
+
+    /**
+     * 新增领料明细信息
+     *
+     * @param requisitionOrders 领料单对象
+     */
+    public void insertRequisitionItems(RequisitionOrders requisitionOrders) {
+        List<RequisitionItems> requisitionItemsList = requisitionOrders.getRequisitionItemsList();
+        Long id = requisitionOrders.getId();
+        if (StringUtils.isNotNull(requisitionItemsList)) {
+            List<RequisitionItems> list = new ArrayList<RequisitionItems>();
+            for (RequisitionItems requisitionItems : requisitionItemsList) {
+                requisitionItems.setRequisitionCode(id.toString());
+                requisitionItems.setDelFlag("0");
+                list.add(requisitionItems);
+            }
+            if (list.size() > 0) {
+                requisitionOrdersMapper.batchRequisitionItems(list);
+            }
+        }
+    }
+
+    @Transactional
+    public Map<String, Map<String, Object>> reduceMaterialInventory(RequisitionOrders requisitionOrders) {
+        Map<String, Map<String, Object>> retMap = new HashMap<>();
+        requisitionOrders.getRequisitionItemsList().forEach(item -> {
+            Double handdleQuantity = Double.parseDouble(item.getActualQuantity());
+            // 得到当前物料库存
+            MaterialInventory materialInventory = materialInventoryService.selectMaterialInventoryByMaterialCodeAndSpecifications(item.getMaterialId(), item.getSpecifications());
+
+            if (materialInventory == null) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("materialCode", item.getMaterialId());
+                // 误差重量(系统中并没有许多物料可供领取)
+                map.put("errorWeight", handdleQuantity);
+                retMap.put(item.getMaterialId(), map);
+            } else if (materialInventory.getQuantity() > 0.00) {
+                // 更新后物料库存
+                Double endQuantity = materialInventory.getQuantity() - handdleQuantity;
+                if (endQuantity >= 0.00) {
+                    materialInventory.setQuantity(endQuantity);
+                    // 更新物料库存
+                    materialInventoryService.updateMaterialInventory(materialInventory);
+                } else {
+                    materialInventory.setQuantity(0.00);
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("materialCode", item.getMaterialId());
+                    // 误差重量(系统中并没有许多物料可供领取)
+                    // map.put("errorWeight", handdleQuantity - materialInventory.getQuantity());
+                    map.put("errorWeight", -endQuantity);
+                    retMap.put(item.getMaterialId(), map);
+                }
+            }
+        });
+        return retMap;
+    }
+
+    @Transactional
+    public void increaseMaterialInventory(RequisitionOrders requisitionOrders) {
+        requisitionOrders.getRequisitionItemsList().forEach(item -> {
+            Double handdleQuantity = Double.parseDouble(item.getActualQuantity());
+            // 得到当前物料库存
+            MaterialInventory materialInventory = materialInventoryService.selectMaterialInventoryByMaterialCodeAndSpecifications(item.getMaterialId(), item.getSpecifications());
+            // 更新后物料库存
+            Double endQuantity = materialInventory.getQuantity() + handdleQuantity;
+            materialInventory.setQuantity(endQuantity);
+            // 更新物料库存
+            materialInventoryService.updateMaterialInventory(materialInventory);
+        });
+    }
+}

+ 3 - 3
zkqy-custom-business/src/main/resources/mapper/business/CustomerMapper.xml

@@ -166,7 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND so.sale_order_technology_no NOT IN ( 'retailOrder', 'outsourceOrder', 'processingOrder' )
         group by so.sale_no
         ) as a
-        group by  sale_custom_no
+        group by sale_custom_no
         union all
         select a.sale_no,a.sale_custom_no,TRUNCATE(sum(a.amounts),2) as amounts from
         (
@@ -182,7 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND so.sale_order_technology_no = 'retailOrder'
         group by so.sale_no
         ) as a
-        group by  sale_custom_no
+        group by sale_custom_no
         ) as b
         group by b.sale_custom_no
 
@@ -197,7 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             IFNULL(c.salesman, '' ),
             IFNULL(c.contact_person, '' )) LIKE concat('%', #{queryParam}, '%')
         </if>
-        <if test="createById != null "> and c.create_by_id = #{createById}</if>
+        <if test="createById != null ">and c.create_by_id = #{createById}</if>
         ORDER BY
         c.id DESC
     </select>

+ 3 - 2
zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml

@@ -260,10 +260,11 @@
 
     <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 del_flag = '0'
+        where del_flag = '0' and del_flag = '0'
         <if test="lotNum != null and lotNum != '' ">and lot_num = #{lotNum}</if>
         <if test="productId != null">and product_id = #{productId}</if>
-        <if test="productColour != null and productColour != ''">and product_colour = #{productColour}</if>
+        <if test="productColour != null and productColour != ''">and product_colour LIKE concat('%', #{productColour},
+            '%')</if>
         <if test="inventoryType != null and inventoryType != ''">and inventory_type = #{inventoryType}</if>
     </select>
 

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

@@ -222,6 +222,10 @@
         <include refid="selectProductInvoiceVo"/>
         where sale_order_no = #{saleOrderNo} and del_flag = '0'
     </select>
+    <select id="selectProductInvoiceByNoticeNumber" resultType="com.zkqy.business.domain.ProductInvoice">
+        <include refid="selectProductInvoiceVo"/>
+        where notice_number = #{noticeNumber} and del_flag = '0'
+    </select>
 
     <update id="deleteProductInvoiceBySaleOrderNo" parameterType="String">
         update {DBNAME}.product_invoice

+ 382 - 0
zkqy-custom-business/src/main/resources/mapper/business/RequisitionOrdersMapper.xml

@@ -0,0 +1,382 @@
+<?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.RequisitionOrdersMapper">
+
+    <resultMap type="com.zkqy.business.domain.RequisitionOrders" id="RequisitionOrdersResult">
+        <result property="id" column="id"/>
+        <result property="taskCode" column="task_code"/>
+        <result property="requisitionNumber" column="requisition_number"/>
+        <result property="saleOrderNo" column="sale_order_no"/>
+        <result property="requisitionDate" column="requisition_date"/>
+        <result property="state" column="state"/>
+        <result property="remark" column="remark"/>
+        <result property="createById" column="create_by_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateById" column="update_by_id"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="dataApprovalStatus" column="data_approval_status"/>
+        <result property="processKey" column="process_key"/>
+        <result property="taskProcessKey" column="task_process_key"/>
+        <result property="taskNodeKey" column="task_node_key"/>
+        <result property="requistionOrdersType" column="requistion_orders_type"/>
+    </resultMap>
+
+    <resultMap id="RequisitionOrdersRequisitionItemsResult" type="com.zkqy.business.domain.RequisitionOrders"
+               extends="RequisitionOrdersResult">
+        <collection property="requisitionItemsList" notNullColumn="sub_id" javaType="java.util.List"
+                    resultMap="RequisitionItemsResult" fetchType="eager"/>
+    </resultMap>
+
+    <resultMap type="com.zkqy.business.domain.RequisitionItems" id="RequisitionItemsResult">
+        <result property="id" column="sub_id"/>
+        <result property="requisitionCode" column="sub_requisition_code"/>
+        <result property="materialId" column="sub_material_id"/>
+        <result property="quantity" column="sub_quantity"/>
+        <result property="actualQuantity" column="sub_actual_quantity"/>
+        <result property="state" column="sub_state"/>
+        <result property="specifications" column="sub_specifications"/>
+        <result property="colorCode" column="sub_color_code"/>
+        <result property="remark" column="sub_remark"/>
+        <result property="createById" column="sub_create_by_id"/>
+        <result property="createBy" column="sub_create_by"/>
+        <result property="createTime" column="sub_create_time"/>
+        <result property="updateById" column="sub_update_by_id"/>
+        <result property="updateBy" column="sub_update_by"/>
+        <result property="updateTime" column="sub_update_time"/>
+        <result property="delFlag" column="sub_del_flag"/>
+        <result property="dataApprovalStatus" column="sub_data_approval_status"/>
+        <result property="processKey" column="sub_process_key"/>
+        <result property="taskProcessKey" column="sub_task_process_key"/>
+        <result property="taskNodeKey" column="sub_task_node_key"/>
+    </resultMap>
+
+    <sql id="selectRequisitionOrdersVo">
+        select id,
+               task_code,
+               requisition_number,
+               sale_order_no,
+               requisition_date,
+               state,
+               remark,
+               create_by_id,
+               create_by,
+               create_time,
+               update_by_id,
+               update_by,
+               update_time,
+               del_flag,
+               data_approval_status,
+               process_key,
+               task_process_key,
+               task_node_key,
+               requistion_orders_type
+        from {DBNAME}.requisition_orders
+    </sql>
+
+    <sql id="selectRequisitionOrdersVoAndItems">
+        select a.id,
+               a.task_code,
+               a.requisition_number,
+               a.sale_order_no,
+               a.requisition_date,
+               a.state,
+               a.remark,
+               a.create_by_id,
+               a.create_by,
+               a.create_time,
+               a.update_by_id,
+               a.update_by,
+               a.update_time,
+               a.del_flag,
+               a.data_approval_status,
+               a.process_key,
+               a.task_process_key,
+               a.task_node_key,
+               a.requistion_orders_type,
+               b.id                   as sub_id,
+               b.requisition_code     as sub_requisition_code,
+               b.material_id          as sub_material_id,
+               b.quantity             as sub_quantity,
+               b.actual_quantity      as sub_actual_quantity,
+               b.state                as sub_state,
+               b.specifications       as sub_specifications,
+               b.color_code           as sub_color_code,
+               b.remark               as sub_remark,
+               b.create_by_id         as sub_create_by_id,
+               b.create_by            as sub_create_by,
+               b.create_time          as sub_create_time,
+               b.update_by_id         as sub_update_by_id,
+               b.update_by            as sub_update_by,
+               b.update_time          as sub_update_time,
+               b.del_flag             as sub_del_flag,
+               b.data_approval_status as sub_data_approval_status,
+               b.process_key          as sub_process_key,
+               b.task_process_key     as sub_task_process_key,
+               b.task_node_key        as sub_task_node_key
+        from {DBNAME}.requisition_orders a
+                 left join {DBNAME}.requisition_items b
+        on b.requisition_code = a.id
+    </sql>
+
+    <select id="selectRequisitionOrdersList" parameterType="com.zkqy.business.domain.RequisitionOrders"
+            resultMap="RequisitionOrdersResult">
+        <include refid="selectRequisitionOrdersVo"/>
+        <where>
+            and del_flag = '0'
+            <if test="taskCode != null  and taskCode != ''">and task_code = #{taskCode}</if>
+            <if test="requistionOrdersType != null ">and requistion_orders_type =
+                #{requistionOrdersType}
+            </if>
+            <if test="requisitionNumber != null  and requisitionNumber != ''">and requisition_number =
+                #{requisitionNumber}
+            </if>
+            <if test="saleOrderNo != null  and saleOrderNo != ''">and sale_order_no = #{saleOrderNo}</if>
+            <if test="requisitionDate != null ">and requisition_date = #{requisitionDate}</if>
+            <if test="state != null  and state != ''">and state = #{state}</if>
+            <if test="createById != null ">and create_by_id = #{createById}</if>
+            <if test="updateById != null ">and update_by_id = #{updateById}</if>
+            <if test="dataApprovalStatus == 7  or dataApprovalStatus == '7'">
+                and
+                FIND_IN_SET('1', data_approval_status) > 0 OR
+                FIND_IN_SET('2', data_approval_status) > 0 OR
+                FIND_IN_SET('3', data_approval_status) > 0 OR
+                FIND_IN_SET('4', data_approval_status) > 0 OR
+                FIND_IN_SET('5', data_approval_status) > 0
+            </if>
+            <if test="dataApprovalStatus != null  and dataApprovalStatus != '' and dataApprovalStatus != 7  and dataApprovalStatus != '7'">
+                and data_approval_status = #{dataApprovalStatus}
+            </if>
+            <if test="processKey != null  and processKey != ''">and process_key = #{processKey}</if>
+            <if test="taskProcessKey != null  and taskProcessKey != ''">and task_process_key = #{taskProcessKey}</if>
+            <if test="taskNodeKey != null  and taskNodeKey != ''">and task_node_key = #{taskNodeKey}</if>
+        </where>
+        order by id desc
+    </select>
+
+
+    <select id="selectRequisitionOrdersById" parameterType="Long" resultMap="RequisitionOrdersRequisitionItemsResult">
+        <include refid="selectRequisitionOrdersVoAndItems"/>
+        where a.id = #{id} and a.del_flag = '0' and b.del_flag = '0'
+    </select>
+
+
+    <!--    b.quantity             as sub_quantity,-->
+    <!--    sum(b.actual_quantity) as sub_actual_quantity,-->
+    <select id="selectRequisitionOrdersByTaskCode" parameterType="String"
+            resultMap="RequisitionOrdersRequisitionItemsResult">
+        select a.task_code,
+               a.sale_order_no,
+               a.del_flag,
+               a.requistion_orders_type,
+               b.id                   as sub_id,
+               b.requisition_code     as sub_requisition_code,
+               b.material_id          as sub_material_id,
+               sum(b.actual_quantity) as sub_quantity,
+               b.state                as sub_state,
+               b.specifications       as sub_specifications,
+               b.color_code           as sub_color_code,
+               b.remark               as sub_remark,
+               b.create_by_id         as sub_create_by_id,
+               b.create_by            as sub_create_by,
+               b.create_time          as sub_create_time,
+               b.update_by_id         as sub_update_by_id,
+               b.update_by            as sub_update_by,
+               b.update_time          as sub_update_time,
+               b.del_flag             as sub_del_flag,
+               b.data_approval_status as sub_data_approval_status,
+               b.process_key          as sub_process_key,
+               b.task_process_key     as sub_task_process_key,
+               b.task_node_key        as sub_task_node_key
+        from {DBNAME}.requisition_orders a
+                left join {DBNAME}.requisition_items b
+        on b.requisition_code = a.id
+        where a.task_code = #{taskCode}
+          and a.del_flag = '0'
+          and b.del_flag = '0'
+          and a.requistion_orders_type = 0
+          and a.state = 5
+        group by
+            b.material_id
+    </select>
+
+    <select id="selectRequisitionOrdersByTaskCode1" parameterType="String"
+            resultMap="RequisitionOrdersRequisitionItemsResult">
+        select a.task_code,
+               a.sale_order_no,
+               a.del_flag,
+               a.requistion_orders_type,
+               b.id                   as sub_id,
+               b.requisition_code     as sub_requisition_code,
+               b.material_id          as sub_material_id,
+               sum(b.actual_quantity) as sub_quantity,
+               b.state                as sub_state,
+               b.specifications       as sub_specifications,
+               b.color_code           as sub_color_code,
+               b.remark               as sub_remark,
+               b.create_by_id         as sub_create_by_id,
+               b.create_by            as sub_create_by,
+               b.create_time          as sub_create_time,
+               b.update_by_id         as sub_update_by_id,
+               b.update_by            as sub_update_by,
+               b.update_time          as sub_update_time,
+               b.del_flag             as sub_del_flag,
+               b.data_approval_status as sub_data_approval_status,
+               b.process_key          as sub_process_key,
+               b.task_process_key     as sub_task_process_key,
+               b.task_node_key        as sub_task_node_key
+        from {DBNAME}.requisition_orders a
+                left join {DBNAME}.requisition_items b
+        on b.requisition_code = a.id
+        where a.task_code = #{taskCode}
+          and a.del_flag = '0'
+          and b.del_flag = '0'
+          and a.requistion_orders_type = 1
+          and a.state = 2
+        group by
+            b.material_id
+    </select>
+
+    <insert id="insertRequisitionOrders" parameterType="com.zkqy.business.domain.RequisitionOrders"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into {DBNAME}.requisition_orders
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskCode != null">task_code,</if>
+            <if test="requisitionNumber != null">requisition_number,</if>
+            <if test="saleOrderNo != null">sale_order_no,</if>
+            <if test="requisitionDate != null">requisition_date,</if>
+            <if test="state != null">state,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="dataApprovalStatus != null">data_approval_status,</if>
+            <if test="processKey != null">process_key,</if>
+            <if test="taskProcessKey != null">task_process_key,</if>
+            <if test="taskNodeKey != null">task_node_key,</if>
+            <if test="requistionOrdersType != null">requistion_orders_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskCode != null">#{taskCode},</if>
+            <if test="requisitionNumber != null">#{requisitionNumber},</if>
+            <if test="saleOrderNo != null">#{saleOrderNo},</if>
+            <if test="requisitionDate != null">#{requisitionDate},</if>
+            <if test="state != null">#{state},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="dataApprovalStatus != null">#{dataApprovalStatus},</if>
+            <if test="processKey != null">#{processKey},</if>
+            <if test="taskProcessKey != null">#{taskProcessKey},</if>
+            <if test="taskNodeKey != null">#{taskNodeKey},</if>
+            <if test="requistionOrdersType != null">#{requistionOrdersType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateRequisitionOrders" parameterType="com.zkqy.business.domain.RequisitionOrders">
+        update {DBNAME}.requisition_orders
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskCode != null">task_code = #{taskCode},</if>
+            <if test="requisitionNumber != null">requisition_number = #{requisitionNumber},</if>
+            <if test="saleOrderNo != null">sale_order_no = #{saleOrderNo},</if>
+            <if test="requisitionDate != null">requisition_date = #{requisitionDate},</if>
+            <if test="state != null">state = #{state},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="dataApprovalStatus != null">data_approval_status = #{dataApprovalStatus},</if>
+            <if test="processKey != null">process_key = #{processKey},</if>
+            <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
+            <if test="taskNodeKey != null">task_node_key = #{taskNodeKey},</if>
+            <if test="requistionOrdersType != null">requistion_orders_type = #{requistionOrdersType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRequisitionOrdersById" parameterType="Long">
+        update {DBNAME}.requisition_orders
+        set del_flag = '2'
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteRequisitionOrdersByIds" parameterType="String">
+        update {DBNAME}.requisition_orders set del_flag = '2' where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <delete id="deleteRequisitionItemsByRequisitionCodes" parameterType="String">
+        update {DBNAME}.requisition_items set del_flag = '2' where requisition_code in
+        <foreach item="requisitionCode" collection="array" open="(" separator="," close=")">
+            #{requisitionCode}
+        </foreach>
+    </delete>
+
+    <delete id="deleteRequisitionItemsByRequisitionCode" parameterType="Long">
+        update {DBNAME}.requisition_items
+        set del_flag = '2'
+        where requisition_code = #{requisitionCode}
+    </delete>
+
+    <insert id="batchRequisitionItems">
+        insert into {DBNAME}.requisition_items( requisition_code, material_id, quantity, actual_quantity, state,
+        specifications, color_code, remark, create_by_id, create_by, create_time, update_by_id, update_by, update_time,
+        del_flag, data_approval_status, process_key, task_process_key, task_node_key) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            ( #{item.requisitionCode}, #{item.materialId}, #{item.quantity}, #{item.actualQuantity},
+            #{item.state}, #{item.specifications}, #{item.colorCode}, #{item.remark}, #{item.createById},
+            #{item.createBy}, #{item.createTime}, #{item.updateById}, #{item.updateBy}, #{item.updateTime},
+            #{item.delFlag}, #{item.dataApprovalStatus}, #{item.processKey}, #{item.taskProcessKey},
+            #{item.taskNodeKey})
+        </foreach>
+    </insert>
+
+    <select id="selectMaterialRequisitionTask" parameterType="com.zkqy.business.domain.RequisitionOrders"
+            resultType="map">
+        SELECT production.product_name           AS production_product_name,           -- 品名
+               sale_products.lot_number          AS sale_products_lot_number,          -- 批号
+               sale_products.sale_order_no       AS sale_products_sale_order_no,       -- 销售编号/合同号
+               production.product_specifications AS production_product_specifications, -- 规格
+               sale_products.id                  AS sale_products_id,                  -- 销售产品id
+               sale_products.task_name           AS sale_products_task_name,           -- 任务名称
+               sale_products.product_number      AS sale_products_product_number       -- 销售数量/重量
+        FROM {DBNAME}.sale_products AS sale_products
+                 LEFT JOIN {DBNAME}.sale_craft AS sale_craft
+        ON {DBNAME}.sale_craft.sale_order_no = {DBNAME}.sale_products.sale_order_no
+            LEFT JOIN {DBNAME}.production AS production
+            ON {DBNAME}.production.product_no = {DBNAME}.sale_products.product_no
+            LEFT JOIN {DBNAME}.production_line AS production_line
+            ON {DBNAME}.production_line.id = {DBNAME}.sale_products.production_line_no AND
+            {DBNAME}.production_line.del_flag = 0
+            LEFT JOIN {DBNAME}.materiel AS materiel
+            ON {DBNAME}.materiel.materiel_code = {DBNAME}.sale_products.colour_number
+            LEFT JOIN {DBNAME}.sale_order AS sale_order
+            ON {DBNAME}.sale_order.sale_no = {DBNAME}.sale_craft.sale_order_no
+        where sale_products.del_flag = 0
+          AND production.del_flag = 0
+          AND sale_craft.del_flag = 0
+          AND materiel.del_flag = 0
+          AND sale_order.del_flag = 0
+          AND sale_order.status = 3
+          and sale_products.on_board_state != 3 -- 过滤已完成的任务
+    </select>
+</mapper>

+ 2 - 3
zkqy-custom-business/src/main/resources/mapper/business/SaleAccountsReceivableDetailMapper.xml

@@ -129,9 +129,8 @@
         </if>
         <if test="returnReceipt != null  and returnReceipt != ''">and sard.return_receipt = #{returnReceipt}</if>
         <if test="status != null and status != ''">and sard.status in ( #{status} )</if>
-        <if test="orderBy != null and orderBy != ''">order by sard.id ${orderBy}</if>
-
-
+        and 1=1
+        <if test="orderBy != null and orderBy != ''">ORDER BY sard.id ${orderBy}</if>
     </select>
 
     <select id="selectSaleAccountsReceivableDetailById" parameterType="Long"

+ 1 - 1
zkqy-ui/src/api/bpmprocess/process.js

@@ -88,7 +88,7 @@ export function addConfiguration(data) {
     method: 'post',
     data: data,
     //baseURL: process.env.VUE_APP_BASE_API1,
-    // baseURL: 'http://192.168.110.59:8055',
+    // baseURL: 'http://192.168.110.114:8055',
   })
 }
 

+ 70 - 0
zkqy-ui/src/api/huaxian/requisitionOrders.js

@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+// 查询领料单列表
+export function listRequisitionOrders(query) {
+  return request({
+    url: '/business/requisitionOrders/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询领料单详细
+export function getRequisitionOrders(id) {
+  return request({
+    url: '/business/requisitionOrders/' + id,
+    method: 'get'
+  })
+}
+
+// 查询领料单详细
+export function getRequisitionOrdersByTaskCode(taskCode) {
+  return request({
+    url: '/business/requisitionOrders/taskCode/' + taskCode,
+    method: 'get'
+  })
+}
+
+// 新增领料单
+export function addRequisitionOrders(data) {
+  return request({
+    url: '/business/requisitionOrders',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改领料单
+export function updateRequisitionOrders(data) {
+  return request({
+    url: '/business/requisitionOrders',
+    method: 'put',
+    data: data
+  })
+}
+
+// 审批领料单
+export function approvalOrders(data) {
+  return request({
+    url: '/business/requisitionOrders/approval',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除领料单
+export function delRequisitionOrders(id) {
+  return request({
+    url: '/business/requisitionOrders/' + id,
+    method: 'delete'
+  })
+}
+
+// 查询可领料任务
+export function materialRequisitionTaskList(query) {
+  return request({
+    url: '/business/requisitionOrders/materialRequisitionTaskList',
+    method: 'get',
+    params: query
+  })
+}

+ 6 - 5
zkqy-ui/src/views/login.vue

@@ -111,12 +111,12 @@ export default {
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" },
+          {required: true, trigger: "blur", message: "请输入您的账号"},
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
+          {required: true, trigger: "blur", message: "请输入您的密码"},
         ],
-        code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+        code: [{required: true, trigger: "blur", message: "请输入验证码"}],
       },
       loading: true,
       // 验证码开关
@@ -142,15 +142,16 @@ export default {
   methods: {
     // client_id=x3qwrgrO1wYdz72joZ8YyIuD&scope=basic&response_type=code&state=AB1357&redirect_uri=http://127.0.0.1:8001/login
 
+
     // 校验url
     validateTenantId() {
       let tenantCode = this.$route.query["tenantCode"];
       if (tenantCode != null) {
         // 得到tenantId 查询裤中是否存在该租户
-        isTenantExist({ tenantCode: tenantCode }).then((res) => {
+        isTenantExist({tenantCode: tenantCode}).then((res) => {
           if (res == undefined) {
             this.$message.warning("请访问正确地址!");
-            this.$router.push({ path: "/401" });
+            this.$router.push({path: "/401"});
           } else if (res.data?.tenantId) {
             // 判断当前编号是否存在库中
             this.tenantId = res.data.tenantId;

+ 1 - 0
zkqy-ui/src/views/orderMange/components/dialogForm/OutStockDetail.vue

@@ -383,6 +383,7 @@ export default {
       });
 
       return sums;
+      return sums;
     },
     // 事件格式化工具
     formatTime(time) {

+ 3 - 2
zkqy-ui/src/views/orderMange/comprehensiveInventory/index.vue

@@ -6,6 +6,7 @@
           <el-select v-model="queryParams.inventoryType" @keyup.enter.native.prevent @change="handleQuery">
             <el-option key="1" label="新库存" value="1"></el-option>
             <el-option key="2" label="老库存" value="2"></el-option>
+            <el-option key="3" label="报废库存" value="3"></el-option>
           </el-select>
         </div>
       </el-form-item>
@@ -33,8 +34,8 @@
             style="  flex: 1;  margin-right: 10px; ">
           </el-input>
           <el-select v-model="queryParams.isLotNum" placeholder="是否累加库存" @keyup.enter.native.prevent
-                     @change="handleQuery" style="width:40%" :disabled="queryParams.inventoryType=='2'">
-          <el-option
+                     @change="handleQuery" style="width:40%" :disabled="queryParams.inventoryType!='1'">
+            <el-option
               key="1"
               label="累加批次库存"
               value="false">

+ 1 - 1
zkqy-ui/src/views/orderMange/index.vue

@@ -3530,7 +3530,7 @@ export default {
     },
     // 出库明细回调
     handleOutDetail(row) {
-      this.stockTitle = "出库明细";
+      this.stockTitle = "出库明细1";
       this.outStockShow = true;
       this.$nextTick(() => {
         this.$refs.OutStockDetailRef.getOutStockDetail(row, false);

+ 478 - 0
zkqy-ui/src/views/orderMange/requisitionOrders/approval.vue

@@ -0,0 +1,478 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="领料编号" prop="requisitionNumber">
+        <el-input
+          v-model="queryParams.requisitionNumber"
+          placeholder="请输入领料单编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="saleOrderNo">
+        <el-input
+          v-model="queryParams.saleOrderNo"
+          placeholder="请输入订单编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领料日期" prop="requisitionDate">
+        <el-date-picker clearable
+                        v-model="queryParams.requisitionDate"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择领料日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="审批状态" prop="state">
+        <el-select v-model="queryParams.dataApprovalStatus" filterable placeholder="请选择任务领料"
+                   @change="handleQuery">
+          <el-option key="1" label="未审批" value="5"/>
+          <el-option key="3" label="已审批" value="7"/>
+          <!-- 0=:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成 -->
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="单据类型" prop="state">
+        <el-select v-model="queryParams.requistionOrdersType" filterable placeholder="请选择任务领料"
+                   @change="handleQuery">
+          <el-option key="1" label="领料" :value="0"/>
+          <el-option key="3" label="退料" :value="1"/>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loading" :data="requisitionOrdersList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="领料单编号" align="center" prop="requisitionNumber"/>
+      <el-table-column label="订单编号" align="center" prop="saleOrderNo"/>
+      <el-table-column label="单据类型" align="center" prop="requistionOrdersType">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.requistionOrdersType == 0">领料</el-tag>
+          <el-tag v-else type="success">退料</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="领料日期" align="center" prop="requisitionDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.requisitionDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="dataApprovalStatus">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.approval_process_status"
+            :value="scope.row.dataApprovalStatus"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="queryParams.dataApprovalStatus=='5'">
+        <template slot-scope="scope">
+
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="toExamine(scope.row)"
+                  v-hasPermi="['business:requisitionOrders:edit']"
+                >审核
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <!-- 审批领料单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body :before-close="cancel">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="领料任务" prop="state">
+              <el-select v-model="form.value" filterable placeholder="请选择任务领料" disabled>
+                <el-option
+                  v-for="item in taskList"
+                  :key="item.saleProductsId"
+                  :label="item.saleProductsTaskName"
+                  :value="item.saleProductsId">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="领料日期" prop="requisitionDate">
+              <el-date-picker clearable disabled
+                              v-model="form.requisitionDate"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="请选择领料日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" v-model="form.remark" placeholder="领料备注" disabled/>
+        </el-form-item>
+        <el-divider content-position="center">领料明细信息</el-divider>
+        <el-table :data="requisitionItemsList" :row-class-name="rowRequisitionItemsIndex"
+                  @selection-change="handleRequisitionItemsSelectionChange" ref="requisitionItems">
+          <el-table-column label="序号" align="center" prop="index" width="50"/>
+          <el-table-column label="物料" prop="materialId" align="center">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.materialId" filterable placeholder="请选择物料" disabled>
+                <el-option
+                  v-for="mtem in materielList"
+                  :key="mtem.id"
+                  :label="mtem.materielName"
+                  :value="mtem.id">
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column :label="requistionOrdersType?'预计可退数量/重量':'预计领用数量/重量'" prop="quantity"
+                           align="center">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.quantity" type="number" placeholder="请输入预计领用数量/重量" disabled/>
+            </template>
+          </el-table-column>
+          <el-table-column label="备注" prop="remark" width="250" align="center">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.remark" placeholder="请输入备注" disabled/>
+            </template>
+          </el-table-column>
+
+          <el-table-column :label="requistionOrdersType?'回退数量/重量':'实际领用数量/重量'" prop="actualQuantity"
+                           v-if="requistionOrdersType" width="150">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.actualQuantity" type="number"
+                        :placeholder="requistionOrdersType?'请输入回退数量/重量':'请输入实际领用数量/重量'" disabled/>
+            </template>
+          </el-table-column>
+        </el-table>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="success" @click="examineAndApprove(2)">通 过</el-button>
+        <el-button type="danger" @click="examineAndApprove(3)">驳 回</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listRequisitionOrders,
+  getRequisitionOrders,
+  delRequisitionOrders,
+  addRequisitionOrders,
+  updateRequisitionOrders, materialRequisitionTaskList, approvalOrders
+} from "@/api/huaxian/requisitionOrders";
+import {queryMaterielList} from "@/api/tablelist/commonTable";
+
+export default {
+  name: "AapprovalRequisitionOrders",
+  dicts: ["approval_process_status"],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 子表选中数据
+      checkedRequisitionItems: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 领料单表格数据
+      requisitionOrdersList: [],
+      // 领料明细表格数据
+      requisitionItemsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskCode: null,
+        requisitionNumber: null,
+        saleOrderNo: null,
+        requisitionDate: null,
+        state: null,
+        createById: null,
+        updateById: null,
+        dataApprovalStatus: '5',
+        requistionOrdersType: 0,
+        processKey: null,
+        taskProcessKey: null,
+        taskNodeKey: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {},
+      // 可领料任务列表
+      taskList: [],
+      // 物料信息表
+      materielList: [],
+      // 领料状态 填写实际领料数量
+      requistionState: false,
+      // 单据类型 false:新增领料 true:退料
+      requistionOrdersType: false,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询领料单列表 */
+    getList() {
+      this.loading = true;
+      listRequisitionOrders(this.queryParams).then(response => {
+        this.requisitionOrdersList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询可领料任务 */
+    getTaskList() {
+      materialRequisitionTaskList().then(response => {
+        console.log(response)
+        this.taskList = response.rows;
+      });
+    },
+    /** 查询物料信息 */
+    getMaterielList() {
+      queryMaterielList().then(res => {
+        this.materielList = res.data;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.requistionOrdersType = false;
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskCode: null,
+        requisitionNumber: null,
+        requistionOrdersType: null,
+        saleOrderNo: null,
+        requisitionDate: null,
+        state: null,
+        remark: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null,
+        dataApprovalStatus: null,
+        processKey: null,
+        taskProcessKey: null,
+        taskNodeKey: null
+      };
+      this.requisitionItemsList = [];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      // 获取领料任务
+      this.getTaskList();
+      // 获取物料信息
+      this.getMaterielList();
+      this.reset();
+      this.open = true;
+      this.title = "添加领料单";
+      // 默认领料时间为当前
+      this.form.requisitionDate = new Date(new Date().toDateString());
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRequisitionOrders(id).then(response => {
+        this.form = response.data;
+        this.requisitionItemsList = response.data.requisitionItemsList;
+        this.open = true;
+        this.title = "修改领料单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.form.requisitionItemsList = this.requisitionItemsList;
+          // 领取物料任务信息
+          let taskInfo = this.taskList.find(item => item.saleProductsId === this.form.value)
+          // taskinfo.saleProductsLotNumber, // 生产批号
+          // taskinfo.productionProductName  // 下单产品名称
+          this.form = {
+            ...this.form,
+            taskCode: taskInfo.saleProductsProductNumber,// 下单重量
+            saleOrderNo: taskInfo.saleProductsSaleOrderNo,// 订单编号
+            specifications: taskInfo.productionProductSpecifications, // 规格
+          }
+          if (this.form.id != null) {
+            updateRequisitionOrders(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            // 领料状态(0:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成)
+            this.form.state = 0
+            this.form.requisitionNumber = Date.now();
+            addRequisitionOrders(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除领料单编号为"' + ids + '"的数据项?').then(function () {
+        return delRequisitionOrders(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /**
+     * 审核单据
+     */
+    toExamine(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRequisitionOrders(id).then(response => {
+        if (response.data.requistionOrdersType == 1) {
+          // 退料
+          this.requistionOrdersType = true;
+        }
+        this.form = response.data;
+        this.requisitionItemsList = response.data.requisitionItemsList;
+        this.form.value = this.form.taskCode;
+        this.open = true;
+        this.title = this.form.createBy + "的单据";
+      });
+    },
+    /** 审批领料单*/
+    examineAndApprove(state) {
+      // 0=:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成
+      let msg = (state === 2) ? '通过' : '驳回';
+      this.form.state = state
+      // 默=认字段,0=:已提交、1:已通过、2:不通过、3:未提交、4:驳回、5:审批中"
+      this.form.dataApprovalStatus = (state === 2) ? 1 : 4;
+      // confirm 使用function()会丢失上下文,
+      // ()=>箭头函数会自动绑定this
+      this.$modal.confirm(msg + '"' + this.form.createBy + '"的领料?').then(() => {
+        return approvalOrders(this.form);
+      }).then(() => {
+        this.open = false;
+        this.getList();
+        this.$modal.msgSuccess("审批成功");
+      })
+      // .catch(() => {
+      //   this.$modal.msgError("错误!请联系管理员!");
+      // })
+      ;
+    },
+    /** 领料明细序号 */
+    rowRequisitionItemsIndex({row, rowIndex}) {
+      row.index = rowIndex + 1;
+    },
+    /** 领料明细添加按钮操作 */
+    handleAddRequisitionItems() {
+      let obj = {};
+      obj.materialId = "";
+      obj.quantity = "";
+      obj.actualQuantity = "";
+      obj.state = "";
+      obj.specifications = "";
+      obj.colorCode = "";
+      obj.remark = "";
+      obj.createById = "";
+      obj.updateById = "";
+      obj.dataApprovalStatus = "";
+      obj.processKey = "";
+      obj.taskProcessKey = "";
+      obj.taskNodeKey = "";
+      this.requisitionItemsList.push(obj);
+    },
+    /** 领料明细删除按钮操作 */
+    handleDeleteRequisitionItems() {
+      if (this.checkedRequisitionItems.length == 0) {
+        this.$modal.msgError("请先选择要删除的领料明细数据");
+      } else {
+        const requisitionItemsList = this.requisitionItemsList;
+        const checkedRequisitionItems = this.checkedRequisitionItems;
+        this.requisitionItemsList = requisitionItemsList.filter(function (item) {
+          return checkedRequisitionItems.indexOf(item.index) == -1
+        });
+      }
+    },
+    /** 复选框选中数据 */
+    handleRequisitionItemsSelectionChange(selection) {
+      this.checkedRequisitionItems = selection.map(item => item.index)
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/requisitionOrders/export', {
+        ...this.queryParams
+      }, `requisitionOrders_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 723 - 0
zkqy-ui/src/views/orderMange/requisitionOrders/index.vue

@@ -0,0 +1,723 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <!--      <el-form-item label="任务编码" prop="taskCode">-->
+      <!--        <el-input-->
+      <!--          v-model="queryParams.taskCode"-->
+      <!--          placeholder="请输入任务编码"-->
+      <!--          clearable-->
+      <!--          @keyup.enter.native="handleQuery"-->
+      <!--        />-->
+      <!--      </el-form-item>-->
+      <el-form-item label="领料编号" prop="requisitionNumber">
+        <el-input
+          v-model="queryParams.requisitionNumber"
+          placeholder="请输入领料单编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="saleOrderNo">
+        <el-input
+          v-model="queryParams.saleOrderNo"
+          placeholder="请输入订单编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领料日期" prop="requisitionDate">
+        <el-date-picker clearable
+                        v-model="queryParams.requisitionDate"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择领料日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="单据类型" prop="state">
+        <el-select v-model="queryParams.requistionOrdersType" filterable placeholder="请选择任务领料"
+                   @change="handleQuery">
+          <el-option key="1" label="领料" :value="0"/>
+          <el-option key="2" label="退料" :value="1"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:requisitionOrders:add']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:requisitionOrders:edit']"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:requisitionOrders:remove']"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['business:requisitionOrders:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="requisitionOrdersList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <!--      <el-table-column label="领料单ID" align="center" prop="id"/>-->
+      <!--      <el-table-column label="任务编码" align="center" prop="taskCode"/>-->
+      <el-table-column label="领料单编号" align="center" prop="requisitionNumber"/>
+      <el-table-column label="订单编号" align="center" prop="saleOrderNo"/>
+      <el-table-column label="单据类型" align="center" prop="requistionOrdersType">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.requistionOrdersType == 0">领料</el-tag>
+          <el-tag v-else type="success">退料</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="领料日期" align="center" prop="requisitionDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.requisitionDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="state">
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.requisition_orders_state"
+            :value="scope.row.state"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button v-show="scope.row.state == 0 || scope.row.state==3" size="mini" type="text"
+                           icon="el-icon-edit"
+                           @click="submitForApproval(scope.row)" v-hasPermi="['business:requisitionOrders:edit']">提交
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button v-show="scope.row.state == 2 && scope.row.requistionOrdersType == 0" size="mini" type="text"
+                           icon="el-icon-edit" @click="requistion(scope.row)"
+                           v-hasPermi="['business:requisitionOrders:edit']">领料
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button v-show="scope.row.state == 0 || scope.row.state== 3" size="mini" type="text"
+                           icon="el-icon-edit"
+                           @click="handleUpdate(scope.row)" v-hasPermi="['business:requisitionOrders:edit']">修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button v-show="scope.row.state == 0 || scope.row.state == 3" size="mini" type="text"
+                           icon="el-icon-delete"
+                           @click="handleDelete(scope.row)" v-hasPermi="['business:requisitionOrders:remove']">删除
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  v-show="scope.row.state == 5|| (scope.row.state ==2 && scope.row.requistionOrdersType == 1)"
+                  size="mini" type="text" icon="el-icon-delete" @click="handlePrint(scope.row)">打印单据
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
+
+    <!-- 添加或修改领料单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body :before-close="cancel">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="单据类型" prop="requistionOrdersType">
+              <el-select v-model="form.requistionOrdersType" filterable placeholder="请选择任务领料"
+                         :disabled="requistionState" @change="handleRequistionState(form.requistionOrdersType)">
+                <el-option key="0" label="领料" :value=0></el-option>
+                <el-option key="1" label="退料" :value=1></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="领料任务" prop="taskCode">
+              <el-select v-model="form.taskCode" filterable placeholder="请选择任务领料" :disabled="requistionState"
+                         @change="handleRequistionState(form.requistionOrdersType)">
+                <el-option v-for="item in taskList" :key="item.saleProductsId" :label="item.saleProductsTaskName"
+                           :value="item.saleProductsId"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="领料日期" prop="requisitionDate">
+              <el-date-picker style="width: 100%" v-model="form.requisitionDate" type="date"
+                              value-format="yyyy-MM-dd" placeholder="请选择领料日期"
+                              :disabled="requistionState"></el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" v-model="form.remark" placeholder="领料备注" :disabled="requistionState"/>
+        </el-form-item>
+        <el-divider content-position="center">物料信息</el-divider>
+
+        <el-row :gutter="10" class="mb8" v-show="!requistionState && !requistionOrdersType">
+          <el-col :span="1.5">
+            <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddRequisitionItems">添加
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteRequisitionItems">删除
+            </el-button>
+          </el-col>
+        </el-row>
+        <el-table :style="requistionState?'float: left; width: 80%':requistionOrdersType?'float: left; width: 80%':''"
+                  :data="requisitionItemsList" :row-class-name="rowRequisitionItemsIndex"
+                  @selection-change="handleRequisitionItemsSelectionChange" ref="requisitionItems">
+          <el-table-column type="selection" width="50" align="center" v-if="!requistionState"/>
+          <el-table-column label="序号" align="center" prop="index" width="50"/>
+          <el-table-column label="物料" prop="materialId" align="center">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.materialId" filterable placeholder="请选择物料"
+                        :disabled="requistionState?true:requistionOrdersType?true:false"
+                         @change="handleMaterielInfo(scope)">
+                <el-option v-for="mtem in materielList" :key="mtem.id" :label="mtem.materielCode+''+mtem.materielName"
+                           :value="mtem.materielCode"></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column :label="requistionOrdersType?'预计可退数量/重量':'预计领用数量/重量'" prop="quantity"
+                           align="center">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.quantity" type="number" placeholder="请输入预计领用数量/重量"
+                        :disabled="requistionState?true:requistionOrdersType?true:false"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="备注" prop="remark" width="250" align="center">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.remark" placeholder="请输入备注" :disabled="requistionState?true:requistionOrdersType?true:false"/>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div :style="requistionState?'':requistionOrdersType?'':'clear: both'"/>
+        <el-table style="float: left;width: 20%" v-show="requistionState || requistionOrdersType"
+                  :data="requisitionItemsList" :row-class-name="rowRequisitionItemsIndex"
+                  @selection-change="handleRequisitionItemsSelectionChange" ref="requisitionItems">
+          <el-table-column :label="requistionOrdersType?'回退数量/重量':'实际领用数量/重量'" prop="actualQuantity"
+                           width="150">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.actualQuantity" type="number"
+                        :placeholder="requistionOrdersType?'请输入回退数量/重量':'请输入实际领用数量/重量'"/>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div style="clear: both"/>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <div id="wuliao"></div>
+  </div>
+</template>
+
+<script>
+import {
+  listRequisitionOrders,
+  getRequisitionOrders,
+  delRequisitionOrders,
+  addRequisitionOrders,
+  updateRequisitionOrders, materialRequisitionTaskList, approvalOrders, getRequisitionOrdersByTaskCode
+} from "@/api/huaxian/requisitionOrders";
+import {queryMaterielList} from "@/api/tablelist/commonTable";
+
+export default {
+  name: "RequisitionOrders",
+  dicts: ["approval_process_status", "requisition_orders_state"],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 子表选中数据
+      checkedRequisitionItems: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 领料单表格数据
+      requisitionOrdersList: [],
+      // 领料明细表格数据
+      requisitionItemsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskCode: null,
+        requistionOrdersType: 0,
+        requisitionNumber: null,
+        saleOrderNo: null,
+        requisitionDate: null,
+        state: null,
+        createById: null,
+        updateById: null,
+        dataApprovalStatus: null,
+        processKey: null,
+        taskProcessKey: null,
+        taskNodeKey: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        taskCode: [
+          {required: true, message: '请选择任务领料', trigger: 'blur'}
+        ],
+        requisitionItemsList: {
+          materialId: [
+            {required: true, message: '请选择任务领料', trigger: 'blur'}
+          ],
+        }
+      },
+      // 可领料任务列表
+      taskList: [],
+      // 物料信息表
+      materielList: [],
+      // 领料状态 填写实际领料数量
+      requistionState: false,
+      // 单据类型 false:新增领料 true:退料
+      requistionOrdersType: false,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询领料单列表 */
+    getList() {
+      this.loading = true;
+      listRequisitionOrders(this.queryParams).then(response => {
+        this.requisitionOrdersList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询可领料任务 */
+    getTaskList() {
+      materialRequisitionTaskList().then(response => {
+        this.taskList = response.rows;
+      });
+    },
+    /** 查询物料信息 */
+    getMaterielList() {
+      queryMaterielList().then(res => {
+        this.materielList = res.data;
+      });
+    },
+    // /** 查询字典(初始化所需数据)*/
+    // initDictData() {
+    //   getDicts("approval_process_status").then((res) => {
+    //     //制定周期跑一次定时任务
+    //     console.log("字典中数据", res.data);
+    //   });
+    // },
+    // 处理领用物料信息
+    handleMaterielInfo(scope) {
+      scope.row.specifications = this.materielList.find(item => item.materielCode == scope.row.materialId).specificationModel
+    },
+    // 取消按钮
+    cancel() {
+      console.log("取消按钮")
+      this.open = false;
+      this.reset();
+      // 领料状态
+      this.requistionState = false;
+      // 单据类型
+      this.requistionOrdersType = false;
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskCode: null,
+        requisitionNumber: null,
+        saleOrderNo: null,
+        requisitionDate: null,
+        requistionOrdersType: null,
+        state: null,
+        remark: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null,
+        dataApprovalStatus: null,
+        processKey: null,
+        taskProcessKey: null,
+        taskNodeKey: null
+      };
+      this.requisitionItemsList = [];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      // 获取领料任务
+      this.getTaskList();
+      // 获取物料信息
+      this.getMaterielList();
+      this.reset();
+      this.open = true;
+      this.title = "添加领料单";
+      // 默认领料时间为当前
+      this.form.requisitionDate = new Date(new Date().toDateString());
+      this.form.requistionOrdersType = 0;
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      // 获取领料任务
+      this.getTaskList();
+      getRequisitionOrders(id).then(response => {
+        this.form = response.data;
+        // this.taskList.find(item => {
+        //     if (
+        //       this.requisitionItemsList[0].taskCode == item.saleProductsProductNumber &&// 下单重量
+        //       this.requisitionItemsList[0].saleOrderNo == item.saleProductsSaleOrderNo &&// 订单编号
+        //       this.requisitionItemsList[0].specifications == item.productionProductSpecifications  // 规格
+        //     ) {
+        //       this.form.value = item.saleProductsId;
+        //     }
+        //   }
+        // );
+        this.requisitionItemsList = response.data.requisitionItemsList;
+        this.open = true;
+        this.form.taskCode = parseInt(this.form.taskCode);
+        this.title = "修改领料单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      if (this.requisitionItemsList.length == 0) {
+        return this.$message.error("请添加物料信息");
+      }
+      let state = 0;
+      this.requisitionItemsList.forEach(item => {
+
+        if (this.form.requistionOrdersType == 0) {
+          if (item.materialId == null || item.materialId == '') {
+            console.log("物料信息不能为空")
+            state = 1;
+          }
+          if (item.quantity == null || item.quantity == '') {
+            console.log("数量不能为空")
+            state = 1;
+          }
+        } else {
+          // 退料
+          if (item.actualQuantity == null || item.actualQuantity == '') {
+            console.log("实际领料数量不能为空")
+            state = 1;
+          }
+        }
+      });
+
+      if (state == 1) {
+        return this.$message.error("请完善表单数据");
+      }
+
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.form.requisitionItemsList = this.requisitionItemsList;
+          // 领取物料任务信息
+          let taskInfo = this.taskList.find(item => item.saleProductsId === this.form.taskCode)
+          // taskinfo.saleProductsLotNumber, // 生产批号
+          // taskinfo.productionProductName  // 下单产品名称
+          this.form = {
+            ...this.form,
+            taskCode: taskInfo.saleProductsId,// 子表下单编号
+            saleOrderNo: taskInfo.saleProductsSaleOrderNo,// 订单编号
+            specifications: taskInfo.productionProductSpecifications, // 规格
+          }
+          if (this.form.id != null) {
+            this.form.requistionState = this.requistionState
+            this.form.state = this.requistionState ? 5 : this.form.state;
+            updateRequisitionOrders(this.form).then(response => {
+              console.log("请求成功", response);
+              this.$modal.msgSuccess(this.requistionState ? "领料成功" : "修改成功");
+              this.open = false;
+              this.getList();
+              this.requistionState = false;
+            }).catch(reason => {
+              console.log("catch", reason);
+              this.$modal.msgSuccess(reason.msg());
+            });
+          } else {
+            // 领料状态(0:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成)
+            this.form.state = 0
+            this.form.requisitionNumber = Date.now();
+            addRequisitionOrders(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除领料单编号为"' + ids + '"的数据项?').then(function () {
+        return delRequisitionOrders(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 提交审核*/
+    submitForApproval(row) {
+      this.$modal.confirm('是否确认提交领料单编号为"' + row.requisitionNumber + '"的领料?').then(function () {
+        let form = {
+          ...row,
+          state: 1,              // 0=:待提交、1:审核中、2:已批准、3:未批准、4:已作废、5:已完成
+
+          dataApprovalStatus: 5, //审批状态参考字典
+        }
+        return approvalOrders(form);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("提交成功");
+      }).catch(() => {
+      });
+    },
+    /** 领料 */
+    requistion(row) {
+      this.reset();
+      const id = row.id || this.ids
+      // 获取领料任务
+      this.getTaskList();
+      getRequisitionOrders(id).then(response => {
+        this.form = response.data;
+        this.requisitionItemsList = response.data.requisitionItemsList;
+        this.open = true;
+        this.form.taskCode = parseInt(this.form.taskCode);
+        this.requistionState = true;
+        this.title = "实际领用数量";
+      });
+    },
+    /** 领料明细序号 */
+    rowRequisitionItemsIndex({row, rowIndex}) {
+      row.index = rowIndex + 1;
+    },
+    /** 领料明细添加按钮操作 */
+    handleAddRequisitionItems() {
+      let obj = {};
+      obj.materialId = "";
+      obj.quantity = "";
+      obj.actualQuantity = "";
+      obj.state = "";
+      obj.specifications = "";
+      obj.colorCode = "";
+      obj.remark = "";
+      obj.createById = "";
+      obj.updateById = "";
+      obj.dataApprovalStatus = "";
+      obj.processKey = "";
+      obj.taskProcessKey = "";
+      obj.taskNodeKey = "";
+      this.requisitionItemsList.push(obj);
+    },
+    /** 领料明细删除按钮操作 */
+    handleDeleteRequisitionItems() {
+      if (this.checkedRequisitionItems.length == 0) {
+        this.$modal.msgError("请先选择要删除的领料明细数据");
+      } else {
+        const requisitionItemsList = this.requisitionItemsList;
+        const checkedRequisitionItems = this.checkedRequisitionItems;
+        this.requisitionItemsList = requisitionItemsList.filter(function (item) {
+          return checkedRequisitionItems.indexOf(item.index) == -1
+        });
+      }
+    },
+    /** 复选框选中数据 */
+    handleRequisitionItemsSelectionChange(selection) {
+      this.checkedRequisitionItems = selection.map(item => item.index)
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/requisitionOrders/export', {
+        ...this.queryParams
+      }, `requisitionOrders_${new Date().getTime()}.xlsx`)
+    },
+    /**
+     * 退料逻辑
+     */
+    handleRequistionState(type) {
+      if (type == 0) {
+        // 领料
+        this.requisitionItemsList = [];
+        this.requistionOrdersType = false;
+      } else if (type == 1) {
+        // 退料
+        this.requistionOrdersType = true;
+        if (this.form.taskCode) {
+          this.requisitionItemsList = [];
+          getRequisitionOrdersByTaskCode(this.form.taskCode).then(res => {
+            this.requisitionItemsList = res.data.requisitionItemsList;
+            console.log("退料详情:", res);
+          }).catch(reason => {
+            this.requisitionItemsList = [];
+          });
+        }
+      }
+    },
+    handlePrint(row) {
+      // 打印
+      this.reset();
+      const id = row.id || this.ids
+      // 获取领料任务
+      this.getTaskList();
+
+      getRequisitionOrders(id).then(response => {
+        let printlnInfo = response.data;
+
+        let requisitionItemsList = response.data.requisitionItemsList;
+
+        materialRequisitionTaskList().then(res => {
+
+          queryMaterielList().then(qes => {
+            let materielList = qes.data;
+
+            let taskList = res.rows;
+
+            let titleName = printlnInfo.requistionOrdersType == 0 ? "领料单据" : "退料单据";
+
+            var tableInfo = '';
+
+            for (let i = 0; i < requisitionItemsList.length; i++) {
+              tableInfo += `
+                          <tr>
+                            <td>${i + 1}</td>
+                            <td>${requisitionItemsList[i].materialId}${materielList.find(item => item.materialCode == i.materialId).materielName}</td>
+                            <td>${requisitionItemsList[i].quantity}</td>
+                            <td>${requisitionItemsList[i].remark}</td>
+                            <td>${requisitionItemsList[i].actualQuantity}</td>
+                          </tr>`
+            }
+            // 模版
+            let printContent = `
+      <table style="border: 1px solid black;border-collapse: collapse; text-align: center; width: 100%" border="1px;">
+      <tr>
+        <td rowspan="2" colspan="6">${titleName}</td>
+      </tr>
+      <tr></tr>
+      <tr>
+        <td>类型</td>
+        <td>${printlnInfo.requistionOrdersType ? '领料' : '退料'}</td>
+        <td>任务</td>
+        <td>${taskList.find(item => item.saleProductsId == parseInt(printlnInfo.taskCode)).saleProductsTaskName}</td>
+        <td>日期</td>
+        <td>${printlnInfo.requisitionDate}</td>
+      </tr>
+      <tr>
+        <td>备注</td>
+        <td colspan="5">${printlnInfo.remark}</td>
+      </tr>
+    </table>
+    <div style="text-align: center;margin-bottom: 20px">
+      <span style="position: relative;top: 20px; background: white;">物料信息</span>
+      <hr style="clear:both;"/>
+    </div>
+    <table style="border: 1px solid black;border-collapse: collapse;text-align: center;  width: 100%" border="1px;">
+      <tr>
+        <td>序号</td>
+        <td>物料</td>
+        <td>
+          ${printlnInfo.requistionOrdersType ? '预计可退数量/重量' : '预计领用数量/重量'}</td>
+        <td>备注</td>
+        <td>${printlnInfo.requistionOrdersType ? '回退数量/重量' : '实际领用数量/重量'}</td>
+      </tr>
+      ` + tableInfo + `
+    </table>`;
+
+            document.body.innerHTML = document.getElementById("wuliao").innerHTML = printContent;
+            window.print(); //打印
+            window.location.reload();
+            return false;
+          });
+        });
+      });
+    }
+  }
+};
+</script>

+ 1 - 0
zkqy-ui/src/views/orderMange/retailMange/index.vue

@@ -1201,6 +1201,7 @@ export default {
         productColour =
           targetColor.materieEncoding + "" + targetColor.materieColorNumber;
       }
+      productColour =colours;
       let payload = {
         productId,
         productType,

+ 11 - 6
zkqy-ui/src/views/system/financialManage/invoiceDetail.vue

@@ -151,7 +151,7 @@
         <el-table-column label="开票"></el-table-column>
         <el-table-column label="差额"></el-table-column>
       </el-table-column>
-      <el-table-column
+      <!-- <el-table-column
         label="操作"
         align="center"
         class-name="small-padding fixed-width"
@@ -161,7 +161,7 @@
             <el-button type="warning" plain size="small">
               操作<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
-            <el-dropdown-menu slot="dropdown">
+            <el-dropdown-menu slot="dropdown"> -->
               <!-- <el-dropdown-item
                 v-show="scope.row.status == 1 || scope.row.status == 3"
                 ><el-button
@@ -173,7 +173,7 @@
                   >修改</el-button
                 ></el-dropdown-item
               > -->
-              <el-dropdown-item
+              <!-- <el-dropdown-item
                 ><el-button
                   size="mini"
                   type="text"
@@ -181,7 +181,7 @@
                   @click="handleDetail(scope.row)"
                   >查看明细</el-button
                 ></el-dropdown-item
-              >
+              > -->
               <!-- <el-dropdown-item
                 v-show="scope.row.status == 1 || scope.row.status == 3"
                 ><el-button
@@ -204,10 +204,10 @@
                   >删除</el-button
                 ></el-dropdown-item
               > -->
-            </el-dropdown-menu>
+            <!-- </el-dropdown-menu>
           </el-dropdown>
         </template>
-      </el-table-column>
+      </el-table-column> -->
     </el-table>
 
     <pagination
@@ -382,7 +382,11 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    
     <!-- 明细弹窗 -->
+    <el-dialog :title="title" :visible.sync="detailShow" width="600px" append-to-body>
+      <div>11111</div>
+    </el-dialog>
   </div>
 </template>
 
@@ -457,6 +461,7 @@ export default {
   methods: {
     // 查看明细回调
     handleDetail(row) {
+      console.log('-------------------------------');
       this.detailShow = true;
     },
     // 提交回调