diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketCustomerDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketCustomerDistance.java index 4851f36..475e805 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketCustomerDistance.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketCustomerDistance.java @@ -5,7 +5,7 @@ import com.cowr.model.base.BaseSupermarketCustomerDistance; /** * Generated by COWR Tue Aug 25 17:27:08 CST 2020 * TableName: supermarket_customer_distance - * Remarks: 基础配置 - 超市到客户的距离 + * Remarks: 基础配置 - 砂站到客户的距离 * PrimaryKey: supermarket_id,customer_id */ @SuppressWarnings("serial") diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerSupermarketProduct.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerSupermarketProduct.java index 5ac6a9b..968fb6a 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerSupermarketProduct.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerSupermarketProduct.java @@ -48,7 +48,7 @@ public abstract class BaseCustomerSupermarketProduct> extend * isPrimaryKey: NO * defaultValue: * - * @param supermarketId 领取超市id + * @param supermarketId 领取砂站id */ @JSONField(name = "supermarket_id") public void setSupermarketId(Integer supermarketId) { @@ -243,7 +243,7 @@ public abstract class BaseInvoiceReceive> extend /** - * @return supermarket_id 领取超市id + * @return supermarket_id 领取砂站id */ @JSONField(name = "supermarket_id") public Integer getSupermarketId() { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderInvalidVerify.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderInvalidVerify.java index ea1ea08..3692f49 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderInvalidVerify.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderInvalidVerify.java @@ -252,7 +252,7 @@ public abstract class BaseOrderInvalidVerify * isNullable: YES * isPrimaryKey: NO * defaultValue: - * @param supermarketId 超市id + * @param supermarketId 砂站id */ @JSONField(name="supermarket_id") public void setSupermarketId(Integer supermarketId) { @@ -261,7 +261,7 @@ public abstract class BaseOrderInvalidVerify /** - * @return supermarket_id 超市id + * @return supermarket_id 砂站id */ @JSONField(name="supermarket_id") public Integer getSupermarketId() { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java index 89e44c6..1864346 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java @@ -96,7 +96,7 @@ public abstract class BaseOrderTemp> extends BaseMode * isPrimaryKey: NO * defaultValue: * - * @param supermarketId 超市id + * @param supermarketId 砂站id */ @JSONField(name = "supermarket_id") public void setSupermarketId(Integer supermarketId) { @@ -105,7 +105,7 @@ public abstract class BaseOrderTemp> extends BaseMode /** - * @return supermarket_id 超市id + * @return supermarket_id 砂站id */ @JSONField(name = "supermarket_id") public Integer getSupermarketId() { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketCustomerDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketCustomerDistance.java index 2920487..618747c 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketCustomerDistance.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketCustomerDistance.java @@ -7,7 +7,7 @@ import com.alibaba.fastjson.annotation.JSONField; /** * Generated by COWR Tue Aug 25 17:27:08 CST 2020 * TableName: supermarket_customer_distance - * Remarks: 基础配置 - 超市到客户的距离 + * Remarks: 基础配置 - 砂站到客户的距离 * PrimaryKey: supermarket_id,customer_id */ @SuppressWarnings("serial") @@ -27,7 +27,7 @@ public abstract class BaseSupermarketCustomerDistance> extends BaseModel< * isPrimaryKey: NO * defaultValue: * - * @param supermarketId 超市id + * @param supermarketId 砂站id */ @JSONField(name = "supermarket_id") public void setSupermarketId(Integer supermarketId) { @@ -105,7 +105,7 @@ public abstract class BaseSyncTask> extends BaseModel< /** - * @return supermarket_id 超市id + * @return supermarket_id 砂站id */ @JSONField(name = "supermarket_id") public Integer getSupermarketId() { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java index 53099f6..be3c6e1 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/invoice/receive/InvoiceReceiveService.java @@ -132,7 +132,7 @@ public class InvoiceReceiveService extends BaseService { } /** - * 获取指定超市下一个可用的发票号码 + * 获取指定砂站下一个可用的发票号码 * TODO:要区分专票和普票 * * @param supermarket_id diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index c150296..0186407 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -338,12 +338,13 @@ public class OrderclusterService extends BaseService { return Db.find(sql, paraList.toArray()); } - public List undonlist(int supermarket_id, String customer_name) { + public List undonlist(int supermarket_id, String customer_name, String cutoff_time) { String sql = "select * from ordercluster t \n" + " where t.state < ? \n" + + " and t.cutoff_time like ? \n" + " and t.supermarket_id = ? \n" + " and t.customer_name = ? "; - return Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), supermarket_id, customer_name); + return Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), cutoff_time + "%", supermarket_id, customer_name); } /** diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/truck/OrderclusterTruckService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/truck/OrderclusterTruckService.java index 7bf64e9..33ac5bd 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/truck/OrderclusterTruckService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/truck/OrderclusterTruckService.java @@ -88,7 +88,7 @@ public class OrderclusterTruckService extends BaseService { } /** - * 用超市id、车牌号查询当天关联的集团订单信息 + * 用砂站id、车牌号查询当天关联的集团订单信息 * * @param supermarket_id * @param truck_license diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java new file mode 100644 index 0000000..1579e5f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseController.java @@ -0,0 +1,32 @@ +package com.cowr.ssjygl.stat.invoice; + +import com.cowr.common.validator.DayValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.stat.sale.OrderStatService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import org.apache.poi.ss.usermodel.Workbook; + +public class InvoiceUseController extends Controller { + @Before(DayValidator.class) + public void statuse() { + String tm = get("tm"); + Integer supermarket_id = getInt("supermarket_id"); + Integer invoice_type = getInt("invoice_type"); + String invoice_number = get("invoice_number"); + String invoice_code = get("invoice_code"); + Integer invoice_state = getInt("invoice_state"); + String order_sn = get("order_sn"); + String truck_license = get("truck_license"); + Integer order_state = getInt("order_state"); + + int export = getInt("export", 0); + if (export == 0) { + renderJson(Result.success(InvoiceUseService.me.statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state))); + }else{ + Workbook wb = InvoiceUseService.me.statuseExport(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state); + render(new ExcelRender(tm + "_票据使用记录_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java new file mode 100644 index 0000000..f07c6e2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/invoice/InvoiceUseService.java @@ -0,0 +1,293 @@ +package com.cowr.ssjygl.stat.invoice; + +import com.cowr.common.utils.DataUtil; +import com.cowr.common.utils.DateTimeUtil; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.ArrayList; +import java.util.List; + +public class InvoiceUseService { + private static Log log = Log.getLog(InvoiceUseService.class); + public static InvoiceUseService me = new InvoiceUseService(); + + /** + * 票据使用情况统计 + */ + public Record statuse( + String tm, + Integer supermarket_id, + Integer invoice_type, + String invoice_number, + String invoice_code, + Integer invoice_state, + String order_sn, + String truck_license, + Integer order_state + ) { + String logsql = "select \n" + + " t.id rowkey, t.invoice_number, t.`code` invoice_code, t.state invoice_state, t.settlement_user_name, t.settlement_time, t.create_time, t.invalid_time, t.invalid_memo, t.invoice_type, t.invalid_user_name\n" + + " , r.receive_user_name, r.create_time receive_time, r.supermarket_id\n" + + " , o.sn order_sn, o.weight, o.total_price, o.unit_price, o.truck_license, o.customer_id, o.customer_texpayer_name, o.customer_texpayer_num, o.isprepaid, o.state order_state\n" + + " , s.name supermarket_name " + + " from invoice_log t\n" + + " left join invoice_receive r on t.invoice_receive_id = r.id\n" + + " left join order_temp o on o.sn = t.order_sn \n" + + " left join supermarket s on s.id = r.supermarket_id \n" + + " where 1 = 1 \n"; + + String ordsql = "select\n" + + " t.uuid rowkey, t.invoice_number, t.invoice_code, null invoice_state, t.settlement_user_name, null settlement_time, t.create_time, null invalid_time, null invalid_memo, t.invoice_type, null invalid_user_name\n" + + " , null receive_user_name, null receive_time, t.supermarket_id \n" + + " , t.sn order_sn, t.weight, t.total_price, t.unit_price, t.truck_license, t.customer_id, t.customer_texpayer_name, t.customer_texpayer_num, t.isprepaid, t.state order_state \n" + + " , s.name supermarket_name " + + " from order_temp t \n" + + " left join invoice_log l on l.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.invoice_type = 2 \n" + + " and l.id is null\n"; + + List paramlog = new ArrayList<>(); + List paramord = new ArrayList<>(); + + logsql += " and t.create_time like ? \n"; + ordsql += " and t.create_time like ? \n"; + + paramlog.add(tm + "%"); + paramord.add(tm + "%"); + + if (supermarket_id != null) { + logsql += " and r.supermarket_id <= ? \n"; // 这里用领用记录的 supermarket_id + ordsql += " and t.supermarket_id <= ? \n"; + + paramlog.add(supermarket_id); + paramord.add(supermarket_id); + } + + if (StrKit.notBlank(invoice_number)) { + logsql += " and t.invoice_number like ? \n"; + ordsql += " and t.invoice_number like ? \n"; + + paramlog.add("%" + invoice_number.trim() + "%"); + paramord.add("%" + invoice_number.trim() + "%"); + } + + if (StrKit.notBlank(invoice_code)) { + logsql += " and t.invoice_code like ? \n"; + ordsql += " and t.invoice_code like ? \n"; + + paramlog.add("%" + invoice_code.trim() + "%"); + paramord.add("%" + invoice_code.trim() + "%"); + } + + if (StrKit.notBlank(order_sn)) { + logsql += " and t.order_sn like ? \n"; + ordsql += " and t.sn like ? \n"; + + paramlog.add("%" + order_sn.trim() + "%"); + paramord.add("%" + order_sn.trim() + "%"); + } + + if (StrKit.notBlank(truck_license)) { + logsql += " and o.truck_license like ? \n"; // 订单表里面才有车牌号 + ordsql += " and t.truck_license like ? \n"; + + paramlog.add("%" + truck_license.trim() + "%"); + paramord.add("%" + truck_license.trim() + "%"); + } + + if (invoice_state != null) { + logsql += " and t.state = ? \n"; + paramlog.add(invoice_state); + } + + if (order_state != null) { + logsql += " and o.state <= ? \n"; + ordsql += " and t.state <= ? \n"; + + paramlog.add(order_state); + paramord.add(order_state); + } + + List list = new ArrayList<>(); + + if (invoice_type != null && invoice_type == 1) { + list = Db.find(logsql + " order by t.create_time", paramlog.toArray()); + } else { + paramlog.addAll(paramord); + + list = Db.find("select * from (" + logsql + "\n union \n " + ordsql + ") a order by a.create_time ", paramlog.toArray()); + } + + Record out = new Record(); + out.set("list", list); + out.set("cnt", list.size()); + out.set("total_weight", 0.0); + out.set("total_price", 0.0); + out.set("invoice_type_1_cnt", 0); + out.set("invoice_type_2_cnt", 0); + + for (Record record : list) { + if (record.get("weight") != null) { + out.set("total_weight", out.getBigDecimal("total_weight").add(record.getBigDecimal("weight"))); + } + if (record.get("total_price") != null) { + out.set("total_price", out.getBigDecimal("total_price").add(record.getBigDecimal("total_price"))); + } + + if (record.getInt("invoice_type") == 1) { + out.set("invoice_type_1_cnt", out.getInt("invoice_type_1_cnt") + 1); + } else if (record.getInt("invoice_type") == 2) { + out.set("invoice_type_2_cnt", out.getInt("invoice_type_2_cnt") + 1); + } else { + log.debug("错误数据: %s", record.toJson()); + } + } + + return out; + } + + public Workbook statuseExport( + String tm, + Integer supermarket_id, + Integer invoice_type, + String invoice_number, + String invoice_code, + Integer invoice_state, + String order_sn, + String truck_license, + Integer order_state + ) { + Record ret = statuse(tm, supermarket_id, invoice_type, invoice_number, invoice_code, invoice_state, order_sn, truck_license, order_state); + + List list = ret.get("list"); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("票据使用记录"); + + // 表头 start + Row row = sheet.createRow(0); + int a = 0; + row.createCell(a++).setCellValue("序号"); + row.createCell(a++).setCellValue("订单号"); + row.createCell(a++).setCellValue("新建时间"); + row.createCell(a++).setCellValue("砂站"); + row.createCell(a++).setCellValue("开票名称"); + row.createCell(a++).setCellValue("开票税号"); + row.createCell(a++).setCellValue("数量(吨)"); + row.createCell(a++).setCellValue("总价"); + row.createCell(a++).setCellValue("车牌号"); + row.createCell(a++).setCellValue("订单状态"); + row.createCell(a++).setCellValue("发票代码"); + row.createCell(a++).setCellValue("发票编号"); + row.createCell(a++).setCellValue("发票类型"); + row.createCell(a++).setCellValue("发票状态"); + row.createCell(a++).setCellValue("开票人"); + row.createCell(a++).setCellValue("开票时间"); + row.createCell(a++).setCellValue("作废人"); + row.createCell(a++).setCellValue("作废时间"); + row.createCell(a++).setCellValue("备注"); + // 表头 end + + int end_col = 19; + int datalen = list.size(); + for (int i = 0; i < datalen; i++) { + Record order = list.get(i); + + row = sheet.createRow(i + 1); + a = 0; + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(order.getStr("order_sn")); + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("create_time"))); + row.createCell(a++).setCellValue(order.getStr("supermarket_name")); + row.createCell(a++).setCellValue(order.getStr("customer_texpayer_name")); + row.createCell(a++).setCellValue(order.getStr("customer_texpayer_num")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "total_price")); + row.createCell(a++).setCellValue(order.getStr("truck_license")); + if (order.get("order_state") != null) { + switch (order.getInt("order_state")) { + case 1: + row.createCell(a++).setCellValue("新建"); + break; + case 4: + row.createCell(a++).setCellValue("待付款"); + break; + case 5: + row.createCell(a++).setCellValue("已完成"); + break; + case 9: + row.createCell(a++).setCellValue("已取消"); + break; + default: + row.createCell(a++).setCellValue(""); + } + } else { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(order.getStr("invoice_number")); + row.createCell(a++).setCellValue(order.getStr("invoice_code")); + row.createCell(a++).setCellValue(order.getInt("invoice_type") == 2 ? "专票" : "普票"); + if (order.get("invoice_state") != null) { + switch (order.getInt("invoice_state")) { + case 5: + row.createCell(a++).setCellValue("已使用"); + break; + case 9: + row.createCell(a++).setCellValue("已作废"); + break; + default: + row.createCell(a++).setCellValue(""); + } + } else { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(order.getStr("settlement_user_name")); + if (order.get("settlement_time") != null) { + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("settlement_time"))); + } else { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(order.getStr("invalid_user_name")); + if (order.get("invalid_time") != null) { + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("invalid_time"))); + } else { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(order.getStr("invalid_memo")); + } + + // 通用单元格格式 + Font font = wb.createFont(); + CellStyle cellStyle = wb.createCellStyle(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + cellStyle.setFont(font); + + // 设置通用单元格格式 + for (int r = 0; r < datalen + 1; r++) { + row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + for (int c = 0; c < end_col + 1; c++) { + Cell cell = row.getCell(c); + + if (cell == null) { + cell = row.createCell(c); + } + cell.setCellStyle(cellStyle); + } + } + + return wb; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistancePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistancePKValidator.java index 7ed4ed8..f74280c 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistancePKValidator.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistancePKValidator.java @@ -8,7 +8,7 @@ import com.jfinal.core.Controller; /** * Generated by COWR Tue Aug 25 17:27:14 CST 2020 * TableName: supermarket_customer_distance - * Remarks: 基础配置 - 超市到客户的距离 + * Remarks: 基础配置 - 砂站到客户的距离 * PrimaryKey: supermarket_id,customer_id */ public class SupermarketCustomerDistancePKValidator extends CrudParamValidator { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceService.java index 5e33bd7..dd9f713 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceService.java @@ -17,7 +17,7 @@ import java.util.List; /** * Generated by COWR Tue Aug 25 17:27:14 CST 2020 * TableName: supermarket_customer_distance - * Remarks: 基础配置 - 超市到客户的距离 + * Remarks: 基础配置 - 砂站到客户的距离 * PrimaryKey: supermarket_id,customer_id */ public class SupermarketCustomerDistanceService extends BaseService { diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceValidator.java index 8c87edd..a2f79da 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceValidator.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/customerdistance/SupermarketCustomerDistanceValidator.java @@ -8,7 +8,7 @@ import com.cowr.model.SupermarketCustomerDistance; /** * Generated by COWR Tue Aug 25 17:27:14 CST 2020 * TableName: supermarket_customer_distance - * Remarks: 基础配置 - 超市到客户的距离 + * Remarks: 基础配置 - 砂站到客户的距离 * PrimaryKey: supermarket_id,customer_id */ public class SupermarketCustomerDistanceValidator extends CrudParamValidator { diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java index c84e1df..71ba3b9 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java @@ -169,7 +169,7 @@ public class DeviceThread extends Thread { LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); AbsScale scale; - // 根据超市id,兼容不同的表头 + // 根据砂站id,兼容不同的表头 if (supermarket_id == 3) { // 城隍用了耀华的表头 scale = new YaoHuaScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); } else if (supermarket_id == 4) { // 石畈用了两个不一样的表头 diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogController.java index 9d27b20..abb3e57 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogController.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogController.java @@ -82,4 +82,20 @@ public class InvoiceLogController extends Controller { InvoiceLog model = getModel(InvoiceLog.class, "", true); // 忽略不在model中的字段 renderJson(InvoiceLogService.me.findByPk(model)); } + + public void invalid() { + Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Integer supermarket_id = getInt("supermarket_id", 0); + String invoice_number = get("invoice_number"); + String code = get("code"); + String invalid_memo = get("invalid_memo"); + + renderJson(InvoiceLogSyncService.me.invalid(supermarket_id, invoice_number, code, invalid_memo, tokenuser)); + } } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java index d13c5f1..24ebf0e 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/invoice/log/InvoiceLogSyncService.java @@ -1,10 +1,120 @@ package com.cowr.local.ssjygl.invoice.log; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.view.Result; import com.cowr.local.ssjygl.base.BaseSyncService; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.*; +import com.cowr.ssjygl.invoice.receive.InvoiceReceiveService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.kit.StrKit; import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.util.Date; public class InvoiceLogSyncService extends BaseSyncService { private static Log log = Log.getLog(InvoiceLogSyncService.class); public static InvoiceLogSyncService me = new InvoiceLogSyncService(); + /** + * 作废发票,未关联订单的(损毁等,不是正常开票使用的发票) + * + * @return + */ + public Result invalid(int supermarket_id, String invoice_number, String code, String invalid_memo, Sysuser sysuser) { + if (supermarket_id != CliCacheData.SUP.getId()) { + return Result.failed("砂站信息错误"); + } + + // 先判断这张发票有没有被领用 + InvoiceReceive receive = InvoiceReceiveService.me.checkSurplusReceive(supermarket_id, invoice_number, code); + if (receive == null) { + return Result.failed("没有有效的发票领用记录,或者发票已经被使用"); + } + + InvoiceLog invoiceLog = InvoiceLog.dao.findFirst("select * from invoice_log t \n" + + " where t.invoice_number = ? and t.code = ? limit 1 ", invoice_number, code); + + if (invoiceLog != null) { + // 再判断这张发票是不是已经被取消了 + if (invoiceLog.getState() == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("发票已作废"); + } else { + // 还要判断这张发票已经在订单上使用了 + return Result.failed("发票已使用,请使用“取消发票”功能"); + } + } + + // 然后就可以开始取消了 + + invoiceLog = new InvoiceLog(); + invoiceLog.setId(StrKit.getRandomUUID()); + invoiceLog.setInvalidUserId(sysuser.getId()); + invoiceLog.setInvalidUserName(sysuser.getName()); + invoiceLog.setInvalidTime(new Date()); + invoiceLog.setInvalidMemo(invalid_memo); + invoiceLog.setState(OrderStateEnum.INVALID.getStateid()); + invoiceLog.setInvoiceReceiveId(receive.getId()); + invoiceLog.setCode(code); + invoiceLog.setInvoiceNumber(invoice_number); + + receive.setSurplus(receive.getSurplus() - 1); + receive.setInvalidCount(receive.getInvalidCount() + 1); + + if (receive.getSurplus() == 0) { + // 作废最后一张发票,当前发票停再最后一个发票号码上 + receive.setCurrentCode(receive.getEndCode()); + } 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())) { // 作废顺延的下一张发票 + receive.setCurrentCode(String.format("%0" + receive.getStartCode().length() + "d", Integer.parseInt(receive.getCurrentCode()) + 1)); + } else { + // 其他情况下不更新 current_code + } + } + + SyncTask synctask = new SyncTask(); + + InvoiceLog finalInvoiceLog = invoiceLog; + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = finalInvoiceLog.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(finalInvoiceLog); + + ret = receive.update(); + + if (!ret) { + return false; + } + + synctask.addUpdateData(receive); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(finalInvoiceLog, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 普票作废理解同步到砂站 + if (ret) { + SyncTaskService.me.send(synctask); + } + + return ret ? Result.success(invoiceLog) : Result.failed(false, "处理失败"); + } } 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 de1ba25..4e64263 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 @@ -56,6 +56,7 @@ import com.cowr.ssjygl.cctv.CctvController; import com.cowr.local.ssjygl.prepay.PrepayController; import com.cowr.local.ssjygl.overall.OverallController; import com.cowr.ssjygl.modifylog.ModifyLogController; +import com.cowr.ssjygl.stat.invoice.InvoiceUseController; import com.cowr.ssjygl.stat.purchase.OrderPurchaseStatController; import com.cowr.local.ssjygl.stat.sale.OrderStatController; import com.cowr.ssjygl.stat.transfer.OrderTransferStatController; @@ -225,6 +226,7 @@ public class Config extends JFinalConfig { me.add("/stat/sale", OrderStatController.class); me.add("/stat/transfer", OrderTransferStatController.class); me.add("/stat/purchase", OrderPurchaseStatController.class); + me.add("/stat/invoiceuse", InvoiceUseController.class); // -- 发票管理 me.add("/invoice/log", InvoiceLogController.class); @@ -354,9 +356,9 @@ public class Config extends JFinalConfig { System.exit(0); } else { log.info("===================================================="); - log.info("============= 启动 %s %s 服务 ================", CliCacheData.SUP.getId(), CliCacheData.SUP.getName()); + log.info("============= 启动 %s %s 服务 ================", CliCacheData.SUP.getId(), CliCacheData.SUP.getName()); log.info("===================================================="); - log.info("============= 最大限重 %s 吨 =================", configprop.getInt("weigh.max")); + log.info("============= 最大限重 %s 吨 =================", configprop.getInt("weigh.max")); log.info("===================================================="); } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java index 143ae21..5d24493 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java @@ -22,8 +22,8 @@ public class Main { */ log.info("===================================================="); - log.info("========= 启动本地服务 =============="); - log.info("========= PID: %s ===============", pid); + log.info("========= 启动本地服务 =============="); + log.info("========= PID: %s ==============", pid); boolean isprod = Config.isProd(); String path = PathKit.getWebRootPath(); 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 36da5c1..2b9f272 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 @@ -632,7 +632,7 @@ public class OrderTempSyncService { InvoiceReceive receive = null; // 2020-09-29 需要开具专票的,先开具结算单,不打发票 - // 2020-10-12 所有超市都可以开结算单 + // 2020-10-12 所有砂站都可以开结算单 if (customer.getInvoiceType() == 2) { order.setInvoiceType(2); // 需要专票的,在结算开了专票之后,再修改 invoice_site 字段 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 47e990d..a727944 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 @@ -110,7 +110,7 @@ public class InvoiceLogSyncService extends BaseSyncService { } - // 将订单同步到不同的超市 + // 将订单同步到不同的砂站 for (Map.Entry entry : map.entrySet()) { if (!SyncTaskService.me.save(entry.getValue(), entry.getKey())) { return false; @@ -137,11 +137,11 @@ public class InvoiceLogSyncService extends BaseSyncService { Supermarket supermarket = Supermarket.dao.findById(supermarket_id); if (supermarket == null) { - return Result.failed("未找到超市信息"); + return Result.failed("未找到砂站信息"); } // 先判断这张发票有没有被领用 - InvoiceReceive receive = InvoiceReceiveService.me.checkReceive(supermarket_id, invoice_number, code); + InvoiceReceive receive = InvoiceReceiveService.me.checkSurplusReceive(supermarket_id, invoice_number, code); if (receive == null) { return Result.failed("没有有效的发票领用记录,或者发票已经被使用"); } @@ -175,10 +175,12 @@ public class InvoiceLogSyncService extends BaseSyncService { receive.setSurplus(receive.getSurplus() - 1); receive.setInvalidCount(receive.getInvalidCount() + 1); - if (receive.getSurplus() == 0) { + if (receive.getSurplus() < 0) { + return Result.failed("作废失败,减少剩余量时发生错误"); + } 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())) { // 作废顺延的下一张发票 @@ -435,7 +437,7 @@ public class InvoiceLogSyncService extends BaseSyncService { } } - // 将订单同步到不同的超市 + // 将订单同步到不同的砂站 for (Map.Entry entry : map.entrySet()) { if (!SyncTaskService.me.save(entry.getValue(), entry.getKey())) { return false; diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java index 17b4686..08f94dc 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/CheckUndonOrderclusterJob.java @@ -65,7 +65,7 @@ public class CheckUndonOrderclusterJob implements Job { } } - // 各个超市分开同步 + // 各个砂站分开同步 for (Map.Entry entry : syncmap.entrySet()) { if (!SyncTaskService.me.save(entry.getValue(), entry.getKey())) { return false; diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java index 9ef947c..58291c5 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java @@ -50,6 +50,7 @@ import com.cowr.ssjygl.cctv.CctvController; import com.cowr.service.ssjygl.prepay.PrepayController; import com.cowr.service.ssjygl.overall.OverallController; import com.cowr.ssjygl.modifylog.ModifyLogController; +import com.cowr.ssjygl.stat.invoice.InvoiceUseController; import com.cowr.ssjygl.stat.purchase.OrderPurchaseStatController; import com.cowr.service.ssjygl.stat.sale.OrderStatController; import com.cowr.ssjygl.stat.transfer.OrderTransferStatController; @@ -192,6 +193,7 @@ public class Config extends JFinalConfig { me.add("/stat/sale", OrderStatController.class); me.add("/stat/transfer", OrderTransferStatController.class); me.add("/stat/purchase", OrderPurchaseStatController.class); + me.add("/stat/invoiceuse", InvoiceUseController.class); // -- 发票管理 me.add("/invoice/log", InvoiceLogController.class); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index fa0984c..c96e9b0 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -96,7 +96,7 @@ public class OrderclusterSyncService extends BaseSyncService { } if (chksup.contains(supermarket_id)) { - return Result.failed("同一个客户不能重复给超市分配配额"); + return Result.failed("同一个客户不能重复给砂站分配配额"); } else { chksup.add(supermarket_id); @@ -112,7 +112,7 @@ public class OrderclusterSyncService extends BaseSyncService { } if (total_weight == 0) { - log.debug("重量为 0 的超市(id:%s)跳过", supermarket_id); + log.debug("重量为 0 的砂站(id:%s)跳过", supermarket_id); continue; } @@ -209,7 +209,7 @@ public class OrderclusterSyncService extends BaseSyncService { syncmap.get(model.getSupermarketId()).addSaveData(model); } - // 将订单同步到不同的超市 + // 将订单同步到不同的砂站 for (Map.Entry entry : syncmap.entrySet()) { if (!SyncTaskService.me.save(entry.getValue(), entry.getKey())) { return false; @@ -245,6 +245,7 @@ public class OrderclusterSyncService extends BaseSyncService { String trucks, Sysuser sysuser ) { + String query_cutoff_time = DateTimeUtil.sdf.get().format(cutoff_time); Supermarket supermarket = SvrCacheData.SUP_CACHE.get(supermarket_id); if (supermarket == null) { return Result.failed("砂站信息无效"); @@ -254,10 +255,10 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failedstr("[%s]砂站还未部署", supermarket.getName()); } - List undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_name); + List undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_name, query_cutoff_time); if (undonlist != null && !undonlist.isEmpty()) { - return Result.failedstr("客户[%s]在砂站[%s]还有未完成的配额", customer_name, SvrCacheData.SUP_CACHE.get(supermarket_id).getName()); + return Result.failedstr("客户[%s][%s]在砂站[%s]还有未完成的配额", customer_name, query_cutoff_time, SvrCacheData.SUP_CACHE.get(supermarket_id).getName()); } Product product = Product.dao.findById(Const.DEFAULT_PRODUCT_ID); @@ -305,7 +306,7 @@ public class OrderclusterSyncService extends BaseSyncService { return Result.failed(StrKit.join(ts, ",") + " 车牌号在黑名单中"); } - ts.add(0, DateTimeUtil.sdf.get().format(cutoff_time) + "%"); + ts.add(0, query_cutoff_time + "%"); List chkduk = Db.find( "select * from ordercluster_truck t \n" + " left join ordercluster c on c.id = t.ordercluster_id\n" +