fy36
2025-05-14 a37aca60ff9914b0abb710f04118b22420f4f398
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
--[[ 
    编码: WMS-300-24.1
    名称: 盘点计划同步
    作者: KUN
    日期: 2025-1-29
 
    入口函数: SKU_Sync
    来源项目:  国科项目
 
    功能说明:
        1. 接收来自上游系统的 XML 格式数据,并解析该数据, 创建SKU及SKU_UPC
        
        <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:inCommodityReq
                    xmlns:v1="http://www.gkht.com/Information/INV/Ebs/Schemas/InCommodity/V1.0">
                    <v1:COMMODITY_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:COMMODITY_TB>
                                <!--1 or more repetitions:-->
                                <v1:COMMODITY_TB_ITEM>
                                    <v1:skuId>KH32803017</v1:skuId>
                                    <v1:storerId>CGKHTY</v1:storerId>
                                    <v1:skuName>螺旋刀片式髓内钉</v1:skuName>
                                    <v1:skuDec>螺旋刀片式股骨近端髓内钉10×170</v1:skuDec>
                                    <v1:spec>JGDⅥ φ10×170</v1:spec>
                                    <v1:packageCode>个</v1:packageCode>
                                    <v1:packageQty>1</v1:packageQty>
                                    <v1:goodsUnit>件</v1:goodsUnit>
                                    <v1:length>1</v1:length>
                                    <v1:width>2</v1:width>
                                    <v1:height>3</v1:height>
                                    <v1:abcType></v1:abcType>
                                    <v1:isBatchMgr>1</v1:isBatchMgr>
                                    <v1:isSnMgr>1</v1:isSnMgr>
                                    <v1:isSnStorageMgr>0</v1:isSnStorageMgr>
                                    <v1:imgUrl></v1:imgUrl>
                                    <v1:cidtype>A</v1:cidtype>
                                    <v1:productLine>KH-创伤</v1:productLine>
                                    <v1:storageConditions>常温</v1:storageConditions>
                                    <v1:skuType>small</v1:skuType>
                                    <v1:maxCount>50</v1:maxCount>
                                    <v1:sptm></v1:sptm>   
                                    <v1:barcode1></v1:barcode1>
                                    <v1:barcode2></v1:barcode2>
                                    <v1:barcode3></v1:barcode3>
                                    <v1:barcode_pk></v1:barcode_pk>
                                </v1:COMMODITY_TB_ITEM>
                            </v1:COMMODITY_TB>
                        </v1:InputParameters>
                    </v1:COMMODITY_Input>
                </v1:inCommodityReq>
            </soapenv:Body>
        </soapenv:Envelope>
 
    更改记录:
       V2.0 HAN 20250402  代码规范            
--]]
 
wms_base = require( "wms_base" )
xml = require( "oi_base_xml" )    
 
local function create_sku_upc( strLuaDEID, storer, item_code, upc_code )
    local nRet, strRetInfo
 
    if ( upc_code == '' or upc_code == nil ) then return 0 end
 
    local sku_upc = m3.AllocObject( strLuaDEID,"SKU_UPC" )
    sku_upc.storer = storer
    sku_upc.item_code = item_code
    sku_upc.upc_code = upc_code
    nRet, sku_upc = m3.CreateDataObj(strLuaDEID, sku_upc)
 
    return nRet
end
 
local function create_gk_proline( strLuaDEID, pro_line_no )
    local nRet, strRetInfo
 
    if ( upc_code == '' or upc_code == nil ) then return 0 end
 
    local pro_line = m3.AllocObject( strLuaDEID,"GK_PROLINE" )
    pro_line.proline_no = pro_line_no
    pro_line.proline_name = pro_line_no
    nRet, pro_line = m3.CreateDataObj(strLuaDEID, pro_line)
 
    return nRet
end
 
function SKU_Sync(strLuaDEID)
    local nRet, strRetInfo, n, nErr
    local err_msg
    nErr = 1  
 
    -- step1 获取接口中的输入数据
    local soap_xml
    nRet, soap_xml = mobox.getCurEditDataPacket( strLuaDEID )
    if ( nRet ~=0 ) then 
        lua.Stop( strLuaDEID, "无法获取数据包 datajson !"..input_data )
        return
    end 
 
    -- 解析XML
    local parsed_data
    nRet, parsed_data = xml.parse(soap_xml)
    if ( nRet ~= 0 ) then
        lua.Stop( strLuaDEID, "接口输入的XML格式非法!" )
        return
    end     
    local sku_set = parsed_data["soapenv:Envelope"]["soapenv:Body"].inCommodityReq.COMMODITY_Input.InputParameters.COMMODITY_TB  
    local n, sku, id
    local update_sku_obj = {}
 
    for n = 1, #sku_set do
        err_msg = ''
 
        sku = m3.AllocObject( strLuaDEID,"SKU" )
        sku.item_code = sku_set[n].skuId
        sku.storer = sku_set[n].storerId
        sku.short_name = sku_set[n].skuName
        sku.item_name = sku_set[n].skuDec
        sku.spec = sku_set[n].spec
        sku.udf01 = sku_set[n].packageCode
        sku.udf02 = sku_set[n].packageQty
        sku.unit = sku_set[n].goodsUnit
        sku.long = lua.Get_NumAttrValue( sku_set[n].length )
        sku.middle = lua.Get_NumAttrValue( sku_set[n].width )  
        sku.short = lua.Get_NumAttrValue( sku_set[n].height )          
        
        sku.abc_type = sku_set[n].abcType
        sku.is_life_mgt = ( sku_set[n].isBatchMgr == "1" and 'Y' ) or 'N'
        sku.is_sn_mgt = ( sku_set[n].isSnMgr == "1" and 'Y' ) or 'N'
        sku.udf03 = sku_set[n].isSnStorageMgr
        sku.img_url = sku_set[n].imgUrl
        sku.cell_type = sku_set[n].cidtype
        sku.prod_line = sku_set[n].productLine
        sku.udf04 = sku_set[n].storageConditions
        sku.item_type = sku_set[n].skuType
        sku.loading_limit = lua.Get_NumAttrValue( sku_set[n].maxCount )
 
        -- 判断SKU是否已经存在
        strCondition = "S_ITEM_CODE = '"..sku.item_code.."' AND S_STORER = '"..sku.storer.."'"
        nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr( strLuaDEID, "SKU", strCondition )
        if ( nRet > 1 ) then
            err_msg = "GK-WMS 同步SKU信息失败: 在检查 skuId = '"..sku.item_code.."'是否存在时失败!"..strRetInfo
            goto continue
        end        
        if ( nRet == 1 ) then
            -- SKU 不存在
            nRet, sku = m3.CreateDataObj(strLuaDEID, sku)
            if (nRet ~= 0 ) then 
                lua.Stop( strLuaDEID, "创建【SKU】失败!"..sku.." skuId = "..sku_set[n].skuId )
                return
            end            
        else
            -- SKU 已经存在更新属性
            update_sku_obj = {
                {
                    id = id,
                    attrs = {
                        { attr = "S_ITEM_NAME", value = sku.item_name },
                        { attr = "S_ITEM_SPEC", value = sku.spec },
                        { attr = "S_ITEM_TYPE", value = sku.item_type },
                        { attr = "S_UNIT", value = sku.unit },
                        { attr = "S_SHORT_NAME", value = sku.short_name },
                        { attr = "S_ABCTYPE", value = sku.abc_type },
                        { attr = "C_ISSNMGT", value = sku.is_sn_mgt },
                        { attr = "C_ISLIFEMGT", value = sku.is_life_mgt },
                        { attr = "S_IMG_URL", value = sku.mg_url },
 
                        { attr = "S_CELL_TYPE", value = sku.cell_type },
                        { attr = "S_PROD_LINE", value = sku.prod_line },
                        { attr = "N_LOADING_LIMIT", value = sku.loading_limit },
 
                        { attr = "F_LONG", value = sku.long },
                        { attr = "F_MIDDLE", value = sku.middle },
                        { attr = "F_SHORT", value = sku.short },
 
                        { attr = "S_UDF01", value = sku.udf01 },
                        { attr = "S_UDF02", value = sku.udf02 },
                        { attr = "S_UDF03", value = sku.udf03 },
                        { attr = "S_UDF04", value = sku.udf04 }
                    }
                }
            }
            nRet, strRetInfo = mobox.updateDataObj( strLuaDEID, "SKU", table2str(update_sku_obj) )
            if (nRet ~= 0 ) then 
                lua.Stop( strLuaDEID, "更新【物料】属性失败!"..strRetInfo )
                return
            end            
        end
 
        -- 新增生产线
        create_gk_proline( strLuaDEID, sku.prod_line )
 
        -- 处理SKU_UPC
        create_sku_upc( strLuaDEID, sku.storer, sku.item_code, sku_set[n].sptm )
        create_sku_upc( strLuaDEID, sku.storer, sku.item_code, sku_set[n].barcode1 )
        create_sku_upc( strLuaDEID, sku.storer, sku.item_code, sku_set[n].barcode2 )
        create_sku_upc( strLuaDEID, sku.storer, sku.item_code, sku_set[n].barcode3 )
        create_sku_upc( strLuaDEID, sku.storer, sku.item_code, sku_set[n].barcode_pk )
 
        ::continue::
        -- 如果有错误信息加到系统的 Waring 对象
        if ( err_msg ~= '') then
            wms_base.Warning( strLuaDEID, 1, 601, err_msg, "从GK-WMS系统同步SKU信息" )
            nErr = nErr + 1
            err[nErr] = err_msg
        end        
    end
 
    if ( nErr > 0 ) then
        local err_info = {
            from = "GK-WMS SKU数据同步",
            err_msg = err
        }
        mobox.returnValue( strLuaDEID, 1, lua.table2str(err_info), 5 )
    end
end