From afdfe0c0b849a99bd103744ae4bc03f78b174676 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Mon, 1 Mar 2021 17:31:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=93=E7=AE=97=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cowr/common/view/Result.java | 8 +- .../com/cowr/model/TicketInvalidVerify.java | 14 + .../main/java/com/cowr/model/TicketLog.java | 14 + .../java/com/cowr/model/TicketReceive.java | 14 + .../main/java/com/cowr/model/_MappingKit.java | 22 +- .../com/cowr/model/base/BaseOrderSale.java | 630 ++++++++++-------- .../com/cowr/model/base/BaseOrderTemp.java | 559 ++++++++-------- .../model/base/BaseTicketInvalidVerify.java | 360 ++++++++++ .../com/cowr/model/base/BaseTicketLog.java | 398 +++++++++++ .../cowr/model/base/BaseTicketReceive.java | 266 ++++++++ .../receive/InvoiceReceiveService.java | 4 +- .../TicketInvalidVerifyPKValidator.java | 25 + .../TicketInvalidVerifyService.java | 93 +++ .../TicketInvalidVerifyValidator.java | 79 +++ .../ticket/log/TicketLogPKValidator.java | 25 + .../ssjygl/ticket/log/TicketLogService.java | 251 +++++++ .../ssjygl/ticket/log/TicketLogValidator.java | 86 +++ .../receive/TicketReceivePKValidator.java | 25 + .../ticket/receive/TicketReceiveService.java | 184 +++++ .../receive/TicketReceiveValidator.java | 47 ++ .../src/main/java/generator/Main.java | 4 + .../resources/generator/service_template.jf | 2 + .../com/cowr/local/ssjygl/main/Config.java | 8 + .../TicketInvalidVerifyController.java | 41 ++ .../TicketInvalidVerifySyncService.java | 147 ++++ .../ticket/log/TicketLogController.java | 66 ++ .../ticket/log/TicketLogSyncService.java | 117 ++++ .../receive/TicketReceiveController.java | 69 ++ .../transport/TransportQueryService.java | 3 + .../com/cowr/service/ssjygl/main/Config.java | 8 + .../TicketInvalidVerifyController.java | 48 ++ .../TicketInvalidVerifySyncService.java | 198 ++++++ .../TicketInvalidVerifyValidator.java | 33 + .../ticket/log/TicketLogController.java | 133 ++++ .../ticket/log/TicketLogSyncService.java | 263 ++++++++ .../receive/TicketReceiveController.java | 142 ++++ .../receive/TicketReceiveSyncService.java | 86 +++ 37 files changed, 3883 insertions(+), 589 deletions(-) create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TicketInvalidVerify.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TicketLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TicketReceive.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketInvalidVerify.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketReceive.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceivePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/receive/TicketReceiveController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveSyncService.java diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java index 5e18c1a..d439cba 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java @@ -145,7 +145,13 @@ public class Result { } public static Result failedstr(String format, Object... objs) { - return new Result(Result.PARAM_ERROR, null, String.format(format, objs)); + try { + return new Result(Result.PARAM_ERROR, null, String.format(format, objs)); + }catch (Exception e){ + log.error(e.getMessage()); + + return new Result(Result.PARAM_ERROR, null, "请求失败"); + } } public static Result failed(Map validerr) { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketInvalidVerify.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketInvalidVerify.java new file mode 100644 index 0000000..e009302 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketInvalidVerify.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTicketInvalidVerify; + +/** + * Generated by COWR Fri Feb 26 16:03:22 CST 2021 + * TableName: ticket_invalid_verify + * Remarks: 结算单管理 - 结算单作废申请 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TicketInvalidVerify extends BaseTicketInvalidVerify { + public static final TicketInvalidVerify dao = new TicketInvalidVerify().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketLog.java new file mode 100644 index 0000000..59d246c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketLog.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTicketLog; + +/** + * Generated by COWR Fri Feb 26 16:03:22 CST 2021 + * TableName: ticket_log + * Remarks: 结算单管理 - 结算单使用记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TicketLog extends BaseTicketLog { + public static final TicketLog dao = new TicketLog().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketReceive.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketReceive.java new file mode 100644 index 0000000..7ac8600 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TicketReceive.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTicketReceive; + +/** + * Generated by COWR Fri Feb 26 16:03:22 CST 2021 + * TableName: ticket_receive + * Remarks: 结算单管理 - 领用记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TicketReceive extends BaseTicketReceive { + public static final TicketReceive dao = new TicketReceive().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java index cd9d6a8..9e2b65c 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java @@ -3,7 +3,7 @@ package com.cowr.model; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; /** - * Generated by COWR Sun May 17 21:43:18 CST 2020 + * Generated by COWR Fri Feb 26 16:03:22 CST 2021 *
  * Example:
  * public void configPlugin(Plugins me) {
@@ -26,14 +26,14 @@ public class _MappingKit {
         arp.addMapping("product", "id", Product.class);
         // Composite Primary Key order: supermarket_id,customer_receiver_id
         arp.addMapping("supermarket_receiver_distance", "supermarket_id,customer_receiver_id", SupermarketReceiverDistance.class);
-        // Composite Primary Key order: supermarket_id,customer_id
-        arp.addMapping("supermarket_customer_distance", "supermarket_id,customer_id", SupermarketCustomerDistance.class);
         arp.addMapping("transport_company", "id", TransportCompany.class);
         // Composite Primary Key order: supermarket_id,sandfarm_id
         arp.addMapping("supermarket_sandfarm_distance", "supermarket_id,sandfarm_id", SupermarketSandfarmDistance.class);
         arp.addMapping("sandfarm", "id", Sandfarm.class);
         // Composite Primary Key order: supermarket_id,product_id
         arp.addMapping("supermarket_product", "supermarket_id,product_id", SupermarketProduct.class);
+        // Composite Primary Key order: supermarket_id,customer_id
+        arp.addMapping("supermarket_customer_distance", "supermarket_id,customer_id", SupermarketCustomerDistance.class);
         arp.addMapping("blacklist", "id", Blacklist.class);
         arp.addMapping("truck", "license", Truck.class);
         arp.addMapping("purchase", "id", Purchase.class);
@@ -42,24 +42,28 @@ public class _MappingKit {
         arp.addMapping("customer_receiver", "id", CustomerReceiver.class);
         arp.addMapping("customer_register", "id", CustomerRegister.class);
         arp.addMapping("customer_contact", "id", CustomerContact.class);
-        // Composite Primary Key order: customer_id,supermarket_id,product_id
-        arp.addMapping("customer_supermarket_product", "customer_id,supermarket_id,product_id", CustomerSupermarketProduct.class);
         arp.addMapping("prepay_detail", "id", PrepayDetail.class);
         arp.addMapping("prepay_detail_state_history", "id", PrepayDetailStateHistory.class);
         arp.addMapping("refund_detail", "id", RefundDetail.class);
         arp.addMapping("refund_detail_state_history", "id", RefundDetailStateHistory.class);
+        // Composite Primary Key order: customer_id,supermarket_id,product_id
+        arp.addMapping("customer_supermarket_product", "customer_id,supermarket_id,product_id", CustomerSupermarketProduct.class);
+        arp.addMapping("customer_pact", "id", CustomerPact.class);
         arp.addMapping("prepay_customer", "id", PrepayCustomer.class);
         arp.addMapping("prepay_truck", "id", PrepayTruck.class);
-        arp.addMapping("sms_log", "id", SmsLog.class);
-        arp.addMapping("sms_notice_contact", "id", SmsNoticeContact.class);
         arp.addMapping("sync_task", "id", SyncTask.class);
         arp.addMapping("ossfile_log", "id", OssfileLog.class);
-        arp.addMapping("modify_log", "id", ModifyLog.class);
+        arp.addMapping("sms_log", "id", SmsLog.class);
         arp.addMapping("action_cmd_log", "id", ActionCmdLog.class);
+        arp.addMapping("modify_log", "id", ModifyLog.class);
         arp.addMapping("sysuser", "id", Sysuser.class);
         arp.addMapping("trans_price_config_trash", "id", TransPriceConfigTrash.class);
         arp.addMapping("trans_price_config_transfer", "id", TransPriceConfigTransfer.class);
+        arp.addMapping("sms_notice_contact", "id", SmsNoticeContact.class);
         arp.addMapping("trans_price_config_sale", "id", TransPriceConfigSale.class);
+        arp.addMapping("ticket_invalid_verify", "id", TicketInvalidVerify.class);
+        arp.addMapping("ticket_log", "id", TicketLog.class);
+        arp.addMapping("ticket_receive", "id", TicketReceive.class);
         // Composite Primary Key order: unit_id,unit_type
         arp.addMapping("cctv", "unit_id,unit_type", Cctv.class);
         // Composite Primary Key order: id,unit_id,unit_type
@@ -70,8 +74,8 @@ public class _MappingKit {
         arp.addMapping("order_seq", "tm,supermarket_id,type", OrderSeq.class);
         arp.addMapping("order_trash", "sn", OrderTrash.class);
         arp.addMapping("stock_modify_log", "id", StockModifyLog.class);
-        arp.addMapping("ordercluster_truck", "id", OrderclusterTruck.class);
         arp.addMapping("order_invalid_verify", "id", OrderInvalidVerify.class);
+        arp.addMapping("ordercluster_truck", "id", OrderclusterTruck.class);
         arp.addMapping("ordercluster", "id", Ordercluster.class);
         arp.addMapping("order_transfer", "sn", OrderTransfer.class);
         arp.addMapping("order_sale", "sn", OrderSale.class);
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java
index a70fb68..d8e8fe9 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java
@@ -5,7 +5,7 @@ import com.jfinal.plugin.activerecord.IBean;
 import com.alibaba.fastjson.annotation.JSONField;
 
 /**
- * Generated by COWR Mon Aug 17 11:15:31 CST 2020
+ * Generated by COWR Mon Mar 01 10:54:13 CST 2021
  * TableName: order_sale
  * Remarks: 订单相关 - 销售单
  * PrimaryKey: sn
@@ -15,8 +15,8 @@ public abstract class BaseOrderSale> extends BaseMode
 
     public static final String tablename = "order_sale";
 
-    @JSONField(serialize = false)
-    public String getTablename() {
+    @JSONField(serialize=false)
+    public String getTablename(){
         return tablename;
     }
 
@@ -25,20 +25,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(16)
      * isNullable: NO
      * isPrimaryKey: YES
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号
      */
-    @JSONField(name = "sn")
+    @JSONField(name="sn")
     public void setSn(String sn) {
         set("sn", sn);
     }
-
+    
 
     /**
      * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号
      */
-    @JSONField(name = "sn")
+    @JSONField(name="sn")
     public String getSn() {
         return getStr("sn");
     }
@@ -48,20 +47,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(32)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param uuid UUID 唯一验证,避免重复提交
      */
-    @JSONField(name = "uuid")
+    @JSONField(name="uuid")
     public void setUuid(String uuid) {
         set("uuid", uuid);
     }
-
+    
 
     /**
      * @return uuid UUID 唯一验证,避免重复提交
      */
-    @JSONField(name = "uuid")
+    @JSONField(name="uuid")
     public String getUuid() {
         return getStr("uuid");
     }
@@ -71,20 +69,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(32)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transportId 出入场记录id
      */
-    @JSONField(name = "transport_id")
+    @JSONField(name="transport_id")
     public void setTransportId(String transportId) {
         set("transport_id", transportId);
     }
-
+    
 
     /**
      * @return transport_id 出入场记录id
      */
-    @JSONField(name = "transport_id")
+    @JSONField(name="transport_id")
     public String getTransportId() {
         return getStr("transport_id");
     }
@@ -94,20 +91,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param supermarketId 砂站id
+     * defaultValue: 
+     * @param supermarketId 超市id
      */
-    @JSONField(name = "supermarket_id")
+    @JSONField(name="supermarket_id")
     public void setSupermarketId(Integer supermarketId) {
         set("supermarket_id", supermarketId);
     }
-
+    
 
     /**
-     * @return supermarket_id 砂站id
+     * @return supermarket_id 超市id
      */
-    @JSONField(name = "supermarket_id")
+    @JSONField(name="supermarket_id")
     public Integer getSupermarketId() {
         return getInt("supermarket_id");
     }
@@ -117,20 +113,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerId
+     * defaultValue: 
+     * @param customerId 
      */
-    @JSONField(name = "customer_id")
+    @JSONField(name="customer_id")
     public void setCustomerId(Integer customerId) {
         set("customer_id", customerId);
     }
-
+    
 
     /**
-     * @return customer_id
+     * @return customer_id 
      */
-    @JSONField(name = "customer_id")
+    @JSONField(name="customer_id")
     public Integer getCustomerId() {
         return getInt("customer_id");
     }
@@ -140,20 +135,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerName
+     * defaultValue: 
+     * @param customerName 
      */
-    @JSONField(name = "customer_name")
+    @JSONField(name="customer_name")
     public void setCustomerName(String customerName) {
         set("customer_name", customerName);
     }
-
+    
 
     /**
-     * @return customer_name
+     * @return customer_name 
      */
-    @JSONField(name = "customer_name")
+    @JSONField(name="customer_name")
     public String getCustomerName() {
         return getStr("customer_name");
     }
@@ -163,20 +157,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerTexpayerName 客户开票公司名称
      */
-    @JSONField(name = "customer_texpayer_name")
+    @JSONField(name="customer_texpayer_name")
     public void setCustomerTexpayerName(String customerTexpayerName) {
         set("customer_texpayer_name", customerTexpayerName);
     }
-
+    
 
     /**
      * @return customer_texpayer_name 客户开票公司名称
      */
-    @JSONField(name = "customer_texpayer_name")
+    @JSONField(name="customer_texpayer_name")
     public String getCustomerTexpayerName() {
         return getStr("customer_texpayer_name");
     }
@@ -186,20 +179,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerTexpayerNum 客户纳税人识别号
      */
-    @JSONField(name = "customer_texpayer_num")
+    @JSONField(name="customer_texpayer_num")
     public void setCustomerTexpayerNum(String customerTexpayerNum) {
         set("customer_texpayer_num", customerTexpayerNum);
     }
-
+    
 
     /**
      * @return customer_texpayer_num 客户纳税人识别号
      */
-    @JSONField(name = "customer_texpayer_num")
+    @JSONField(name="customer_texpayer_num")
     public String getCustomerTexpayerNum() {
         return getStr("customer_texpayer_num");
     }
@@ -209,20 +201,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerAddress
+     * defaultValue: 
+     * @param customerAddress 
      */
-    @JSONField(name = "customer_address")
+    @JSONField(name="customer_address")
     public void setCustomerAddress(String customerAddress) {
         set("customer_address", customerAddress);
     }
-
+    
 
     /**
-     * @return customer_address
+     * @return customer_address 
      */
-    @JSONField(name = "customer_address")
+    @JSONField(name="customer_address")
     public String getCustomerAddress() {
         return getStr("customer_address");
     }
@@ -232,20 +223,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(11)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerPhone
+     * defaultValue: 
+     * @param customerPhone 
      */
-    @JSONField(name = "customer_phone")
+    @JSONField(name="customer_phone")
     public void setCustomerPhone(String customerPhone) {
         set("customer_phone", customerPhone);
     }
-
+    
 
     /**
-     * @return customer_phone
+     * @return customer_phone 
      */
-    @JSONField(name = "customer_phone")
+    @JSONField(name="customer_phone")
     public String getCustomerPhone() {
         return getStr("customer_phone");
     }
@@ -255,20 +245,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerBankName
+     * defaultValue: 
+     * @param customerBankName 
      */
-    @JSONField(name = "customer_bank_name")
+    @JSONField(name="customer_bank_name")
     public void setCustomerBankName(String customerBankName) {
         set("customer_bank_name", customerBankName);
     }
-
+    
 
     /**
-     * @return customer_bank_name
+     * @return customer_bank_name 
      */
-    @JSONField(name = "customer_bank_name")
+    @JSONField(name="customer_bank_name")
     public String getCustomerBankName() {
         return getStr("customer_bank_name");
     }
@@ -278,20 +267,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerBankAccount
+     * defaultValue: 
+     * @param customerBankAccount 
      */
-    @JSONField(name = "customer_bank_account")
+    @JSONField(name="customer_bank_account")
     public void setCustomerBankAccount(String customerBankAccount) {
         set("customer_bank_account", customerBankAccount);
     }
-
+    
 
     /**
-     * @return customer_bank_account
+     * @return customer_bank_account 
      */
-    @JSONField(name = "customer_bank_account")
+    @JSONField(name="customer_bank_account")
     public String getCustomerBankAccount() {
         return getStr("customer_bank_account");
     }
@@ -301,20 +289,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(8)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverName 收货人
      */
-    @JSONField(name = "customer_receiver_name")
+    @JSONField(name="customer_receiver_name")
     public void setCustomerReceiverName(String customerReceiverName) {
         set("customer_receiver_name", customerReceiverName);
     }
-
+    
 
     /**
      * @return customer_receiver_name 收货人
      */
-    @JSONField(name = "customer_receiver_name")
+    @JSONField(name="customer_receiver_name")
     public String getCustomerReceiverName() {
         return getStr("customer_receiver_name");
     }
@@ -324,20 +311,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(11)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverPhone 收货人电话
      */
-    @JSONField(name = "customer_receiver_phone")
+    @JSONField(name="customer_receiver_phone")
     public void setCustomerReceiverPhone(String customerReceiverPhone) {
         set("customer_receiver_phone", customerReceiverPhone);
     }
-
+    
 
     /**
      * @return customer_receiver_phone 收货人电话
      */
-    @JSONField(name = "customer_receiver_phone")
+    @JSONField(name="customer_receiver_phone")
     public String getCustomerReceiverPhone() {
         return getStr("customer_receiver_phone");
     }
@@ -347,20 +333,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverAddress 送货地址
      */
-    @JSONField(name = "customer_receiver_address")
+    @JSONField(name="customer_receiver_address")
     public void setCustomerReceiverAddress(String customerReceiverAddress) {
         set("customer_receiver_address", customerReceiverAddress);
     }
-
+    
 
     /**
      * @return customer_receiver_address 送货地址
      */
-    @JSONField(name = "customer_receiver_address")
+    @JSONField(name="customer_receiver_address")
     public String getCustomerReceiverAddress() {
         return getStr("customer_receiver_address");
     }
@@ -370,20 +355,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,8)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverLgtd 收货地址经度
      */
-    @JSONField(name = "customer_receiver_lgtd")
+    @JSONField(name="customer_receiver_lgtd")
     public void setCustomerReceiverLgtd(java.math.BigDecimal customerReceiverLgtd) {
         set("customer_receiver_lgtd", customerReceiverLgtd);
     }
-
+    
 
     /**
      * @return customer_receiver_lgtd 收货地址经度
      */
-    @JSONField(name = "customer_receiver_lgtd")
+    @JSONField(name="customer_receiver_lgtd")
     public java.math.BigDecimal getCustomerReceiverLgtd() {
         return get("customer_receiver_lgtd");
     }
@@ -393,20 +377,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,8)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverLttd 收货地址纬度
      */
-    @JSONField(name = "customer_receiver_lttd")
+    @JSONField(name="customer_receiver_lttd")
     public void setCustomerReceiverLttd(java.math.BigDecimal customerReceiverLttd) {
         set("customer_receiver_lttd", customerReceiverLttd);
     }
-
+    
 
     /**
      * @return customer_receiver_lttd 收货地址纬度
      */
-    @JSONField(name = "customer_receiver_lttd")
+    @JSONField(name="customer_receiver_lttd")
     public java.math.BigDecimal getCustomerReceiverLttd() {
         return get("customer_receiver_lttd");
     }
@@ -416,20 +399,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transCoId 物流公司
      */
-    @JSONField(name = "trans_co_id")
+    @JSONField(name="trans_co_id")
     public void setTransCoId(Integer transCoId) {
         set("trans_co_id", transCoId);
     }
-
+    
 
     /**
      * @return trans_co_id 物流公司
      */
-    @JSONField(name = "trans_co_id")
+    @JSONField(name="trans_co_id")
     public Integer getTransCoId() {
         return getInt("trans_co_id");
     }
@@ -439,20 +421,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoName
+     * defaultValue: 
+     * @param transCoName 
      */
-    @JSONField(name = "trans_co_name")
+    @JSONField(name="trans_co_name")
     public void setTransCoName(String transCoName) {
         set("trans_co_name", transCoName);
     }
-
+    
 
     /**
-     * @return trans_co_name
+     * @return trans_co_name 
      */
-    @JSONField(name = "trans_co_name")
+    @JSONField(name="trans_co_name")
     public String getTransCoName() {
         return getStr("trans_co_name");
     }
@@ -462,20 +443,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transCoTexpayerName 物流公司开票公司名称
      */
-    @JSONField(name = "trans_co_texpayer_name")
+    @JSONField(name="trans_co_texpayer_name")
     public void setTransCoTexpayerName(String transCoTexpayerName) {
         set("trans_co_texpayer_name", transCoTexpayerName);
     }
-
+    
 
     /**
      * @return trans_co_texpayer_name 物流公司开票公司名称
      */
-    @JSONField(name = "trans_co_texpayer_name")
+    @JSONField(name="trans_co_texpayer_name")
     public String getTransCoTexpayerName() {
         return getStr("trans_co_texpayer_name");
     }
@@ -485,20 +465,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoTexpayerNum
+     * defaultValue: 
+     * @param transCoTexpayerNum 
      */
-    @JSONField(name = "trans_co_texpayer_num")
+    @JSONField(name="trans_co_texpayer_num")
     public void setTransCoTexpayerNum(String transCoTexpayerNum) {
         set("trans_co_texpayer_num", transCoTexpayerNum);
     }
-
+    
 
     /**
-     * @return trans_co_texpayer_num
+     * @return trans_co_texpayer_num 
      */
-    @JSONField(name = "trans_co_texpayer_num")
+    @JSONField(name="trans_co_texpayer_num")
     public String getTransCoTexpayerNum() {
         return getStr("trans_co_texpayer_num");
     }
@@ -508,20 +487,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoAddress
+     * defaultValue: 
+     * @param transCoAddress 
      */
-    @JSONField(name = "trans_co_address")
+    @JSONField(name="trans_co_address")
     public void setTransCoAddress(String transCoAddress) {
         set("trans_co_address", transCoAddress);
     }
-
+    
 
     /**
-     * @return trans_co_address
+     * @return trans_co_address 
      */
-    @JSONField(name = "trans_co_address")
+    @JSONField(name="trans_co_address")
     public String getTransCoAddress() {
         return getStr("trans_co_address");
     }
@@ -531,20 +509,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(11)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoPhone
+     * defaultValue: 
+     * @param transCoPhone 
      */
-    @JSONField(name = "trans_co_phone")
+    @JSONField(name="trans_co_phone")
     public void setTransCoPhone(String transCoPhone) {
         set("trans_co_phone", transCoPhone);
     }
-
+    
 
     /**
-     * @return trans_co_phone
+     * @return trans_co_phone 
      */
-    @JSONField(name = "trans_co_phone")
+    @JSONField(name="trans_co_phone")
     public String getTransCoPhone() {
         return getStr("trans_co_phone");
     }
@@ -554,20 +531,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoBankName
+     * defaultValue: 
+     * @param transCoBankName 
      */
-    @JSONField(name = "trans_co_bank_name")
+    @JSONField(name="trans_co_bank_name")
     public void setTransCoBankName(String transCoBankName) {
         set("trans_co_bank_name", transCoBankName);
     }
-
+    
 
     /**
-     * @return trans_co_bank_name
+     * @return trans_co_bank_name 
      */
-    @JSONField(name = "trans_co_bank_name")
+    @JSONField(name="trans_co_bank_name")
     public String getTransCoBankName() {
         return getStr("trans_co_bank_name");
     }
@@ -577,20 +553,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoBankAccount
+     * defaultValue: 
+     * @param transCoBankAccount 
      */
-    @JSONField(name = "trans_co_bank_account")
+    @JSONField(name="trans_co_bank_account")
     public void setTransCoBankAccount(String transCoBankAccount) {
         set("trans_co_bank_account", transCoBankAccount);
     }
-
+    
 
     /**
-     * @return trans_co_bank_account
+     * @return trans_co_bank_account 
      */
-    @JSONField(name = "trans_co_bank_account")
+    @JSONField(name="trans_co_bank_account")
     public String getTransCoBankAccount() {
         return getStr("trans_co_bank_account");
     }
@@ -600,20 +575,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param truckLicense 车牌号
      */
-    @JSONField(name = "truck_license")
+    @JSONField(name="truck_license")
     public void setTruckLicense(String truckLicense) {
         set("truck_license", truckLicense);
     }
-
+    
 
     /**
      * @return truck_license 车牌号
      */
-    @JSONField(name = "truck_license")
+    @JSONField(name="truck_license")
     public String getTruckLicense() {
         return getStr("truck_license");
     }
@@ -623,20 +597,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(8)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param driverName 司机姓名
      */
-    @JSONField(name = "driver_name")
+    @JSONField(name="driver_name")
     public void setDriverName(String driverName) {
         set("driver_name", driverName);
     }
-
+    
 
     /**
      * @return driver_name 司机姓名
      */
-    @JSONField(name = "driver_name")
+    @JSONField(name="driver_name")
     public String getDriverName() {
         return getStr("driver_name");
     }
@@ -646,20 +619,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: CHAR(11)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param driverPhone 司机手机号
      */
-    @JSONField(name = "driver_phone")
+    @JSONField(name="driver_phone")
     public void setDriverPhone(String driverPhone) {
         set("driver_phone", driverPhone);
     }
-
+    
 
     /**
      * @return driver_phone 司机手机号
      */
-    @JSONField(name = "driver_phone")
+    @JSONField(name="driver_phone")
     public String getDriverPhone() {
         return getStr("driver_phone");
     }
@@ -669,20 +641,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param unitPrice 单价
      */
-    @JSONField(name = "unit_price")
+    @JSONField(name="unit_price")
     public void setUnitPrice(java.math.BigDecimal unitPrice) {
         set("unit_price", unitPrice);
     }
-
+    
 
     /**
      * @return unit_price 单价
      */
-    @JSONField(name = "unit_price")
+    @JSONField(name="unit_price")
     public java.math.BigDecimal getUnitPrice() {
         return get("unit_price");
     }
@@ -692,20 +663,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param totalPrice 总价,应付金额
      */
-    @JSONField(name = "total_price")
+    @JSONField(name="total_price")
     public void setTotalPrice(java.math.BigDecimal totalPrice) {
         set("total_price", totalPrice);
     }
-
+    
 
     /**
      * @return total_price 总价,应付金额
      */
-    @JSONField(name = "total_price")
+    @JSONField(name="total_price")
     public java.math.BigDecimal getTotalPrice() {
         return get("total_price");
     }
@@ -715,20 +685,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param weight 购买重量
      */
-    @JSONField(name = "weight")
+    @JSONField(name="weight")
     public void setWeight(java.math.BigDecimal weight) {
         set("weight", weight);
     }
-
+    
 
     /**
      * @return weight 购买重量
      */
-    @JSONField(name = "weight")
+    @JSONField(name="weight")
     public java.math.BigDecimal getWeight() {
         return get("weight");
     }
@@ -738,20 +707,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param paid 实际支付金额
      */
-    @JSONField(name = "paid")
+    @JSONField(name="paid")
     public void setPaid(java.math.BigDecimal paid) {
         set("paid", paid);
     }
-
+    
 
     /**
      * @return paid 实际支付金额
      */
-    @JSONField(name = "paid")
+    @JSONField(name="paid")
     public java.math.BigDecimal getPaid() {
         return get("paid");
     }
@@ -761,20 +729,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DATETIME(19)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param pickTime 提货时间
      */
-    @JSONField(name = "pick_time")
+    @JSONField(name="pick_time")
     public void setPickTime(java.util.Date pickTime) {
         set("pick_time", pickTime);
     }
-
+    
 
     /**
      * @return pick_time 提货时间
      */
-    @JSONField(name = "pick_time")
+    @JSONField(name="pick_time")
     public java.util.Date getPickTime() {
         return get("pick_time");
     }
@@ -784,20 +751,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transDistance 运距
      */
-    @JSONField(name = "trans_distance")
+    @JSONField(name="trans_distance")
     public void setTransDistance(java.math.BigDecimal transDistance) {
         set("trans_distance", transDistance);
     }
-
+    
 
     /**
      * @return trans_distance 运距
      */
-    @JSONField(name = "trans_distance")
+    @JSONField(name="trans_distance")
     public java.math.BigDecimal getTransDistance() {
         return get("trans_distance");
     }
@@ -807,20 +773,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(10,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transPrice 运费
      */
-    @JSONField(name = "trans_price")
+    @JSONField(name="trans_price")
     public void setTransPrice(java.math.BigDecimal transPrice) {
         set("trans_price", transPrice);
     }
-
+    
 
     /**
      * @return trans_price 运费
      */
-    @JSONField(name = "trans_price")
+    @JSONField(name="trans_price")
     public java.math.BigDecimal getTransPrice() {
         return get("trans_price");
     }
@@ -830,20 +795,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transUnitPrice 运输单价
      */
-    @JSONField(name = "trans_unit_price")
+    @JSONField(name="trans_unit_price")
     public void setTransUnitPrice(java.math.BigDecimal transUnitPrice) {
         set("trans_unit_price", transUnitPrice);
     }
-
+    
 
     /**
      * @return trans_unit_price 运输单价
      */
-    @JSONField(name = "trans_unit_price")
+    @JSONField(name="trans_unit_price")
     public java.math.BigDecimal getTransUnitPrice() {
         return get("trans_unit_price");
     }
@@ -854,19 +818,18 @@ public abstract class BaseOrderSale> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param payType 支付方式: 1,现场支付; 2,在线支付
      */
-    @JSONField(name = "pay_type")
+    @JSONField(name="pay_type")
     public void setPayType(Integer payType) {
         set("pay_type", payType);
     }
-
+    
 
     /**
      * @return pay_type 支付方式: 1,现场支付; 2,在线支付
      */
-    @JSONField(name = "pay_type")
+    @JSONField(name="pay_type")
     public Integer getPayType() {
         return getInt("pay_type");
     }
@@ -876,20 +839,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: DATETIME(19)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param createTime
+     * defaultValue: 
+     * @param createTime 
      */
-    @JSONField(name = "create_time")
+    @JSONField(name="create_time")
     public void setCreateTime(java.util.Date createTime) {
         set("create_time", createTime);
     }
-
+    
 
     /**
-     * @return create_time
+     * @return create_time 
      */
-    @JSONField(name = "create_time")
+    @JSONField(name="create_time")
     public java.util.Date getCreateTime() {
         return get("create_time");
     }
@@ -899,20 +861,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param createUserId 创建用户id
      */
-    @JSONField(name = "create_user_id")
+    @JSONField(name="create_user_id")
     public void setCreateUserId(Integer createUserId) {
         set("create_user_id", createUserId);
     }
-
+    
 
     /**
      * @return create_user_id 创建用户id
      */
-    @JSONField(name = "create_user_id")
+    @JSONField(name="create_user_id")
     public Integer getCreateUserId() {
         return getInt("create_user_id");
     }
@@ -922,20 +883,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param createUserName 创建用户名
      */
-    @JSONField(name = "create_user_name")
+    @JSONField(name="create_user_name")
     public void setCreateUserName(String createUserName) {
         set("create_user_name", createUserName);
     }
-
+    
 
     /**
      * @return create_user_name 创建用户名
      */
-    @JSONField(name = "create_user_name")
+    @JSONField(name="create_user_name")
     public String getCreateUserName() {
         return getStr("create_user_name");
     }
@@ -945,20 +905,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param settlementUserId 结算用户id
      */
-    @JSONField(name = "settlement_user_id")
+    @JSONField(name="settlement_user_id")
     public void setSettlementUserId(Integer settlementUserId) {
         set("settlement_user_id", settlementUserId);
     }
-
+    
 
     /**
      * @return settlement_user_id 结算用户id
      */
-    @JSONField(name = "settlement_user_id")
+    @JSONField(name="settlement_user_id")
     public Integer getSettlementUserId() {
         return getInt("settlement_user_id");
     }
@@ -968,20 +927,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param settlementUserName 结算用户名
      */
-    @JSONField(name = "settlement_user_name")
+    @JSONField(name="settlement_user_name")
     public void setSettlementUserName(String settlementUserName) {
         set("settlement_user_name", settlementUserName);
     }
-
+    
 
     /**
      * @return settlement_user_name 结算用户名
      */
-    @JSONField(name = "settlement_user_name")
+    @JSONField(name="settlement_user_name")
     public String getSettlementUserName() {
         return getStr("settlement_user_name");
     }
@@ -992,29 +950,30 @@ public abstract class BaseOrderSale> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param state 1,初始状态;
-     *              2,已进场;(后台自动设置)
-     *              3,已装载
-     *              4,已离场(后台自动设置)
-     *              5,已收货
-     *              9,订单作废
+2,已进场;(后台自动设置)
+3,已装载
+4,已离场(后台自动设置)
+5,已收货
+9,订单作废
+
      */
-    @JSONField(name = "state")
+    @JSONField(name="state")
     public void setState(Integer state) {
         set("state", state);
     }
-
+    
 
     /**
      * @return state 1,初始状态;
-     * 2,已进场;(后台自动设置)
-     * 3,已装载
-     * 4,已离场(后台自动设置)
-     * 5,已收货
-     * 9,订单作废
+2,已进场;(后台自动设置)
+3,已装载
+4,已离场(后台自动设置)
+5,已收货
+9,订单作废
+
      */
-    @JSONField(name = "state")
+    @JSONField(name="state")
     public Integer getState() {
         return getInt("state");
     }
@@ -1025,19 +984,18 @@ public abstract class BaseOrderSale> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 0
-     *
      * @param reqReceipt 是否需要发票,0 默认不需要,1需要
      */
-    @JSONField(name = "req_receipt")
+    @JSONField(name="req_receipt")
     public void setReqReceipt(Integer reqReceipt) {
         set("req_receipt", reqReceipt);
     }
-
+    
 
     /**
      * @return req_receipt 是否需要发票,0 默认不需要,1需要
      */
-    @JSONField(name = "req_receipt")
+    @JSONField(name="req_receipt")
     public Integer getReqReceipt() {
         return getInt("req_receipt");
     }
@@ -1047,20 +1005,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param orderclusterId ordercluste id
      */
-    @JSONField(name = "ordercluster_id")
+    @JSONField(name="ordercluster_id")
     public void setOrderclusterId(Integer orderclusterId) {
         set("ordercluster_id", orderclusterId);
     }
-
+    
 
     /**
      * @return ordercluster_id ordercluste id
      */
-    @JSONField(name = "ordercluster_id")
+    @JSONField(name="ordercluster_id")
     public Integer getOrderclusterId() {
         return getInt("ordercluster_id");
     }
@@ -1071,19 +1028,18 @@ public abstract class BaseOrderSale> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: CURRENT_TIMESTAMP
-     *
      * @param changeTime 最后修改时间
      */
-    @JSONField(name = "change_time")
+    @JSONField(name="change_time")
     public void setChangeTime(java.util.Date changeTime) {
         set("change_time", changeTime);
     }
-
+    
 
     /**
      * @return change_time 最后修改时间
      */
-    @JSONField(name = "change_time")
+    @JSONField(name="change_time")
     public java.util.Date getChangeTime() {
         return get("change_time");
     }
@@ -1094,19 +1050,18 @@ public abstract class BaseOrderSale> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 0
-     *
      * @param isprepaid 是否已预付,在结算时勾选
      */
-    @JSONField(name = "isprepaid")
+    @JSONField(name="isprepaid")
     public void setIsprepaid(Integer isprepaid) {
         set("isprepaid", isprepaid);
     }
-
+    
 
     /**
      * @return isprepaid 是否已预付,在结算时勾选
      */
-    @JSONField(name = "isprepaid")
+    @JSONField(name="isprepaid")
     public Integer getIsprepaid() {
         return getInt("isprepaid");
     }
@@ -1116,20 +1071,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param memo 备注
      */
-    @JSONField(name = "memo")
+    @JSONField(name="memo")
     public void setMemo(String memo) {
         set("memo", memo);
     }
-
+    
 
     /**
      * @return memo 备注
      */
-    @JSONField(name = "memo")
+    @JSONField(name="memo")
     public String getMemo() {
         return getStr("memo");
     }
@@ -1139,20 +1093,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param productId 品类id
      */
-    @JSONField(name = "product_id")
+    @JSONField(name="product_id")
     public void setProductId(Integer productId) {
         set("product_id", productId);
     }
-
+    
 
     /**
      * @return product_id 品类id
      */
-    @JSONField(name = "product_id")
+    @JSONField(name="product_id")
     public Integer getProductId() {
         return getInt("product_id");
     }
@@ -1162,20 +1115,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param productName 品类名称
      */
-    @JSONField(name = "product_name")
+    @JSONField(name="product_name")
     public void setProductName(String productName) {
         set("product_name", productName);
     }
-
+    
 
     /**
      * @return product_name 品类名称
      */
-    @JSONField(name = "product_name")
+    @JSONField(name="product_name")
     public String getProductName() {
         return getStr("product_name");
     }
@@ -1185,20 +1137,19 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param prepayCustomerId 预付费客户 prepay_customer 表的id
      */
-    @JSONField(name = "prepay_customer_id")
+    @JSONField(name="prepay_customer_id")
     public void setPrepayCustomerId(Integer prepayCustomerId) {
         set("prepay_customer_id", prepayCustomerId);
     }
-
+    
 
     /**
      * @return prepay_customer_id 预付费客户 prepay_customer 表的id
      */
-    @JSONField(name = "prepay_customer_id")
+    @JSONField(name="prepay_customer_id")
     public Integer getPrepayCustomerId() {
         return getInt("prepay_customer_id");
     }
@@ -1208,23 +1159,110 @@ public abstract class BaseOrderSale> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param invoiceCode 发票号码
      */
-    @JSONField(name = "invoice_code")
+    @JSONField(name="invoice_code")
     public void setInvoiceCode(String invoiceCode) {
         set("invoice_code", invoiceCode);
     }
-
+    
 
     /**
      * @return invoice_code 发票号码
      */
-    @JSONField(name = "invoice_code")
+    @JSONField(name="invoice_code")
     public String getInvoiceCode() {
         return getStr("invoice_code");
     }
 
+    /**
+     * name: invoice_number
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceNumber 发票代码
+     */
+    @JSONField(name="invoice_number")
+    public void setInvoiceNumber(String invoiceNumber) {
+        set("invoice_number", invoiceNumber);
+    }
+    
+
+    /**
+     * @return invoice_number 发票代码
+     */
+    @JSONField(name="invoice_number")
+    public String getInvoiceNumber() {
+        return getStr("invoice_number");
+    }
+
+    /**
+     * name: invoice_type
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 1
+     * @param invoiceType 1.普票,2.专票
+     */
+    @JSONField(name="invoice_type")
+    public void setInvoiceType(Integer invoiceType) {
+        set("invoice_type", invoiceType);
+    }
+    
+
+    /**
+     * @return invoice_type 1.普票,2.专票
+     */
+    @JSONField(name="invoice_type")
+    public Integer getInvoiceType() {
+        return getInt("invoice_type");
+    }
+
+    /**
+     * name: invoice_site
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 1
+     * @param invoiceSite 1.砂站,2.结算中心
+     */
+    @JSONField(name="invoice_site")
+    public void setInvoiceSite(Integer invoiceSite) {
+        set("invoice_site", invoiceSite);
+    }
+    
+
+    /**
+     * @return invoice_site 1.砂站,2.结算中心
+     */
+    @JSONField(name="invoice_site")
+    public Integer getInvoiceSite() {
+        return getInt("invoice_site");
+    }
+
+    /**
+     * name: ticket_code
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketCode 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public void setTicketCode(String ticketCode) {
+        set("ticket_code", ticketCode);
+    }
+    
+
+    /**
+     * @return ticket_code 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public String getTicketCode() {
+        return getStr("ticket_code");
+    }
+
 
 }
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java
index 1864346..8f42c7a 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java
@@ -5,7 +5,7 @@ import com.jfinal.plugin.activerecord.IBean;
 import com.alibaba.fastjson.annotation.JSONField;
 
 /**
- * Generated by COWR Mon Sep 28 16:46:22 CST 2020
+ * Generated by COWR Mon Mar 01 10:54:13 CST 2021
  * TableName: order_temp
  * Remarks: 订单相关 - 外销单
  * PrimaryKey: sn
@@ -15,8 +15,8 @@ public abstract class BaseOrderTemp> extends BaseMode
 
     public static final String tablename = "order_temp";
 
-    @JSONField(serialize = false)
-    public String getTablename() {
+    @JSONField(serialize=false)
+    public String getTablename(){
         return tablename;
     }
 
@@ -25,20 +25,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(16)
      * isNullable: NO
      * isPrimaryKey: YES
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号
      */
-    @JSONField(name = "sn")
+    @JSONField(name="sn")
     public void setSn(String sn) {
         set("sn", sn);
     }
-
+    
 
     /**
      * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号
      */
-    @JSONField(name = "sn")
+    @JSONField(name="sn")
     public String getSn() {
         return getStr("sn");
     }
@@ -48,20 +47,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(32)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param uuid UUID 唯一验证
      */
-    @JSONField(name = "uuid")
+    @JSONField(name="uuid")
     public void setUuid(String uuid) {
         set("uuid", uuid);
     }
-
+    
 
     /**
      * @return uuid UUID 唯一验证
      */
-    @JSONField(name = "uuid")
+    @JSONField(name="uuid")
     public String getUuid() {
         return getStr("uuid");
     }
@@ -71,20 +69,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(32)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transportId 出入场记录id
      */
-    @JSONField(name = "transport_id")
+    @JSONField(name="transport_id")
     public void setTransportId(String transportId) {
         set("transport_id", transportId);
     }
-
+    
 
     /**
      * @return transport_id 出入场记录id
      */
-    @JSONField(name = "transport_id")
+    @JSONField(name="transport_id")
     public String getTransportId() {
         return getStr("transport_id");
     }
@@ -94,20 +91,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param supermarketId 砂站id
+     * defaultValue: 
+     * @param supermarketId 超市id
      */
-    @JSONField(name = "supermarket_id")
+    @JSONField(name="supermarket_id")
     public void setSupermarketId(Integer supermarketId) {
         set("supermarket_id", supermarketId);
     }
-
+    
 
     /**
-     * @return supermarket_id 砂站id
+     * @return supermarket_id 超市id
      */
-    @JSONField(name = "supermarket_id")
+    @JSONField(name="supermarket_id")
     public Integer getSupermarketId() {
         return getInt("supermarket_id");
     }
@@ -117,20 +113,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param weight 购买重量
      */
-    @JSONField(name = "weight")
+    @JSONField(name="weight")
     public void setWeight(java.math.BigDecimal weight) {
         set("weight", weight);
     }
-
+    
 
     /**
      * @return weight 购买重量
      */
-    @JSONField(name = "weight")
+    @JSONField(name="weight")
     public java.math.BigDecimal getWeight() {
         return get("weight");
     }
@@ -140,20 +135,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param truckLicense 车牌号
      */
-    @JSONField(name = "truck_license")
+    @JSONField(name="truck_license")
     public void setTruckLicense(String truckLicense) {
         set("truck_license", truckLicense);
     }
-
+    
 
     /**
      * @return truck_license 车牌号
      */
-    @JSONField(name = "truck_license")
+    @JSONField(name="truck_license")
     public String getTruckLicense() {
         return getStr("truck_license");
     }
@@ -164,31 +158,32 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param state 1,初始状态;
-     *              2,已进场;(后台自动设置)
-     *              3,已装载
-     *              4,已离场(
-     *              后台自动设置)(扩展,已生成待支付订单)
-     *              5,已收货
-     *              9,订单作废
+2,已进场;(后台自动设置)
+3,已装载
+4,已离场(
+后台自动设置)(扩展,已生成待支付订单)
+5,已收货
+9,订单作废
+
      */
-    @JSONField(name = "state")
+    @JSONField(name="state")
     public void setState(Integer state) {
         set("state", state);
     }
-
+    
 
     /**
      * @return state 1,初始状态;
-     * 2,已进场;(后台自动设置)
-     * 3,已装载
-     * 4,已离场(
-     * 后台自动设置)(扩展,已生成待支付订单)
-     * 5,已收货
-     * 9,订单作废
+2,已进场;(后台自动设置)
+3,已装载
+4,已离场(
+后台自动设置)(扩展,已生成待支付订单)
+5,已收货
+9,订单作废
+
      */
-    @JSONField(name = "state")
+    @JSONField(name="state")
     public Integer getState() {
         return getInt("state");
     }
@@ -198,20 +193,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DATETIME(19)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param createTime 创建时间
      */
-    @JSONField(name = "create_time")
+    @JSONField(name="create_time")
     public void setCreateTime(java.util.Date createTime) {
         set("create_time", createTime);
     }
-
+    
 
     /**
      * @return create_time 创建时间
      */
-    @JSONField(name = "create_time")
+    @JSONField(name="create_time")
     public java.util.Date getCreateTime() {
         return get("create_time");
     }
@@ -221,20 +215,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param createUserId 创建用户id
      */
-    @JSONField(name = "create_user_id")
+    @JSONField(name="create_user_id")
     public void setCreateUserId(Integer createUserId) {
         set("create_user_id", createUserId);
     }
-
+    
 
     /**
      * @return create_user_id 创建用户id
      */
-    @JSONField(name = "create_user_id")
+    @JSONField(name="create_user_id")
     public Integer getCreateUserId() {
         return getInt("create_user_id");
     }
@@ -244,20 +237,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param createUserName 创建用户名
      */
-    @JSONField(name = "create_user_name")
+    @JSONField(name="create_user_name")
     public void setCreateUserName(String createUserName) {
         set("create_user_name", createUserName);
     }
-
+    
 
     /**
      * @return create_user_name 创建用户名
      */
-    @JSONField(name = "create_user_name")
+    @JSONField(name="create_user_name")
     public String getCreateUserName() {
         return getStr("create_user_name");
     }
@@ -267,20 +259,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param settlementUserId 结算用户id
      */
-    @JSONField(name = "settlement_user_id")
+    @JSONField(name="settlement_user_id")
     public void setSettlementUserId(Integer settlementUserId) {
         set("settlement_user_id", settlementUserId);
     }
-
+    
 
     /**
      * @return settlement_user_id 结算用户id
      */
-    @JSONField(name = "settlement_user_id")
+    @JSONField(name="settlement_user_id")
     public Integer getSettlementUserId() {
         return getInt("settlement_user_id");
     }
@@ -290,20 +281,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param settlementUserName 结算用户名
      */
-    @JSONField(name = "settlement_user_name")
+    @JSONField(name="settlement_user_name")
     public void setSettlementUserName(String settlementUserName) {
         set("settlement_user_name", settlementUserName);
     }
-
+    
 
     /**
      * @return settlement_user_name 结算用户名
      */
-    @JSONField(name = "settlement_user_name")
+    @JSONField(name="settlement_user_name")
     public String getSettlementUserName() {
         return getStr("settlement_user_name");
     }
@@ -313,20 +303,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param unitPrice 单价
      */
-    @JSONField(name = "unit_price")
+    @JSONField(name="unit_price")
     public void setUnitPrice(java.math.BigDecimal unitPrice) {
         set("unit_price", unitPrice);
     }
-
+    
 
     /**
      * @return unit_price 单价
      */
-    @JSONField(name = "unit_price")
+    @JSONField(name="unit_price")
     public java.math.BigDecimal getUnitPrice() {
         return get("unit_price");
     }
@@ -336,20 +325,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param totalPrice 总价,应付费
      */
-    @JSONField(name = "total_price")
+    @JSONField(name="total_price")
     public void setTotalPrice(java.math.BigDecimal totalPrice) {
         set("total_price", totalPrice);
     }
-
+    
 
     /**
      * @return total_price 总价,应付费
      */
-    @JSONField(name = "total_price")
+    @JSONField(name="total_price")
     public java.math.BigDecimal getTotalPrice() {
         return get("total_price");
     }
@@ -359,20 +347,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,2)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param paid 实际支付金额
      */
-    @JSONField(name = "paid")
+    @JSONField(name="paid")
     public void setPaid(java.math.BigDecimal paid) {
         set("paid", paid);
     }
-
+    
 
     /**
      * @return paid 实际支付金额
      */
-    @JSONField(name = "paid")
+    @JSONField(name="paid")
     public java.math.BigDecimal getPaid() {
         return get("paid");
     }
@@ -383,19 +370,18 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param payType 支付方式: 1,现场支付; 2,在线支付
      */
-    @JSONField(name = "pay_type")
+    @JSONField(name="pay_type")
     public void setPayType(Integer payType) {
         set("pay_type", payType);
     }
-
+    
 
     /**
      * @return pay_type 支付方式: 1,现场支付; 2,在线支付
      */
-    @JSONField(name = "pay_type")
+    @JSONField(name="pay_type")
     public Integer getPayType() {
         return getInt("pay_type");
     }
@@ -406,19 +392,18 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: CURRENT_TIMESTAMP
-     *
      * @param changeTime 最后修改时间
      */
-    @JSONField(name = "change_time")
+    @JSONField(name="change_time")
     public void setChangeTime(java.util.Date changeTime) {
         set("change_time", changeTime);
     }
-
+    
 
     /**
      * @return change_time 最后修改时间
      */
-    @JSONField(name = "change_time")
+    @JSONField(name="change_time")
     public java.util.Date getChangeTime() {
         return get("change_time");
     }
@@ -429,19 +414,18 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: NO
      * isPrimaryKey: NO
      * defaultValue: 0
-     *
      * @param isprepaid 是否已预付,在结算时勾选
      */
-    @JSONField(name = "isprepaid")
+    @JSONField(name="isprepaid")
     public void setIsprepaid(Integer isprepaid) {
         set("isprepaid", isprepaid);
     }
-
+    
 
     /**
      * @return isprepaid 是否已预付,在结算时勾选
      */
-    @JSONField(name = "isprepaid")
+    @JSONField(name="isprepaid")
     public Integer getIsprepaid() {
         return getInt("isprepaid");
     }
@@ -451,20 +435,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param memo 备注
      */
-    @JSONField(name = "memo")
+    @JSONField(name="memo")
     public void setMemo(String memo) {
         set("memo", memo);
     }
-
+    
 
     /**
      * @return memo 备注
      */
-    @JSONField(name = "memo")
+    @JSONField(name="memo")
     public String getMemo() {
         return getStr("memo");
     }
@@ -474,20 +457,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerId
+     * defaultValue: 
+     * @param customerId 
      */
-    @JSONField(name = "customer_id")
+    @JSONField(name="customer_id")
     public void setCustomerId(Integer customerId) {
         set("customer_id", customerId);
     }
-
+    
 
     /**
-     * @return customer_id
+     * @return customer_id 
      */
-    @JSONField(name = "customer_id")
+    @JSONField(name="customer_id")
     public Integer getCustomerId() {
         return getInt("customer_id");
     }
@@ -497,20 +479,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerName
+     * defaultValue: 
+     * @param customerName 
      */
-    @JSONField(name = "customer_name")
+    @JSONField(name="customer_name")
     public void setCustomerName(String customerName) {
         set("customer_name", customerName);
     }
-
+    
 
     /**
-     * @return customer_name
+     * @return customer_name 
      */
-    @JSONField(name = "customer_name")
+    @JSONField(name="customer_name")
     public String getCustomerName() {
         return getStr("customer_name");
     }
@@ -520,20 +501,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerTexpayerName 客户开票公司名称
      */
-    @JSONField(name = "customer_texpayer_name")
+    @JSONField(name="customer_texpayer_name")
     public void setCustomerTexpayerName(String customerTexpayerName) {
         set("customer_texpayer_name", customerTexpayerName);
     }
-
+    
 
     /**
      * @return customer_texpayer_name 客户开票公司名称
      */
-    @JSONField(name = "customer_texpayer_name")
+    @JSONField(name="customer_texpayer_name")
     public String getCustomerTexpayerName() {
         return getStr("customer_texpayer_name");
     }
@@ -543,20 +523,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerTexpayerNum 客户纳税人识别号
      */
-    @JSONField(name = "customer_texpayer_num")
+    @JSONField(name="customer_texpayer_num")
     public void setCustomerTexpayerNum(String customerTexpayerNum) {
         set("customer_texpayer_num", customerTexpayerNum);
     }
-
+    
 
     /**
      * @return customer_texpayer_num 客户纳税人识别号
      */
-    @JSONField(name = "customer_texpayer_num")
+    @JSONField(name="customer_texpayer_num")
     public String getCustomerTexpayerNum() {
         return getStr("customer_texpayer_num");
     }
@@ -566,43 +545,41 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerAddress
+     * defaultValue: 
+     * @param customerAddress 
      */
-    @JSONField(name = "customer_address")
+    @JSONField(name="customer_address")
     public void setCustomerAddress(String customerAddress) {
         set("customer_address", customerAddress);
     }
-
+    
 
     /**
-     * @return customer_address
+     * @return customer_address 
      */
-    @JSONField(name = "customer_address")
+    @JSONField(name="customer_address")
     public String getCustomerAddress() {
         return getStr("customer_address");
     }
 
     /**
      * name: customer_phone
-     * type: CHAR(11)
+     * type: CHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerPhone
+     * defaultValue: 
+     * @param customerPhone 
      */
-    @JSONField(name = "customer_phone")
+    @JSONField(name="customer_phone")
     public void setCustomerPhone(String customerPhone) {
         set("customer_phone", customerPhone);
     }
-
+    
 
     /**
-     * @return customer_phone
+     * @return customer_phone 
      */
-    @JSONField(name = "customer_phone")
+    @JSONField(name="customer_phone")
     public String getCustomerPhone() {
         return getStr("customer_phone");
     }
@@ -612,20 +589,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerBankName
+     * defaultValue: 
+     * @param customerBankName 
      */
-    @JSONField(name = "customer_bank_name")
+    @JSONField(name="customer_bank_name")
     public void setCustomerBankName(String customerBankName) {
         set("customer_bank_name", customerBankName);
     }
-
+    
 
     /**
-     * @return customer_bank_name
+     * @return customer_bank_name 
      */
-    @JSONField(name = "customer_bank_name")
+    @JSONField(name="customer_bank_name")
     public String getCustomerBankName() {
         return getStr("customer_bank_name");
     }
@@ -635,20 +611,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param customerBankAccount
+     * defaultValue: 
+     * @param customerBankAccount 
      */
-    @JSONField(name = "customer_bank_account")
+    @JSONField(name="customer_bank_account")
     public void setCustomerBankAccount(String customerBankAccount) {
         set("customer_bank_account", customerBankAccount);
     }
-
+    
 
     /**
-     * @return customer_bank_account
+     * @return customer_bank_account 
      */
-    @JSONField(name = "customer_bank_account")
+    @JSONField(name="customer_bank_account")
     public String getCustomerBankAccount() {
         return getStr("customer_bank_account");
     }
@@ -658,20 +633,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(8)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverName 收货人
      */
-    @JSONField(name = "customer_receiver_name")
+    @JSONField(name="customer_receiver_name")
     public void setCustomerReceiverName(String customerReceiverName) {
         set("customer_receiver_name", customerReceiverName);
     }
-
+    
 
     /**
      * @return customer_receiver_name 收货人
      */
-    @JSONField(name = "customer_receiver_name")
+    @JSONField(name="customer_receiver_name")
     public String getCustomerReceiverName() {
         return getStr("customer_receiver_name");
     }
@@ -681,20 +655,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(11)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverPhone 收货人电话
      */
-    @JSONField(name = "customer_receiver_phone")
+    @JSONField(name="customer_receiver_phone")
     public void setCustomerReceiverPhone(String customerReceiverPhone) {
         set("customer_receiver_phone", customerReceiverPhone);
     }
-
+    
 
     /**
      * @return customer_receiver_phone 收货人电话
      */
-    @JSONField(name = "customer_receiver_phone")
+    @JSONField(name="customer_receiver_phone")
     public String getCustomerReceiverPhone() {
         return getStr("customer_receiver_phone");
     }
@@ -704,20 +677,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverAddress 送货地址
      */
-    @JSONField(name = "customer_receiver_address")
+    @JSONField(name="customer_receiver_address")
     public void setCustomerReceiverAddress(String customerReceiverAddress) {
         set("customer_receiver_address", customerReceiverAddress);
     }
-
+    
 
     /**
      * @return customer_receiver_address 送货地址
      */
-    @JSONField(name = "customer_receiver_address")
+    @JSONField(name="customer_receiver_address")
     public String getCustomerReceiverAddress() {
         return getStr("customer_receiver_address");
     }
@@ -727,20 +699,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,8)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverLgtd 收货地址经度
      */
-    @JSONField(name = "customer_receiver_lgtd")
+    @JSONField(name="customer_receiver_lgtd")
     public void setCustomerReceiverLgtd(java.math.BigDecimal customerReceiverLgtd) {
         set("customer_receiver_lgtd", customerReceiverLgtd);
     }
-
+    
 
     /**
      * @return customer_receiver_lgtd 收货地址经度
      */
-    @JSONField(name = "customer_receiver_lgtd")
+    @JSONField(name="customer_receiver_lgtd")
     public java.math.BigDecimal getCustomerReceiverLgtd() {
         return get("customer_receiver_lgtd");
     }
@@ -750,20 +721,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: DECIMAL(12,8)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param customerReceiverLttd 收货地址纬度
      */
-    @JSONField(name = "customer_receiver_lttd")
+    @JSONField(name="customer_receiver_lttd")
     public void setCustomerReceiverLttd(java.math.BigDecimal customerReceiverLttd) {
         set("customer_receiver_lttd", customerReceiverLttd);
     }
-
+    
 
     /**
      * @return customer_receiver_lttd 收货地址纬度
      */
-    @JSONField(name = "customer_receiver_lttd")
+    @JSONField(name="customer_receiver_lttd")
     public java.math.BigDecimal getCustomerReceiverLttd() {
         return get("customer_receiver_lttd");
     }
@@ -773,20 +743,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transCoId 物流公司
      */
-    @JSONField(name = "trans_co_id")
+    @JSONField(name="trans_co_id")
     public void setTransCoId(Integer transCoId) {
         set("trans_co_id", transCoId);
     }
-
+    
 
     /**
      * @return trans_co_id 物流公司
      */
-    @JSONField(name = "trans_co_id")
+    @JSONField(name="trans_co_id")
     public Integer getTransCoId() {
         return getInt("trans_co_id");
     }
@@ -796,20 +765,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoName
+     * defaultValue: 
+     * @param transCoName 
      */
-    @JSONField(name = "trans_co_name")
+    @JSONField(name="trans_co_name")
     public void setTransCoName(String transCoName) {
         set("trans_co_name", transCoName);
     }
-
+    
 
     /**
-     * @return trans_co_name
+     * @return trans_co_name 
      */
-    @JSONField(name = "trans_co_name")
+    @JSONField(name="trans_co_name")
     public String getTransCoName() {
         return getStr("trans_co_name");
     }
@@ -819,20 +787,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param transCoTexpayerName 物流公司开票公司名称
      */
-    @JSONField(name = "trans_co_texpayer_name")
+    @JSONField(name="trans_co_texpayer_name")
     public void setTransCoTexpayerName(String transCoTexpayerName) {
         set("trans_co_texpayer_name", transCoTexpayerName);
     }
-
+    
 
     /**
      * @return trans_co_texpayer_name 物流公司开票公司名称
      */
-    @JSONField(name = "trans_co_texpayer_name")
+    @JSONField(name="trans_co_texpayer_name")
     public String getTransCoTexpayerName() {
         return getStr("trans_co_texpayer_name");
     }
@@ -842,20 +809,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoTexpayerNum
+     * defaultValue: 
+     * @param transCoTexpayerNum 
      */
-    @JSONField(name = "trans_co_texpayer_num")
+    @JSONField(name="trans_co_texpayer_num")
     public void setTransCoTexpayerNum(String transCoTexpayerNum) {
         set("trans_co_texpayer_num", transCoTexpayerNum);
     }
-
+    
 
     /**
-     * @return trans_co_texpayer_num
+     * @return trans_co_texpayer_num 
      */
-    @JSONField(name = "trans_co_texpayer_num")
+    @JSONField(name="trans_co_texpayer_num")
     public String getTransCoTexpayerNum() {
         return getStr("trans_co_texpayer_num");
     }
@@ -865,20 +831,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(256)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoAddress
+     * defaultValue: 
+     * @param transCoAddress 
      */
-    @JSONField(name = "trans_co_address")
+    @JSONField(name="trans_co_address")
     public void setTransCoAddress(String transCoAddress) {
         set("trans_co_address", transCoAddress);
     }
-
+    
 
     /**
-     * @return trans_co_address
+     * @return trans_co_address 
      */
-    @JSONField(name = "trans_co_address")
+    @JSONField(name="trans_co_address")
     public String getTransCoAddress() {
         return getStr("trans_co_address");
     }
@@ -888,20 +853,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(11)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoPhone
+     * defaultValue: 
+     * @param transCoPhone 
      */
-    @JSONField(name = "trans_co_phone")
+    @JSONField(name="trans_co_phone")
     public void setTransCoPhone(String transCoPhone) {
         set("trans_co_phone", transCoPhone);
     }
-
+    
 
     /**
-     * @return trans_co_phone
+     * @return trans_co_phone 
      */
-    @JSONField(name = "trans_co_phone")
+    @JSONField(name="trans_co_phone")
     public String getTransCoPhone() {
         return getStr("trans_co_phone");
     }
@@ -911,20 +875,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(128)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoBankName
+     * defaultValue: 
+     * @param transCoBankName 
      */
-    @JSONField(name = "trans_co_bank_name")
+    @JSONField(name="trans_co_bank_name")
     public void setTransCoBankName(String transCoBankName) {
         set("trans_co_bank_name", transCoBankName);
     }
-
+    
 
     /**
-     * @return trans_co_bank_name
+     * @return trans_co_bank_name 
      */
-    @JSONField(name = "trans_co_bank_name")
+    @JSONField(name="trans_co_bank_name")
     public String getTransCoBankName() {
         return getStr("trans_co_bank_name");
     }
@@ -934,20 +897,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
-     * @param transCoBankAccount
+     * defaultValue: 
+     * @param transCoBankAccount 
      */
-    @JSONField(name = "trans_co_bank_account")
+    @JSONField(name="trans_co_bank_account")
     public void setTransCoBankAccount(String transCoBankAccount) {
         set("trans_co_bank_account", transCoBankAccount);
     }
-
+    
 
     /**
-     * @return trans_co_bank_account
+     * @return trans_co_bank_account 
      */
-    @JSONField(name = "trans_co_bank_account")
+    @JSONField(name="trans_co_bank_account")
     public String getTransCoBankAccount() {
         return getStr("trans_co_bank_account");
     }
@@ -957,20 +919,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param productId 品类id
      */
-    @JSONField(name = "product_id")
+    @JSONField(name="product_id")
     public void setProductId(Integer productId) {
         set("product_id", productId);
     }
-
+    
 
     /**
      * @return product_id 品类id
      */
-    @JSONField(name = "product_id")
+    @JSONField(name="product_id")
     public Integer getProductId() {
         return getInt("product_id");
     }
@@ -980,20 +941,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(255)
      * isNullable: NO
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param productName 品类名称
      */
-    @JSONField(name = "product_name")
+    @JSONField(name="product_name")
     public void setProductName(String productName) {
         set("product_name", productName);
     }
-
+    
 
     /**
      * @return product_name 品类名称
      */
-    @JSONField(name = "product_name")
+    @JSONField(name="product_name")
     public String getProductName() {
         return getStr("product_name");
     }
@@ -1003,20 +963,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param orderclusterId ordercluste id
      */
-    @JSONField(name = "ordercluster_id")
+    @JSONField(name="ordercluster_id")
     public void setOrderclusterId(Integer orderclusterId) {
         set("ordercluster_id", orderclusterId);
     }
-
+    
 
     /**
      * @return ordercluster_id ordercluste id
      */
-    @JSONField(name = "ordercluster_id")
+    @JSONField(name="ordercluster_id")
     public Integer getOrderclusterId() {
         return getInt("ordercluster_id");
     }
@@ -1026,20 +985,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: INT(10)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param prepayCustomerId 预付费客户 prepay_customer 表的id
      */
-    @JSONField(name = "prepay_customer_id")
+    @JSONField(name="prepay_customer_id")
     public void setPrepayCustomerId(Integer prepayCustomerId) {
         set("prepay_customer_id", prepayCustomerId);
     }
-
+    
 
     /**
      * @return prepay_customer_id 预付费客户 prepay_customer 表的id
      */
-    @JSONField(name = "prepay_customer_id")
+    @JSONField(name="prepay_customer_id")
     public Integer getPrepayCustomerId() {
         return getInt("prepay_customer_id");
     }
@@ -1049,20 +1007,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: CHAR(13)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param oldSn 兼容旧系统的数据
      */
-    @JSONField(name = "old_sn")
+    @JSONField(name="old_sn")
     public void setOldSn(String oldSn) {
         set("old_sn", oldSn);
     }
-
+    
 
     /**
      * @return old_sn 兼容旧系统的数据
      */
-    @JSONField(name = "old_sn")
+    @JSONField(name="old_sn")
     public String getOldSn() {
         return getStr("old_sn");
     }
@@ -1072,20 +1029,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param invoiceCode 发票号码
      */
-    @JSONField(name = "invoice_code")
+    @JSONField(name="invoice_code")
     public void setInvoiceCode(String invoiceCode) {
         set("invoice_code", invoiceCode);
     }
-
+    
 
     /**
      * @return invoice_code 发票号码
      */
-    @JSONField(name = "invoice_code")
+    @JSONField(name="invoice_code")
     public String getInvoiceCode() {
         return getStr("invoice_code");
     }
@@ -1095,20 +1051,19 @@ public abstract class BaseOrderTemp> extends BaseMode
      * type: VARCHAR(20)
      * isNullable: YES
      * isPrimaryKey: NO
-     * defaultValue:
-     *
+     * defaultValue: 
      * @param invoiceNumber 发票代码
      */
-    @JSONField(name = "invoice_number")
+    @JSONField(name="invoice_number")
     public void setInvoiceNumber(String invoiceNumber) {
         set("invoice_number", invoiceNumber);
     }
-
+    
 
     /**
      * @return invoice_number 发票代码
      */
-    @JSONField(name = "invoice_number")
+    @JSONField(name="invoice_number")
     public String getInvoiceNumber() {
         return getStr("invoice_number");
     }
@@ -1119,19 +1074,18 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: YES
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param invoiceType 1.普票,2.专票
      */
-    @JSONField(name = "invoice_type")
+    @JSONField(name="invoice_type")
     public void setInvoiceType(Integer invoiceType) {
         set("invoice_type", invoiceType);
     }
-
+    
 
     /**
      * @return invoice_type 1.普票,2.专票
      */
-    @JSONField(name = "invoice_type")
+    @JSONField(name="invoice_type")
     public Integer getInvoiceType() {
         return getInt("invoice_type");
     }
@@ -1142,22 +1096,65 @@ public abstract class BaseOrderTemp> extends BaseMode
      * isNullable: YES
      * isPrimaryKey: NO
      * defaultValue: 1
-     *
      * @param invoiceSite 1.砂站,2.结算中心
      */
-    @JSONField(name = "invoice_site")
+    @JSONField(name="invoice_site")
     public void setInvoiceSite(Integer invoiceSite) {
         set("invoice_site", invoiceSite);
     }
-
+    
 
     /**
      * @return invoice_site 1.砂站,2.结算中心
      */
-    @JSONField(name = "invoice_site")
+    @JSONField(name="invoice_site")
     public Integer getInvoiceSite() {
         return getInt("invoice_site");
     }
 
+    /**
+     * name: weight_discount
+     * type: DECIMAL(6,4)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 1.0000
+     * @param weightDiscount 重量折扣系数
+     */
+    @JSONField(name="weight_discount")
+    public void setWeightDiscount(java.math.BigDecimal weightDiscount) {
+        set("weight_discount", weightDiscount);
+    }
+    
+
+    /**
+     * @return weight_discount 重量折扣系数
+     */
+    @JSONField(name="weight_discount")
+    public java.math.BigDecimal getWeightDiscount() {
+        return get("weight_discount");
+    }
+
+    /**
+     * name: ticket_code
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketCode 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public void setTicketCode(String ticketCode) {
+        set("ticket_code", ticketCode);
+    }
+    
+
+    /**
+     * @return ticket_code 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public String getTicketCode() {
+        return getStr("ticket_code");
+    }
+
 
 }
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketInvalidVerify.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketInvalidVerify.java
new file mode 100644
index 0000000..8cf57c9
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketInvalidVerify.java
@@ -0,0 +1,360 @@
+package com.cowr.model.base;
+
+import com.cowr.common.base.BaseModel;
+import com.jfinal.plugin.activerecord.IBean;
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Generated by COWR Mon Mar 01 10:54:13 CST 2021
+ * TableName: ticket_invalid_verify
+ * Remarks: 结算单管理 - 结算单作废申请
+ * PrimaryKey: id
+ */
+@SuppressWarnings("serial")
+public abstract class BaseTicketInvalidVerify> extends BaseModel implements IBean {
+
+    public static final String tablename = "ticket_invalid_verify";
+
+    @JSONField(serialize=false)
+    public String getTablename(){
+        return tablename;
+    }
+
+    /**
+     * name: id
+     * type: CHAR(32)
+     * isNullable: NO
+     * isPrimaryKey: YES
+     * defaultValue: 
+     * @param id uuid
+     */
+    @JSONField(name="id")
+    public void setId(String id) {
+        set("id", id);
+    }
+    
+
+    /**
+     * @return id uuid
+     */
+    @JSONField(name="id")
+    public String getId() {
+        return getStr("id");
+    }
+
+    /**
+     * name: ticket_code
+     * type: VARCHAR(20)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketCode 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public void setTicketCode(String ticketCode) {
+        set("ticket_code", ticketCode);
+    }
+    
+
+    /**
+     * @return ticket_code 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public String getTicketCode() {
+        return getStr("ticket_code");
+    }
+
+    /**
+     * name: create_time
+     * type: DATETIME(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param createTime 创建时间
+     */
+    @JSONField(name="create_time")
+    public void setCreateTime(java.util.Date createTime) {
+        set("create_time", createTime);
+    }
+    
+
+    /**
+     * @return create_time 创建时间
+     */
+    @JSONField(name="create_time")
+    public java.util.Date getCreateTime() {
+        return get("create_time");
+    }
+
+    /**
+     * name: change_time
+     * type: TIMESTAMP(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: CURRENT_TIMESTAMP
+     * @param changeTime 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public void setChangeTime(java.util.Date changeTime) {
+        set("change_time", changeTime);
+    }
+    
+
+    /**
+     * @return change_time 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public java.util.Date getChangeTime() {
+        return get("change_time");
+    }
+
+    /**
+     * name: state
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 1
+     * @param state 付费状态。
+1.提交、待审核
+2.审核通过,计入余额
+9.作废
+     */
+    @JSONField(name="state")
+    public void setState(Integer state) {
+        set("state", state);
+    }
+    
+
+    /**
+     * @return state 付费状态。
+1.提交、待审核
+2.审核通过,计入余额
+9.作废
+     */
+    @JSONField(name="state")
+    public Integer getState() {
+        return getInt("state");
+    }
+
+    /**
+     * name: create_user_id
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param createUserId 创建用户id
+     */
+    @JSONField(name="create_user_id")
+    public void setCreateUserId(Integer createUserId) {
+        set("create_user_id", createUserId);
+    }
+    
+
+    /**
+     * @return create_user_id 创建用户id
+     */
+    @JSONField(name="create_user_id")
+    public Integer getCreateUserId() {
+        return getInt("create_user_id");
+    }
+
+    /**
+     * name: create_user_name
+     * type: VARCHAR(255)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param createUserName 创建用户姓名
+     */
+    @JSONField(name="create_user_name")
+    public void setCreateUserName(String createUserName) {
+        set("create_user_name", createUserName);
+    }
+    
+
+    /**
+     * @return create_user_name 创建用户姓名
+     */
+    @JSONField(name="create_user_name")
+    public String getCreateUserName() {
+        return getStr("create_user_name");
+    }
+
+    /**
+     * name: verify_user_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param verifyUserId 审核用户id
+     */
+    @JSONField(name="verify_user_id")
+    public void setVerifyUserId(Integer verifyUserId) {
+        set("verify_user_id", verifyUserId);
+    }
+    
+
+    /**
+     * @return verify_user_id 审核用户id
+     */
+    @JSONField(name="verify_user_id")
+    public Integer getVerifyUserId() {
+        return getInt("verify_user_id");
+    }
+
+    /**
+     * name: verify_user_name
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param verifyUserName 审核用户姓名
+     */
+    @JSONField(name="verify_user_name")
+    public void setVerifyUserName(String verifyUserName) {
+        set("verify_user_name", verifyUserName);
+    }
+    
+
+    /**
+     * @return verify_user_name 审核用户姓名
+     */
+    @JSONField(name="verify_user_name")
+    public String getVerifyUserName() {
+        return getStr("verify_user_name");
+    }
+
+    /**
+     * name: order_sn
+     * type: CHAR(16)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param orderSn 关联订单号,方便查询
+     */
+    @JSONField(name="order_sn")
+    public void setOrderSn(String orderSn) {
+        set("order_sn", orderSn);
+    }
+    
+
+    /**
+     * @return order_sn 关联订单号,方便查询
+     */
+    @JSONField(name="order_sn")
+    public String getOrderSn() {
+        return getStr("order_sn");
+    }
+
+    /**
+     * name: type
+     * type: SMALLINT(5)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param type 1、2、3、4、5
+     */
+    @JSONField(name="type")
+    public void setType(Integer type) {
+        set("type", type);
+    }
+    
+
+    /**
+     * @return type 1、2、3、4、5
+     */
+    @JSONField(name="type")
+    public Integer getType() {
+        return getInt("type");
+    }
+
+    /**
+     * name: ticket_receive_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketReceiveId 领用记录id
+     */
+    @JSONField(name="ticket_receive_id")
+    public void setTicketReceiveId(Integer ticketReceiveId) {
+        set("ticket_receive_id", ticketReceiveId);
+    }
+    
+
+    /**
+     * @return ticket_receive_id 领用记录id
+     */
+    @JSONField(name="ticket_receive_id")
+    public Integer getTicketReceiveId() {
+        return getInt("ticket_receive_id");
+    }
+
+    /**
+     * name: supermarket_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param supermarketId 超市id
+     */
+    @JSONField(name="supermarket_id")
+    public void setSupermarketId(Integer supermarketId) {
+        set("supermarket_id", supermarketId);
+    }
+    
+
+    /**
+     * @return supermarket_id 超市id
+     */
+    @JSONField(name="supermarket_id")
+    public Integer getSupermarketId() {
+        return getInt("supermarket_id");
+    }
+
+    /**
+     * name: invalid_memo
+     * type: VARCHAR(255)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invalidMemo 作废申请说明
+     */
+    @JSONField(name="invalid_memo")
+    public void setInvalidMemo(String invalidMemo) {
+        set("invalid_memo", invalidMemo);
+    }
+    
+
+    /**
+     * @return invalid_memo 作废申请说明
+     */
+    @JSONField(name="invalid_memo")
+    public String getInvalidMemo() {
+        return getStr("invalid_memo");
+    }
+
+    /**
+     * name: memo
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param memo 审核说明
+     */
+    @JSONField(name="memo")
+    public void setMemo(String memo) {
+        set("memo", memo);
+    }
+    
+
+    /**
+     * @return memo 审核说明
+     */
+    @JSONField(name="memo")
+    public String getMemo() {
+        return getStr("memo");
+    }
+
+
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketLog.java
new file mode 100644
index 0000000..b70b56b
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketLog.java
@@ -0,0 +1,398 @@
+package com.cowr.model.base;
+
+import com.cowr.common.base.BaseModel;
+import com.jfinal.plugin.activerecord.IBean;
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Generated by COWR Mon Mar 01 10:54:13 CST 2021
+ * TableName: ticket_log
+ * Remarks: 结算单管理 - 结算单使用记录
+ * PrimaryKey: id
+ */
+@SuppressWarnings("serial")
+public abstract class BaseTicketLog> extends BaseModel implements IBean {
+
+    public static final String tablename = "ticket_log";
+
+    @JSONField(serialize=false)
+    public String getTablename(){
+        return tablename;
+    }
+
+    /**
+     * name: id
+     * type: CHAR(32)
+     * isNullable: NO
+     * isPrimaryKey: YES
+     * defaultValue: 
+     * @param id uuid
+     */
+    @JSONField(name="id")
+    public void setId(String id) {
+        set("id", id);
+    }
+    
+
+    /**
+     * @return id uuid
+     */
+    @JSONField(name="id")
+    public String getId() {
+        return getStr("id");
+    }
+
+    /**
+     * name: ticket_receive_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketReceiveId 领用记录id
+     */
+    @JSONField(name="ticket_receive_id")
+    public void setTicketReceiveId(Integer ticketReceiveId) {
+        set("ticket_receive_id", ticketReceiveId);
+    }
+    
+
+    /**
+     * @return ticket_receive_id 领用记录id
+     */
+    @JSONField(name="ticket_receive_id")
+    public Integer getTicketReceiveId() {
+        return getInt("ticket_receive_id");
+    }
+
+    /**
+     * name: ticket_code
+     * type: VARCHAR(20)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param ticketCode 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public void setTicketCode(String ticketCode) {
+        set("ticket_code", ticketCode);
+    }
+    
+
+    /**
+     * @return ticket_code 结算单代码
+     */
+    @JSONField(name="ticket_code")
+    public String getTicketCode() {
+        return getStr("ticket_code");
+    }
+
+    /**
+     * name: create_time
+     * type: DATETIME(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: CURRENT_TIMESTAMP
+     * @param createTime 创建时间
+     */
+    @JSONField(name="create_time")
+    public void setCreateTime(java.util.Date createTime) {
+        set("create_time", createTime);
+    }
+    
+
+    /**
+     * @return create_time 创建时间
+     */
+    @JSONField(name="create_time")
+    public java.util.Date getCreateTime() {
+        return get("create_time");
+    }
+
+    /**
+     * name: change_time
+     * type: TIMESTAMP(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: CURRENT_TIMESTAMP
+     * @param changeTime 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public void setChangeTime(java.util.Date changeTime) {
+        set("change_time", changeTime);
+    }
+    
+
+    /**
+     * @return change_time 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public java.util.Date getChangeTime() {
+        return get("change_time");
+    }
+
+    /**
+     * name: state
+     * type: SMALLINT(5)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 1
+     * @param state 1 新领取、未使用,5 已使用,9 作废
+     */
+    @JSONField(name="state")
+    public void setState(Integer state) {
+        set("state", state);
+    }
+    
+
+    /**
+     * @return state 1 新领取、未使用,5 已使用,9 作废
+     */
+    @JSONField(name="state")
+    public Integer getState() {
+        return getInt("state");
+    }
+
+    /**
+     * name: settlement_time
+     * type: DATETIME(19)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param settlementTime 开票时间
+     */
+    @JSONField(name="settlement_time")
+    public void setSettlementTime(java.util.Date settlementTime) {
+        set("settlement_time", settlementTime);
+    }
+    
+
+    /**
+     * @return settlement_time 开票时间
+     */
+    @JSONField(name="settlement_time")
+    public java.util.Date getSettlementTime() {
+        return get("settlement_time");
+    }
+
+    /**
+     * name: settlement_user_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param settlementUserId 开票用户id
+     */
+    @JSONField(name="settlement_user_id")
+    public void setSettlementUserId(Integer settlementUserId) {
+        set("settlement_user_id", settlementUserId);
+    }
+    
+
+    /**
+     * @return settlement_user_id 开票用户id
+     */
+    @JSONField(name="settlement_user_id")
+    public Integer getSettlementUserId() {
+        return getInt("settlement_user_id");
+    }
+
+    /**
+     * name: settlement_user_name
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param settlementUserName 开票用户姓名
+     */
+    @JSONField(name="settlement_user_name")
+    public void setSettlementUserName(String settlementUserName) {
+        set("settlement_user_name", settlementUserName);
+    }
+    
+
+    /**
+     * @return settlement_user_name 开票用户姓名
+     */
+    @JSONField(name="settlement_user_name")
+    public String getSettlementUserName() {
+        return getStr("settlement_user_name");
+    }
+
+    /**
+     * name: invalid_time
+     * type: DATETIME(19)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invalidTime 作废时间
+     */
+    @JSONField(name="invalid_time")
+    public void setInvalidTime(java.util.Date invalidTime) {
+        set("invalid_time", invalidTime);
+    }
+    
+
+    /**
+     * @return invalid_time 作废时间
+     */
+    @JSONField(name="invalid_time")
+    public java.util.Date getInvalidTime() {
+        return get("invalid_time");
+    }
+
+    /**
+     * name: invalid_user_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invalidUserId 作废用户id
+     */
+    @JSONField(name="invalid_user_id")
+    public void setInvalidUserId(Integer invalidUserId) {
+        set("invalid_user_id", invalidUserId);
+    }
+    
+
+    /**
+     * @return invalid_user_id 作废用户id
+     */
+    @JSONField(name="invalid_user_id")
+    public Integer getInvalidUserId() {
+        return getInt("invalid_user_id");
+    }
+
+    /**
+     * name: invalid_user_name
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invalidUserName 作废用户姓名
+     */
+    @JSONField(name="invalid_user_name")
+    public void setInvalidUserName(String invalidUserName) {
+        set("invalid_user_name", invalidUserName);
+    }
+    
+
+    /**
+     * @return invalid_user_name 作废用户姓名
+     */
+    @JSONField(name="invalid_user_name")
+    public String getInvalidUserName() {
+        return getStr("invalid_user_name");
+    }
+
+    /**
+     * name: invalid_memo
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invalidMemo 作废说明
+     */
+    @JSONField(name="invalid_memo")
+    public void setInvalidMemo(String invalidMemo) {
+        set("invalid_memo", invalidMemo);
+    }
+    
+
+    /**
+     * @return invalid_memo 作废说明
+     */
+    @JSONField(name="invalid_memo")
+    public String getInvalidMemo() {
+        return getStr("invalid_memo");
+    }
+
+    /**
+     * name: order_sn
+     * type: CHAR(16)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param orderSn 关联订单号,方便查询
+     */
+    @JSONField(name="order_sn")
+    public void setOrderSn(String orderSn) {
+        set("order_sn", orderSn);
+    }
+    
+
+    /**
+     * @return order_sn 关联订单号,方便查询
+     */
+    @JSONField(name="order_sn")
+    public String getOrderSn() {
+        return getStr("order_sn");
+    }
+
+    /**
+     * name: type
+     * type: SMALLINT(5)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param type 1、2、3、4、5
+     */
+    @JSONField(name="type")
+    public void setType(Integer type) {
+        set("type", type);
+    }
+    
+
+    /**
+     * @return type 1、2、3、4、5
+     */
+    @JSONField(name="type")
+    public Integer getType() {
+        return getInt("type");
+    }
+
+    /**
+     * name: invoice_number
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceNumber 结算单换取的发票代码
+     */
+    @JSONField(name="invoice_number")
+    public void setInvoiceNumber(String invoiceNumber) {
+        set("invoice_number", invoiceNumber);
+    }
+    
+
+    /**
+     * @return invoice_number 结算单换取的发票代码
+     */
+    @JSONField(name="invoice_number")
+    public String getInvoiceNumber() {
+        return getStr("invoice_number");
+    }
+
+    /**
+     * name: invoice_code
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceCode 结算单换取的发票代码
+     */
+    @JSONField(name="invoice_code")
+    public void setInvoiceCode(String invoiceCode) {
+        set("invoice_code", invoiceCode);
+    }
+    
+
+    /**
+     * @return invoice_code 结算单换取的发票代码
+     */
+    @JSONField(name="invoice_code")
+    public String getInvoiceCode() {
+        return getStr("invoice_code");
+    }
+
+
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketReceive.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketReceive.java
new file mode 100644
index 0000000..8a05cc5
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTicketReceive.java
@@ -0,0 +1,266 @@
+package com.cowr.model.base;
+
+import com.cowr.common.base.BaseModel;
+import com.jfinal.plugin.activerecord.IBean;
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Generated by COWR Mon Mar 01 10:54:13 CST 2021
+ * TableName: ticket_receive
+ * Remarks: 结算单管理 - 领用记录
+ * PrimaryKey: id
+ */
+@SuppressWarnings("serial")
+public abstract class BaseTicketReceive> extends BaseModel implements IBean {
+
+    public static final String tablename = "ticket_receive";
+
+    @JSONField(serialize=false)
+    public String getTablename(){
+        return tablename;
+    }
+
+    /**
+     * name: id
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: YES
+     * defaultValue: 
+     * @param id 
+     */
+    @JSONField(name="id")
+    public void setId(Integer id) {
+        set("id", id);
+    }
+    
+
+    /**
+     * @return id 
+     */
+    @JSONField(name="id")
+    public Integer getId() {
+        return getInt("id");
+    }
+
+    /**
+     * name: surplus
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param surplus 剩余数量
+     */
+    @JSONField(name="surplus")
+    public void setSurplus(Integer surplus) {
+        set("surplus", surplus);
+    }
+    
+
+    /**
+     * @return surplus 剩余数量
+     */
+    @JSONField(name="surplus")
+    public Integer getSurplus() {
+        return getInt("surplus");
+    }
+
+    /**
+     * name: start_code
+     * type: VARCHAR(20)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param startCode 起始号码
+     */
+    @JSONField(name="start_code")
+    public void setStartCode(String startCode) {
+        set("start_code", startCode);
+    }
+    
+
+    /**
+     * @return start_code 起始号码
+     */
+    @JSONField(name="start_code")
+    public String getStartCode() {
+        return getStr("start_code");
+    }
+
+    /**
+     * name: end_code
+     * type: VARCHAR(20)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param endCode 截止号码
+     */
+    @JSONField(name="end_code")
+    public void setEndCode(String endCode) {
+        set("end_code", endCode);
+    }
+    
+
+    /**
+     * @return end_code 截止号码
+     */
+    @JSONField(name="end_code")
+    public String getEndCode() {
+        return getStr("end_code");
+    }
+
+    /**
+     * name: current_code
+     * type: VARCHAR(20)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param currentCode 当前使用到的号码
+     */
+    @JSONField(name="current_code")
+    public void setCurrentCode(String currentCode) {
+        set("current_code", currentCode);
+    }
+    
+
+    /**
+     * @return current_code 当前使用到的号码
+     */
+    @JSONField(name="current_code")
+    public String getCurrentCode() {
+        return getStr("current_code");
+    }
+
+    /**
+     * name: create_time
+     * type: DATETIME(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: CURRENT_TIMESTAMP
+     * @param createTime 创建时间
+     */
+    @JSONField(name="create_time")
+    public void setCreateTime(java.util.Date createTime) {
+        set("create_time", createTime);
+    }
+    
+
+    /**
+     * @return create_time 创建时间
+     */
+    @JSONField(name="create_time")
+    public java.util.Date getCreateTime() {
+        return get("create_time");
+    }
+
+    /**
+     * name: change_time
+     * type: TIMESTAMP(19)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: CURRENT_TIMESTAMP
+     * @param changeTime 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public void setChangeTime(java.util.Date changeTime) {
+        set("change_time", changeTime);
+    }
+    
+
+    /**
+     * @return change_time 最后修改时间
+     */
+    @JSONField(name="change_time")
+    public java.util.Date getChangeTime() {
+        return get("change_time");
+    }
+
+    /**
+     * name: receive_user_id
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param receiveUserId 领取用户id
+     */
+    @JSONField(name="receive_user_id")
+    public void setReceiveUserId(Integer receiveUserId) {
+        set("receive_user_id", receiveUserId);
+    }
+    
+
+    /**
+     * @return receive_user_id 领取用户id
+     */
+    @JSONField(name="receive_user_id")
+    public Integer getReceiveUserId() {
+        return getInt("receive_user_id");
+    }
+
+    /**
+     * name: receive_user_name
+     * type: VARCHAR(255)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param receiveUserName 领取用户姓名
+     */
+    @JSONField(name="receive_user_name")
+    public void setReceiveUserName(String receiveUserName) {
+        set("receive_user_name", receiveUserName);
+    }
+    
+
+    /**
+     * @return receive_user_name 领取用户姓名
+     */
+    @JSONField(name="receive_user_name")
+    public String getReceiveUserName() {
+        return getStr("receive_user_name");
+    }
+
+    /**
+     * name: supermarket_id
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param supermarketId 领取超市id
+     */
+    @JSONField(name="supermarket_id")
+    public void setSupermarketId(Integer supermarketId) {
+        set("supermarket_id", supermarketId);
+    }
+    
+
+    /**
+     * @return supermarket_id 领取超市id
+     */
+    @JSONField(name="supermarket_id")
+    public Integer getSupermarketId() {
+        return getInt("supermarket_id");
+    }
+
+    /**
+     * name: invalid_count
+     * type: INT(10)
+     * isNullable: NO
+     * isPrimaryKey: NO
+     * defaultValue: 0
+     * @param invalidCount 作废数量
+     */
+    @JSONField(name="invalid_count")
+    public void setInvalidCount(Integer invalidCount) {
+        set("invalid_count", invalidCount);
+    }
+    
+
+    /**
+     * @return invalid_count 作废数量
+     */
+    @JSONField(name="invalid_count")
+    public Integer getInvalidCount() {
+        return getInt("invalid_count");
+    }
+
+
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java
index be3c6e1..f101d27 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java
@@ -24,8 +24,8 @@ import java.util.Map;
  * PrimaryKey: id
  */
 public class InvoiceReceiveService extends BaseService {
-    private static      Log                   log = Log.getLog(InvoiceReceiveService.class);
-    public static final InvoiceReceiveService me  = new InvoiceReceiveService();
+    private static final Log                   log = Log.getLog(InvoiceReceiveService.class);
+    public static final  InvoiceReceiveService me  = new InvoiceReceiveService();
 
     /**
      * 检查发票代码、发票号码是否是领用过的,并且领用还没有被用完
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyPKValidator.java
new file mode 100644
index 0000000..4c50ab8
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyPKValidator.java
@@ -0,0 +1,25 @@
+package com.cowr.ssjygl.ticket.invalidverify;
+
+
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketInvalidVerify;
+import com.jfinal.core.Controller;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_invalid_verify
+ * Remarks: 结算单管理 - 结算单作废申请
+ * PrimaryKey: id
+ */
+public class TicketInvalidVerifyPKValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        validateRequired("id", "id", "id 必填");
+        validateString("id", 1, 32, "id", "id 长度 1~32");
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyService.java
new file mode 100644
index 0000000..d0f8a3c
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyService.java
@@ -0,0 +1,93 @@
+package com.cowr.ssjygl.ticket.invalidverify;
+
+import com.cowr.common.Const;
+import com.cowr.common.base.BaseService;
+import com.cowr.common.view.PageParam;
+import com.cowr.model.TicketInvalidVerify;
+import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_invalid_verify
+ * Remarks: 结算单管理 - 结算单作废申请
+ * PrimaryKey: id
+ */
+public class TicketInvalidVerifyService extends BaseService {
+    public static final TicketInvalidVerifyService me = new TicketInvalidVerifyService();
+
+    public Page find(
+            PageParam pp,
+            String stm,
+            String etm,
+            String ticket_code,
+            String order_sn,
+            String create_user_name,
+            Integer supermarket_id,
+            Integer state
+    ) {
+        String selectsql = "select t.*, s.name supermarket_name ";
+        String fromsql = "from ticket_invalid_verify t \n" +
+                " left join supermarket s on s.id = t.supermarket_id \n" +
+                " where 1=1 ";
+        List paraList = new ArrayList<>();
+
+        String totalRowSql = "select count(*) " + fromsql;
+        String findSql     = selectsql + fromsql;
+
+        if (StrKit.notBlank(stm)) {
+            fromsql += " and t.create_time >= ? \n";
+            paraList.add(stm);
+        }
+
+        if (StrKit.notBlank(etm)) {
+            fromsql += " and t.create_time <= ? \n";
+            paraList.add(etm);
+        }
+
+        if (StrKit.notBlank(ticket_code)) {
+            fromsql += " and t.ticket_code like ? \n";
+            paraList.add("%" + ticket_code.trim() + "%");
+        }
+
+        if (StrKit.notBlank(order_sn)) {
+            fromsql += " and t.order_sn like ? \n";
+            paraList.add("%" + order_sn.trim() + "%");
+        }
+
+        if (StrKit.notBlank(create_user_name)) {
+            fromsql += " and t.create_user_name like ? \n";
+            paraList.add("%" + create_user_name.trim() + "%");
+        }
+
+        if (supermarket_id != null) {
+            fromsql += " and t.supermarket_id = ? \n";
+            paraList.add(supermarket_id);
+        }
+
+        if (state != null) {
+            fromsql += " and t.state = ? \n";
+            paraList.add(state);
+        }
+
+        // 前端传了排序字段,并且排序字段存在相关表中
+        if (StrKit.notBlank(pp.getSort_field()) && TicketInvalidVerify.dao.hasColunm(pp.getSort_field())) {
+            findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field();
+
+            if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) {
+                findSql += " " + Const.ORDER_BY_ASC;
+            } else {
+                findSql += " " + Const.ORDER_BY_DESC;
+            }
+        } else {
+            findSql += " order by t.create_time desc ";
+        }
+
+        return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray());
+    }
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java
new file mode 100644
index 0000000..2ae6dbc
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java
@@ -0,0 +1,79 @@
+package com.cowr.ssjygl.ticket.invalidverify;
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketInvalidVerify;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_invalid_verify
+ * Remarks: 结算单管理 - 结算单作废申请
+ * PrimaryKey: id
+ */
+public class TicketInvalidVerifyValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断
+        if (!"save".equals(getActionMethodName())) {
+            validateRequired("id", "id", "id 必填");
+
+            validateString("id", 1, 32, "id", "id 长度 1~32");
+        }
+        
+        validateString("ticket_code", 1, 20, "ticket_code", "ticket_code 长度 1~20");
+        
+        
+        validateString("create_time", 1, 19, "create_time", "create_time 长度 1~19");
+        
+        validateDate("create_time", "yyyy-MM-dd HH:mm:ss", false, "create_time", "create_time 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整
+        
+        validateString("change_time", 0, 19, "change_time", "change_time 长度 0~19");
+        
+        
+        validateInteger("state", -2147483647, 2147483647, "state", "state 范围 -2147483647~2147483647");
+        
+        
+        validateInteger("create_user_id", 1, 2147483647, "create_user_id", "create_user_id 范围 1~2147483647");
+        
+        
+        validateString("create_user_name", 1, 255, "create_user_name", "create_user_name 长度 1~255");
+        
+        if (StrKit.notBlank(c.get("verify_user_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("verify_user_id", 1, 2147483647, "verify_user_id", "verify_user_id 范围 1~2147483647");
+        } 
+        
+        validateString("verify_user_name", 0, 255, "verify_user_name", "verify_user_name 长度 0~255");
+        
+        
+        validateString("order_sn", 0, 16, "order_sn", "order_sn 长度 0~16");
+        
+        if (StrKit.notBlank(c.get("type"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("type", -999999, 999999, "type", "type 范围 -999999~999999");
+        } 
+        if (StrKit.notBlank(c.get("invoice_receive_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("invoice_receive_id", 1, 2147483647, "invoice_receive_id", "invoice_receive_id 范围 1~2147483647");
+        } 
+        if (StrKit.notBlank(c.get("supermarket_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647");
+        } 
+        
+        validateString("invalid_memo", 1, 255, "invalid_memo", "invalid_memo 长度 1~255");
+        
+        
+        validateString("memo", 0, 255, "memo", "memo 长度 0~255");
+        
+
+        // 使用 model 更新时,model 不能只有主键有值
+        // 这里用 getActionMethodName 写死,判断是 update 时,才做验证
+        // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段
+        if ("edit".equals(getActionMethodName())) {
+            validateUpdateModel(TicketInvalidVerify.class, "", true); // 忽略不在model中的字段
+        }
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogPKValidator.java
new file mode 100644
index 0000000..8ce0e21
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogPKValidator.java
@@ -0,0 +1,25 @@
+package com.cowr.ssjygl.ticket.log;
+
+
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketLog;
+import com.jfinal.core.Controller;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_log
+ * Remarks: 结算单管理 - 结算单使用记录
+ * PrimaryKey: id
+ */
+public class TicketLogPKValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        validateRequired("id", "id", "id 必填");
+        validateString("id", 1, 32, "id", "id 长度 1~32");
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogService.java
new file mode 100644
index 0000000..dd878fc
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogService.java
@@ -0,0 +1,251 @@
+package com.cowr.ssjygl.ticket.log;
+
+import com.cowr.common.Const;
+import com.cowr.common.base.BaseService;
+import com.cowr.common.enums.OrderStateEnum;
+import com.cowr.common.utils.DataUtil;
+import com.cowr.common.utils.DateTimeUtil;
+import com.cowr.common.view.PageParam;
+import com.cowr.model.TicketLog;
+import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_log
+ * Remarks: 结算单管理 - 结算单使用记录
+ * PrimaryKey: id
+ */
+public class TicketLogService extends BaseService {
+    public static final TicketLogService me = new TicketLogService();
+
+    public TicketLog checkInvalidTicketLog(String ticket_code) {
+        return TicketLog.dao.findFirst(
+                "select * from ticket_log t where t.state = ? and t.ticket_code = ?",
+                OrderStateEnum.INVALID.getStateid(),
+                ticket_code
+        );
+    }
+
+    public Page find(PageParam pp, Integer supermarket_id, Integer state, String order_sn, String stm, String etm, String ticket_code) {
+        String selectsql = "select t.*, r.supermarket_id, s.name supermarket_name, \n" +
+                " case when t.type = 1 then o.weight                when t.type = 3 then p.weight               end weight, \n" +
+                " case when t.type = 1 then o.total_price           when t.type = 3 then p.total_price          end total_price, \n" +
+                " case when t.type = 1 then o.create_time           when t.type = 3 then p.create_time          end create_time, \n" +
+                " case when t.type = 1 then o.settlement_user_name  when t.type = 3 then p.settlement_user_name end settlement_user_name, \n" +
+                " case when t.type = 1 then o.customer_name         when t.type = 3 then p.customer_name        end customer_name ";
+        String fromsql = "from ticket_log t \n" +
+                " left join ticket_receive r on r.id = t.ticket_receive_id \n" +
+                " left join supermarket s on s.id = r.supermarket_id \n" +
+                " left join order_sale o on o.sn = t.order_sn \n" +
+                " left join order_temp p on p.sn = t.order_sn \n" +
+                " where 1=1 ";
+        List paraList = new ArrayList<>();
+
+        if (supermarket_id != null) {
+            fromsql += " and r.supermarket_id = ? \n";
+            paraList.add(supermarket_id);
+        }
+
+        if (state != null) {
+            fromsql += " and t.state = ? \n";
+            paraList.add(state);
+        }
+
+        if (StrKit.notBlank(order_sn)) {
+            fromsql += " and t.order_sn like ? \n";
+            paraList.add("%" + order_sn.trim() + "%");
+        }
+
+        if (StrKit.notBlank(stm)) {
+            fromsql += " and t.create_time >= ? \n";
+            paraList.add(stm);
+        }
+
+        if (StrKit.notBlank(etm)) {
+            fromsql += " and t.create_time <= ? \n";
+            paraList.add(etm);
+        }
+
+        if (StrKit.notBlank(ticket_code)) {
+            fromsql += " and t.ticket_code like ? \n";
+            paraList.add("%" + ticket_code.trim() + "%");
+        }
+
+        String totalRowSql = "select count(*) " + fromsql;
+        String findSql     = selectsql + fromsql;
+
+        // 前端传了排序字段,并且排序字段存在相关表中
+        if (StrKit.notBlank(pp.getSort_field()) && TicketLog.dao.hasColunm(pp.getSort_field())) {
+            findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field();
+
+            if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) {
+                findSql += " " + Const.ORDER_BY_ASC;
+            } else {
+                findSql += " " + Const.ORDER_BY_DESC;
+            }
+        } else {
+            findSql += " order by t.create_time desc";
+        }
+
+        return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray());
+    }
+
+    public Workbook export(Integer supermarket_id, Integer state, String order_sn, String stm, String etm, String ticket_code) {
+        String selectsql = "select t.*, r.supermarket_id, s.name supermarket_name, \n" +
+                " tr.first_weight, tr.second_weight, \n" +
+                " case when t.type = 1 then o.weight                when t.type = 3 then p.weight               end weight, \n" +
+                " case when t.type = 1 then o.total_price           when t.type = 3 then p.total_price          end total_price, \n" +
+                " case when t.type = 1 then o.create_time           when t.type = 3 then p.create_time          end order_create_time, \n" +
+                " case when t.type = 1 then o.settlement_user_name  when t.type = 3 then p.settlement_user_name end settlement_user_name, \n" +
+                " case when t.type = 1 then o.truck_license         when t.type = 3 then p.truck_license        end truck_license, \n" +
+                " case when t.type = 1 then o.customer_texpayer_name         when t.type = 3 then p.customer_texpayer_name        end customer_texpayer_name, \n" +
+                " case when t.type = 1 then o.customer_texpayer_num         when t.type = 3 then p.customer_texpayer_num        end customer_texpayer_num, \n" +
+                " case when t.type = 1 then o.customer_name         when t.type = 3 then p.customer_name        end customer_name ";
+        String fromsql = "from ticket_log t \n" +
+                " left join ticket_receive r on r.id = t.ticket_receive_id \n" +
+                " left join supermarket s on s.id = r.supermarket_id \n" +
+                " left join order_sale o on o.sn = t.order_sn \n" +
+                " left join order_temp p on p.sn = t.order_sn \n" +
+                " left join transport tr on tr.order_sn = t.order_sn \n" +
+                " where 1=1 \n";
+        List paraList = new ArrayList<>();
+
+        if (supermarket_id != null) {
+            fromsql += " and r.supermarket_id = ? \n";
+            paraList.add(supermarket_id);
+        }
+
+        if (state != null) {
+            fromsql += " and t.state = ? \n";
+            paraList.add(state);
+        }
+
+        if (StrKit.notBlank(order_sn)) {
+            fromsql += " and t.order_sn like ? \n";
+            paraList.add("%" + order_sn.trim() + "%");
+        }
+
+        if (StrKit.notBlank(stm)) {
+            fromsql += " and t.create_time >= ? \n";
+            paraList.add(stm);
+        }
+
+        if (StrKit.notBlank(etm)) {
+            fromsql += " and t.create_time <= ? \n";
+            paraList.add(etm);
+        }
+
+        if (StrKit.notBlank(ticket_code)) {
+            fromsql += " and t.ticket_code like ? \n";
+            paraList.add("%" + ticket_code.trim() + "%");
+        }
+
+        String       findSql = selectsql + fromsql + " order by t.create_time desc";
+        List list    = Db.find(findSql, paraList.toArray());
+
+        Workbook wb    = new XSSFWorkbook();
+        Sheet    sheet = wb.createSheet("结算单使用日志");
+
+        // 表头 start
+        Row row = sheet.createRow(0);
+        int a   = 0;
+        row.createCell(a++).setCellValue("序号");
+        row.createCell(a++).setCellValue("结算单编号");
+        row.createCell(a++).setCellValue("发票代码");
+        row.createCell(a++).setCellValue("发票编号");
+        row.createCell(a++).setCellValue("开票名称");
+        row.createCell(a++).setCellValue("开票税号");
+        row.createCell(a++).setCellValue("订单号");
+        row.createCell(a++).setCellValue("总价");
+        row.createCell(a++).setCellValue("开票时间");
+        row.createCell(a++).setCellValue("开票人");
+        row.createCell(a++).setCellValue("作废时间");
+        row.createCell(a++).setCellValue("作废人");
+        row.createCell(a++).setCellValue("状态");
+        row.createCell(a++).setCellValue("砂站");
+        row.createCell(a++).setCellValue("车牌号");
+        row.createCell(a++).setCellValue("数量(吨)");
+        row.createCell(a++).setCellValue("皮重(吨)");
+        row.createCell(a++).setCellValue("毛重(吨)");
+        row.createCell(a++).setCellValue("备注");
+        // 表头 end
+
+        int end_col = 16;
+        int datalen = list.size();
+        for (int i = 0; i < datalen; i++) {
+            Record order = list.get(i);
+
+            row = sheet.createRow(i + 1);
+            a   = 0;
+            row.createCell(a++).setCellValue(i + 1);
+            row.createCell(a++).setCellValue(order.getStr("ticket_code"));
+            row.createCell(a++).setCellValue(order.getStr("invoice_number"));
+            row.createCell(a++).setCellValue(order.getStr("invoice_code"));
+            row.createCell(a++).setCellValue(order.getStr("customer_texpayer_name"));
+            row.createCell(a++).setCellValue(order.getStr("customer_texpayer_num"));
+            row.createCell(a++).setCellValue(order.getStr("order_sn"));
+            row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "total_price"));
+            row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("create_time")));
+            row.createCell(a++).setCellValue(order.getStr("settlement_user_name"));
+            if (order.get("invalid_time") != null) {
+                row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("invalid_time")));
+            } else {
+                row.createCell(a++).setCellValue("");
+            }
+            row.createCell(a++).setCellValue(order.getStr("invalid_user_name"));
+            switch (order.getInt("state")) {
+                case 5:
+                    row.createCell(a++).setCellValue("已使用");
+                    break;
+                case 9:
+                    row.createCell(a++).setCellValue("已作废");
+                    break;
+                default:
+                    row.createCell(a++).setCellValue("");
+            }
+
+            row.createCell(a++).setCellValue(order.getStr("supermarket_name"));
+            row.createCell(a++).setCellValue(order.getStr("truck_license"));
+            row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "weight"));
+            row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "first_weight"));
+            row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "second_weight"));
+            row.createCell(a++).setCellValue(order.getStr("invalid_memo"));
+        }
+
+        // 通用单元格格式
+        Font      font      = wb.createFont();
+        CellStyle cellStyle = wb.createCellStyle();
+        font.setFontHeight((short) (10 * 20));
+        font.setFontName("宋体");
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
+        cellStyle.setFont(font);
+
+        // 设置通用单元格格式
+        for (int r = 0; r < datalen + 1; r++) {
+            row = sheet.getRow(r);
+            if (row == null) {
+                row = sheet.createRow(r);
+            }
+
+            for (int c = 0; c < end_col + 1; c++) {
+                Cell cell = row.getCell(c);
+
+                if (cell == null) {
+                    cell = row.createCell(c);
+                }
+                cell.setCellStyle(cellStyle);
+            }
+        }
+
+        return wb;
+    }
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogValidator.java
new file mode 100644
index 0000000..ed5f257
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/log/TicketLogValidator.java
@@ -0,0 +1,86 @@
+package com.cowr.ssjygl.ticket.log;
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketLog;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_log
+ * Remarks: 结算单管理 - 结算单使用记录
+ * PrimaryKey: id
+ */
+public class TicketLogValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断
+        if (!"save".equals(getActionMethodName())) {
+            validateRequired("id", "id", "id 必填");
+
+            validateString("id", 1, 32, "id", "id 长度 1~32");
+        }
+        if (StrKit.notBlank(c.get("ticket_receive_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("ticket_receive_id", 1, 2147483647, "ticket_receive_id", "ticket_receive_id 范围 1~2147483647");
+        } 
+        
+        validateString("ticket_code", 1, 20, "ticket_code", "ticket_code 长度 1~20");
+        
+        
+        validateString("create_time", 0, 19, "create_time", "create_time 长度 0~19");
+        
+        
+        validateString("change_time", 0, 19, "change_time", "change_time 长度 0~19");
+        
+        
+        validateInteger("state", -999999, 999999, "state", "state 范围 -999999~999999");
+        
+        
+        validateString("settlement_time", 0, 19, "settlement_time", "settlement_time 长度 0~19");
+        
+        validateDate("settlement_time", "yyyy-MM-dd HH:mm:ss", false, "settlement_time", "settlement_time 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整
+        if (StrKit.notBlank(c.get("settlement_user_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("settlement_user_id", 1, 2147483647, "settlement_user_id", "settlement_user_id 范围 1~2147483647");
+        } 
+        
+        validateString("settlement_user_name", 0, 255, "settlement_user_name", "settlement_user_name 长度 0~255");
+        
+        
+        validateString("invalid_time", 0, 19, "invalid_time", "invalid_time 长度 0~19");
+        
+        validateDate("invalid_time", "yyyy-MM-dd HH:mm:ss", false, "invalid_time", "invalid_time 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整
+        if (StrKit.notBlank(c.get("invalid_user_id"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("invalid_user_id", 1, 2147483647, "invalid_user_id", "invalid_user_id 范围 1~2147483647");
+        } 
+        
+        validateString("invalid_user_name", 0, 255, "invalid_user_name", "invalid_user_name 长度 0~255");
+        
+        
+        validateString("invalid_memo", 0, 255, "invalid_memo", "invalid_memo 长度 0~255");
+        
+        
+        validateString("order_sn", 0, 16, "order_sn", "order_sn 长度 0~16");
+        
+        if (StrKit.notBlank(c.get("type"))) { // 可为空字段,当传入值时,才做验证 
+        validateInteger("type", -999999, 999999, "type", "type 范围 -999999~999999");
+        } 
+        
+        validateString("invoice_number", 0, 20, "invoice_number", "invoice_number 长度 0~20");
+        
+        
+        validateString("invoice_code", 0, 20, "invoice_code", "invoice_code 长度 0~20");
+        
+
+        // 使用 model 更新时,model 不能只有主键有值
+        // 这里用 getActionMethodName 写死,判断是 update 时,才做验证
+        // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段
+        if ("edit".equals(getActionMethodName())) {
+            validateUpdateModel(TicketLog.class, "", true); // 忽略不在model中的字段
+        }
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceivePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceivePKValidator.java
new file mode 100644
index 0000000..6e29e02
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceivePKValidator.java
@@ -0,0 +1,25 @@
+package com.cowr.ssjygl.ticket.receive;
+
+
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketReceive;
+import com.jfinal.core.Controller;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_receive
+ * Remarks: 结算单管理 - 领用记录
+ * PrimaryKey: id
+ */
+public class TicketReceivePKValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        validateRequired("id", "id", "id 必填");
+        validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647");
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveService.java
new file mode 100644
index 0000000..5d88277
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveService.java
@@ -0,0 +1,184 @@
+package com.cowr.ssjygl.ticket.receive;
+
+import com.cowr.common.Const;
+import com.cowr.common.base.BaseService;
+import com.cowr.common.view.PageParam;
+import com.cowr.model.TicketLog;
+import com.cowr.model.TicketReceive;
+import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_receive
+ * Remarks: 结算单管理 - 领用记录
+ * PrimaryKey: id
+ */
+public class TicketReceiveService extends BaseService {
+    private static final Log                  log = Log.getLog(TicketReceiveService.class);
+    public static final  TicketReceiveService me  = new TicketReceiveService();
+
+    /**
+     * 检查结算单代码、结算单号码是否是领用过的,并且领用还没有被用完
+     *
+     * @param supermarket_id
+     * @param ticket_code
+     * @return
+     */
+    public TicketReceive checkSurplusReceive(int supermarket_id, String ticket_code) {
+        if (!StrKit.notBlank(ticket_code)) {
+            return null;
+        }
+
+        Integer code = Integer.parseInt(ticket_code);
+
+        String sql = "select * from ticket_receive t\n" +
+                " where t.supermarket_id = ? \n" +
+                " and t.surplus > 0 \n" +
+                " and cast(t.start_code as unsigned integer) <= ? \n" +
+                " and cast(t.end_code as unsigned integer) >= ? \n" +
+                " limit 1";
+        TicketReceive receive = TicketReceive.dao.findFirst(sql, supermarket_id, code, code);
+
+        return receive;
+    }
+
+    public TicketReceive checkReceive(int supermarket_id, String ticket_code) {
+        if (!StrKit.notBlank(ticket_code)) {
+            return null;
+        }
+
+        Integer code = Integer.parseInt(ticket_code);
+        String sql = "select * from ticket_receive t\n" +
+                " where t.supermarket_id = ? \n" +
+                " and cast(t.start_code as unsigned integer) <= ? \n" +
+                " and cast(t.end_code as unsigned integer) >= ? \n" +
+                " limit 1";
+
+        TicketReceive receive = TicketReceive.dao.findFirst(sql, supermarket_id, code, code);
+
+        return receive;
+    }
+
+    private String getValidTicketCode(String next_ticket_code, Map map) {
+        if (map.containsKey(next_ticket_code)) { // 说明下一个结算单号码已经作废,需要继续顺延
+            return getValidTicketCode(String.format("%0" + next_ticket_code.length() + "d", Integer.parseInt(next_ticket_code) + 1), map);
+        } else {
+            return next_ticket_code;
+        }
+    }
+
+
+    /**
+     * 获取指定砂站下一个可用的结算单号码
+     * TODO:要区分专票和普票
+     *
+     * @param supermarket_id
+     * @return
+     */
+    public List nextTicketCodes(int supermarket_id) {
+        String sql = "select * from ticket_receive t\n" +
+                " where t.supermarket_id = ? \n" +
+                " and t.surplus > 0\n" +
+                " order by cast(t.start_code as unsigned integer) asc";
+
+        List receives = TicketReceive.dao.find(sql, supermarket_id);
+
+        if (receives.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        List out       = new ArrayList<>();
+        List params    = new ArrayList<>();
+        List sqlparams = new ArrayList<>();
+
+        for (TicketReceive receive : receives) {
+            params.add(receive.getId());
+            sqlparams.add("?");
+        }
+
+        if (!sqlparams.isEmpty()) {
+            // 凡是有 ticket_log 记录的结算单都不能再用了
+            List logs = TicketLog.dao.find("select * from ticket_log t where t.ticket_receive_id in(" + StrKit.join(sqlparams, ",") + ")", params.toArray());
+
+            Map map = new HashMap<>();
+
+            for (TicketLog l : logs) {
+                map.put(l.getTicketCode(), l);
+            }
+
+            for (TicketReceive receive : receives) {
+                Record record = receive.toRecord();
+
+                String next_ticket_code = receive.getCurrentCode() == null ? receive.getStartCode() : receive.getCurrentCode();
+                next_ticket_code = getValidTicketCode(next_ticket_code, map);
+
+                if (Long.parseLong(next_ticket_code) > Long.parseLong(receive.getEndCode())) {
+                    log.debug("顺延后的 next_ticket_code 超过了 end_code %s %s", receive.getId(), next_ticket_code);
+                    continue;
+                }
+
+                record.set("next_ticket_code", next_ticket_code);
+
+                out.add(record);
+            }
+        }
+
+
+        return out;
+    }
+
+    public Page find(PageParam pp, Integer supermarket_id, String reveiver_user_name, String stm, String etm) {
+        String selectsql = "select t.*, s.name supermarket_name, s.name2 supermarket_name2  ";
+        String fromsql = "from ticket_receive t \n" +
+                " left join supermarket s on s.id = t.supermarket_id" +
+                " where 1=1 ";
+        List paraList = new ArrayList<>();
+
+        if (supermarket_id != null) {
+            fromsql += " and t.supermarket_id = ? \n";
+            paraList.add(supermarket_id);
+        }
+
+        if (StrKit.notBlank(reveiver_user_name)) {
+            fromsql += " and t.receive_user_name like ? \n";
+            paraList.add("%" + reveiver_user_name.trim() + "%");
+        }
+
+        if (StrKit.notBlank(stm)) {
+            fromsql += " and t.create_time >= ? \n";
+            paraList.add(stm);
+        }
+
+        if (StrKit.notBlank(etm)) {
+            fromsql += " and t.create_time <= ? \n";
+            paraList.add(etm);
+        }
+
+        String totalRowSql = "select count(*) " + fromsql;
+        String findSql     = selectsql + fromsql;
+
+        // 前端传了排序字段,并且排序字段存在相关表中
+        if (StrKit.notBlank(pp.getSort_field()) && TicketReceive.dao.hasColunm(pp.getSort_field())) {
+            findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field();
+
+            if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) {
+                findSql += " " + Const.ORDER_BY_ASC;
+            } else {
+                findSql += " " + Const.ORDER_BY_DESC;
+            }
+        } else {
+            findSql += " order by t.create_time desc";
+        }
+
+        return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray());
+    }
+}
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveValidator.java
new file mode 100644
index 0000000..40c54c2
--- /dev/null
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/ticket/receive/TicketReceiveValidator.java
@@ -0,0 +1,47 @@
+package com.cowr.ssjygl.ticket.receive;
+
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketReceive;
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+
+/**
+ * Generated by COWR Fri Feb 26 16:03:36 CST 2021
+ * TableName: ticket_receive
+ * Remarks: 结算单管理 - 领用记录
+ * PrimaryKey: id
+ */
+public class TicketReceiveValidator extends CrudParamValidator {
+    @Override
+    protected void validate(Controller c) {
+        // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断
+        if (!"save".equals(getActionMethodName())) {
+            validateRequired("id", "id", "id 必填");
+
+            validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647");
+        }
+
+        validateString("start_code", 1, 20, "start_code", "start_code 长度 1~20");
+        validateString("end_code", 1, 20, "end_code", "end_code 长度 1~20");
+        validateInteger("receive_user_id", 1, 2147483647, "receive_user_id", "receive_user_id 范围 1~2147483647");
+        validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647");
+
+        if (StrKit.notBlank(c.get("start_code"), c.get("end_code"))) {
+            if (c.getInt("end_code") - c.getInt("start_code") < 0) {
+                addError("end_code", "end_code 必须大于等于 start_code");
+            }
+        }
+
+        // 使用 model 更新时,model 不能只有主键有值
+        // 这里用 getActionMethodName 写死,判断是 update 时,才做验证
+        // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段
+        if ("edit".equals(getActionMethodName())) {
+            validateUpdateModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        }
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-common/src/main/java/generator/Main.java b/ssjygl-xsx-common/src/main/java/generator/Main.java
index e2e03ad..2967cb1 100644
--- a/ssjygl-xsx-common/src/main/java/generator/Main.java
+++ b/ssjygl-xsx-common/src/main/java/generator/Main.java
@@ -79,6 +79,10 @@ public class Main {
                 "invoice_invalid_verify",
                 "order_invalid_verify",
                 "sms_notice_contact",
+
+                "ticket_invalid_verify",
+                "ticket_log",
+                "ticket_receive",
         };
 
         PropKit.use("db.properties");
diff --git a/ssjygl-xsx-common/src/main/resources/generator/service_template.jf b/ssjygl-xsx-common/src/main/resources/generator/service_template.jf
index 7c924d9..140db56 100644
--- a/ssjygl-xsx-common/src/main/resources/generator/service_template.jf
+++ b/ssjygl-xsx-common/src/main/resources/generator/service_template.jf
@@ -5,6 +5,7 @@ import com.cowr.common.base.BaseService;
 import com.cowr.common.view.PageParam;
 import #(modelPackageName).#(tableMeta.modelName);
 import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Page;
 import com.jfinal.plugin.activerecord.Record;
@@ -18,6 +19,7 @@ import java.util.List;
  * PrimaryKey: #(tableMeta.primaryKey)
  */
 public class #(tableMeta.modelName)#(suffix) extends BaseService {
+    private static final Log log = Log.getLog(#(tableMeta.modelName)Service.class);
     public static final #(tableMeta.modelName)Service me = new #(tableMeta.modelName)Service();
 
     public Page find(PageParam pp) {
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java
index 62d29e4..9b73cac 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java
@@ -8,6 +8,9 @@ import com.cowr.local.ssjygl.customer.pact.CustomerPactController;
 import com.cowr.local.ssjygl.customer.supermarketproduct.CustomerSupermarketProductController;
 import com.cowr.local.ssjygl.invoice.invalidverify.InvoiceInvalidVerifyController;
 import com.cowr.local.ssjygl.order.invalidverify.OrderInvalidVerifyController;
+import com.cowr.local.ssjygl.ticket.invalidverify.TicketInvalidVerifyController;
+import com.cowr.local.ssjygl.ticket.log.TicketLogController;
+import com.cowr.local.ssjygl.ticket.receive.TicketReceiveController;
 import com.cowr.ssjygl.actioncmdlog.ActionCmdLogController;
 import com.cowr.local.ssjygl.authlicense.AuthLicenseController;
 import com.cowr.local.ssjygl.authlicense.AuthLicenseSyncService;
@@ -233,6 +236,11 @@ public class Config extends JFinalConfig {
         me.add("/invoice/receive", InvoiceReceiveController.class);
         me.add("/invoice/invalidverify", InvoiceInvalidVerifyController.class);
 
+        // -- 结算单管理
+        me.add("/ticket/log", TicketLogController.class);
+        me.add("/ticket/receive", TicketReceiveController.class);
+        me.add("/ticket/invalidverify", TicketInvalidVerifyController.class);
+
         // -- 日志
         me.add("/log/sms", SmsLogController.class);
         me.add("/log/actioncmd", ActionCmdLogController.class);
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java
new file mode 100644
index 0000000..9009f1a
--- /dev/null
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java
@@ -0,0 +1,41 @@
+package com.cowr.local.ssjygl.ticket.invalidverify;
+
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.local.ssjygl.system.sysuser.SysuserSyncService;
+import com.cowr.model.Sysuser;
+import com.cowr.model.TicketInvalidVerify;
+import com.cowr.ssjygl.ticket.invalidverify.TicketInvalidVerifyService;
+import com.cowr.ssjygl.ticket.invalidverify.TicketInvalidVerifyValidator;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+
+public class TicketInvalidVerifyController extends Controller {
+
+    public void find() {
+        PageParam pp = getBean(PageParam.class, "", true);
+
+        String  stm              = get("stm");
+        String  etm              = get("etm");
+        String  ticket_code      = get("ticket_code");
+        String  order_sn         = get("order_sn");
+        String  create_user_name = get("create_user_name");
+        Integer supermarket_id   = getInt("supermarket_id");
+        Integer state            = getInt("state");
+
+        renderJson(Result.object(TicketInvalidVerifyService.me.find(pp, stm, etm, ticket_code, order_sn, create_user_name, supermarket_id, state)));
+    }
+
+    @Before(TicketInvalidVerifyValidator.class)
+    public void save() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        TicketInvalidVerify model = getModel(TicketInvalidVerify.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketInvalidVerifySyncService.me.save(model, tokenuser));
+    }
+}
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java
new file mode 100644
index 0000000..ab59ac4
--- /dev/null
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java
@@ -0,0 +1,147 @@
+package com.cowr.local.ssjygl.ticket.invalidverify;
+
+import com.cowr.common.enums.OrderStateEnum;
+import com.cowr.common.enums.OrderTypeEnum;
+import com.cowr.common.view.Result;
+import com.cowr.local.ssjygl.main.CliCacheData;
+import com.cowr.local.ssjygl.synctask.SyncTaskService;
+import com.cowr.model.*;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+
+import java.util.Date;
+
+public class TicketInvalidVerifySyncService {
+    private static final Log                            log = Log.getLog(TicketInvalidVerifySyncService.class);
+    public static        TicketInvalidVerifySyncService me  = new TicketInvalidVerifySyncService();
+
+    public Result save(String order_sn, String invalid_memo, Sysuser sysuser) {
+        OrderTemp order = OrderTemp.dao.findById(order_sn);
+
+        if (order == null) {
+            return Result.failedstr("按 %s 没有找到订单信息", order_sn);
+        }
+
+        TicketReceive receive = TicketReceiveService.me.checkReceive(CliCacheData.SUP.getId(), order.getTicketCode());
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录,或者订单没有开具有效的结算单");
+        }
+
+        TicketInvalidVerify old = TicketInvalidVerify.dao.findFirst(
+                "select * from ticket_invalid_verify t where t.order_sn = ? and t.state = 1 limit 1", order_sn);
+
+        if (old != null) {
+            return Result.failedstr("订单 %s 已提交申请", order_sn);
+        }
+
+        TicketInvalidVerify model = new TicketInvalidVerify();
+        model.setId(StrKit.getRandomUUID());
+        model.setSupermarketId(CliCacheData.SUP.getId());
+        model.setCreateTime(new Date());
+        model.setCreateUserId(sysuser.getId());
+        model.setCreateUserName(sysuser.getName());
+        model.setTicketReceiveId(receive.getId());
+        model.setOrderSn(order.getSn());
+        model.setType(OrderTypeEnum.TEMP.getTypeid());
+
+        model.setInvalidMemo(invalid_memo);
+        model.setTicketCode(order.getTicketCode());
+
+        SyncTask synctask = new SyncTask();
+
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = model.save();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addSaveData(model);
+
+                    return SyncTaskService.me.save(synctask);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success(model) : Result.failed("保存失败");
+    }
+
+    public Result save(TicketInvalidVerify model, Sysuser sysuser) {
+        TicketInvalidVerify old = TicketInvalidVerify.dao.findFirst(
+                "select * from ticket_invalid_verify t \n" +
+                        " where t.ticket_code = ? \n" +
+                        " and t.state = 1 " +
+                        " limit 1", model.getTicketCode());
+
+        if (old != null) {
+            return Result.failedstr("结算单 %s 已提交申请", model.getTicketCode());
+        }
+
+        // 先判断这张结算单有没有被领用
+        TicketReceive receive = TicketReceiveService.me.checkReceive(CliCacheData.SUP.getId(), model.getTicketCode());
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+        }
+
+        TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t \n" +
+                " where t.ticket_number = ? and t.code = ? limit 1 ", model.getTicketCode());
+
+        if (ticketLog != null) {
+            // 再判断这张结算单是不是已经被取消了
+            if (ticketLog.getState() == OrderStateEnum.INVALID.getStateid()) {
+                return Result.failed("结算单已作废");
+            } else {
+                // 还要判断这张结算单已经在订单上使用了
+                return Result.failed("结算单已使用,请使用“取消结算单”功能");
+            }
+        }
+
+        model.setId(StrKit.getRandomUUID());
+        model.setSupermarketId(CliCacheData.SUP.getId());
+        model.setCreateTime(new Date());
+        model.setCreateUserId(sysuser.getId());
+        model.setCreateUserName(sysuser.getName());
+        model.setTicketReceiveId(receive.getId());
+
+        SyncTask synctask = new SyncTask();
+
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = model.save();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addSaveData(model);
+
+                    return SyncTaskService.me.save(synctask);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success(model) : Result.failed("保存失败");
+    }
+}
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogController.java
new file mode 100644
index 0000000..52f620c
--- /dev/null
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogController.java
@@ -0,0 +1,66 @@
+package com.cowr.local.ssjygl.ticket.log;
+
+import com.cowr.common.validator.StartAndEndIntervalValidator;
+import com.cowr.common.view.ExcelRender;
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.local.ssjygl.system.sysuser.SysuserSyncService;
+import com.cowr.model.Sysuser;
+import com.cowr.model.TicketLog;
+import com.cowr.ssjygl.ticket.log.TicketLogPKValidator;
+import com.cowr.ssjygl.ticket.log.TicketLogService;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+import org.apache.poi.ss.usermodel.Workbook;
+
+public class TicketLogController extends Controller {
+
+    public void find() {
+        PageParam pp             = getBean(PageParam.class, "", true);
+        Integer   supermarket_id = getInt("supermarket_id");
+        Integer   state          = getInt("state");
+        String    order_sn       = get("order_sn");
+        String    stm            = get("stm");
+        String    etm            = get("etm");
+        String    ticket_code    = get("ticket_code");
+        renderJson(Result.object(TicketLogService.me.find(pp, supermarket_id, state, order_sn, stm, etm, ticket_code)));
+    }
+
+    @Before(StartAndEndIntervalValidator.class)
+    public void export() {
+        Integer supermarket_id = getInt("supermarket_id");
+        Integer state          = getInt("state");
+        String  order_sn       = get("order_sn");
+        String  stm            = get("stm");
+        String  etm            = get("etm");
+        String  ticket_code    = get("ticket_code");
+
+        Workbook wb = TicketLogService.me.export(supermarket_id, state, order_sn, stm, etm, ticket_code);
+
+        render(new ExcelRender("结算单使用日志_" + System.currentTimeMillis() + ".xlsx", wb));
+    }
+
+    /**
+     * 按主键查找单个对象 invoice_log  结算单管理 - 结算单使用记录
+     */
+    @Before(TicketLogPKValidator.class)
+    public void get() {
+        TicketLog model = getModel(TicketLog.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketLogService.me.findByPk(model));
+    }
+
+    public void invalid() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        Integer supermarket_id = getInt("supermarket_id", 0);
+        String  ticket_code    = get("ticket_code");
+        String  invalid_memo   = get("invalid_memo");
+
+        renderJson(TicketLogSyncService.me.invalid(supermarket_id, ticket_code, invalid_memo, tokenuser));
+    }
+}
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogSyncService.java
new file mode 100644
index 0000000..f5637e3
--- /dev/null
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/log/TicketLogSyncService.java
@@ -0,0 +1,117 @@
+package com.cowr.local.ssjygl.ticket.log;
+
+import com.cowr.common.enums.Enums;
+import com.cowr.common.enums.OrderStateEnum;
+import com.cowr.common.view.Result;
+import com.cowr.local.ssjygl.base.BaseSyncService;
+import com.cowr.local.ssjygl.main.CliCacheData;
+import com.cowr.local.ssjygl.synctask.SyncTaskService;
+import com.cowr.model.TicketLog;
+import com.cowr.model.TicketReceive;
+import com.cowr.model.SyncTask;
+import com.cowr.model.Sysuser;
+import com.cowr.ssjygl.modifylog.ModifyLogService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+
+import java.util.Date;
+
+public class TicketLogSyncService extends BaseSyncService {
+    private static Log                   log = Log.getLog(TicketLogSyncService.class);
+    public static  TicketLogSyncService me  = new TicketLogSyncService();
+
+    public Result invalid(int supermarket_id, String ticket_code, String invalid_memo, Sysuser sysuser) {
+        if (supermarket_id != CliCacheData.SUP.getId()) {
+            return Result.failed("砂站信息错误");
+        }
+
+        // 先判断这张结算单有没有被领用
+        TicketReceive receive = TicketReceiveService.me.checkSurplusReceive(supermarket_id, ticket_code);
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+        }
+
+        TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t \n" +
+                " where t.ticket_code = ? limit 1 ", ticket_code);
+
+        if (ticketLog != null) {
+            // 再判断这张结算单是不是已经被取消了
+            if (ticketLog.getState() == OrderStateEnum.INVALID.getStateid()) {
+                return Result.failed("结算单已作废");
+            } else {
+                // 还要判断这张结算单已经在订单上使用了
+                return Result.failed("结算单已使用,请使用“取消结算单”功能");
+            }
+        }
+
+        // 然后就可以开始取消了
+
+        ticketLog = new TicketLog();
+        ticketLog.setId(StrKit.getRandomUUID());
+        ticketLog.setInvalidUserId(sysuser.getId());
+        ticketLog.setInvalidUserName(sysuser.getName());
+        ticketLog.setInvalidTime(new Date());
+        ticketLog.setInvalidMemo(invalid_memo);
+        ticketLog.setState(OrderStateEnum.INVALID.getStateid());
+        ticketLog.setTicketReceiveId(receive.getId());
+        ticketLog.setTicketCode(ticket_code);
+
+        receive.setSurplus(receive.getSurplus() - 1);
+        receive.setInvalidCount(receive.getInvalidCount() + 1);
+
+        if (receive.getSurplus() == 0) {
+            // 作废最后一张结算单,当前结算单停再最后一个结算单号码上
+            receive.setCurrentCode(receive.getEndCode());
+        } else {
+            if (ticket_code.equals(receive.getStartCode())) { // 作废第一张结算单
+                receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1));
+            } else if (ticket_code.equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单
+                receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1));
+            } else {
+                // 其他情况下不更新 current_code
+            }
+        }
+
+        SyncTask synctask = new SyncTask();
+
+        TicketLog finalTicketLog = ticketLog;
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = finalTicketLog.save();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addSaveData(finalTicketLog);
+
+                    ret = receive.update();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addUpdateData(receive);
+
+                    return SyncTaskService.me.save(synctask)
+                            && ModifyLogService.me.save(finalTicketLog, null, Enums.DataOpType.SAVE.getId(), sysuser);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        // 普票作废理解同步到砂站
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success(ticketLog) : Result.failed(false, "处理失败");
+    }
+}
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/receive/TicketReceiveController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/receive/TicketReceiveController.java
new file mode 100644
index 0000000..94d623b
--- /dev/null
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/ticket/receive/TicketReceiveController.java
@@ -0,0 +1,69 @@
+package com.cowr.local.ssjygl.ticket.receive;
+
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketReceive;
+import com.cowr.ssjygl.ticket.receive.TicketReceivePKValidator;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+import com.jfinal.plugin.activerecord.Record;
+
+import java.util.List;
+
+public class TicketReceiveController extends Controller {
+
+    /**
+     * 按主键检查对象是否存在
+     * 返回 code = 200
+     * 存在时 data = true
+     * 不存在 data = false
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void checkExistsByPk() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.checkExistsByPk(model));
+    }
+
+    /**
+     * 分页查找 invoice_receive  结算单管理 - 领用记录
+     */
+    public void find() {
+        PageParam pp             = getBean(PageParam.class, "", true);
+        Integer   supermarket_id = getInt("supermarket_id");
+        String    reveiver_user_name = get("reveiver_user_name");
+        String    stm                = get("stm");
+        String    etm                = get("etm");
+        renderJson(Result.object(TicketReceiveService.me.find(pp, supermarket_id, reveiver_user_name, stm, etm)));
+    }
+
+    /**
+     * 按主键查找单个对象 invoice_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void findByPk() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.findByPk(model));
+    }
+
+    /**
+     * 按主键查找单个对象 invoice_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void get() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.findByPk(model));
+    }
+
+    public void nextTicket() {
+        Integer supermarket_id = getInt("supermarket_id", 0);
+
+        List receives = TicketReceiveService.me.nextTicketCodes(supermarket_id);
+        if (receives == null || receives.isEmpty()) {
+            renderJson(Result.failed("没有有效的结算单领用记录"));
+            return;
+        }
+
+        renderJson(Result.success(receives));
+    }
+}
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java
index 3cfd29f..173609c 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java
@@ -17,6 +17,7 @@ import com.cowr.model.*;
 import com.cowr.ssjygl.order.ordersale.OrderSaleService;
 import com.cowr.ssjygl.order.ordertemp.OrderTempService;
 import com.cowr.ssjygl.prepay.PrepayService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
 import com.cowr.ssjygl.transprice.TransPriceService;
 import com.jfinal.kit.StrKit;
 import com.jfinal.log.Log;
@@ -130,8 +131,10 @@ public class TransportQueryService {
 //        transobj.set("next_invoice_code", InvoiceReceiveService.me.nextInvoiceCode(transport.getSupermarketId())); // 2020-09-21 加了发票代码
         if (ordercluster.getReqReceipt() == 1) { // 需要打印发票的,才去插领票记录
             transobj.set("invoice_numbers", InvoiceReceiveService.me.nextInvoiceCodes(transport.getSupermarketId()));
+            transobj.set("ticket_numbers", new ArrayList<>());
         } else {
             transobj.set("invoice_numbers", new ArrayList<>());
+            transobj.set("ticket_numbers", TicketReceiveService.me.nextTicketCodes(transport.getSupermarketId()));
         }
         transobj.set("req_receipt", ordercluster.getReqReceipt()); // TODO 2020-10-12 如果放开购买,连零散购砂都不做配额了,这里需要修改
 
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java
index 0df6363..72109d4 100644
--- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java
@@ -42,6 +42,9 @@ import com.cowr.service.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmD
 import com.cowr.service.ssjygl.supermarket.stock.StockController;
 import com.cowr.service.ssjygl.synctask.SyncTaskService;
 import com.cowr.service.ssjygl.system.sysuser.SysuserController;
+import com.cowr.service.ssjygl.ticket.invalidverify.TicketInvalidVerifyController;
+import com.cowr.service.ssjygl.ticket.log.TicketLogController;
+import com.cowr.service.ssjygl.ticket.receive.TicketReceiveController;
 import com.cowr.service.ssjygl.transport.TransportQueryController;
 import com.cowr.service.ssjygl.transportcompany.TransportCompanyController;
 import com.cowr.service.ssjygl.truck.TruckController;
@@ -206,6 +209,11 @@ public class Config extends JFinalConfig {
         me.add("/invoice/receive", InvoiceReceiveController.class);
         me.add("/invoice/invalidverify", InvoiceInvalidVerifyController.class);
 
+        // -- 结算单管理
+        me.add("/ticket/log", TicketLogController.class);
+        me.add("/ticket/receive", TicketReceiveController.class);
+        me.add("/ticket/invalidverify", TicketInvalidVerifyController.class);
+
         // -- 日志
         me.add("/log/sms", SmsLogController.class);
         me.add("/log/actioncmd", ActionCmdLogController.class);
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java
new file mode 100644
index 0000000..eda32c5
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyController.java
@@ -0,0 +1,48 @@
+package com.cowr.service.ssjygl.ticket.invalidverify;
+
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.model.Sysuser;
+import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService;
+import com.cowr.ssjygl.ticket.invalidverify.TicketInvalidVerifyService;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+
+public class TicketInvalidVerifyController extends Controller {
+
+    /**
+     * 分页查找 ticket_invalid_verify  结算单管理 - 结算单作废申请
+     */
+    public void find() {
+        PageParam pp = getBean(PageParam.class, "", true);
+
+        String  stm              = get("stm");
+        String  etm              = get("etm");
+        String  ticket_code      = get("ticket_code");
+        String  order_sn         = get("order_sn");
+        String  create_user_name = get("create_user_name");
+        Integer supermarket_id   = getInt("supermarket_id");
+        Integer state            = getInt("state");
+
+        renderJson(Result.object(TicketInvalidVerifyService.me.find(pp, stm, etm, ticket_code, order_sn, create_user_name, supermarket_id, state)));
+    }
+
+    @Before(TicketInvalidVerifyValidator.class)
+    public void verify() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能审核
+            renderJson(Result.permissionDenied());
+            return;
+        }
+
+        String id    = get("id");
+        int    state = getInt("state", 0);
+        String memo  = get("memo");
+
+        renderJson(TicketInvalidVerifySyncService.me.verify(id, state, memo, tokenuser));
+    }
+}
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java
new file mode 100644
index 0000000..bb6446a
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifySyncService.java
@@ -0,0 +1,198 @@
+package com.cowr.service.ssjygl.ticket.invalidverify;
+
+import com.cowr.common.enums.OrderStateEnum;
+import com.cowr.common.view.Result;
+import com.cowr.model.*;
+import com.cowr.service.ssjygl.synctask.SyncTaskService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+
+import java.util.Date;
+
+public class TicketInvalidVerifySyncService {
+    private static Log                            log = Log.getLog(TicketInvalidVerifySyncService.class);
+    public static  TicketInvalidVerifySyncService me  = new TicketInvalidVerifySyncService();
+
+    public Result verify(String id, int state, String memo, Sysuser user) {
+        if (state != 2 && state != 9) {
+            return Result.failed("state 值错误");
+        }
+
+        TicketInvalidVerify model = TicketInvalidVerify.dao.findById(id);
+
+        if (model == null) {
+            return Result.failed("没有找到申请记录");
+        }
+
+        if (model.getState() == 9) {
+            return Result.failed("申请已作废");
+        }
+
+        if (model.getState() == state) {
+            return Result.failed("状态值没有变化");
+        }
+
+        model.setVerifyUserId(user.getId());
+        model.setVerifyUserName(user.getName());
+        model.setMemo(memo);
+        model.setState(state);
+
+        if (state == OrderStateEnum.INVALID.getStateid()) {
+            return notPass(model);
+        } else if (state == 2) {
+            return pass(model, user);
+        }
+
+        return Result.failed("修改失败");
+    }
+
+    private Result pass(TicketInvalidVerify model, Sysuser sysuser) {
+        SyncTask synctask = new SyncTask();
+        synctask.addUpdateData(model);
+
+        // 先判断这张结算单有没有被领用
+        TicketReceive receive = TicketReceiveService.me.checkReceive(model.getSupermarketId(),  model.getTicketCode());
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录");
+        }
+
+        TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t \n" +
+                " where t.ticket_code = ? limit 1 ", model.getTicketCode());
+
+        // 又多个地方可以修改 TicketLog 在同意之前,要先确认结算单是否已经取消
+        if (ticketLog != null) {
+            if (ticketLog.getState() == OrderStateEnum.INVALID.getStateid()) {
+                return Result.failed("结算单已作废");
+            }
+        } else {
+            ticketLog = new TicketLog();
+
+            // 作废结算单时,结算单还没有使用,才需要去处理结算单领用记录里面的当前结算单号码
+            receive.setSurplus(receive.getSurplus() - 1);
+
+            if (receive.getSurplus() == 0) {
+                // 作废最后一张结算单,当前结算单停再最后一个结算单号码上
+                receive.setCurrentCode(receive.getEndCode());
+            } else {
+                if (model.getTicketCode().equals(receive.getStartCode())) { // 作废第一张结算单
+                    receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1));
+                } else if (model.getTicketCode().equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单
+                    receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1));
+                } else {
+                    // 其他情况下不更新 current_code
+                }
+            }
+        }
+
+        ticketLog.setInvalidUserId(sysuser.getId());
+        ticketLog.setInvalidUserName(sysuser.getName());
+        ticketLog.setInvalidTime(new Date());
+        ticketLog.setInvalidMemo(model.getInvalidMemo());
+        ticketLog.setState(OrderStateEnum.INVALID.getStateid());
+        ticketLog.setTicketCode(model.getTicketCode());
+
+        receive.setInvalidCount(receive.getInvalidCount() + 1); // 每次作废,作废数量加 1
+        synctask.addUpdateData(receive); // 更新领用记录
+
+        OrderTemp order = null;
+
+        if (StrKit.notBlank(model.getOrderSn())) {
+            order = OrderTemp.dao.findById(model.getOrderSn());
+
+            if (order == null) {
+                return Result.failedstr("按 %s 没有找到订单信息", model.getOrderSn());
+            }
+
+            order.setTicketCode(null);
+
+            synctask.addUpdateData(order); // 关联了订单的,要更新订单信息,清除开票信息
+        }
+
+        TicketLog finalTicketLog = ticketLog;
+        OrderTemp  finalOrder      = order;
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = model.update() && receive.update();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    if (finalTicketLog.getId() == null) { // 结算单还没有使用,是新增使用日志
+                        finalTicketLog.setId(StrKit.getRandomUUID());
+                        finalTicketLog.setTicketReceiveId(model.getTicketReceiveId());
+
+                        synctask.addSaveData(finalTicketLog);
+
+                        ret = finalTicketLog.save();
+                    } else { // 结算单已经使用的,有使用日志的,需要更新
+                        synctask.addUpdateData(finalTicketLog);
+
+                        ret = finalTicketLog.update();
+                    }
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    if(finalOrder != null){
+                        ret = finalOrder.update();
+
+                        if (!ret) {
+                            return false;
+                        }
+                    }
+
+                    return SyncTaskService.me.save(synctask, model.getSupermarketId());
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        // 普票作废理解同步到砂站
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success(model) : Result.failed(false, "处理失败");
+    }
+
+    private Result notPass(TicketInvalidVerify model) {
+        SyncTask synctask = new SyncTask();
+
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = model.update();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addUpdateData(model);
+
+                    return SyncTaskService.me.save(synctask, model.getSupermarketId());
+
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+
+                return false;
+            }
+        });
+
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success() : Result.failed("修改失败");
+    }
+}
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java
new file mode 100644
index 0000000..3bf1b3d
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/invalidverify/TicketInvalidVerifyValidator.java
@@ -0,0 +1,33 @@
+package com.cowr.service.ssjygl.ticket.invalidverify;
+
+
+import com.cowr.common.validator.CrudParamValidator;
+import com.cowr.common.view.Result;
+import com.jfinal.core.Controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Generated by COWR Mon Feb 10 12:11:03 CST 2020
+ * TableName: prepay_detail
+ * Remarks: 预付费客户付费详情
+ * PrimaryKey: id
+ */
+public class TicketInvalidVerifyValidator extends CrudParamValidator {
+    private static List chkstate = new ArrayList() {{
+        add(2);
+        add(9);
+    }};
+
+    @Override
+    protected void validate(Controller c) {
+        validateString("id", 32, 32, "id", "id 长度 32,必填");
+        validateInIntegerArray("state", chkstate, "state", "state 可选值 2、9");
+        validateString("memo", 0, 255, "memo", "memo 长度 0~255");
+    }
+
+    protected void handleError(Controller c) {
+        c.renderJson(Result.failed(getErrmsg()));
+    }
+}
\ No newline at end of file
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogController.java
new file mode 100644
index 0000000..89b761e
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogController.java
@@ -0,0 +1,133 @@
+package com.cowr.service.ssjygl.ticket.log;
+
+import com.cowr.common.validator.StartAndEndIntervalValidator;
+import com.cowr.common.view.ExcelRender;
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.model.Sysuser;
+import com.cowr.model.TicketLog;
+import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService;
+import com.cowr.ssjygl.ticket.log.TicketLogPKValidator;
+import com.cowr.ssjygl.ticket.log.TicketLogService;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+import org.apache.poi.ss.usermodel.Workbook;
+
+/**
+ * Generated by COWR Thu Aug 13 23:09:29 CST 2020
+ * TableName: ticket_log
+ * Remarks: 结算单管理 - 结算单使用记录
+ * PrimaryKey: id
+ */
+public class TicketLogController extends Controller {
+
+    /**
+     * 按主键检查对象是否存在
+     * 返回 code = 200
+     * 存在时 data = true
+     * 不存在 data = false
+     */
+    @Before(TicketLogPKValidator.class)
+    public void checkExistsByPk() {
+        TicketLog model = getModel(TicketLog.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketLogService.me.checkExistsByPk(model));
+    }
+
+    /**
+     * 分页查找 ticket_log  结算单管理 - 结算单使用记录
+     */
+    public void find() {
+        PageParam pp             = getBean(PageParam.class, "", true);
+        Integer   supermarket_id = getInt("supermarket_id");
+        Integer   state          = getInt("state");
+        String    order_sn       = get("order_sn");
+        String    stm            = get("stm");
+        String    etm            = get("etm");
+        String    ticket_code    = get("ticket_code");
+        renderJson(Result.object(TicketLogService.me.find(pp, supermarket_id, state, order_sn, stm, etm, ticket_code)));
+    }
+
+    @Before(StartAndEndIntervalValidator.class)
+    public void export() {
+        Integer supermarket_id = getInt("supermarket_id");
+        Integer state          = getInt("state");
+        String  order_sn       = get("order_sn");
+        String  stm            = get("stm");
+        String  etm            = get("etm");
+        String  ticket_code    = get("ticket_code");
+
+        Workbook wb = TicketLogService.me.export(supermarket_id, state, order_sn, stm, etm, ticket_code);
+
+        render(new ExcelRender("结算单使用日志_" + System.currentTimeMillis() + ".xlsx", wb));
+    }
+
+    /**
+     * 按主键查找单个对象 ticket_log  结算单管理 - 结算单使用记录
+     */
+    @Before(TicketLogPKValidator.class)
+    public void findByPk() {
+        TicketLog model = getModel(TicketLog.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketLogService.me.findByPk(model));
+    }
+
+    /**
+     * 按主键查找单个对象 ticket_log  结算单管理 - 结算单使用记录
+     */
+    @Before(TicketLogPKValidator.class)
+    public void get() {
+        TicketLog model = getModel(TicketLog.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketLogService.me.findByPk(model));
+    }
+
+    public void invalid() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能作废结算单
+            renderJson(Result.permissionDenied());
+            return;
+        }
+
+        Integer supermarket_id = getInt("supermarket_id", 0);
+        String  ticket_code    = get("ticket_code");
+        String  invalid_memo   = get("invalid_memo");
+
+        renderJson(TicketLogSyncService.me.invalid(supermarket_id, ticket_code, invalid_memo, tokenuser));
+    }
+
+    public void cancel() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能作废结算单
+            renderJson(Result.permissionDenied());
+            return;
+        }
+
+        String id           = get("id");
+        String invalid_memo = get("invalid_memo");
+
+        renderJson(TicketLogSyncService.me.cancel(id, invalid_memo, tokenuser));
+    }
+
+    public void cancelByCode() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能作废结算单
+            renderJson(Result.permissionDenied());
+            return;
+        }
+
+        String ticket_code  = get("ticket_code");
+        String invalid_memo = get("invalid_memo");
+
+        renderJson(TicketLogSyncService.me.cancelByCode(ticket_code, invalid_memo, tokenuser));
+    }
+}
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogSyncService.java
new file mode 100644
index 0000000..cbc2fb5
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/log/TicketLogSyncService.java
@@ -0,0 +1,263 @@
+package com.cowr.service.ssjygl.ticket.log;
+
+import com.cowr.common.enums.Enums;
+import com.cowr.common.enums.OrderStateEnum;
+import com.cowr.common.view.Result;
+import com.cowr.model.*;
+import com.cowr.service.ssjygl.base.BaseSyncService;
+import com.cowr.service.ssjygl.synctask.SyncTaskService;
+import com.cowr.ssjygl.modifylog.ModifyLogService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.jfinal.kit.StrKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+import com.jfinal.plugin.activerecord.Record;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TicketLogSyncService extends BaseSyncService {
+    private static Log                  log = Log.getLog(TicketLogSyncService.class);
+    public static  TicketLogSyncService me  = new TicketLogSyncService();
+
+    /**
+     * 作废结算单,未关联订单的(损毁等,不是正常开票使用的结算单)
+     *
+     * @return
+     */
+    public Result invalid(int supermarket_id, String ticket_code, String invalid_memo, Sysuser sysuser) {
+        Supermarket supermarket = Supermarket.dao.findById(supermarket_id);
+
+        if (supermarket == null) {
+            return Result.failed("未找到砂站信息");
+        }
+
+        // 先判断这张结算单有没有被领用
+        TicketReceive receive = TicketReceiveService.me.checkSurplusReceive(supermarket_id, ticket_code);
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+        }
+
+        TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t \n" +
+                " where t.ticket_code = ? limit 1 ", ticket_code);
+
+        if (ticketLog != null) {
+            // 再判断这张结算单是不是已经被取消了
+            if (ticketLog.getState() == OrderStateEnum.INVALID.getStateid()) {
+                return Result.failed("结算单已作废");
+            } else {
+                // 还要判断这张结算单已经在订单上使用了
+                return Result.failed("结算单已使用,请使用“取消结算单”功能");
+            }
+        }
+
+        // 然后就可以开始取消了
+
+        ticketLog = new TicketLog();
+        ticketLog.setId(StrKit.getRandomUUID());
+        ticketLog.setInvalidUserId(sysuser.getId());
+        ticketLog.setInvalidUserName(sysuser.getName());
+        ticketLog.setInvalidTime(new Date());
+        ticketLog.setInvalidMemo(invalid_memo);
+        ticketLog.setState(OrderStateEnum.INVALID.getStateid());
+        ticketLog.setTicketReceiveId(receive.getId());
+        ticketLog.setTicketCode(ticket_code);
+
+        receive.setSurplus(receive.getSurplus() - 1);
+        receive.setInvalidCount(receive.getInvalidCount() + 1);
+
+        if (receive.getSurplus() < 0) {
+            return Result.failed("作废失败,减少剩余量时发生错误");
+        } else if (receive.getSurplus() == 0) {
+            // 作废最后一张结算单,当前结算单停再最后一个结算单号码上
+            receive.setCurrentCode(receive.getEndCode());
+        } else {
+            if (ticket_code.equals(receive.getStartCode())) { // 作废第一张结算单
+                receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1));
+            } else if (ticket_code.equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单
+                receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1));
+            } else {
+                // 其他情况下不更新 current_code
+            }
+        }
+
+        SyncTask synctask = new SyncTask();
+
+        TicketLog finalTicketLog = ticketLog;
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = finalTicketLog.save();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addSaveData(finalTicketLog);
+
+                    ret = receive.update();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addUpdateData(receive);
+
+                    return SyncTaskService.me.save(synctask, supermarket_id)
+                            && ModifyLogService.me.save(finalTicketLog, null, Enums.DataOpType.SAVE.getId(), sysuser);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        // 普票作废理解同步到砂站
+        if (ret) {
+            SyncTaskService.me.send(synctask);
+        }
+
+        return ret ? Result.success(ticketLog) : Result.failed(false, "处理失败");
+    }
+
+    public Result cancel(String id, String invalid_memo, Sysuser sysuser) {
+        TicketLog ticketLog = TicketLog.dao.findById(id);
+
+        if (ticketLog == null) {
+            return Result.failed("未找到结算单记录");
+        }
+
+        return cancelType2(ticketLog, invalid_memo, sysuser);
+    }
+
+    public Result cancelByCode(String ticket_code, String invalid_memo, Sysuser sysuser) {
+        TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t where ticket_code = ? limit 1 ", ticket_code);
+
+        if (ticketLog == null) {
+            return Result.failed("未找到结算单记录");
+        }
+
+        return cancelType2(ticketLog, invalid_memo, sysuser);
+    }
+
+    /**
+     * 取消专票
+     * 2020-09-29 一个专票可以关联多个订单,取消专票需要将关联的订单都取消结算单信息
+     *
+     * @param ticketLog
+     * @param invalid_memo
+     * @param sysuser
+     * @return
+     */
+    public Result cancelType2(TicketLog ticketLog, String invalid_memo, Sysuser sysuser) {
+        if (ticketLog.getState() == OrderStateEnum.INVALID.getStateid()) {
+            return Result.failed("记录已作废");
+        }
+
+        List ordlist = OrderTemp.dao.find("select * from order_temp t \n" +
+                        " where t.state = ? \n" +
+                        " and t.ticket_code = ? ",
+                OrderStateEnum.RECEIVED.getStateid(),
+                ticketLog.getTicketCode()
+        );
+
+        if (ordlist.isEmpty()) {
+            return Result.failed("关联订单信息错误");
+        }
+
+        List loglist = TicketLog.dao.find("select * from ticket_log t \n" +
+                        " where t.state = ? \n" +
+                        " and t.ticket_code = ? ",
+                OrderStateEnum.RECEIVED.getStateid(),
+                ticketLog.getTicketCode()
+        );
+
+        if (ordlist.isEmpty()) {
+            return Result.failed("结算单使用信息错误");
+        }
+
+        Map map       = new HashMap<>();
+        Map ordmap    = new HashMap<>();
+        Date                   now       = new Date();
+        Record                 logrecord = new Record();
+
+        logrecord.set("state", OrderStateEnum.INVALID.getStateid());
+        logrecord.set("ticket_code", ticketLog.getTicketCode());
+
+        for (OrderTemp o : ordlist) {
+            o.setTicketCode(null);
+
+            int supermarket_id = o.getSupermarketId();
+
+            if (!map.containsKey(supermarket_id)) {
+                map.put(supermarket_id, new SyncTask());
+            }
+
+            map.get(supermarket_id).addUpdateData(o);
+            ordmap.put(o.getSn(), o);
+        }
+
+        for (TicketLog o : loglist) {
+            o.setInvalidMemo(invalid_memo);
+            o.setInvalidTime(now);
+            o.setInvalidUserId(sysuser.getId());
+            o.setInvalidUserName(sysuser.getName());
+            o.setState(OrderStateEnum.INVALID.getStateid());
+
+            if (!ordmap.containsKey(o.getOrderSn())) {
+                return Result.failedstr("结算单[%s]未找到订单信息", o.getTicketCode());
+            }
+
+            int supermarket_id = ordmap.get(o.getOrderSn()).getSupermarketId();
+
+            if (!map.containsKey(supermarket_id)) {
+                map.put(supermarket_id, new SyncTask());
+            }
+
+            map.get(supermarket_id).addUpdateData(o);
+        }
+
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    int[] editret = Db.batchUpdate(ordlist, ordlist.size());
+
+                    for (int i : editret) {
+                        // 必须是每条 sql 修改一条记录
+                        if (i != 1) {
+                            return false;
+                        }
+                    }
+
+                    editret = Db.batchUpdate(loglist, loglist.size());
+
+                    for (int i : editret) {
+                        // 必须是每条 sql 修改一条记录
+                        if (i != 1) {
+                            return false;
+                        }
+                    }
+
+                    // 将订单同步到不同的砂站
+                    for (Map.Entry entry : map.entrySet()) {
+                        if (!SyncTaskService.me.save(entry.getValue(), entry.getKey())) {
+                            return false;
+                        }
+                    }
+
+                    return ModifyLogService.me.save(TicketLog.tablename, "id", logrecord.toJson(), Enums.DataOpType.SAVE.getId(), sysuser);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        return ret ? Result.success() : Result.failed("修改失败");
+    }
+}
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveController.java
new file mode 100644
index 0000000..6a59943
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveController.java
@@ -0,0 +1,142 @@
+package com.cowr.service.ssjygl.ticket.receive;
+
+import com.cowr.common.view.PageParam;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketReceive;
+import com.cowr.model.Sysuser;
+import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService;
+import com.cowr.ssjygl.ticket.receive.TicketReceivePKValidator;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveValidator;
+import com.jfinal.aop.Before;
+import com.jfinal.core.Controller;
+import com.jfinal.plugin.activerecord.Record;
+
+import java.util.List;
+
+/**
+ * Generated by COWR Thu Aug 13 23:09:29 CST 2020
+ * TableName: ticket_receive
+ * Remarks: 结算单管理 - 领用记录
+ * PrimaryKey: id
+ */
+public class TicketReceiveController extends Controller {
+
+    /**
+     * 按主键检查对象是否存在
+     * 返回 code = 200
+     * 存在时 data = true
+     * 不存在 data = false
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void checkExistsByPk() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.checkExistsByPk(model));
+    }
+
+    /**
+     * 新增 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceiveValidator.class)
+    public void save() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveSyncService.me.save(model, tokenuser));
+    }
+
+    /**
+     * 删除 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void del() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveSyncService.me.delete(model, tokenuser));
+    }
+
+    /**
+     * 恢复 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void restore() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveSyncService.me.restore(model, tokenuser));
+    }
+
+    /**
+     * 修改 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceiveValidator.class)
+    public void edit() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveSyncService.me.update(model, tokenuser));
+    }
+
+    /**
+     * 分页查找 ticket_receive  结算单管理 - 领用记录
+     */
+    public void find() {
+        PageParam pp                 = getBean(PageParam.class, "", true);
+        Integer   supermarket_id     = getInt("supermarket_id");
+        String    reveiver_user_name = get("reveiver_user_name");
+        String    stm                = get("stm");
+        String    etm                = get("etm");
+        renderJson(Result.object(TicketReceiveService.me.find(pp, supermarket_id, reveiver_user_name, stm, etm)));
+    }
+
+    /**
+     * 按主键查找单个对象 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void findByPk() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.findByPk(model));
+    }
+
+    /**
+     * 按主键查找单个对象 ticket_receive  结算单管理 - 领用记录
+     */
+    @Before(TicketReceivePKValidator.class)
+    public void get() {
+        TicketReceive model = getModel(TicketReceive.class, "", true); // 忽略不在model中的字段
+        renderJson(TicketReceiveService.me.findByPk(model));
+    }
+
+    public void nextTicket() {
+        Integer supermarket_id = getInt("supermarket_id", 0);
+
+        List receives = TicketReceiveService.me.nextTicketCodes(supermarket_id);
+        if (receives == null || receives.isEmpty()) {
+            renderJson(Result.failed("没有有效的结算单领用记录"));
+            return;
+        }
+
+        renderJson(Result.success(receives));
+    }
+}
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveSyncService.java
new file mode 100644
index 0000000..dbfde7a
--- /dev/null
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/ticket/receive/TicketReceiveSyncService.java
@@ -0,0 +1,86 @@
+package com.cowr.service.ssjygl.ticket.receive;
+
+import com.cowr.common.enums.Enums;
+import com.cowr.common.view.Result;
+import com.cowr.model.TicketReceive;
+import com.cowr.model.Supermarket;
+import com.cowr.model.SyncTask;
+import com.cowr.model.Sysuser;
+import com.cowr.service.ssjygl.base.BaseSyncService;
+import com.cowr.service.ssjygl.main.SvrCacheData;
+import com.cowr.service.ssjygl.synctask.SyncTaskService;
+import com.cowr.ssjygl.modifylog.ModifyLogService;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+
+import java.util.List;
+
+public class TicketReceiveSyncService extends BaseSyncService {
+    private static Log                      log = Log.getLog(TicketReceiveSyncService.class);
+    public static  TicketReceiveSyncService me  = new TicketReceiveSyncService();
+
+    public Result save(TicketReceive receive, Sysuser user) {
+        Sysuser receive_user = Sysuser.dao.findById(receive.getReceiveUserId());
+
+        if (receive_user == null) {
+            return Result.failed("未找到关联用户信息");
+        }
+
+        receive.setReceiveUserName(receive_user.getName());
+
+        Supermarket supermarket = SvrCacheData.SUP_CACHE.get(receive.getSupermarketId());
+        if (supermarket == null) {
+            return Result.failed("砂站信息无效");
+        }
+
+        if (supermarket.getIsdeploy() == 0) {
+            return Result.failedstr("[%s]砂站还未部署", supermarket.getName());
+        }
+
+        try {
+            // 十位或者更长的结算单号码要转 long,否则可能超过 Integer.MAX_VALUE 2147483647
+            Long start = Long.parseLong(receive.getStartCode());
+            Long end   = Long.parseLong(receive.getEndCode());
+
+            List chklist = TicketReceive.dao.find("select * from ticket_receive t\n" +
+                    " where (( t.start_code <= ? and t.end_code >= ? )\n" +
+                    " or ( t.start_code <= ? and t.end_code >= ? ))",  start, start, end, end);
+
+            if (!chklist.isEmpty()) {
+                return Result.failed("结算单段和已领用的记录冲突");
+            }
+
+            receive.setSurplus((int) (end - start) + 1);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+
+            return Result.failed("数据检查错误");
+        }
+
+        try {
+            boolean ret = Db.tx(new IAtom() {
+                @Override
+                public boolean run() {
+                    try {
+                        return receive.save()
+                                && SyncTaskService.me.save(new SyncTask().addSaveData(receive), receive.getSupermarketId()) // 下发到指定的砂站
+                                && ModifyLogService.me.save(receive, null, Enums.DataOpType.SAVE.getId(), user);
+                    } catch (Exception e) {
+                        log.error(e.getMessage(), e);
+                        return false;
+                    }
+                }
+            });
+
+            return ret ? Result.object(receive) : Result.failed(false, "新增失败");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            if (e.getMessage().contains("PRIMARY")) {
+                return Result.failed(false, "主键冲突");
+            } else {
+                return Result.failed(false, e.getMessage());
+            }
+        }
+    }
+}