Просмотр исходного кода

修改订单列表待支付去掉已取消的订单

qmj 3 дней назад
Родитель
Сommit
3f4c784b79

Разница между файлами не показана из-за своего большого размера
+ 69 - 0
.claude/homunculus/observations.jsonl


+ 25 - 24
ruoyi-admin/src/main/java/com/ruoyi/app/order/OrderInvoiceService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.app.utils.ezPay.EzPay;
 import com.ruoyi.app.utils.ezPay.EzPayConfig;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.domain.PosLoveOrg;
 import com.ruoyi.system.domain.PosOrder;
@@ -574,25 +575,25 @@ public class OrderInvoiceService {
         switch (invoiceChoice) {
             case "PHONE_BARCODE":
                 if (StrUtil.isBlank(carrierNum) || !carrierNum.matches("^/[0-9A-Z+\\-.]{7}$")) {
-                    throw new ServiceException("手机条码格式不正确(须为 / 加 7 位大写英文/数字/+-.)");
+                    throw new ServiceException(MessageUtils.message("no.invoice.barcode.format"));
                 }
                 EzPayConfig barCfg = getEzpayConfig(storeId);
                 if (barCfg == null) {
-                    throw new ServiceException("门店暂不支持电子发票,无法校验手机条码");
+                    throw new ServiceException(MessageUtils.message("no.invoice.store.notsupport.barcode"));
                 }
                 boolean barExist;
                 try {
                     barExist = ezPay.checkBarCode(ezpayBaseUrl, barCfg, carrierNum);
                 } catch (Exception e) {
-                    throw new ServiceException("手机条码校验服务暂不可用,请稍后重试");
+                    throw new ServiceException(MessageUtils.message("no.invoice.barcode.service.unavailable"));
                 }
                 if (!barExist) {
-                    throw new ServiceException("手机条码不存在,请确认或改选纸本发票");
+                    throw new ServiceException(MessageUtils.message("no.invoice.barcode.notexist"));
                 }
                 break;
             case "CITIZEN":
                 if (StrUtil.isBlank(carrierNum) || !carrierNum.matches("^[A-Z]{2}\\d{14}$")) {
-                    throw new ServiceException("自然人凭证格式不正确(须为 2 位大写英文 + 14 位数字)");
+                    throw new ServiceException(MessageUtils.message("no.invoice.citizen.format"));
                 }
                 break;
             case "MEMBER":
@@ -600,24 +601,24 @@ public class OrderInvoiceService {
                 break;
             case "LOVE_CODE":
                 if (StrUtil.isBlank(loveCode) || !loveCode.matches("^\\d{3,7}$")) {
-                    throw new ServiceException("捐赠码格式不正确(须为 3-7 位数字)");
+                    throw new ServiceException(MessageUtils.message("no.invoice.lovecode.format"));
                 }
                 EzPayConfig loveCfg = getEzpayConfig(storeId);
                 if (loveCfg == null) {
-                    throw new ServiceException("门店暂不支持电子发票,无法校验捐赠码");
+                    throw new ServiceException(MessageUtils.message("no.invoice.store.notsupport.lovecode"));
                 }
                 resolveLoveOrg(loveCode, loveCfg); // 抛异常=捐赠码无效
                 break;
             case "COMPANY":
                 if (StrUtil.isBlank(buyerUbn) || !buyerUbn.matches("^\\d{8}$")) {
-                    throw new ServiceException("统一编号格式不正确(须为 8 位数字)");
+                    throw new ServiceException(MessageUtils.message("no.invoice.ubn.format"));
                 }
                 if (StrUtil.isBlank(buyerEmail) || !buyerEmail.matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")) {
-                    throw new ServiceException("公司发票须填写有效的买方邮箱(用于接收发票)");
+                    throw new ServiceException(MessageUtils.message("no.invoice.company.email"));
                 }
                 break;
             default:
-                throw new ServiceException("发票类型不合法:" + invoiceChoice);
+                throw new ServiceException(MessageUtils.message("no.invoice.choice.invalid", invoiceChoice));
         }
     }
 
@@ -641,12 +642,12 @@ public class OrderInvoiceService {
         }
         try {
             if (!ezPay.checkLoveCode(ezpayBaseUrl, cfg, loveCode)) {
-                throw new ServiceException("捐赠码无效");
+                throw new ServiceException(MessageUtils.message("no.invoice.lovecode.invalid"));
             }
         } catch (ServiceException se) {
             throw se;
         } catch (Exception e) {
-            throw new ServiceException("捐赠码验证失败,请稍后重试");
+            throw new ServiceException(MessageUtils.message("no.invoice.lovecode.verify.fail"));
         }
         return "未知机构";
     }
@@ -658,32 +659,32 @@ public class OrderInvoiceService {
     private void validateInvoiceInput(ApplyInvoiceDto dto) {
         if ("B2B".equals(dto.getCategory())) {
             if (StrUtil.isBlank(dto.getBuyerName())) {
-                throw new ServiceException("B2B 发票须填写买方名称");
+                throw new ServiceException(MessageUtils.message("no.invoice.b2b.buyername.blank"));
             }
             if (StrUtil.isBlank(dto.getBuyerUbn()) || !dto.getBuyerUbn().matches("\\d{8}")) {
-                throw new ServiceException("统编格式不正确,须为 8 位数字");
+                throw new ServiceException(MessageUtils.message("no.invoice.ubn.format"));
             }
             if (StrUtil.isBlank(dto.getBuyerEmail())) {
-                throw new ServiceException("B2B 发票须填写买方邮箱");
+                throw new ServiceException(MessageUtils.message("no.invoice.b2b.buyeremail.blank"));
             }
             if (StrUtil.isNotBlank(dto.getCarrierType()) || StrUtil.isNotBlank(dto.getCarrierNum())) {
-                throw new ServiceException("B2B 发票不支持载具");
+                throw new ServiceException(MessageUtils.message("no.invoice.b2b.nocarrier"));
             }
         } else if ("DONATION".equals(dto.getCategory())) {
             // 捐赠:loveCode 3-7 位必填,与载具/统编互斥
             if (StrUtil.isBlank(dto.getLoveCode()) || !dto.getLoveCode().matches("\\d{3,7}")) {
-                throw new ServiceException("捐赠码格式不正确,须为 3-7 位数字");
+                throw new ServiceException(MessageUtils.message("no.invoice.lovecode.format"));
             }
             if (StrUtil.isNotBlank(dto.getCarrierType()) || StrUtil.isNotBlank(dto.getCarrierNum())) {
-                throw new ServiceException("捐赠发票不支持载具");
+                throw new ServiceException(MessageUtils.message("no.invoice.donation.nocarrier"));
             }
             if (StrUtil.isNotBlank(dto.getBuyerUbn())) {
-                throw new ServiceException("捐赠发票不支持统编");
+                throw new ServiceException(MessageUtils.message("no.invoice.donation.noubn"));
             }
         } else if ("B2C".equals(dto.getCategory())) {
             // 载具分支
             if (StrUtil.isBlank(dto.getBuyerName())) {
-                throw new ServiceException("买方名称不能为空");
+                throw new ServiceException(MessageUtils.message("no.invoice.buyername.blank"));
             }
             String ct = dto.getCarrierType();
             if (StrUtil.isBlank(ct)) {
@@ -691,10 +692,10 @@ public class OrderInvoiceService {
                 return;
             }
             if (!"0".equals(ct) && !"1".equals(ct) && !"2".equals(ct)) {
-                throw new ServiceException("载具类型只能为 0手机条码/1自然人凭证/2ezPay会员");
+                throw new ServiceException(MessageUtils.message("no.invoice.carriertype.invalid"));
             }
             if (StrUtil.isBlank(dto.getCarrierNum())) {
-                throw new ServiceException("载具号码不能为空");
+                throw new ServiceException(MessageUtils.message("no.invoice.carriernum.blank"));
             }
             // ezPay doc:载具号码前后不得含空白
             dto.setCarrierNum(dto.getCarrierNum().trim());
@@ -702,12 +703,12 @@ public class OrderInvoiceService {
             switch (ct) {
                 case "0":
                     if (!dto.getCarrierNum().matches("^/[0-9A-Z+\\-.]{7}$")) {
-                        throw new ServiceException("手机条码格式不正确(须为 / 加 7 位大写英文/数字/+ - .)");
+                        throw new ServiceException(MessageUtils.message("no.invoice.barcode.format"));
                     }
                     break;
                 case "1":
                     if (!dto.getCarrierNum().matches("^[A-Z]{2}\\d{14}$")) {
-                        throw new ServiceException("自然人凭证格式不正确(须为 2 位大写英文加 14 位数字)");
+                        throw new ServiceException(MessageUtils.message("no.invoice.citizen.format"));
                     }
                     break;
                 case "2":

+ 9 - 9
ruoyi-admin/src/main/java/com/ruoyi/app/utils/ezPay/EzPay.java

@@ -129,15 +129,14 @@ public class EzPay {
      * @return true=捐赠码存在于财政部电子发票整合服务平台
      */
     public boolean checkLoveCode(String baseUrl, EzPayConfig config, String loveCode) throws Exception {
+        // PostData_ 内含字段:仅 TimeStamp + LoveCode(Version/RespondType 是顶层表单字段,见 BDV 手册五-(一))
         Map<String, Object> postData = new LinkedHashMap<>();
-        postData.put("RespondType", "JSON");
-        postData.put("Version", "1.0");
         postData.put("TimeStamp", String.valueOf(System.currentTimeMillis() / 1000L));
         postData.put("LoveCode", loveCode);
         String query = buildQuery(postData);
         String postDataHex = EzPayEncryptUtil.encrypt(query, config.getHashKey(), config.getHashIV());
         String checkValue = EzPayEncryptUtil.genCheckValue(postDataHex, config.getHashKey(), config.getHashIV());
-        String resp = postFormWithCheck(baseUrl + URL_CHECK_LOVECODE, config.getMerchantId(), postDataHex, checkValue);
+        String resp = postFormWithCheck(baseUrl + URL_CHECK_LOVECODE, config.getMerchantId(), "1.0", "JSON", postDataHex, checkValue);
         JSONObject json = JSON.parseObject(resp);
         if (json == null || !"SUCCESS".equals(json.getString("Status"))) {
             return false;
@@ -156,7 +155,7 @@ public class EzPay {
      *
      * <p>校验手机条码是否真实注册于财政部电子发票整合服务平台(通用载具),用于结账时拦截无效条码、
      * 避免发票存进不存在的载具(客户填错条码 → 发票丢失)。与 {@link #checkLoveCode} 同为 BDV 接口,
-     * 请求需带 CheckValue,回应 Result 为加密 hex,解密后形如 {@code BarCode=/ABC1234&IsExist=Y}。
+     * 请求需带 CheckValue,回应 Result 为加密 hex,解密后形如 {@code CellphoneBarcode=%2FABC1234&IsExist=Y}。
      *
      * <p><b>文档勘误</b>:CheckValue 按手册「HashKey 在前」实现({@link EzPayEncryptUtil#genCheckValue}),
      * 若测试环境 ezPay 回 CheckValue 校验失败,改为「HashIV 在前」重试(见加密工具 javadoc)。
@@ -165,15 +164,14 @@ public class EzPay {
      * @return true=该手机条码存在于财政部平台
      */
     public boolean checkBarCode(String baseUrl, EzPayConfig config, String barCode) throws Exception {
+        // PostData_ 内含字段:仅 TimeStamp + CellphoneBarcode(Version/RespondType 是顶层表单字段,见 BDV 手册四-(一))
         Map<String, Object> postData = new LinkedHashMap<>();
-        postData.put("RespondType", "JSON");
-        postData.put("Version", "1.0");
         postData.put("TimeStamp", String.valueOf(System.currentTimeMillis() / 1000L));
-        postData.put("BarCode", barCode);
+        postData.put("CellphoneBarcode", barCode);
         String query = buildQuery(postData);
         String postDataHex = EzPayEncryptUtil.encrypt(query, config.getHashKey(), config.getHashIV());
         String checkValue = EzPayEncryptUtil.genCheckValue(postDataHex, config.getHashKey(), config.getHashIV());
-        String resp = postFormWithCheck(baseUrl + URL_CHECK_BARCODE, config.getMerchantId(), postDataHex, checkValue);
+        String resp = postFormWithCheck(baseUrl + URL_CHECK_BARCODE, config.getMerchantId(), "1.0", "JSON", postDataHex, checkValue);
         log.info("[EzPay] checkBarCode barCode={}, resp={}", barCode, resp);
 
         JSONObject json = JSON.parseObject(resp);
@@ -247,9 +245,11 @@ public class EzPay {
      *
      * <p>仅 BDV 验证类接口(checkBarCode / checkLoveCode)请求需要带 CheckValue。
      */
-    private static String postFormWithCheck(String url, String merchantId, String postData, String checkValue) throws Exception {
+    private static String postFormWithCheck(String url, String merchantId, String version, String respondType, String postData, String checkValue) throws Exception {
         List<NameValuePair> params = new ArrayList<>();
         params.add(new BasicNameValuePair("MerchantID_", merchantId));
+        params.add(new BasicNameValuePair("Version", version));
+        params.add(new BasicNameValuePair("RespondType", respondType));
         params.add(new BasicNameValuePair("PostData_", postData));
         params.add(new BasicNameValuePair("CheckValue", checkValue));
         HttpPost post = new HttpPost(url);

+ 24 - 0
ruoyi-admin/src/main/resources/i18n/messages.properties

@@ -180,3 +180,27 @@ no.oauth.token.invalid={0}登录凭证无效
 no.oauth.token.expired={0}登录凭证已过期
 no.oauth.audience.mismatch={0}凭证校验未通过
 no.oauth.verify.fail={0}登录校验失败:{1}
+
+# 订单发票校验(010)
+no.invoice.choice.invalid=发票类型不合法:{0}
+no.invoice.barcode.format=手机条码格式不正确(须为 / 加 7 位大写英文/数字/+-.)
+no.invoice.barcode.service.unavailable=手机条码校验服务暂不可用,请稍后重试
+no.invoice.barcode.notexist=手机条码不存在,请确认或改选纸本发票
+no.invoice.citizen.format=自然人凭证格式不正确(须为 2 位大写英文 + 14 位数字)
+no.invoice.lovecode.format=捐赠码格式不正确(须为 3-7 位数字)
+no.invoice.lovecode.invalid=捐赠码无效
+no.invoice.lovecode.verify.fail=捐赠码验证失败,请稍后重试
+no.invoice.ubn.format=统一编号格式不正确(须为 8 位数字)
+no.invoice.company.email=公司发票须填写有效的买方邮箱(用于接收发票)
+no.invoice.store.notsupport.barcode=门店暂不支持电子发票,无法校验手机条码
+no.invoice.store.notsupport.lovecode=门店暂不支持电子发票,无法校验捐赠码
+
+# 订单发票校验 - 申请发票入参(010)
+no.invoice.b2b.buyername.blank=B2B 发票须填写买方名称
+no.invoice.b2b.buyeremail.blank=B2B 发票须填写买方邮箱
+no.invoice.b2b.nocarrier=B2B 发票不支持载具
+no.invoice.donation.nocarrier=捐赠发票不支持载具
+no.invoice.donation.noubn=捐赠发票不支持统编
+no.invoice.buyername.blank=买方名称不能为空
+no.invoice.carriertype.invalid=载具类型只能为 0手机条码/1自然人凭证/2ezPay会员
+no.invoice.carriernum.blank=载具号码不能为空

+ 24 - 0
ruoyi-admin/src/main/resources/i18n/messages_en_US.properties

@@ -184,3 +184,27 @@ no.oauth.token.invalid={0} login credential is invalid
 no.oauth.token.expired={0} login credential has expired
 no.oauth.audience.mismatch={0} credential verification failed
 no.oauth.verify.fail={0} login verification failed: {1}
+
+# Order invoice validation (010)
+no.invoice.choice.invalid=Invalid invoice type: {0}
+no.invoice.barcode.format=Invalid mobile barcode format (must be / followed by 7 uppercase letters/digits/+-.)
+no.invoice.barcode.service.unavailable=Mobile barcode verification service is temporarily unavailable, please try again later
+no.invoice.barcode.notexist=Mobile barcode does not exist, please verify or choose a paper invoice
+no.invoice.citizen.format=Invalid citizen digital certificate format (must be 2 uppercase letters + 14 digits)
+no.invoice.lovecode.format=Invalid donation code format (must be 3-7 digits)
+no.invoice.lovecode.invalid=Invalid donation code
+no.invoice.lovecode.verify.fail=Donation code verification failed, please try again later
+no.invoice.ubn.format=Invalid uniform business number format (must be 8 digits)
+no.invoice.company.email=Company invoice requires a valid buyer email (to receive the invoice)
+no.invoice.store.notsupport.barcode=This store does not support e-invoices; cannot verify mobile barcode
+no.invoice.store.notsupport.lovecode=This store does not support e-invoices; cannot verify donation code
+
+# Order invoice validation - apply input (010)
+no.invoice.b2b.buyername.blank=B2B invoice requires a buyer name
+no.invoice.b2b.buyeremail.blank=B2B invoice requires a buyer email
+no.invoice.b2b.nocarrier=B2B invoices do not support a carrier
+no.invoice.donation.nocarrier=Donation invoices do not support a carrier
+no.invoice.donation.noubn=Donation invoices do not support a uniform business number
+no.invoice.buyername.blank=Buyer name cannot be empty
+no.invoice.carriertype.invalid=Carrier type must be 0 (mobile barcode) / 1 (citizen certificate) / 2 (ezPay member)
+no.invoice.carriernum.blank=Carrier number cannot be empty

+ 24 - 0
ruoyi-admin/src/main/resources/i18n/messages_vi.properties

@@ -184,3 +184,27 @@ no.oauth.token.invalid=Thông tin đăng nhập {0} không hợp lệ
 no.oauth.token.expired=Thông tin đăng nhập {0} đã hết hạn
 no.oauth.audience.mismatch=Xác minh thông tin {0} không thành công
 no.oauth.verify.fail=Xác minh đăng nhập {0} thất bại: {1}
+
+# Kiểm tra hóa đơn đơn hàng (010)
+no.invoice.choice.invalid=Loại hóa đơn không hợp lệ: {0}
+no.invoice.barcode.format=Định dạng mã vạch điện thoại không hợp lệ (phải là / và 7 ký tự hoa/chữ số/+-.)
+no.invoice.barcode.service.unavailable=Dịch vụ xác minh mã vạch điện thoại tạm thời không khả dụng, vui lòng thử lại sau
+no.invoice.barcode.notexist=Mã vạch điện thoại không tồn tại, vui lòng xác nhận hoặc chọn hóa đơn giấy
+no.invoice.citizen.format=Định dạng chứng chỉ số công dân không hợp lệ (phải là 2 chữ cái hoa + 14 chữ số)
+no.invoice.lovecode.format=Định dạng mã quyên góp không hợp lệ (phải là 3-7 chữ số)
+no.invoice.lovecode.invalid=Mã quyên góp không hợp lệ
+no.invoice.lovecode.verify.fail=Xác minh mã quyên góp thất bại, vui lòng thử lại sau
+no.invoice.ubn.format=Định dạng mã số doanh nghiệp không hợp lệ (phải là 8 chữ số)
+no.invoice.company.email=Hóa đơn công ty yêu cầu email người mua hợp lệ (để nhận hóa đơn)
+no.invoice.store.notsupport.barcode=Cửa hàng này không hỗ trợ hóa đơn điện tử, không thể xác minh mã vạch điện thoại
+no.invoice.store.notsupport.lovecode=Cửa hàng này không hỗ trợ hóa đơn điện tử, không thể xác minh mã quyên góp
+
+# Kiểm tra hóa đơn - đầu vào đăng ký (010)
+no.invoice.b2b.buyername.blank=Hóa đơn B2B yêu cầu tên người mua
+no.invoice.b2b.buyeremail.blank=Hóa đơn B2B yêu cầu email người mua
+no.invoice.b2b.nocarrier=Hóa đơn B2B không hỗ trợ thiết bị lưu trữ
+no.invoice.donation.nocarrier=Hóa đơn quyên góp không hỗ trợ thiết bị lưu trữ
+no.invoice.donation.noubn=Hóa đơn quyên góp không hỗ trợ mã số doanh nghiệp
+no.invoice.buyername.blank=Tên người mua không được để trống
+no.invoice.carriertype.invalid=Loại thiết bị lưu trữ chỉ có thể là 0 (mã vạch điện thoại) / 1 (chứng chỉ số công dân) / 2 (thành viên ezPay)
+no.invoice.carriernum.blank=Số thiết bị lưu trữ không được để trống

+ 24 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -184,3 +184,27 @@ no.oauth.token.invalid={0}登录凭证无效
 no.oauth.token.expired={0}登录凭证已过期
 no.oauth.audience.mismatch={0}凭证校验未通过
 no.oauth.verify.fail={0}登录校验失败:{1}
+
+# 订单发票校验(010)
+no.invoice.choice.invalid=发票类型不合法:{0}
+no.invoice.barcode.format=手机条码格式不正确(须为 / 加 7 位大写英文/数字/+-.)
+no.invoice.barcode.service.unavailable=手机条码校验服务暂不可用,请稍后重试
+no.invoice.barcode.notexist=手机条码不存在,请确认或改选纸本发票
+no.invoice.citizen.format=自然人凭证格式不正确(须为 2 位大写英文 + 14 位数字)
+no.invoice.lovecode.format=捐赠码格式不正确(须为 3-7 位数字)
+no.invoice.lovecode.invalid=捐赠码无效
+no.invoice.lovecode.verify.fail=捐赠码验证失败,请稍后重试
+no.invoice.ubn.format=统一编号格式不正确(须为 8 位数字)
+no.invoice.company.email=公司发票须填写有效的买方邮箱(用于接收发票)
+no.invoice.store.notsupport.barcode=门店暂不支持电子发票,无法校验手机条码
+no.invoice.store.notsupport.lovecode=门店暂不支持电子发票,无法校验捐赠码
+
+# 订单发票校验 - 申请发票入参(010)
+no.invoice.b2b.buyername.blank=B2B 发票须填写买方名称
+no.invoice.b2b.buyeremail.blank=B2B 发票须填写买方邮箱
+no.invoice.b2b.nocarrier=B2B 发票不支持载具
+no.invoice.donation.nocarrier=捐赠发票不支持载具
+no.invoice.donation.noubn=捐赠发票不支持统编
+no.invoice.buyername.blank=买方名称不能为空
+no.invoice.carriertype.invalid=载具类型只能为 0手机条码/1自然人凭证/2ezPay会员
+no.invoice.carriernum.blank=载具号码不能为空

+ 24 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_TW.properties

@@ -184,3 +184,27 @@ no.oauth.token.invalid={0}登入憑證無效
 no.oauth.token.expired={0}登入憑證已過期
 no.oauth.audience.mismatch={0}憑證校驗未通過
 no.oauth.verify.fail={0}登入校驗失敗:{1}
+
+# 訂單發票校驗(010)
+no.invoice.choice.invalid=發票類型不合法:{0}
+no.invoice.barcode.format=手機條碼格式不正確(須為 / 加 7 位大寫英文/數字/+-.)
+no.invoice.barcode.service.unavailable=手機條碼驗證服務暫不可用,請稍後重試
+no.invoice.barcode.notexist=手機條碼不存在,請確認或改選紙本發票
+no.invoice.citizen.format=自然人憑證格式不正確(須為 2 位大寫英文 + 14 位數字)
+no.invoice.lovecode.format=捐贈碼格式不正確(須為 3-7 位數字)
+no.invoice.lovecode.invalid=捐贈碼無效
+no.invoice.lovecode.verify.fail=捐贈碼驗證失敗,請稍後重試
+no.invoice.ubn.format=統一編號格式不正確(須為 8 位數字)
+no.invoice.company.email=公司發票須填寫有效的買方電子郵件(用於接收發票)
+no.invoice.store.notsupport.barcode=門市暫不支援電子發票,無法驗證手機條碼
+no.invoice.store.notsupport.lovecode=門市暫不支援電子發票,無法驗證捐贈碼
+
+# 訂單發票校驗 - 申請發票入參(010)
+no.invoice.b2b.buyername.blank=B2B 發票須填寫買方名稱
+no.invoice.b2b.buyeremail.blank=B2B 發票須填寫買方電子郵件
+no.invoice.b2b.nocarrier=B2B 發票不支援載具
+no.invoice.donation.nocarrier=捐贈發票不支援載具
+no.invoice.donation.noubn=捐贈發票不支援統編
+no.invoice.buyername.blank=買方名稱不能為空
+no.invoice.carriertype.invalid=載具類型只能為 0手機條碼/1自然人憑證/2ezPay會員
+no.invoice.carriernum.blank=載具號碼不能為空

Некоторые файлы не были показаны из-за большого количества измененных файлов