fy36
2025-05-14 a37aca60ff9914b0abb710f04118b22420f4f398
1. 新增小货信息同步接口
1个文件已添加
213 ■■■■■ 已修改文件
lua_code/Lua/GK-API-04 GK-WMS-Receipt_Sync.lua 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lua_code/Lua/GK-API-04 GK-WMS-Receipt_Sync.lua
New file
@@ -0,0 +1,213 @@
--[[
 编码:
 名称: Receipt_Sync
 作者: 袁峰
 入口函数:Receipt_Sync
 功能说明:  接收来自上游系统的 XML 格式数据,并解析该数据, 创建收货单主表 Record_Order 和 收货单明细数据 Receipt_Detail
 变更历史:
 XML 文件交互案例:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    </soap:Header>
    <soapenv:Body>
        <v1:InSmallPieceReq xmlns:v1="http://www.gkht.com/InReceive/INV/Ebs/Schemas/InSmallPiece/V1.0">
            <v1:SmallPiece_Input>
                <v1:RESTHeader>
                    <v1:Responsibility/>
                    <v1:RespApplication/>
                    <v1:SecurityGroup/>
                    <v1:NLSLanguage>SIMPLIFIED CHINESE</v1:NLSLanguage>
                    <v1:Org_Id>0</v1:Org_Id>
                </v1:RESTHeader>
                <v1:InputParameters>
                    <!-- 第一个收货单 -->
                    <v1:SmallPiece_TB>
                        <v1:orderNo>SO2025050701</v1:orderNo>
                        <v1:asnNo>KPD00002</v1:asnNo>
                        <v1:storerId>CGKHTY</v1:storerId>
                        <v1:ownerId>CGKHTY</v1:ownerId>
                        <v1:orderDate>2025-05-07</v1:orderDate>
                        <v1:priority>0</v1:priority>
                        <v1:memo>收货单1备注</v1:memo>
                        <v1:SmallPiece_TB_ITEM>
                            <v1:orderItemId>1</v1:orderItemId>
                            <v1:skuId>100118100</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>3</v1:qty>
                            <v1:batchNo>PHI00000000000001310</v1:batchNo>
                            <v1:produceCode>YL201126</v1:produceCode>
                            <v1:productDate>2016-05-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo>国食药监械(准)字2013</v1:registerNo>
                        </v1:SmallPiece_TB_ITEM>
                        <v1:SmallPiece_TB_ITEM>
                            <v1:orderItemId>2</v1:orderItemId>
                            <v1:skuId>100117231</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>4</v1:qty>
                            <v1:batchNo>PHI00000000000001311</v1:batchNo>
                            <v1:produceCode>YL201127</v1:produceCode>
                            <v1:productDate>2023-05-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo></v1:registerNo>
                        </v1:SmallPiece_TB_ITEM>
                    </v1:SmallPiece_TB>
                    <!-- 第二个收货单 -->
                    <v1:SmallPiece_TB>
                        <v1:orderNo>SO2025050702</v1:orderNo>
                        <v1:asnNo>KPD00003</v1:asnNo>
                        <v1:storerId>CGKHTY</v1:storerId>
                        <v1:ownerId>CGKHTY</v1:ownerId>
                        <v1:orderDate>2025-05-07</v1:orderDate>
                        <v1:priority>1</v1:priority>
                        <v1:memo>收货单2备注</v1:memo>
                        <v1:SmallPiece_TB_ITEM>
                            <v1:orderItemId>1</v1:orderItemId>
                            <v1:skuId>200000002</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>2</v1:qty>
                            <v1:batchNo>PHI00000000000001312</v1:batchNo>
                            <v1:produceCode>YL201128</v1:produceCode>
                            <v1:productDate>2016-06-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo>国食药监械(准)字2014</v1:registerNo>
                        </v1:SmallPiece_TB_ITEM>
                        <v1:SmallPiece_TB_ITEM>
                            <v1:orderItemId>2</v1:orderItemId>
                            <v1:skuId>100117238</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>5</v1:qty>
                            <v1:batchNo>PHI00000000000001313</v1:batchNo>
                            <v1:produceCode>YL201129</v1:produceCode>
                            <v1:productDate>2023-06-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo></v1:registerNo>
                        </v1:SmallPiece_TB_ITEM>
                    </v1:SmallPiece_TB>
                </v1:InputParameters>
            </v1:SmallPiece_Input>
        </v1:InSmallPieceReq>
    </soapenv:Body>
</soapenv:Envelope>
--]]
wms_base = require("wms_base")
xml = require("oi_base_xml")
mobox = require("OILua_JavelinExt")
-- 创建收货单明细对象(完全保持原有逻辑不变)
local function create_receipt_detail(strLuaDEID, detail_item, no, header)
    local receipt_detail = m3.AllocObject(strLuaDEID, "Receipt_Detail")
    -- 基本关联信息
    receipt_detail.row_no = detail_item.orderItemId
    receipt_detail.receipt_no = no
    -- 物料信息查询
    local material_info;
    if detail_item.skuId ~= nil then
        local nRet, mat_info = m3.GetDataObjByCondition(strLuaDEID, "Material",
            "S_ITEM_CODE='" .. detail_item.skuId .. "'")
        if nRet ~= 0 then
            lua.Stop(strLuaDEID, "物料数据获取失败:", mat_info)
        else
            material_info = mat_info
        end
    end
    -- 数量相关字段
    receipt_detail.qty = lua.Get_NumAttrValue(detail_item.qty)
    receipt_detail.acc_put_qty = lua.Get_NumAttrValue("0")
    receipt_detail.acc_unq_qty = lua.Get_NumAttrValue("0")
    receipt_detail.acc_c_qty = lua.Get_NumAttrValue("0")
    receipt_detail.item_code = detail_item.skuId
    receipt_detail.item_state = detail_item.skuStatus
    receipt_detail.wu = "kg"
    -- 从物料信息获取的字段
    receipt_detail.item_name = material_info and material_info.item_name or ""
    receipt_detail.net_weight = material_info and material_info.weight or 0
    receipt_detail.gross_weight = material_info and material_info.weight or 0
    receipt_detail.uom = material_info and material_info.uom or ""
    -- 批次及日期信息
    receipt_detail.batch_no = detail_item.produceCode
    receipt_detail.prd_date = detail_item.productDate
    receipt_detail.exp_date = detail_item.expiryDate
    -- 其他业务字段
    receipt_detail.udf01 = detail_item.registerNo
    receipt_detail.storer = header.storerId  -- 修正字段名:storeId -> storerId(根据XML样例)
    receipt_detail.owner = header.ownerId
    local nRet, result = m3.CreateDataObj(strLuaDEID, receipt_detail)
    if nRet ~= 0 then
        lua.Stop(strLuaDEID, "创建收货明细记录失败", "返回值" .. nRet .. "  返回数据:" .. result)
    end
    return nRet, result
end
function Receipt_Sync(strLuaDEID)
    -- 获取并解析XML
    local nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID)
    if nRet ~= 0 then lua.Stop(strLuaDEID, "无法获取数据包!" .. soap_xml) return end
    local nRet, parsed_data = xml.parse(soap_xml)
    if nRet ~= 0 then lua.Stop(strLuaDEID, "XML格式非法!") return end
    -- 解析XML数据结构(修改为支持多个收货单)
    local receipt_data = parsed_data.Envelope.Body.InSmallPieceReq.SmallPiece_Input
    local input_params = receipt_data.InputParameters
    -- 判断是单个收货单还是多个收货单
    local receipt_headers = input_params.SmallPiece_TB
    if receipt_headers.orderNo then  -- 如果是单个收货单
        receipt_headers = {receipt_headers}  -- 转为单元素数组
    end
    -- 获取常量
    local nRet1, CONST_FACTORY = wms_base.Get_sConst2(strLuaDEID, "GK_Default_Factory")
    local nRet2, CONST_WH = wms_base.Get_sConst2(strLuaDEID, "GK_Default_Warehouse")
    if nRet1 ~= 0 then lua.Stop(strLuaDEID, "获取默认工厂标识失败" .. CONST_FACTORY) end
    if nRet2 ~= 0 then lua.Stop(strLuaDEID, "获取默认仓库编号失败" .. CONST_WH) end
    -- 处理每个收货单(新增循环)
    for _, header in ipairs(receipt_headers) do
        -- 创建主表记录
        local receipt = m3.AllocObject(strLuaDEID, "Receipt_Order")
        receipt.no = header.orderNo
        receipt.asn_no = header.asnNo
        receipt.op_date = header.orderDate
        receipt.priority = header.priority
        receipt.note = header.memo
        receipt.bs_type = "SMALL_PIECE"
        receipt.factory = CONST_FACTORY
        receipt.wh_code = CONST_WH
        local nRet, result = m3.CreateDataObj(strLuaDEID, receipt)
        if nRet ~= 0 then lua.Stop(strLuaDEID, "创建收货单主表失败!" .. result) end
        -- 处理明细
        local detail_items = header.SmallPiece_TB_ITEM
        if not detail_items then lua.Stop(strLuaDEID, "缺少收货单明细数据!") end
        -- 判断是单个明细还是多个明细
        if detail_items.orderItemId then  -- 如果是单个明细
            detail_items = {detail_items}  -- 转为单元素数组
        end
        for _, detail_item in ipairs(detail_items) do
            nRet = create_receipt_detail(strLuaDEID, detail_item, receipt.no, header)
            if nRet ~= 0 then
                lua.Stop(strLuaDEID, "创建收货明细失败: skuId=" .. detail_item.skuId .. ", batchNo=" .. detail_item.batchNo)
            end
        end
    end
end