Преглед изворни кода

feat:领料退料打印单据等逻辑

韩帛霖 пре 11 месеци
родитељ
комит
789f91d0a6

+ 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>
 
     <!-- 类型处理器-->

+ 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);
+    }
+}

+ 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();
+    }
+}

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

@@ -0,0 +1,104 @@
+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);
+}

+ 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);
+}

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

@@ -0,0 +1,201 @@
+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) {
+        return requisitionOrdersMapper.selectRequisitionOrdersByTaskCode(taskCode);
+    }
+
+    /**
+     * 新增领料明细信息
+     *
+     * @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>

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

@@ -0,0 +1,345 @@
+<?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 requistionOrdersType != ''">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>
+
+    <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
+  })
+}

+ 2 - 1
zkqy-ui/src/views/login.vue

@@ -282,7 +282,8 @@ export default {
             Cookies.remove("rememberMe");
           }
           let form = {
-            uri: "?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.124:8066/oauth/callback",
+            // uri: "?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.125:8066/oauth/callback",
+            uri: "?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.125:8066/oauth/callback",
             ...this.loginForm,
             tenantID: this.tenantId,
           };

+ 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);

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

@@ -0,0 +1,466 @@
+<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="0"/>
+          <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">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="toExamine(scope.row)"
+            v-hasPermi="['business:requisitionOrders:edit']"
+          >审核
+          </el-button>
+        </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: '0',
+        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>

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

@@ -0,0 +1,685 @@
+<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-input
+          v-model="queryParams.state"
+          placeholder="请输入领料状态"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </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-button v-show="scope.row.state == 0"
+                     size="mini"
+                     type="text"
+                     icon="el-icon-edit"
+                     @click="submitForApproval(scope.row)"
+                     v-hasPermi="['business:requisitionOrders:edit']"
+          >提交
+          </el-button>
+          <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-button v-show="scope.row.state == 0"
+                     size="mini"
+                     type="text"
+                     icon="el-icon-edit"
+                     @click="handleUpdate(scope.row)"
+                     v-hasPermi="['business:requisitionOrders:edit']"
+          >修改
+          </el-button>
+          <el-button v-show="scope.row.state == 0"
+                     size="mini"
+                     type="text"
+                     icon="el-icon-delete"
+                     @click="handleDelete(scope.row)"
+                     v-hasPermi="['business:requisitionOrders:remove']"
+          >删除
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handlePrint(scope.row)"
+          >打印单据
+          </el-button>
+        </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="state">
+              <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 clearable 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"
+                         @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"/>
+            </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"/>
+            </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,
+        requisitionNumber: null,
+        saleOrderNo: null,
+        requisitionDate: null,
+        state: null,
+        createById: null,
+        updateById: null,
+        dataApprovalStatus: null,
+        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 => {
+        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() {
+      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: 0, // 数据审批状态(0:未审批、1:审批中、2:审批通过、3:审批不通过)
+        }
+        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>预计可退数量/重量</td>
+        <td>备注</td>
+        <td>回退数量/重量</td>
+      </tr>
+      ` + tableInfo + `
+    </table>`;
+
+            document.body.innerHTML = document.getElementById("wuliao").innerHTML = printContent;
+            window.print(); //打印
+            window.location.reload();
+            return false;
+          });
+        });
+      });
+    }
+  }
+};
+</script>