1.年统计的查询条件里面 ,年选择框的 allowClear

2.通过 /local/transport/query/transportInfo 接口返回的类型判断,如果是预售车辆,这个结算界面就换成提货界面
3.预售单管理页面添加是否已提货完成的下拉筛选
4.订单下面的运输日志和统计下面的日明细都加上是否预售提货的下拉筛选
5、做一个配额限制,固定供砂配额和预售配额互斥,不能同时都有进行中的
6、运输日志中的订单取消时,要同步更新预售单中的提货额,将取消的额度返回去
dev
wuwenxiong 2022-01-03 23:52:59 +08:00
parent 545a12f3ee
commit 9309e740b0
13 changed files with 610 additions and 135 deletions

View File

@ -384,21 +384,24 @@ public class OrderclusterService extends BaseService {
return Db.find(sql, ts.toArray());
}
public List<Record> undonlist(int supermarket_id, int customer_id, String start_time, String cutoff_time, int sale_type) {
public List<Record> undonlist(int supermarket_id, int customer_id, String start_time, String cutoff_time, Integer sale_type) {
List<Object> ts = new ArrayList<>();
ts.add(OrderStateEnum.RECEIVED.getStateid());
ts.add(cutoff_time + " 23:59:59");
ts.add(start_time + " 00:00:00");
ts.add(supermarket_id);
ts.add(customer_id);
ts.add(sale_type);
String sql = "select * from ordercluster t \n" +
" where t.state < ? \n" +
" and t.start_time <= ? \n" +
" and t.cutoff_time >= ? \n" +
" and t.supermarket_id = ? \n" +
" and t.customer_id = ? \n" +
" and t.sale_type = ?";
" and t.customer_id = ? \n";
if (sale_type != null && (sale_type == 0 || sale_type == 1)) {
sql += " and t.sale_type = ?";
ts.add(sale_type);
}
return Db.find(sql, ts.toArray());
}

View File

@ -89,6 +89,7 @@ public class OrderTempService extends BaseService {
String etm,
Integer isprepaid,
Integer state,
Integer type,
String invoice_code,
Integer invoice_type,
String ticket_code,
@ -167,6 +168,11 @@ public class OrderTempService extends BaseService {
paraList.add(state);
}
if (type != null && (type == 0 || type == 1)) {
fromsql += " and t.sale_type = ? \n";
paraList.add(type);
}
if (invoice_type != null) {
fromsql += " and t.invoice_type = ? \n";
paraList.add(invoice_type);
@ -253,6 +259,7 @@ public class OrderTempService extends BaseService {
String etm,
Integer isprepaid,
Integer state,
Integer type,
String invoice_code,
Integer invoice_type,
Integer product_id,
@ -329,6 +336,11 @@ public class OrderTempService extends BaseService {
paraList.add(state);
}
if (type != null && (type == 0 || type == 1)) {
fromsql += " and t.sale_type = ? \n";
paraList.add(type);
}
if (invoice_type != null) {
fromsql += " and t.invoice_type = ? \n";
paraList.add(invoice_type);

View File

@ -23,7 +23,7 @@ import java.util.List;
public class PresellOrderService extends BaseService {
public static final PresellOrderService me = new PresellOrderService();
public Page<Record> find(PageParam pp, Integer customer_id, Integer supermarket_id, Integer del, String name, String stm, String etm) {
public Page<Record> find(PageParam pp, Integer customer_id, Integer supermarket_id, Integer del, String name, String stm, String etm, Integer type) {
String selectsql = "select t.*, c.name customer_name, s.name supermarket_name, c.address, c.texpayer_name, c.texpayer_num, c.memo,\n" +
" (t.presell_amount - t.pug_amount) as surplus \n";
String fromsql = " from presell_order t \n" +
@ -63,6 +63,14 @@ public class PresellOrderService extends BaseService {
paraList.add(etm);
}
if (type != null && (type == 0 || type == 1)) {
if (type == 0) {
fromsql += " and t.presell_amount > t.pug_amount \n";
} else {
fromsql += " and t.presell_amount = t.pug_amount \n";
}
}
String totalRowSql = "select count(*) " + fromsql;
String findSql = selectsql + fromsql;
@ -82,7 +90,7 @@ public class PresellOrderService extends BaseService {
return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray());
}
public List<PresellOrder> list(Integer customer_id, Integer supermarket_id, Integer del, String name, String stm, String etm) {
public List<PresellOrder> list(Integer customer_id, Integer supermarket_id, Integer del, String name, String stm, String etm, Integer type) {
String sql = "select t.*, c.name customer_name, s.name supermarket_name, c.address, c.texpayer_name, c.texpayer_num, c.memo, \n" +
" (t.presell_amount - t.pug_amount) as surplus\n" +
" from presell_order t \n" +
@ -122,6 +130,14 @@ public class PresellOrderService extends BaseService {
paraList.add(etm);
}
if (type != null && (type == 0 || type == 1)) {
if (type == 0) {
sql += " and t.presell_amount > t.pug_amount \n";
} else {
sql += " and t.presell_amount = t.pug_amount \n";
}
}
return PresellOrder.dao.find(sql, paraList.toArray());
}

View File

@ -45,7 +45,8 @@ public class OrderStatService {
Integer isprepaid,
Integer product_id,
String sn,
Integer customer_type_id
Integer customer_type_id,
Integer sale_type
) {
String temp_sql = " select\n" +
" t.sn\n" +
@ -77,6 +78,11 @@ public class OrderStatService {
paraTempList.add(OrderStateEnum.RECEIVED.getStateid());
paraTempList.add(tm + "%");
if (sale_type != null && (sale_type == 0 || sale_type == 1)) {
temp_sql += " and t.sale_type = ? \n";
paraTempList.add(sale_type);
}
if (supermarket_id != null && supermarket_id > 0) {
temp_sql += " and t.supermarket_id = ? \n";
paraTempList.add(supermarket_id);
@ -166,7 +172,8 @@ public class OrderStatService {
Integer isprepaid,
Integer product_id,
String sn,
Integer customer_type_id
Integer customer_type_id,
Integer sale_type
) {
List<Record> list = daydetail(tm,
supermarket_id,
@ -177,7 +184,8 @@ public class OrderStatService {
isprepaid,
product_id,
sn,
customer_type_id
customer_type_id,
sale_type
);
list.sort(new Comparator<Record>() {
@ -2869,7 +2877,10 @@ public class OrderStatService {
}
public Workbook yearsalestatExportBySup(String tm) {
String title = tm + "年销售统计";
String title = "销售统计";
if (!StrKit.isBlank(tm)) {
title = tm + "年销售统计";
}
String[] headers = {"name", "item_name", "product_name", "order_num", "weight", "total_price"};
String[] regions = {"name", "item_name"};
Map<String, String> titleMap = new HashMap<>();
@ -2921,6 +2932,16 @@ public class OrderStatService {
"WHERE\n" +
" id <= 6\n" +
"OR id = 11");
List<Object> shParamsList = new ArrayList<>();
shParamsList.add(OrderStateEnum.RECEIVED.getStateid());
String shParams = "";
String yhParams = "";
if (!StrKit.isBlank(tm)) {
shParams += " and t.create_time like ? \n";
yhParams += " and p.presell_date like '" + tm + "%'\n";
shParamsList.add(tm + "%");
}
// 实售
List<Record> shList = Db.find(
"select s.id, s.name, p.id product_id, p.`name` product_name, ifnull(a.orderCount, 0) as order_num, ifnull(a.totalPrice, 0) as total_price, ifnull(a.weight, 0) as weight\n" +
@ -2931,12 +2952,12 @@ public class OrderStatService {
" select t.supermarket_id as id, t.paid, t.total_price, t.weight, t.product_id\n" +
" from order_temp t\n" +
" where t.state = ? \n" +
" and t.create_time like ? \n" +
shParams +
" ) t\n" +
" group by t.id, t.product_id\n" +
" ) a on a.id = t.supermarket_id and a.product_id = t.product_id\n" +
" left join supermarket s on s.id = t.supermarket_id\n" +
" left join product p on p.id = t.product_id", OrderStateEnum.RECEIVED.getStateid(), tm + "%");
" left join product p on p.id = t.product_id", shParamsList.toArray());
// 预售
List<Record> yhList = Db.find(
"SELECT\n" +
@ -2946,9 +2967,9 @@ public class OrderStatService {
" `presell_order` p\n" +
"WHERE\n" +
" del = 0\n" +
"AND p.presell_date LIKE ?\n" +
"GROUP BY\n" +
" p.supermarket_id", tm + "%");
yhParams +
" GROUP BY\n" +
" p.supermarket_id");
List<Record> retChildren = new ArrayList<>();
List<Record> retList = new ArrayList<>();

View File

@ -36,6 +36,7 @@ public class OrderTempController extends BaseController {
String customer_name = get("customer_name");
String sn = get("sn");
Integer state = getInt("state");
Integer type = getInt("type");
Integer product_id = getInt("product_id");
Integer supermarket_id = getInt("supermarket_id");
Integer isprepaid = getInt("isprepaid");
@ -44,7 +45,7 @@ public class OrderTempController extends BaseController {
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, ticket_code, 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, type, invoice_code, invoice_type, ticket_code, product_id, invoice_code_is_null)));
}
@Before(StartAndEndIntervalValidator.class)
@ -55,6 +56,7 @@ public class OrderTempController extends BaseController {
String customer_name = get("customer_name");
String sn = get("sn");
Integer state = getInt("state");
Integer type = getInt("type");
Integer product_id = getInt("product_id");
Integer supermarket_id = getInt("supermarket_id");
Integer isprepaid = getInt("isprepaid");
@ -63,7 +65,7 @@ public class OrderTempController extends BaseController {
Integer customer_id = getInt("customer_id");
Boolean invoice_code_is_null = getBoolean("invoice_code_is_null");
Workbook wb = OrderTempService.me.export(sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, product_id, invoice_code_is_null);
Workbook wb = OrderTempService.me.export(sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, type, invoice_code, invoice_type, product_id, invoice_code_is_null);
render(new ExcelRender("运输日志_" + System.currentTimeMillis() + ".xlsx", wb));
}
@ -137,6 +139,29 @@ public class OrderTempController extends BaseController {
renderJson(OrderTempSyncService.me.prepay(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, ticket_code, product_id, memo, printer, tokenuser, req_receipt));
}
@Before(OrderTempPrepayValidator.class)
public void presellpay() {
Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
if (tokenuser == null) {
renderJson(Result.noauth());
return;
}
String uuid = get("uuid");
String transport_id = get("transport_id");
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.presellpay(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, ticket_code, product_id, memo, printer, tokenuser, req_receipt));
}
@Before(SnValidator.class)
public void invoice() {
Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));

View File

@ -735,9 +735,6 @@ public class OrderTempSyncService {
}
//账户可用余额
BigDecimal availableBalance = RefundDetailService.me.getAvailableBalance(prepayCustomer.getCustomerId(), prepayCustomer.getSurplus());
if (ordercluster.getSaleType() == 1) {
availableBalance = PresellOrderService.me.getPresellCustomerSurplusById(ordercluster.getPresellOrderId());
}
if (availableBalance == null || availableBalance.compareTo(min) <= 0) {
return Result.failed("客户余额不足");
}
@ -882,46 +879,415 @@ public class OrderTempSyncService {
order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0
order.setPrepayCustomerId(prepayCustomer.getId());
if (ordercluster.getSaleType() == 0) {
if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice().setScale(2, BigDecimal.ROUND_HALF_UP)) < 0) {
if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice().setScale(2, BigDecimal.ROUND_HALF_UP)) < 0) {
return false;
}
synctask.addIncrementData(
prepayCustomer.getTablename(),
"id",
prepayCustomer.getId(),
new JSONObject().fluentPut("surplus", new BigDecimal(0).subtract(order.getTotalPrice())) // 结算完成,在原余额上加上一个负数
);
// 只更新本地 prepayCustomer 的 surplus
prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice()));
ret = prepayCustomer.update();
if (!ret) {
return false;
}
ret = order.save() && transport.update();
if (!ret) {
return false;
}
if (ordercluster.getState() == OrderStateEnum.INITIAL.getStateid()) {
ordercluster.setState(OrderStateEnum.ENTERED.getStateid());
ret = ordercluster.update();
if (!ret) {
return false;
}
synctask.addUpdateData(ordercluster);
}
Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId());
if (stock == null) {
log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId());
stock = new Stock();
stock.setProductId(order.getProductId());
stock.setSupermarketId(order.getSupermarketId());
stock.setStockWeight(new BigDecimal(0).subtract(net_weight));
ret = stock.save();
if (!ret) {
return false;
}
synctask.addSaveData(stock);
} else {
stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存
ret = stock.update();
if (!ret) {
return false;
}
synctask.addUpdateData(stock);
}
// if (finalReceive != null) {
if (customer.getInvoiceType() == 1) {
// if (req_receipt == 1) { // 需要同时开具发票
// 这里的 finalReceive 在前面肯定验证过了
ret = finalReceive.update();
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);
}
// }
// 在这里更新sn字段之后存入
synctask.addSaveData(order);
synctask.addUpdateData(transport);
return SyncTaskService.me.save(synctask);
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
}
});
// 数据库保存成功后,立即推送到服务端,及时更新各个地方的客户余额
if (ret) {
SyncTaskService.me.send(synctask);
}
return LocalOrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId);
}
public Result presellpay(
String uuid,
String transport_id,
Integer ordercluster_id,
String invoice_number,
String invoice_code,
String ticket_code,
Integer product_id,
String memo,
String printerId,
Sysuser sysuser,
int req_receipt
) {
OrderTemp order = new OrderTemp();
order.setUuid(uuid);
if (order.checkDuplicate("uuid")) {
return Result.failed("【%s】已经存在", uuid);
}
BigDecimal min = new BigDecimal(0);
Transport transport = Transport.dao.findById(transport_id);
if (transport == null) {
return Result.failed("进出场记录不能为空");
}
if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) {
return Result.failed("进出场记录已完结或者已作废,不能使用");
}
// 验证重量
if (transport.getFirstWeight() == null
|| transport.getSecondWeight() == null
|| transport.getFirstWeight().compareTo(min) < 0
|| transport.getSecondWeight().compareTo(min) < 0
|| transport.getSecondWeight().subtract(transport.getFirstWeight()).doubleValue() <= 0 // 销售订单 第一重量要比第二次重量小, 即 毛重 > 皮重
) {
return Result.failedstr("重量数据有误,第一次称重:%.4f,第二次称重:%.4f", transport.getFirstWeight(), transport.getSecondWeight());
}
BigDecimal weightLimit = TruckWeightLimitSyncService.me.getMinTruckWeightLimit(transport.getTruckLicense());
if (transport.getSecondWeight().compareTo(weightLimit) > 0) {
return Result.failedstr("毛重不能超过 %.2f 吨", weightLimit);
}
BigDecimal net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次
OrderclusterTruck ot = OrderclusterTruck.dao.findFirst("select * from ordercluster_truck t \n" +
" where t.truck_license = ? \n" +
" and t.ordercluster_id = ? ",
transport.getTruckLicense(),
ordercluster_id
);
if (ot == null) {
return Result.failedstr("【%s】不是今日预付费车辆", transport.getTruckLicense());
}
Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id);
if (ordercluster == null) {
return Result.failedstr("预售订单【%s】信息不存在", ordercluster_id);
}
if (ordercluster.getState() == OrderStateEnum.INVALID.getStateid()) {
return Result.failedstr("预售订单【%s】已完结请重新下单", ordercluster_id);
}
if (!DateTimeUtil.isInAssignTimeSlot(ordercluster.getStartTime(), ordercluster.getCutoffTime())) {
return Result.failedstr("预售订单只能在%s至%s内使用",
DateTimeUtil.sdfymd.get().format(ordercluster.getStartTime()), DateTimeUtil.sdfymd.get().format(ordercluster.getCutoffTime()));
}
if (ordercluster.getSupermarketId() != CliCacheData.SUP.getId()) {
return Result.failedstr("配额指定砂站(%s)和当前砂站不匹配(%s)", ordercluster.getSupermarketId(), CliCacheData.SUP.getId());
}
BigDecimal overweight = OrderclusterService.me.getOverWeight(ordercluster_id); // 集团订单已完成量
// 不能超过集团订单剩余量
if (net_weight.compareTo(ordercluster.getTotalWeight().subtract(overweight)) > 0) {
return Result.failedstr("净重 %.2f 吨,超过了剩余的 %.2f 余量", net_weight, ordercluster.getTotalWeight().subtract(overweight));
}
Customer customer = Customer.dao.findById(ordercluster.getCustomerId());
if (customer == null) {
return Result.failedstr("未找到有效的客户信息");
}
if (customer.getType() != 1) {
return Result.failed("不是预付费客户");
}
PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId());
if (prepayCustomer == null) {
return Result.failed("没有找到客户预付费信息");
}
//账户可用余额
BigDecimal availableBalance = PresellOrderService.me.getPresellCustomerSurplusById(ordercluster.getPresellOrderId());
if (availableBalance == null || availableBalance.compareTo(min) <= 0) {
return Result.failed("客户余额不足");
}
InvoiceReceive receive = null;
TicketReceive ticketReceive = null;
// 2020-09-29 需要开具专票的,先开具结算单,不打发票
// 2020-10-12 所有砂站都可以开结算单
if (customer.getInvoiceType() == 1) {
receive = InvoiceReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), invoice_number, invoice_code);
if (receive == null) {
return Result.failed("没有有效的发票领用记录,或者发票已经被使用");
}
InvoiceLog invoiceLog = InvoiceLogService.me.checkUseInvoiceLog(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);
// 不满足开专票的条件的,就必须开具冠名发票
// if (req_receipt == 1) { // 需要同时开具发票
order.setInvoiceCode(invoice_code);
order.setInvoiceNumber(invoice_number);
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.checkUseTicketLog(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());
if (product == null) {
return Result.failedstr("未找到有效的品类信息");
}
// 物流公司信息
order.setTransCoId(ordercluster.getTransCoId());
order.setTransCoAddress(ordercluster.getTransCoAddress());
order.setTransCoBankAccount(ordercluster.getTransCoBankAccount());
order.setTransCoBankName(ordercluster.getTransCoBankName());
order.setTransCoName(ordercluster.getTransCoName());
order.setTransCoPhone(ordercluster.getTransCoPhone());
order.setTransCoTexpayerName(ordercluster.getTransCoTexpayerName());
order.setTransCoTexpayerNum(ordercluster.getTransCoTexpayerNum());
transport.setTransCoId(ordercluster.getTransCoId());
transport.setTransCoAddress(ordercluster.getTransCoAddress());
transport.setTransCoBankAccount(ordercluster.getTransCoBankAccount());
transport.setTransCoBankName(ordercluster.getTransCoBankName());
transport.setTransCoName(ordercluster.getTransCoName());
transport.setTransCoPhone(ordercluster.getTransCoPhone());
transport.setTransCoTexpayerName(ordercluster.getTransCoTexpayerName());
transport.setTransCoTexpayerNum(ordercluster.getTransCoTexpayerNum());
// BigDecimal up = CustomerSupermarketProductService.me.getUnitPrice(customer.getId(), transport.getSupermarketId(), product.getId());
BigDecimal up = ordercluster.getUnitPrice(); // 集团订单是每天创建的,可以使用集团订单中确定的单价
if (up == null) {
return Result.failedstr("未查到有效的单价信息");
}
Date now = new Date();
SyncTask synctask = new SyncTask();
order.setTransportId(transport.getId());
order.setSupermarketId(transport.getSupermarketId());
order.setTruckLicense(transport.getTruckLicense());
// 运输信息
order.setProductId(product.getId());
order.setProductName(product.getName());
// 支付信息
order.setUnitPrice(up);
order.setWeight(net_weight); // 使用净重更新重量
order.setTotalPrice(TransPriceService.me.caleTotalPrice(up, net_weight)); // 获取根据净重和单价计算的总价,作为应付金额
order.setPaid(order.getTotalPrice()); // 如果有预付费,该字段根据预付费情况设置。实付金额
order.setPayType(1);
order.setOrderclusterId(ordercluster_id);
// 客户信息
order.setCustomerId(customer.getId());
order.setCustomerAddress(customer.getAddress());
order.setCustomerBankAccount(customer.getBankAccount());
order.setCustomerBankName(customer.getBankName());
order.setCustomerName(customer.getName());
order.setCustomerPhone(customer.getPhone());
order.setCustomerTexpayerName(customer.getTexpayerName());
order.setCustomerTexpayerNum(customer.getTexpayerNum());
order.setCreateUserId(sysuser.getId());
order.setCreateUserName(sysuser.getName());
order.setSettlementUserId(sysuser.getId());
order.setSettlementUserName(sysuser.getName());
order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程
order.setSaleType(ordercluster.getSaleType());
order.setCreateTime(now);
order.setMemo(memo); // 备注
// 更新 transport 出入场信息
transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成
transport.setArriveTime(now);
transport.setType(OrderTypeEnum.TEMP.getTypeid());
// 客户账户可用余额要可以支付本次订单
if (availableBalance.compareTo(order.getTotalPrice().setScale(2, BigDecimal.ROUND_HALF_UP)) < 0) {
return Result.failedstr("总价 %.2f,客户可用余额(%.2f)不足以支付", order.getTotalPrice(), availableBalance);
}
InvoiceReceive finalReceive = receive;
TicketReceive finalTicketReceive = ticketReceive;
boolean ret = Db.tx(new IAtom() {
@Override
public boolean run() {
try {
boolean ret = false;
order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.TEMP.getTypeid()));
transport.setOrderSn(order.getSn());
order.setIsprepaid(1);
order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0
order.setPrepayCustomerId(prepayCustomer.getId());
PresellOrder presellOrder = PresellOrder.dao.findById(ordercluster.getPresellOrderId());
if (presellOrder == null) return false;
synctask.addIncrementData(
prepayCustomer.getTablename(),
presellOrder.getTablename(),
"id",
prepayCustomer.getId(),
new JSONObject().fluentPut("surplus", new BigDecimal(0).subtract(order.getTotalPrice())) // 结算完成,在原余额上加上一个负数
presellOrder.getId(),
new JSONObject().fluentPut("pug_amount", order.getTotalPrice()) // 结算完成,更新提货额
);
// 只更新本地 prepayCustomer 的 surplus
prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice()));
// 更新本地presellOrder的pug_amount
presellOrder.setPugAmount(presellOrder.getPugAmount().add(order.getTotalPrice()));
ret = prepayCustomer.update();
ret = presellOrder.update();
if (!ret) {
return false;
}
} else {
PresellOrder presellOrder = PresellOrder.dao.findById(ordercluster.getPresellOrderId());
if (presellOrder == null) return false;
// synctask.addIncrementData(
// presellOrder.getTablename(),
// "id",
// presellOrder.getId(),
// new JSONObject().fluentPut("pug_amount", order.getTotalPrice()) // 结算完成,更新提货额
// );
// 更新presellOrder 的 pug_amount
presellOrder.setPugAmount(presellOrder.getPugAmount().add(order.getTotalPrice()));
ret = presellOrder.update();
if (!ret) {
return false;
}
// 同步到其它砂站
synctask.addUpdateData(presellOrder);
if (!ret) {
return false;
}
ret = order.save() && transport.update();
@ -942,32 +1308,31 @@ public class OrderTempSyncService {
synctask.addUpdateData(ordercluster);
}
if (ordercluster.getSaleType() == 0) {
Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId());
if (stock == null) {
log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId());
Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId());
if (stock == null) {
log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId());
stock = new Stock();
stock.setProductId(order.getProductId());
stock.setSupermarketId(order.getSupermarketId());
stock.setStockWeight(new BigDecimal(0).subtract(net_weight));
ret = stock.save();
stock = new Stock();
stock.setProductId(order.getProductId());
stock.setSupermarketId(order.getSupermarketId());
stock.setStockWeight(new BigDecimal(0).subtract(net_weight));
ret = stock.save();
if (!ret) {
return false;
}
synctask.addSaveData(stock);
} else {
stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存
ret = stock.update();
if (!ret) {
return false;
}
synctask.addSaveData(stock);
} else {
stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存
ret = stock.update();
if (!ret) {
return false;
}
if (!ret) {
return false;
}
synctask.addUpdateData(stock);
}
synctask.addUpdateData(stock);
}
}
// if (finalReceive != null) {
if (customer.getInvoiceType() == 1) {

View File

@ -18,14 +18,15 @@ public class PresellOrderController extends Controller {
* presell_order
*/
public void find(){
Integer customer_id = getInt("customer_id");
Integer customer_id = getInt("customer_id");
Integer supermarket_id = getInt("supermarket_id");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
Integer type = getInt("type");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
PageParam pp = getBean(PageParam.class, "", true);
renderJson(Result.object(PresellOrderService.me.find(pp, customer_id, supermarket_id, del, name, stm, etm)));
renderJson(Result.object(PresellOrderService.me.find(pp, customer_id, supermarket_id, del, name, stm, etm, type)));
}
@ -33,12 +34,13 @@ public class PresellOrderController extends Controller {
* presell_order
*/
public void list(){
Integer customer_id = getInt("customer_id");
Integer customer_id = getInt("customer_id");
Integer supermarket_id = getInt("supermarket_id");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
renderJson(Result.object(PresellOrderService.me.list(customer_id, supermarket_id, del, name, stm, etm)));
Integer type = getInt("type");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
renderJson(Result.object(PresellOrderService.me.list(customer_id, supermarket_id, del, name, stm, etm, type)));
}
}

View File

@ -27,6 +27,7 @@ public class OrderStatController extends BaseController {
Integer isprepaid = getInt("isprepaid");
Integer product_id = getInt("product_id");
Integer customer_type_id = getInt("customer_type_id");
Integer sale_type = getInt("sale_type");
int export = getInt("export", 0); // 是否导出为exce 0 不导出1 导出
@ -41,7 +42,8 @@ public class OrderStatController extends BaseController {
isprepaid,
product_id,
sn,
customer_type_id
customer_type_id,
sale_type
)));
} else {
Workbook wb = OrderStatService.me.daydetailExport(
@ -54,7 +56,8 @@ public class OrderStatController extends BaseController {
isprepaid,
product_id,
sn,
customer_type_id
customer_type_id,
sale_type
);
render(new ExcelRender(tm + "_日销售明细_" + System.currentTimeMillis() + ".xlsx", wb));
}

View File

@ -151,7 +151,7 @@ public class OrderclusterSyncService extends BaseSyncService {
// 超时在指定时间段内还有未完成的配额
String query_start_time = DateTimeUtil.sdf.get().format(start_time);
String query_cutoff_time = DateTimeUtil.sdf.get().format(cutoff_time);
List<Record> undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_id, query_start_time, query_cutoff_time, 0);
List<Record> undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_id, query_start_time, query_cutoff_time, null);
if (undonlist != null && !undonlist.isEmpty()) {
return Result.failedstr("客户[%s]在砂站[%s][%s]至[%s]内还有未完成的配额", customerObj.getName(), SvrCacheData.SUP_CACHE.get(supermarket_id).getName(), query_start_time, query_cutoff_time);
@ -577,7 +577,7 @@ public class OrderclusterSyncService extends BaseSyncService {
return Result.failed("未获取到预售单");
}
List<Record> list = OrderclusterService.me.undonlist(model.getSupermarketId(), model.getCustomerId(), 1);
List<Record> list = OrderclusterService.me.undonlist(model.getSupermarketId(), model.getCustomerId(), null);
if (list != null && !list.isEmpty()) {
return Result.failed("还有未完成的预售订单");
@ -602,7 +602,7 @@ public class OrderclusterSyncService extends BaseSyncService {
// 超时在指定时间段内还有未完成的配额
String query_start_time = DateTimeUtil.sdf.get().format(model.getStartTime());
String query_cutoff_time = DateTimeUtil.sdf.get().format(model.getCutoffTime());
List<Record> undonlist = OrderclusterService.me.undonlist(model.getSupermarketId(), model.getCustomerId(), query_start_time, query_cutoff_time, 1);
List<Record> undonlist = OrderclusterService.me.undonlist(model.getSupermarketId(), model.getCustomerId(), query_start_time, query_cutoff_time, null);
if (undonlist != null && !undonlist.isEmpty()) {
return Result.failedstr("客户[%s]在砂站[%s][%s]至[%s]内还有未完成的配额",

View File

@ -39,6 +39,7 @@ public class OrderTempController extends BaseController {
String customer_name = get("customer_name");
String sn = get("sn");
Integer state = getInt("state");
Integer type = getInt("type");
String invoice_code = get("invoice_code");
String ticket_code = get("ticket_code");
Integer product_id = getInt("product_id");
@ -58,7 +59,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, ticket_code, 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, type, invoice_code, invoice_type, ticket_code, product_id, invoice_code_is_null)));
}
@Before(StartAndEndIntervalValidator.class)
@ -69,6 +70,7 @@ public class OrderTempController extends BaseController {
String customer_name = get("customer_name");
String sn = get("sn");
Integer state = getInt("state");
Integer type = getInt("type");
Integer product_id = getInt("product_id");
Integer supermarket_id = getInt("supermarket_id");
Integer isprepaid = getInt("isprepaid");
@ -77,7 +79,7 @@ public class OrderTempController extends BaseController {
Integer customer_id = getInt("customer_id");
Boolean invoice_code_is_null = getBoolean("invoice_code_is_null");
Workbook wb = OrderTempService.me.export(sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, product_id, invoice_code_is_null);
Workbook wb = OrderTempService.me.export(sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, type, invoice_code, invoice_type, product_id, invoice_code_is_null);
render(new ExcelRender("运输日志_" + System.currentTimeMillis() + ".xlsx", wb));
}

View File

@ -14,6 +14,7 @@ import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import com.jfinal.plugin.activerecord.Record;
import java.math.BigDecimal;
import java.util.Date;
public class OrderTempSyncService {
@ -162,28 +163,43 @@ public class OrderTempSyncService {
log.error("关联预付费客户信息未找到customer_id:【%s】", order.getCustomerId());
return false;
}
if (order.getSaleType() == 0) {
PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId());
if (prepayCustomer != null) {
if (prepayCustomer.getSurplus() == null) {
prepayCustomer.setSurplus(order.getTotalPrice());
} else {
prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice()));
}
PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId());
synctaskincrement.addIncrementData(
prepayCustomer.getTablename(),
"id",
prepayCustomer.getId(),
new JSONObject().fluentPut("surplus", order.getTotalPrice()) // 取消订单,在原余额上加上一个数
);
// 余额变化需要广播
SyncTaskService.me.save(synctaskincrement);
ret = prepayCustomer.update();
if (prepayCustomer != null) {
if (prepayCustomer.getSurplus() == null) {
prepayCustomer.setSurplus(order.getTotalPrice());
} else {
prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice()));
}
synctaskincrement.addIncrementData(
prepayCustomer.getTablename(),
"id",
prepayCustomer.getId(),
new JSONObject().fluentPut("surplus", order.getTotalPrice()) // 取消订单,在原余额上加上一个数
);
// 余额变化需要广播
SyncTaskService.me.save(synctaskincrement);
ret = prepayCustomer.update();
} else {
Ordercluster ordercluster = Ordercluster.dao.findById(order.getOrderclusterId());
if (ordercluster != null) {
PresellOrder presellOrder = PresellOrder.dao.findById(ordercluster.getPresellOrderId());
if (presellOrder != null) {
presellOrder.setPugAmount(presellOrder.getPugAmount().subtract(order.getTotalPrice()));
synctaskincrement.addIncrementData(
presellOrder.getTablename(),
"id",
presellOrder.getId(),
new JSONObject().fluentPut("pug_amount", new BigDecimal(0).subtract(order.getTotalPrice())) // 取消订单,在提货额上加上一个负数
);
// 余额变化需要广播
SyncTaskService.me.save(synctaskincrement);
ret = presellOrder.update();
}
}
}
}
@ -191,18 +207,23 @@ public class OrderTempSyncService {
return false;
}
Stock stock = Stock.dao.findByIds(order.getSupermarketId(), order.getProductId());
if (stock == null) {
log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId());
return false;
}
Stock stock = Stock.dao.findByIds(order.getSupermarketId(), order.getProductId());
if (stock == null) {
log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId());
return false;
}
stock.setStockWeight(stock.getStockWeight().add(order.getWeight())); // 取消销售加库存
ret = stock.update();
stock.setStockWeight(stock.getStockWeight().add(order.getWeight())); // 取消销售加库存
ret = stock.update();
synctask.addUpdateData(stock);
synctask.addUpdateData(stock);
return ret && SyncTaskService.me.save(synctask, order.getSupermarketId())
if (order.getSaleType() == 0) {
return ret && SyncTaskService.me.save(synctask, order.getSupermarketId())
&& ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser);
}
return ret && SyncTaskService.me.save(synctask)
&& ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser);
} catch (Exception e) {
log.error(e.getMessage(), e);
@ -211,7 +232,7 @@ public class OrderTempSyncService {
}
});
if (ret) {
if (ret && order.getSaleType() == 0) {
SyncTaskService.me.send(synctask);
}

View File

@ -85,26 +85,28 @@ public class PresellOrderController extends Controller {
* presell_order
*/
public void find(){
Integer customer_id = getInt("customer_id");
Integer customer_id = getInt("customer_id");
Integer supermarket_id = getInt("supermarket_id");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
Integer type = getInt("type");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
PageParam pp = getBean(PageParam.class, "", true);
renderJson(Result.object(PresellOrderService.me.find(pp, customer_id, supermarket_id, del, name, stm, etm)));
renderJson(Result.object(PresellOrderService.me.find(pp, customer_id, supermarket_id, del, name, stm, etm, type)));
}
/**
* presell_order
*/
public void list(){
Integer customer_id = getInt("customer_id");
Integer customer_id = getInt("customer_id");
Integer supermarket_id = getInt("supermarket_id");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
renderJson(Result.object(PresellOrderService.me.list(customer_id, supermarket_id, del, name, stm, etm)));
Integer type = getInt("type");
Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的
String name = get("name");
String stm = get("stm");
String etm = get("etm");
renderJson(Result.object(PresellOrderService.me.list(customer_id, supermarket_id, del, name, stm, etm, type)));
}
}

View File

@ -44,6 +44,7 @@ public class OrderStatController extends BaseController {
Integer isprepaid = getInt("isprepaid");
Integer product_id = getInt("product_id");
Integer customer_type_id = getInt("customer_type_id");
Integer sale_type = getInt("sale_type");
int export = getInt("export", 0); // 是否导出为exce 0 不导出1 导出
@ -58,7 +59,8 @@ public class OrderStatController extends BaseController {
isprepaid,
product_id,
sn,
customer_type_id
customer_type_id,
sale_type
)));
} else {
Workbook wb = OrderStatService.me.daydetailExport(
@ -71,7 +73,8 @@ public class OrderStatController extends BaseController {
isprepaid,
product_id,
sn,
customer_type_id
customer_type_id,
sale_type
);
render(new ExcelRender(tm + "_日销售明细_" + System.currentTimeMillis() + ".xlsx", wb));
}