关于mysql存储过程示例-手动事务-循环-日志

CREATE DEFINER=`root`@`%` PROCEDURE `RTX_RECEIPT_INSPECT_DATA`()
BEGIN

    -- 声明变量
    DECLARE RESULT_CODE INT DEFAULT FALSE; -- 默认false
    DECLARE done INT DEFAULT FALSE; -- 默认false
    DECLARE log_message TEXT;
    DECLARE V_COUNT INT;
    DECLARE V_QCREQUIRED VARCHAR(10);-- 收货需质检
    DECLARE V_PLANEMOVETASK VARCHAR(10);-- 生成平移任务
    DECLARE V_RECEIVESENDERP VARCHAR(10);-- 生成收货触发ERP
    DECLARE V_RULEKEY VARCHAR(30);-- 入库规则编号
    DECLARE V_POSTATUS VARCHAR(2); -- PO明细状态
    DECLARE V_APICHANGED VARCHAR(2); -- 接口指令更改标记
    DECLARE V_ERPLOC VARCHAR(50); -- ERP库位
    DECLARE V_LOTTABLE01 VARCHAR(50); -- 源ERP库位
    DECLARE V_INSPECTTYPE VARCHAR(10);
    DECLARE V_RECEIPTKEY VARCHAR(20);
    DECLARE V_RECEIPTLINENUMBER VARCHAR(20);
    DECLARE V_STORERKEY VARCHAR(50);
    DECLARE V_SKU VARCHAR(50);
    DECLARE V_QTYRECEIVED DECIMAL(22, 5);
    DECLARE V_UOM VARCHAR(5);
    DECLARE V_LOTTABLE02 VARCHAR(50);
    DECLARE V_RTXLOTTABLE14 VARCHAR(50);
    DECLARE V_TOLOC VARCHAR(20);
    DECLARE V_RTXMINPACKQTY DECIMAL(22, 5);
    DECLARE V_FIRSTQC VARCHAR(50);
    DECLARE V_rtxRcErpTaskStatus VARCHAR(1);
    DECLARE V_POKEY VARCHAR(50);
    DECLARE V_POLINENUMBER VARCHAR(15);
    DECLARE V_TYPE VARCHAR(10);
    DECLARE V_SUSR4 VARCHAR(50);
    DECLARE V_RTXRECEIVESLOCATION VARCHAR(50);

    -- 声明游标
    DECLARE receiptDetail_cursor CURSOR FOR
        SELECT CASE
                   WHEN R.TYPE = '7' OR (R.TYPE = '3' AND PS.DEPARTMENT = 'SP') THEN '1'
                   WHEN R.TYPE = '3' AND PS.DEPARTMENT = 'OM' THEN '4'
                   WHEN R.TYPE = '17' AND R.REFERENCELOCATION = 'RDM' THEN '3'
                   WHEN R.TYPE = '3' AND R.REFERENCELOCATION = 'RDM' THEN '3'
                   WHEN R.TYPE = '3' AND PS.DEPARTMENT <> 'OM' AND PS.DEPARTMENT <> 'SP' THEN '5'
                   WHEN R.TYPE = '15' OR R.TYPE = '40' THEN '12'
                   ELSE 'NONE' END    AS INSPECTTYPE,
               RD.RECEIPTKEY,
               RD.RECEIPTLINENUMBER,
               RD.STORERKEY,
               RD.SKU,
               RD.QTYRECEIVED,
               RD.UOM,
               RD.LOTTABLE02,
               RD.RTXLOTTABLE14, -- 生产条码 || 收货的 供应商批号(次) || 条码信息表的供应商批次
               RD.LOTTABLE01,
               RD.TOLOC,
               SKU.RTXMINPACKQTY,
               RD.RTXFIRSTDELV        AS FIRSTQC,
               RD.rtxRcErpTaskStatus,
               RD.POKEY,
               RD.POLINENUMBER,
               R.TYPE,
               COALESCE(R.SUSR4, ' ') AS SUSR4,
               RD.RTXRECEIVESLOCATION
        FROM (SELECT * FROM RECEIPTDETAIL rdt WHERE rdt.editdate > DATE_SUB(NOW(), INTERVAL 60 DAY)) RD
                 INNER JOIN RECEIPT R ON RD.RECEIPTKEY = R.RECEIPTKEY
                 INNER JOIN SKU ON SKU.SKU = RD.SKU AND SKU.STORERKEY = RD.STORERKEY
                 LEFT JOIN RTXPLANTSLOACTION PS ON PS.PLANT = RD.RTXSHIPPLANT AND PS.SLOCATION = RD.RTXSHIPSLOCATION
        WHERE R.RTXISVIRTUAL = '0'
          AND RD.QTYRECEIVED > 0
          AND RD.RECEIPTKEY <> '0000049014'
          AND RD.STATUS NOT IN ('20')
          AND (R.TYPE = '15' OR (R.TYPE <> '15' AND R.STATUS = '11'))
          AND RD.QCSTATUS = 'N'
          AND RD.QCREQUIRED = '1'
          AND (RD.rtxRcErpTaskStatus = '1' OR EXISTS (SELECT 1
                                                      FROM TASKDETAIL
                                                      WHERE TASKTYPE = 'RTXPMV'
                                                        AND STATUS IN ('9', 'R', 'X')
                                                        AND SOURCEKEY = RD.RECEIPTKEY
                                                        AND ORDERLINENUMBER = RD.RECEIPTLINENUMBER));
																												
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET RESULT_CODE = TRUE; #在执行过程中出任何异常设置result_code为true
		
    -- 声明异常处理
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 没值设置true

    -- 开始事务
    START TRANSACTION;

    -- 删除不存在收货明细送检记录。
    DELETE
    FROM RTXQCSEND X
    WHERE X.SOURCETYPE = 'RECEIPT'
      AND STATUS = '0'
      AND NOT EXISTS (SELECT 1
                      FROM RECEIPTDETAIL Y
                      WHERE X.ORDERKEY = Y.RECEIPTKEY
                        AND X.ORDERLINENUMBER = Y.RECEIPTLINENUMBER);

    -- 打开游标
    OPEN receiptDetail_cursor;

    -- 循环读取数据
    read_loop:
    LOOP
        -- 读取游标数据
        FETCH receiptDetail_cursor INTO V_INSPECTTYPE, V_RECEIPTKEY, V_RECEIPTLINENUMBER, V_STORERKEY, V_SKU, V_QTYRECEIVED, V_UOM, V_LOTTABLE02, V_RTXLOTTABLE14, V_LOTTABLE01, V_TOLOC, V_RTXMINPACKQTY, V_FIRSTQC, V_rtxRcErpTaskStatus, V_POKEY, V_POLINENUMBER, V_TYPE, V_SUSR4, V_RTXRECEIVESLOCATION;

        -- 判断是否到达游标末尾
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET V_ERPLOC = IFNULL(V_LOTTABLE01, ' ');

        -- 获取入库规则配置
        SET V_RULEKEY = (SELECT RULEKEY FROM RECEIPT INNER JOIN RTXRECEIVERULERELATION ON WMSRECEIPTYPE = TYPE AND ERPRECEIPTYPE = RTXEXTTYPE WHERE RECEIPTKEY = V_RECEIPTKEY LIMIT 1);
        SET log_message = CONCAT(log_message, '; 获取入库规则配置 = ', V_RULEKEY);

        SELECT QCREQUIRED, PLANEMOVETASK, RECEIVESENDERP INTO V_QCREQUIRED, V_PLANEMOVETASK, V_RECEIVESENDERP FROM RTXRECEIVERULECONFIG WHERE RULEKEY = V_RULEKEY;
        SET log_message = CONCAT(log_message, '; 收货需质检 = ', V_QCREQUIRED, '; 生成平移任务 = ', V_PLANEMOVETASK, '; 收货触发ERP = ', V_RECEIVESENDERP, '; 是否首次收货 = ', IFNULL(V_FIRSTQC, ''));

        -- 入库规则必须已启用质检
        IF V_QCREQUIRED = 'Y' THEN
            -- 如果ASN明细有关联PO明细,则验证PO明细状态不能为取消或接口已更改
            SELECT COUNT(1), MAX(STATUS), MAX(RTXCHANGED) INTO V_COUNT, V_POSTATUS, V_APICHANGED FROM PODETAIL WHERE POKEY = V_RECEIPTKEY AND POLINENUMBER = V_RECEIPTLINENUMBER;
            SET log_message = CONCAT(log_message, '; ASN明细有关联PO明细大小 = ', V_COUNT, '; PO明细状态 = ', IFNULL(V_POSTATUS, ''), '; PO明细指令变更标识 = ', IFNULL(V_APICHANGED, ''));

            IF V_COUNT > 0 THEN
                IF V_POSTATUS > 11 OR V_APICHANGED = 'Y' THEN
                    SET log_message = CONCAT(log_message, 'PO明细状态 = ', IFNULL(V_POSTATUS, ''), '; PO明细指令变更标识 = ', IFNULL(V_APICHANGED, ''), '; 不满足业务跳出本次循环!');
                    LEAVE read_loop;
                END IF;
            END IF;

            -- 如果入库规则已启用平移且收货明细已生成平移任务,则验证平移任务必须执行完毕
            SET log_message = CONCAT(log_message, '生成平移任务是否为【Y】 = ', IFNULL(V_PLANEMOVETASK, ''), '; 生成平移任务是否为【1】 = ', IFNULL(V_FIRSTQC, ''));
            IF V_PLANEMOVETASK = 'Y' AND V_FIRSTQC = '1' THEN
                
                SELECT COUNT(1) INTO V_COUNT FROM TASKDETAIL WHERE TASKTYPE = 'RTXPMV' AND STATUS NOT IN ('9', 'R', 'X') AND SOURCEKEY = V_RECEIPTKEY AND ORDERLINENUMBER = V_RECEIPTLINENUMBER;
                IF V_COUNT > 0 THEN
                    SET log_message = CONCAT(log_message, '; 收货明细启用平移切已生成平移任务,不存在不满足业务的数据,跳出本次循环!');
                    LEAVE read_loop;
                END IF;
            ELSEIF V_PLANEMOVETASK = 'Y' AND V_FIRSTQC <> '1' THEN
                
                SET log_message = CONCAT(log_message, '; 收货明细启用平移切未生成平移任务。跳出本次循环!');
                LEAVE read_loop;
            END IF;

            -- 如果入库规则已启用收货发送ERP过账,则收货明细必须已完成移动类型为103的ERP过账
            -- IF V_RECEIVESENDERP = 'Y' THEN SELECT COUNT(1) INTO V_COUNT FROM RTXINPOSTTASK WHERE MOVETYPE = '103' AND ERPPOSTSTATUS IN ('PS', 'PC') AND ORDERKEY = V_RECEIPTKEY AND ORDERLINENUMBER = V_RECEIPTLINENUMBER; -- 如果收货单单头的UDF4为NO103QC时,未103过账,也允许送检
            --     IF V_COUNT = 0 AND V_SUSR4 <> 'NO103QC' THEN LEAVE read_loop; END IF;
            -- END IF;

            -- 如果WMS订单类型 = ‘7’(采购订单),且工厂+ERP库位在工厂库存地配置的仓库类型为‘OCFB’(O厂分包),则取收货明细 RTXRECEIVESLOCATION
            SET log_message = CONCAT(log_message, 'WMS订单类型是否为【7】 = ', IFNULL(V_TYPE, ''), '; 仓库类型为【OCFB】 = ', IFNULL(V_ERPLOC, ''));
            IF V_TYPE = '7' AND LENGTH(V_ERPLOC) > 4 THEN
                
                SELECT COUNT(1) INTO V_COUNT FROM RTXPLANTSLOACTION WHERE PLANT = V_STORERKEY AND SLOCATION = V_ERPLOC AND TYPE = 'OCFB';
                IF V_COUNT > 0 THEN
                    SET V_ERPLOC := V_RTXRECEIVESLOCATION;
                    SET log_message = CONCAT(log_message, '; WMS订单类型 = 7,接收库存地仓库类型为OCFB,不存在不满足业务的数据,跳出本次循环!');
                END IF;
								
                SET log_message = CONCAT(log_message, '; WMS订单类型 = 7,且工厂+ERP库位在工厂库存地配置的仓库类型为OCFB = ', V_COUNT);
            END IF;

            -- 插入QC送检记录
            SET log_message = CONCAT(log_message, '; 插入QC送检记录');
            INSERT INTO RTXQCSEND
                (WHSEID, INSPECTTYPE, ORDERKEY, ORDERLINENUMBER, STORERKEY, SKU, QCTOINSPECT, UOM, SUPPLIER, SUPPLIERLOT, PLANT, SLOCATION, QCLOC, PACKQTY, ISFIRSTRECEIVE, STATUS, SOURCETYPE, ADDWHO, EDITWHO, QCRESULT, QCQTYREJECTED, QCQTYCONCEDE)
            VALUES
                (DATABASE(), V_INSPECTTYPE, V_RECEIPTKEY, V_RECEIPTLINENUMBER, V_STORERKEY, V_SKU, V_QTYRECEIVED, V_UOM, IFNULL(V_LOTTABLE02, ' '), IFNULL(V_RTXLOTTABLE14, ' '), V_STORERKEY, V_ERPLOC, V_TOLOC, IFNULL(V_RTXMINPACKQTY, '0'), IFNULL(V_FIRSTQC, ' '), '0', 'RECEIPT', 'mysqlJob', 'mysqlJob', '', 0, 0);

            -- 更新收货明细的QC状态为已发送
            SET log_message = CONCAT(log_message, '; 更新收货明细的QC状态为已发送');
            UPDATE RECEIPTDETAIL SET QCSTATUS ='S' WHERE RECEIPTKEY = V_RECEIPTKEY AND RECEIPTLINENUMBER = V_RECEIPTLINENUMBER;
        END IF;
    END LOOP read_loop;

    CLOSE receiptDetail_cursor;

    IF RESULT_CODE THEN
        -- 异常发生时进行回滚
        ROLLBACK;
    ELSE
        -- 提交事务
        COMMIT;
    END IF;
		
    SET log_message = CONCAT('RTX_RECEIPT_INSPECT_DATA 不满足条件 = ', done, '; 异常状态 = ', RESULT_CODE);
		SELECT log_message;
		
    INSERT INTO procedure_log
        (procedure_name, execution_time, log_message)
    VALUES
        ('RTX_RECEIPT_INSPECT_DATA', NOW(), log_message);
END

关于在存储中获取编号

            -- 获取下一个任务键值
            SELECT CONCAT('TK_JOB_', DATE_FORMAT(NOW(), '%y%m%d'), '_',
                          CONCAT(LPAD(IFNULL(MAX(CAST(SUBSTRING(TASKDETAILKEY, 15) AS UNSIGNED)) + 1, 1), 6, '0')))
            INTO V_TASKDETAIL
            FROM TASKDETAIL
            WHERE TASKDETAILKEY LIKE CONCAT('TK_JOB_', DATE_FORMAT(NOW(), '%y%m%d'), '%');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/573624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网工内推 | 上市公司网络运维,大专可投,NA/NP认证优先

01 珠海世纪鼎利科技股份有限公司 招聘岗位&#xff1a;网络运维工程师 职责描述&#xff1a; 1、负责服务器安装、维护和设备管理&#xff1b; 2、负责应用系统的部署&#xff0c;升级&#xff0c;维护&#xff1b; 3、分析网络数据&#xff0c;排查网络故障及事务的应急响应…

百度网盘svip白嫖永久手机2024最新教程

百度网盘&#xff08;原名百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版。用户将可以轻松将自己的文件上传到网盘上&#xff0c;并可跨终端随时随地查看…

【C语言】红黑树详解以及C语言模拟

一、红黑树的性质二、红黑树的旋转操作三、红黑树的插入操作四、红黑树的删除操作五、红黑树的应用六、C语言模拟红黑树七、总结 红黑树是一种自平衡二叉查找树&#xff0c;它能够保持树的平衡&#xff0c;从而确保查找、插入和删除的最坏情况时间复杂度为O( l o g n log_n log…

软考-系统集成项目管理中级--项目人力资源管理(输入输出很重要!!!本章可能包含案例题)

本章历年考题分值统计 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 10、项目沟通管理计划一般应包括以下内容:(掌握)12上59&#xff0c;10下59&#xff0c;13上53&#xff0c;13上57,14下58&#xff0c;15下58&#xff0c;16上59 考题 (1)干系人的沟通需求。 (2)针对沟…

爬虫抓取网站数据

Fiddler 配置fiddler工具结合浏览器插件 配置fiddler Tools--Options 抓包技巧 谷歌浏览器开启无痕浏览,使用SwitchyOmega配置好代理端口 Ctrl x 清理所有请求记录,可以删除指定不需要日志方便观察 设置按请求顺序 观察cookie,观察请求hesder cookie和row返回结果 Swit…

C++/QT + Mysql + Tcp 企业协作管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 1、项目概要&#xff1a;C/S架构、数据库Mysql、C、QT&#xff1b;支持实时通信、局域网内通信&#xff0c;可多个客户端同时登录&#xff1b; 2、&#xff08;Server&#xff09;管理端&#xff1a;用户管理、…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕&#xff0c;算力需求持续爆发&#xff0c;AI与边缘深度融合已是大势所趋&#xff0c;越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地&#xff0c;勾勒出大模型从“技术力”转向…

数组模拟几种基本的数据结构

文章目录 数组模拟单链表数组模拟双链表数组实现栈数组模拟队列总结 数组模拟单链表 首先类比结构体存储单链表&#xff0c;我们需要一个存放下一个节点下标的数组&#xff0c;还需要一个存储当前节点的值的数组&#xff0c;其次就是一个int类型的索引&#xff0c;这个索引指向…

挑战一周完成Vue3实战项目硅谷甄选Day1:项目初始化、项目配置、项目集成

一、项目初始化 node v16.4.0以上&#xff08;查看node版本 : node -v&#xff09; pnpm 8.0.0&#xff08;npm i -g pnpm8.0.0&#xff09; 在想创建的位置新建文件夹自己命名 在此文件夹下cmd:pnpm create vite 选择如下配置 Project name&#xff08;项目名称&#xff0…

Java设计模式 _创建者模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式 属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。 二、代码示例 场景&#xff1a;花店有不同的花&#xff0c;通过工厂模式来获取花。 1、普通工厂模式 逻辑步骤&#…

Spring - 5 ( 8000 字 Spring 入门级教程 )

一&#xff1a;Spring IoC&DI 1.1 方法注解 Bean 类注解是添加到某个类上的&#xff0c; 但是存在两个问题: 使用外部包里的类, 没办法添加类注解⼀个类, 需要多个对象, ⽐如多个数据源 这种场景, 我们就需要使用方法注解 Bean 我们先来看方法注解如何使用: public c…

AI-数学-高中-42导数的概念与意义

原作者视频&#xff1a;【导数】【一数辞典】1导数的概念与意义_哔哩哔哩_bilibili .a是加速度&#xff1b;

OpenAI 笔记:获取embedding

1 输入openai的api key from openai import OpenAIclient OpenAI(api_key**) 2 举例 response client.embeddings.create(input"Hello",model"text-embedding-3-small" )print(response.data[0].embedding) 默认情况下&#xff0c;text-embedding-3-s…

配置Linux【虚拟机】与 windows【宿主机】网络互通 (面向小白,简单操作)

1. 启动虚拟机&#xff0c;运行Linux系统 这里我使用 VMware Workstation Pro 来运行Linux系统&#xff08;cent-os7&#xff09;2. 鼠标右键打开终端 3. 输入 cd /etc/sysconfig/network-scripts , 然后输入ls &#xff0c;查看当前目录下的网卡 一般来说&#xff0c;虚拟机的…

计算机网络基础认识

本篇文章是我在B站上看到关于计算机网络的介绍视频收到的启发。本篇文章的内容来自【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 一、物理层 从常理来说&#xff0c;进行连个设备之间的通讯&#xff0c;首先最容易想到的就是使用一根线连接两个设备进行通讯。但是…

Docker的数据管理、网络通信和dockerfile

目录 一、Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 2. 数据卷容器 2.1 创建数据卷容器 2.2 使用--volume-from来挂载test1 二、端口映射 三、容器互联 1. 创建容器互联 ​编辑2. 进入test2测试&#xff08;ping 容器名/别名&#xff09; 四、Dock…

【弱监督点云分割】All Points Matter:用于弱监督三维分割的熵细化分布对齐

All Points Matter: Entropy-Regularized Distribution Alignment for Weakly-supervised 3D Segmentation 摘要&#xff1a; 伪标签被广泛应用于弱监督三维分割任务中&#xff0c;在这种任务中&#xff0c;只有稀疏的地面真实标签可供学习使用。现有方法通常依赖经验标签选择…

用立创EDA实现一个小项目

项目介绍 名称&#xff1a;蓝牙音响 功能&#xff1a;按键切换 蓝牙控制 语音控制 项目流程 市场调研产品立项----老板--经理硬件&#xff08;外观、尺寸、大小、使用环境&#xff09;软件&#xff08;代码开发环节&#xff09;产品测试 以管理员身份运行 新建文件夹&…

Python学习从0开始——项目一day02数据库连接

Python学习从0开始——项目一day02数据库连接 一、在线云数据库二、测试数据库连接三、数据库驱动介绍四、SQL执行4.1插入测试数据4.2安装数据库连接模块4.3测试SQL语句执行4.4执行SQL的固定步骤及示例 一、在线云数据库 找了一个在线数据库&#xff0c;需要邮箱注册&#xff…
最新文章