From afdfe0c0b849a99bd103744ae4bc03f78b174676 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Mon, 1 Mar 2021 17:31:02 +0800 Subject: [PATCH 01/50] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E7=AE=A1=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());
+            }
+        }
+    }
+}

From 7a77fdc674e15c83e9c3838909962f79dbeed9eb Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Wed, 3 Mar 2021 11:40:27 +0800
Subject: [PATCH 02/50] .

---
 .../com/cowr/model/base/BaseTicketLog.java    |  68 ++-
 .../TicketInvalidVerifyValidator.java         |  54 ---
 .../ssjygl/ticket/log/TicketLogService.java   |   2 +-
 .../com/cowr/local/ssjygl/main/Config.java    |   2 +-
 .../order/ordertemp/OrderTempController.java  |   9 +-
 .../order/ordertemp/OrderTempSyncService.java | 401 +++++++++++++++---
 .../TicketInvalidVerifyController.java        |  19 +
 .../TicketInvalidVerifySyncService.java       |   2 +-
 .../transport/TransportQueryService.java      |  14 +-
 .../invoice/log/InvoiceLogSyncService.java    |  83 +++-
 10 files changed, 524 insertions(+), 130 deletions(-)

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
index b70b56b..ed2f240 100644
--- 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
@@ -5,7 +5,7 @@ import com.jfinal.plugin.activerecord.IBean;
 import com.alibaba.fastjson.annotation.JSONField;
 
 /**
- * Generated by COWR Mon Mar 01 10:54:13 CST 2021
+ * Generated by COWR Wed Mar 03 11:26:53 CST 2021
  * TableName: ticket_log
  * Remarks: 结算单管理 - 结算单使用记录
  * PrimaryKey: id
@@ -394,5 +394,71 @@ public abstract class BaseTicketLog> extends BaseMode
         return getStr("invoice_code");
     }
 
+    /**
+     * name: invoice_time
+     * type: DATETIME(19)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceTime 开专票时间
+     */
+    @JSONField(name="invoice_time")
+    public void setInvoiceTime(java.util.Date invoiceTime) {
+        set("invoice_time", invoiceTime);
+    }
+    
+
+    /**
+     * @return invoice_time 开专票时间
+     */
+    @JSONField(name="invoice_time")
+    public java.util.Date getInvoiceTime() {
+        return get("invoice_time");
+    }
+
+    /**
+     * name: invoice_user_id
+     * type: INT(10)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceUserId 开专票用户id
+     */
+    @JSONField(name="invoice_user_id")
+    public void setInvoiceUserId(Integer invoiceUserId) {
+        set("invoice_user_id", invoiceUserId);
+    }
+    
+
+    /**
+     * @return invoice_user_id 开专票用户id
+     */
+    @JSONField(name="invoice_user_id")
+    public Integer getInvoiceUserId() {
+        return getInt("invoice_user_id");
+    }
+
+    /**
+     * name: invoice_user_name
+     * type: VARCHAR(255)
+     * isNullable: YES
+     * isPrimaryKey: NO
+     * defaultValue: 
+     * @param invoiceUserName 开专票用户姓名
+     */
+    @JSONField(name="invoice_user_name")
+    public void setInvoiceUserName(String invoiceUserName) {
+        set("invoice_user_name", invoiceUserName);
+    }
+    
+
+    /**
+     * @return invoice_user_name 开专票用户姓名
+     */
+    @JSONField(name="invoice_user_name")
+    public String getInvoiceUserName() {
+        return getStr("invoice_user_name");
+    }
+
 
 }
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
index 2ae6dbc..e24c080 100644
--- 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
@@ -15,62 +15,8 @@ import com.cowr.model.TicketInvalidVerify;
 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) {
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
index dd878fc..132f4cf 100644
--- 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
@@ -178,7 +178,7 @@ public class TicketLogService extends BaseService {
         row.createCell(a++).setCellValue("备注");
         // 表头 end
 
-        int end_col = 16;
+        int end_col = 18;
         int datalen = list.size();
         for (int i = 0; i < datalen; i++) {
             Record order = list.get(i);
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 9b73cac..651bd30 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
@@ -98,7 +98,7 @@ public class Config extends JFinalConfig {
     public static       DeviceThread    deviceThread   = new DeviceThread();
     public static       SocketIOService socketio       = null;
     private static      boolean         client_run     = true;
-    public static final String          CLINET_VERSION = "20210221";
+    public static final String          CLINET_VERSION = "20210301";
 
     public static String getRootPath() {
         return PathKit.getWebRootPath()
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
index 1a390bc..87ae5ea 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
@@ -81,12 +81,13 @@ public class OrderTempController extends BaseController {
         Integer product_id     = getInt("product_id");
         String  invoice_number = get("invoice_number");
         String  invoice_code   = get("invoice_code");
+        String  ticket_code    = get("ticket_code");
         Integer pay_type       = getInt("pay_type");
         String  memo           = get("memo");
         String  printer        = get("printer", Enums.PrinterIdEnum.printer1.name());
         int     req_receipt    = getInt("req_receipt", 0); // 是否需要发票,0 默认不需要,1需要
 
-        renderJson(OrderTempSyncService.me.pay(uuid, transport_id, product_id, invoice_number, invoice_code, pay_type, memo, printer, tokenuser, req_receipt));
+        renderJson(OrderTempSyncService.me.pay(uuid, transport_id, product_id, invoice_number, invoice_code, ticket_code, pay_type, memo, printer, tokenuser, req_receipt));
     }
 
 
@@ -104,11 +105,12 @@ public class OrderTempController extends BaseController {
         Integer ordercluster_id = getInt("ordercluster_id");
         String  invoice_number  = get("invoice_number");
         String  invoice_code    = get("invoice_code");
+        String  ticket_code     = get("ticket_code");
         String  memo            = get("memo");
         String  printer         = get("printer", Enums.PrinterIdEnum.printer1.name());
 //        int     req_receipt     = getInt("req_receipt", 0); // 是否需要发票,0 默认不需要,1需要
 
-        renderJson(OrderTempSyncService.me.payordercluster(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, memo, printer, tokenuser));
+        renderJson(OrderTempSyncService.me.payordercluster(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, ticket_code, memo, printer, tokenuser));
     }
 
     @Before(OrderTempPrepayValidator.class)
@@ -125,12 +127,13 @@ public class OrderTempController extends BaseController {
         Integer ordercluster_id = getInt("ordercluster_id");
         String  invoice_number  = get("invoice_number");
         String  invoice_code    = get("invoice_code");
+        String  ticket_code     = get("ticket_code");
         Integer product_id      = getInt("product_id");
         String  memo            = get("memo");
         String  printer         = get("printer", Enums.PrinterIdEnum.printer1.name());
         int     req_receipt     = getInt("req_receipt", 0); // 是否需要发票,0 默认不需要,1需要
 
-        renderJson(OrderTempSyncService.me.prepay(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, product_id, memo, printer, tokenuser, req_receipt));
+        renderJson(OrderTempSyncService.me.prepay(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, ticket_code, product_id, memo, printer, tokenuser, req_receipt));
     }
 
     @Before(SnValidator.class)
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
index 2b9f272..e78667b 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
@@ -9,16 +9,18 @@ import com.cowr.common.view.Result;
 import com.cowr.local.ssjygl.actioncmdlog.ActionCmdLogSyncService;
 import com.cowr.local.ssjygl.main.CliCacheData;
 import com.cowr.local.ssjygl.main.Config;
+import com.cowr.local.ssjygl.modifylog.ModifyLogSyncService;
 import com.cowr.local.ssjygl.order.LocalOrderService;
 import com.cowr.local.ssjygl.order.orderseq.OrderSeqService;
+import com.cowr.local.ssjygl.synctask.SyncTaskService;
+import com.cowr.model.*;
 import com.cowr.ssjygl.invoice.log.InvoiceLogService;
 import com.cowr.ssjygl.invoice.receive.InvoiceReceiveService;
 import com.cowr.ssjygl.order.ordercluster.OrderclusterService;
-import com.cowr.ssjygl.supermarket.product.SupermarketProductService;
-import com.cowr.local.ssjygl.synctask.SyncTaskService;
-import com.cowr.model.*;
-import com.cowr.local.ssjygl.modifylog.ModifyLogSyncService;
 import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService;
+import com.cowr.ssjygl.supermarket.product.SupermarketProductService;
+import com.cowr.ssjygl.ticket.log.TicketLogService;
+import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
 import com.cowr.ssjygl.transprice.TransPriceService;
 import com.jfinal.kit.StrKit;
 import com.jfinal.log.Log;
@@ -39,6 +41,7 @@ public class OrderTempSyncService {
             Integer product_id,
             String invoice_number,
             String invoice_code,
+            String ticket_code,
             Integer pay_type,
             String memo,
             String printerId,
@@ -55,16 +58,6 @@ public class OrderTempSyncService {
             return Result.failed("进出场记录已完结或者已作废,不能使用");
         }
 
-        InvoiceReceive receive = InvoiceReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), invoice_number, invoice_code);
-        if (receive == null) {
-            return Result.failed("没有有效的发票领用记录,或者发票已经被使用");
-        }
-
-        InvoiceLog invoiceLog = InvoiceLogService.me.checkInvalidInvoiceLog(invoice_number, invoice_code);
-        if (invoiceLog != null) {
-            return Result.failedstr("发票 %s|%s 已作废", invoice_number, invoice_code);
-        }
-
         Product product = Product.dao.findById(product_id);
 
         if (product == null) {
@@ -104,9 +97,43 @@ public class OrderTempSyncService {
 
         BigDecimal net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次
 
+        InvoiceReceive receive       = null;
+        TicketReceive  ticketReceive = null;
+
         if (req_receipt == 1) { // 需要同时开具发票
+            receive = InvoiceReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), invoice_number, invoice_code);
+            if (receive == null) {
+                return Result.failed("没有有效的发票领用记录,或者发票已经被使用");
+            }
+
+            InvoiceLog invoiceLog = InvoiceLogService.me.checkInvalidInvoiceLog(invoice_number, invoice_code);
+            if (invoiceLog != null) {
+                return Result.failedstr("发票 %s|%s 已作废", invoice_number, invoice_code);
+            }
+
+            receive.setSurplus(receive.getSurplus() - 1);
+            receive.setCurrentCode(invoice_code);
+
             order.setInvoiceCode(invoice_code);
             order.setInvoiceNumber(invoice_number);
+            order.setInvoiceType(1);
+        } else {
+            // 不开发票的,必须使用结算单
+            ticketReceive = TicketReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), ticket_code);
+            if (ticketReceive == null) {
+                return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+            }
+
+            TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code);
+            if (ticketLog != null) {
+                return Result.failedstr("结算单 %s 已作废", ticket_code);
+            }
+
+            ticketReceive.setSurplus(ticketReceive.getSurplus() - 1);
+            ticketReceive.setCurrentCode(ticket_code);
+
+            order.setTicketCode(ticket_code);
+            order.setInvoiceType(2);
         }
 
         order.setTransportId(transport.getId());
@@ -142,6 +169,8 @@ public class OrderTempSyncService {
         transport.setState(order.getState()); // 使用 order 的 state
         transport.setType(OrderTypeEnum.TEMP.getTypeid());
 
+        InvoiceReceive finalReceive       = receive;
+        TicketReceive  finalTicketReceive = ticketReceive;
         boolean ret = Db.tx(new IAtom() {
             @Override
             public boolean run() {
@@ -180,40 +209,65 @@ public class OrderTempSyncService {
                         synctask.addUpdateData(stock);
                     }
 
-//                    if (req_receipt == 1) { // 需要同时开具发票
-                    // 这里的 finalReceive 在前面肯定验证过了
-                    receive.setSurplus(receive.getSurplus() - 1);
-                    receive.setCurrentCode(invoice_code);
+                    if (req_receipt == 1) { // 需要同时开具发票
+                        // 这里的 finalReceive 在前面肯定验证过了
+                        ret = finalReceive.update();
 
-                    ret = receive.update();
+                        if (!ret) {
+                            log.error("发票领用信息更新失败", invoice_code);
+                            return false;
+                        }
 
-                    if (!ret) {
-                        log.error("发票领用信息更新失败", invoice_code);
-                        return false;
+                        InvoiceLog invoiceLog = new InvoiceLog();
+                        invoiceLog.setId(StrKit.getRandomUUID());
+                        invoiceLog.setInvoiceReceiveId(finalReceive.getId());
+                        invoiceLog.setCode(invoice_code);
+                        invoiceLog.setInvoiceNumber(invoice_number);
+                        invoiceLog.setState(OrderStateEnum.RECEIVED.getStateid());
+                        invoiceLog.setSettlementTime(now);
+                        invoiceLog.setSettlementUserId(order.getSettlementUserId());
+                        invoiceLog.setSettlementUserName(order.getSettlementUserName());
+                        invoiceLog.setOrderSn(order.getSn());
+                        invoiceLog.setType(OrderTypeEnum.TEMP.getTypeid());
+
+                        ret = invoiceLog.save();
+
+                        if (!ret) {
+                            return false;
+                        }
+
+                        synctask.addSaveData(invoiceLog);
+                        synctask.addUpdateData(finalReceive);
+                    } else {
+                        // 不开发票的,要开结算单
+                        ret = finalTicketReceive.update();
+
+                        if (!ret) {
+                            log.error("结算单领用信息更新失败", ticket_code);
+                            return false;
+                        }
+
+                        TicketLog ticketLog = new TicketLog();
+                        ticketLog.setId(StrKit.getRandomUUID());
+                        ticketLog.setTicketReceiveId(finalTicketReceive.getId());
+                        ticketLog.setTicketCode(ticket_code);
+                        ticketLog.setState(OrderStateEnum.RECEIVED.getStateid());
+                        ticketLog.setSettlementTime(now);
+                        ticketLog.setSettlementUserId(order.getSettlementUserId());
+                        ticketLog.setSettlementUserName(order.getSettlementUserName());
+                        ticketLog.setOrderSn(order.getSn());
+                        ticketLog.setType(OrderTypeEnum.TEMP.getTypeid());
+
+                        ret = ticketLog.save();
+
+                        if (!ret) {
+                            return false;
+                        }
+
+                        synctask.addSaveData(ticketLog);
+                        synctask.addUpdateData(finalTicketReceive);
                     }
 
-                    InvoiceLog invoiceLog = new InvoiceLog();
-                    invoiceLog.setId(StrKit.getRandomUUID());
-                    invoiceLog.setInvoiceReceiveId(receive.getId());
-                    invoiceLog.setCode(invoice_code);
-                    invoiceLog.setInvoiceNumber(invoice_number);
-                    invoiceLog.setState(OrderStateEnum.RECEIVED.getStateid());
-                    invoiceLog.setSettlementTime(now);
-                    invoiceLog.setSettlementUserId(order.getSettlementUserId());
-                    invoiceLog.setSettlementUserName(order.getSettlementUserName());
-                    invoiceLog.setOrderSn(order.getSn());
-                    invoiceLog.setType(OrderTypeEnum.TEMP.getTypeid());
-
-                    ret = invoiceLog.save();
-
-                    if (!ret) {
-                        return false;
-                    }
-
-                    synctask.addSaveData(invoiceLog);
-                    synctask.addUpdateData(receive);
-//                    }
-
                     synctask.addUpdateData(transport);
                     synctask.addSaveData(order);
 
@@ -243,6 +297,7 @@ public class OrderTempSyncService {
             Integer ordercluster_id,
             String invoice_number,
             String invoice_code,
+            String ticket_code,
             String memo,
             String printerId,
             Sysuser sysuser
@@ -311,7 +366,8 @@ public class OrderTempSyncService {
             return Result.failedstr("净重 %.2f 吨,超过了剩余的 %.2f 余量", net_weight, ordercluster.getTotalWeight().subtract(overweight));
         }
 
-        InvoiceReceive receive = null;
+        InvoiceReceive receive       = null;
+        TicketReceive  ticketReceive = null;
 
         // 零散客户需要开具发票的,需要检查是否有有效的领用记录
         if (ordercluster.getReqReceipt() == 1) {
@@ -334,6 +390,20 @@ public class OrderTempSyncService {
 
             order.setInvoiceType(1); // 需要开发票的,都是冠名发票
         } else {
+            // 不开发票的,必须使用结算单
+            ticketReceive = TicketReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), ticket_code);
+            if (ticketReceive == null) {
+                return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+            }
+
+            TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code);
+            if (ticketLog != null) {
+                return Result.failedstr("结算单 %s 已作废", ticket_code);
+            }
+
+            ticketReceive.setSurplus(ticketReceive.getSurplus() - 1);
+            ticketReceive.setCurrentCode(ticket_code);
+            order.setTicketCode(ticket_code);
             order.setInvoiceType(2); // 不需要开发票的,都是要专票的
         }
 
@@ -380,7 +450,7 @@ public class OrderTempSyncService {
         // 2020-10-26 应王乐要求,零散购砂客户总价四舍五入
         BigDecimal total_price = TransPriceService.me.caleTotalPrice(up, net_weight);
 
-        if(total_price == null){
+        if (total_price == null) {
             return Result.failed("总价计算错误");
         }
 
@@ -426,7 +496,8 @@ public class OrderTempSyncService {
         transport.setArriveTime(now);
         transport.setType(OrderTypeEnum.TEMP.getTypeid());
 
-        InvoiceReceive finalReceive = receive;
+        InvoiceReceive finalReceive       = receive;
+        TicketReceive  finalTicketReceive = ticketReceive;
         boolean ret = Db.tx(new IAtom() {
             @Override
             public boolean run() {
@@ -507,6 +578,34 @@ public class OrderTempSyncService {
 
                         synctask.addSaveData(invoiceLog);
                         synctask.addUpdateData(finalReceive);
+                    } else {
+                        // 不开发票的,要开结算单
+                        ret = finalTicketReceive.update();
+
+                        if (!ret) {
+                            log.error("结算单领用信息更新失败", ticket_code);
+                            return false;
+                        }
+
+                        TicketLog ticketLog = new TicketLog();
+                        ticketLog.setId(StrKit.getRandomUUID());
+                        ticketLog.setTicketReceiveId(finalTicketReceive.getId());
+                        ticketLog.setTicketCode(ticket_code);
+                        ticketLog.setState(OrderStateEnum.RECEIVED.getStateid());
+                        ticketLog.setSettlementTime(now);
+                        ticketLog.setSettlementUserId(order.getSettlementUserId());
+                        ticketLog.setSettlementUserName(order.getSettlementUserName());
+                        ticketLog.setOrderSn(order.getSn());
+                        ticketLog.setType(OrderTypeEnum.TEMP.getTypeid());
+
+                        ret = ticketLog.save();
+
+                        if (!ret) {
+                            return false;
+                        }
+
+                        synctask.addSaveData(ticketLog);
+                        synctask.addUpdateData(finalTicketReceive);
                     }
 
                     // 在这里更新sn字段之后存入
@@ -535,6 +634,7 @@ public class OrderTempSyncService {
             Integer ordercluster_id,
             String invoice_number,
             String invoice_code,
+            String ticket_code,
             Integer product_id,
             String memo,
             String printerId,
@@ -629,14 +729,12 @@ public class OrderTempSyncService {
             return Result.failed("客户余额不足");
         }
 
-        InvoiceReceive receive = null;
+        InvoiceReceive receive       = null;
+        TicketReceive  ticketReceive = null;
 
         // 2020-09-29 需要开具专票的,先开具结算单,不打发票
         // 2020-10-12 所有砂站都可以开结算单
-        if (customer.getInvoiceType() == 2) {
-            order.setInvoiceType(2);
-            // 需要专票的,在结算开了专票之后,再修改 invoice_site 字段
-        } else {
+        if (customer.getInvoiceType() == 1) {
             receive = InvoiceReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), invoice_number, invoice_code);
             if (receive == null) {
                 return Result.failed("没有有效的发票领用记录,或者发票已经被使用");
@@ -647,6 +745,9 @@ public class OrderTempSyncService {
                 return Result.failedstr("发票 %s|%s 已作废", invoice_number, invoice_code);
             }
 
+            receive.setSurplus(receive.getSurplus() - 1);
+            receive.setCurrentCode(invoice_code);
+
             // 不满足开专票的条件的,就必须开具冠名发票
 //        if (req_receipt == 1) { // 需要同时开具发票
             order.setInvoiceCode(invoice_code);
@@ -654,6 +755,23 @@ public class OrderTempSyncService {
             order.setInvoiceType(1);
             order.setInvoiceSite(1); // 在砂站开具冠名发票
 //        }
+        } else {
+            // 需要专票的,在结算开了专票之后,再修改 invoice_site 字段
+            // 不开冠名发票的,必须使用结算单
+            ticketReceive = TicketReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), ticket_code);
+            if (ticketReceive == null) {
+                return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+            }
+
+            TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code);
+            if (ticketLog != null) {
+                return Result.failedstr("结算单 %s 已作废", ticket_code);
+            }
+
+            ticketReceive.setSurplus(ticketReceive.getSurplus() - 1);
+            ticketReceive.setCurrentCode(ticket_code);
+            order.setTicketCode(ticket_code);
+            order.setInvoiceType(2); // 不需要开发票的,都是要专票的
         }
 
         Product product = Product.dao.findById(ordercluster.getProductId());
@@ -735,7 +853,8 @@ public class OrderTempSyncService {
             return Result.failedstr("总价 %.2f,客户余额(%.2f)不足以支付");
         }
 
-        InvoiceReceive finalReceive = receive;
+        InvoiceReceive finalReceive       = receive;
+        TicketReceive  finalTicketReceive = ticketReceive;
         boolean ret = Db.tx(new IAtom() {
             @Override
             public boolean run() {
@@ -811,12 +930,10 @@ public class OrderTempSyncService {
                         synctask.addUpdateData(stock);
                     }
 
-                    if (finalReceive != null) {
+//                    if (finalReceive != null) {
+                    if (customer.getInvoiceType() == 1) {
 //                    if (req_receipt == 1) { // 需要同时开具发票
                         // 这里的 finalReceive 在前面肯定验证过了
-                        finalReceive.setSurplus(finalReceive.getSurplus() - 1);
-                        finalReceive.setCurrentCode(invoice_code);
-
                         ret = finalReceive.update();
 
                         if (!ret) {
@@ -844,6 +961,34 @@ public class OrderTempSyncService {
 
                         synctask.addSaveData(invoiceLog);
                         synctask.addUpdateData(finalReceive);
+                    } else {
+                        // 不开发票的,要开结算单
+                        ret = finalTicketReceive.update();
+
+                        if (!ret) {
+                            log.error("结算单领用信息更新失败", ticket_code);
+                            return false;
+                        }
+
+                        TicketLog ticketLog = new TicketLog();
+                        ticketLog.setId(StrKit.getRandomUUID());
+                        ticketLog.setTicketReceiveId(finalTicketReceive.getId());
+                        ticketLog.setTicketCode(ticket_code);
+                        ticketLog.setState(OrderStateEnum.RECEIVED.getStateid());
+                        ticketLog.setSettlementTime(now);
+                        ticketLog.setSettlementUserId(order.getSettlementUserId());
+                        ticketLog.setSettlementUserName(order.getSettlementUserName());
+                        ticketLog.setOrderSn(order.getSn());
+                        ticketLog.setType(OrderTypeEnum.TEMP.getTypeid());
+
+                        ret = ticketLog.save();
+
+                        if (!ret) {
+                            return false;
+                        }
+
+                        synctask.addSaveData(ticketLog);
+                        synctask.addUpdateData(finalTicketReceive);
                     }
 //                    }
 
@@ -867,6 +1012,15 @@ public class OrderTempSyncService {
         return LocalOrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId);
     }
 
+    /**
+     * 再次开具冠名发票
+     * @param sn
+     * @param invoice_number
+     * @param invoice_code
+     * @param printerId
+     * @param sysuser
+     * @return
+     */
     public Result invoice(String sn, String invoice_number, String invoice_code, String printerId, Sysuser sysuser) {
         // TODO: 判断权限
 
@@ -993,4 +1147,137 @@ public class OrderTempSyncService {
 
         return Result.failed("开票失败");
     }
+
+    /**
+     * 再次开具结算单
+     * @param sn
+     * @param ticket_code
+     * @param printerId
+     * @param sysuser
+     * @return
+     */
+    public Result ticket(String sn, String ticket_code, String printerId, Sysuser sysuser) {
+        // TODO: 判断权限
+
+        OrderTemp order = OrderTemp.dao.findById(sn);
+
+        if (order == null) {
+            return Result.failedstr("按订单号【%s】未找到记录", sn);
+        }
+
+        int orderstate = order.getState();
+
+        if (orderstate == OrderStateEnum.INVALID.getStateid()) {
+            return Result.failed("订单已经取消");
+        }
+
+        if (StrKit.notBlank(order.getTicketCode())) {
+            return Result.failedstr("请先将已开具的结算单[%s]取消", order.getTicketCode());
+        }
+
+        TicketReceive receive = TicketReceiveService.me.checkSurplusReceive(order.getSupermarketId(), ticket_code);
+        if (receive == null) {
+            return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用");
+        }
+
+        TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code);
+        if (ticketLog != null) {
+            return Result.failedstr("结算单 %s 已作废", ticket_code);
+        }
+
+        order.setTicketCode(ticket_code);
+
+        receive.setSurplus(receive.getSurplus() - 1);
+        receive.setCurrentCode(ticket_code);
+
+        Record logrecord = new Record();
+        logrecord.set("sn", sn);
+        logrecord.set("ticket", ticket_code);
+
+        SyncTask synctask = new SyncTask();
+
+        boolean ret = Db.tx(new IAtom() {
+            @Override
+            public boolean run() {
+                try {
+                    boolean ret = order.update();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    ret = receive.update();
+
+                    if (!ret) {
+                        log.error("结算单领用信息更新失败", ticket_code);
+                        return false;
+                    }
+
+                    TicketLog ticketLog = new TicketLog();
+                    ticketLog.setId(StrKit.getRandomUUID());
+                    ticketLog.setTicketReceiveId(receive.getId());
+                    ticketLog.setTicketCode(ticket_code);
+                    ticketLog.setState(OrderStateEnum.RECEIVED.getStateid());
+                    ticketLog.setSettlementTime(new Date());
+                    ticketLog.setSettlementUserId(order.getSettlementUserId());
+                    ticketLog.setSettlementUserName(order.getSettlementUserName());
+                    ticketLog.setOrderSn(order.getSn());
+                    ticketLog.setType(OrderTypeEnum.TEMP.getTypeid());
+
+                    ret = ticketLog.save();
+
+                    if (!ret) {
+                        return false;
+                    }
+
+                    synctask.addUpdateData(order);
+                    synctask.addSaveData(ticketLog);
+                    synctask.addUpdateData(receive);
+
+                    return ret && SyncTaskService.me.save(synctask)
+                            && ModifyLogSyncService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    return false;
+                }
+            }
+        });
+
+        if (ret) {
+            // 数据库保存成功后,立即推送到服务端,及时更新发票使用信息
+            SyncTaskService.me.send(synctask);
+
+            Transport transport = Transport.dao.findById(order.get("transport_id"));
+
+            if (transport == null) {
+                return Result.failed("运输记录不存在");
+            }
+
+            Record printdata = order.toRecord();
+            printdata.set("first_weight", transport.getFirstWeight());
+            printdata.set("second_weight", transport.getSecondWeight());
+
+            Record cmd = new Record();
+            cmd.set("cmd", "print");
+            cmd.set("sn", sn);
+            cmd.set("printer", printerId);
+
+            try {
+                Config.deviceThread.print(printerId, LocalOrderService.me.getPrintFile(printdata));
+                cmd.set("status", true);
+
+                ActionCmdLogSyncService.me.save(cmd.toJson(), sysuser);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                cmd.set("status", false);
+
+                ActionCmdLogSyncService.me.save(cmd.toJson(), sysuser);
+                return Result.success("开票成功,打印指令失败");
+            }
+
+            return Result.success("开票成功,打印指令已发送");
+        }
+
+        return Result.failed("开票失败");
+    }
 }
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
index 9009f1a..7f63af0 100644
--- 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
@@ -5,6 +5,7 @@ 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.invoice.invalidverify.InvoiceInvalidBySnVerifyValidator;
 import com.cowr.ssjygl.ticket.invalidverify.TicketInvalidVerifyService;
 import com.cowr.ssjygl.ticket.invalidverify.TicketInvalidVerifyValidator;
 import com.jfinal.aop.Before;
@@ -38,4 +39,22 @@ public class TicketInvalidVerifyController extends Controller {
         TicketInvalidVerify model = getModel(TicketInvalidVerify.class, "", true); // 忽略不在model中的字段
         renderJson(TicketInvalidVerifySyncService.me.save(model, tokenuser));
     }
+
+    /**
+     * 新增 invoice_invalid_verify  发票管理 - 发票作废申请
+     */
+    @Before(InvoiceInvalidBySnVerifyValidator.class)
+    public void saveBySn() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        String order_sn     = get("order_sn");
+        String invalid_memo = get("invalid_memo");
+
+        renderJson(TicketInvalidVerifySyncService.me.save(order_sn, invalid_memo, 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
index ab59ac4..1f47e4a 100644
--- 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
@@ -97,7 +97,7 @@ public class TicketInvalidVerifySyncService {
         }
 
         TicketLog ticketLog = TicketLog.dao.findFirst("select * from ticket_log t \n" +
-                " where t.ticket_number = ? and t.code = ? limit 1 ", model.getTicketCode());
+                " where t.ticket_code = ? limit 1 ", model.getTicketCode());
 
         if (ticketLog != null) {
             // 再判断这张结算单是不是已经被取消了
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 173609c..06436bb 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
@@ -7,16 +7,16 @@ import com.cowr.common.enums.OrderTypeEnum;
 import com.cowr.common.utils.ImageUtil;
 import com.cowr.common.view.Result;
 import com.cowr.local.ssjygl.main.Config;
+import com.cowr.model.*;
 import com.cowr.ssjygl.customer.supermarketproduct.CustomerSupermarketProductService;
 import com.cowr.ssjygl.invoice.receive.InvoiceReceiveService;
 import com.cowr.ssjygl.order.OrderService;
 import com.cowr.ssjygl.order.ordercluster.OrderclusterService;
 import com.cowr.ssjygl.order.ordercluster.truck.OrderclusterTruckService;
-import com.cowr.ssjygl.supermarket.product.SupermarketProductService;
-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.supermarket.product.SupermarketProductService;
 import com.cowr.ssjygl.ticket.receive.TicketReceiveService;
 import com.cowr.ssjygl.transprice.TransPriceService;
 import com.jfinal.kit.StrKit;
@@ -130,8 +130,14 @@ 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<>());
+            // 开专票的需要用结算单
+            if (prepayinfo != null && prepayinfo.get("prepay_customer_invoice_type") != null && prepayinfo.getInt("prepay_customer_invoice_type") == 2) {
+                transobj.set("invoice_numbers", new ArrayList<>());
+                transobj.set("ticket_numbers", TicketReceiveService.me.nextTicketCodes(transport.getSupermarketId()));
+            } else {
+                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()));
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java
index a727944..f3f9d9d 100644
--- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java
@@ -48,16 +48,24 @@ public class InvoiceLogSyncService extends BaseSyncService {
 
         List list = OrderTemp.dao.find("select * from order_temp t \n" +
                 " where t.invoice_code is null \n" +
+                " and t.state = " + OrderStateEnum.RECEIVED.getStateid() +
                 " and t.sn in(" + StrKit.join(question, ", ") + ")", ordersnlist.toArray());
 
-        if (list.size() != snarr.length) {
+
+        List ticketLogs = TicketLog.dao.find("select * from ticket_log t \n" +
+                " where t.invoice_code is null \n" +
+                " and t.state = " + OrderStateEnum.RECEIVED.getStateid() +
+                " and t.order_sn in(" + StrKit.join(question, ", ") + ")", ordersnlist.toArray());
+
+        if (list.size() != snarr.length || list.size() != ticketLogs.size()) {
             return Result.failed("部分订单号未找到,或者已开票");
         }
 
         List       logs = new ArrayList<>();
         Map map  = new HashMap<>();
 
-        for (OrderTemp o : list) {
+        for (int i = 0; i < list.size(); i++) {
+            OrderTemp  o          = list.get(i);
             InvoiceLog invoiceLog = new InvoiceLog();
             invoiceLog.setId(StrKit.getRandomUUID());
             invoiceLog.setSettlementUserId(sysuser.getId());
@@ -77,6 +85,13 @@ public class InvoiceLogSyncService extends BaseSyncService {
             o.setInvoiceNumber(invoice_number);
             o.setInvoiceCode(invoice_code);
 
+            TicketLog ticketLog = ticketLogs.get(i);
+            ticketLog.setInvoiceNumber(invoice_number);
+            ticketLog.setInvoiceCode(invoice_code);
+            ticketLog.setInvoiceUserId(sysuser.getId());
+            ticketLog.setInvoiceUserName(sysuser.getName());
+            ticketLog.setInvoiceTime(new Date());
+
             int supermarket_id = o.getSupermarketId();
 
             if (!map.containsKey(supermarket_id)) {
@@ -85,13 +100,14 @@ public class InvoiceLogSyncService extends BaseSyncService {
 
             map.get(supermarket_id).addUpdateData(o);
             map.get(supermarket_id).addSaveData(invoiceLog);
+            map.get(supermarket_id).addUpdateData(ticketLog);
         }
 
         boolean ret = Db.tx(new IAtom() {
             @Override
             public boolean run() {
                 try {
-                    int[] saveret = Db.batchSave(logs, logs.size());
+                    int[] saveret = Db.batchSave(logs, 500);
 
                     for (int i : saveret) {
                         // 必须是每条 sql 修改一条记录
@@ -100,7 +116,7 @@ public class InvoiceLogSyncService extends BaseSyncService {
                         }
                     }
 
-                    int[] editret = Db.batchUpdate(list, list.size());
+                    int[] editret = Db.batchUpdate(list, 500);
 
                     for (int i : editret) {
                         // 必须是每条 sql 修改一条记录
@@ -109,6 +125,15 @@ public class InvoiceLogSyncService extends BaseSyncService {
                         }
                     }
 
+                    int[] editlogsret = Db.batchUpdate(ticketLogs, 500);
+
+                    for (int i : editlogsret) {
+                        // 必须是每条 sql 修改一条记录
+                        if (i != 1) {
+                            return false;
+                        }
+                    }
+
 
                     // 将订单同步到不同的砂站
                     for (Map.Entry entry : map.entrySet()) {
@@ -180,7 +205,7 @@ public class InvoiceLogSyncService extends BaseSyncService {
         } else if (receive.getSurplus() == 0) {
             // 作废最后一张发票,当前发票停再最后一个发票号码上
             receive.setCurrentCode(receive.getEndCode());
-        } else{
+        } else {
             if (code.equals(receive.getStartCode())) { // 作废第一张发票
                 receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1));
             } else if (code.equals(receive.getCurrentCode())) { // 作废顺延的下一张发票
@@ -366,7 +391,20 @@ public class InvoiceLogSyncService extends BaseSyncService {
                 invoiceLog.getCode()
         );
 
-        if (ordlist.isEmpty()) {
+        if (loglist.isEmpty()) {
+            return Result.failed("发票使用信息错误");
+        }
+
+        List ticketloglist = TicketLog.dao.find("select * from ticket_log t \n" +
+                        " where t.state = ? \n" +
+                        " and t.invoice_number = ? \n" +
+                        " and t.ticket_code = ? ",
+                OrderStateEnum.RECEIVED.getStateid(),
+                invoiceLog.getInvoiceNumber(),
+                invoiceLog.getCode()
+        );
+
+        if (ticketloglist.isEmpty()) {
             return Result.failed("发票使用信息错误");
         }
 
@@ -415,11 +453,31 @@ public class InvoiceLogSyncService extends BaseSyncService {
             map.get(supermarket_id).addUpdateData(o);
         }
 
+        for (TicketLog o : ticketloglist) {
+            o.setInvoiceNumber(null);
+            o.setInvoiceCode(null);
+            o.setInvoiceUserId(null);
+            o.setInvoiceUserName(null);
+            o.setInvoiceTime(null);
+
+            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());
+                    int[] editret = Db.batchUpdate(ordlist, 500);
 
                     for (int i : editret) {
                         // 必须是每条 sql 修改一条记录
@@ -428,7 +486,16 @@ public class InvoiceLogSyncService extends BaseSyncService {
                         }
                     }
 
-                    editret = Db.batchUpdate(loglist, loglist.size());
+                    editret = Db.batchUpdate(loglist, 500);
+
+                    for (int i : editret) {
+                        // 必须是每条 sql 修改一条记录
+                        if (i != 1) {
+                            return false;
+                        }
+                    }
+
+                    editret = Db.batchUpdate(ticketloglist, 500);
 
                     for (int i : editret) {
                         // 必须是每条 sql 修改一条记录

From a04a5dc5706f75b0e46dd09cd3a2b46d6eb32843 Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Wed, 3 Mar 2021 16:46:13 +0800
Subject: [PATCH 03/50] .

---
 .../order/ordertemp/OrderTempService.java     | 26 +++++++++++--------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
index 858b09a..5f9fb5f 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
@@ -2,16 +2,12 @@ package com.cowr.ssjygl.order.ordertemp;
 
 import com.cowr.common.Const;
 import com.cowr.common.base.BaseService;
-import com.cowr.common.enums.OrderStateEnum;
 import com.cowr.common.enums.UserTypeEnum;
 import com.cowr.common.utils.DataUtil;
 import com.cowr.common.utils.DateTimeUtil;
 import com.cowr.common.view.PageParam;
 import com.cowr.common.view.Result;
-import com.cowr.model.InvoiceInvalidVerify;
-import com.cowr.model.OrderInvalidVerify;
-import com.cowr.model.OrderTemp;
-import com.cowr.model.Sysuser;
+import com.cowr.model.*;
 import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Page;
@@ -206,23 +202,31 @@ public class OrderTempService extends BaseService {
             if (!sqlparams.isEmpty()) {
                 // 一个订单的发票可以作废多次,但是每个订单只能有一个是正在作废中的
                 List verifies1 = InvoiceInvalidVerify.dao.find(
-                        "select * from invoice_invalid_verify t where t.order_sn in(" +StrKit.join(sqlparams, ",") + ") and t.state = 1 ", params.toArray());
+                        "select * from invoice_invalid_verify t where t.order_sn in(" + StrKit.join(sqlparams, ",") + ") and t.state = 1 ", params.toArray());
 
                 List verifies2 = OrderInvalidVerify.dao.find(
-                        "select * from order_invalid_verify t where t.order_sn in(" +StrKit.join(sqlparams, ",") + ") and ( t.state = 1 or t.state = 2 )", params.toArray());
+                        "select * from order_invalid_verify t where t.order_sn in(" + StrKit.join(sqlparams, ",") + ") and ( t.state = 1 or t.state = 2 )", params.toArray());
 
+                List verifies3 = TicketInvalidVerify.dao.find(
+                        "select * from ticket_invalid_verify t where t.order_sn in(" + StrKit.join(sqlparams, ",") + ") and t.state = 1 ", params.toArray());
 
                 for (Record record : list) {
                     String rdsn = record.getStr("sn");
 
-                    for(InvoiceInvalidVerify v : verifies1){
-                        if(rdsn.equals(v.getOrderSn())){
+                    for (InvoiceInvalidVerify v : verifies1) {
+                        if (rdsn.equals(v.getOrderSn())) {
                             record.set("invoice_invalid_verify_state", 1);
                         }
                     }
 
-                    for(OrderInvalidVerify v : verifies2){
-                        if(rdsn.equals(v.getOrderSn())){
+                    for (TicketInvalidVerify v : verifies3) {
+                        if (rdsn.equals(v.getOrderSn())) {
+                            record.set("ticket_invalid_verify_state", 1);
+                        }
+                    }
+
+                    for (OrderInvalidVerify v : verifies2) {
+                        if (rdsn.equals(v.getOrderSn())) {
                             record.set("order_invalid_verify_state", 1);
                         }
                     }

From 554fc601fa1ce118c9b934d8c299584aa36020b6 Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Thu, 4 Mar 2021 14:24:53 +0800
Subject: [PATCH 04/50] .

---
 .../order/ordertemp/OrderTempService.java     |  6 +++++
 .../TicketInvalidVerifyService.java           |  6 ++---
 .../order/ordertemp/OrderTempController.java  |  3 ++-
 .../order/ordertemp/OrderTempController.java  |  3 ++-
 .../order/ordertemp/OrderTempSyncService.java | 25 +++++++++++++++++++
 5 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
index 5f9fb5f..42efe98 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java
@@ -91,6 +91,7 @@ public class OrderTempService extends BaseService {
                              Integer state,
                              String invoice_code,
                              Integer invoice_type,
+                             String ticket_code,
                              Integer product_id,
                              Boolean invoice_code_is_null
     ) {
@@ -171,6 +172,11 @@ public class OrderTempService extends BaseService {
             paraList.add(invoice_type);
         }
 
+        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;
 
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
index d0f8a3c..c08385f 100644
--- 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
@@ -37,9 +37,6 @@ public class TicketInvalidVerifyService extends BaseService {
                 " 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);
@@ -75,6 +72,9 @@ public class TicketInvalidVerifyService extends BaseService {
             paraList.add(state);
         }
 
+        String totalRowSql = "select count(*) " + fromsql;
+        String findSql     = selectsql + fromsql;
+
         // 前端传了排序字段,并且排序字段存在相关表中
         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();
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
index 87ae5ea..b56a53d 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
@@ -40,10 +40,11 @@ public class OrderTempController extends BaseController {
         Integer   supermarket_id       = getInt("supermarket_id");
         Integer   isprepaid            = getInt("isprepaid");
         String    invoice_code         = get("invoice_code");
+        String    ticket_code         = get("ticket_code");
         Integer   invoice_type         = getInt("invoice_type");
         Integer   customer_id          = getInt("customer_id");
         Boolean   invoice_code_is_null = getBoolean("invoice_code_is_null");
-        renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, product_id, invoice_code_is_null)));
+        renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, ticket_code, product_id, invoice_code_is_null)));
     }
 
     @Before(StartAndEndIntervalValidator.class)
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java
index 176baf4..efd78e9 100644
--- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java
@@ -40,6 +40,7 @@ public class OrderTempController extends BaseController {
         String    sn                   = get("sn");
         Integer   state                = getInt("state");
         String    invoice_code         = get("invoice_code");
+        String    ticket_code          = get("ticket_code");
         Integer   product_id           = getInt("product_id");
         Integer   invoice_type         = getInt("invoice_type");
         Integer   supermarket_id       = getInt("supermarket_id");
@@ -57,7 +58,7 @@ public class OrderTempController extends BaseController {
             customer_id = tokenuser.getEntityId();
         }
 
-        renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, product_id, invoice_code_is_null)));
+        renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, ticket_code, product_id, invoice_code_is_null)));
     }
 
     @Before(StartAndEndIntervalValidator.class)
diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java
index 9400d71..351822b 100644
--- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java
+++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java
@@ -129,6 +129,31 @@ public class OrderTempSyncService {
                         }
                     }
 
+                    // 开具过结算单的
+                    if(order.getTicketCode() != null){
+                        TicketLog ticketLog = TicketLog.dao.findFirst(
+                                "select * from ticket_log t where ticket_code = ? limit 1 ",
+                                order.getTicketCode());
+
+                        if (ticketLog != null) {
+                            ticketLog.setInvalidUserId(sysuser.getId());
+                            ticketLog.setInvalidUserName(sysuser.getName());
+                            ticketLog.setInvalidTime(new Date());
+                            ticketLog.setInvalidMemo(invalid_memo);
+                            ticketLog.setState(OrderStateEnum.INVALID.getStateid());
+
+                            ret = ticketLog.update();
+
+                            if (!ret) {
+                                return false;
+                            }
+
+                            synctask.addUpdateData(ticketLog);
+                        } else {
+                            log.error("订单[%s]没有找到结算单记录", order.getSn());
+                        }
+                    }
+
                     // 是预付费订单
                     if (order.getIsprepaid() == 1 && order.getCustomerId() != null) {
                         Customer customer = Customer.dao.findById(order.getCustomerId());

From ef69122c69858ed738f016ee760fa1da03df20d6 Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Thu, 4 Mar 2021 14:57:05 +0800
Subject: [PATCH 05/50] .

---
 .../order/ordertemp/OrderTempController.java  | 22 ++++++++++++++++++-
 .../order/ordertemp/OrderTempSyncService.java |  4 ++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
index b56a53d..6ad570a 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java
@@ -40,7 +40,7 @@ public class OrderTempController extends BaseController {
         Integer   supermarket_id       = getInt("supermarket_id");
         Integer   isprepaid            = getInt("isprepaid");
         String    invoice_code         = get("invoice_code");
-        String    ticket_code         = get("ticket_code");
+        String    ticket_code          = get("ticket_code");
         Integer   invoice_type         = getInt("invoice_type");
         Integer   customer_id          = getInt("customer_id");
         Boolean   invoice_code_is_null = getBoolean("invoice_code_is_null");
@@ -159,6 +159,26 @@ public class OrderTempController extends BaseController {
     }
 
 
+    @Before(SnValidator.class)
+    public void ticket() {
+        Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
+
+        if (tokenuser == null) {
+            renderJson(Result.noauth());
+            return;
+        }
+
+        String sn          = get("sn");
+        String ticket_code = get("ticket_code");
+        String printer     = get("printer", Enums.PrinterIdEnum.printer1.name());
+
+        if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TEMP.getTypeid()) {
+            renderJson(Result.failed("sn 不能为 null"));
+        } else {
+            renderJson(OrderTempSyncService.me.ticket(sn, ticket_code, printer, tokenuser));
+        }
+    }
+
     @Before(SnValidator.class)
     public void print() {
         Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
index e78667b..ab442ce 100644
--- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
+++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java
@@ -1165,6 +1165,10 @@ public class OrderTempSyncService {
             return Result.failedstr("按订单号【%s】未找到记录", sn);
         }
 
+        if(order.getInvoiceType() != 2){
+            return Result.failed("需要专票的订单才用结算单");
+        }
+
         int orderstate = order.getState();
 
         if (orderstate == OrderStateEnum.INVALID.getStateid()) {

From 4ccc5f7243aa5e4c390e9ff21e6b96524195707f Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Thu, 4 Mar 2021 17:29:15 +0800
Subject: [PATCH 06/50] .

---
 .../stat/invoice/InvoiceUseController.java    |  5 ++--
 .../stat/invoice/InvoiceUseService.java       | 23 +++++++++++++++----
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java
index 1579e5f..980fdad 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java
@@ -16,6 +16,7 @@ public class InvoiceUseController extends Controller {
         Integer invoice_type   = getInt("invoice_type");
         String  invoice_number = get("invoice_number");
         String  invoice_code   = get("invoice_code");
+        String  ticket_code   = get("ticket_code");
         Integer invoice_state  = getInt("invoice_state");
         String  order_sn       = get("order_sn");
         String  truck_license  = get("truck_license");
@@ -23,9 +24,9 @@ public class InvoiceUseController extends Controller {
 
         int    export = getInt("export", 0);
         if (export == 0) {
-            renderJson(Result.success(InvoiceUseService.me.statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state)));
+            renderJson(Result.success(InvoiceUseService.me.statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, ticket_code, order_sn, truck_license, order_state)));
         }else{
-            Workbook wb = InvoiceUseService.me.statuseExport(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state);
+            Workbook wb = InvoiceUseService.me.statuseExport(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, ticket_code, order_sn, truck_license, order_state);
             render(new ExcelRender(tm + "_票据使用记录_" + System.currentTimeMillis() + ".xlsx", wb));
         }
     }
diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java
index 8701ed8..1782a5f 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java
@@ -36,6 +36,7 @@ public class InvoiceUseService {
             String invoice_number,
             String invoice_code,
             Integer invoice_state,
+            String ticket_code,
             String order_sn,
             String truck_license,
             Integer order_state
@@ -43,7 +44,7 @@ public class InvoiceUseService {
         String logsql = "select \n" +
                 "   t.id rowkey, t.invoice_number, t.`code` invoice_code, t.state invoice_state, t.settlement_user_name, t.settlement_time, t.create_time, t.invalid_time, t.invalid_memo, t.invoice_type, t.invalid_user_name\n" +
                 " , r.receive_user_name, r.create_time receive_time, r.supermarket_id\n" +
-                " , o.sn order_sn, o.weight, o.total_price, o.unit_price, o.truck_license, o.customer_id, o.customer_texpayer_name, o.customer_texpayer_num, o.isprepaid, o.state order_state\n" +
+                " , o.sn order_sn, o.weight, o.total_price, o.unit_price, o.truck_license, o.customer_id, o.customer_texpayer_name, o.customer_texpayer_num, o.isprepaid, o.state order_state, o.ticket_code\n" +
                 " , s.name supermarket_name " +
                 " from invoice_log t\n" +
                 " left join invoice_receive r on t.invoice_receive_id = r.id\n" +
@@ -54,8 +55,9 @@ public class InvoiceUseService {
         String ordsql = "select\n" +
                 "  t.uuid rowkey, t.invoice_number, t.invoice_code, l.state invoice_state, t.settlement_user_name, l.settlement_time, t.create_time, l.invalid_time, l.invalid_memo, t.invoice_type, l.invalid_user_name\n" +
                 " , r.receive_user_name, r.create_time receive_time, t.supermarket_id \n" +
-                " , t.sn order_sn, t.weight, t.total_price, t.unit_price, t.truck_license, t.customer_id, t.customer_texpayer_name, t.customer_texpayer_num, t.isprepaid, t.state order_state \n" +
-                " , s.name supermarket_name  from order_temp t \n" +
+                " , t.sn order_sn, t.weight, t.total_price, t.unit_price, t.truck_license, t.customer_id, t.customer_texpayer_name, t.customer_texpayer_num, t.isprepaid, t.state order_state, t.ticket_code \n" +
+                " , s.name supermarket_name \n" +
+                " from order_temp t \n" +
                 " left join invoice_log l on l.invoice_number = t.invoice_number and l.code = t.invoice_code and l.order_sn = t.sn \n" +
                 " left join supermarket s on s.id = t.supermarket_id\n" +
                 " left join invoice_receive r on l.invoice_receive_id = r.id\n" +
@@ -112,6 +114,14 @@ public class InvoiceUseService {
             paramord.add("%" + truck_license.trim() + "%");
         }
 
+        if (StrKit.notBlank(ticket_code)) {
+            logsql += " and o.ticket_code like ? \n";
+            ordsql += " and t.ticket_code like ? \n";
+
+            paramlog.add("%" + ticket_code.trim() + "%");
+            paramord.add("%" + ticket_code.trim() + "%");
+        }
+
         if (invoice_state != null) {
             if (invoice_state == 9) {
                 logsql += " and t.state = ? \n";
@@ -225,11 +235,12 @@ public class InvoiceUseService {
             String invoice_number,
             String invoice_code,
             Integer invoice_state,
+            String ticket_code,
             String order_sn,
             String truck_license,
             Integer order_state
     ) {
-        Record ret = statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state);
+        Record ret = statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, ticket_code, order_sn, truck_license, order_state);
 
         List list = ret.get("list");
 
@@ -253,6 +264,7 @@ public class InvoiceUseService {
         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("作废人");
@@ -260,7 +272,7 @@ public class InvoiceUseService {
         row.createCell(a++).setCellValue("备注");
         // 表头 end
 
-        int end_col = 19;
+        int end_col = 20;
         int datalen = list.size();
         for (int i = 0; i < datalen; i++) {
             Record order = list.get(i);
@@ -313,6 +325,7 @@ public class InvoiceUseService {
             } else {
                 row.createCell(a++).setCellValue("");
             }
+            row.createCell(a++).setCellValue(order.getStr("ticket_code"));
             row.createCell(a++).setCellValue(order.getStr("settlement_user_name"));
             if (order.get("settlement_time") != null) {
                 row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("settlement_time")));

From d2df4c512e2fdaa0a99604cb2239e432fda5d353 Mon Sep 17 00:00:00 2001
From: "lisai17@sina.com" 
Date: Fri, 5 Mar 2021 11:40:27 +0800
Subject: [PATCH 07/50] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=93=E7=AE=97?=
 =?UTF-8?q?=E7=AE=A1=E7=90=86bug=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=B4=A2?=
 =?UTF-8?q?=E5=8A=A1=E7=BB=8F=E7=90=86=E8=A7=92=E8=89=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/cowr/common/enums/RoleEnum.java  |  4 +-
 .../system/sysuser/SysuserSyncService.java    | 11 +++++
 .../TicketInvalidVerifySyncService.java       |  4 ++
 .../invoice/log/InvoiceLogSyncService.java    | 42 +++++++++++--------
 .../prepaydetail/PrepayDetailSyncService.java |  2 +-
 .../refunddetail/RefundDetailSyncService.java |  2 +-
 .../system/sysuser/SysuserSyncService.java    | 13 ++++++
 .../ticket/log/TicketLogController.java       |  2 +-
 .../ticket/log/TicketLogSyncService.java      |  4 ++
 9 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/RoleEnum.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/RoleEnum.java
index b9615c0..095a0e7 100644
--- a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/RoleEnum.java
+++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/RoleEnum.java
@@ -14,9 +14,10 @@ import java.util.List;
  * 300 注册用户
  * 400 占位
  * 

- * 500 公司总经理,权限:查看、付费审核、退费审核 + * 500 公司总经理,权限:查看、配额 * 501 公司财务人员,权限:查看、付费、退费 * 502 公司领导,权限:查看 + * 503 公司财务经理 付费审核、退费审核 */ public enum RoleEnum { DEVOPS(99), @@ -32,6 +33,7 @@ public enum RoleEnum { PRESIDENT(500), TREASURER(501), PRESIDENTVIEW(502), + FINANCEMANAGER(503), CHAISHA(600); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserSyncService.java index fe9b336..ce5fcd5 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserSyncService.java @@ -125,6 +125,17 @@ public class SysuserSyncService extends BaseService { return roleid.equals(RoleEnum.TRANCOADMIN.getRoleid()); } + /** + * 是否财务经理 + * 预付费审批、退费审批 + * @param roleid + * @return + */ + public boolean isFinanceManager(Integer roleid){ + if (roleid == null) return false; + return roleid.equals(RoleEnum.FINANCEMANAGER.getRoleid()); + } + /** * 是否是司机 * 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 index 1f47e4a..52821a2 100644 --- 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 @@ -25,6 +25,10 @@ public class TicketInvalidVerifySyncService { return Result.failedstr("按 %s 没有找到订单信息", order_sn); } + if (order.getInvoiceType() == 2 && order.getInvoiceCode() != null) { + return Result.failed("已经开专票的结算单不能取消"); + } + TicketReceive receive = TicketReceiveService.me.checkReceive(CliCacheData.SUP.getId(), order.getTicketCode()); if (receive == null) { return Result.failed("没有有效的结算单领用记录,或者订单没有开具有效的结算单"); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java index f3f9d9d..68663b2 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java @@ -262,7 +262,13 @@ public class InvoiceLogSyncService extends BaseSyncService { return Result.failed("未找到发票记录"); } - return cancelType1(invoiceLog, invalid_memo, sysuser); + if (invoiceLog.getInvoiceType() == 1) { + return cancelType1(invoiceLog, invalid_memo, sysuser); + } else if (invoiceLog.getInvoiceType() == 2) { + return cancelType2(invoiceLog, invalid_memo, sysuser); + } else { + return Result.failed("发票记录错误"); + } } @@ -395,23 +401,14 @@ public class InvoiceLogSyncService extends BaseSyncService { return Result.failed("发票使用信息错误"); } - List ticketloglist = TicketLog.dao.find("select * from ticket_log t \n" + - " where t.state = ? \n" + - " and t.invoice_number = ? \n" + - " and t.ticket_code = ? ", - OrderStateEnum.RECEIVED.getStateid(), - invoiceLog.getInvoiceNumber(), - invoiceLog.getCode() - ); + Map map = new HashMap<>(); + Map ordmap = new HashMap<>(); + Date now = new Date(); + Record logrecord = new Record(); + List sql = new ArrayList<>(); + List ticketparams = new ArrayList<>(); - if (ticketloglist.isEmpty()) { - return Result.failed("发票使用信息错误"); - } - - Map map = new HashMap<>(); - Map ordmap = new HashMap<>(); - Date now = new Date(); - Record logrecord = new Record(); + ticketparams.add(OrderStateEnum.RECEIVED.getStateid()); logrecord.set("state", OrderStateEnum.INVALID.getStateid()); logrecord.set("invoice_type", invoiceLog.getInvoiceType()); @@ -431,6 +428,17 @@ public class InvoiceLogSyncService extends BaseSyncService { map.get(supermarket_id).addUpdateData(o); ordmap.put(o.getSn(), o); + + ticketparams.add(o.getTicketCode()); + sql.add("?"); + } + + List ticketloglist = TicketLog.dao.find("select * from ticket_log t \n" + + " where t.state = ? \n" + + " and t.ticket_code in(" + StrKit.join(sql, ",") + ")", ticketparams.toArray()); + + if (ticketloglist.isEmpty()) { + return Result.failed("结算单使用信息错误"); } for (InvoiceLog o : loglist) { diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java index d4ec9a5..21d23c5 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java @@ -90,7 +90,7 @@ public class PrepayDetailSyncService extends BaseSyncService { * @return */ public Result verify(String id, int state, String memo, Sysuser user) { - if (!SysuserSyncService.me.isPresident(user.getRole())) { // 总经理审核预付费 + if (!SysuserSyncService.me.isFinanceManager(user.getRole())) { // 财务经理审核预付费 return Result.permissionDenied(); } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java index 6478006..46b4600 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java @@ -106,7 +106,7 @@ public class RefundDetailSyncService extends BaseSyncService { * @return */ public Result verify(String id, int state, String memo, Sysuser user) { - if (!SysuserSyncService.me.isPresident(user.getRole())) { // 总经理审核退费 + if (!SysuserSyncService.me.isFinanceManager(user.getRole())) { // 财务审核退费 return Result.permissionDenied(); } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserSyncService.java index 411980c..f2a2984 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserSyncService.java @@ -136,6 +136,17 @@ public class SysuserSyncService extends BaseSyncService { return roleid.equals(RoleEnum.TRANCOADMIN.getRoleid()); } + /** + * 是否财务经理 + * 预付费审批、退费审批 + * @param roleid + * @return + */ + public boolean isFinanceManager(Integer roleid){ + if (roleid == null) return false; + return roleid.equals(RoleEnum.FINANCEMANAGER.getRoleid()); + } + /** * 是否是司机 * @@ -237,6 +248,7 @@ public class SysuserSyncService extends BaseSyncService { && !isConfigAdmin(model.getRole()) && !isChaisha(model.getRole()) && !isPresidentView(model.getRole()) + && !isFinanceManager(model.getRole()) ) { // 不是财务、经理、采砂局的时候,按照原来的规则检查 if (checkEntityId(model) == null) { @@ -755,6 +767,7 @@ public class SysuserSyncService extends BaseSyncService { && !isTreasurer(sysuser.getRole()) && !isCustomer(sysuser.getRole()) && !isChaisha(sysuser.getRole()) + && !isFinanceManager(sysuser.getRole()) ) { return Result.permissionDenied(); } 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 index 89b761e..c0ceb57 100644 --- 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 @@ -125,7 +125,7 @@ public class TicketLogController extends Controller { return; } - String ticket_code = get("ticket_code"); + String ticket_code = get("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 index cbc2fb5..2ce2980 100644 --- 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 @@ -189,6 +189,10 @@ public class TicketLogSyncService extends BaseSyncService { logrecord.set("ticket_code", ticketLog.getTicketCode()); for (OrderTemp o : ordlist) { + if(o.getInvoiceType() == 2 && o.getInvoiceCode() != null){ + return Result.failed("已经开专票的结算单不能取消"); + } + o.setTicketCode(null); int supermarket_id = o.getSupermarketId(); From 4f1b5221a57c92bf15d36263d1d340760cadee92 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sat, 6 Mar 2021 15:32:54 +0800 Subject: [PATCH 08/50] . --- .../com/cowr/model/base/BaseOrderTemp.java | 22 ------------------- 1 file changed, 22 deletions(-) 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 8f42c7a..56629a2 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 @@ -1112,28 +1112,6 @@ public abstract class BaseOrderTemp> extends BaseMode 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) From d26243b2b6f34859d0d74838605ca28d2d82e22c Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Mon, 8 Mar 2021 10:05:26 +0800 Subject: [PATCH 09/50] . --- .../ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java index 21d23c5..959abf7 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java @@ -32,8 +32,10 @@ public class PrepayDetailSyncService extends BaseSyncService { return Result.failed("按客户 id 未找到对应客户信息"); } - if (model.checkDuplicate("serialnum")) { - return Result.failedstr("流水号【%s】已存在", model.getSerialnum()); + PrepayDetail chk = PrepayDetail.dao.findFirst("select * from prepay_detail t where t.serialnum = ? and t.state < 9 limit 1", model.getSerialnum()); + + if (chk != null) { + return Result.failedstr("流水号【%s】已使用", model.getSerialnum()); } model.setId(StrKit.getRandomUUID()); From 8a6ad8193554d84557fcfb23e8443dcf876bf51f Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sun, 14 Mar 2021 14:22:23 +0800 Subject: [PATCH 10/50] . --- .../main/java/com/cowr/model/SyncTask.java | 10 +++ .../ordercluster/OrderclusterService.java | 36 ++++++++ .../ordercluster/OrderclusterSyncService.java | 37 +++++---- .../ssjygl/synctask/SyncTaskService.java | 82 ++++++++++++++++--- .../src/main/resources/log4j.properties | 22 ++--- 5 files changed, 146 insertions(+), 41 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java index 2054fc3..cc7328e 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java @@ -78,4 +78,14 @@ public class SyncTask extends BaseSyncTask { this.setIncrementData(JSONObject.toJSONString(_increment_data)); } } + + public SyncTask clone(){ + SyncTask out = super.clone(); + out._save_data = (JSONObject) this._save_data.clone(); + out._update_data = (JSONObject) this._update_data.clone(); + out._delete_data = (JSONObject) this._delete_data.clone(); + out._increment_data = (JSONObject) this._increment_data.clone(); + + return out; + } } diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index 0186407..7f85929 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -694,4 +694,40 @@ public class OrderclusterService extends BaseService { return out == null ? new BigDecimal(0) : out; } + + + + /** + * 按客户查询未完成的配额量 + * + * @param customer_id + * @return + */ + public BigDecimal getOverTotalPriceByCustomer(int customer_id) { + String sql = "select sum(a.total_price) total_price from ( \n" + + " select t.ordercluster_id, sum(t.weight) weight, sum(t.total_price) total_price from order_sale t \n" + + " left join ordercluster o on o.id = t.ordercluster_id\n" + + " where t.state = ? \n" + + " and o.state < ? \n" + + " and o.customer_id = ? \n" + + " group by t.ordercluster_id \n" + + " \n" + + " union \n" + + " select t.ordercluster_id, sum(t.weight) weight, sum(t.total_price) total_price from order_temp t \n" + + " left join ordercluster o on o.id = t.ordercluster_id\n" + + " where t.state = ? \n" + + " and o.state < ? \n" + + " and o.customer_id = ? \n" + + " group by t.ordercluster_id \n" + + ") a \n" + + "group by a.ordercluster_id "; + + BigDecimal out = Db.queryBigDecimal( + sql, + OrderStateEnum.RECEIVED.getStateid(), OrderStateEnum.RECEIVED.getStateid(), customer_id, + OrderStateEnum.RECEIVED.getStateid(), OrderStateEnum.RECEIVED.getStateid(), customer_id + ); + + return out == null ? new BigDecimal(0) : out; + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 7821e8e..70b7cea 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -114,6 +114,7 @@ public class OrderclusterSyncService extends BaseSyncService { continue; } + // 当前配额指定的客户、超市、品类对应的单价 BigDecimal unitprice = CustomerSupermarketProductService.me.getUnitPrice(customer_id, supermarket_id, product.getId()); if (unitprice == null) { return Result.failed("未配置商品单价"); @@ -123,7 +124,7 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_id); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = new BigDecimal(total_weight); // 本次配额重量 + BigDecimal plan_total_price = new BigDecimal(total_weight).multiply(unitprice); // 本次配额总价格 for (Record record : undonlist) { Date record_cutoff_time = record.getDate("cutoff_time"); @@ -132,16 +133,16 @@ public class OrderclusterSyncService extends BaseSyncService { if (record_cutoff_time.getTime() == cutoff_time.getTime()) { return Result.failedstr("客户[%s][%s]在砂站[%s]还有未完成的配额", customerObj.getName(), DateTimeUtil.sdfymd.get().format(cutoff_time), SvrCacheData.SUP_CACHE.get(supermarket_id).getName()); } else { - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(customer_id); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(customer_id); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(unitprice).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("剩余总配额 %.2f,客户余额(%.2f)不足", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } @@ -730,22 +731,22 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = model.getTotalWeight(); + BigDecimal plan_total_price = model.getTotalWeight().multiply(oldobj.getUnitPrice()); for (Record record : undonlist) { if (model.getId().equals(record.getInt("id"))) { continue; // 当前修改的记录已经做为初始值了,不再累计 } - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(oldobj.getUnitPrice()).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("计划总配额 %.2f,超过了客户余额(%.2f)", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } } @@ -957,22 +958,22 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = total_weight; + BigDecimal plan_total_price = total_weight.multiply(oldobj.getUnitPrice()); for (Record record : undonlist) { if (oldobj.getId().equals(record.getInt("id"))) { continue; // 当前修改的记录已经做为初始值了,不再累计 } - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(oldobj.getUnitPrice()).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("计划总配额 %.2f,超过了客户余额(%.2f)", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java index 842ec36..a11ea2d 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -270,6 +270,8 @@ public class SyncTaskService { try { JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他砂站 JSONArray deleteauthlics = new JSONArray(); + List sts = new ArrayList<>(); + Date now = new Date(); if (save_data != null && !save_data.isEmpty()) { for (String tablename : save_data.keySet()) { @@ -283,10 +285,39 @@ public class SyncTaskService { continue; } + SyncTask synctask = new SyncTask(); + synctask.setCreateTime(now); + for (int i = 0; i < arr.size(); i++) { JSONObject obj = arr.getJSONObject(i); list.add(new Record().setColumns(obj.getInnerMap())); + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)) { + Blacklist blacklist = new Blacklist(); + blacklist._setAttrs(obj.getInnerMap()); + synctask.addSaveData(blacklist); + } + } + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)){ + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的砂站同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask newsynctask = synctask.clone(); + newsynctask.setId(StrKit.getRandomUUID()); + newsynctask.setSupermarketId(supermarket.getId()); + + sts.add(newsynctask); + } } int[] ret = Db.batchSave(tablename, list, list.size()); @@ -320,10 +351,39 @@ public class SyncTaskService { } } + SyncTask synctask = new SyncTask(); + synctask.setCreateTime(now); + for (int i = 0; i < arr.size(); i++) { JSONObject obj = arr.getJSONObject(i); list.add(new Record().setColumns(obj.getInnerMap())); + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)) { + Blacklist blacklist = new Blacklist(); + blacklist._setAttrs(obj.getInnerMap()); + synctask.addUpdateData(blacklist); + } + } + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)){ + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的砂站同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask newsynctask = synctask.clone(); + newsynctask.setId(StrKit.getRandomUUID()); + newsynctask.setSupermarketId(supermarket.getId()); + + sts.add(newsynctask); + } } int[] ret = Db.batchUpdate(tablename, pks, list, list.size()); @@ -368,8 +428,6 @@ public class SyncTaskService { // 对指定表的固定字段进行 增加或者减少 // 2020-10-10 只在修改 PrepayCustomer 中的余额时需要用到 if (increment_data != null && !increment_data.isEmpty()) { - List sts = new ArrayList<>(); - Date now = new Date(); for (String tablename : increment_data.keySet()) { JSONObject data = increment_data.getJSONObject(tablename); @@ -432,20 +490,20 @@ public class SyncTaskService { sts.add(synctask); } + } - if (!sts.isEmpty()) { - int[] ret = Db.batchSave(sts, sts.size()); + if (!sts.isEmpty()) { + int[] ret = Db.batchSave(sts, sts.size()); - if (ret.length != sts.size()) { + if (ret.length != sts.size()) { + return false; + } + + for (int i : ret) { + // 必须是每条 sql 修改一条记录 + if (i != 1) { return false; } - - for (int i : ret) { - // 必须是每条 sql 修改一条记录 - if (i != 1) { - return false; - } - } } } diff --git a/ssjygl-xsx-service/src/main/resources/log4j.properties b/ssjygl-xsx-service/src/main/resources/log4j.properties index d2d7d36..082b51f 100644 --- a/ssjygl-xsx-service/src/main/resources/log4j.properties +++ b/ssjygl-xsx-service/src/main/resources/log4j.properties @@ -1,5 +1,5 @@ # 日志级别 -log4j.rootLogger=DEBUG, console, fileDebug, fileInfo +log4j.rootLogger=DEBUG, console, fileDebug, fileError log4j.rootLogger.encoding=UTF-8 log4j.logger.com.cowr=DEBUG log4j.logger.com.jfinal=DEBUG @@ -33,16 +33,16 @@ log4j.appender.fileDebug.MaxBackupIndex=1000 log4j.appender.fileDebug.layout=org.apache.log4j.PatternLayout log4j.appender.fileDebug.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %X{traceId}%n -# 输出到文件 info -log4j.appender.fileInfo=org.apache.log4j.RollingFileAppender -log4j.appender.fileInfo.encoding=UTF-8 -log4j.appender.fileInfo.Append=true -log4j.appender.fileInfo.Threshold=INFO -log4j.appender.fileInfo.File=../logs/ssjygl.xsx.service.info.log -log4j.appender.fileInfo.MaxFileSize=10MB -log4j.appender.fileInfo.MaxBackupIndex=500 -log4j.appender.fileInfo.layout=org.apache.log4j.PatternLayout -log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %n +# 输出到文件 error +log4j.appender.fileError=org.apache.log4j.RollingFileAppender +log4j.appender.fileError.encoding=UTF-8 +log4j.appender.fileError.Append=true +log4j.appender.fileError.Threshold=ERROR +log4j.appender.fileError.File=../logs/ssjygl.xsx.service.error.log +log4j.appender.fileError.MaxFileSize=10MB +log4j.appender.fileError.MaxBackupIndex=500 +log4j.appender.fileError.layout=org.apache.log4j.PatternLayout +log4j.appender.fileError.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %n # ConversionPattern参数的格式含义 # 格式名 含义 From 4271b2cd2beb19b4900b7e20ad38d8a30f344916 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sun, 14 Mar 2021 21:35:34 +0800 Subject: [PATCH 11/50] . --- .../com/cowr/local/ssjygl/main/Config.java | 44 ++++++++++--------- .../java/com/cowr/local/ssjygl/main/Main.java | 27 ++++++++++-- .../src/main/resources/prod/config.properties | 5 ++- .../src/main/resources/prod/db.properties | 11 ----- 4 files changed, 52 insertions(+), 35 deletions(-) delete mode 100644 ssjygl-xsx-service/src/main/resources/prod/db.properties 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 651bd30..ccfdb01 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 @@ -2,31 +2,31 @@ package com.cowr.local.ssjygl.main; import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.wall.WallFilter; +import com.cowr.common.Interceptor.ReporterInterceptor; import com.cowr.common.ctrl.HomeController; +import com.cowr.common.handler.GlobalHandler; import com.cowr.common.oss.OSSKit; -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.common.plugin.QuartzPlugin; +import com.cowr.common.view.JsonRenderFactory; import com.cowr.local.ssjygl.authlicense.AuthLicenseController; import com.cowr.local.ssjygl.authlicense.AuthLicenseSyncService; import com.cowr.local.ssjygl.blacklist.BlacklistController; import com.cowr.local.ssjygl.cache.CacheController; import com.cowr.local.ssjygl.customer.CustomerController; import com.cowr.local.ssjygl.customer.contact.CustomerContactController; +import com.cowr.local.ssjygl.customer.pact.CustomerPactController; import com.cowr.local.ssjygl.customer.receiver.CustomerReceiverController; +import com.cowr.local.ssjygl.customer.supermarketproduct.CustomerSupermarketProductController; import com.cowr.local.ssjygl.devicectrl.common.Const; import com.cowr.local.ssjygl.devicectrl.common.DeviceThread; import com.cowr.local.ssjygl.devicectrl.device.CameraController; import com.cowr.local.ssjygl.driver.DriverController; +import com.cowr.local.ssjygl.invoice.invalidverify.InvoiceInvalidVerifyController; import com.cowr.local.ssjygl.invoice.log.InvoiceLogController; import com.cowr.local.ssjygl.invoice.receive.InvoiceReceiveController; import com.cowr.local.ssjygl.netty.NettyClient; import com.cowr.local.ssjygl.netty.SocketIOService; +import com.cowr.local.ssjygl.order.invalidverify.OrderInvalidVerifyController; import com.cowr.local.ssjygl.order.ordercluster.OrderclusterController; import com.cowr.local.ssjygl.order.ordercluster.truck.OrderclusterTruckController; import com.cowr.local.ssjygl.order.orderpurchase.OrderPurchaseController; @@ -34,6 +34,8 @@ import com.cowr.local.ssjygl.order.ordersale.OrderSaleController; import com.cowr.local.ssjygl.order.ordertemp.OrderTempController; import com.cowr.local.ssjygl.order.ordertransfer.OrderTransferController; import com.cowr.local.ssjygl.order.ordertrash.OrderTrashController; +import com.cowr.local.ssjygl.overall.OverallController; +import com.cowr.local.ssjygl.prepay.PrepayController; import com.cowr.local.ssjygl.prepay.prepaydetail.PrepayDetailController; import com.cowr.local.ssjygl.prepay.prepaytruck.PrepayTruckController; import com.cowr.local.ssjygl.prepay.refunddetail.RefundDetailController; @@ -41,6 +43,7 @@ import com.cowr.local.ssjygl.product.ProductController; import com.cowr.local.ssjygl.purchase.PurchaseController; import com.cowr.local.ssjygl.sandfarm.SandfarmController; import com.cowr.local.ssjygl.sms.log.SmsLogController; +import com.cowr.local.ssjygl.stat.sale.OrderStatController; import com.cowr.local.ssjygl.supermarket.SupermarketController; import com.cowr.local.ssjygl.supermarket.customerdistance.SupermarketCustomerDistanceController; import com.cowr.local.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceController; @@ -48,22 +51,23 @@ import com.cowr.local.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDis import com.cowr.local.ssjygl.supermarket.stock.StockController; import com.cowr.local.ssjygl.supermarket.stock.StockSyncService; import com.cowr.local.ssjygl.synctask.SyncTaskService; -import com.cowr.common.plugin.QuartzPlugin; +import com.cowr.local.ssjygl.system.sysuser.SysuserController; +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.local.ssjygl.transport.TransportController; import com.cowr.local.ssjygl.transport.TransportQueryController; import com.cowr.local.ssjygl.transportcompany.TransportCompanyController; import com.cowr.local.ssjygl.truck.TruckController; import com.cowr.model.Supermarket; +import com.cowr.model._MappingKit; import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.actioncmdlog.ActionCmdLogController; import com.cowr.ssjygl.cctv.CctvController; -import com.cowr.local.ssjygl.prepay.PrepayController; -import com.cowr.local.ssjygl.overall.OverallController; import com.cowr.ssjygl.modifylog.ModifyLogController; import com.cowr.ssjygl.stat.invoice.InvoiceUseController; import com.cowr.ssjygl.stat.purchase.OrderPurchaseStatController; -import com.cowr.local.ssjygl.stat.sale.OrderStatController; import com.cowr.ssjygl.stat.transfer.OrderTransferStatController; -import com.cowr.local.ssjygl.system.sysuser.SysuserController; import com.cowr.ssjygl.transportcompany.TransportCompanyService; import com.cowr.ssjygl.transprice.TransPriceService; import com.jfinal.config.*; @@ -80,10 +84,6 @@ import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.plugin.druid.DruidStatViewHandler; import com.jfinal.plugin.redis.RedisPlugin; import com.jfinal.template.Engine; -import com.cowr.common.Interceptor.ReporterInterceptor; -import com.cowr.common.handler.GlobalHandler; -import com.cowr.common.view.JsonRenderFactory; -import com.cowr.model._MappingKit; import java.io.File; import java.sql.Connection; @@ -92,7 +92,7 @@ public class Config extends JFinalConfig { private static Log log = Log.getLog(Config.class); public static String ENV = "dev"; public static Prop configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); - public static Prop dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); + public static Prop dbprop; private WallFilter wallFilter; public static NettyClient nettyClient = null; public static DeviceThread deviceThread = new DeviceThread(); @@ -131,8 +131,12 @@ public class Config extends JFinalConfig { } private void initPropConfig() { - dbprop = PropKit.use(ENV + "/db.properties"); configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + if ("prod".equals(ENV)) { + dbprop = PropKit.use(new File(configprop.get("dbconfpath")), "UTF-8"); + } else { + dbprop = PropKit.use(ENV + "/db.properties"); + } CacheData.print_vendor = configprop.get("print.vendor"); CacheData.print_vendorTaxId = configprop.get("print.vendorTaxId"); @@ -262,7 +266,7 @@ public class Config extends JFinalConfig { { String jdbcUrl = dbprop.get("jdbcUrl"); - if(isDev() && !jdbcUrl.contains("_dev")){ + if (isDev() && !jdbcUrl.contains("_dev")) { log.error("dev 的开发环境,连的不是 dev 库"); log.error("dev 的开发环境,连的不是 dev 库"); log.error("dev 的开发环境,连的不是 dev 库"); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java index f12a130..521c233 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java @@ -3,8 +3,14 @@ package com.cowr.local.ssjygl.main; import com.jfinal.kit.PathKit; import com.jfinal.log.Log; import com.jfinal.server.undertow.UndertowServer; +import io.undertow.server.HandlerWrapper; +import io.undertow.server.HttpHandler; +import io.undertow.server.handlers.DisallowedMethodsHandler; +import io.undertow.servlet.api.DeploymentInfo; +import io.undertow.util.HttpString; import java.lang.management.ManagementFactory; +import java.util.function.BiConsumer; public class Main { private static Log log = Log.getLog(Main.class); @@ -44,10 +50,25 @@ public class Main { log.info("Running directory: " + path); // 相关配置见 undertow.txt - UndertowServer + UndertowServer server = UndertowServer .create(Config.class, Config.ENV + "/undertow.txt") - .addHotSwapClassPrefix("com.cowr.") - .start(); + .addHotSwapClassPrefix("com.cowr."); + + server.onDeploy(new BiConsumer() { + @Override + public void accept(ClassLoader classLoader, DeploymentInfo deploymentInfo) { + deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() { + + @Override + public HttpHandler wrap(HttpHandler handler) { + HttpString[] disallowedHttpMethods = {HttpString.tryFromString("TRACE"), HttpString.tryFromString("TRACK")}; + return new DisallowedMethodsHandler(handler, disallowedHttpMethods); + } + }); + } + }); + + server.start(); } } } diff --git a/ssjygl-xsx-service/src/main/resources/prod/config.properties b/ssjygl-xsx-service/src/main/resources/prod/config.properties index 2fac9f3..6467143 100644 --- a/ssjygl-xsx-service/src/main/resources/prod/config.properties +++ b/ssjygl-xsx-service/src/main/resources/prod/config.properties @@ -13,4 +13,7 @@ socketserver.port=21002 endpoint=oss-cn-shenzhen.aliyuncs.com #清理备份用 -bucketName=shbak \ No newline at end of file +bucketName=shbak + +#读服务器磁盘上的配置文件 +dbconfpath=/home/lisai/ssjygl-xsx/db.properties \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/prod/db.properties b/ssjygl-xsx-service/src/main/resources/prod/db.properties deleted file mode 100644 index 7b2518b..0000000 --- a/ssjygl-xsx-service/src/main/resources/prod/db.properties +++ /dev/null @@ -1,11 +0,0 @@ -# mysql -jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx_service?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true -user=ssjy_xsx -password=Ssjy_xs_890 - -# redis -redis.basekey=ssjcgl_xsx -redis.ip=r-wz9168ab2f2f7ec4pd.redis.rds.aliyuncs.com -redis.port=6379 -redis.pwd=CoWR1111 -redis.db=13 \ No newline at end of file From ba76cd5ec98d58384d24ad55677459eff45c3214 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sun, 14 Mar 2021 21:49:37 +0800 Subject: [PATCH 12/50] . --- .../main/java/com/cowr/service/ssjygl/main/Config.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 2bf0994..7a83e76 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 @@ -81,13 +81,14 @@ import com.jfinal.plugin.druid.DruidStatViewHandler; import com.jfinal.plugin.redis.RedisPlugin; import com.jfinal.template.Engine; +import java.io.File; import java.sql.Connection; public class Config extends JFinalConfig { private static Log log = Log.getLog(Config.class); public static String ENV = "dev"; public static Prop configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); - public static Prop dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); + public static Prop dbprop; private WallFilter wallFilter; public static NettyServer nettyServer = null; public static boolean server_run = true; @@ -113,8 +114,12 @@ public class Config extends JFinalConfig { } private void initPropConfig() { - dbprop = PropKit.use(ENV + "/db.properties"); configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + if ("prod".equals(ENV)) { + dbprop = PropKit.use(new File(configprop.get("dbconfpath")), "UTF-8"); + } else { + dbprop = PropKit.use(ENV + "/db.properties"); + } CacheData.print_vendor = configprop.get("print.vendor"); CacheData.print_vendorTaxId = configprop.get("print.vendorTaxId"); From 345bdad84200f0932a73e0eba40b9d7298b4d047 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sun, 14 Mar 2021 21:51:11 +0800 Subject: [PATCH 13/50] . --- .../src/main/java/com/cowr/local/ssjygl/main/Config.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 ccfdb01..fee8e85 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 @@ -92,7 +92,7 @@ public class Config extends JFinalConfig { private static Log log = Log.getLog(Config.class); public static String ENV = "dev"; public static Prop configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); - public static Prop dbprop; + public static Prop dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); private WallFilter wallFilter; public static NettyClient nettyClient = null; public static DeviceThread deviceThread = new DeviceThread(); @@ -131,12 +131,8 @@ public class Config extends JFinalConfig { } private void initPropConfig() { + dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); - if ("prod".equals(ENV)) { - dbprop = PropKit.use(new File(configprop.get("dbconfpath")), "UTF-8"); - } else { - dbprop = PropKit.use(ENV + "/db.properties"); - } CacheData.print_vendor = configprop.get("print.vendor"); CacheData.print_vendorTaxId = configprop.get("print.vendorTaxId"); From 8611125d4f49fa2bfde42828b52fa78c4c8deab7 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 10:04:47 +0800 Subject: [PATCH 14/50] . --- .../ssjygl/order/ordercluster/OrderclusterSyncService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 70b7cea..5bf06e1 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -998,7 +998,7 @@ public class OrderclusterSyncService extends BaseSyncService { // 已有车辆的,在结转前,需要将已经分配其他集团订单的车辆去掉 List ts = new ArrayList<>(); List tsql = new ArrayList<>(); - Map delmap = new HashMap<>(); + Map delmap = new HashMap<>(); // 检查提交上来的车辆字符串是否用重复的 for (int i = 0; i < octs.size(); i++) { @@ -1006,7 +1006,7 @@ public class OrderclusterSyncService extends BaseSyncService { ts.add(oct.getTruckLicense()); tsql.add("?"); - delmap.put(oct.getTruckLicense(), i); + delmap.put(oct.getTruckLicense(), oct); } ts.add(0, cutoff_time); // 加到查询参数里面 @@ -1022,7 +1022,7 @@ public class OrderclusterSyncService extends BaseSyncService { if (chkduk != null && !chkduk.isEmpty()) { for (Record record : chkduk) { if (delmap.containsKey(record.getStr("truck_license"))) { - octs.remove(delmap.get(record.getStr("truck_license")).intValue()); + octs.remove(delmap.get(record.getStr("truck_license"))); } } } From 8dead8a5f4839b123b344a48ace02b16097eda57 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 14:15:25 +0800 Subject: [PATCH 15/50] . --- .../ordercluster/OrderclusterService.java | 45 ++++++- .../ordercluster/OrderclusterSyncService.java | 121 ++++++------------ 2 files changed, 79 insertions(+), 87 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index 7f85929..e5df76a 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -4,7 +4,6 @@ import com.cowr.common.Const; import com.cowr.common.base.BaseService; import com.cowr.common.enums.OrderStateEnum; import com.cowr.common.enums.UserTypeEnum; -import com.cowr.common.utils.DateTimeUtil; import com.cowr.common.view.PageParam; import com.cowr.common.view.Result; import com.cowr.model.Ordercluster; @@ -21,7 +20,10 @@ import com.jfinal.plugin.activerecord.Page; import com.jfinal.plugin.activerecord.Record; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Generated by COWR Fri Apr 17 16:59:39 CST 2020 @@ -637,7 +639,7 @@ public class OrderclusterService extends BaseService { } /** - * 获取集团订单剩余成量 + * 获取单个集团订单剩余成量 * * @param ordercluster_id * @return @@ -696,7 +698,6 @@ public class OrderclusterService extends BaseService { } - /** * 按客户查询未完成的配额量 * @@ -730,4 +731,40 @@ public class OrderclusterService extends BaseService { return out == null ? new BigDecimal(0) : out; } + + /** + * 客户未完成的配额中,未执行完成的总金额 + * + * @param customer_id + * @return + */ + public BigDecimal undoPrice(int customer_id) { + String sql = "select(\n" + + " select sum(t.`total_weight` * t.`unit_price`) `total_price`\n" + + " from `ordercluster` t\n" + + " where t.`customer_id`= ?\n" + + " and t.state < ? ) - (\n" + + " select sum(t.`weight` * t.`unit_price`) total_price\n" + + " from order_temp t\n" + + " where exists(\n" + + " select 1 from `ordercluster` o\n" + + " where o.`customer_id`= ?\n" + + " and o.id= t.`ordercluster_id`\n" + + " and o.`state`< ?" + + " )\n" + + " and t.`customer_id`= ?\n" + + " and t.`state`= ?)"; + + BigDecimal out = Db.queryBigDecimal( + sql, + customer_id, + OrderStateEnum.RECEIVED.getStateid(), + customer_id, + OrderStateEnum.RECEIVED.getStateid(), + customer_id, + OrderStateEnum.RECEIVED.getStateid() + ); + + return out == null ? new BigDecimal("0") : out; + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 5bf06e1..e0a7e26 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -9,6 +9,7 @@ import com.cowr.common.utils.DateTimeUtil; import com.cowr.common.view.Result; import com.cowr.model.*; import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.main.Config; import com.cowr.service.ssjygl.main.SvrCacheData; import com.cowr.service.ssjygl.sms.log.SmsService; import com.cowr.service.ssjygl.synctask.SyncTaskService; @@ -120,36 +121,20 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed("未配置商品单价"); } - // 按客户查询未完成的订单量 - List undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_id); - - if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_price = new BigDecimal(total_weight).multiply(unitprice); // 本次配额总价格 - - for (Record record : undonlist) { - Date record_cutoff_time = record.getDate("cutoff_time"); - - // 判断日期不是已经存在 - if (record_cutoff_time.getTime() == cutoff_time.getTime()) { - return Result.failedstr("客户[%s][%s]在砂站[%s]还有未完成的配额", customerObj.getName(), DateTimeUtil.sdfymd.get().format(cutoff_time), SvrCacheData.SUP_CACHE.get(supermarket_id).getName()); - } else { - // 累加总价 - plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); - } - } - - // 按客户统计已完成量 - BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(customer_id); // 按客户找集团订单已完成量 - - if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); - } - } - + // 本次配额总价不能超过余额 if (unitprice.multiply(new BigDecimal(total_weight)).compareTo(prepayCustomer.getSurplus()) > 0) { return Result.failedstr("余额 %.2f 不足以购买 %.2f 吨", prepayCustomer.getSurplus(), total_weight); } + // 客户在所有砂站的未完成的配额中,未执行完成的总金额 + BigDecimal undo_price = OrderclusterService.me.undoPrice(customer_id); + BigDecimal plan_total_price = new BigDecimal(total_weight).multiply(unitprice).add(undo_price); // 本次配额总价格 + + // 本次计划总额加上未完成的量,不能超过余额 + if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); + } + Ordercluster model = new Ordercluster(); model.setCustomerId(customerObj.getId()); model.setCustomerAddress(customerObj.getAddress()); @@ -224,7 +209,7 @@ public class OrderclusterSyncService extends BaseSyncService { }); // 保存成功后,发送配额提醒短信 - if (ret) { + if (ret && !Config.isDev()) { for (Ordercluster cluster : newlist) { SmsService.me.sendPeiE(cluster); } @@ -721,36 +706,6 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed(false, "订单已完成,不能修改"); } - if (oldobj.getCustomerId() != null) { - PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(oldobj.getCustomerId()); - if (prepayCustomer == null) { - return Result.failed("不是预付费用户"); - } - - // 按客户查询未完成的订单量 - List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); - - if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_price = model.getTotalWeight().multiply(oldobj.getUnitPrice()); - - for (Record record : undonlist) { - if (model.getId().equals(record.getInt("id"))) { - continue; // 当前修改的记录已经做为初始值了,不再累计 - } - - // 累加总价 - plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); - } - - // 按客户统计已完成量 - BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - - if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); - } - } - } - BigDecimal overweight = OrderclusterService.me.getOverWeight(model.getId()); // 集团订单已完成量 if (model.getTotalWeight().compareTo(overweight) < 0) { @@ -759,6 +714,21 @@ public class OrderclusterSyncService extends BaseSyncService { oldobj.setTotalWeight(model.getTotalWeight()); } + if (oldobj.getCustomerId() != null) { + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(oldobj.getCustomerId()); + if (prepayCustomer == null) { + return Result.failed("不是预付费用户"); + } + + // 客户在所有砂站的未完成的配额中,未执行完成的总金额 + BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); + BigDecimal plan_total_price = model.getTotalWeight().subtract(overweight).multiply(oldobj.getUnitPrice()).add(undo_price); // 修改重量时,减去已完成量 + + if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); + } + } + if (model.getTimeInterval() != null) { oldobj.setTimeInterval(model.getTimeInterval()); } @@ -954,29 +924,6 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed("不是预付费用户"); } - // 按客户查询未完成的订单量 - List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); - - if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_price = total_weight.multiply(oldobj.getUnitPrice()); - - for (Record record : undonlist) { - if (oldobj.getId().equals(record.getInt("id"))) { - continue; // 当前修改的记录已经做为初始值了,不再累计 - } - - // 累加总价 - plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); - } - - // 按客户统计已完成量 - BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - - if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); - } - } - // 按客户统计已完成量 BigDecimal over_weight = OrderclusterService.me.getOverWeight(oldobj.getId()); // 按客户找集团订单已完成量 BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(over_weight); // 剩余未完成量 @@ -992,12 +939,20 @@ public class OrderclusterSyncService extends BaseSyncService { oldobj.setTotalWeight(over_weight.add(surplus_weight.subtract(total_weight))); // 结转不完的,要留下 } + // 客户在所有砂站的未完成的配额中,未执行完成的总金额 + BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); + BigDecimal plan_total_price = total_weight.subtract(over_weight).multiply(oldobj.getUnitPrice()).add(undo_price); // 本次转结的量,减去已完成量 + + if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); + } + List octs = OrderclusterTruck.dao.find("select * from ordercluster_truck t where t.ordercluster_id = ?", ordercluster_id); if (!octs.isEmpty()) { // 已有车辆的,在结转前,需要将已经分配其他集团订单的车辆去掉 - List ts = new ArrayList<>(); - List tsql = new ArrayList<>(); + List ts = new ArrayList<>(); + List tsql = new ArrayList<>(); Map delmap = new HashMap<>(); // 检查提交上来的车辆字符串是否用重复的 @@ -1122,7 +1077,7 @@ public class OrderclusterSyncService extends BaseSyncService { if (ret) { SyncTaskService.me.send(synctask); - if (forwardoldobj[0] != null && !isAuto) { + if (forwardoldobj[0] != null && !isAuto && !Config.isDev()) { SmsService.me.sendPeiE(forwardoldobj[0]); } } From e4cb4230a544cc5769fb6b2903644f0cf7a74253 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 14:28:46 +0800 Subject: [PATCH 16/50] . --- .../ordercluster/OrderclusterService.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index e5df76a..ea88459 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -739,29 +739,14 @@ public class OrderclusterService extends BaseService { * @return */ public BigDecimal undoPrice(int customer_id) { - String sql = "select(\n" + - " select sum(t.`total_weight` * t.`unit_price`) `total_price`\n" + - " from `ordercluster` t\n" + - " where t.`customer_id`= ?\n" + - " and t.state < ? ) - (\n" + - " select sum(t.`weight` * t.`unit_price`) total_price\n" + - " from order_temp t\n" + - " where exists(\n" + - " select 1 from `ordercluster` o\n" + - " where o.`customer_id`= ?\n" + - " and o.id= t.`ordercluster_id`\n" + - " and o.`state`< ?" + - " )\n" + - " and t.`customer_id`= ?\n" + - " and t.`state`= ?)"; + String sql = "select sum(t.`total_weight`* t.`unit_price`) `total_price`\n" + + " from `ordercluster` t\n" + + " where t.`customer_id`= ? \n" + + " and t.state< ? "; BigDecimal out = Db.queryBigDecimal( sql, customer_id, - OrderStateEnum.RECEIVED.getStateid(), - customer_id, - OrderStateEnum.RECEIVED.getStateid(), - customer_id, OrderStateEnum.RECEIVED.getStateid() ); From 62f32444a478c7caff93b933742212444f23fe43 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 14:47:37 +0800 Subject: [PATCH 17/50] . --- .../ordercluster/OrderclusterService.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index ea88459..e5df76a 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -739,14 +739,29 @@ public class OrderclusterService extends BaseService { * @return */ public BigDecimal undoPrice(int customer_id) { - String sql = "select sum(t.`total_weight`* t.`unit_price`) `total_price`\n" + - " from `ordercluster` t\n" + - " where t.`customer_id`= ? \n" + - " and t.state< ? "; + String sql = "select(\n" + + " select sum(t.`total_weight` * t.`unit_price`) `total_price`\n" + + " from `ordercluster` t\n" + + " where t.`customer_id`= ?\n" + + " and t.state < ? ) - (\n" + + " select sum(t.`weight` * t.`unit_price`) total_price\n" + + " from order_temp t\n" + + " where exists(\n" + + " select 1 from `ordercluster` o\n" + + " where o.`customer_id`= ?\n" + + " and o.id= t.`ordercluster_id`\n" + + " and o.`state`< ?" + + " )\n" + + " and t.`customer_id`= ?\n" + + " and t.`state`= ?)"; BigDecimal out = Db.queryBigDecimal( sql, customer_id, + OrderStateEnum.RECEIVED.getStateid(), + customer_id, + OrderStateEnum.RECEIVED.getStateid(), + customer_id, OrderStateEnum.RECEIVED.getStateid() ); From 84ca081cf33cbd351c48068f9a51f0803730f07a Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 14:53:21 +0800 Subject: [PATCH 18/50] . --- .../ssjygl/order/ordercluster/OrderclusterSyncService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index e0a7e26..c28abf0 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -722,7 +722,9 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); - BigDecimal plan_total_price = model.getTotalWeight().subtract(overweight).multiply(oldobj.getUnitPrice()).add(undo_price); // 修改重量时,减去已完成量 + BigDecimal surplus_weight = model.getTotalWeight().subtract(overweight); // 本次修改增加的重量 + BigDecimal add_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal plan_total_price = add_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); From 08a19b964506d6a4f62c822a6832edcb662963b1 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 15:02:34 +0800 Subject: [PATCH 19/50] . --- .../ssjygl/order/ordercluster/OrderclusterSyncService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index c28abf0..6ab2104 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -722,7 +722,7 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); - BigDecimal surplus_weight = model.getTotalWeight().subtract(overweight); // 本次修改增加的重量 + BigDecimal surplus_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 BigDecimal add_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 BigDecimal plan_total_price = add_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 @@ -943,7 +943,7 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); - BigDecimal plan_total_price = total_weight.subtract(over_weight).multiply(oldobj.getUnitPrice()).add(undo_price); // 本次转结的量,减去已完成量 + BigDecimal plan_total_price = total_weight.subtract(oldobj.getTotalWeight()).multiply(oldobj.getUnitPrice()).add(undo_price); // 本次转结的量,减去已完成量 if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); From 96573b2e67cd706cc4efcb4dc3fa862046228e0e Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 17:23:39 +0800 Subject: [PATCH 20/50] . --- .../ordercluster/OrderclusterSyncService.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 6ab2104..0c210b8 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -721,10 +721,17 @@ public class OrderclusterSyncService extends BaseSyncService { } // 客户在所有砂站的未完成的配额中,未执行完成的总金额 - BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); - BigDecimal surplus_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 - BigDecimal add_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 - BigDecimal plan_total_price = add_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 + BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); + BigDecimal plan_total_price; + if (model.getTotalWeight().compareTo(oldobj.getTotalWeight()) > 0) { // 修改后,比原来的大 + BigDecimal surplus_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 + } else { // 修改后比原来的小 + BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(model.getTotalWeight()); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 + } if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); @@ -942,8 +949,17 @@ public class OrderclusterSyncService extends BaseSyncService { } // 客户在所有砂站的未完成的配额中,未执行完成的总金额 - BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); - BigDecimal plan_total_price = total_weight.subtract(oldobj.getTotalWeight()).multiply(oldobj.getUnitPrice()).add(undo_price); // 本次转结的量,减去已完成量 + BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); + BigDecimal plan_total_price; + if (total_weight.compareTo(oldobj.getTotalWeight()) > 0) { // 修改后,比原来的大 + BigDecimal surplus_weight_1 = total_weight.subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 + } else { // 修改后比原来的小 + BigDecimal surplus_weight_1 = oldobj.getTotalWeight().subtract(total_weight); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 + } if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); From 46eefb5a8d6f915a7306ab2e4edf58dc0bcc69ef Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 17:32:42 +0800 Subject: [PATCH 21/50] . --- .../ordercluster/OrderclusterSyncService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 0c210b8..37fc9a2 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -706,7 +706,8 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed(false, "订单已完成,不能修改"); } - BigDecimal overweight = OrderclusterService.me.getOverWeight(model.getId()); // 集团订单已完成量 + BigDecimal overweight = OrderclusterService.me.getOverWeight(model.getId()); // 集团订单已完成量 + BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(overweight); // 剩余量 if (model.getTotalWeight().compareTo(overweight) < 0) { return Result.failedstr("总量不能低于已运输量(%.2f)", overweight); @@ -723,13 +724,13 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); BigDecimal plan_total_price; - if (model.getTotalWeight().compareTo(oldobj.getTotalWeight()) > 0) { // 修改后,比原来的大 - BigDecimal surplus_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + if (model.getTotalWeight().compareTo(surplus_weight) > 0) { // 修改后,比原来的大 + BigDecimal surplus_weight_1 = model.getTotalWeight().subtract(surplus_weight); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 } else { // 修改后比原来的小 - BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(model.getTotalWeight()); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal surplus_weight_1 = surplus_weight.subtract(model.getTotalWeight()); // 本次修改增加的重量 + BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 } @@ -951,12 +952,12 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); BigDecimal plan_total_price; - if (total_weight.compareTo(oldobj.getTotalWeight()) > 0) { // 修改后,比原来的大 - BigDecimal surplus_weight_1 = total_weight.subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 + if (total_weight.compareTo(surplus_weight) > 0) { // 修改后,比原来的大 + BigDecimal surplus_weight_1 = total_weight.subtract(surplus_weight); // 本次修改增加的重量 BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 } else { // 修改后比原来的小 - BigDecimal surplus_weight_1 = oldobj.getTotalWeight().subtract(total_weight); // 本次修改增加的重量 + BigDecimal surplus_weight_1 = surplus_weight.subtract(total_weight); // 本次修改增加的重量 BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 } From 00b77bf063ec57c5f7f5fbe1ebcfe7fc85ed0cff Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 16 Mar 2021 21:06:02 +0800 Subject: [PATCH 22/50] . --- .../ssjygl/blacklist/BlacklistService.java | 20 ++++++++++- .../ssjygl/synctask/SyncTaskService.java | 34 ++++++++++--------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java index 8b7bb94..1c72e2f 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java @@ -1,10 +1,10 @@ package com.cowr.ssjygl.blacklist; +import com.alibaba.fastjson.JSONObject; import com.cowr.common.Const; import com.cowr.common.base.BaseService; import com.cowr.common.view.PageParam; import com.cowr.model.Blacklist; -import com.cowr.model.Truck; import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Page; @@ -73,4 +73,22 @@ public class BlacklistService extends BaseService { " and truck_license = ? \n" + " limit 0,1 ", license); } + + public Blacklist json2model(JSONObject obj) { + Blacklist blacklist = new Blacklist(); + blacklist.setId(obj.getString("id")); + blacklist.setTruckLicense(obj.getString("truck_license")); + blacklist.setDriverName(obj.getString("driver_name")); + blacklist.setDriverPhone(obj.getString("driver_phone")); + blacklist.setOrderSn(obj.getString("order_sn")); + blacklist.setSetTime(obj.getDate("set_time")); + blacklist.setSetUserId(obj.getInteger("set_user_id")); + blacklist.setSetUserName(obj.getString("set_user_name")); + blacklist.setRemoveTime(obj.getDate("remove_time")); + blacklist.setRemoveUserId(obj.getInteger("remove_user_id")); + blacklist.setRemoveUserName(obj.getString("remove_user_name")); + blacklist.setReasonType(obj.getInteger("reason_type")); + blacklist.setReasonDetail(obj.getString("reason_detail")); + return blacklist; + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java index a11ea2d..febc40e 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -8,6 +8,7 @@ import com.cowr.model.*; import com.cowr.service.ssjygl.main.Config; import com.cowr.service.ssjygl.main.SvrCacheData; import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.blacklist.BlacklistService; import com.jfinal.kit.StrKit; import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.Db; @@ -268,10 +269,10 @@ public class SyncTaskService { @Override public boolean run() { try { - JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他砂站 - JSONArray deleteauthlics = new JSONArray(); - List sts = new ArrayList<>(); - Date now = new Date(); + JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他砂站 + JSONArray deleteauthlics = new JSONArray(); + List sts = new ArrayList<>(); + Date now = new Date(); if (save_data != null && !save_data.isEmpty()) { for (String tablename : save_data.keySet()) { @@ -294,15 +295,13 @@ public class SyncTaskService { list.add(new Record().setColumns(obj.getInnerMap())); // 分发黑名单 - if(Blacklist.dao.getTablename().equals(tablename)) { - Blacklist blacklist = new Blacklist(); - blacklist._setAttrs(obj.getInnerMap()); - synctask.addSaveData(blacklist); + if (Blacklist.dao.getTablename().equals(tablename)) { + synctask.addSaveData(BlacklistService.me.json2model(obj)); } } // 分发黑名单 - if(Blacklist.dao.getTablename().equals(tablename)){ + if (Blacklist.dao.getTablename().equals(tablename)) { for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { Supermarket supermarket = entry.getValue(); @@ -315,6 +314,7 @@ public class SyncTaskService { SyncTask newsynctask = synctask.clone(); newsynctask.setId(StrKit.getRandomUUID()); newsynctask.setSupermarketId(supermarket.getId()); + newsynctask.setJson(); sts.add(newsynctask); } @@ -342,10 +342,10 @@ public class SyncTaskService { JSONArray arr = data.getJSONArray("data"); List list = new ArrayList<>(); - if(Transport.tablename.equals(tablename)){ + if (Transport.tablename.equals(tablename)) { arr = filtrateTransport(arr); - if(arr.isEmpty()){ + if (arr.isEmpty()) { log.debug("%s 数据都被过滤了", tablename); continue; } @@ -360,15 +360,13 @@ public class SyncTaskService { list.add(new Record().setColumns(obj.getInnerMap())); // 分发黑名单 - if(Blacklist.dao.getTablename().equals(tablename)) { - Blacklist blacklist = new Blacklist(); - blacklist._setAttrs(obj.getInnerMap()); - synctask.addUpdateData(blacklist); + if (Blacklist.dao.getTablename().equals(tablename)) { + synctask.addUpdateData(BlacklistService.me.json2model(obj)); } } // 分发黑名单 - if(Blacklist.dao.getTablename().equals(tablename)){ + if (Blacklist.dao.getTablename().equals(tablename)) { for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { Supermarket supermarket = entry.getValue(); @@ -381,6 +379,7 @@ public class SyncTaskService { SyncTask newsynctask = synctask.clone(); newsynctask.setId(StrKit.getRandomUUID()); newsynctask.setSupermarketId(supermarket.getId()); + newsynctask.setJson(); sts.add(newsynctask); } @@ -487,6 +486,7 @@ public class SyncTaskService { synctask.setIncrementData(recvdata.getString("increment_data")); synctask.setSupermarketId(supermarket.getId()); synctask.setCreateTime(now); + synctask.setJson(); sts.add(synctask); } @@ -563,6 +563,7 @@ public class SyncTaskService { synctask.setDeleteData(JSONObject.toJSONString(new JSONObject().put(AuthLicense.dao.getTablename(), deletearr))); synctask.setSupermarketId(supermarket.getId()); synctask.setCreateTime(now); + synctask.setJson(); sts.add(synctask); } @@ -580,6 +581,7 @@ public class SyncTaskService { * 过滤 transport 的数据更新 * 1.如果传上来的数据中 state 是 5 ,表示记录已完成,可以直接更新 * 2.如果传上来的数据中 state 不是 5,就需要查询数据库,看看数据库中是不是已经是 5 了,避免 state 被回退更新 + * * @param arr * @return */ From 0c117fc0dee8ee4353a5f1979fb44f4a263c675c Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Wed, 17 Mar 2021 10:40:30 +0800 Subject: [PATCH 23/50] . --- .../ordercluster/OrderclusterSyncService.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 37fc9a2..cba25b3 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -725,13 +725,27 @@ public class OrderclusterSyncService extends BaseSyncService { BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); BigDecimal plan_total_price; if (model.getTotalWeight().compareTo(surplus_weight) > 0) { // 修改后,比原来的大 - BigDecimal surplus_weight_1 = model.getTotalWeight().subtract(surplus_weight); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal ofsset_weight = model.getTotalWeight().subtract(surplus_weight); // 本次修改增加的重量 + BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 + + log.debug("已完成:%s", overweight); + log.debug("本单剩余:%s", surplus_weight); + log.debug("本调整:%s", ofsset_weight); + log.debug("本调整总价:%s", offset_total_price); + log.debug("客户未完总价:%s", undo_price); + log.debug("调整后总价:%s", plan_total_price); } else { // 修改后比原来的小 - BigDecimal surplus_weight_1 = surplus_weight.subtract(model.getTotalWeight()); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal ofsset_weight = surplus_weight.subtract(model.getTotalWeight()); // 本次修改增加的重量 + BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 + + log.debug("已完成:%s", overweight); + log.debug("本单剩余:%s", surplus_weight); + log.debug("本调整:%s", ofsset_weight); + log.debug("本调整总价:%s", offset_total_price); + log.debug("客户未完总价:%s", undo_price); + log.debug("调整后总价:%s", plan_total_price); } if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { From 1b7d64c62026d98acffe401b6691ca51225ce5bf Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Wed, 17 Mar 2021 10:50:26 +0800 Subject: [PATCH 24/50] . --- .../ordercluster/OrderclusterSyncService.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index cba25b3..3097819 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -707,13 +707,7 @@ public class OrderclusterSyncService extends BaseSyncService { } BigDecimal overweight = OrderclusterService.me.getOverWeight(model.getId()); // 集团订单已完成量 - BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(overweight); // 剩余量 - - if (model.getTotalWeight().compareTo(overweight) < 0) { - return Result.failedstr("总量不能低于已运输量(%.2f)", overweight); - } else { - oldobj.setTotalWeight(model.getTotalWeight()); - } +// BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(overweight); // 剩余量 if (oldobj.getCustomerId() != null) { PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(oldobj.getCustomerId()); @@ -724,24 +718,24 @@ public class OrderclusterSyncService extends BaseSyncService { // 客户在所有砂站的未完成的配额中,未执行完成的总金额 BigDecimal undo_price = OrderclusterService.me.undoPrice(oldobj.getCustomerId()); BigDecimal plan_total_price; - if (model.getTotalWeight().compareTo(surplus_weight) > 0) { // 修改后,比原来的大 - BigDecimal ofsset_weight = model.getTotalWeight().subtract(surplus_weight); // 本次修改增加的重量 + if (model.getTotalWeight().compareTo(oldobj.getTotalWeight()) > 0) { // 修改后,比原来的大 + BigDecimal ofsset_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 log.debug("已完成:%s", overweight); - log.debug("本单剩余:%s", surplus_weight); + log.debug("旧配额:%s", oldobj.getTotalWeight()); log.debug("本调整:%s", ofsset_weight); log.debug("本调整总价:%s", offset_total_price); log.debug("客户未完总价:%s", undo_price); log.debug("调整后总价:%s", plan_total_price); } else { // 修改后比原来的小 - BigDecimal ofsset_weight = surplus_weight.subtract(model.getTotalWeight()); // 本次修改增加的重量 + BigDecimal ofsset_weight = oldobj.getTotalWeight().subtract(model.getTotalWeight()); // 本次修改增加的重量 BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 log.debug("已完成:%s", overweight); - log.debug("本单剩余:%s", surplus_weight); + log.debug("旧配额:%s", oldobj.getTotalWeight()); log.debug("本调整:%s", ofsset_weight); log.debug("本调整总价:%s", offset_total_price); log.debug("客户未完总价:%s", undo_price); @@ -753,6 +747,12 @@ public class OrderclusterSyncService extends BaseSyncService { } } + if (model.getTotalWeight().compareTo(overweight) < 0) { + return Result.failedstr("总量不能低于已运输量(%.2f)", overweight); + } else { + oldobj.setTotalWeight(model.getTotalWeight()); + } + if (model.getTimeInterval() != null) { oldobj.setTimeInterval(model.getTimeInterval()); } From e37f5140b969f6fbcebef101305527f4e7bfd493 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Wed, 17 Mar 2021 11:12:01 +0800 Subject: [PATCH 25/50] . --- .../ssjygl/order/ordercluster/OrderclusterSyncService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 3097819..bf7d87f 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -723,6 +723,7 @@ public class OrderclusterSyncService extends BaseSyncService { BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 + // 线上调试 log.debug("已完成:%s", overweight); log.debug("旧配额:%s", oldobj.getTotalWeight()); log.debug("本调整:%s", ofsset_weight); @@ -734,6 +735,7 @@ public class OrderclusterSyncService extends BaseSyncService { BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 + // 线上调试 log.debug("已完成:%s", overweight); log.debug("旧配额:%s", oldobj.getTotalWeight()); log.debug("本调整:%s", ofsset_weight); From ba33f74a1df157f5665e165cec30b860df9599d0 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 19 Mar 2021 23:58:28 +0800 Subject: [PATCH 26/50] . --- .../java/com/cowr/local/ssjygl/main/Main.java | 29 +++++++++---------- .../com/cowr/service/ssjygl/main/Main.java | 23 ++++++++++++++- .../ssjygl/synctask/SyncTaskService.java | 2 +- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java index 521c233..6cbac0a 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java @@ -50,25 +50,22 @@ public class Main { log.info("Running directory: " + path); // 相关配置见 undertow.txt - UndertowServer server = UndertowServer + UndertowServer .create(Config.class, Config.ENV + "/undertow.txt") - .addHotSwapClassPrefix("com.cowr."); - - server.onDeploy(new BiConsumer() { - @Override - public void accept(ClassLoader classLoader, DeploymentInfo deploymentInfo) { - deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() { - + .addHotSwapClassPrefix("com.cowr.") + .onDeploy(new BiConsumer() { @Override - public HttpHandler wrap(HttpHandler handler) { - HttpString[] disallowedHttpMethods = {HttpString.tryFromString("TRACE"), HttpString.tryFromString("TRACK")}; - return new DisallowedMethodsHandler(handler, disallowedHttpMethods); - } - }); - } - }); + public void accept(ClassLoader classLoader, DeploymentInfo deploymentInfo) { + deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() { - server.start(); + @Override + public HttpHandler wrap(HttpHandler handler) { + HttpString[] disallowedHttpMethods = {HttpString.tryFromString("TRACE"), HttpString.tryFromString("TRACK")}; + return new DisallowedMethodsHandler(handler, disallowedHttpMethods); + } + }); + } + }).start(); } } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java index e8f9103..191f952 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java @@ -3,6 +3,13 @@ package com.cowr.service.ssjygl.main; import com.jfinal.kit.PathKit; import com.jfinal.log.Log; import com.jfinal.server.undertow.UndertowServer; +import io.undertow.server.HandlerWrapper; +import io.undertow.server.HttpHandler; +import io.undertow.server.handlers.DisallowedMethodsHandler; +import io.undertow.servlet.api.DeploymentInfo; +import io.undertow.util.HttpString; + +import java.util.function.BiConsumer; public class Main { private static Log log = Log.getLog(Main.class); @@ -28,7 +35,21 @@ public class Main { log.info("Running directory: " + path); // 相关配置见 undertow.txt - UndertowServer.create(Config.class, Config.ENV + "/undertow.txt").start(); + UndertowServer + .create(Config.class, Config.ENV + "/undertow.txt") + .onDeploy(new BiConsumer() { + @Override + public void accept(ClassLoader classLoader, DeploymentInfo deploymentInfo) { + deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() { + + @Override + public HttpHandler wrap(HttpHandler handler) { + HttpString[] disallowedHttpMethods = {HttpString.tryFromString("TRACE"), HttpString.tryFromString("TRACK")}; + return new DisallowedMethodsHandler(handler, disallowedHttpMethods); + } + }); + } + }).start(); } } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java index febc40e..7fd1cff 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -507,7 +507,7 @@ public class SyncTaskService { } } - if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) { + if (!saveauthlics.isEmpty() || !deleteauthlics.isEmpty()) { return recvAuthLicense(saveauthlics, deleteauthlics, current_supermarket_id); } From b5ba949b38f726bd137686eebe96e9db56b37308 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 26 Mar 2021 17:55:46 +0800 Subject: [PATCH 27/50] =?UTF-8?q?=E5=90=88=E5=B9=B6master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/order/ordertemp/OrderTempSyncService.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java index 0bbba21..f2e7495 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -19,11 +19,7 @@ import com.cowr.ssjygl.invoice.receive.InvoiceReceiveService; import com.cowr.ssjygl.order.ordercluster.OrderclusterService; import com.cowr.ssjygl.prepay.refunddetail.RefundDetailService; import com.cowr.ssjygl.supermarket.product.SupermarketProductService; -import com.cowr.local.ssjygl.synctask.SyncTaskService; -import com.cowr.model.*; -import com.cowr.local.ssjygl.modifylog.ModifyLogSyncService; import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; -import com.cowr.ssjygl.supermarket.product.SupermarketProductService; import com.cowr.ssjygl.ticket.log.TicketLogService; import com.cowr.ssjygl.ticket.receive.TicketReceiveService; import com.cowr.ssjygl.transprice.TransPriceService; @@ -111,9 +107,9 @@ public class OrderTempSyncService { return Result.failed("没有有效的发票领用记录,或者发票已经被使用"); } - InvoiceLog invoiceLog = InvoiceLogService.me.checkInvalidInvoiceLog(invoice_number, invoice_code); + InvoiceLog invoiceLog = InvoiceLogService.me.checkUseInvoiceLog(invoice_number, invoice_code); if (invoiceLog != null) { - return Result.failedstr("发票 %s|%s 已作废", invoice_number, invoice_code); + return Result.failedstr("发票 %s|%s 已使用!重新打开结算界面,获取新的发票信息。", invoice_number, invoice_code); } receive.setSurplus(receive.getSurplus() - 1); From 4e07bb9cfe4208358cdc81521c01d5c37be631f0 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Fri, 26 Mar 2021 18:14:03 +0800 Subject: [PATCH 28/50] =?UTF-8?q?=E5=86=BB=E7=BB=93=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ordercluster/OrderclusterController.java | 6 +++++ .../ordercluster/OrderclusterSyncService.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java index 3f999f7..0f37f1b 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java @@ -279,4 +279,10 @@ public class OrderclusterController extends BaseController { renderJson(OrderclusterSyncService.me.forwardTemp(ordercluster_id, new BigDecimal(total_weight), cutoff_time, trucks, tokenuser)); } + + public void getMaximumConfiguration(){ + String unit_price = get("unit_price"); + int customer_id=getInt("customer_id"); + renderJson(OrderclusterSyncService.me.getMaximumConfiguration(customer_id, unit_price)); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index bf7d87f..2b77638 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -17,6 +17,7 @@ import com.cowr.ssjygl.customer.supermarketproduct.CustomerSupermarketProductSer import com.cowr.ssjygl.modifylog.ModifyLogService; import com.cowr.ssjygl.order.ordercluster.OrderclusterService; import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.cowr.ssjygl.prepay.refunddetail.RefundDetailService; import com.cowr.ssjygl.supermarket.product.SupermarketProductService; import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceService; import com.jfinal.kit.StrKit; @@ -1309,4 +1310,27 @@ public class OrderclusterSyncService extends BaseSyncService { return ret ? Result.success() : Result.failed("操作失败"); } + + /** + *获取最大可购买重量 + * @param customer_id 客户ID + * @param unit_price 单价 + * @return + */ + public Map getMaximumConfiguration( int customer_id,String unit_price){ + Map result=new HashMap(); + Integer count = Db.queryInt("select count(distinct s.name) from ordercluster t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.customer_id =?", customer_id); + result.put("count",count); + //当前用户如果只在一个沙场里面买沙,就计算最大可购买重量 + if(count<=1){ + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer_id); + BigDecimal availableBalance = RefundDetailService.me.getAvailableBalance(prepayCustomer.getCustomerId(), prepayCustomer.getSurplus()); + BigDecimal maximumConfiguration=availableBalance.divide(new BigDecimal(unit_price),2,BigDecimal.ROUND_HALF_UP); + result.put("maximumConfiguration",maximumConfiguration); + } + return result; + } + } From 0935c05b84d0813c5c50b0f4e8dbaac6946eae02 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sun, 28 Mar 2021 23:27:01 +0800 Subject: [PATCH 29/50] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E5=8D=95=E7=BC=96=E5=8F=B7=E9=AA=8C=E8=AF=81=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receive/InvoiceReceiveService.java | 21 ++++++++++--------- .../ssjygl/ticket/log/TicketLogService.java | 7 +++++++ .../ticket/receive/TicketReceiveService.java | 16 +++++++------- .../invoice/log/InvoiceLogSyncService.java | 4 ++-- .../order/ordertemp/OrderTempSyncService.java | 16 +++++++------- .../ticket/log/TicketLogSyncService.java | 4 ++-- .../InvoiceInvalidVerifySyncService.java | 4 ++-- .../invoice/log/InvoiceLogSyncService.java | 4 ++-- .../TicketInvalidVerifySyncService.java | 4 ++-- .../ticket/log/TicketLogSyncService.java | 4 ++-- 10 files changed, 46 insertions(+), 38 deletions(-) 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 f101d27..e289ec5 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 @@ -40,13 +40,13 @@ public class InvoiceReceiveService extends BaseService { return null; } - Integer code = Integer.parseInt(invoice_code); + Long code = Long.parseLong(invoice_code); String sql = "select * from invoice_receive t\n" + " where t.supermarket_id = ? \n" + " and t.surplus > 0 \n" + " and t.invoice_number = ? \n" + - " and cast(t.start_code as unsigned integer) <= ? \n" + - " and cast(t.end_code as unsigned integer) >= ? \n" + + " and cast(t.start_code as unsigned) <= ? \n" + + " and cast(t.end_code as unsigned) >= ? \n" + " limit 1"; InvoiceReceive receive = InvoiceReceive.dao.findFirst(sql, supermarket_id, invoice_number, code, code); @@ -56,6 +56,7 @@ public class InvoiceReceiveService extends BaseService { /** * 有领用记录,可以是已经被使用完的 + * * @param supermarket_id * @param invoice_number * @param invoice_code @@ -66,12 +67,12 @@ public class InvoiceReceiveService extends BaseService { return null; } - Integer code = Integer.parseInt(invoice_code); + Long code = Long.parseLong(invoice_code); String sql = "select * from invoice_receive t\n" + " where t.supermarket_id = ? \n" + " and t.invoice_number = ? \n" + - " and cast(t.start_code as unsigned integer) <= ? \n" + - " and cast(t.end_code as unsigned integer) >= ? \n" + + " and cast(t.start_code as unsigned) <= ? \n" + + " and cast(t.end_code as unsigned) >= ? \n" + " limit 1"; InvoiceReceive receive = InvoiceReceive.dao.findFirst(sql, supermarket_id, invoice_number, code, code); @@ -90,7 +91,7 @@ public class InvoiceReceiveService extends BaseService { return null; } - String next_invoice_code = String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1); + String next_invoice_code = String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1); // 按领用 id 找到所有作废的发票 List invoiceLogs = InvoiceLog.dao.find( @@ -114,7 +115,7 @@ public class InvoiceReceiveService extends BaseService { return null; } - String next_next_invoice_code = String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(next_invoice_code) + 1); + String next_next_invoice_code = String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(next_invoice_code) + 1); return getValidInvoiceCode(receive, next_next_invoice_code, invoiceLogs); } @@ -125,7 +126,7 @@ public class InvoiceReceiveService extends BaseService { private String getValidInvoiceCode(String invoice_number, String next_invoice_code, Map map) { if (map.containsKey(invoice_number + "_" + next_invoice_code)) { // 说明下一个发票号码已经作废,需要继续顺延 - return getValidInvoiceCode(invoice_number, String.format("%0" + next_invoice_code.length() + "d", Integer.parseInt(next_invoice_code) + 1), map); + return getValidInvoiceCode(invoice_number, String.format("%0" + next_invoice_code.length() + "d", Long.parseLong(next_invoice_code) + 1), map); } else { return next_invoice_code; } @@ -142,7 +143,7 @@ public class InvoiceReceiveService extends BaseService { String sql = "select * from invoice_receive t\n" + " where t.supermarket_id = ? \n" + " and t.surplus > 0\n" + - " order by cast(t.start_code as unsigned integer) asc"; + " order by cast(t.start_code as unsigned) asc"; List receives = InvoiceReceive.dao.find(sql, supermarket_id); 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 index 132f4cf..621a40c 100644 --- 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 @@ -26,6 +26,13 @@ import java.util.List; public class TicketLogService extends BaseService { public static final TicketLogService me = new TicketLogService(); + public TicketLog checkUseTicketLog(String ticket_code) { + return TicketLog.dao.findFirst( + "select * from ticket_log t where t.ticket_code = ?", + ticket_code + ); + } + public TicketLog checkInvalidTicketLog(String ticket_code) { return TicketLog.dao.findFirst( "select * from ticket_log t where t.state = ? and t.ticket_code = ?", 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 index 5d88277..386fdab 100644 --- 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 @@ -38,13 +38,13 @@ public class TicketReceiveService extends BaseService { return null; } - Integer code = Integer.parseInt(ticket_code); + Long code = Long.parseLong(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" + + " and cast(t.start_code as unsigned) <= ? \n" + + " and cast(t.end_code as unsigned) >= ? \n" + " limit 1"; TicketReceive receive = TicketReceive.dao.findFirst(sql, supermarket_id, code, code); @@ -56,11 +56,11 @@ public class TicketReceiveService extends BaseService { return null; } - Integer code = Integer.parseInt(ticket_code); + Long code = Long.parseLong(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" + + " and cast(t.start_code as unsigned) <= ? \n" + + " and cast(t.end_code as unsigned) >= ? \n" + " limit 1"; TicketReceive receive = TicketReceive.dao.findFirst(sql, supermarket_id, code, code); @@ -70,7 +70,7 @@ public class TicketReceiveService extends BaseService { 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); + return getValidTicketCode(String.format("%0" + next_ticket_code.length() + "d", Long.parseLong(next_ticket_code) + 1), map); } else { return next_ticket_code; } @@ -88,7 +88,7 @@ public class TicketReceiveService extends BaseService { 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"; + " order by cast(t.start_code as unsigned) asc"; List receives = TicketReceive.dao.find(sql, supermarket_id); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java index 24ebf0e..89d8dc7 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java @@ -70,9 +70,9 @@ public class InvoiceLogSyncService extends BaseSyncService { receive.setCurrentCode(receive.getEndCode()); } else { if (code.equals(receive.getStartCode())) { // 作废第一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (code.equals(receive.getCurrentCode())) { // 作废顺延的下一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java index f421faf..96de0ad 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -125,9 +125,9 @@ public class OrderTempSyncService { return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用"); } - TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code); + TicketLog ticketLog = TicketLogService.me.checkUseTicketLog(ticket_code); if (ticketLog != null) { - return Result.failedstr("结算单 %s 已作废", ticket_code); + return Result.failedstr("结算单 %s 已使用", ticket_code); } ticketReceive.setSurplus(ticketReceive.getSurplus() - 1); @@ -397,9 +397,9 @@ public class OrderTempSyncService { return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用"); } - TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code); + TicketLog ticketLog = TicketLogService.me.checkUseTicketLog(ticket_code); if (ticketLog != null) { - return Result.failedstr("结算单 %s 已作废", ticket_code); + return Result.failedstr("结算单 %s 已使用", ticket_code); } ticketReceive.setSurplus(ticketReceive.getSurplus() - 1); @@ -766,9 +766,9 @@ public class OrderTempSyncService { return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用"); } - TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code); + TicketLog ticketLog = TicketLogService.me.checkUseTicketLog(ticket_code); if (ticketLog != null) { - return Result.failedstr("结算单 %s 已作废", ticket_code); + return Result.failedstr("结算单 %s 已使用", ticket_code); } ticketReceive.setSurplus(ticketReceive.getSurplus() - 1); @@ -1188,9 +1188,9 @@ public class OrderTempSyncService { return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用"); } - TicketLog ticketLog = TicketLogService.me.checkInvalidTicketLog(ticket_code); + TicketLog ticketLog = TicketLogService.me.checkUseTicketLog(ticket_code); if (ticketLog != null) { - return Result.failedstr("结算单 %s 已作废", ticket_code); + return Result.failedstr("结算单 %s 已使用", ticket_code); } order.setTicketCode(ticket_code); 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 index f5637e3..5ff5e63 100644 --- 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 @@ -67,9 +67,9 @@ public class TicketLogSyncService extends BaseSyncService { 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)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (ticket_code.equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifySyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifySyncService.java index 43e0ace..13beed5 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifySyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifySyncService.java @@ -78,9 +78,9 @@ public class InvoiceInvalidVerifySyncService { receive.setCurrentCode(receive.getEndCode()); } else { if (model.getInvoiceCode().equals(receive.getStartCode())) { // 作废第一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (model.getInvoiceCode().equals(receive.getCurrentCode())) { // 作废顺延的下一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java index 68663b2..6222f07 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/log/InvoiceLogSyncService.java @@ -207,9 +207,9 @@ public class InvoiceLogSyncService extends BaseSyncService { receive.setCurrentCode(receive.getEndCode()); } else { if (code.equals(receive.getStartCode())) { // 作废第一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getStartCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (code.equals(receive.getCurrentCode())) { // 作废顺延的下一张发票 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } 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 index bb6446a..7fd7981 100644 --- 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 @@ -78,9 +78,9 @@ public class TicketInvalidVerifySyncService { 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)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (model.getTicketCode().equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } 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 index 2ce2980..016d22e 100644 --- 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 @@ -76,9 +76,9 @@ public class TicketLogSyncService extends BaseSyncService { 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)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getStartCode()) + 1)); } else if (ticket_code.equals(receive.getCurrentCode())) { // 作废顺延的下一张结算单 - receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Long.parseLong(receive.getCurrentCode()) + 1)); } else { // 其他情况下不更新 current_code } From 4788a2fae0184ded37a5aeb252d01e5c900fef36 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Mon, 29 Mar 2021 21:42:03 +0800 Subject: [PATCH 30/50] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=BD=AC=E7=BB=93?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E8=BD=AC=E7=BB=93=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=9A=84=E5=8D=95=E4=BB=B7=E8=BD=AC=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jobs/CheckUndonOrderclusterJob.java | 2 +- .../ordercluster/OrderclusterSyncService.java | 42 ++++++++++--------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java index 0681309..2297859 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java @@ -154,7 +154,7 @@ public class CheckUndonOrderclusterJob implements Job { } } - log.debug("自动转结完成, %s"); + log.debug("自动转结完成"); } else { log.debug("无未完成的订单"); } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 2b77638..d53fb87 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -723,26 +723,10 @@ public class OrderclusterSyncService extends BaseSyncService { BigDecimal ofsset_weight = model.getTotalWeight().subtract(oldobj.getTotalWeight()); // 本次修改增加的重量 BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 - - // 线上调试 - log.debug("已完成:%s", overweight); - log.debug("旧配额:%s", oldobj.getTotalWeight()); - log.debug("本调整:%s", ofsset_weight); - log.debug("本调整总价:%s", offset_total_price); - log.debug("客户未完总价:%s", undo_price); - log.debug("调整后总价:%s", plan_total_price); } else { // 修改后比原来的小 BigDecimal ofsset_weight = oldobj.getTotalWeight().subtract(model.getTotalWeight()); // 本次修改增加的重量 BigDecimal offset_total_price = ofsset_weight.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 - - // 线上调试 - log.debug("已完成:%s", overweight); - log.debug("旧配额:%s", oldobj.getTotalWeight()); - log.debug("本调整:%s", ofsset_weight); - log.debug("本调整总价:%s", offset_total_price); - log.debug("客户未完总价:%s", undo_price); - log.debug("调整后总价:%s", plan_total_price); } if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { @@ -951,6 +935,12 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed("不是预付费用户"); } + // 当前配额指定的客户、超市、品类对应的单价 + BigDecimal unitprice = CustomerSupermarketProductService.me.getUnitPrice(oldobj.getCustomerId(), oldobj.getSupermarketId(), oldobj.getProductId()); + if (unitprice == null) { + return Result.failed("未配置商品单价"); + } + // 按客户统计已完成量 BigDecimal over_weight = OrderclusterService.me.getOverWeight(oldobj.getId()); // 按客户找集团订单已完成量 BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(over_weight); // 剩余未完成量 @@ -971,16 +961,18 @@ public class OrderclusterSyncService extends BaseSyncService { BigDecimal plan_total_price; if (total_weight.compareTo(surplus_weight) > 0) { // 修改后,比原来的大 BigDecimal surplus_weight_1 = total_weight.subtract(surplus_weight); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal offset_total_price = surplus_weight_1.multiply(unitprice); // 本次修改增加的价格 plan_total_price = offset_total_price.add(undo_price); // 剩余未完成金额加上本次增加的金额 } else { // 修改后比原来的小 BigDecimal surplus_weight_1 = surplus_weight.subtract(total_weight); // 本次修改增加的重量 - BigDecimal offset_total_price = surplus_weight_1.multiply(oldobj.getUnitPrice()); // 本次修改增加的价格 + BigDecimal offset_total_price = surplus_weight_1.multiply(unitprice); // 本次修改增加的价格 plan_total_price = undo_price.subtract(offset_total_price); // 剩余未完成金额加上本次增加的金额 } - if (plan_total_price.compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("共计总配额达 %.2f元,客户余额(%.2f元)不足", plan_total_price, prepayCustomer.getSurplus()); + BigDecimal availableBalance = RefundDetailService.me.getAvailableBalance(prepayCustomer.getCustomerId(), prepayCustomer.getSurplus()); + + if (plan_total_price.compareTo(availableBalance) > 0) { + return Result.failedstr("共计总配额达 %.2f元,客户可用余额(%.2f元)不足", plan_total_price, availableBalance); } List octs = OrderclusterTruck.dao.find("select * from ordercluster_truck t where t.ordercluster_id = ?", ordercluster_id); @@ -1053,6 +1045,7 @@ public class OrderclusterSyncService extends BaseSyncService { forwardoldobj[0] = oldobj.clone(); forwardoldobj[0].setId(null); // 等待数据库自增长 forwardoldobj[0].setUuid(StrKit.getRandomUUID()); + forwardoldobj[0].setUnitPrice(unitprice); // 用最新的单价更新 forwardoldobj[0].setTotalWeight(total_weight); forwardoldobj[0].setCutoffTime(cutoff_time); forwardoldobj[0].setCreateTime(now); // 当前系统时间 @@ -1065,6 +1058,7 @@ public class OrderclusterSyncService extends BaseSyncService { } else { // 已有的,直接更新重量 forwardoldobj[0].setTotalWeight(forwardoldobj[0].getTotalWeight().add(total_weight)); + forwardoldobj[0].setUnitPrice(unitprice); // 用最新的单价更新 ret = forwardoldobj[0].update(); synctask.addUpdateData(forwardoldobj[0]); @@ -1143,6 +1137,12 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed("已经完结或者取消的,不能再修改"); } + // 当前配额指定的客户、超市、品类对应的单价 + BigDecimal unitprice = CustomerSupermarketProductService.me.getUnitPrice(oldobj.getCustomerId(), oldobj.getSupermarketId(), oldobj.getProductId()); + if (unitprice == null) { + return Result.failed("未配置商品单价"); + } + // 按客户统计已完成量 BigDecimal over_weight = OrderclusterService.me.getOverWeight(oldobj.getId()); // 按客户找集团订单已完成量 BigDecimal surplus_weight = oldobj.getTotalWeight().subtract(over_weight); // 剩余未完成量 @@ -1247,6 +1247,7 @@ public class OrderclusterSyncService extends BaseSyncService { forwardoldobj = oldobj.clone(); forwardoldobj.setId(null); // 等待数据库自增长 forwardoldobj.setUuid(StrKit.getRandomUUID()); + forwardoldobj.setUnitPrice(unitprice); forwardoldobj.setTotalWeight(total_weight); forwardoldobj.setCutoffTime(cutoff_time); forwardoldobj.setCreateTime(now); // 当前系统时间 @@ -1259,6 +1260,7 @@ public class OrderclusterSyncService extends BaseSyncService { } else { // 已有的,直接更新重量 forwardoldobj.setTotalWeight(forwardoldobj.getTotalWeight().add(total_weight)); + forwardoldobj.setUnitPrice(unitprice); ret = forwardoldobj.update(); synctask.addUpdateData(forwardoldobj); From 43a6c8d5b15f9f117741931aa9e9385641b583b1 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Tue, 30 Mar 2021 19:41:53 +0800 Subject: [PATCH 31/50] =?UTF-8?q?=E7=A0=82=E7=AB=99=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E9=87=8F=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/customer/CustomerController.java | 6 +++++ .../InvoiceInvalidVerifyController.java | 3 ++- .../service/ssjygl/main/AuthInterceptor.java | 3 +++ .../ordercluster/OrderclusterSyncService.java | 4 ++-- .../refunddetail/RefundDetailSyncService.java | 22 ++++++++++++++++++- .../ssjygl/stat/sale/OrderStatController.java | 18 +++++++++++++++ 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java index 71f6030..88388dc 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java @@ -8,6 +8,7 @@ import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService; import com.cowr.ssjygl.customer.CustomerPKValidator; import com.cowr.ssjygl.customer.CustomerService; import com.cowr.ssjygl.customer.CustomerValidator; +import com.cowr.ssjygl.prepay.refunddetail.RefundDetailService; import com.jfinal.aop.Before; import com.jfinal.core.Controller; @@ -145,4 +146,9 @@ public class CustomerController extends Controller { public void list() { renderJson(Result.object(CustomerService.me.list())); } + + public void getCustomerAccountBalance(){ + Integer customer_id = getInt("customer_id"); + renderJson(RefundDetailService.me.getCustomerAccountBalance(customer_id)); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifyController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifyController.java index 71c38d4..031fecd 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifyController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/invoice/invalidverify/InvoiceInvalidVerifyController.java @@ -1,5 +1,6 @@ package com.cowr.service.ssjygl.invoice.invalidverify; +import com.cowr.common.enums.RoleEnum; import com.cowr.common.view.PageParam; import com.cowr.common.view.Result; import com.cowr.model.Sysuser; @@ -36,7 +37,7 @@ public class InvoiceInvalidVerifyController extends Controller { if (tokenuser == null) { renderJson(Result.noauth()); return; - } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能审核 + } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())&&!SysuserSyncService.me.isPresident(tokenuser.getRole())) { // 财务/结算中心才能审核 renderJson(Result.permissionDenied()); return; } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java index 814f24b..455dd41 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java @@ -48,9 +48,12 @@ public class AuthInterceptor implements Interceptor { add("/customer/get"); add("/customer/edit"); + add("/customer/getCustomerAccountBalance"); add("/sysuser/edit"); add("/sysuser/modpwd"); + add("/sysuser/modpwd"); + }}); } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 2b77638..180f5be 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -1320,8 +1320,8 @@ public class OrderclusterSyncService extends BaseSyncService { public Map getMaximumConfiguration( int customer_id,String unit_price){ Map result=new HashMap(); Integer count = Db.queryInt("select count(distinct s.name) from ordercluster t \n" + - " left join supermarket s on s.id = t.supermarket_id \n" + - " where t.customer_id =?", customer_id); + " join supermarket s on s.id = t.supermarket_id \n" + + " where t.state<5 and t.customer_id =?", customer_id); result.put("count",count); //当前用户如果只在一个沙场里面买沙,就计算最大可购买重量 if(count<=1){ diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java index 46b4600..d24f180 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java @@ -6,19 +6,23 @@ import com.cowr.common.enums.Enums; import com.cowr.common.view.Result; import com.cowr.model.*; import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.order.ordercluster.OrderclusterSyncService; import com.cowr.service.ssjygl.sms.log.SmsService; import com.cowr.service.ssjygl.synctask.SyncTaskService; import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService; import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.order.ordercluster.OrderclusterService; import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; 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.math.BigDecimal; import java.sql.SQLException; import java.util.Date; +import java.util.List; public class RefundDetailSyncService extends BaseSyncService { public static RefundDetailSyncService me = new RefundDetailSyncService(); @@ -32,7 +36,8 @@ public class RefundDetailSyncService extends BaseSyncService { if (customer == null) { return Result.failed("按客户 id 未找到对应客户信息"); } - + //取消订单 + cancelOrder( customer_id, user); PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId()); if (prepayCustomer == null) { @@ -95,6 +100,21 @@ public class RefundDetailSyncService extends BaseSyncService { } } + /** + * 取消订单 + * @param customer_id + */ + public void cancelOrder(Integer customer_id,Sysuser user){ + List recordList = OrderclusterService.me.getUncompletedOrdersFromUsers(customer_id); + if (recordList!=null && !recordList.isEmpty()) { + for (Record record : recordList) { + Integer id = record.getInt("id"); + OrderclusterSyncService.me.complete(id, user); + } + } + + } + /** * 审核退费记录 * 审核通过后,才由财务退款,财务退款后,才更新客户余额 diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java index b13cdba..5fc837a 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java @@ -12,8 +12,11 @@ import com.cowr.model.Sysuser; import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService; import com.cowr.ssjygl.stat.sale.OrderStatService; import com.jfinal.aop.Before; +import com.jfinal.plugin.activerecord.Record; import org.apache.poi.ss.usermodel.Workbook; +import java.util.List; + public class OrderStatController extends BaseController { /** @@ -391,4 +394,19 @@ public class OrderStatController extends BaseController { render(new ExcelRender("按砂站总销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); } } + + /** + * 各砂站运输量统计表 + */ + public void trafficStatisticsOfEachSandStation(){ + String stm=get("stm"); + String etm=get("etm"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + if (export == 0) { + renderJson(Result.object(OrderStatService.me.trafficStatisticsOfEachSandStation(stm, etm))); + }else { + Workbook wb = OrderStatService.me.trafficStatisticsOfEachSandStationExport(stm, etm); + render(new ExcelRender("各砂站运输量统计表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } } From 50f196d49cea61c2a3029d2f31149a06580be1d4 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Tue, 30 Mar 2021 21:52:40 +0800 Subject: [PATCH 32/50] =?UTF-8?q?=E7=A0=82=E7=AB=99=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E9=87=8F=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/ssjygl/stat/sale/OrderStatService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java index 34d123d..1576ba6 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java @@ -1991,7 +1991,7 @@ public class OrderStatService { "FROM\n" + "(\n" + "SELECT\n" + - "t.customer_id,\n" + + "t.sn,t.customer_id,\n" + "t.customer_name,\n" + "t.weight,\n" + "t.total_price,\n" + @@ -2005,7 +2005,7 @@ public class OrderStatService { "AND t.create_time <=? \n" + "AND t.isprepaid = 1 UNION\n" + "SELECT\n" + - "t.customer_id,\n" + + "t.sn,t.customer_id,\n" + "t.customer_name,\n" + "t.weight,\n" + "t.total_price,\n" + @@ -2068,7 +2068,7 @@ public class OrderStatService { "FROM\n" + "(\n" + "SELECT\n" + - "t.supermarket_id AS id,\n" + + "t.sn,t.supermarket_id AS id,\n" + "t.customer_id,\n" + "t.customer_name,\n" + "t.weight,\n" + @@ -2083,7 +2083,7 @@ public class OrderStatService { "AND t.create_time <=? \n" + "AND t.isprepaid = 1 UNION\n" + "SELECT\n" + - "t.supermarket_id AS id,\n" + + "t.sn,t.supermarket_id AS id,\n" + "t.customer_id,\n" + "t.customer_name,\n" + "t.weight,\n" + @@ -2120,7 +2120,7 @@ public class OrderStatService { "FROM\n" + "(\n" + "SELECT\n" + - "t.weight,\n" + + "t.sn,t.weight,\n" + "t.total_price,\n" + "t.product_id\n" + "FROM\n" + @@ -2131,7 +2131,7 @@ public class OrderStatService { "AND t.create_time <=?\n" + "AND t.isprepaid = 0 UNION\n" + "SELECT\n" + - "t.weight,\n" + + "t.sn,t.weight,\n" + "t.total_price,\n" + "t.product_id\n" + "FROM\n" + @@ -2177,7 +2177,7 @@ public class OrderStatService { "( SELECT id, NAME FROM supermarket ) m join \n" + "(\n" + "SELECT\n" + - "t.supermarket_id AS id,\n" + + "t.sn,t.supermarket_id AS id,\n" + "t.weight,\n" + "t.total_price FROM\n" + "order_sale t \n" + @@ -2187,7 +2187,7 @@ public class OrderStatService { "AND t.create_time <=? \n" + "AND t.isprepaid = 0 UNION\n" + "SELECT\n" + - "t.supermarket_id AS id,\n" + + "t.sn,t.supermarket_id AS id,\n" + "t.weight,\n" + "t.total_price\n" + "FROM\n" + From 63b3aa02ab6eba9471fa3305ea1a979d97189932 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Thu, 15 Apr 2021 11:49:51 +0800 Subject: [PATCH 33/50] =?UTF-8?q?=E7=A0=82=E7=AB=99=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E9=87=8F=E7=BB=9F=E8=AE=A1=E6=B7=BB=E5=8A=A0=E5=8F=91=E7=A5=A8?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cowr/service/ssjygl/prepay/PrepayController.java | 6 ++++-- .../cowr/service/ssjygl/stat/sale/OrderStatController.java | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/PrepayController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/PrepayController.java index 15c8731..fff1d20 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/PrepayController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/PrepayController.java @@ -52,14 +52,16 @@ public class PrepayController extends BaseController { } Integer supermarket_id = getInt("supermarket_id"); + Integer invoice_type = getInt("invoice_type"); + String stm = get("stm"); String etm = get("etm"); String truck_license = get("truck_license"); if (export == 0) { - renderJson(Result.success(PrepayService.me.consumption(customer_id, supermarket_id, stm, etm, truck_license))); + renderJson(Result.success(PrepayService.me.consumption(customer_id, supermarket_id, stm, etm, truck_license,invoice_type))); } else { - Workbook wb = PrepayService.me.consumptionExport(customer_id, supermarket_id, stm, etm, truck_license); + Workbook wb = PrepayService.me.consumptionExport(customer_id, supermarket_id, stm, etm, truck_license,invoice_type); render(new ExcelRender("消费记录_" + System.currentTimeMillis() + ".xlsx", wb)); } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java index 5fc837a..f01a329 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java @@ -401,11 +401,12 @@ public class OrderStatController extends BaseController { public void trafficStatisticsOfEachSandStation(){ String stm=get("stm"); String etm=get("etm"); + Integer invoice_type=getInt("invoice_type"); int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 if (export == 0) { - renderJson(Result.object(OrderStatService.me.trafficStatisticsOfEachSandStation(stm, etm))); + renderJson(Result.object(OrderStatService.me.trafficStatisticsOfEachSandStation(stm, etm,invoice_type))); }else { - Workbook wb = OrderStatService.me.trafficStatisticsOfEachSandStationExport(stm, etm); + Workbook wb = OrderStatService.me.trafficStatisticsOfEachSandStationExport(stm, etm,invoice_type); render(new ExcelRender("各砂站运输量统计表_" + System.currentTimeMillis() + ".xlsx", wb)); } } From 9fef03457b5fdc8426e3da2f059876a0f1f54be1 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 16 Apr 2021 10:25:31 +0800 Subject: [PATCH 34/50] =?UTF-8?q?=E5=90=88=E5=B9=B6master=E5=88=B0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cowr/local/ssjygl/main/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ba5eb73..2f78597 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 @@ -106,7 +106,7 @@ public class Config extends JFinalConfig { public static DeviceThread deviceThread = new DeviceThread(); public static SocketIOService socketio = null; private static boolean client_run = true; - public static final String CLINET_VERSION = "20210301"; + public static final String CLINET_VERSION = "20210415"; public static String getRootPath() { return PathKit.getWebRootPath() From 6baaaa0a233d287090010d73e9c57fa8ea902006 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Mon, 19 Apr 2021 14:12:22 +0800 Subject: [PATCH 35/50] =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=80=E9=AB=98=E8=BF=90=E8=BE=93=E8=BD=A6?= =?UTF-8?q?=E8=BE=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cowr/model/base/BaseOrdercluster.java | 17 +++++++++++++++++ .../ordercluster/OrderclusterSyncService.java | 11 +++++++++++ 2 files changed, 28 insertions(+) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java index 7cda88f..943e9bb 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java @@ -955,6 +955,7 @@ public abstract class BaseOrdercluster> extends Ba } + /** * @return mini_truck 最少指派的车辆数 */ @@ -963,5 +964,21 @@ public abstract class BaseOrdercluster> extends Ba return getInt("mini_truck"); } + /** + * + * @param maxTruck 最高指派的车辆数 + */ + @JSONField(name = "max_truck") + public void setMaxTruck(Integer maxTruck) { + set("max_truck", maxTruck); + } + /** + * + * @return 最高指派车辆数 + */ + @JSONField(name = "max_truck") + public Integer getMaxTruck() { + return getInt("max_truck"); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index bdd6533..a28627c 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -84,6 +84,7 @@ public class OrderclusterSyncService extends BaseSyncService { int supermarket_id = obj.getIntValue("supermarket_id"); int time_interval = obj.getIntValue("time_interval"); int mini_truck = obj.getIntValue("mini_truck"); + int max_truck = obj.getIntValue("max_truck"); double total_weight = obj.getDouble("total_weight"); Supermarket supermarket = SvrCacheData.SUP_CACHE.get(supermarket_id); @@ -110,6 +111,12 @@ public class OrderclusterSyncService extends BaseSyncService { if (mini_truck < 1) { return Result.failed("最低运输车辆数错误"); } + if(max_truck<1){ + return Result.failed("最高运输车辆数错误"); + } + if(mini_truck>max_truck){ + return Result.failed("最低运输车辆不能超过最高运输车辆数错误"); + } if (total_weight == 0) { log.debug("重量为 0 的砂站(id:%s)跳过", supermarket_id); @@ -154,6 +161,7 @@ public class OrderclusterSyncService extends BaseSyncService { model.setSupermarketId(supermarket_id); model.setTimeInterval(time_interval); model.setMiniTruck(mini_truck); + model.setMaxTruck(max_truck); model.setProductId(product.getId()); model.setProductName(product.getName()); @@ -747,6 +755,9 @@ public class OrderclusterSyncService extends BaseSyncService { if (model.getMiniTruck() != null) { oldobj.setMiniTruck(model.getMiniTruck()); } + if (model.getMaxTruck() != null) { + oldobj.setMaxTruck(model.getMaxTruck()); + } SyncTask synctask = new SyncTask(); From 0f448353c287354aa95c88b637e94e595c2c4583 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Mon, 19 Apr 2021 17:09:29 +0800 Subject: [PATCH 36/50] =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=8F=AF=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E9=87=8D=E9=87=8F=E5=90=91=E4=B8=8B=E5=8F=96=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/order/ordercluster/OrderclusterSyncService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index a28627c..8d644df 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -1340,7 +1340,7 @@ public class OrderclusterSyncService extends BaseSyncService { if(count<=1){ PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer_id); BigDecimal availableBalance = RefundDetailService.me.getAvailableBalance(prepayCustomer.getCustomerId(), prepayCustomer.getSurplus()); - BigDecimal maximumConfiguration=availableBalance.divide(new BigDecimal(unit_price),2,BigDecimal.ROUND_HALF_UP); + BigDecimal maximumConfiguration=availableBalance.divide(new BigDecimal(unit_price),2,BigDecimal.ROUND_DOWN); result.put("maximumConfiguration",maximumConfiguration); } return result; From 8ee8aa61a7af5319ed9b7278746a93a930f3fcf3 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sat, 24 Apr 2021 15:35:27 +0800 Subject: [PATCH 37/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cowr/service/ssjygl/synctask/SyncTaskService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java index 7fd1cff..3c647f6 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -565,6 +565,11 @@ public class SyncTaskService { synctask.setCreateTime(now); synctask.setJson(); + // 这里好像存在一个奇怪的bug + if (!StrKit.notBlank(synctask.getSaveData(), synctask.getDeleteData())) { + continue; + } + sts.add(synctask); } From 576af2c44afaac5a0435b62d72b1ac09a0ce6f6b Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Wed, 28 Apr 2021 10:40:34 +0800 Subject: [PATCH 38/50] =?UTF-8?q?=E9=80=90=E6=97=A5=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E8=A1=A8=E6=B7=BB=E5=8A=A0=E7=A0=82=E7=AB=99=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/stat/sale/OrderStatService.java | 21 +++++++++++++++---- .../ssjygl/stat/sale/OrderStatController.java | 5 +++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java index cbe3500..6e4f4b6 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java @@ -859,23 +859,36 @@ public class OrderStatService { * @param tm YYYY-MM * @return */ - public List mdstat(String tm) { + public List mdstat(String tm,Integer supermarket_id) { + String paramsSql=""; + if(supermarket_id!=null){ + paramsSql="and t.supermarket_id = ? \n"; + } + String sql = "select date_format(t.create_time, '%Y-%m-%d') as date, sum(t.weight) as weight, sum(t.total_price) as totalPrice\n" + "from (\n" + " select t.create_time, t.weight, t.paid, t.total_price\n" + " from order_sale t\n" + " where t.state = ? \n" + + paramsSql+ " and t.create_time like ? \n" + " union all\n" + " select t.create_time, t.weight, t.paid, t.total_price\n" + " from order_temp t\n" + " where t.state = ? \n" + + paramsSql+ " and t.create_time like ? \n" + ") t\n" + "group by date_format(t.create_time, '%Y-%m-%d')\n" + "order by date_format(t.create_time, '%Y-%m-%d')"; + List dblist; + if(supermarket_id!=null){ + dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(),supermarket_id, tm + "%", OrderStateEnum.RECEIVED.getStateid(),supermarket_id, tm + "%"); - List dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), tm + "%", OrderStateEnum.RECEIVED.getStateid(), tm + "%"); + }else { + dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), tm + "%", OrderStateEnum.RECEIVED.getStateid(), tm + "%"); + + } Record total = new Record(); total.set("date", null); @@ -913,8 +926,8 @@ public class OrderStatService { * @param tm YYYY-MM * @return */ - public Workbook mdstatExport(String tm) { - List list = mdstat(tm); + public Workbook mdstatExport(String tm,Integer supermarket_id) { + List list = mdstat(tm,supermarket_id); Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("销售月逐日统计"); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java index f01a329..6667a22 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/stat/sale/OrderStatController.java @@ -178,12 +178,13 @@ public class OrderStatController extends BaseController { @Before(MonthValidator.class) public void mdstat() { String tm = get("tm"); + Integer supermarket_id=getInt("supermarket_id"); int export = getInt("export", 0); if (export == 0) { - renderJson(Result.object(OrderStatService.me.mdstat(tm))); + renderJson(Result.object(OrderStatService.me.mdstat(tm,supermarket_id))); } else { - Workbook wb = OrderStatService.me.mdstatExport(tm); + Workbook wb = OrderStatService.me.mdstatExport(tm,supermarket_id); render(new ExcelRender(tm + "_销售月逐日统计_" + System.currentTimeMillis() + ".xlsx", wb)); } } From 3d459f369cd724f7a50bc22962264fb8e698a139 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Thu, 29 Apr 2021 09:16:46 +0800 Subject: [PATCH 39/50] =?UTF-8?q?=E9=80=90=E6=97=A5=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E8=A1=A8=E6=B7=BB=E5=8A=A0=E7=A0=82=E7=AB=99=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/local/ssjygl/stat/sale/OrderStatController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/stat/sale/OrderStatController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/stat/sale/OrderStatController.java index c5aa479..5b4aed0 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/stat/sale/OrderStatController.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/stat/sale/OrderStatController.java @@ -151,11 +151,11 @@ public class OrderStatController extends BaseController { public void mdstat() { String tm = get("tm"); int export = getInt("export", 0); - + Integer supermarket_id=getInt("supermarket_id"); if (export == 0) { - renderJson(Result.object(OrderStatService.me.mdstat(tm))); + renderJson(Result.object(OrderStatService.me.mdstat(tm,supermarket_id))); } else { - Workbook wb = OrderStatService.me.mdstatExport(tm); + Workbook wb = OrderStatService.me.mdstatExport(tm,supermarket_id); render(new ExcelRender(tm + "_销售月逐日统计_" + System.currentTimeMillis() + ".xlsx", wb)); } } From 997c0ef65b474b535e7473e3acc14b9136fb0d0b Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 30 Apr 2021 11:35:11 +0800 Subject: [PATCH 40/50] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E6=97=B6=E9=97=B4=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/service/ssjygl/jobs/StatSmsJob.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/StatSmsJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/StatSmsJob.java index 4a32144..4e86266 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/StatSmsJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/StatSmsJob.java @@ -7,7 +7,6 @@ import com.cowr.model.PrepayCustomer; import com.cowr.service.ssjygl.main.Config; import com.cowr.service.ssjygl.main.SvrCacheData; import com.cowr.service.ssjygl.sms.log.SmsService; -import com.cowr.sms.AliyunSmsService; import com.jfinal.kit.StrKit; import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.Db; @@ -202,6 +201,7 @@ public class StatSmsJob implements Job { c.add(Calendar.DAY_OF_MONTH, -1); String predaytm = DateTimeUtil.sdf.get().format(c.getTime()); // 前一日 + String daytm = DateTimeUtil.sdf.get().format(now); // 当日 String sendtmtext = DateTimeUtil.sdfymd.get().format(c.getTime()); String year_start = DateTimeUtil.year_start.get().format(now); @@ -211,6 +211,7 @@ public class StatSmsJob implements Job { String ordersql = "select count(t.sn) aggr_cnt, ifnull(sum(t.weight), 0) aggr_weight, ifnull(sum(t.total_price), 0) aggr_price \n" + " from order_temp t \n" + " where t.create_time >= ? \n" + + " and t.create_time < ? \n" + " and t.state = 5"; String cusmersql = "select ifnull(sum(t.surplus), 0) customer_total_surplus from prepay_customer t"; String daysql = "select count(t.sn) total_cnt, ifnull(sum(t.weight), 0) total_weight, ifnull(sum(t.total_price), 0) total_price from order_temp t\n" + @@ -218,16 +219,17 @@ public class StatSmsJob implements Job { " and t.create_time like '" + predaytm + "%'"; String revenuesql = "select ifnull(sum(t.weight), 0) weight, ifnull(sum(total_price), 0) total_price from order_temp t\n" + - "where t.state = 5\n" + - "and (t.customer_id = 17\n" + - "or t.customer_id = 24\n" + - "or t.customer_id = 60\n" + - "or t.customer_id = 61)\n" + - "and t.create_time >= ? "; + " where t.state = 5\n" + + " and (t.customer_id = 17\n" + + " or t.customer_id = 24\n" + + " or t.customer_id = 60\n" + + " or t.customer_id = 61)\n" + + " and t.create_time >= ? \n" + + " and t.create_time < ?"; JSONObject obj = new JSONObject(); - Record orderobj = Db.findFirst(ordersql, year_start); - Record revenueobj = Db.findFirst(revenuesql, year_start); + Record orderobj = Db.findFirst(ordersql, year_start, daytm); + Record revenueobj = Db.findFirst(revenuesql, year_start, daytm); Record allorderobj = Db.findFirst(allordersql); Record customerobj = Db.findFirst(cusmersql); Record dayobj = Db.findFirst(daysql); From aaab329df0b42c8054fd67b57e744e837275df32 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Mon, 10 May 2021 14:43:09 +0800 Subject: [PATCH 41/50] =?UTF-8?q?=E7=BB=93=E7=AE=97=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=B7=BB=E5=8A=A0=E5=8F=96=E6=B6=88=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=94=B3=E8=AF=B7=E7=9A=84=E5=AE=A1=E6=89=B9=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/invalidverify/OrderInvalidVerifyController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/invalidverify/OrderInvalidVerifyController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/invalidverify/OrderInvalidVerifyController.java index 0d98766..4d3716c 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/invalidverify/OrderInvalidVerifyController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/invalidverify/OrderInvalidVerifyController.java @@ -24,7 +24,8 @@ public class OrderInvalidVerifyController extends Controller { if (tokenuser == null) { renderJson(Result.noauth()); return; - } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole())) { // 财务才能审核 + } else if (!SysuserSyncService.me.isTreasurer(tokenuser.getRole()) + && !SysuserSyncService.me.isPresident(tokenuser.getRole())) { // 财务、结算中心才能审核 renderJson(Result.permissionDenied()); return; } From 0387562ee8e2769dd90ab963768409724df54a21 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Mon, 17 May 2021 17:11:14 +0800 Subject: [PATCH 42/50] =?UTF-8?q?=E8=B0=83=E6=95=B4bank=5Faccount=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/cowr/ssjygl/customer/CustomerValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java index 590db76..caf09c9 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java @@ -29,7 +29,7 @@ public class CustomerValidator extends CrudParamValidator { validateString("texpayer_num", 0, 20, "texpayer_num", "texpayer_num 长度 0~20"); validateString("bank_name", 0, 128, "bank_name", "bank_name 长度 0~128"); - validateString("bank_account", 0, 20, "bank_account", "bank_account 长度 0~20"); + validateString("bank_account", 0, 128, "bank_account", "bank_account 长度 0~20"); if (StrKit.notBlank(c.get("invoice_type"))) { validateInteger("invoice_type", 1, 2, "invoice_type", "invoice_type 范围 1~2"); From 86ac3c6f0fa19a9da9372306dfe67f616cd265c6 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Fri, 21 May 2021 12:54:55 +0800 Subject: [PATCH 43/50] =?UTF-8?q?=E5=90=84=E7=A0=82=E7=AB=99=E8=BF=90?= =?UTF-8?q?=E8=BE=93=E9=87=8F=E7=BB=9F=E8=AE=A1=E8=A1=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/stat/sale/OrderStatService.java | 362 ++++-------------- 1 file changed, 72 insertions(+), 290 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java index 6e4f4b6..61106bd 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java @@ -1859,7 +1859,7 @@ public class OrderStatService { Sheet sheet = wb.createSheet(stm.substring(0, 10) + " ~ " + etm.substring(0, 10) + "各砂站运输量统计表"); sheet.setColumnWidth(1,40*256); - for(int i=2;i<28;i++){ + for(int i=2;i<30;i++){ sheet.setColumnWidth(i,15*256); } @@ -1870,15 +1870,13 @@ public class OrderStatService { sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); int num = 4; - for(int i=0;i<12;i++){ + for(int i=0;i<13;i++){ sheet.addMergedRegion(new CellRangeAddress(0,0,num,num+1)); num=num+2; } // 通用单元格格式 Font font = wb.createFont(); CellStyle cellStyle = wb.createCellStyle(); -// font.setFontHeight((short) (10 * 20)); -// font.setFontName("宋体"); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); @@ -1903,11 +1901,12 @@ public class OrderStatService { row.createCell(20).setCellValue("融嘉合计"); row.createCell(22).setCellValue("盐港"); row.createCell(24).setCellValue("永安"); - row.createCell(26).setCellValue("盐港合计"); + row.createCell(26).setCellValue("河东湾"); + row.createCell(28).setCellValue("盐港合计"); row = sheet.createRow(1); num = 4; - for(int i=0;i<12;i++){ + for(int i=0;i<13;i++){ row.createCell(num++).setCellValue("总销售量(吨)"); row.createCell(num++).setCellValue("总销售额(元)"); } @@ -1942,6 +1941,8 @@ public class OrderStatService { row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "yg_xse")); row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "ya_xsl")); row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "ya_xse")); + row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "dhw_xsl")); + row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "dhw_xse")); row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "yghj_xsl")); row.createCell(num++).setCellValue(DataUtil.getDefaultByRecord(sales, "yghj_xse")); } @@ -1951,7 +1952,7 @@ public class OrderStatService { if (row == null) { row = sheet.createRow(r); } - for (int c = 0; c < 28; c++) { + for (int c = 0; c < 30; c++) { Cell cell = row.getCell(c); if (cell == null) { @@ -1967,302 +1968,82 @@ public class OrderStatService { * 各砂站运输量统计表 */ public List trafficStatisticsOfEachSandStation( String stm, String etm,Integer invoice_type){ - List dataList = new ArrayList<>(); - //零散用户统计 - Record scattered=scatteredUsersAreNotClassified(stm,etm,invoice_type); - if(scattered.getBigDecimal("weight").compareTo(new BigDecimal("0"))>0||scattered.getBigDecimal("total_price").compareTo(new BigDecimal("0"))>0){ - Record scatteredSandStation=scatteredUsersClassificationStatistics(stm,etm,invoice_type); - scattered.setColumns(scatteredSandStation); - dataList.add(scattered); - } - //固定用户统计 - List recordList = fixedUserUnclassified(stm,etm,invoice_type); - if(recordList!=null&&!recordList.isEmpty()){ - for (Record record : recordList) { - if(record.getBigDecimal("weight").compareTo(new BigDecimal("0"))>0||record.getBigDecimal("total_price").compareTo(new BigDecimal("0"))>0){ - Integer customer_id=record.getInt("customer_id"); - Record sandStation=fixedUserClassificationStatistics(stm, etm,customer_id,invoice_type); - record.setColumns(sandStation); - } + List dataList = trafficStatistics(stm,etm,invoice_type); + if (dataList!=null&&!dataList.isEmpty()) { + for (Record oldRecord : dataList) { + Record newRecord =total(oldRecord); + oldRecord=newRecord; } } - dataList.addAll(recordList); return dataList; } - /** - * 零散用户 - */ - /** - * 固定用户不分类统计:统计各个固定用户在所有砂站的销量和销售额 - */ - public List fixedUserUnclassified(String stm, String etm,Integer invoice_type){ + + public List trafficStatistics(String stm, String etm,Integer invoice_type){ String paramsSql=""; if(invoice_type!=null){ paramsSql="and t.invoice_type=?\n"; } - String sql="SELECT\n" + - "a.customer_name,\n" + - " a.customer_id,\n" + - "ifnull(sum( a.weight ),0) weight,\n" + - "ifnull(sum( a.total_price ),0) total_price\n" + - "FROM\n" + - "(\n" + - "SELECT\n" + - "t.sn,t.customer_id,\n" + - "t.customer_name,\n" + - "t.weight,\n" + - "t.total_price,\n" + - "t.product_id,\n" + - "t.product_name \n" + - "FROM\n" + - "order_sale t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + + String sql="select\n" + + "\tg.customer_id,\n" + + "\tifnull(c.name, '零散用户') customer_name,\n" + + "\tifnull(sum(g.weight), 0) weight,\n" + + "\tifnull(sum(g.total_price), 0) total_price,\n" + + "\tifnull(sum(case g.supermarket_id when 1 then g.weight end), 0) zw_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 2 then g.weight end), 0) tp_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 3 then g.weight end), 0) sc_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 4 then g.weight end), 0) sb_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 5 then g.weight end), 0) jr_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 6 then g.weight end), 0) yg_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 7 then g.weight end), 0) zwsc_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 8 then g.weight end), 0) ya_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 9 then g.weight end), 0) sl_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 10 then g.weight end), 0) hdw_xsl,\n" + + "\tifnull(sum(case g.supermarket_id when 1 then g.total_price end), 0) zw_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 2 then g.total_price end), 0) tp_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 3 then g.total_price end), 0) sc_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 4 then g.total_price end), 0) sb_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 5 then g.total_price end), 0) jr_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 6 then g.total_price end), 0) yg_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 7 then g.total_price end), 0) zwsc_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 8 then g.total_price end), 0) ya_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 9 then g.total_price end), 0) sl_xse,\n" + + "\tifnull(sum(case g.supermarket_id when 10 then g.total_price end), 0) hdw_xse\n" + + "from (\n" + + "\n" + + "\tselect\n" + + "\t\tifnull(t.customer_id, 0) customer_id,\n" + + "\t\tt.supermarket_id,\n" + + "\t\tifnull(sum(t.weight), 0) weight,\n" + + "\t\tifnull(sum(t.total_price), 0) total_price\n" + + "\tfrom order_sale t\n" + + "\twhere t.state = 5\n" + + "\tand t.create_time>= ?\n" + + "\tand t.create_time<= ?\n" + paramsSql+ - "AND t.isprepaid = 1 UNION\n" + - "SELECT\n" + - "t.sn,t.customer_id,\n" + - "t.customer_name,\n" + - "t.weight,\n" + - "t.total_price,\n" + - "t.product_id,\n" + - "t.product_name \n" + - "FROM\n" + - "order_temp t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + + "\tgroup by t.customer_id, t.supermarket_id\n" + + "\tunion all\n" + + "\tselect\n" + + "\t\tifnull(t.customer_id, 0) customer_id,\n" + + "\t\tt.supermarket_id,\n" + + "\t\tifnull(sum(t.weight), 0) weight,\n" + + "\t\tifnull(sum(t.total_price), 0) total_price\n" + + "\tfrom order_temp t\n" + + "\twhere t.state = 5\n" + + "\tand t.create_time>= ?\n" + + "\tand t.create_time<= ?\n" + paramsSql+ - "AND t.isprepaid = 1 \n" + - ") a\n" + - " JOIN customer c ON c.id = a.customer_id \n" + - "GROUP BY\n" + - "a.customer_id,a.customer_name"; - + "\tgroup by t.customer_id, t.supermarket_id\n" + + ") g\n" + + "left join customer c on c.id = g.customer_id\n" + + "group by g.customer_id"; List recordList; - if(invoice_type!=null){ - recordList = Db.find(sql, stm, etm,invoice_type, stm, etm,invoice_type); + if(invoice_type!=null) { + recordList = Db.find(sql, stm,etm,invoice_type, stm,etm,invoice_type); }else { - recordList = Db.find(sql, stm, etm, stm, etm); + recordList = Db.find(sql, stm,etm, stm,etm); } - return recordList; } - - /** - * 固定用户分类统计:统计各个固定用户在不同砂站的销量以及销售额 - * @return - */ - public Record fixedUserClassificationStatistics(String stm, String etm,Integer customer_id,Integer invoice_type){ - String paramsSql=""; - if(invoice_type!=null){ - paramsSql="and t.invoice_type=?\n"; - } - String sql="SELECT\n" + - "ifnull( sum( CASE g.id WHEN 1 THEN g.weight END ), 0.00 ) zw_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 1 THEN g.total_price END ), 0.00 ) zw_xse,\n" + - "ifnull( sum( CASE g.id WHEN 2 THEN g.weight END ), 0.00 ) tp_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 2 THEN g.total_price END ), 0.00 ) tp_xse,\n" + - "ifnull( sum( CASE g.id WHEN 3 THEN g.weight END ), 0.00 ) sc_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 3 THEN g.total_price END ), 0.00 ) sc_xse,\n" + - "ifnull( sum( CASE g.id WHEN 4 THEN g.weight END ), 0.00 ) sb_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 4 THEN g.total_price END ), 0.00 ) sb_xse,\n" + - "ifnull( sum( CASE g.id WHEN 5 THEN g.weight END ), 0.00 ) jr_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 5 THEN g.total_price END ), 0.00 ) jr_xse,\n" + - "ifnull( sum( CASE g.id WHEN 6 THEN g.weight END ), 0.00 ) yg_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 6 THEN g.total_price END ), 0.00 ) yg_xse,\n" + - "ifnull( sum( CASE g.id WHEN 7 THEN g.weight END ), 0.00 ) zwsc_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 7 THEN g.total_price END ), 0.00 ) zwsc_xse,\n" + - "ifnull( sum( CASE g.id WHEN 8 THEN g.weight END ), 0.00 ) ya_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 8 THEN g.total_price END ), 0.00 ) ya_xse,\n" + - "ifnull( sum( CASE g.id WHEN 9 THEN g.weight END ), 0.00 ) sl_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 9 THEN g.total_price END ), 0.00 ) sl_xse \n" + - "FROM\n" + - "(\n" + - "SELECT\n" + - "m.id,\n" + - "n.customer_id,\n" + - "IFNULL( n.weight, 0.00 ) weight,\n" + - "IFNULL( n.total_price, 0.00 ) total_price \n" + - "FROM\n" + - "( SELECT id, NAME FROM supermarket ) m\n" + - "JOIN (\n" + - "SELECT\n" + - "a.id,\n" + - "sum( a.weight ) weight,\n" + - "sum( a.total_price ) total_price,\n" + - "a.customer_id \n" + - "FROM\n" + - "(\n" + - "SELECT\n" + - "t.sn,t.supermarket_id AS id,\n" + - "t.customer_id,\n" + - "t.customer_name,\n" + - "t.weight,\n" + - "t.total_price,\n" + - "t.product_id,\n" + - "t.product_name \n" + - "FROM\n" + - "order_sale t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + - paramsSql+ - "AND t.isprepaid = 1 UNION\n" + - "SELECT\n" + - "t.sn,t.supermarket_id AS id,\n" + - "t.customer_id,\n" + - "t.customer_name,\n" + - "t.weight,\n" + - "t.total_price,\n" + - "t.product_id,\n" + - "t.product_name \n" + - "FROM\n" + - "order_temp t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + - paramsSql+ - "AND t.isprepaid = 1 \n" + - ") a\n" + - "JOIN customer c ON c.id = a.customer_id \n" + - "WHERE\n" + - "a.customer_id = ? \n" + - "GROUP BY\n" + - "a.id \n" + - ") n ON m.id = n.id \n" + - ") g \n" + - "GROUP BY\n" + - "g.customer_id"; - Record record; - if(invoice_type!=null){ - record = Db.findFirst(sql, stm,etm,invoice_type, stm,etm,invoice_type, customer_id); - }else { - record = Db.findFirst(sql, stm,etm, stm,etm, customer_id); - } - return total(record); - } - /** - * 零散用户不分类统计:统计所有零散用户在所有砂站的销量和销售额 - */ - public Record scatteredUsersAreNotClassified(String stm, String etm,Integer invoice_type){ - String paramsSql=""; - if(invoice_type!=null){ - paramsSql="and t.invoice_type=?\n"; - } - String sql="SELECT '零散用户' customer_name, 0 customer_id,\n" + - "ifnull(sum( a.weight ),0) weight,\n" + - "ifnull(sum( a.total_price ),0) total_price\n" + - "FROM\n" + - "(\n" + - "SELECT\n" + - "t.sn,t.weight,\n" + - "t.total_price,\n" + - "t.product_id\n" + - "FROM\n" + - "order_sale t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=?\n" + - "AND t.create_time <=?\n" + - paramsSql+ - "AND t.isprepaid = 0 UNION\n" + - "SELECT\n" + - "t.sn,t.weight,\n" + - "t.total_price,\n" + - "t.product_id\n" + - "FROM\n" + - "order_temp t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=?\n" + - "AND t.create_time <=?\n" + - paramsSql+ - "AND t.isprepaid = 0 \n" + - ") a"; - Record record; - if(invoice_type!=null){ - record = Db.findFirst(sql, stm, etm,invoice_type, stm, etm,invoice_type); - }else { - record = Db.findFirst(sql, stm, etm, stm, etm); - } - - return record; - } - - /** - * 零散用户分类统计:统计所有零散用户在各个沙场的销量和销售额 - * @param stm - * @param etm - * @return - */ - public Record scatteredUsersClassificationStatistics(String stm, String etm,Integer invoice_type){ - String paramsSql=""; - if(invoice_type!=null){ - paramsSql="and t.invoice_type=?\n"; - } - String sql="select \n" + - "ifnull( sum( CASE g.id WHEN 1 THEN IFNULL( g.weight, 0 ) END ), 0 ) zw_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 1 THEN IFNULL( g.total_price, 0 ) END ), 0 ) zw_xse,\n" + - "ifnull( sum( CASE g.id WHEN 2 THEN IFNULL( g.weight, 0 ) END ), 0 ) tp_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 2 THEN IFNULL( g.total_price, 0 ) END ), 0 ) tp_xse,\n" + - "ifnull( sum( CASE g.id WHEN 3 THEN IFNULL( g.weight, 0 ) END ), 0 ) sc_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 3 THEN IFNULL( g.total_price, 0 ) END ), 0 ) sc_xse,\n" + - "ifnull( sum( CASE g.id WHEN 4 THEN IFNULL( g.weight, 0 ) END ), 0 ) sb_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 4 THEN IFNULL( g.total_price, 0 ) END ), 0 ) sb_xse,\n" + - "ifnull( sum( CASE g.id WHEN 5 THEN IFNULL( g.weight, 0 ) END ), 0 ) jr_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 5 THEN IFNULL( g.total_price, 0 ) END ), 0 ) jr_xse,\n" + - "ifnull( sum( CASE g.id WHEN 6 THEN IFNULL( g.weight, 0 ) END ), 0 ) yg_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 6 THEN IFNULL( g.total_price, 0 ) END ), 0 ) yg_xse,\n" + - "ifnull( sum( CASE g.id WHEN 7 THEN IFNULL( g.weight, 0 ) END ), 0 ) zwsc_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 7 THEN IFNULL( g.total_price, 0 ) END ), 0 ) zwsc_xse,\n" + - "ifnull( sum( CASE g.id WHEN 8 THEN IFNULL( g.weight, 0 ) END ), 0 ) ya_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 8 THEN IFNULL( g.total_price, 0 ) END ), 0 ) ya_xse,\n" + - "ifnull( sum( CASE g.id WHEN 9 THEN IFNULL( g.weight, 0 ) END ), 0 ) sl_xsl,\n" + - "ifnull( sum( CASE g.id WHEN 9 THEN IFNULL( g.total_price, 0 ) END ), 0 ) sl_xse \n" + - " from (\n" + - "select m.id,n.weight,n.total_price from \n" + - "( SELECT id, NAME FROM supermarket ) m join \n" + - "(\n" + - "SELECT\n" + - "t.sn,t.supermarket_id AS id,\n" + - "t.weight,\n" + - "t.total_price FROM\n" + - "order_sale t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + - paramsSql+ - "AND t.isprepaid = 0 UNION\n" + - "SELECT\n" + - "t.sn,t.supermarket_id AS id,\n" + - "t.weight,\n" + - "t.total_price\n" + - "FROM\n" + - "order_temp t \n" + - "WHERE\n" + - "t.state = 5 \n" + - "AND t.create_time >=? \n" + - "AND t.create_time <=? \n" + - paramsSql+ - "AND t.isprepaid = 0 ) n on m.id=n.id\n" + - ") g"; - - Record record; - if(invoice_type!=null) { - record = Db.findFirst(sql, stm,etm,invoice_type, stm,etm,invoice_type); - }else { - record = Db.findFirst(sql, stm,etm, stm,etm); - } - return total(record); - } - /** * 合计 * @param record @@ -2280,8 +2061,9 @@ public class OrderStatService { record.set("jrhj_xsl",jrhj_xsl); record.set("jrhj_xse",jrhj_xse); //盐港合计 - BigDecimal yghj_xsl=new BigDecimal(record.getStr("yg_xsl")).add(new BigDecimal(record.getStr("ya_xsl"))); - BigDecimal yghj_xse=new BigDecimal(record.getStr("yg_xse")).add(new BigDecimal(record.getStr("ya_xse"))); + BigDecimal yghj_xsl=new BigDecimal(record.getStr("yg_xsl")).add(new BigDecimal(record.getStr("ya_xsl"))).add(new BigDecimal(record.getStr("hdw_xsl"))); + BigDecimal yghj_xse=new BigDecimal(record.getStr("yg_xse")).add(new BigDecimal(record.getStr("ya_xse"))).add(new BigDecimal(record.getStr("hdw_xse"))); + record.set("yghj_xsl",yghj_xsl); record.set("yghj_xse",yghj_xse); return record; From 3bd78b9ae8bbf7da47428ab3413045639abcfd9c Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 21 May 2021 23:07:10 +0800 Subject: [PATCH 44/50] =?UTF-8?q?=E5=A4=84=E7=90=86CheckExceptionDataJob?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/jobs/CheckExceptionDataJob.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java index f45ef5d..a55b00c 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java @@ -27,12 +27,16 @@ public class CheckExceptionDataJob implements Job { long nowst = System.currentTimeMillis(); for (Map.Entry entry : SvrCacheData.SUP_HEARTBEAT.entrySet()) { - Record c = entry.getValue(); - long st = c.getLong("tm"); + Record c = entry.getValue(); + if (c.get("tm") != null) { + long st = c.getLong("tm"); - // 五分钟以内的才进行判断,超过5分钟的,就认为是离线了 - // 离线的砂站会产生正常的未同步数据 - if (nowst - st < Const.SUP_OFFLINE_TIME) { + // 五分钟以内的才进行判断,超过5分钟的,就认为是离线了 + // 离线的砂站会产生正常的未同步数据 + if (nowst - st < Const.SUP_OFFLINE_TIME) { + onlineids.add(entry.getKey().toString()); + } + } else { onlineids.add(entry.getKey().toString()); } } @@ -62,7 +66,7 @@ public class CheckExceptionDataJob implements Job { log.error("没有找到在线砂站信息。"); } - if(SyncTaskService.me.getTaskQueueSize() > 10){ + if (SyncTaskService.me.getTaskQueueSize() > 10) { content += "task queue 还有 " + SyncTaskService.me.getTaskQueueSize() + " 条数据等待处理。"; } From 1188bdad473889bc5cb92f35c36d454c796242b4 Mon Sep 17 00:00:00 2001 From: xiaocui <1334950895@qq.com> Date: Mon, 24 May 2021 10:42:00 +0800 Subject: [PATCH 45/50] =?UTF-8?q?=E5=95=86=E5=93=81=E4=BB=B7=E6=A0=BC?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarket/SupermarketService.java | 2 +- .../supermarket/SupEditProductValidator.java | 18 +++++ .../supermarket/SupermarketController.java | 17 +++++ .../supermarket/SupermarketSyncService.java | 72 +++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupEditProductValidator.java diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java index 31ff117..c3cbd40 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java @@ -118,7 +118,7 @@ public class SupermarketService extends BaseService { } Record out = supermarket.toRecord(); - out.set("products", Db.find("select t.supermarket_id, p.id, p.name, t.unit_price from supermarket_product t\n" + + out.set("products", Db.find("select t.supermarket_id, p.id, p.name, t.unit_price,t.product_id from supermarket_product t\n" + " left join product p on t.product_id = p.id \n" + " where t.supermarket_id = ?", id)); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupEditProductValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupEditProductValidator.java new file mode 100644 index 0000000..5d0394c --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupEditProductValidator.java @@ -0,0 +1,18 @@ +package com.cowr.service.ssjygl.supermarket; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class SupEditProductValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateRequired("product_id", "product_id", "product_id 必填"); + validateRequired("unit_price", "unit_price", "unit_price 必填"); + } + + 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/supermarket/SupermarketController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java index 84bc808..d0f5abe 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java @@ -125,4 +125,21 @@ public class SupermarketController extends BaseController { renderJson(SupermarketSyncService.me.removeProduct(supermarket_id, product_id, tokenuser)); } + + + + @Before(SupEditProductValidator.class) + public void editUnitPrice() { + Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + int supermarket_id = getInt("supermarket_id"); + int product_id = getInt("product_id"); + Double unit_price = getParaToDouble("unit_price"); + renderJson(SupermarketSyncService.me.editUnitPrice(supermarket_id, product_id,unit_price, tokenuser)); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java index f7f338c..eb1eab8 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java @@ -1,5 +1,6 @@ package com.cowr.service.ssjygl.supermarket; +import com.cowr.common.base.BaseModel; import com.cowr.common.enums.Enums; import com.cowr.common.view.Result; import com.cowr.model.*; @@ -14,6 +15,7 @@ import com.jfinal.plugin.activerecord.IAtom; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; +import java.util.Map; public class SupermarketSyncService extends BaseSyncService { private static Log log = Log.getLog(SupermarketSyncService.class); @@ -150,4 +152,74 @@ public class SupermarketSyncService extends BaseSyncService { return Result.object(ret); } + + + public Result editUnitPrice(int supermarket_id, int product_id,Double unit_price, Sysuser sysuser) { + SupermarketProduct sp = SupermarketProduct.dao.findByIds(supermarket_id, product_id); + BaseModel saveold = (BaseModel) sp.clone(); + if (sp == null) { + return Result.failed("商品配置信息不存在"); + } + if(unit_price==null ||unit_price<=0){ + return Result.failed("商品单价不能小于0"); + } + sp.setUnitPrice(BigDecimal.valueOf(unit_price)); + String sql="select t.* from ordercluster t where t.state<5 and t.supermarket_id=? and product_id=? " + + "and t.id not in (select b.id from customer_supermarket_product a," + + "ordercluster b where a.customer_id=b.customer_id and a.supermarket_id=b.supermarket_id and a.product_id=b.product_id)"; + List orderclusterList=Ordercluster.dao.find(sql,supermarket_id, product_id); + Map map = new HashMap<>(); + if (orderclusterList!=null &&!orderclusterList.isEmpty()) { + for (Ordercluster ordercluster : orderclusterList) { + ordercluster.setUnitPrice(BigDecimal.valueOf(unit_price)); + if (!map.containsKey(ordercluster.getId())) { + map.put(ordercluster.getSupermarketId(), new SyncTask()); + } + map.get(ordercluster.getSupermarketId()).addUpdateData(ordercluster); + } + } + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = true; + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(sp); + + Stock stock = Stock.dao.findByIds(supermarket_id, product_id); + + if (stock != null) { + stock.setStockWeight(new BigDecimal(0)); + synctask.addUpdateData(stock); + + ret = stock.update(); + } + + if (orderclusterList!=null &&!orderclusterList.isEmpty()) { + int[] editret = Db.batchUpdate(orderclusterList, orderclusterList.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 ret && sp.update() + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(sp, saveold, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } } From 1b38ecedf47d040b6b28348c1bc03b89224a35a9 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 22 Jun 2021 16:10:45 +0800 Subject: [PATCH 46/50] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=B0=83=E8=AF=95?= =?UTF-8?q?=EF=BC=8C=E6=8E=92=E6=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/service/ssjygl/jobs/CheckExceptionDataJob.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java index a55b00c..e8f33ea 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java @@ -1,5 +1,6 @@ package com.cowr.service.ssjygl.jobs; +import com.alibaba.fastjson.JSON; import com.cowr.common.Const; import com.cowr.service.ssjygl.main.Config; import com.cowr.service.ssjygl.main.SvrCacheData; @@ -53,13 +54,17 @@ public class CheckExceptionDataJob implements Job { int sync = 0; if (!onlineids.isEmpty()) { - sync = Db.queryInt("select count(t.id) cnt from sync_task t \n" + + List tbyc = Db.query("select * from sync_task t \n" + " where t.state = 0 \n" + " and t.create_time < date_add(now(), interval -5 minute) \n" + " and t.supermarket_id in(" + StrKit.join(onlineids, ",") + ") "); + sync = tbyc.size(); + if (sync > 0) { content += "浠水砂石系统有 " + sync + " 条数据下发失败。"; + + log.debug("同步异常数据:%s", JSON.toJSONString(tbyc)); } } else { content += "没有找到" + Config.configprop.get("print.vendor") + "在线砂站信息。"; From 56ae190ce92743e28d935380f4c93639df2d8f37 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 22 Jun 2021 20:59:03 +0800 Subject: [PATCH 47/50] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E6=8E=92=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java index e8f33ea..86d300e 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckExceptionDataJob.java @@ -62,7 +62,7 @@ public class CheckExceptionDataJob implements Job { sync = tbyc.size(); if (sync > 0) { - content += "浠水砂石系统有 " + sync + " 条数据下发失败。"; + content += "浠水砂石系统正式环境有 " + sync + " 条数据下发失败。"; log.debug("同步异常数据:%s", JSON.toJSONString(tbyc)); } From dcab4ff837cad9c9aad74766efbcd1649b0ec46d Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 29 Jun 2021 15:08:09 +0800 Subject: [PATCH 48/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E6=81=A2=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/service/ssjygl/truck/TruckSyncService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java index f121625..0a82cd2 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java @@ -137,7 +137,7 @@ public class TruckSyncService extends BaseSyncService { public Result restore(Truck model, Sysuser sysuser) { try { // 注意这里有 !,找到后才做 update 操作 - BaseModel oldobj = (BaseModel) model.findByPk(); + Truck oldobj = model.findByPk(); if (oldobj == null) { return Result.failed(false, "按主键未找到对应记录"); @@ -147,12 +147,12 @@ public class TruckSyncService extends BaseSyncService { return Result.failed(false, "不存在逻辑删除字段"); } - model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + oldobj.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del SyncTask synctask = new SyncTask(); AuthLicense authlic = new AuthLicense(); - authlic.setTruckLicense(model.getLicense()); + authlic.setTruckLicense(oldobj.getLicense()); synctask.addSaveData(authlic); // 恢复车辆时,有效车牌要添加 @@ -160,9 +160,9 @@ public class TruckSyncService extends BaseSyncService { @Override public boolean run() { try { - boolean ret = model.update(); + boolean ret = oldobj.update(); - synctask.addUpdateData(model); + synctask.addUpdateData(oldobj); return ret && SyncTaskService.me.save(synctask) From 97924ae0f81cddd69f82e5ff5249dd974000925f Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Tue, 29 Jun 2021 15:10:05 +0800 Subject: [PATCH 49/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E6=81=A2=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssjygl/truck/TruckSyncService.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java index 0a82cd2..14f23f5 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java @@ -87,7 +87,7 @@ public class TruckSyncService extends BaseSyncService { public Result delete(Truck model, Sysuser sysuser) { try { // 注意这里有 !,找到后才做 update 操作 - BaseModel oldobj = (BaseModel) model.findByPk(); + Truck oldobj = model.findByPk(); if (oldobj == null) { return Result.failed(false, "按主键未找到对应记录"); @@ -97,10 +97,10 @@ public class TruckSyncService extends BaseSyncService { return Result.failed(false, "不存在逻辑删除字段"); } - model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_INVALID); // 逻辑删除字段统一用 del + oldobj.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_INVALID); // 逻辑删除字段统一用 del SyncTask synctask = new SyncTask(); - synctask.addUpdateData(model); + synctask.addUpdateData(oldobj); AuthLicense authlic = new AuthLicense(); authlic.setTruckLicense(model.getLicense()); @@ -111,7 +111,7 @@ public class TruckSyncService extends BaseSyncService { @Override public boolean run() { try { - return model.update() + return oldobj.update() && SyncTaskService.me.save(synctask) && ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); } catch (Exception e) { @@ -121,12 +121,6 @@ public class TruckSyncService extends BaseSyncService { } }); - // 将修改后的对象返回 - String[] keys = model._getAttrNames(); - for (String key : keys) { - oldobj.set(key, model.get(key)); - } - return ret ? Result.object(oldobj) : Result.failed(false, "删除失败"); } catch (Exception e) { log.error(e.getMessage(), e); @@ -174,12 +168,6 @@ public class TruckSyncService extends BaseSyncService { } }); - // 将修改后的对象返回 - String[] keys = model._getAttrNames(); - for (String key : keys) { - oldobj.set(key, model.get(key)); - } - return ret ? Result.object(oldobj) : Result.failed(false, "恢复失败"); } catch (Exception e) { log.error(e.getMessage(), e); From 70509f58368c0b6056200422dd38c7dc76dbe3e0 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sat, 17 Jul 2021 17:01:00 +0800 Subject: [PATCH 50/50] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cowr/service/ssjygl/main/Config.java | 2 ++ .../PrepayCustomerController.java | 14 ++++++++++ .../PrepayCustomerSyncService.java | 26 ++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerController.java 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 7a83e76..e5c4e6d 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 @@ -33,6 +33,7 @@ import com.cowr.service.ssjygl.order.ordertransfer.OrderTransferController; import com.cowr.service.ssjygl.order.ordertrash.OrderTrashController; import com.cowr.service.ssjygl.overall.OverallController; import com.cowr.service.ssjygl.prepay.PrepayController; +import com.cowr.service.ssjygl.prepay.prepaycustomer.PrepayCustomerController; import com.cowr.service.ssjygl.prepay.prepaydetail.PrepayDetailController; import com.cowr.service.ssjygl.prepay.prepaytruck.PrepayTruckController; import com.cowr.service.ssjygl.prepay.refunddetail.RefundDetailController; @@ -186,6 +187,7 @@ public class Config extends JFinalConfig { // -- 预付费 me.add("/prepay", PrepayController.class); + me.add("/prepaycustomer", PrepayCustomerController.class); me.add("/prepaydetail", PrepayDetailController.class); me.add("/prepaytruck", PrepayTruckController.class); me.add("/refunddetail", RefundDetailController.class); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerController.java new file mode 100644 index 0000000..a73f360 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerController.java @@ -0,0 +1,14 @@ +package com.cowr.service.ssjygl.prepay.prepaycustomer; + +import com.cowr.common.validator.CustomerIdValidator; +import com.cowr.common.view.Result; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +public class PrepayCustomerController extends Controller { + + @Before(CustomerIdValidator.class) + public void pushPrepayCustomer() { + renderJson(Result.object(PrepayCustomerSyncService.me.pushPrepayCustomer(getInt("customer_id")))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java index 924a35a..bfda2a1 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java @@ -1,4 +1,28 @@ package com.cowr.service.ssjygl.prepay.prepaycustomer; -public class PrepayCustomerSyncService { +import com.cowr.model.PrepayCustomer; +import com.cowr.model.SyncTask; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; + +public class PrepayCustomerSyncService extends BaseSyncService { + public static PrepayCustomerSyncService me = new PrepayCustomerSyncService(); + + /** + * 将服务端的客户预付费信息推送到客户端 + * + * @param customer_id + */ + public boolean pushPrepayCustomer(Integer customer_id) { + PrepayCustomer prepayCustomer = PrepayCustomer.dao.findFirst("select * from prepay_customer where customer_id = ? ", customer_id); + + if (prepayCustomer == null) { + return false; + } + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(prepayCustomer); + + return SyncTaskService.me.save(synctask); + } }