From 7a77fdc674e15c83e9c3838909962f79dbeed9eb Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Wed, 3 Mar 2021 11:40:27 +0800 Subject: [PATCH] . --- .../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 修改一条记录