具體業務是這樣的
一個庫房中的庫存是根據許多單據的生成來做更改的
如 到貨單保存后,進行了庫存的++, 出庫單保存后,該物料相應減少-- 等.
那么在展示列中,如果有一個期初庫存的字段,用來展示選定時間點時,當時庫存有多少余量,並根據時間日歷插件進行區間搜索.
而主要業務中的數值字段還有:
期初庫存 / 到貨量 / 出庫量 / 退庫量 / 結余數量
再解釋一下,
期初庫存是查取時間段后,它的上一個時間節點的結余數量
到貨量即 新到的貨物數量
出庫量即 派送出的貨物數量
退庫量即 回退的貨物數量
結余數量 = 期初+到貨-出庫+退庫(量)
首先如果沒有時間的區間檢索,完全可以記錄到一條數據元組上.
如:
在執行貨品"檸檬水"的到貨時,可以判斷當時庫存中是否有這個貨品,沒有執行INSERT,有則執行UPDATE,
INSERT時,將到貨量記錄到到貨量字段,其它字段為0,(在后續的出庫等操作時,進行UPDATE),
當庫存本來就有"檸檬水"庫存時,執行到貨量字段的UPDATE,如
到貨量 = 新到貨量+到貨量 (其它字段同樣,執行累加計算,*出庫量同樣是累加)
如果馬上要看到結余量,那么進行調用第二個方法,計算結余數量,進行結余數量字段的UPDATE.
現在假設有區間搜索,在搜索時,想要查看的數據時這個區間時間內的到貨,出庫,退庫,及結余量.

上圖展示了每條進行倉庫操作時的記錄數據,在區間搜索時假設時間是從22到28的,最終想要得到的結果
只有兩條,即"籃球"和"甲板",並將到貨量(shourushuliang),出庫量(fachushuliang),退庫量(tuihuishuliang)進行sum計算
那么還需要展示時間區間搜索的期初庫存量,即這個區間時間開始前,庫存還有多少量.
因為這個獲取回來用到了mysql的GROUP BY(貨品名稱),在獲取期初庫存時需要獲取到時間區間開始時間最貼近的ASC的那第一條的數值
而結余數量即時間區間結束時最貼近結束時間的DESC的那一條中的結余數量(jieyushuliang)
拿ID 26到28來說,在這個區間內,應該以 15作為返回的期初庫存, 以9作為返回的結余數量.
結果:
插入詳細數據時,需要動態獲取到前一個時間點該物料的結余數量
#新增物料庫存詳細,並填充期初庫存為它上一個日期節點的結余量 #需要insert其它字段,如rukukufang,dalei,jiagongyigong, insert into wuliaokucunrizhi(mingchengguige,qichukucun,shourushuliang,fachushuliang,tuihuishuliang,jieyushuliang) values('甲板',IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi where createtime < (select now()) and mingchengguige='甲板' and rukukufang='A'and dalei='甲類' order by createtime desc limit 1) jie),0),0,0,0,17);
這里的最后的數字17應該是動態的這里只是測試
獲取到最終按時間區間搜索所要呈現的結果集合
#3.將上兩條融合 有了搜索時間區間和其它條件的sum的集合 select DISTINCT(result1.mingchengguige), substring_index(group_concat(result1.qichukucun order by createtime),',',1), sum(shourushuliang),sum(fachushuliang),sum(tuihuishuliang), substring_index(group_concat(result1.jieyushuliang order by createtime desc),',',1) from(select * from wuliaokucunrizhi WHERE createtime >= '2019-12-27 22:02:00' AND createtime <= '2019-12-29 24:00:00' AND rukukufang = 'A' AND dalei = '甲類')result1 GROUP BY mingchengguige
這里還應該將返回字段進行AS別名好映射實體類
最終結合mybatis
<select id="listKucunWithRiZhi" resultMap="BaseResultMap"> select DISTINCT(kucunchaxun.mingchengguige)as mingchengguige, substring_index(group_concat(kucunchaxun.xiangmuweihu order by kucunchaxun.createtime desc),',',1)as xiangmuweihu, substring_index(group_concat(kucunchaxun.rukukufang order by kucunchaxun.createtime desc),',',1)as rukukufang, substring_index(group_concat(kucunchaxun.dalei order by kucunchaxun.createtime desc),',',1)as dalei, substring_index(group_concat(kucunrizhi.qichukucun order by kucunrizhi.createtime),',',1)qichukucun, sum(kucunrizhi.shourushuliang)shourushuliang,sum(kucunrizhi.fachushuliang)fachushuliang,sum(kucunrizhi.tuihuishuliang)tuihuishuliang, substring_index(group_concat(kucunrizhi.jieyushuliang order by kucunrizhi.createtime desc),',',1)jieyushuliang, substring_index(group_concat(kucunchaxun.jiagongyigong order by kucunchaxun.createtime desc),',',1)as jiagongyigong, substring_index(group_concat(kucunrizhi.createtime order by kucunrizhi.createtime desc),',',1)as createtime from wuliaokucunchaxun as kucunchaxun LEFT JOIN wuliaokucunrizhi as kucunrizhi ON kucunchaxun.mingchengguige = kucunrizhi.mingchengguige <where> <if test="mingchengguige != null and mingchengguige != '' "> <bind name="mingchengguigePattern" value="'%'+mingchengguige+'%'"/> and kucunchaxun.mingchengguige like #{mingchengguigePattern} and kucunrizhi.mingchengguige like #{mingchengguigePattern} </if> <if test="jiagongyigong != null and jiagongyigong != '' "> and kucunchaxun.jiagongyigong = #{jiagongyigong} and kucunrizhi.jiagongyigong = #{jiagongyigong} </if> <if test="rukukufang != null and rukukufang != '' "> and kucunchaxun.rukukufang = #{rukukufang} and kucunrizhi.rukukufang = #{rukukufang} </if> <if test="dalei != null and dalei != '' "> and kucunchaxun.dalei = #{dalei} and kucunrizhi.dalei = #{dalei} </if> <if test="createtime != null"> and kucunrizhi.createtime = #{createtime} </if> <if test="updatetime != null"> and kucunrizhi.updatetime = #{updatetime} </if> <if test="s_btime != null"> and createtime >= #{s_btime} </if> <if test="s_etime != null"> and createtime <= date_add(#{s_etime}, interval 1 day) </if> </where> GROUP BY kucunchaxun.mingchengguige <if test="sort == null"> ORDER BY createtime DESC </if> <if test="sort != null and sort != ''"> order by ${sort} ${order} </if> </select>
謝謝查看!
