40天,搞定8萬(wàn)塊的智慧取餐柜項(xiàng)目
二哥編程知識(shí)星球 (戳鏈接加入)正式上線了,來(lái)和 220 多名 小伙伴一起打怪升級(jí)吧!這是一個(gè) Java 學(xué)習(xí)指南 + 編程實(shí)戰(zhàn)的私密圈子,你可以向二哥提問(wèn)、幫你制定學(xué)習(xí)計(jì)劃、跟著二哥一起做實(shí)戰(zhàn)項(xiàng)目,沖沖沖。Java 程序員進(jìn)階之路網(wǎng)址:
https://tobebetterjavaer.com/
今天給大家分享一位程序員老哥 40 天接的一個(gè) 8 萬(wàn)的智慧取餐柜項(xiàng)目,非常類似快遞柜項(xiàng)目,完整解決方案也跟大家分享一下,希望給大家一些參考。
這是取餐柜成品的樣子,硬件廠家提供的不用去開(kāi)發(fā)硬件哦,我們只開(kāi)發(fā)的軟件部分(小程序,PC 端,APP)

下面是廠家快遞過(guò)來(lái)的測(cè)試機(jī)器 4 口,別問(wèn)我為什么跟上面的不一樣,上面的那個(gè)實(shí)在太大了啊,測(cè)試聯(lián)調(diào)只要接口 OK 就行

流程圖先曬下,畫的很簡(jiǎn)單

現(xiàn)在開(kāi)發(fā)項(xiàng)目都喜歡前面加個(gè)智慧,這個(gè)項(xiàng)目也是智慧 XXX
說(shuō)白了就是一個(gè)外賣項(xiàng)目的升級(jí)版本

開(kāi)發(fā)人員情況(1 人)
uniapp 前端 技術(shù)棧 vue 主要任務(wù) 小程序及 PC 端頁(yè)面,APP (存取 餐) 后端 ? ? 技術(shù)棧 ? springboot 開(kāi)發(fā)周期 40 天(設(shè)計(jì)+開(kāi)發(fā)) 開(kāi)發(fā)人數(shù) 1 人 整體費(fèi)用是 8 萬(wàn)(不含硬件部分),這是一期的開(kāi)發(fā)費(fèi)用 付款模式 5:4:1 首付:驗(yàn)收:尾款 走的正規(guī)公司合同 云服務(wù)器 1 臺(tái) 4 核 8G,經(jīng)費(fèi)有限先就安排 1 臺(tái),不夠后面升級(jí) 維護(hù)費(fèi)用 項(xiàng)目總款項(xiàng) 10% 售后維護(hù) | 域名 | 服務(wù)器 | 日常運(yùn)維 |
技術(shù)選型
核心框架:Spring Boot 數(shù)據(jù)庫(kù)連接池:Druid 緩存:redis 前端:Vue APP 小程序 Uniapp 數(shù)據(jù)庫(kù):mysql 服務(wù)器配置 4 核 8G 硬件接口開(kāi)發(fā)聯(lián)調(diào)(云打印機(jī) 取餐柜)
項(xiàng)目背景
大城市里公司上班族,經(jīng)常交通通勤都 1 個(gè)多小時(shí),購(gòu)買早餐也經(jīng)常需要排很長(zhǎng)的隊(duì),很浪費(fèi)時(shí)間,本系統(tǒng)就是為了解決上班族購(gòu)買早餐難的痛點(diǎn)而誕生的。
一線城市上班時(shí),吃早餐就很頭疼,辦公大廈樓下早餐店排隊(duì)很夸張的,浪費(fèi)了我很多寫代碼的時(shí)間呀。
小程序
本小程序主要功能就這些
用戶下訂單 騎手存餐
下面是我們的測(cè)試體驗(yàn)版小程序,初始數(shù)據(jù)有點(diǎn)隨意

跟普通下單外賣不同的地方就是可以選擇取餐時(shí)間和機(jī)柜

騎手進(jìn)入本頁(yè)面點(diǎn)擊【存餐】觸發(fā) 取餐柜


下單成功會(huì)短信通知用戶 取餐碼

PC 端
目前主要功能,說(shuō)白了在外賣系統(tǒng)二開(kāi)的,分系統(tǒng)管理員和商家角色
商品管理 -分系統(tǒng)和商家 訂單管理 -分系統(tǒng)和商家 店鋪管理 -分系統(tǒng)和商家 會(huì)員權(quán)限管理 售后管理 統(tǒng)計(jì)報(bào)表 訂單物流 財(cái)務(wù)管理 騎手管理
下面截圖就是開(kāi)源系統(tǒng)上面二開(kāi)的,別問(wèn)我為啥管理系統(tǒng)頁(yè)面都長(zhǎng)了差不多,前端是 Vue
系統(tǒng)管理員角色


商家角色


硬件部分(取餐柜)
主要硬件是取餐柜,這個(gè)是找的第三方現(xiàn)成的硬件廠家,對(duì)方會(huì)提供接口文檔具體的 SDK 包,我們的工作量就是接口開(kāi)發(fā)然后聯(lián)調(diào)一波。







取餐接口(取餐柜)
下面我把核心的存餐接口給大家列出來(lái)下
創(chuàng)建存餐訂單
使用場(chǎng)景
創(chuàng)建存餐訂單
操作名稱
createOrder
請(qǐng)求字段
{
????"deviceId":"xxxxxxxxxxx",???//?必傳,設(shè)備ID
????"shopOrderId":"00000000000000",???//?必傳,商戶訂單號(hào),最多32位字符
????"type":1,???//非必傳,請(qǐng)求的格子類型,普通小格1、普通大格2,不傳遞默認(rèn)為1
????"isWarm":"1",????//?非必傳,是否開(kāi)始加熱(1-加熱【取餐時(shí)自動(dòng)關(guān)閉加熱】、不傳遞或傳遞0為不加熱)
????"isLight":"1",????//?非必傳,是否開(kāi)燈(1-開(kāi)燈【取餐時(shí)自動(dòng)關(guān)燈】、不傳遞或傳遞0為不開(kāi)燈)
????"isDisinfect":"1",????//?非必傳,是否開(kāi)始消毒(1-加熱【取餐時(shí)自動(dòng)關(guān)閉消毒】、不傳遞或傳遞0為不消毒)
????"takeCode":"1234",//?非必傳,支持自定義取餐碼,不傳遞?則AUV會(huì)默認(rèn)自動(dòng)生成4位取餐碼
????"cellId":"12",//?非必傳,支持自定義格口號(hào),不傳遞?則AUV會(huì)隨機(jī)分配格口
}
返回?cái)?shù)據(jù)
存餐成功:
{
????"deviceId":"xxxxxxxxxxx",???//設(shè)備ID
????"shopOrderId":"00000000000000",???//商戶訂單號(hào),最多32位字符
????"orderId":"11111111",???//存取訂單ID
????"cellId":"22",??//?占用的格子號(hào)
????"code":"1234",????//?系統(tǒng)生成的取餐碼,可以通過(guò)該值請(qǐng)求?takeByCode?接口進(jìn)行取餐操作
????"cellAlias":"22",?//?占用的格子號(hào)別名
}
訂單打印機(jī)
小程序端下訂單后,會(huì)同步通知 XX云打印機(jī),這部分硬件市面上也是有現(xiàn)成的,購(gòu)買就行然后給云打印機(jī)系統(tǒng)進(jìn)行接口對(duì)接即可。
硬件設(shè)備如下,也不貴 300元左右

打印小票樣例如下

文本打印接口
請(qǐng)求地址:https://open-api.XXX.net/print/index
請(qǐng)求方式:POST
所需參數(shù)
| 名 稱 | 類 型 | 描 述 | 是否必傳 |
|---|---|---|---|
| client_id | string | 開(kāi)發(fā)者的應(yīng)用ID,在開(kāi)放平臺(tái)創(chuàng)建應(yīng)用時(shí)獲得 | 是 |
| access_token | string | 授權(quán)的token 必要參數(shù) | 是 |
| machine_code | string | X聯(lián)云打印機(jī)終端號(hào) | 是 |
| content | string | 打印內(nèi)容(需要urlencode),排版指令詳見(jiàn)打印機(jī)指令 | 是 |
| idempotence | int | 為?1?時(shí),origin_id?進(jìn)行冪等處理,請(qǐng)確定?origin_id 的唯一性 | 否 |
| origin_id | string | 商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫字母 ,且在同一個(gè)client_id下唯一。詳見(jiàn)商戶訂單號(hào) | 是 |
| sign | string | 簽名 詳見(jiàn)API文檔列表-接口簽名 | 是 |
| id | string | UUID4 詳見(jiàn)API文檔列表-uuid4 | 是 |
| timestamp | int | 當(dāng)前服務(wù)器時(shí)間戳(10位) | 是 |
返回詳情
{"error":"0","error_description":"success",
"body":{"id":"訂單號(hào)","origin_id":""}}
{"error":"8","error_description":"打印機(jī)信息錯(cuò)誤,參數(shù)有誤"}
{"error":"9","error_description":"連接打印機(jī)失敗,參數(shù)有誤"}
{"error":"10","error_description":"權(quán)限不足"}
{"error":"12","error_description":"缺少必要參數(shù)"}
{"error":"13","error_description":"打印失敗,參數(shù)有誤"}
{'error':'33',?'error_description':'Uuid?不合法'
}
核心表
如訂單表
DROP?TABLE?IF?EXISTS?`tp_order`;
CREATE?TABLE?`tp_order`?(
`order_id`?mediumint(8)?unsigned?NOT?NULL?AUTO_INCREMENT?COMMENT?'訂單?id',
`order_sn`?varchar(20)?NOT?NULL?DEFAULT?''?COMMENT?'訂單編號(hào)',
`master_order_sn`?varchar(20)?DEFAULT?''?COMMENT?'主訂單號(hào)',
`user_id`?mediumint(8)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'用戶?id',
`order_status`?tinyint(1)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'訂單狀態(tài)',
`shipping_status`?tinyint(1)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'發(fā)貨狀態(tài)',
`pay_status`?tinyint(1)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'支付狀態(tài)',
`consignee`?varchar(60)?NOT?NULL?DEFAULT?''?COMMENT?'收貨人',
`country`?int(11)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'國(guó)家',
`province`?int(11)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'省份',
`city`?int(11)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'城市',
`district`?int(11)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'縣區(qū)',
`twon`?int(11)?DEFAULT?'0'?COMMENT?'鄉(xiāng)鎮(zhèn)',
`address`?varchar(255)?NOT?NULL?DEFAULT?''?COMMENT?'地址',
`zipcode`?varchar(60)?NOT?NULL?DEFAULT?''?COMMENT?'郵政編碼',
`mobile`?varchar(60)?NOT?NULL?DEFAULT?''?COMMENT?'手機(jī)',
`email`?varchar(60)?NOT?NULL?DEFAULT?''?COMMENT?'郵件',
`shipping_code`?varchar(32)?NOT?NULL?DEFAULT?'0'?COMMENT?'物流?code',
`shipping_name`?varchar(120)?NOT?NULL?DEFAULT?''?COMMENT?'物流名稱',
`pay_code`?varchar(32)?NOT?NULL?DEFAULT?''?COMMENT?'支付?code',
`pay_name`?varchar(120)?NOT?NULL?DEFAULT?''?COMMENT?'支付方式名稱',
`invoice_title`?varchar(256)?DEFAULT?''?COMMENT?'發(fā)票抬頭',
`goods_price`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'商品總價(jià)',
`shipping_price`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'郵費(fèi)',
`user_money`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'使用余額',
`coupon_price`?decimal(10,2)?DEFAULT?'0.00'?COMMENT?'優(yōu)惠了多少',
`integral`?int(10)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'使用積分',
`integral_money`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'使用積分抵多少錢',
`order_amount`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'應(yīng)付款金額',
`total_amount`?decimal(10,2)?DEFAULT?'0.00'?COMMENT?'訂單總價(jià)',
`add_time`?int(10)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'下單時(shí)間',
`confirm_time`?int(10)?DEFAULT?'0'?COMMENT?'收貨確認(rèn)時(shí)間',
`pay_time`?int(10)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'支付時(shí)間',
`shipping_time`?int(11)?DEFAULT?'0'?COMMENT?'最新發(fā)貨時(shí)間',
`order_prom_id`?smallint(6)?NOT?NULL?DEFAULT?'0'?COMMENT?'訂單活動(dòng)?id',
`order_prom_amount`?decimal(8,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'訂單活動(dòng)優(yōu)惠金額',
`discount`?decimal(10,2)?NOT?NULL?DEFAULT?'0.00'?COMMENT?'價(jià)格調(diào)整',
`user_note`?varchar(255)?NOT?NULL?DEFAULT?''?COMMENT?'用戶備注',
`admin_note`?varchar(255)?DEFAULT?''?COMMENT?'管理員備注',
`parent_sn`?varchar(100)?DEFAULT?NULL?COMMENT?'父單單號(hào)',
`store_id`?int(10)?DEFAULT?'0'?COMMENT?'店鋪?ID',
`is_comment`?tinyint(1)?NOT?NULL?DEFAULT?'0'?COMMENT?'是否評(píng)價(jià)(0:未評(píng)價(jià);1:已評(píng)價(jià))',
`deleted`?tinyint(1)?unsigned?zerofill?NOT?NULL,
`is_checkout`?tinyint(1)?DEFAULT?'0'?COMMENT?'0?未結(jié)算?1?已結(jié)算',
`qishouid`?int(11)?DEFAULT?'0',
`jiedantime`?varchar(255)?DEFAULT?NULL,
`youhuiid`?int(11)?DEFAULT?NULL,
`qucantime`?varchar(255)?DEFAULT?NULL,
`shebeiid`?varchar(255)?DEFAULT?NULL,
`qucanshebeiid`?int(11)?DEFAULT?NULL,
`baozhuangfei`?varchar(255)?DEFAULT?NULL,
`qucancode`?varchar(255)?DEFAULT?NULL,
PRIMARY?KEY?(`order_id`),
UNIQUE?KEY?`order_sn`?(`order_sn`)?USING?BTREE,
KEY?`user_id`?(`user_id`)?USING?BTREE,
KEY?`order_status`?(`order_status`)?USING?BTREE,
KEY?`shipping_status`?(`shipping_status`)?USING?BTREE,
KEY?`pay_status`?(`pay_status`)?USING?BTREE,
KEY?`shipping_id`?(`shipping_code`)?USING?BTREE,
KEY?`pay_id`?(`pay_code`)?USING?BTREE
)?ENGINE=MyISAM?AUTO_INCREMENT=485?DEFAULT?CHARSET=utf8;
總結(jié)
其實(shí)本系統(tǒng)技術(shù)難度不高,只要把整個(gè)解決方案確定出來(lái)了,后面的也就寫業(yè)務(wù)代碼而已,各種硬件接口開(kāi)發(fā)聯(lián)調(diào)比較費(fèi)時(shí)間,可以預(yù)測(cè)這種項(xiàng)目以后估計(jì)會(huì)越來(lái)越多,會(huì)大大提高大家的工作生活效率。
復(fù)制粘貼,修修改改,聯(lián)機(jī)調(diào)試,幾萬(wàn)塊落袋,搞搞副業(yè)也是不錯(cuò)的,畢竟打工仔掙不了幾個(gè)錢。
沒(méi)有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧?kù)o的港灣,我是不系之舟。
推薦閱讀:

