dev
parent
afdfe0c0b8
commit
7a77fdc674
|
|
@ -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<M extends BaseTicketLog<M>> 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");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,12 +209,9 @@ public class OrderTempSyncService {
|
|||
synctask.addUpdateData(stock);
|
||||
}
|
||||
|
||||
// if (req_receipt == 1) { // 需要同时开具发票
|
||||
if (req_receipt == 1) { // 需要同时开具发票
|
||||
// 这里的 finalReceive 在前面肯定验证过了
|
||||
receive.setSurplus(receive.getSurplus() - 1);
|
||||
receive.setCurrentCode(invoice_code);
|
||||
|
||||
ret = receive.update();
|
||||
ret = finalReceive.update();
|
||||
|
||||
if (!ret) {
|
||||
log.error("发票领用信息更新失败", invoice_code);
|
||||
|
|
@ -194,7 +220,7 @@ public class OrderTempSyncService {
|
|||
|
||||
InvoiceLog invoiceLog = new InvoiceLog();
|
||||
invoiceLog.setId(StrKit.getRandomUUID());
|
||||
invoiceLog.setInvoiceReceiveId(receive.getId());
|
||||
invoiceLog.setInvoiceReceiveId(finalReceive.getId());
|
||||
invoiceLog.setCode(invoice_code);
|
||||
invoiceLog.setInvoiceNumber(invoice_number);
|
||||
invoiceLog.setState(OrderStateEnum.RECEIVED.getStateid());
|
||||
|
|
@ -211,8 +237,36 @@ public class OrderTempSyncService {
|
|||
}
|
||||
|
||||
synctask.addSaveData(invoiceLog);
|
||||
synctask.addUpdateData(receive);
|
||||
// }
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
|
@ -312,6 +367,7 @@ public class OrderTempSyncService {
|
|||
}
|
||||
|
||||
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); // 不需要开发票的,都是要专票的
|
||||
}
|
||||
|
||||
|
|
@ -427,6 +497,7 @@ public class OrderTempSyncService {
|
|||
transport.setType(OrderTypeEnum.TEMP.getTypeid());
|
||||
|
||||
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,
|
||||
|
|
@ -630,13 +730,11 @@ public class OrderTempSyncService {
|
|||
}
|
||||
|
||||
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());
|
||||
|
|
@ -736,6 +854,7 @@ public class OrderTempSyncService {
|
|||
}
|
||||
|
||||
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("开票失败");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
// 再判断这张结算单是不是已经被取消了
|
||||
|
|
|
|||
|
|
@ -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) { // 需要打印发票的,才去插领票记录
|
||||
// 开专票的需要用结算单
|
||||
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()));
|
||||
|
|
|
|||
|
|
@ -48,16 +48,24 @@ public class InvoiceLogSyncService extends BaseSyncService {
|
|||
|
||||
List<OrderTemp> 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<TicketLog> 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<InvoiceLog> logs = new ArrayList<>();
|
||||
Map<Integer, SyncTask> 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<Integer, SyncTask> entry : map.entrySet()) {
|
||||
|
|
@ -366,7 +391,20 @@ public class InvoiceLogSyncService extends BaseSyncService {
|
|||
invoiceLog.getCode()
|
||||
);
|
||||
|
||||
if (ordlist.isEmpty()) {
|
||||
if (loglist.isEmpty()) {
|
||||
return Result.failed("发票使用信息错误");
|
||||
}
|
||||
|
||||
List<TicketLog> 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 修改一条记录
|
||||
|
|
|
|||
Loading…
Reference in New Issue