From aed35b7c89dae2d5f25b602aa21dcbdefbcbbb92 Mon Sep 17 00:00:00 2001 From: icewint Date: Tue, 7 Jan 2025 08:03:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0EBS=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 982 -> 1392 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1266 -> 1179 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 1804 -> 1823 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3424 -> 2752 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 4799 -> 5665 bytes lib/apiclient/baseDio.dart | 7 +- lib/apiclient/stock_in.dart | 38 +++ lib/apiclient/wmsApiClient.dart | 31 +- lib/common/colorCom.dart | 2 +- lib/page/layout/home.dart | 19 +- lib/page/layout/login.dart | 95 +++--- lib/page/pick/pick.dart | 2 +- .../{stockCheck.dart => stock_check.dart} | 0 .../{stockSearch.dart => stock_search.dart} | 0 ...stackInWheelEBS.dart => stack_in_ebs.dart} | 54 +--- ...stackInWheelMes.dart => stack_in_mes.dart} | 0 ...{stockInEmpty.dart => stock_in_empty.dart} | 0 lib/page/stockIn/stock_in_normal.dart | 280 ++++++++++++++++++ lib/utils/dialogUtils.dart | 3 +- 21 files changed, 401 insertions(+), 134 deletions(-) create mode 100644 lib/apiclient/stock_in.dart rename lib/page/stock/{stockCheck.dart => stock_check.dart} (100%) rename lib/page/stock/{stockSearch.dart => stock_search.dart} (100%) rename lib/page/stockIn/{stackInWheelEBS.dart => stack_in_ebs.dart} (86%) rename lib/page/stockIn/{stackInWheelMes.dart => stack_in_mes.dart} (100%) rename lib/page/stockIn/{stockInEmpty.dart => stock_in_empty.dart} (100%) create mode 100644 lib/page/stockIn/stock_in_normal.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 0956a59..3595a9b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -28,7 +28,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.wms.wms_app" + applicationId = "com.wms.wms_app_bancai" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 82db03e..994d70f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 84885b78eff4708d105131509ac3472607d24977..5e7a2627ab393999fa68caf0f45bf178a02fdc81 100644 GIT binary patch delta 1348 zcmW+#Ycv!H6rMctEHdq`95jhm=WLwKIkl#eX{nS%IU8v`TIHEEF|{i@*~+uzF;<1j zD{36z-%j0g?|1L_{rJv3=bp<^k*aTtadbGcL0wOsKpa{M~9xPDc>()ROc^F+Hh zM$;j#fv6gT325^`s~ft*AgI7}Go($JC_-lt+PyIP7}8G=*JB_K-8Ue7i-|(8{m~(J zcminyq>T{MYta{l)^iZPfv^%iH_>|&{Csryp#3+DWuoH(_<87!Ku>wcl22G&#F7;Ku^7$3*i($8f&U!KGmyvH8e}6FxQot95R{?oI)oMI zi-c^5j6)$V2TB92&P_REK6m4fYuG5K;=F_?&vhgcFrHi+Kam|B|oi3$SH@@1O=CDK@m+=ygsM zr&v!)F)5!^=k8dXO6PcqYo?36=98K<#uvhdy(Eh?K3`0wDN(dF4<~mg9Zov-s4j4~ zp3>hT0f(s{X}b$1n;PuzbsyW2qRC+!9HJMjfA?UdlF`3KnWz<|o$Se1e5kCk^`nuo z<-v;N9nveRi(1nWfi$y(?Scf0-jvX*;T zVQhLwS|*b99Mp9bFSxH~oYB9k;NqI1wArbgc=s3LsZf1;pL;A1(`O-hdkBq8rV9O4 z=5>#R?dq4NQ@d2v_6EHydl9qiQx2 zVc!Hb(1&bdm()UQ^C;+5$(Wk7rC9Qc)33Vm!pASfm<*is*_VEx+APIgmwhKTJD3|0 zS1N1gu}YIOkCj*Vd9fN(m}JKS!dW``kjAgvp2Fj>F*G2?1iX1-M;tZVHBqnRe4;1D z#lqxx1=S)XZcmkpm{$^D{o1v`pgi608k0e~bWLPz9(TZUz-ohUWc*18Nos=?=AuLu zEj2%{j-K4k?8=(;O9Canw_nSCssquDEm3P0G&{}JB;-77b2qXw49nVkgr1o9Z%%TZ z67hK?c~?~d+U~z&Z=PM zXX-a*l{MC)Xv4Sl)|a(g-85%6`t$1Mr*1f23^h>f+}Y8a@swLgI=2!Xq2RduJnL*m zmL=<_h=_{}tJ0u+i=4pbn20^}P0c~|)|+x&;+Z9@?z;8XM$YCuZvJQ2-)$;ANeV?T zU*5*aenPk{MOq$Tl*&9^wBKmabRzA~lJA{buZ8=5tK2+Ep3zlb%G6kGvZbU|k@uF) zgz>Z}6q|Gj$G*lq_SRx(h~u`PCxX6>+AIUV;C+Gc delta 934 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 Z$fOEtICa$h-X{95s9;`bV7b3g@*i^{tO)=B diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index fb017dfc5cb3fd67b687b0f7bc56efd24f8aff46..b01e330e07080a110adfe61b11756e3d8b1606fb 100644 GIT binary patch delta 1747 zcmYLJdo?ZQE(w+LNQ%5)N2HWyBBw|Qhv;~P2t^SJ z5eG-LaQ5iS(y9+UJly4F;WUv zAewAIzl`osu*1-N6}`{Vc^}N1V0cn6mxl0!}n~pP?%Rvuvy^qb~*Di_zwTWj=c1!MX+R z?`XCIe-hK}=y`@_d(1Gwa0jLT1;(rKy##`JEDWO~5Tj)n%)Tp@2&3g_^FpgD=KH{KLnjpjnc&7^c?sQ*!1TxRA{GY0jsSlOtUH+PhF}(g zIZQJ!QU+E4_%m1>!#stDISz&k@q>=uM9dFh;3askusDKtKXgzrln-7u#%eI}1%es$ z{0{bGEPlt(8_e~9c^gx7G&^8%6rI87PseN*nl7{YypFAAO2XIN}pFWcgX}HyxUMu=e#p}EOGEki?&>SjSM+v$BWEOu@=?j z45c8Yut(Hlv0mZLXSQ^8%HR&{#?hQl+|zf#{rvA ztstF+3PU}vqON>xem^;^?nrnNC0Sy+Pmth8wkXw-t!mbyiF)66C*8LpTWgbL8)e9i zi|&C#*2;?3(9jZ=TO+tZwR_|sCMU1HJ77l6k+2VMPzmEPkN%S|D!*{vLE(87p;Wsw zvDP*rCOS~OAmfqN*TefLj4Z;w?nBinNbcqN}2sQkvbCt<36Swv+y$usho=js7JnN*>La z)1Pj%6#v0Ib|TR;1tjW5a8k|GQnhPsViZ?>CS6a<-MZapeU3MuQ?Dmoz^>7lQ(KC|>*qzP3y zxah4TlV0(YXMR_FPV`*b*?H;cf2*}$Soe|Gwpyxya!D0;=U8>$)NPEICf_LGSZ0Q( zo%_(H%3~7#7nhae^LEW&?K*qf$3Svdv^e#U?c0+98$%|XU61XX&!tHHOxL?v>=+Q^ z{J53Goi@{G%f9LBx7$8caOA_;_Vj?`h1v<~x#0msL}Bs`r>B{P>CMX*VUV;pTRLMp zy(x&1lW$z{F)Gk3@=o49jlxawht-C2cjOoQjrc{jUP_hEl1UvrTBVgJrI1EF97VBY zZxB&jyT;*{RLLQZh=>j4<(ck_YJL}z`mNKbZbieh3bIA5=T5)&)FnA~s7185m784i z+aRWDMm0PU+`rbI&acz>nB`sJ|iMvgjOInj>S{2wa^Z8U{+_sYz zMkFzV^fT)52Qq#xGR{q-vZR}O$ZF~dRtz1|S(lbNndfouyv%c*D5ly6y`xf2k;b&C zqGHd)g=0^VBt1G#PKCtTellNm;SP7sxY=5JxrQr{n@HdNhBk65($Y5JQvud|}@NM3^1heKLw qRRX3EKUkqLGPyuYqh@Y_CQ%=dU#C{`uzvNI5Qh3DdT(^?g8l=xs|8d5 literal 1804 zcmZ8id010d7QaaVWl>WHDguI~MGI3~rJxkIFoP^r7!2r$gMfeqij`DRr|4K@Uxh#g zL=;E@A?zr!NhM0LBCCdFa4ZC@k$nmK^3Lr|r}NLe@4WNQ{hf2q?|#2?zwgC3IohsM z(@{eRt+ThYW|Oa{;$6!izRM;`kx=rraAQZd}p^$KdmI)Lx zgwVyE2#t6mWSNf8CQfGU(R~Qfqn(bp93lnbSxb>QR8$T`@&2$#9{xS12>ySmXdaHt zfk+-GyZ}e?sQ>OF2nmQM1&ZK*-NN~bWkLZYm*T`iNGitM5}Z^_aZ7+(hPkDf;KUO! zu}I++*&=+SfYjhb5#|=-gaU<6DpoX!7b);qA-+)v(E>;ik%lC|v3Y;QaU>{Ev?4f{ z7-3P+5o(+u!Vv--FQmvZ5{pO{$B7hYi_3-lhfw$k67wOo7<#0zvI-Q1-wZ=;4Mg*y zs2;|r0RWR{ZUG*(LOfv+!t-ueT!vK&dIuoA6tXMf*AbYWg%UBu2%x43<`6_=_)ZnBX~93XIe*2Q+n;AOO>f|YM!&QtHs^1EOeD> z3Mk8{sPCR4K(Lpvb?d~W_1TuE%Ukr0&U&Zw!!$VOZ5S4No6sgRN?T_7YH}n}jdQ_> zc9G!{a@|tZPn$>AFt=k#)@peQ?CB?;N}d0`m(6}`s~f-#*}XW4+bU+`Pu&tXI8@lu zI;Jy!adp%C`Tm9TR=yn!xqLzDqo%gNL-XVB2Jdm=)^j`=bzzN*0)YYj&0KKcX2ObcO|~*@_&2e`eAdoF6yP5qv#CX6`5ADo5X5y3e^I4x= zJU>a_x<)g%+c+?4ZSoY$d6^%B#k~ zm@0LPY!i=VBgP#M2cIurcEj>*%H*~GJEEIpv{ zOEaqQcr)@i=q3B6lX>ltw{HT_J`O>6x`ExD@nCADr#NfK*HuNu%H7EDV<)iNXQ5QU z3Rn8G{zz10#9u#*o+@*SxaMzY$miuSt%F>Aln%ST|CUXVa7d^ethOVb6erL%3kfU|UUpzy910?|t$^ZZW diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 254f33de54da16e71cbeb3dbec69dad034f66771..919db19f3da1b9666ad779fc488068964a4a14b4 100644 GIT binary patch literal 2752 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 Xn)P7K=jCznFhwlPtWAqdT%-RF47?V& delta 3374 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 Eg2+>9WSKwx>6mXb~Z0R>S~KmkRTE-8^( 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 Fe*m5gsKWpN literal 4799 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 urZgx`BP4&C`Rie|#D5Aj^bR@ stockInComplete(dynamic bindingVehicleData, {int timeOut = 5000}) async { + final response = await BaseDio.instance().post( + "/api/mobile/stockIn/bindingVehicleIn", + data: jsonEncode(bindingVehicleData), + options: Options( + responseType: ResponseType.json, + sendTimeout: Duration(milliseconds: timeOut), + receiveTimeout: Duration(milliseconds: timeOut), + ) + ); + return { "code" : response.statusCode, "data": response.data }; + } + + /// 扫描之后从数据库获取EBS数据 + static Future getGoodsCanUse(String orderId, String goodsId, {int timeOut = 5000}) async { + final response = await BaseDio.instance().post( + "/api/mobile/stockIn/getCanUseGoods", + data: jsonEncode({"orderId": orderId, "goodsId": goodsId}), + options: Options( + responseType: ResponseType.json, + sendTimeout: Duration(milliseconds: timeOut), + receiveTimeout: Duration(milliseconds: timeOut), + ) + ); + return { "code" : response.statusCode, "data": response.data }; + } + +} \ No newline at end of file diff --git a/lib/apiclient/wmsApiClient.dart b/lib/apiclient/wmsApiClient.dart index 74fe841..1159b7c 100644 --- a/lib/apiclient/wmsApiClient.dart +++ b/lib/apiclient/wmsApiClient.dart @@ -35,37 +35,10 @@ class WmsApiClient { } - // -------- 冷冻仓 - /// 扫描之后从数据库获取数据 - static Future getGoodsCanUse(String orderId, String goodsId, {int timeOut = 5000}) async { - instance(); - final response = await dio.post( - "/api/mobile/stockIn/getCanUseGoods", - data: jsonEncode({"orderId": orderId, "goodsId": goodsId}), - options: Options( - responseType: ResponseType.json, - sendTimeout: Duration(milliseconds: timeOut), - receiveTimeout: Duration(milliseconds: timeOut), - ) - ); - return { "code" : response.statusCode, "data": response.data }; - } + // ----------- 冷冻仓 - /// 码盘入库 - static Future bindingVehicleInLD(dynamic bindingVehicleData, {int timeOut = 5000}) async { - instance(); - final response = await dio.post( - "/api/mobile/stockIn/bindingVehicleIn", - data: jsonEncode(bindingVehicleData), - options: Options( - responseType: ResponseType.json, - sendTimeout: Duration(milliseconds: timeOut), - receiveTimeout: Duration(milliseconds: timeOut), - ) - ); - return { "code" : response.statusCode, "data": response.data }; - } + diff --git a/lib/common/colorCom.dart b/lib/common/colorCom.dart index e2d2ccd..fbd4acc 100644 --- a/lib/common/colorCom.dart +++ b/lib/common/colorCom.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; class ColorCommon { - static Color colorScheme = const Color(0xFF87a2fe); // 主题色 + static Color colorScheme = const Color(0xfffdbe5f); // 主题色 } \ No newline at end of file diff --git a/lib/page/layout/home.dart b/lib/page/layout/home.dart index 18d1541..f4ef1cc 100644 --- a/lib/page/layout/home.dart +++ b/lib/page/layout/home.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:wms_app/page/stockIn/stackInWheelEBS.dart'; -import '../stock/stockCheck.dart'; +import 'package:wms_app/page/stockIn/stack_in_ebs.dart'; +import 'package:wms_app/page/stockIn/stock_in_normal.dart'; +import '../stock/stock_check.dart'; import '/common/colorCom.dart'; import 'package:bruno/bruno.dart'; -import 'package:wms_app/page/stockIn/stockInEmpty.dart'; -import 'package:wms_app/page/stock/stockSearch.dart'; +import 'package:wms_app/page/stockIn/stock_in_empty.dart'; +import 'package:wms_app/page/stock/stock_search.dart'; import 'package:wms_app/page/pick/pick.dart'; class Home extends StatefulWidget { @@ -27,7 +28,7 @@ class _HomePageState extends State { centerTitle: true, backgroundColor: ColorCommon.colorScheme, title: const Text( - "景旺WMS移动终端(冷冻)", + "景旺WMS移动终端(板材)", style: TextStyle( color: Colors.white ), @@ -48,10 +49,10 @@ class _HomePageState extends State { ListTile(title: const Text("空载具入库"), trailing: const Icon(Icons.grain), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInEmpty())); }), - // ListTile(title: const Text("MES成品入库"), trailing: const Icon(Icons.add_box), onTap: () { - // Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInWheelMes())); - // }), - ListTile(title: const Text("码盘入库"), trailing: const Icon(Icons.add_box), onTap: () { + ListTile(title: const Text("单机码盘入库"), trailing: const Icon(Icons.add_box), onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInNormal())); + }), + ListTile(title: const Text("EBS码盘入库"), trailing: const Icon(Icons.add_box), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInWheelEBS())); }), ListTile(title: const Text("出库拣货"), trailing: const Icon(Icons.back_hand), onTap: () { diff --git a/lib/page/layout/login.dart b/lib/page/layout/login.dart index 2fcf778..e783b19 100644 --- a/lib/page/layout/login.dart +++ b/lib/page/layout/login.dart @@ -21,7 +21,7 @@ class _LoginPageState extends State { return Scaffold( appBar: AppBar( title: const Text( - "请登录(景旺冷冻仓)", + "请登录(景旺板材仓)", style: TextStyle( color: Colors.white ), @@ -32,36 +32,36 @@ class _LoginPageState extends State { body: Center( child: Column( children: [ - const Text("测试程序,禁止用于正式环境", style: TextStyle(color: Colors.redAccent)), - Padding( - padding: const EdgeInsets.only( - top: 120, - left: 50, - right: 50, - bottom: 10 - ), - child: TextField( - controller: _userId, - decoration: const InputDecoration( - labelText: "用户名:", - ), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0, - left: 50, - right: 50, - bottom: 10 - ), - child: TextField( - controller: _userPwd, - decoration: const InputDecoration( - labelText: "密码:", - ), - obscureText: true, - ), - ), + //const Text("测试程序,禁止用于正式环境", style: TextStyle(color: Colors.redAccent)), + // Padding( + // padding: const EdgeInsets.only( + // top: 120, + // left: 50, + // right: 50, + // bottom: 10 + // ), + // child: TextField( + // controller: _userId, + // decoration: const InputDecoration( + // labelText: "用户名:", + // ), + // ), + // ), + // Padding( + // padding: const EdgeInsets.only( + // top: 0, + // left: 50, + // right: 50, + // bottom: 10 + // ), + // child: TextField( + // controller: _userPwd, + // decoration: const InputDecoration( + // labelText: "密码:", + // ), + // obscureText: true, + // ), + // ), Padding( padding: const EdgeInsets.only(top: 15), child: SizedBox( width: 250, @@ -71,28 +71,29 @@ class _LoginPageState extends State { backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), ), child: const Text( - "登录", + "进入系统", style: TextStyle( color: Colors.white )) ), ) ), - Padding( padding: const EdgeInsets.only(top: 10), - child: SizedBox( - width: 250, - child: ElevatedButton( - onPressed: login, - style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), - ), - child: const Text( - "网络检测", - style: TextStyle( - color: Colors.white - )) - ), - ))], + // Padding( padding: const EdgeInsets.only(top: 10), + // child: SizedBox( + // width: 250, + // child: ElevatedButton( + // onPressed: login, + // style: ButtonStyle( + // backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + // ), + // child: const Text( + // "网络检测", + // style: TextStyle( + // color: Colors.white + // )) + // ), + // )), + ] ) ) ); diff --git a/lib/page/pick/pick.dart b/lib/page/pick/pick.dart index 948a2b4..ca041c0 100644 --- a/lib/page/pick/pick.dart +++ b/lib/page/pick/pick.dart @@ -79,7 +79,7 @@ class _PickPageState extends State { const Padding(padding: EdgeInsets.only( top: 10, bottom: 10 - ), child: Text("需要拣货的物料(点击数据行修改拣货数):"), + ), child: Text("需要拣货的物料(点击实际拣货数修改拣货数):"), ), Container( decoration: BoxDecoration( diff --git a/lib/page/stock/stockCheck.dart b/lib/page/stock/stock_check.dart similarity index 100% rename from lib/page/stock/stockCheck.dart rename to lib/page/stock/stock_check.dart diff --git a/lib/page/stock/stockSearch.dart b/lib/page/stock/stock_search.dart similarity index 100% rename from lib/page/stock/stockSearch.dart rename to lib/page/stock/stock_search.dart diff --git a/lib/page/stockIn/stackInWheelEBS.dart b/lib/page/stockIn/stack_in_ebs.dart similarity index 86% rename from lib/page/stockIn/stackInWheelEBS.dart rename to lib/page/stockIn/stack_in_ebs.dart index 11b0206..84b62d9 100644 --- a/lib/page/stockIn/stackInWheelEBS.dart +++ b/lib/page/stockIn/stack_in_ebs.dart @@ -2,11 +2,11 @@ import 'dart:convert'; import 'package:bruno/bruno.dart'; import 'package:flutter/material.dart'; +import 'package:wms_app/apiclient/stock_in.dart'; import 'package:wms_app/utils/stringUtils.dart'; import '/common/colorCom.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; import 'package:wms_app/utils/dialogUtils.dart'; -import 'package:wms_app/apiclient/wmsApiClient.dart'; class StockInWheelEBS extends StatefulWidget { const StockInWheelEBS({super.key}); @@ -19,16 +19,8 @@ class _StockInWheelEBSPageState extends State { final _vehicleTextController = TextEditingController(); // 载具号输入框 final _goodsCodeController = TextEditingController(); // 条码输入框 - List tableData = []; // 表格数据类型 List packageData = []; // 已经码盘的数据 int packageDataId = 0; // 已经码盘的数据的序号 - List list = [ - BrnMultiSelectBottomPickerItem("102", "库区1", isChecked: true), - BrnMultiSelectBottomPickerItem("102", "库区2"), - BrnMultiSelectBottomPickerItem("102", "库区3"), - ]; - - @override void initState() { @@ -48,18 +40,13 @@ class _StockInWheelEBSPageState extends State { centerTitle: true, backgroundColor: ColorCommon.colorScheme, title: const Text( - "码盘入库", - style: TextStyle( - color: Colors.white - ), + "EBS码盘入库", + style: TextStyle(color: Colors.white), ), ), body: Center( - child: Padding(padding: const EdgeInsets.only( - top: 5, - left: 10, - right: 10, - ), child: ListView( + child: Padding(padding: const EdgeInsets.only(top: 5, left: 10, right: 10), + child: ListView( children: [ BrnTextInputFormItem( controller: _vehicleTextController, @@ -84,23 +71,19 @@ class _StockInWheelEBSPageState extends State { color: Colors.white )) )), - Padding(padding: const EdgeInsets.only( - top: 0 - ), child: ElevatedButton( + Padding(padding: const EdgeInsets.only(top: 0), + child: ElevatedButton( onPressed: wheelComplete, style: ButtonStyle( backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), ), - child: const Text( - "码盘完成", + child: const Text("码盘完成", style: TextStyle( color: Colors.white )) )), - const Padding(padding: EdgeInsets.only( - top: 10, - bottom: 10 - ), child: Text("添加在载具的物料:"), + const Padding(padding: EdgeInsets.only(top: 10, bottom: 10), + child: Text("已码物料:"), ), Container( decoration: BoxDecoration( @@ -130,10 +113,7 @@ class _StockInWheelEBSPageState extends State { TDTableCol(title: '数量', colKey: 'quantity', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '重量', colKey: 'weight', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '生产日期', colKey: 'productData', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), - TDTableCol(title: '库区', colKey: 'area', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '送货单号', colKey: 'sendOrderId', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), - TDTableCol(title: 'WMS批次', colKey: 'goodsTypeId', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), - TDTableCol(title: '供应商批次', colKey: 'pruBatch', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '物料描述', colKey: 'goodsName', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '单位', colKey: 'unit', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), TDTableCol(title: '订单头主键', colKey: 'poHeaderId', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), @@ -184,7 +164,7 @@ class _StockInWheelEBSPageState extends State { String orderId = codeData[0]; String goodsId = codeData[1]; BrnLoadingDialog.show(context, content: "正在请求服务器数据"); - WmsApiClient.getGoodsCanUse(orderId, goodsId).then((response){ + StockIn.getGoodsCanUse(orderId, goodsId).then((response){ if(response["code"] != 200) { var thisContext = context; if(thisContext.mounted) { @@ -205,12 +185,9 @@ class _StockInWheelEBSPageState extends State { "quantity": codeData[3], "weight": codeData[4], "productData": codeData[5], - "area": item["storageAreaId"].toString(), "sendOrderId": sendOrderId, // 送货单号 - "goodsTypeId":item["goodsTypeId"].toString(), - "pruBatch": item["pruBatch"].toString(), - "goodsName": item["goodsName"].toString(), - "unit": item["unit"].toString(), + "goodsName": item["itemDesc"].toString(), + "unit": item["purUomCode"].toString(), "poHeaderId": item["poHeaderId"].toString(), "poLineId": item["poLineId"].toString(), "lineLocationId": item["lineLocationId"].toString(), @@ -273,10 +250,7 @@ class _StockInWheelEBSPageState extends State { message.add({"label":"数量:", "msg":tableRow["quantity"].toString()}); message.add({"label":"重量:", "msg":tableRow["weight"].toString()}); message.add({"label":"生产日期:", "msg":tableRow["productData"].toString()}); - message.add({"label":"库区:", "msg":tableRow["area"].toString()}); message.add({"label":"送货单号:", "msg":tableRow["sendOrderId"].toString()}); - message.add({"label":"供应商批次:", "msg":tableRow["pruBatch"].toString()}); - message.add({"label":"WMS批次:", "msg":tableRow["goodsTypeId"].toString()}); message.add({"label":"物料描述:", "msg":tableRow["goodsName"].toString()}); message.add({"label":"单位:", "msg":tableRow["unit"].toString()}); message.add({"label":"订单头主键:", "msg":tableRow["poHeaderId"].toString()}); @@ -301,7 +275,7 @@ class _StockInWheelEBSPageState extends State { { int taskType = 1; // 1 表示进库,2 表示进站台 BrnLoadingDialog.show(context, content: "正在请求入库"); - WmsApiClient.bindingVehicleInLD({ + StockIn.stockInComplete({ "vehicleNo": vehicleNo, "inArea": taskType.toString(), "storageArea" : "", diff --git a/lib/page/stockIn/stackInWheelMes.dart b/lib/page/stockIn/stack_in_mes.dart similarity index 100% rename from lib/page/stockIn/stackInWheelMes.dart rename to lib/page/stockIn/stack_in_mes.dart diff --git a/lib/page/stockIn/stockInEmpty.dart b/lib/page/stockIn/stock_in_empty.dart similarity index 100% rename from lib/page/stockIn/stockInEmpty.dart rename to lib/page/stockIn/stock_in_empty.dart diff --git a/lib/page/stockIn/stock_in_normal.dart b/lib/page/stockIn/stock_in_normal.dart new file mode 100644 index 0000000..fcb468b --- /dev/null +++ b/lib/page/stockIn/stock_in_normal.dart @@ -0,0 +1,280 @@ +import 'dart:convert'; + +import 'package:bruno/bruno.dart'; +import 'package:flutter/material.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; +import 'package:wms_app/apiclient/stock_in.dart'; + +import '../../common/colorCom.dart'; +import '../../utils/dialogUtils.dart'; +import '../../utils/stringUtils.dart'; + +class StockInNormal extends StatefulWidget { + const StockInNormal({super.key}); + + @override + State createState() => _StockInNormalState(); +} + +/// 通用普通码盘界面 +class _StockInNormalState extends State { + + final _vehicleTextController = TextEditingController(); // 载具号输入框 + final _goodsCodeController = TextEditingController(text: "5312452695,30601000080,24B7251524,1,0.481,20241128"); // 条码输入框 + List packageData = []; // 已经码盘的数据 + int packageDataId = 0; // 已经码盘的数据的序号 + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + iconTheme: const IconThemeData( + color: Colors.white + ), + leading: IconButton(onPressed: () { + Navigator.of(context).pop(); + }, icon: const Icon(Icons.arrow_back)), + centerTitle: true, + backgroundColor: ColorCommon.colorScheme, + title: const Text( + "单机码盘入库", + style: TextStyle( + color: Colors.white + ), + ), + ), + body: Center( + child: Padding(padding: const EdgeInsets.only(top: 5, left: 10, right: 10), + child: ListView( + children: [ + BrnTextInputFormItem( + controller: _vehicleTextController, + title: "载具号:", hint: "请扫描或输入", + isRequire: true, + ), + BrnTextInputFormItem( + controller: _goodsCodeController, + title: "条码:", hint: "请扫描物料二维码", + isRequire: true, + ), + Padding(padding: const EdgeInsets.only( + top: 5 + ), child: ElevatedButton( + onPressed: resolveCode, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text( + "添加物料", + style: TextStyle( + color: Colors.white + )) + )), + Padding(padding: const EdgeInsets.only( + top: 0 + ), child: ElevatedButton( + onPressed: wheelComplete, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text( + "码盘完成", + style: TextStyle( + color: Colors.white + )) + )), + const Padding(padding: EdgeInsets.only( + top: 10, + bottom: 10 + ), child: Text("添加在载具的物料:"), + ), + Container( + decoration: BoxDecoration( + border: Border.all(color: const Color(0x4D0C0C05), width: 0.3),// border + borderRadius: BorderRadius.circular((5)), // 圆角 + ), + child: TDTable( + bordered: true, + width: MediaQuery.of(context).size.width, + backgroundColor: Colors.transparent, + columns: [ + TDTableCol( + title: '*', + colKey: 'action', + width: 45, + align: TDTableColAlign.center, + cellBuilder: (BuildContext context) { + return const SizedBox( + child: Icon(TDIcons.delete, color: Colors.redAccent, size: 10), + ); + }, + ), + TDTableCol(title: '序号', colKey: 'id', align: TDTableColAlign.center, width: 80), + TDTableCol(title: '采购单号', colKey: 'segment1', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + TDTableCol(title: '物料号', colKey: 'itemId', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + TDTableCol(title: '批次号', colKey: 'batch', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + TDTableCol(title: '数量', colKey: 'quantity', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + TDTableCol(title: '重量', colKey: 'weight', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + TDTableCol(title: '生产日期', colKey: 'productData', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100), + //TDTableCol(title: '有效日期', colKey: 'deadLineData', align: TDTableColAlign.center, ellipsis: true, ellipsisTitle: true, width: 100) + ], + data: packageData, + onCellTap: (index, dynamic, cell) { + clickLine(index, dynamic, cell); + }), + ), + ], + )), + ), + ); + } + + /// 解析条码 + void resolveCode() { + String code = _goodsCodeController.text; + if(StringUtils.isEmpty(code)) { + DialogUtils.showWarningMessage(context, "警告", "条码文本框内无数据,请先扫描或者输入数据"); + return; + } + List codeData = code.split(","); + if(codeData.length != 6) { + DialogUtils.showWarningMessage(context, "警告", "条码格式错误"); + return; + } + setState(() { + packageDataId ++; + packageData.add({ + "id": packageDataId.toString(), + "segment1": codeData[0], + "itemId": codeData[1], + "batch": codeData[2], + "quantity": codeData[3], + "weight": codeData[4], + "productData": codeData[5] + }); + _goodsCodeController.clear(); + }); + return; + } + + + /// 码盘完成 + void wheelComplete() { + if(packageData.isEmpty){ + DialogUtils.showWarningMessage(context, "警告", "您的码盘数据为空", btnLabel: "确定"); + return; + } + String vehicleNo = _vehicleTextController.text; + if(StringUtils.isEmpty(vehicleNo)) { + DialogUtils.showWarningMessage(context, "警告", "请先扫描载具号", btnLabel: "返回填写"); + return; + } + int dataCount = packageData.length; + DialogUtils.showConfirmMessage(context, "码盘完成", "载具:$vehicleNo 码盘 $dataCount 条数据,是否继续?", confirmBtn: "继续", confirm: () + { + int taskType = 1; // 1 表示进库,2 表示进站台 + BrnLoadingDialog.show(context, content: "正在请求入库"); + StockIn.stockInComplete({ + "vehicleNo": vehicleNo, + "inArea": taskType.toString(), + "storageArea" : "", + "goods": packageData + }).then((response) { + if (response["code"] != 200) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showWarningMessage( + thisContext, "警告", "服务器请求失败", btnLabel: "我知道了"); + } + return; + } + final data = Map.from(jsonDecode(response["data"])); + if (data["code"] == 200) { + // 请求成功 + setState(() { + _vehicleTextController.clear(); + packageData = []; + }); + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showSuccessMessage( + thisContext, "码盘成功", "", btnLabel: "我知道了"); + } + return; + } + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showWarningMessage( + thisContext, "警告", "服务器返回失败:${data["message"]}", + btnLabel: "我知道了"); + } + return; + }).catchError((err) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showErrorMessage(thisContext, "请求发生错误", + "请求服务器发生错误:${err.toString()}", btnLabel: "我知道了"); + } + return; + }).whenComplete(() { + var thisContext = context; + if (thisContext.mounted) { + BrnLoadingDialog.dismiss(thisContext); + } + }); + }); + } + + /// 行数据点击事件 + void clickLine(index, dynamic, cell) { + if(cell.colKey == "action") { // 点击删除 + delete(dynamic); + return; + } + if(cell.colKey == "quantity") { // 点击数量 + modifyNumber(index, dynamic); + return; + } + showDetails(index, dynamic); + } + + /// 删除已经码盘的物料 + void delete(dynamic) { + setState(() { + packageData.removeWhere((r){ + return r["id"] == dynamic["id"]; + }); + }); + if(packageData.isEmpty) { + packageDataId = 0; + } + } + + /// 修改数量 + void modifyNumber(index, dynamic) { + DialogUtils.showInputMessage(context, "请输入要修改的数量", message: "仅支持数字", confirm: (value) { + if(!StringUtils.isNumber(value)) { + DialogUtils.showWarningMessage(context, "警告", "该文本框仅支持数字"); + return; + } + setState((){ + packageData.where((w)=>w["id"] == dynamic["id"]).first["quantity"] = value; + }); + }); + } + + /// 显示详细信息 + void showDetails(index, tableRow) { + List message = []; + message.add({"label":"序号:", "msg":tableRow["id"].toString()}); + message.add({"label":"采购单号:", "msg":tableRow["segment1"].toString()}); + message.add({"label":"物料号:", "msg":tableRow["itemId"].toString()}); + message.add({"label":"批次号:", "msg":tableRow["batch"].toString()}); + message.add({"label":"数量:", "msg":tableRow["quantity"].toString()}); + message.add({"label":"重量:", "msg":tableRow["weight"].toString()}); + message.add({"label":"生产日期:", "msg":tableRow["productData"].toString()}); + DialogUtils.showMessageList(context, "数据详情", message, btnLabel: "我知道了"); + } + + +} \ No newline at end of file diff --git a/lib/utils/dialogUtils.dart b/lib/utils/dialogUtils.dart index 6d6d206..966194a 100644 --- a/lib/utils/dialogUtils.dart +++ b/lib/utils/dialogUtils.dart @@ -25,8 +25,7 @@ class DialogUtils { label: btnLabel, title: title, messageWidget: BrnPairInfoTable( - expandAtIndex: 4, - isFolded: false, + expandAtIndex: -1, children: msg, ), onTap: () {