外協(xié)通是一款專為小微制造業(yè)企業(yè)打造的進銷存出入庫管理系統(tǒng)。它聚焦從 BOM(物料清單)下發(fā)?到?零件入庫后領(lǐng)出?的核心業(yè)務(wù)環(huán)節(jié),解決傳統(tǒng)人工表格管理帶來的效率低、易出錯、數(shù)據(jù)割裂等問題。
企業(yè)普遍面臨外購?fù)鈪f(xié)件進度失控、交貨不及時、質(zhì)量下降等痛點,外協(xié)通以進銷存為基礎(chǔ)骨架,結(jié)合采購、供應(yīng)商協(xié)同、庫房管理,實現(xiàn)從項目創(chuàng)建 → BOM生成 → 采購申請 → 訂單審批 → 合同管理 → 供應(yīng)商執(zhí)行 → 收貨入庫 → 領(lǐng)料出庫的全流程閉環(huán)。
系統(tǒng)基于低代碼平臺(魔盒)開發(fā),具備高擴容性,可根據(jù)企業(yè)需求快速定制響應(yīng)
外協(xié)通的進銷存邏輯貫穿三個核心環(huán)節(jié):采購進貨 → 庫存管理 → 生產(chǎn)/項目領(lǐng)料出庫,并擴展至供應(yīng)商協(xié)同與財務(wù)/合同管理。

進銷存產(chǎn)品演示
| 1 | 項目組 | 創(chuàng)建項目及項目內(nèi)包含的產(chǎn)品 |
| 2 | 技術(shù)部 | 設(shè)計產(chǎn)品(可部分完成),上傳產(chǎn)品BOM及圖紙 |
| 3 | 技術(shù)部 | 選擇項目,匯總產(chǎn)品BOM生成項目BOM,提交采購申請 |
| 4 | 領(lǐng)導(dǎo) | 審批并通過采購申請 |
| 5 | 采購 | 自動生成采購訂單(基于物料指定供應(yīng)商、最小起訂量、可用庫存、價格) |
| 6 | 領(lǐng)導(dǎo) | 審批并通過采購訂單 |
| 7 | 采購 | 自動生成合同文本,打印蓋章后與供應(yīng)商簽訂 |
| 8 | 采購 | 上傳蓋章簽字的原始合同,進行合同管理 |
| 9 | 采購 | 系統(tǒng)自動跟催訂單執(zhí)行 |
| 10 | 采購 | 支持退訂物料操作 |
| 11 | 供應(yīng)商 | 根據(jù)訂單生成送貨單并發(fā)送 |
| 12 | 庫管 | 根據(jù)送貨單驗收及入庫,可以發(fā)起補貨申請 |
| 13 | 項目組 | 根據(jù)到貨情況,發(fā)起領(lǐng)料 |
| 14 | 庫管 | 接收領(lǐng)料單,并出庫 |
庫房:
項目組:
]]>
小微制造業(yè)企業(yè)業(yè)務(wù)范圍從BOM下發(fā)到零件入庫后領(lǐng)出。由于業(yè)務(wù)流程依賴人工和表格,效率低下且易出錯;財務(wù)、庫存、銷售數(shù)據(jù)割裂,非常希望有輕量級ERP來解決從BOM下發(fā)到外購?fù)鈪f(xié)件入庫這個過程中缺少關(guān)注、進度失控、交貨不及時,導(dǎo)致項目時間延誤、產(chǎn)品質(zhì)量下降等普遍存在的問題。
外協(xié)通實施部署輕快,無需昂貴硬件和漫長實施周期;功能模塊輕靈,聚焦進銷存、產(chǎn)品管理、供應(yīng)商管理等核心需求,避免冗余功能;操作體驗輕簡,界面友好,學(xué)習(xí)成本低。其核心價值在于以可承受的成本,快速實現(xiàn)關(guān)鍵業(yè)務(wù)流程的數(shù)字化、標準化和協(xié)同化,為企業(yè)的穩(wěn)健成長奠定數(shù)據(jù)基礎(chǔ)。
核心功能匹配度:是否覆蓋企業(yè)最迫切的業(yè)務(wù)場景(項目周期短、邊設(shè)計-邊采購,要確保項目按質(zhì)量如期交付),如項目管理、產(chǎn)品管理、采購訂單管理、庫存管理、供應(yīng)商管理、訂單節(jié)點自動提醒催辦。功能并非越多越好,而是貴在精準。
易用性與學(xué)習(xí)成本:界面是否直觀,流程是否貼合實際業(yè)務(wù)操作。能否讓業(yè)務(wù)人員經(jīng)過短期培訓(xùn)甚至自行摸索即可上手,是降低實施風(fēng)險的關(guān)鍵。
擴展性與集成能力:企業(yè)處于成長中,系統(tǒng)應(yīng)能隨業(yè)務(wù)增長而平滑擴展,系統(tǒng)基于魔盒低代碼平臺開發(fā),可以快速響應(yīng)企業(yè)個性需求。
系統(tǒng)特點功能:圖紙支持批量上傳、合同文檔能根據(jù)訂單自動生成、供應(yīng)商能實時查看CAD圖紙、項目組能全局實時查看項目物料進展狀況(項目數(shù)、申請數(shù)、采購數(shù)、送貨數(shù)、庫存數(shù)、領(lǐng)料數(shù)、退庫數(shù)等)、供應(yīng)商外協(xié)生產(chǎn)及時跟進及反饋。

聚焦企業(yè)和供應(yīng)商的外部溝通上,范圍從BOM下發(fā)到零件入庫后領(lǐng)出。解決從BOM下發(fā)到外購?fù)鈪f(xié)件入庫這個過程中缺少關(guān)注、進度失控、交貨不及時,導(dǎo)致項目時間延誤、產(chǎn)品質(zhì)量下降等普遍存在的問題。外協(xié)通依據(jù)上述企業(yè)困境其目標:為企業(yè)減少一人,但效率翻倍。


? ?外協(xié)通增強:支持庫存占用與自動扣減,避免重復(fù)采購。
30% / 60% / 90% /100% 生成時間節(jié)點
? ?外協(xié)通提供供應(yīng)商專屬門戶(無需安裝,手機/電腦可訪問)
完善點:補貨流程與原始訂單關(guān)聯(lián),不影響項目BOM總量,且自動更新到貨進度。
? ?外協(xié)通增強:領(lǐng)料與退庫自動更新項目物料消耗統(tǒng)計,為成本核算提供依據(jù)
點擊查看:產(chǎn)品演示
外協(xié)通:專為“只組裝不生產(chǎn)”的項目型企業(yè)打造 | 邊設(shè)計、邊采購、邊外協(xié),項目確保項目按時交付。
]]>function DayFromat(dateTimeStr)
local formattedDateStr =""
if (dateTimeStr == "" or dateTimeStr==nil ) then
return formattedDateStr
end
dateTimeStr = string.gsub(dateTimeStr, "T", " ")
print(dateTimeStr)
-- 使用模式匹配提取日期和時間部分
local dateStr, timeStr = dateTimeStr:match("(%d+-%d+-%d+) (%d+:%d+:%d+)")
if (dateStr == nil) then
formattedDateStr ="Date Format Error"
return formattedDateStr
end
-- 提取日期部分的年、月、日
local year, month, day = dateStr:match("(%d+)-(%d+)-(%d+)")
-- 將提取的月、日格式化為兩位數(shù)的字符串
month = string.format("%02d", tonumber(month))
day = string.format("%02d", tonumber(day))
-- 組合格式化后的日期和原始時間部分
local formattedDateStr = string.format("%s-%s-%s", year, month, day)
local formattedDateTime = string.format("%s %s", formattedDateStr, timeStr)
return formattedDateStr
end
— 示例使用
local date = “2024-03-25T16:00:00.000Z”
local formattedDate = DayFromat(date)
print(formattedDate) — 輸出: 2024-03-25
nRet, strOBJInfo = mobox.objAttrToObjJson (‘PMS001’, strRetInfo )
沒有對執(zhí)行做保護(原先理解是 絕對不會出錯的,實際上是錯了),執(zhí)行后報錯

這個錯誤爆出,我們根本無法判斷問題所在。所以在任何情況下調(diào)用函數(shù)都需要做 出錯保護,加入
?if (nRet ~= 0) then
mobox.error(strLuaDEID, “PMS001數(shù)據(jù)庫沒有對應(yīng)字段 “)
return
end
2、在Debug 函數(shù)里面不能包含表類型的變量
Debug( strLuaDEID, debug.getinfo(1), ‘keynode創(chuàng)建’,tbNote[1])
里面的 tbNote[1]是一個表類型的變量,debug 不支持這個格式
nRet, strOBJInfo = mobox.objAttrToObjJson (‘JS003’, strRetInfo )
]]>
mobox3的功能點擴展的MBC客戶端的配置實現(xiàn)方式

需要定義 3個應(yīng)用 (應(yīng)用名稱 不能變)
MOBOX3
OIOrgSAPI
OIMoboxSAPI
OIDataSAPI
其它2個服務(wù)類似




需要配置上述服務(wù)參數(shù)
]]>
這個用戶部署了 Gungho系統(tǒng) ,而這個系統(tǒng)需要使用微信小程序。所以系統(tǒng)就會用到 gunghoAPI服務(wù)。(這個服務(wù)不是系統(tǒng)默認安裝的服務(wù),需要手工單獨部署過)
這個服務(wù)部署后,我們客戶端怎樣去調(diào)用這個服務(wù),我們就可以通過定義一個自定義參數(shù)來描述 gunghoAPI的的 IP及端口,方便客戶端調(diào)用
配置過程如下

這樣,我們就定義了一個編號為 9001 的參數(shù)。 這個參數(shù)可以通過 lua腳本來獲取
nRet, strCanSu= mobox.getParameter(strLuaDEID, ‘9001’)
]]>

我們可以看到,excel第一行是分組行(項目基礎(chǔ)信息,P1,P2)
在P1 下面有 計劃日期;在P2下面也有 計劃日期 ,2個字段名稱是一樣的。我們做讀取數(shù)據(jù)的時候必須要依賴分組 P1、P2的定義才能區(qū)分
我們在做excel導(dǎo)入的時候,針對這類表格。我們需要如下處理
1、導(dǎo)入按鈕設(shè)置

2、在導(dǎo)入腳本的地方主要通過分組屬性來區(qū)分字段
nRet, strRetInfo = mobox.getCurEditDataObjAttr(strLuaDEID, “G_PRJ_ID”, “S_PRJ_CODE”, “S_PRJ_NAME”, “S_PM_NAME”, “S_PD_NAME”)
[{
“attr”: “G_PRJ_ID”,
“value”: “”
},
{
“attr”: “S_PRJ_CODE”,
“value”: “PM-0002”
},
{
“attr”: “S_PRJ_NAME”,
“value”: “pcy 0999 hard”
},
{
“attr”: “S_PM_NAME”,
“value”: “金振興”
},
{
“attr”: “S_PD_NAME”,
“value”: “”
}
]
nRet, strOBJInfo = mobox.objAttrToObjJson (‘JS001’, strRetInfo )
注意:strOBJInfo 得到其實還是一個Json字符串,但其是一個標準的Json表格式表達
具體 objAttrToObjJson 函數(shù)怎么用查看手冊
{“cls”: “JS001”,
“ver”: 1,
“G_PRJ_ID”: “”,
“S_PRJ_CODE”: “PM-0002”,
“S_PRJ_NAME”: “pcy 0999 hard”,
“S_PM_NAME”: “金振興”
}
注意:這個Json格式是標準表格式字符串表達。
local tbOBJ = json.decode (strOBJInfo)
注,只有變成表后,我們可以這樣來理解這個表:
| 字段名 | cls | ver | G_PRJ_ID | S_PRJ_CODE | S_PRJ_NAME | S_PM_NAME |
| 數(shù)值 | JS001 | 1 | PM-0002 | pcy 0999 hard | 金振興 |
取值方法:
local strPMName
strPMName = tbOBJ.S_PRJ_NAME
賦值方法:
tbOBJ.S_PRJ_NAME = ‘潘元元’
local strRetInfo , strOBJInfo
local tbOBJ ={}
— 得到當(dāng)前窗體上指定字段的json字符串
nRet, strRetInfo = mobox.getCurEditDataObjAttr(strLuaDEID, “G_PRJ_ID”, “S_PRJ_CODE”, “S_PRJ_NAME”, “S_PM_NAME”, “S_PD_NAME”)— 將json字符串(mobox3)格式轉(zhuǎn)為 json標準表格式
nRet, strOBJInfo = mobox.objAttrToObjJson (‘JS001’, strRetInfo )–將json字符串轉(zhuǎn)變?yōu)楸?br /> tbOBJ = json.decode (strOBJInfo)
— 獲取表字段內(nèi)容及設(shè)置表字段值
local strPMName
strPMName = tbOBJ.S_PM_NAME
tbOBJ.S_PM_NAME = ‘潘元元’
若需要將數(shù)據(jù)轉(zhuǎn)會mobox3數(shù)據(jù)格式
–將表轉(zhuǎn)變?yōu)閖son字符串(標準格式)
strOBJInfo = json.encode (tbOBJ)— 將json標準表格式格式轉(zhuǎn)為 json字符串(mobox3)
nRet, strRetInfo = mobox.objJsonToObjAttr (‘JS001’, strOBJInfo )
]]>

為了解決這個問題,我們可以編輯一個lua腳本,將這個數(shù)據(jù)做處理后再顯示(在顯示前事件里面定義這個lua腳本)
–[[? ? 功能說明:? ? ? ? 1) 顯示前做一些字段的處理? ? ? ? 2)前端導(dǎo)入,新增有換行符號 %%3Cbr%%3E ,替換成 <br> 前端html支持的換行內(nèi)容? ? ? ? 3)內(nèi)容中有&,替換成 & 前端解析 &不支持,最好在輸入時進行替換–]]json = require(“json”)mobox = require(“OILua_JavelinExt”)require(“oi_basestrfunc”)function BeforeGridShow(strLuaDEID)? ? local nRet, strRetInfo? ? local arobjs, attrs, success? ? — 獲取輸入的DataJson數(shù)據(jù)包? ? nRet, strRetInfo = mobox.getCurEditDataPacket(strLuaDEID)? ? if (nRet ~= 0) then? ? ? ? mobox.error(strLuaDEID, “無法獲取數(shù)據(jù)包!”)? ? ? ? return? ? end? ? if (strRetInfo == ” or strRetInfo == nil) then? ? ? ? return? ? end? ? — 解析數(shù)據(jù)包,數(shù)據(jù)包格式? ? — [{“id”:””,”attrs”:[{“attr”:””,”value”:””},..]},..]? ? local n, nCount? ? success, arobjs = pcall(json.decode, strRetInfo)? ? if (success == false) then? ? ? ? mobox.error(strLuaDEID, “非法的JSON格式!”)? ? ? ? return? ? end? ? nCount = #arobjs? ? if (nCount == 0) then? ? ? ? return? ? end? ? local obj, attrs? ? local nattr_count? ? local strRow, strAttr, strItem? ? local strDataJson? ? local id, strValue? ? local strAttrs? ? strDataJson = ‘[‘? ? local seg = {}? ? local nSegCount = 0? ? for n = 1, nCount do? ? ? ? obj = arobjs[n]? ? ? ? attrs = obj.attrs? ? ? ? nattr_count = #attrs? ? ? ? id = obj.id? ? ? ? strAttrs=”? ? ? ? — 開始過濾顯示數(shù)據(jù)對象屬性? ? ? ? for nIndex = 1, nattr_count do? ? ? ? ? ? strAttr = attrs[nIndex].attr? ? ? ? ? ? strValue = attrs[nIndex].value? ? ? ? ? ? strValue = strValue:gsub(“%%3Cbr%%3E”, “<br>”)? ? ? ? ? ? strValue = strValue:gsub(“&”, “&”)? ? ? ? ? ? strItem = ‘{“attr”:”‘ .. strAttr .. ‘”,”value”:”‘ .. strValue .. ‘”},’? ? ? ? ? ? strAttrs = strAttrs .. strItem? ? ? ? end? ? ? ? — 取消最后一個,號? ? ? ? strAttrs = trim_laster_char(strAttrs)? ? ? ? strRow = ‘{“id”:”‘ .. id .. ‘”,”attrs”:[‘ .. strAttrs .. ‘]},’? ? ? ? strDataJson = strDataJson .. strRow? ? end? ? — 取消最后一個,號? ? strDataJson = trim_laster_char(strDataJson)? ? strDataJson = strDataJson .. ‘]’? ? local strAction = ‘[{“action_type”:”reset_data_attr”,”value”:’ .. strDataJson .. ‘}]’? ? mobox.setAction(strLuaDEID, strAction)end
這個列子也可以用于別的一些非法字符串的處理
]]>