import EscposGenerator from './ESCPOS'; const generator = new EscposGenerator(); import {byteLength, sliceStr, isOrderAdd, addNames, handlePhone} from './fn'; import getCurrentTime, {orderDetailFormatTime} from './getDate'; import {OrderType, FoodItem,} from '../interface'; /** * splitLine(string) - 分割线 * betweenText(left, right, length) - 两边对齐文本 * foodList() - 商品 * */ /** * params {order, type} * order - 订单 * type - 1(pos/一体机) 2(打包间) * */ const Order = (order: OrderType, type: number | null = 1): Array | Array> => { const isOrderAddFlag = isOrderAdd(order.orderNo); generator.init(); generator.newLine(2); if (type === 1) { // pos/一体机专用 Text('结账单', 2, 3, EscposGenerator.CENTER); } Text(`${order.orderGetNo}${isOrderAddFlag ? `${order.payType === 30 ? '(退菜)' : '(补单)'}` : ''}`, 1, 2, EscposGenerator.CENTER); if (order.seatNo || order.mealCardNo) { generator.newLine(); Text(`${order.seatNo ? '桌' : '牌'}${order.seatNo ? order.seatNo : order.mealCardNo}`, 2, 2, EscposGenerator.CENTER); } if (order.orderType) { generator.newLine(); Text('预定单', 1, 2, EscposGenerator.CENTER); generator.newLine(); Text(`${orderDetailFormatTime(order.reservaTime)}${order.getWays === 0 ? '送达' : '可取'}`, 1, 2, EscposGenerator.CENTER); } if (order.getWays === 2) { generator.newLine(); Text('打包带走', 1, 2, EscposGenerator.CENTER); generator.newLine(); } else if (order.getWays === 0) { if (!order.orderType) { Text('立即送出', 1, 2, EscposGenerator.CENTER); } splitLine(); const user = order.orderAddressEntity || null; if (user) { Text(`${order.gfname ? order.gfname : '其他'}`, 1, 3, EscposGenerator.CENTER); Text(`${user.province}${user.city}${user.region}${user.address}${user.door}`, 1, 2, EscposGenerator.LEFT); Text(`${user.name}(${handlePhone(user.phone)})`, 1, 2, EscposGenerator.LEFT); } } if (order.remark) { Text(`备注:${order.remark}`, 2, 2, EscposGenerator.LEFT); } if (type === 2) { //打包间专用 Text(`餐具:${order.coversNums}份`, 1, 2, EscposGenerator.LEFT); } splitLine('菜品'); foodList(order.orderItemEntityList, isOrderAddFlag); if (!isOrderAddFlag) { splitLine('其他费用'); betweenText('打包费', `${order.packPrice.toFixed(2)}`); generator.newLine(); betweenText('配送费', `${order.deliveryPrice.toFixed(2)}`); generator.newLine(); splitLine(); betweenText('已优惠', `${order.redbagPrice.toFixed(2)}`); generator.newLine(); betweenText('合计金额', `${order.payPrice.toFixed(2)}`); generator.newLine(); } splitLine(); betweenText(`总件数:${totalFoodNum(order.orderPrintItemList)}件`, `在线支付:${order.payPrice.toFixed(2)}`); generator.newLine(); splitLine(); Text(`订单编号:${order.orderNo}`, 1); Text(`下单时间:${order.createTime}`, 1); Text(`打印时间:${getCurrentTime()}`, 1); generator.text('QRcode'); Text('欢迎下次光临', 1, 1, EscposGenerator.CENTER); Text(`${order.storeName}`, 1, 1, EscposGenerator.CENTER); Text(`${order.storeEntity.phone}`, 1, 1, EscposGenerator.CENTER); generator.cutPaper(EscposGenerator.CUT_PAPER_FULL, 0x80); return generator.toArray(); }; function totalFoodNum(food: FoodItem[]) { let num = 0; food.forEach(item => { num += item.buyNums; }); return num; } function Text(text: string, line: number, fontType?: number, position?: string) { switch (fontType) { case 0: generator.font(); generator.bold(); break; case 1: generator.font(); generator.bold(false); break; case 2: generator.font(EscposGenerator.FONT_DOUBLE); break; case 3: generator.font(EscposGenerator.FONT_TRIPLE); break; default: break; } if (position) { generator.align(position); } else { generator.align(EscposGenerator.LEFT); } generator.text(text); if (line) { generator.newLine(line); } } /** * type 0前面没有空格,1前面有空格 * * **/ function handleFoodItem(type: number, name: string, count?: number, price?: number | null) { let foodName = type ? ` ${name}` : name; let foodName2; if (byteLength(foodName) > 24) { [foodName, foodName2] = sliceStr(foodName); } while (byteLength(foodName) < 24) { foodName += ' '; } generator.font(2); generator.align(EscposGenerator.LEFT); generator.text(foodName); betweenText(count ? ` x${count}` : '', price || price === 0 ? `${price.toFixed(2)}` : '', 24); if (foodName2) { if (byteLength(foodName2) > 24) { handleFoodItem(type, foodName2); } else { generator.text(type ? ` ${foodName2}` : foodName2); generator.newLine(); } } } function foodList(data: FoodItem[], isHiddenPrice = true) { data.forEach(item => { const foodName = `${item.activityType === 3 ? '[赠]' : ''}${item.foodName}`; handleFoodItem(0, foodName, item.buyNums, isHiddenPrice || item.activityType === 3 ? null : item.orderPrice); let specs_flavor_material = ''; if (item.specsList && item.specsList.length > 0) { specs_flavor_material += addNames(item.specsList, 'specsName'); } if (item.flavorList && item.flavorList.length > 0) { if (specs_flavor_material) { specs_flavor_material += ','; } specs_flavor_material += addNames(item.flavorList, 'flavorName'); } if (item.materialList && item.materialList.length > 0) { if (specs_flavor_material) { specs_flavor_material += ','; } specs_flavor_material += addNames(item.materialList, 'materialName'); } if (specs_flavor_material) { generator .text(`【${specs_flavor_material}】`); } if (item.groupList) { item.groupList.forEach(group => { group.orderGroupFoodList.forEach(food => { const foodName = food.specsList ? `${food.foodName}${addNames(food.specsList, 'specsName')}` : food.foodName; handleFoodItem(1, foodName, food.buyNums); }); }); } generator.newLine(2); }); } function betweenText(left: string, right: string, length = 48) { let str = left; while (byteLength(str + right) < length) { str += ' '; } str = str + right; generator.text(str); } function splitLine(str = '') { generator; generator.font(); generator.bold(false); generator.align(EscposGenerator.CENTER); generator.text('--------------------'); let title = str || ''; while (byteLength(title) < 8) { title = `-${title}-`; } generator.text(title); generator.text('--------------------'); generator.newLine(1); } export default Order;