New file |
| | |
| | | --[[ |
| | | 编码: GK-API-06 |
| | | 名称: 出库单创建接口 |
| | | 作者: DJW |
| | | 日期: 2025-5-14 |
| | | |
| | | 入口函数: Main |
| | | 功能说明: |
| | | 1. 接收上游系统的入库任务XML数据 |
| | | 2. 检查入库单是否已存在 |
| | | 3. 创建Outbound_Order主表和Outbound_Detail子表记录 |
| | | 4. 返回处理结果 |
| | | |
| | | 输入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:InTaskCreationReq |
| | | xmlns:v1="http://www.gkht.com/OutReceive/INV/Ebs/Schemas/OutTaskCreation/V1.0"> |
| | | <v1:TaskCreation_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:TaskCreation_TB> |
| | | <!-- 1 or more repetitions:--> |
| | | <v1:taskId>TASK20000001</v1:taskId> |
| | | <v1:taskType>normal</v1:taskType> |
| | | <v1:orderFlag> |
| | | </v1:orderFlag> |
| | | <v1:orderNo>2025050602</v1:orderNo> |
| | | <v1:waveId>BCH1001</v1:waveId> |
| | | <v1:storerId>CGKHTY</v1:storerId> |
| | | <v1:ownerId>CGKHTY</v1:ownerId> |
| | | <v1:orderDate>2025-05-06</v1:orderDate> |
| | | <v1:priority>0</v1:priority> |
| | | <v1:memo> |
| | | </v1:memo> |
| | | <v1:TaskCreation_TB_ITEM> |
| | | <v1:orderItemId>1</v1:orderItemId> |
| | | <v1:skuId>XR33201-2L080B</v1:skuId> |
| | | <v1:skuStatus>AVL</v1:skuStatus> |
| | | <v1:qty>2</v1:qty> |
| | | <v1:batchNo>PHI00000000000001309</v1:batchNo> |
| | | <v1:produceCode>YL201125</v1:produceCode> |
| | | <v1:productDate>2016-04-23</v1:productDate> |
| | | <v1:expiryDate>2099-12-31</v1:expiryDate> |
| | | <v1:registerNo>国食药监械(准)字2012</v1:registerNo> |
| | | <v1:cid> |
| | | </v1:cid> |
| | | </v1:TaskCreation_TB_ITEM> |
| | | <v1:TaskCreation_TB_ITEM> |
| | | <v1:orderItemId>2</v1:orderItemId> |
| | | <v1:skuId>KH32803017</v1:skuId> |
| | | <v1:skuStatus>AVL</v1:skuStatus> |
| | | <v1:qty>5</v1:qty> |
| | | <v1:batchNo>PHI00000000000001308</v1:batchNo> |
| | | <v1:produceCode>YL2011256</v1:produceCode> |
| | | <v1:productDate>2023-04-23</v1:productDate> |
| | | <v1:expiryDate>2099-12-31</v1:expiryDate> |
| | | <v1:registerNo> |
| | | </v1:registerNo> |
| | | <v1:cid> |
| | | </v1:cid> |
| | | </v1:TaskCreation_TB_ITEM> |
| | | </v1:TaskCreation_TB> |
| | | </v1:InputParameters> |
| | | </v1:TaskCreation_Input> |
| | | </v1:InTaskCreationReq> |
| | | </soapenv:Body> |
| | | </soapenv:Envelope> |
| | | --]] |
| | | wms_base = require("wms_base") |
| | | xml = require("oi_base_xml") |
| | | -- 创建入库单主表记录 |
| | | local function create_outbound_order(strLuaDEID, order_data) |
| | | local order = m3.AllocObject(strLuaDEID, "Outbound_Order") |
| | | |
| | | -- 主表字段映射 |
| | | order.no = order_data.taskId |
| | | order.bs_type = order_data.taskType |
| | | order.bs_no = order_data.orderNo |
| | | order.wave_no = order_data.waveId |
| | | --order.D_OP_DATE = order_data.orderDate |
| | | --order.N_PRIORITY = order_data.priority |
| | | order.note = order_data.memo or "" |
| | | order.wh_code = "WH01" |
| | | order.area_code="" |
| | | order.factory="" |
| | | |
| | | local nRet, result = m3.CreateDataObj(strLuaDEID, order) |
| | | return nRet, result |
| | | end |
| | | |
| | | -- 创建出库单明细记录 |
| | | local function create_outbound_detail(strLuaDEID, order_no, item_data) |
| | | local detail = m3.AllocObject(strLuaDEID, "Outbound_Detail") |
| | | |
| | | -- 明细表字段映射 |
| | | detail.oo_no = order_no |
| | | detail.storer = item_data.storerId |
| | | detail.owner = item_data.ownerId |
| | | detail.row_no = item_data.orderItemId |
| | | detail.item_code = item_data.skuId |
| | | detail.item_state = item_data.skuStatus |
| | | detail.qty = lua.Get_NumAttrValue(item_data.qty) |
| | | detail.batch_no = item_data.produceCode |
| | | detail.wms_bn = item_data.batchNo |
| | | --detail.D_PRD_DATE = item_data.productDate |
| | | --detail.D_EXP_DATE = item_data.expiryDate |
| | | detail.ext_attr3 = item_data.registerNo or "" |
| | | detail.ext_attr1 = item_data.cid or "" |
| | | |
| | | local nRet, result = m3.CreateDataObj(strLuaDEID, detail) |
| | | return nRet, result |
| | | end |
| | | |
| | | -- isJson传1表示json格式,0表示xml格式 |
| | | -- value是table数据 |
| | | -- isStop传0表示正常,3表示要回滚 |
| | | function ApiReturn(strLuaDEID, isJson, value, isStop) |
| | | local strReturn = value |
| | | --Debug( strLuaDEID, debug.getinfo(1), "ApiReturn失败!", value ) |
| | | mobox.writeLuaLog( lua.table2str( value ) ) |
| | | if isJson == 0 then |
| | | strReturn = xml2lua.toXml(value) |
| | | mobox.writeLuaLog(strReturn) |
| | | end |
| | | mobox.returnValue(strLuaDEID, isJson, value, isStop); |
| | | return |
| | | end |
| | | function Main(strLuaDEID) |
| | | local nRet, strRetInfo,err_msg |
| | | local soap_xml,parsed_data,task_data,input_params,task_tb,order_no |
| | | local strCondition,id,task_items |
| | | local isStop = 0 |
| | | local err = {} |
| | | local items = {} |
| | | |
| | | |
| | | |
| | | -- m3.PrintLuaDEInfo(strLuaDEID) |
| | | local result = { |
| | | flag = "success", |
| | | code = "0", |
| | | msg = "" |
| | | } |
| | | -- 1. 获取接口输入数据 |
| | | |
| | | nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID) |
| | | if nRet ~= 0 then |
| | | -- lua.Stop(strLuaDEID, "无法获取数据包: " .. soap_xml) |
| | | result.flag = "failure" |
| | | result.code = "1" |
| | | result.msg = "无法获取数据包: " |
| | | goto api_call_return |
| | | |
| | | -- return |
| | | end |
| | | |
| | | -- 2. 解析XML |
| | | |
| | | nRet, parsed_data = xml.parse(soap_xml) |
| | | if nRet ~= 0 then |
| | | -- lua.Stop(strLuaDEID, "接口输入的XML格式非法!") |
| | | result.flag = "failure" |
| | | result.code = "2" |
| | | result.msg = "接口输入的XML格式非法: " |
| | | goto api_call_return |
| | | -- return |
| | | end |
| | | |
| | | -- 3. 提取任务数据 |
| | | task_data = parsed_data.Envelope.Body.InTaskCreationReq.TaskCreation_Input |
| | | input_params = task_data.InputParameters |
| | | task_tb = input_params.TaskCreation_TB |
| | | |
| | | -- 4. 检查出库单是否已存在 |
| | | order_no = task_tb.taskId |
| | | strCondition = string.format("S_NO = '%s'", order_no) |
| | | nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr(strLuaDEID, "Outbound_Order", strCondition) |
| | | if nRet > 1 then |
| | | result.flag = "failure" |
| | | result.code = "3" |
| | | result.msg = "检查出库单是否存在时出错: " .. strRetInfo |
| | | goto api_call_return |
| | | elseif nRet == 0 then |
| | | result.flag = "failure" |
| | | result.code = "4" |
| | | result.msg = "出库单已存在: " |
| | | goto api_call_return |
| | | end |
| | | -- 5. 创建出库单主表 |
| | | nRet, strRetInfo = create_outbound_order(strLuaDEID, task_tb) |
| | | if nRet ~= 0 then |
| | | -- lua.Stop(strLuaDEID, "创建出库单主表失败:" .. strRetInfo) |
| | | result.flag = "failure" |
| | | result.code = "5" |
| | | result.msg = "创建出库单主表失败:" .. strRetInfo |
| | | isStop=3 |
| | | goto api_call_return |
| | | -- return |
| | | end |
| | | |
| | | -- 6. 处理明细数据 |
| | | task_items = task_tb.TaskCreation_TB_ITEM |
| | | |
| | | -- 情况2:多条明细(数组形式) |
| | | if task_items[1] ~= nil then |
| | | items = task_items |
| | | -- 情况3:单条明细(非数组形式) |
| | | else |
| | | items = {task_items} |
| | | end |
| | | |
| | | for i, item in ipairs(items) do |
| | | nRet, strRetInfo = create_outbound_detail(strLuaDEID, order_no, item) |
| | | if nRet ~= 0 then |
| | | err_msg = string.format("创建出库单明细失败(行号:%d): %s", item.orderItemId, strRetInfo) |
| | | -- wms_base.Warning(strLuaDEID, 1, 604, err_msg, "创建出库单明细") |
| | | -- nErr = nErr + 1 |
| | | -- err[nErr] = err_msg |
| | | -- lua.Stop(strLuaDEID, err_msg) |
| | | result.flag = "failure" |
| | | result.code = "5" |
| | | result.msg = err_msg |
| | | isStop=3 |
| | | goto api_call_return |
| | | end |
| | | end |
| | | ::api_call_return:: |
| | | -- 7. 返回处理结果 |
| | | |
| | | -- m3.EPI_Return(strLuaDEID, result) |
| | | ApiReturn(strLuaDEID, 0, result, isStop) |
| | | end |