common.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import {BARCODE_CAIGOU,
  2. BARCODE_FINISHEDGOOD,
  3. BARCODE_PRODUCE,
  4. BARCODE_PROCESS,
  5. BARCODE_JOBCENTER,
  6. BARCODE_TARE,
  7. BARCODE_CAIGOU_KEY,
  8. BARCODE_FINISHEDGOOD_KEY,
  9. BARCODE_PRODUCE_KEY,
  10. BARCODE_PROCESS_KEY,
  11. BARCODE_JOBCENTER_KEY,
  12. BARCODE_TARE_KEY,
  13. BARCODE_MAP_OBJECT,
  14. BARCODE_OUTSOURCE,
  15. BARCODE_OUTSOURCE_KEY,
  16. } from "./barCode.js"
  17. const BigNumber = require('bignumber.js');
  18. // px 转rpx,
  19. export const px2upx=(height,baseWidth=375)=>{
  20. const systeminfo=uni.getSystemInfoSync()
  21. const _baseWidth=systeminfo.windowWidth
  22. const heightRpx=(750 * height)/baseWidth //750 是uni-app 的基准宽度,baseWidth 是设计稿的基准宽度,如果没有传值进来默认375
  23. return heightRpx
  24. }
  25. // 条码类型错误提示,key:条形码类型(字符串或者数组),value:条形码,如果key 传入null或者空字符串,直接发返回
  26. export const onErrorBarCodeType=(key,value,showToast=false)=>{
  27. let ok=true
  28. let msg=""
  29. if(key==="" || key===null) {
  30. return {ok,msg}
  31. }
  32. // key 是字符串,转成数组
  33. let keyArr=[]
  34. if (typeof key==='string') {
  35. keyArr=new Array (key)
  36. }else if (typeof key ==="object") {
  37. keyArr=key
  38. }
  39. if (typeof value!=="string" && typeof value!=="number") {
  40. throw new Error ("common.js:onErrorBarCodeType():value must be String or Number")
  41. }
  42. const barCodeType=value.slice(0,1) // 条码类型
  43. const barCodeLen=value.length // 条形码长度
  44. const num=Number(barCodeType) // 转成数字
  45. const lenErrMsg='扫描错误,请扫描完整的条形码'
  46. const typeErrMsg=`条形码类型错误:扫描的不是${keyArr.join('或')}`
  47. /*
  48. 如果条码扫描不完整,要进行提示,每个条形码都有最少的位数
  49. 扫描类型不对,要进行提示
  50. */
  51. // 要取得键名对应的键值,键值是数字
  52. let numarr=[]
  53. keyArr.forEach((item)=>{
  54. if (item.indexOf('条形码') <0) {
  55. item=item+"条形码"
  56. }
  57. numarr.push(BARCODE_MAP_OBJECT[item])
  58. })
  59. if (numarr.indexOf(num)<0) {
  60. ok=false
  61. msg=typeErrMsg
  62. return {ok,msg}
  63. }
  64. // 长度错误提示
  65. switch (keyArr) {
  66. case keyArr.indexOf (BARCODE_CAIGOU_KEY) >=0: // 采购件条形码 至少15位
  67. case keyArr.indexOf(BARCODE_FINISHEDGOOD_KEY) >=0: // 产成品条形码 15
  68. if (barCodeLen <15) {
  69. msg=lenErrMsg
  70. }
  71. break;
  72. case keyArr.indexOf(BARCODE_PROCESS_KEY) >=0: // 工艺流程卡条形码 20
  73. if (barCodeLen <20) {
  74. msg=lenErrMsg
  75. }
  76. break;
  77. case keyArr.indexOf(BARCODE_JOBCENTER_KEY) >=0: // 工作中心条形码
  78. if (barCodeLen < 2) {
  79. msg=lenErrMsg
  80. }
  81. break;
  82. case keyArr.indexOf(BARCODE_TARE_KEY) >=0 : // 标准容器重量条形码 2
  83. if (barCodeLen < 2) {
  84. msg=lenErrMsg
  85. }
  86. break;
  87. case keyArr.indexOf(BARCODE_OUTSOURCE_KEY) >=0 : // 委外订单条形码
  88. if (barCodeLen < 16) {
  89. msg=lenErrMsg
  90. }
  91. break;
  92. }
  93. // 如果要直接提示
  94. if (showToast) {
  95. if (!ok) {
  96. uni.showToast({
  97. title:msg,
  98. icon:"none",
  99. })
  100. }
  101. }
  102. return {ok,msg}
  103. }
  104. // 扫码获取物品号,数量等数据,value:条形码,
  105. export const formateScanData=(value)=>{
  106. if (typeof value != "string") {
  107. throw new Error ('common.js:formateScanData():value must be String')
  108. }
  109. const barCodeType=value.slice(0,1) // 条码类型
  110. const num=Number(barCodeType) // 转成数字
  111. let itemno=null, // 物品号
  112. itemnum=null, // 物品数量
  113. itemcode=null, // 物品识别码
  114. itemid=null; //物品身份证
  115. let orderno=null, // 订单号
  116. pageTotal=null, // 共几张
  117. pageNumber=null; //第几张
  118. let tare=null ; // 重量
  119. switch (num) {
  120. case BARCODE_CAIGOU:
  121. case BARCODE_FINISHEDGOOD:
  122. //,采购件和产成品规则一样,只是条形码类型不一样,编码规则(1位数)+9位物品号+4位识别码+数量
  123. itemno=value.slice(1,10) // 物品号
  124. itemcode=value.slice(10,14) // 识别码
  125. itemnum=value.slice(14) // 数量
  126. itemid=num+""+itemno+""+itemcode // 一个物品(条形码类型+物品号+识别码)
  127. break;
  128. case BARCODE_PRODUCE:
  129. orderno=value.slice(1,16)
  130. break;
  131. case BARCODE_PROCESS:
  132. //条码类型4,编码规则为4+15位生产订单号-共几张/第几张) 4888888888888888-100/22
  133. orderno=value.slice(1,16)
  134. let index=value.indexOf("-")
  135. let index2=value.indexOf("/")
  136. pageTotal=value.slice(index+1,index2)
  137. pageNumber=value.slice(index2+1)
  138. break;
  139. case BARCODE_JOBCENTER:
  140. break;
  141. case BARCODE_TARE:
  142. //编码规则为6+标准容器重量
  143. tare=value.slice(1)
  144. break;
  145. case BARCODE_OUTSOURCE:
  146. //编码规则为7+15位订单号
  147. orderno=value.slice(1,16)
  148. break;
  149. }
  150. return {
  151. barCodeType:num,
  152. itemno,
  153. itemcode,
  154. itemid,
  155. itemnum,
  156. orderno,
  157. pageTotal,
  158. pageNumber,
  159. tare,
  160. }
  161. }
  162. // 当前页面错误,执行退出到上一级面的提示
  163. export const showBackToast=(msg,delay=2000)=>{
  164. uni.showToast({
  165. title:msg,
  166. icon:"none",
  167. duration:delay
  168. })
  169. setTimeout(()=>{
  170. return uni.navigateBack({
  171. delta:1
  172. })
  173. },delay)
  174. }
  175. // 应入数量和实际数量的比较合并(比如清点单)
  176. /*两个数组A=[{id:1,amount:10},{id:2,amount:1}],B=[{id:1,itemnum:5},{id:3,itemnum:6}]依据某个key,进行合并,得到的最后的数组是包含了AB的所有数据,且数组里的每一项的字段是AB字段的集合:
  177. [{id:1,amount:10,itemnum:null},
  178. {id:2,amount:1,itemnum:null},
  179. {id:1,itemnum:5,amount:null},
  180. {id:3,itemnum:6,amount:null}]
  181. 思路:直接用一个循环,因为项目里面的功能很相似,。虽然用两次循环,一次先合并数组,一次过滤数组也可以,但是这次用一次循环
  182. originArr:源数组(后台返回的真实数据)
  183. otherArr:外来数组(扫码得到的数组)
  184. originKey:源数组含有的key,需要并入到
  185. otherKey
  186. */
  187. export const mergeArray=(originArr,originKey,otherArr,otherKey,id)=>{
  188. if ( typeof originArr!="object" || typeof otherArr!="object" ) {
  189. throw new Error("common.js:mergeArray():originArr , otherArr must be Array")
  190. }else if ( typeof originKey !="string" || typeof otherKey !="string") {
  191. throw new Error("common.js:mergeArray():originKey , otherKey must be String")
  192. }else if (typeof id !="string" && typeof id !="number" ) {
  193. throw new Error("common.js:mergeArray():id must be String or NUmber")
  194. }
  195. let arr=[]
  196. originArr.forEach((item,index,array)=>{
  197. otherArr.forEach((item2,index2,array2)=>{
  198. // 两个数据源都有的项
  199. if (item[id]===item2[id]) {
  200. const obj={...item,...item2}
  201. // obj.difAmount=item[originKey]-item2[otherKey]
  202. obj.difAmount=BigNumber(item[originKey]).minus(item2[otherKey]).toNumber()
  203. obj.highlight=obj.difAmount == 0 ? false : true
  204. array[index]=obj
  205. }else {
  206. /*外来数组有,源数组没有,把外来数组多余的项,处理,加入到源数组里面
  207. */
  208. let i=array.findIndex(v=>{
  209. return v[id]===item2[id]
  210. })
  211. if (i<0) {
  212. const obj=item2
  213. obj[originKey]='--' // 外来数组项补充源数组项字段
  214. // obj.difAmount=(obj[originKey]==="--" ? 0 : obj[originKey]) - obj[otherKey]
  215. const x=obj[originKey]==="--" ? 0 : obj[originKey]
  216. obj.difAmount=BigNumber(x).minus(obj[otherKey]).toNumber()
  217. obj.highlight=obj.difAmount == 0 ? false : true
  218. array.push(obj)
  219. }
  220. // 源数组(后台)有 ,外来数组(扫码)没有找到,修改源数组
  221. let i2=array2.findIndex(v=>{
  222. return v[id]===item[id]
  223. })
  224. if (i2<0) {
  225. const obj=item
  226. obj[otherKey]='--' // 源数组项补充外来数组项字段
  227. const x=obj[otherKey]==="--" ? 0 : obj[otherKey]
  228. obj.difAmount=BigNumber(obj[originKey]).minus(x).toNumber()
  229. obj.highlight=obj.difAmount == 0 ? false : true
  230. array[index]=obj
  231. }
  232. }
  233. })
  234. })
  235. return originArr.slice(0)
  236. }