diff --git a/.gitignore b/.gitignore index 70a39056..cb1cab34 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ hs_err_pid* #maven忽略文件 HELP.md target/ +target !.mvn/wrapper/maven-wrapper.jar !**/src/main/** !**/src/test/** diff --git a/mall-common/pom.xml b/mall-common/pom.xml index 37445705..9b3c8b26 100644 --- a/mall-common/pom.xml +++ b/mall-common/pom.xml @@ -193,6 +193,13 @@ com.alibaba.csp sentinel-web-servlet + + + + org.springframework.boot + spring-boot-starter-freemarker + + diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderPrintVO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderPrintVO.java new file mode 100644 index 00000000..63d37213 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderPrintVO.java @@ -0,0 +1,120 @@ +package com.suisung.mall.common.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 门店打票机打印的订单实体 + *

+ * + * @author panjunjie + * @since 2024-10-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ShopStoreOrderPrint显示对象", description = "门店订单打印实体类") +public class ShopStoreOrderPrintVO implements Serializable { + + private static final long serialVersionUID = 1L; + + // 门店相关信息 + @ApiModelProperty(value = "门店ID") + private Integer store_id; + + @ApiModelProperty(value = "门店名称") + private String store_name; + + @ApiModelProperty(value = "门店电话") + private String store_tel; + + @ApiModelProperty(value = "门店地址") + private String store_address; + + @ApiModelProperty(value = "收银员") + private String cashier; + + @ApiModelProperty(value = "商家订单备注") + private String seller_order_remark; + + @ApiModelProperty(value = "取货单号") + private String fetch_no; + + // 买家相关信息 + @ApiModelProperty(value = "买家订单备注") + private String buyer_order_remark; + + // 订单相关信息 + @ApiModelProperty(value = "订单编号") + private String order_id; + + @ApiModelProperty(value = "订单来源") + private String order_source; + + @ApiModelProperty(value = "支付方式") + private String pay_type; + + @ApiModelProperty(value = "配送来源") + private String shipper_type; + + @ApiModelProperty(value = "付款时间") + private String pay_time; + + @ApiModelProperty(value = "配送时间区间") + private String delivery_time_range; + + // 价格相关 + @ApiModelProperty(value = "商品发布原价") + private Long order_product_amount; + + @ApiModelProperty(value = "订单商品金额") + private Long order_goods_amount; + + @ApiModelProperty(value = "订单折扣金额") + private Long order_discount_amount; + + @ApiModelProperty(value = "订单配送费用") + private Long order_shipping_fee; + + @ApiModelProperty(value = "订单优惠券金额") + private Long order_voucher_price; + + @ApiModelProperty(value = "订单积分费用") + private Long order_points_fee; + + @ApiModelProperty(value = "订单调整费用") + private Long order_adjust_fee; + + @ApiModelProperty(value = "实际应付款") + private Long order_payment_amount; + + // 订单商品详情信息 + @ApiModelProperty(value = "订单商品详情信息") + private ShopStoreOrderProductPrintVO order_item; + + @ApiModelProperty(value = "状态:1-有效;2-无效;") + private Integer status; + + @ApiModelProperty(value = "新增用户ID") + private Integer created_by; + + @ApiModelProperty(value = "更新用户ID") + private Integer updated_by; + + @ApiModelProperty(value = "新增时间") + private Date created_at; + + @ApiModelProperty(value = "修改时间") + private Date updated_at; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/ProductSimpleInfo.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderProductPrintVO.java similarity index 71% rename from mall-common/src/main/java/com/suisung/mall/common/pojo/dto/ProductSimpleInfo.java rename to mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderProductPrintVO.java index 6581783e..3b29b69d 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/ProductSimpleInfo.java +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/vo/ShopStoreOrderProductPrintVO.java @@ -1,4 +1,4 @@ -package com.suisung.mall.common.pojo.dto; +package com.suisung.mall.common.pojo.vo; import lombok.AllArgsConstructor; import lombok.Data; @@ -9,7 +9,7 @@ import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor -public class ProductSimpleInfo implements Serializable { +public class ShopStoreOrderProductPrintVO implements Serializable { private String product_sn; private String title; private Integer num; diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/FreeMakerUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/FreeMakerUtils.java new file mode 100644 index 00000000..8caa54a6 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/FreeMakerUtils.java @@ -0,0 +1,53 @@ +package com.suisung.mall.common.utils; + +import freemarker.cache.StringTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Map; + +@Slf4j +public class FreeMakerUtils { + + /** + * 配置 freemark configuration + * + * @return + */ + private Configuration stringTempConfiguration() { + Configuration cfg = new Configuration(Configuration.VERSION_2_3_23); + StringTemplateLoader stringLoader = new StringTemplateLoader(); + stringTempConfiguration().setTemplateLoader(stringLoader); + cfg.setDefaultEncoding("UTF-8"); + return cfg; + } + + /** + * 解析模版 + * + * @param configuration + * @param templateName + * @param templateValue + * @param binding + * @return + * @throws IOException + * @throws TemplateException + */ + public String processTemplate(Configuration configuration, String templateName, String templateValue, Map binding) throws IOException, TemplateException { + StringWriter stringWriter = new StringWriter(); + Template template = new Template(templateName, templateValue, configuration); + template.process(binding, stringWriter); + return stringWriter.toString(); + } + + public String processTemplate(String templateName, String templateValue, Map binding) throws IOException, TemplateException { + StringWriter stringWriter = new StringWriter(); + Template template = new Template(templateName, templateValue, stringTempConfiguration()); + template.process(binding, stringWriter); + return stringWriter.toString(); + } +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStorePrinterController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStorePrinterController.java index dbd5c93c..85fb887d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStorePrinterController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStorePrinterController.java @@ -45,6 +45,7 @@ public class ShopStorePrinterController { ShopStorePrinter shopStorePrinter = new ShopStorePrinter(); shopStorePrinter.setModel_id(model_id); + shopStorePrinter.setPrinter_name(printer_name); shopStorePrinter.setPrinter_sn(printer_sn); shopStorePrinter.setPrinter_key(printer_key); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStorePrinterMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStorePrinterMapper.java index a02f6d24..b562a8f4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStorePrinterMapper.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStorePrinterMapper.java @@ -27,4 +27,6 @@ public interface ShopStorePrinterMapper extends BaseMapper{ * @return */ IPage shopStorePrinterPageList(Page page, @Param("keyword") String keyword); + + IPage shopStorePrinterPageList2(Page page, @Param("keyword") String keyword); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStorePrinterService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStorePrinterService.java index 73fed204..d7fd37c9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStorePrinterService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStorePrinterService.java @@ -3,6 +3,7 @@ package com.suisung.mall.shop.store.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.store.ShopStorePrinter; +import com.suisung.mall.common.pojo.vo.ShopStorePrinterVO; import com.suisung.mall.core.web.service.IBaseService; import java.util.Map; @@ -19,6 +20,8 @@ public interface ShopStorePrinterService extends IBaseService */ IPage shopStorePrinterPageList(String keyword, Integer pageNum, Integer pageSize); + IPage shopStorePrinterPageList2(String keyword, Integer pageNum, Integer pageSize); + /** * 门店新增一个打票机 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStorePrinterServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStorePrinterServiceImpl.java index d88e346b..cd6b523c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStorePrinterServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStorePrinterServiceImpl.java @@ -9,10 +9,9 @@ import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.constant.ConstantError; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.modules.store.ShopStorePrinter; -import com.suisung.mall.common.pojo.dto.ProductSimpleInfo; +import com.suisung.mall.common.pojo.vo.ShopStoreOrderProductPrintVO; import com.suisung.mall.common.pojo.vo.ShopStorePrinterVO; import com.suisung.mall.common.utils.DateTimeUtils; -import com.suisung.mall.common.utils.TimeUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.store.mapper.ShopStorePrinterMapper; import com.suisung.mall.shop.store.service.ShopStorePrinterService; @@ -45,6 +44,13 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl shopStorePrinterPageList2(String keyword, Integer pageNum, Integer pageSize) { + Page page = new Page(); + page.setCurrent(pageNum); + page.setSize(pageSize); + return shopStorePrinterMapper.shopStorePrinterPageList2(page, keyword); + } + @Override public CommonResult addNewShopStorePrinter(ShopStorePrinter record) { @@ -216,11 +222,11 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl productList = new ArrayList<>(); + ShopStoreOrderProductPrintVO order1 = new ShopStoreOrderProductPrintVO("6970448170051","可口可乐CocaCola经典美味汽水1.25L/瓶",110, "8100.45"); + ShopStoreOrderProductPrintVO order2 = new ShopStoreOrderProductPrintVO("6970448170053","排骨约350g(默认砍小块)",1, "150.13"); + ShopStoreOrderProductPrintVO order3 = new ShopStoreOrderProductPrintVO("6970448170054","新鲜虫草花1包约200g 韭菜1000g 鸡蛋2003克", 11,"4.01"); + ShopStoreOrderProductPrintVO order4 = new ShopStoreOrderProductPrintVO("6970448170055","冰红茶风味饮料",1, "13.24"); + List productList = new ArrayList<>(); productList.add(order1); productList.add(order2); productList.add(order3); @@ -234,51 +240,38 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl小发同城
"); cont.append("--------------------------------
"); - cont.append("#000"+DateTimeUtils.formatDateTime(now,"ddHHmm")+"
"); - cont.append("买家备注:不用敲门,放在门口旁边的外卖箱,打个电话告知送达就行,谢谢
"); - cont.append("配送时间:2024-10-25 14:00-14:30
"); - cont.append("--------------------------------
"); - cont.append("订单编号:ES20231026111444527685
"); - cont.append("订单来源:微信小程序
"); - cont.append("支付方式:微信支付
"); - cont.append("配送来源:同城配送
"); - cont.append("付款时间:"+currentDateTime+"
"); - cont.append("--------------------------------
"); - -// cont.append("商品名称 数量 金额
"); -// cont.append("可口可乐Coca_Cola
经典美味汽水1.25L/瓶
【x1】 5.54
"); -// cont.append("6970448170051
"); -// cont.append("
"); -// cont.append("排骨 约350g (默认砍小块) 【x5】 35.51
"); -// cont.append("69704481700541
"); -// cont.append("
"); -// cont.append("新鲜虫草花 1包 约200g 【x11】 687.52
"); -// cont.append("69704481700512
"); -// cont.append("
"); -// cont.append("冰红茶风味饮料x2;
五香瓜子x1
【x2】 13.26
"); -// cont.append("6970448170051
"); +// cont.append("#000"+DateTimeUtils.formatDateTime(now,"ddHHmm")+"
"); +// cont.append("买家备注:不用敲门,放在门口旁边的外卖箱,打个电话告知送达就行,谢谢!!!
"); +// cont.append("配送时间:2024-10-25 14:00-14:30
"); +// cont.append("--------------------------------
"); +// cont.append("订单编号:ES20231026111444527685
"); +// cont.append("订单来源:微信小程序
"); +// cont.append("支付方式:微信支付
"); +// cont.append("配送来源:顺丰同城
"); +// cont.append("付款时间:"+currentDateTime+"
"); +// cont.append("--------------------------------
"); // 商品列表 cont.append(productsStr); - cont.append("--------------------------------
"); - cont.append("商品总件数:3
"); - cont.append("商品总额:¥18.7
"); - cont.append("押金:¥500
"); - cont.append("运费:¥5.54
"); - cont.append("会员权益:-¥50
"); - cont.append("秒杀:-¥100
"); - cont.append("实付金额:¥428.9元
"); - cont.append("--------------------------------
"); - cont.append("商家备注:老顾客赠送一箱牛奶;玻璃瓶包装轻拿轻放
"); - cont.append("--------------------------------
"); - cont.append("收货人:张三
"); - cont.append("收货人手机:13128778765
"); - cont.append("收货地址:北京市朝阳区朝阳路朝阳人民小区1号楼1栋1101
"); - cont.append("--------------------------------
"); - cont.append("门店:岛内价生活超市
"); - cont.append("门店电话:13665822542
"); - cont.append("收银员:李小璐
"); +// cont.append("--------------------------------
"); +// cont.append("商品总件数:3
"); +// cont.append("商品总额:¥18.7
"); +// cont.append("押金:¥500
"); +// cont.append("运费:¥5.54
"); +// cont.append("会员权益:-¥50
"); +// cont.append("秒杀:-¥100
"); +// cont.append("实付金额:¥428.9元
"); +// cont.append("--------------------------------
"); +// cont.append("商家备注:老顾客赠送一箱牛奶;玻璃瓶包装轻拿轻放!
"); +// cont.append("--------------------------------
"); +// cont.append("收货人:张三
"); +// cont.append("收货人手机:13128778765
"); +// cont.append("收货地址:北京市朝阳区朝阳路朝阳人民小区1号楼1栋1101
"); +// cont.append("--------------------------------
"); +// cont.append("门店:岛内价生活超市
"); +// cont.append("门店电话:13665822542
"); +// cont.append("收银员:李小璐
"); feieUtil.printContent(sn,cont.toString()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/utis/FeieUtil.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/utis/FeieUtil.java index ffc62208..7d3fb212 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/utis/FeieUtil.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/utis/FeieUtil.java @@ -2,7 +2,7 @@ package com.suisung.mall.shop.store.utis; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; -import com.suisung.mall.common.pojo.dto.ProductSimpleInfo; +import com.suisung.mall.common.pojo.vo.ShopStoreOrderProductPrintVO; import com.suisung.mall.common.pojo.res.FeiePrinterApiDataRes; import com.suisung.mall.common.pojo.res.FeiePrinterApiRes; import com.suisung.mall.common.utils.JsonUtil; @@ -23,6 +23,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -44,6 +46,38 @@ public class FeieUtil { //=====================以下是函数实现部分================================================ + // 根据Unicode编码完美的判断中文汉字和符号 + private static boolean isChinese(char c) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS + || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION; + } + + + // 以下是 util 方法 + //飞鹅技术支持 + //######################################################################################################### + //进行订单的多列排版demo,实现商品超出字数的自动换下一行对齐处理,同时保持各列进行对齐 + //排版原理是统计字符串字节数,补空格换行处理 + //58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母 + //######################################################################################################### + + //orderList为数组 title_len =18 代表名称列占用字节 num_len =8 数量列 amount_len=6金额列-->这里的字节数可按自己需求自由改写, + + // 完整的判断中文汉字和符号 + public static boolean isChinese(String strName) { + char[] ch = strName.toCharArray(); + for (int i = 0; i < ch.length; i++) { + char c = ch[i]; + if (isChinese(c)) { + return true; + } + } + return false; + } + /*** * 添加一个或多个打印机到厂家 * @param printerInfo 批量添加规则: @@ -128,7 +162,6 @@ public class FeieUtil { return false; } - /** * 生成签名字符串 * @@ -194,17 +227,6 @@ public class FeieUtil { return null; } - - // 以下是 util 方法 - //飞鹅技术支持 - //######################################################################################################### - //进行订单的多列排版demo,实现商品超出字数的自动换下一行对齐处理,同时保持各列进行对齐 - //排版原理是统计字符串字节数,补空格换行处理 - //58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母 - //######################################################################################################### - - //orderList为数组 title_len =18 代表名称列占用字节 num_len =8 数量列 amount_len=6金额列-->这里的字节数可按自己需求自由改写, - /** * 生成商品的打印字符串 * @@ -214,56 +236,61 @@ public class FeieUtil { * @param amountLen 金额字节数,最大8个字节 * @return */ - public String genProductStr(List productList, int titleLen, int numLen, int amountLen) { + public String genProductStr(List productList, int titleLen, int numLen, int amountLen) { String resultStr = ""; resultStr += "商品名称 数量 金额
"; resultStr += "--------------------------------
"; for (int i = 0; i < productList.size(); i++) { String product_sn = productList.get(i).getProduct_sn(); String title = productList.get(i).getTitle(); - String num = productList.get(i).getNum().toString(); - if (productList.get(i).getNum() > 1) { - num = "x" + num; - } + String num = productList.get(i).getNum() > 1 ? "x" + productList.get(i).getNum().toString() : productList.get(i).getNum().toString(); String amount = productList.get(i).getAmount(); num = addSpace(num, numLen); amount = addSpace(amount, amountLen); - String otherStr = "" + num + "" + "" + amount + ""; + String otherStr = "" + num + "" + "" + amount + "
"; int tl = asciiByteLen(title); - int spaceNum = (tl / titleLen + 1) * titleLen - tl; if (tl < titleLen) { + // 标题小于指定的长度(字节数) + int spaceNum = (tl / titleLen + 1) * titleLen - tl; for (int k = 0; k < spaceNum; k++) { title += " "; } - title += otherStr; + + resultStr += "" + title + "" + otherStr; } else if (tl == titleLen) { - title += otherStr; + // 标题刚刚等于指定的长度(字节数) + resultStr += "" + title + "" + otherStr; } else { - List list = null; - if (isEn(title)) { - // 英文 - list = getStrList(title, titleLen); - } else { - // 中文 - list = getStrList(title, titleLen / 2); - } - String s0 = titleAddSpace(list.get(0), titleLen); - title = s0 + otherStr + "
";// 添加 单价 数量 总额 - String s = ""; +// List list = segmentString(title, titleLen); +// int cnt = list.size(); +// if (cnt <= 0) { +// resultStr += StrUtil.repeat(' ', titleLen - 1) + otherStr; +// } +// +// for (i = 0; i < cnt; i++) { +// resultStr += i == 0 ? list.get(i) + otherStr : list.get(i) + "
"; +// } + + + // 标题大于指定的长度(字节数),需要截断再组合 + List list = containEn(title) ? getStrList(title, titleLen) : getStrList(title, titleLen / 2); + + // 截断的第一段 + String s0 = "" + titleAddSpace(list.get(0), titleLen) + ""; + title = s0 + otherStr;// 添加 单价 数量 总额 + + // 非第一段处理开始 +// String s = ""; for (int k = 1; k < list.size(); k++) { - s += list.get(k); + title += "" + list.get(k) + "
"; } - try { - s = getStringByEnter(titleLen, s); - } catch (Exception e) { - e.printStackTrace(); - } - title += "" + s + " "; + resultStr += title; } - resultStr += "" + title + " " + "
"; + +// resultStr += title; resultStr += "" + product_sn + "
"; } @@ -297,6 +324,7 @@ public class FeieUtil { if (len >= size) { return str; } + int cz = size - len; if (cz % 2 == 0) { // 偶数 @@ -323,29 +351,27 @@ public class FeieUtil { /** * 递归函数,字符串超长,自动换行 * - * @param length * @param string + * @param maxBytLen * @return * @throws Exception */ - public String getStringByEnter(int length, String string) throws Exception { + public String getStringByEnter(String string, int maxBytLen) throws Exception { for (int i = 1; i <= string.length(); i++) { - if (asciiByteLen(string.substring(0, i)) > length) { - return string.substring(0, i - 1) + "
" + getStringByEnter(length, string.substring(i - 1)); + if (asciiByteLen(string.substring(0, i)) > maxBytLen) { + return string.substring(0, i - 1) + "
" + getStringByEnter(string.substring(i - 1), maxBytLen); } } return string; } - - /** - * 判断字符串是否为英文 + * 判断字符串是否包含英文? * * @param str * @return */ - public Boolean isEn(String str) { + public Boolean containEn(String str) { return asciiByteLen(str) == str.length(); } @@ -362,47 +388,65 @@ public class FeieUtil { int byteLength = 0; for (char c : str.toCharArray()) { - if (c > 255) { - byteLength += 2; - } else { - byteLength += 1; - } + byteLength = c > 255 ? byteLength + 2 : byteLength + 1; } return byteLength; } - public List getStrList(String inputString, int length) { - int size = inputString.length() / length; - if (inputString.length() % length != 0) { - size += 1; + /** + * 分析标题能分几行显示, + * + * @param str + * @param wordCnt 英文数字或中文的字数 + * @return + */ + public List getStrList(String str, int wordCnt) { + // 分几行? + int linesCnt = str.length() / wordCnt; + if (str.length() % wordCnt != 0) { + linesCnt += 1; } - return getStrList(inputString, length, size); + + return setLineToList(str, wordCnt, linesCnt); } - public List getStrList(String inputString, int length, int size) { + /** + * 把一行行标题,分别放入列表里 + * + * @param str + * @param wordCnt + * @param linesCnt + * @return + */ + public List setLineToList(String str, int wordCnt, int linesCnt) { List list = new ArrayList(); - for (int index = 0; index < size; index++) { - String childStr = subString(inputString, index * length, (index + 1) * length); + for (int i = 0; i < linesCnt; i++) { + String childStr = subString(str, i * wordCnt, (i + 1) * wordCnt); list.add(childStr); } return list; } + +// private static boolean isChineseChar(char c) { +// return c >= 0x4E00 && c <= 0x9FFF; +// } + /** * 截取字符串 * * @param str - * @param f - * @param t + * @param bidx + * @param eidx * @return */ - public String subString(String str, int f, int t) { - if (f > str.length()) + public String subString(String str, int bidx, int eidx) { + if (bidx > str.length()) return ""; - if (t > str.length()) { - return str.substring(f); + if (eidx > str.length()) { + return str.substring(bidx); } else { - return str.substring(f, t); + return str.substring(bidx, eidx); } } @@ -433,5 +477,68 @@ public class FeieUtil { } } + /** + * 按字节截取字符串 + * + * @param str 原始字符串 + * @param bytLen 截取位数 + * @return 截取后的字符串 + * @throws UnsupportedEncodingException 使用了JAVA不支持的编码格式 + */ + public List segmentString(String str, int bytLen) { + if (str == null || str.isEmpty() || bytLen <= 0) { + return null; + } + + List segments = new ArrayList<>(); + String[] twoSegments = segmentStringb(str, bytLen); + if (twoSegments != null && twoSegments.length > 0) { + if (twoSegments[0] != null && twoSegments[0].length() > 0) { + segments.add(twoSegments[0]); + } + + if (twoSegments[1] != null && twoSegments[1].length() > 0) { + segmentString(twoSegments[1], bytLen); + } + } + + return segments; + } + + public String[] segmentStringb(String str, int bytLen) { + + if (str == null || str.isEmpty() || bytLen <= 0) { + return new String[]{"", ""}; + } + + // 将原始字符串转换为UTF_8编码格式y + str = new String(str.getBytes(), StandardCharsets.UTF_8); + int strBytLen = str.getBytes(StandardCharsets.UTF_8).length; + + if (bytLen < strBytLen) { + // 要截取的字节数<原始字符串的字节数 + StringBuffer buffStart = new StringBuffer(); + StringBuffer buffEnd = new StringBuffer(); + char c; + for (int i = 0; i < strBytLen; i++) { + c = str.charAt(i); + buffStart.append(c); + if (isChinese(c)) { + // 中文汉字,截取字节总数减 + --bytLen; + } + + if (i >= bytLen) { + buffEnd.append(c); + } + } + + return new String[]{new String(buffStart.toString().getBytes(), StandardCharsets.UTF_8), new String(buffEnd.toString().getBytes(), StandardCharsets.UTF_8)}; + } else { + // 要截取的字节数>=原始字符串的字节数 + return new String[]{str, ""}; + } + } + } diff --git a/mall-shop/src/main/resources/mapper/store/ShopStorePrinterMapper.xml b/mall-shop/src/main/resources/mapper/store/ShopStorePrinterMapper.xml index 26db5231..a5cba0a6 100644 --- a/mall-shop/src/main/resources/mapper/store/ShopStorePrinterMapper.xml +++ b/mall-shop/src/main/resources/mapper/store/ShopStorePrinterMapper.xml @@ -3,25 +3,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/mall-shop/src/main/resources/templates/order_printer.txt b/mall-shop/src/main/resources/templates/order_printer.txt new file mode 100644 index 00000000..9d292b90 --- /dev/null +++ b/mall-shop/src/main/resources/templates/order_printer.txt @@ -0,0 +1,45 @@ +小发同城
+--------------------------------
+#00019232
+买家备注:不用敲门,放在门口旁边的外卖箱,打个电话告知送达就行,谢谢!!!
+配送时间:2024-10-25 14:00-14:30
+--------------------------------
+订单编号:ES20231026111444527685
+订单来源:微信小程序
+支付方式:微信支付
+配送来源:顺丰同城
+付款时间:2024-10-25 14:00:23
+--------------------------------
+商品名称 数量 金额
+--------------------------------
+可口可乐CocaC x110 8100.45
+ola经典美味汽水1.2
+5L/瓶
+6970448170051
+排骨约350g(默 1 150.13
+认砍小块)
+6970448170053
+新鲜虫草花1包约2 x11 4.01
+00g 韭菜1000g 鸡蛋
+2003克
+6970448170054
+冰红茶风味饮料 1 13.24
+6970448170055
+--------------------------------
+商品总件数:3
+商品总额:¥18.7
+押金:¥500
+运费:¥5.54
+会员权益:-¥50
+秒杀:-¥100
+实付金额:¥428.9元
+--------------------------------
+商家备注:老顾客赠送一箱牛奶;玻璃瓶包装轻拿轻放!
+--------------------------------
+收货人:张三
+收货人手机:13128778765
+收货地址:北京市朝阳区朝阳路朝阳人民小区1号楼1栋1101
+--------------------------------
+门店:岛内价生活超市
+门店电话:13665822542
+收银员:李小璐
\ No newline at end of file diff --git a/mall-shop/target/classes/static/ip/ip2region.xdb b/mall-shop/target/classes/static/ip/ip2region.xdb index bf62f4aa..7052c057 100644 Binary files a/mall-shop/target/classes/static/ip/ip2region.xdb and b/mall-shop/target/classes/static/ip/ip2region.xdb differ diff --git a/pom.xml b/pom.xml index 5fb7a1a9..d1a6796e 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,12 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-devtools + runtime + true + cn.hutool hutool-all