New file |
| | |
| | | --[[ |
| | | 编码: |
| | | 名称: 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 |